2 Commits 474b5023ff ... 7249db66f6

Auteur SHA1 Bericht Datum
  wdl 7249db66f6 first commit 9 maanden geleden
  wudonglin 474b5023ff Initial commit 9 maanden geleden
100 gewijzigde bestanden met toevoegingen van 45935 en 25 verwijderingen
  1. 32 0
      .classpath
  2. 2 14
      .gitignore
  3. 57 0
      .project
  4. 12 0
      .settings/.jsdtscope
  5. 3 0
      .settings/com.genuitec.eclipse.core.prefs
  6. 2 0
      .settings/com.genuitec.eclipse.j2eedt.core.prefs
  7. 6 0
      .settings/org.eclipse.core.resources.prefs
  8. 8 0
      .settings/org.eclipse.jdt.core.prefs
  9. 4 0
      .settings/org.eclipse.m2e.core.prefs
  10. 11 0
      .settings/org.eclipse.wst.common.component
  11. 11 0
      .settings/org.eclipse.wst.common.project.facet.core.xml
  12. 1 0
      .settings/org.eclipse.wst.jsdt.ui.superType.container
  13. 1 0
      .settings/org.eclipse.wst.jsdt.ui.superType.name
  14. 2 0
      .settings/org.eclipse.wst.validation.prefs
  15. 0 8
      LICENSE
  16. 0 3
      README.md
  17. 323 0
      pom.xml
  18. 365 0
      src/main/config/code_checker/checkstyle_v1.0.xml
  19. 1182 0
      src/main/config/code_checker/findbugs_v1.0.xml
  20. 107 0
      src/main/java/com/hnshituo/core/auth/interceptor/JsonPermissionInterceptor.java
  21. 57 0
      src/main/java/com/hnshituo/core/auth/interceptor/JsonSessionInterceptor.java
  22. 139 0
      src/main/java/com/hnshituo/core/auth/interceptor/RemoteServiceExceptionResolver.java
  23. 28 0
      src/main/java/com/hnshituo/core/auth/listener/ContextHolderUtils.java
  24. 131 0
      src/main/java/com/hnshituo/core/auth/listener/SessionUserListener.java
  25. 25 0
      src/main/java/com/hnshituo/core/auth/mapper/DepartmentMapper.java
  26. 38 0
      src/main/java/com/hnshituo/core/auth/mapper/FunctionMapper.java
  27. 24 0
      src/main/java/com/hnshituo/core/auth/mapper/PrivilegeMapper.java
  28. 31 0
      src/main/java/com/hnshituo/core/auth/mapper/RoleMapper.java
  29. 8 0
      src/main/java/com/hnshituo/core/auth/mapper/UserGroupMapper.java
  30. 8 0
      src/main/java/com/hnshituo/core/auth/mapper/UserInfoMapper.java
  31. 23 0
      src/main/java/com/hnshituo/core/auth/mapper/UserLoginMapper.java
  32. 53 0
      src/main/java/com/hnshituo/core/auth/mapper/UserMapper.java
  33. 22 0
      src/main/java/com/hnshituo/core/auth/mapper/UserRoleMapper.java
  34. 10 0
      src/main/java/com/hnshituo/core/auth/mapper/UsersGroupMapper.java
  35. 58 0
      src/main/java/com/hnshituo/core/auth/service/DepartmentService.java
  36. 98 0
      src/main/java/com/hnshituo/core/auth/service/FunctionService.java
  37. 30 0
      src/main/java/com/hnshituo/core/auth/service/HomeService.java
  38. 18 0
      src/main/java/com/hnshituo/core/auth/service/PrivilegeService.java
  39. 17 0
      src/main/java/com/hnshituo/core/auth/service/RoleService.java
  40. 8 0
      src/main/java/com/hnshituo/core/auth/service/UserGroupService.java
  41. 8 0
      src/main/java/com/hnshituo/core/auth/service/UserInfoService.java
  42. 8 0
      src/main/java/com/hnshituo/core/auth/service/UserLoginService.java
  43. 10 0
      src/main/java/com/hnshituo/core/auth/service/UserRoleService.java
  44. 50 0
      src/main/java/com/hnshituo/core/auth/service/UserService.java
  45. 8 0
      src/main/java/com/hnshituo/core/auth/service/UsersGroupService.java
  46. 190 0
      src/main/java/com/hnshituo/core/auth/service/impl/DepartmentServiceImpl.java
  47. 192 0
      src/main/java/com/hnshituo/core/auth/service/impl/FunctionServiceImpl.java
  48. 253 0
      src/main/java/com/hnshituo/core/auth/service/impl/HomeServiceImpl.java
  49. 49 0
      src/main/java/com/hnshituo/core/auth/service/impl/PrivilegeServiceImpl.java
  50. 100 0
      src/main/java/com/hnshituo/core/auth/service/impl/RoleServiceImpl.java
  51. 162 0
      src/main/java/com/hnshituo/core/auth/service/impl/UserGroupServiceImpl.java
  52. 297 0
      src/main/java/com/hnshituo/core/auth/service/impl/UserLoginServiceImpl.java
  53. 80 0
      src/main/java/com/hnshituo/core/auth/service/impl/UserRoleServiceImpl.java
  54. 549 0
      src/main/java/com/hnshituo/core/auth/service/impl/UserServiceImpl.java
  55. 281 0
      src/main/java/com/hnshituo/core/auth/service/impl/UsersGroupServiceImpl.java
  56. 177 0
      src/main/java/com/hnshituo/core/auth/vo/Department.java
  57. 269 0
      src/main/java/com/hnshituo/core/auth/vo/Function.java
  58. 54 0
      src/main/java/com/hnshituo/core/auth/vo/Privilege.java
  59. 142 0
      src/main/java/com/hnshituo/core/auth/vo/Role.java
  60. 603 0
      src/main/java/com/hnshituo/core/auth/vo/User.java
  61. 188 0
      src/main/java/com/hnshituo/core/auth/vo/UserGroup.java
  62. 497 0
      src/main/java/com/hnshituo/core/auth/vo/UserInfo.java
  63. 159 0
      src/main/java/com/hnshituo/core/auth/vo/UserLogin.java
  64. 65 0
      src/main/java/com/hnshituo/core/auth/vo/UserRole.java
  65. 159 0
      src/main/java/com/hnshituo/core/auth/vo/UsersGroup.java
  66. 17 0
      src/main/java/com/hnshituo/core/auth/vo/UsersGroupSum.java
  67. 174 0
      src/main/java/com/hnshituo/core/orm/plugins/MybatisInterceptor.java
  68. 13 0
      src/main/java/license.xml
  69. 3500 0
      src/main/java/market/Api/Lms/impl/LmsApiServiceImpl.java
  70. 510 0
      src/main/java/market/Api/Lms/impl/LmsMesApiServiceImpl.java
  71. 293 0
      src/main/java/market/Api/Lms/impl/LmsQmsApiServiceImpl.java
  72. 94 0
      src/main/java/market/Api/Lms/impl/LmsSlmApiServiceImpl.java
  73. 7 0
      src/main/java/market/Api/Lms/service/LmsApiService.java
  74. 7 0
      src/main/java/market/Api/Lms/service/LmsMesApiService.java
  75. 7 0
      src/main/java/market/Api/Lms/service/LmsQmsApiService.java
  76. 7 0
      src/main/java/market/Api/Lms/service/LmsSlmApiService.java
  77. 44 0
      src/main/java/market/Api/Mes/impl/DateJsonValueProcessor.java
  78. 81 0
      src/main/java/market/Api/Mes/impl/DesignInfo.java
  79. 24 0
      src/main/java/market/Api/Mes/impl/DoubleJsonValueProcessor.java
  80. 23 0
      src/main/java/market/Api/Mes/impl/IntegerJsonValueProcessor.java
  81. 470 0
      src/main/java/market/Api/Mes/impl/Judge_Prc_Info.java
  82. 23 0
      src/main/java/market/Api/Mes/impl/LongJsonValueProcessor.java
  83. 2411 0
      src/main/java/market/Api/Mes/impl/MesApi12mmPdiPdoImpl.java
  84. 2871 0
      src/main/java/market/Api/Mes/impl/MesApiAnnealPdiPdoImpl.java
  85. 1256 0
      src/main/java/market/Api/Mes/impl/MesApiAnnealPlanImpl.java
  86. 1868 0
      src/main/java/market/Api/Mes/impl/MesApiCrCrossCuttingMServiceImpl.java
  87. 5464 0
      src/main/java/market/Api/Mes/impl/MesApiDesignInfoImpl.java
  88. 1302 0
      src/main/java/market/Api/Mes/impl/MesApiPicklePlanServiceImpl.java
  89. 194 0
      src/main/java/market/Api/Mes/impl/MesApiPlmPdiPdoImpl.java
  90. 5618 0
      src/main/java/market/Api/Mes/impl/MesApiRollPdiPdoImpl.java
  91. 1264 0
      src/main/java/market/Api/Mes/impl/MesApiRollingPlanImpl.java
  92. 3601 0
      src/main/java/market/Api/Mes/impl/MesApiServiceImpl.java
  93. 1280 0
      src/main/java/market/Api/Mes/impl/MesApiSkinrollingPlanImpl.java
  94. 5034 0
      src/main/java/market/Api/Mes/impl/MesApiTpmPdiPdoImpl.java
  95. 77 0
      src/main/java/market/Api/Mes/impl/ProcessPoint.java
  96. 76 0
      src/main/java/market/Api/Mes/impl/ProcessUtils.java
  97. 622 0
      src/main/java/market/Api/Mes/impl/RestfulHttpClient.java
  98. 60 0
      src/main/java/market/Api/Mes/impl/TimestampMorpher.java
  99. 131 0
      src/main/java/market/Api/Mes/impl/Utils.java
  100. 7 0
      src/main/java/market/Api/Mes/service/MesApi12mmPdiPdoService.java

+ 32 - 0
.classpath

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" including="**/*.java" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

+ 2 - 14
.gitignore

@@ -1,14 +1,2 @@
-# ---> Java
-*.class
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.ear
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-
+/target
+/xinsteel.maketx.rar

+ 57 - 0
.project

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>xinsteel.maketx</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.genuitec.eclipse.springframework.springbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.genuitec.eclipse.j2eedt.core.DeploymentDescriptorValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.genuitec.eclipse.springframework.springnature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+	</natures>
+</projectDescription>

+ 12 - 0
.settings/.jsdtscope

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/webapp"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+		<attributes>
+			<attribute name="hide" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary/StandardBrowser/html5"/>
+	<classpathentry kind="output" path=""/>
+</classpath>

+ 3 - 0
.settings/com.genuitec.eclipse.core.prefs

@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+validator.Checked=.myeclipse/wsgeneration,src/main/webapp/js
+validator.Unchecked=

+ 2 - 0
.settings/com.genuitec.eclipse.j2eedt.core.prefs

@@ -0,0 +1,2 @@
+defaultTldInfo=f\=http\://java.sun.com/jsf/core;http\://java.sun.com/jsf/html\=h;http\://struts.apache.org/tags-bean\=bean;http\://java.sun.com/jsp/jstl/fmt\=fmt;nested\=http\://struts.apache.org/tags-nested;bean\=http\://struts.apache.org/tags-bean;http\://java.sun.com/jsp/jstl/sql\=sql;c\=http\://java.sun.com/jsp/jstl/core;fmt\=http\://java.sun.com/jsp/jstl/fmt;http\://struts.apache.org/tags-logic\=logic;http\://java.sun.com/jsp/jstl/xml\=x;http\://java.sun.com/jsp/jstl/core\=c;logic\=http\://struts.apache.org/tags-logic;h\=http\://java.sun.com/jsf/html;http\://struts.apache.org/tags-tiles\=tiles;http\://java.sun.com/jsp/jstl/functions\=fn;tiles\=http\://struts.apache.org/tags-tiles;sql\=http\://java.sun.com/jsp/jstl/sql;http\://struts.apache.org/tags-html\=html;http\://struts.apache.org/tags-nested\=nested;html\=http\://struts.apache.org/tags-html;http\://java.sun.com/jsf/core\=f;fn\=http\://java.sun.com/jsp/jstl/functions;x\=http\://java.sun.com/jsp/jstl/xml
+eclipse.preferences.version=1

+ 6 - 0
.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/java/market/Api/Lms/impl/LmsApiServiceImpl.java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/main/resources/dev=UTF-8
+encoding/<project>=UTF-8

+ 8 - 0
.settings/org.eclipse.jdt.core.prefs

@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.7

+ 4 - 0
.settings/org.eclipse.m2e.core.prefs

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 11 - 0
.settings/org.eclipse.wst.common.component

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="xinsteel.maketx">
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources/dev"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+        <wb-resource deploy-path="/" source-path="/target/m2e-jee/web-resources"/>
+        <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
+        <property name="java-output-path" value="/xinsteel.maketx/WebRoot/WEB-INF/classes"/>
+        <property name="context-root" value="/xinsteel.maketx"/>
+    </wb-module>
+</project-modules>

+ 11 - 0
.settings/org.eclipse.wst.common.project.facet.core.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <fixed facet="java"/>
+  <fixed facet="jst.web"/>
+  <fixed facet="wst.jsdt.web"/>
+  <installed facet="java" version="1.7"/>
+  <installed facet="jst.web" version="2.5"/>
+  <installed facet="jst.web.jstl" version="1.2"/>
+  <installed facet="maven" version="1.0"/>
+  <installed facet="wst.jsdt.web" version="1.0"/>
+</faceted-project>

+ 1 - 0
.settings/org.eclipse.wst.jsdt.ui.superType.container

@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary

+ 1 - 0
.settings/org.eclipse.wst.jsdt.ui.superType.name

@@ -0,0 +1 @@
+Window

+ 2 - 0
.settings/org.eclipse.wst.validation.prefs

@@ -0,0 +1,2 @@
+disabled=06target
+eclipse.preferences.version=1

+ 0 - 8
LICENSE

@@ -1,8 +0,0 @@
-MIT License
-Copyright (c) <year> <copyright holders>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 0 - 3
README.md

@@ -1,3 +0,0 @@
-# XinYu_YTG
-
-新钢优特钢后端

+ 323 - 0
pom.xml

@@ -0,0 +1,323 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>com.hnshituo</groupId>
+		<artifactId>core-fs-lib</artifactId>
+		<version>5.0.20</version>
+	</parent>
+
+	<artifactId>xinsteel.maketx</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>war</packaging>
+
+	<!-- 这里必须配置,不然生成的项目的配置文件会有编码问题 -->
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<profiles>
+		<!-- 开发环境 -->
+		<profile>
+			<id>dev</id>
+			<activation>
+				<activeByDefault>true</activeByDefault>
+			</activation>
+			<properties>
+				<profiles.active>dev</profiles.active>
+				<deploy.url>http://localhost:8080/manager/text</deploy.url>
+				<deploy.username>tomcat</deploy.username>
+				<deploy.password>tomcat</deploy.password>
+			</properties>
+		</profile>
+		<!-- 测试环境 -->
+		<profile>
+			<id>test</id>
+			<properties>
+				<profiles.active>test</profiles.active>
+				<deploy.url>http://localhost:8080/manager/text</deploy.url>
+				<deploy.username>tomcat</deploy.username>
+				<deploy.password>tomcat</deploy.password>
+			</properties>
+		</profile>
+		<!-- 仿真环境 -->
+		<profile>
+			<id>simu</id>
+			<properties>
+				<profiles.active>simu</profiles.active>
+				<deploy.url>http://localhost:8080/manager/text</deploy.url>
+				<deploy.username>tomcat</deploy.username>
+				<deploy.password>tomcat</deploy.password>
+			</properties>
+		</profile>
+		<!-- 生产环境 -->
+		<profile>
+			<id>prd</id>
+			<properties>
+				<profiles.active>prd</profiles.active>
+				<deploy.url>http://localhost:8080/manager/text</deploy.url>
+				<deploy.username>tomcat</deploy.username>
+				<deploy.password>tomcat</deploy.password>
+			</properties>
+		</profile>
+		<profile>
+			<id>prd2</id>
+			<properties>
+				<profiles.active>prd2</profiles.active>
+				<deploy.url>http://localhost:8080/manager/text</deploy.url>
+				<deploy.username>tomcat</deploy.username>
+				<deploy.password>tomcat</deploy.password>
+			</properties>
+		</profile>
+	</profiles>
+
+	<build>
+		<finalName>xinsteel.maketx</finalName>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<!-- 资源根目录排除各环境的配置,使用单独的资源目录来指定 -->
+				<excludes>
+					<exclude>dev/*</exclude>
+					<exclude>test/*</exclude>
+					<exclude>prd/*</exclude>
+					<exclude>prd2/*</exclude>
+				</excludes>
+			</resource>
+			<resource>
+				<directory>src/main/resources/${profiles.active}</directory>
+			</resource>
+		</resources>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>1.7</source>
+					<target>1.7</target>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-war-plugin</artifactId>
+				<version>2.2</version>
+				<configuration>
+					<version>2.5</version>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>tomcat-maven-plugin</artifactId>
+				<!-- <version>1.2-SNAPSHOT</version> -->
+				<configuration>
+					<server>tomcat</server>
+					<url>${deploy.url}</url>
+					<username>${deploy.username}</username>
+					<password>${deploy.password}</password>
+					<path>/xinsteel.maketx</path>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	
+	<dependencies>
+		<dependency>
+		    <groupId>com.hynnet</groupId>
+		    <artifactId>jxl</artifactId>
+		    <version>2.6.12.1</version>
+		</dependency>
+		<dependency>
+		    <groupId>bsh</groupId>
+		    <artifactId>bsh</artifactId>
+		    <version>1.3.0</version>
+		</dependency>
+		<dependency>
+		    <groupId>weld-osgi-bundle</groupId>
+		    <artifactId>weld-osgi-bundle</artifactId>
+		    <version>3.0.0</version>
+		</dependency>
+		<dependency>
+		    <groupId>com.artofsolving</groupId>
+		    <artifactId>jodconverter</artifactId>
+		    <version>2.2.2</version>
+		</dependency>
+		<dependency>
+		    <groupId>icore-file-service</groupId>
+		    <artifactId>icore-file-service</artifactId>
+		    <version>1.0.323</version>
+		</dependency>	
+		<dependency>
+		    <groupId>com.thetransactioncompany</groupId>
+		    <artifactId>cors-filter</artifactId>
+		    <version>1.7</version>
+		</dependency>
+		<dependency>
+		    <groupId>com.thetransactioncompany</groupId>
+		    <artifactId>java-property-utils</artifactId>
+		    <version>1.9</version>
+		</dependency>
+		
+		<dependency>
+			<groupId>com.google.code.gson</groupId>
+			<artifactId>gson</artifactId>
+			<version>2.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.hnshituo.other</groupId>
+			<artifactId>json-lib</artifactId>
+			<version>2.1</version>
+		</dependency>
+		<dependency>
+			<groupId>net.bull.javamelody</groupId>
+			<artifactId>javamelody-core</artifactId>
+			<version>1.61.0</version>
+		</dependency>
+		<dependency>
+		    <groupId>com.thetransactioncompany</groupId>
+		    <artifactId>cors-filter</artifactId>
+		    <version>1.7</version>
+		</dependency>
+		<dependency>
+		    <groupId>com.thetransactioncompany</groupId>
+		    <artifactId>java-property-utils</artifactId>
+		    <version>1.9</version>
+		</dependency>
+		<!-- <dependency>
+		    <groupId>com.oracle</groupId>
+		    <artifactId>ojdbc</artifactId>
+		    <version>11.2.0.1.0</version>
+		</dependency> -->
+		<dependency>
+			<groupId>commons-dbcp</groupId>
+			<artifactId>commons-dbcp</artifactId>
+			<version>1.4</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-pool</groupId>
+			<artifactId>commons-pool</artifactId>
+			<version>1.6</version>
+		</dependency>
+		<dependency>
+		    <groupId>axis</groupId>
+		    <artifactId>axis</artifactId>
+		    <version>1.4</version>
+		</dependency>
+		<dependency>
+		    <groupId>jaxrpc</groupId>
+		    <artifactId>jaxrpc</artifactId>
+		    <version>1.1</version>
+		</dependency>	
+       <dependency>
+			<groupId>commons-discovery</groupId>
+			<artifactId>commons-discovery</artifactId>
+			<version>0.2</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-net</groupId>
+			<artifactId>commons-net</artifactId>
+			<version>1.4.1</version>
+		</dependency>				
+		<dependency>
+			<groupId>commons-fileupload</groupId>
+			<artifactId>commons-fileupload</artifactId>
+			<version>1.3.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml-schemas</artifactId>
+			<version>3.17</version>
+		</dependency>
+		<dependency>
+			<groupId>fakepath</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.17</version>
+		</dependency>
+		<dependency>
+			<groupId>fakepath</groupId>
+			<artifactId>poi</artifactId>
+			<version>3.17</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-collections4</artifactId>
+			<version>4.1</version>
+		</dependency>
+		<dependency>
+			<groupId>dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+			<version>1.6.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.xmlbeans</groupId>
+			<artifactId>xmlbeans</artifactId>
+			<version>2.6.0</version>
+		</dependency>
+		<dependency>
+			<groupId>stax</groupId>
+			<artifactId>stax-api</artifactId>
+			<version>1.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-stax-api_1.0_spec</artifactId>
+			<version>1.0.1</version>
+		</dependency>
+        <dependency>
+           <groupId>org.apache.poi</groupId>
+           <artifactId>poi-scratchpad</artifactId>
+           <version>3.17</version>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.poi</groupId>
+          <artifactId>poi-excelant</artifactId>
+          <version>3.17</version>
+        </dependency>
+        <dependency>
+	<groupId>com.google.zxing</groupId>
+	<artifactId>javase</artifactId>
+	<version>3.3.0</version>
+</dependency>
+	<dependency>
+      <groupId>qrcode</groupId>
+      <artifactId>qrcode-api</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.aspose</groupId>
+      <artifactId>aspose-cells</artifactId>
+      <version>8.5.2</version>
+    </dependency>
+    <dependency>
+		<groupId>commons-codec</groupId>
+		<artifactId>commons-codec</artifactId>
+		<version>1.3</version>
+	</dependency>
+	
+	<dependency>
+        <groupId>mysql</groupId>
+        <artifactId>mysql-connector-java</artifactId>
+        <version>5.1.6</version>
+    </dependency> 
+
+	<dependency>
+     	<groupId>com.itextpdf</groupId>
+     	<artifactId>itextpdf</artifactId>
+     	<version>5.5.6</version>
+	</dependency>
+ 	<dependency>
+     	<groupId>com.itextpdf</groupId>
+    	<artifactId>itext-asian</artifactId>
+    	<version>5.2.0</version>
+ 	</dependency>
+ 	<dependency>
+     	<groupId>org.bouncycastle</groupId>
+    	<artifactId>bcprov-jdk15on</artifactId>
+    	<version>1.47</version>
+ 	</dependency>
+ 
+	</dependencies>
+	
+	
+</project>

+ 365 - 0
src/main/config/code_checker/checkstyle_v1.0.xml

@@ -0,0 +1,365 @@
+<?xml version="1.0" encoding="UTF-8"?>  
+<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+<!-- This configuration file was written by the eclipse-cs plugin configuration 
+	editor -->
+<!-- Checkstyle-Configuration: check Description: none -->
+<module name="Checker">
+
+	<property name="severity" value="error" />
+	<property name="charset" value="UTF-8" />
+	<message key="general.exception" value="有一个异常 - {0}  " />
+	<message key="general.fileNotFound" value="文件没找到!" />
+
+	<!--章节2.2A -->
+	<!-- 不允许使用TAB缩进,此规则必须在<TreeWalker>标签外 -->
+	<module name="FileTabCharacter">
+		<property name="severity" value="error" />
+		<property name="eachLine" value="true" />
+		<message key="containsTab" value="本行包含 tab 字符,违反《迷彩CMS平台Java编码规范  V1.0》2.2章节的要求" />
+	</module>
+
+
+	<!--章节3.1.1 -->
+	<!-- 检查每个java package中是否有java注释文件,默认是允许一个package-info.java, 也可以通过allowLegacy属性配置允许package.html。此规则必须在<TreeWalker>标签外 -->
+	<module name="JavadocPackage">
+		<message key="javadoc.packageInfo"
+			value="包注释没有写入该包所在路径下一个名为package-info.java的包说明文件,违反《迷彩CMS平台Java编码规范  V1.0》3.1.1章节的要求" />
+	</module>
+
+	<!-- 章节3.2 -->
+	<!-- 对文件头的注释进行检查 -->
+	<!-- 文件头注释检查 -->
+	<module name="RegexpHeader">
+		<property name="header"
+			value="/(\*){2}\n\*(\S){3}(Copyright\s(\S)\s中国证监会迷彩CMS平台版权所有。(\S){4})\n\*(类名:([A-Z][a-z]*)+)\n\*(创建人:([A-Z]*[a-z]*[\u4E00-\u9FFF]*)+(\s{4}))(创建时间:([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))\n\*/" />
+		<message key="header.missing" value="缺少文件头注释,违反《迷彩CMS平台Java编码规范  V1.0》3.2章节的要求" />
+		<message key="header.mismatch"
+			value="文件头注释与预定义规则不匹配,违反《迷彩CMS平台Java编码规范  V1.0》3.2章节的要求" />
+	</module>
+	<module name="TreeWalker">
+		<property name="severity" value="error" />
+		<property name="tabWidth" value="4" />
+		<message key="general.exception" value="有一个异常 - {0}" />
+
+		<!--章节1.2.1 -->
+		<!-- Import语句顺序检测 -->
+		<module name="ImportOrder">
+			<property name="groups" value="java,javax,org,com" />
+			<message key="import.ordering"
+				value="本行或者上一行包导入顺序不对,违反《迷彩CMS平台Java编码规范  V1.0》1.2.1章节的要求" />
+		</module>
+
+		<!--章节2.2B -->
+		<!-- 缩进风格 -->
+		<module name="Indentation">
+			<property name="severity" value="error" />
+			<property name="basicOffset" value="4" />
+			<message key="indentation.error"
+				value="你缩进了{1}个空格,正确应该缩进 {2}个空格,违反《迷彩CMS平台Java编码规范  V1.0》2.2章节的要求" />
+			<!-- 子级缩进 -->
+			<message key="indentation.child.error"
+				value="你缩进了{1}个空格,正确应该缩进 {2}个空格,违反《迷彩CMS平台Java编码规范  V1.0》2.2章节的要求" />
+		</module>
+
+		<!--章节2.3 -->
+		<!-- 页宽 -->
+		<module name="LineLength">
+			<property name="max" value="120" />
+			<property name="ignorePattern" value="^ *\* *[^ ]+$"/>
+			<message key="maxLineLen" value="行字符数超过120个.违反《迷彩CMS平台Java编码规范  V1.0》2.3章节的要求" />
+		</module>
+
+		<!--章节2.4 -->
+		<!--操作符换行策略检查 -->
+		<module name="OperatorWrap">
+			<property name="severity" value="error" />
+			<property name="option" value="nl" />
+			<property name="tokens"
+				value="ASSIGN,BAND,BOR,DIV,EQUAL,GE,GT,LAND,LE,LOR,LT,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,STAR,STAR_ASSIGN" />
+			<message key="line.new"
+				value="''{0}'没有放在新行之首,违反《迷彩CMS平台Java编码规范  V1.0》2.4章节的要求" />
+		</module>
+
+		<!--章节2.6 -->
+		<module name="ParenPad">
+			<property name="severity" value="error" />
+			<property name="tokens"
+				value="LPAREN,RPAREN,CTOR_CALL,METHOD_CALL,SUPER_CTOR_CALL" />
+			<message key="ws.followed"
+				value="''{0}'' 后面有空格,违反《迷彩CMS平台Java编码规范  V1.0》2.6章节的要求" />
+			<message key="ws.preceded"
+				value="''{0}''前面有空格,违反《迷彩CMS平台Java编码规范  V1.0》2.6章节的要求" />
+		</module>
+		<module name="TypecastParenPad">
+			<property name="severity" value="error" />
+			<property name="tokens" value="RPAREN,TYPECAST" />
+			<message key="ws.followed"
+				value="''{0}''后面多一个空格,违反《迷彩CMS平台Java编码规范  V1.0》2.6章节的要求" />
+			<message key="ws.preceded"
+				value="''{0}''前面多一个空格,违反《迷彩CMS平台Java编码规范  V1.0》2.6章节的要求" />
+		</module>
+		<module name="WhitespaceAfter">
+			<property name="severity" value="error" />
+			<property name="tokens" value="COMMA,SEMI" />
+			<message key="ws.notFollowed"
+				value="''{0}''后面多一个空格,违反《迷彩CMS平台Java编码规范  V1.0》2.6章节的要求" />
+		</module>
+		<module name="WhitespaceAround">
+			<property name="severity" value="error" />
+			<property name="tokens"
+				value="RCURLY,LITERAL_ASSERT,LITERAL_ASSERT,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE" />
+			<property name="allowEmptyConstructors" value="true" />
+			<property name="allowEmptyMethods" value="true" />
+			<message key="ws.notPreceded"
+				value="''{0}'' 关键字前少一个空格,违反《迷彩CMS平台Java编码规范  V1.0》2.6章节的要求" />
+			<message key="ws.notFollowed"
+				value="''{0}'' 关键字后少一个空格,违反《迷彩CMS平台Java编码规范  V1.0》2.6章节的要求" />
+		</module>
+
+		<!--章节2.7 -->
+		<!-- 每行语句数量 -->
+		<module name="OneStatementPerLine">
+			<message key="multiple.statements.line" value="禁止一行有多句代码,违反《迷彩CMS平台Java编码规范  V1.0》2.7章节的要求" />
+		</module>
+
+		<!--章节2.8 -->
+		<!-- 每行变量声明数量 -->
+		<module name="MultipleVariableDeclarations">
+			<property name="severity" value="error" />
+			<message key="multiple.variable.declarations.comma"
+				value="每一个变量的定义必须在它的声明处,且在同一行,违反《迷彩CMS平台Java编码规范  V1.0》2.8章节的要求" />
+			<message key="multiple.variable.declarations" value="每一行只能定义一个变量,违反《迷彩CMS平台Java编码规范  V1.0》2.8章节的要求" />
+		</module>
+
+		<!--章节2.9.1 -->
+		<!-- 检查右侧大括号 -->
+		<module name="RightCurly">
+			<property name="severity" value="error" />
+			<message key="line.alone" value="右侧大括号必须放在单独一行" />
+			<message key="line.new" value="右侧大括号必须放在一个新行" />
+		</module>
+
+		<!--章节2.9.1 -->
+		<!-- 检查左侧大括号 左侧大括号必须放在前一行代码的行尾 -->
+		<module name="LeftCurly">
+			<property name="severity" value="error" />
+			<message key="line.previous"
+				value="左侧大括号没有放在前一行代码的行尾,违反《迷彩CMS平台Java编码规范  V1.0》2.9.1章节的要求" />
+		</module>
+
+		<!--章节2.9.2 -->
+		<!-- 检查代码块是否缺失大括号 -->
+		<module name="NeedBraces">
+			<message key="needBraces"
+				value="''{0}'' 结构没有用大括号 '''{}'''s,违反《迷彩CMS平台Java编码规范  V1.0》2.9.2章节的要求" />
+		</module>
+
+		<!--章节3.3 -->
+		<!--对类和接口的javadoc注释进行检查 -->
+		<module name="JavadocType">
+			<!-- To configure the check for an @author tag: -->
+			<property name="authorFormat" value="\S" />
+			<property name="severity" value="error" />
+			<message key="type.missingTag"
+				value="Javadoc 类型的注释丢失 {0} 标签.违反《迷彩CMS平台Java编码规范  V1.0》3.3章节的要求" />
+			<message key="javadoc.missing"
+				value="缺少 Javadoc 注释.违反《迷彩CMS平台Java编码规范  V1.0》3.3章节的要求" />
+			<message key="javadoc.unusedTagGeneral"
+				value="未使用过的 Javadoc 标签.违反《迷彩CMS平台Java编码规范  V1.0》3.23章节的要求" />
+			<message key="javadoc.unusedTag"
+				value="未使用过的 {0} 标签for ''{1}''.违反《迷彩CMS平台Java编码规范  V1.0》3.3章节的要求" />
+			<message key="type.tagFormat"
+				value="Javadoc 类型标签 {0}必须匹配模式 ''{1}''.违反《迷彩CMS平台Java编码规范  V1.0》3.3章节的要求" />
+		</module>
+
+		<!--章节3.4,3.7 -->
+		<!--public protect private变量的注释进行检查 -->
+		<module name="JavadocVariable">
+			<property name="severity" value="error" />
+			<property name="scope" value="public" />
+			<message key="javadoc.missing"
+				value="变量注释:缺少Javadoc注释,违反《迷彩CMS平台Java编码规范  V1.0》3.4章节的要求" />
+		</module>
+		<module name="JavadocVariable">
+			<property name="severity" value="error" />
+			<property name="scope" value="protected" />
+			<message key="javadoc.missing"
+				value="变量注释:缺少Javadoc注释,违反《迷彩CMS平台Java编码规范  V1.0》3.4章节的要求" />
+		</module>
+		<module name="JavadocVariable">
+			<property name="severity" value="error" />
+			<message key="javadoc.missing"
+				value="变量注释:缺少Javadoc注释,违反《迷彩CMS平台Java编码规范  V1.0》3.4章节的要求" />
+		</module>
+
+		<!--章节3.5 -->
+		<!-- 检查所有方法的javadoc,可以不声明RuntimeException -->
+		<module name="JavadocMethod">
+			<property name="scope" value="public" />
+			<property name="allowUndeclaredRTE" value="true" />
+			<property name="allowMissingParamTags" value="true" />
+			<!--允许get set 方法没有注释 -->
+			<property name="allowMissingPropertyJavadoc" value="true" />
+			<message key="javadoc.missing"
+				value="方法注释:缺少Javadoc注释,违反《迷彩CMS平台Java编码规范  V1.0》3.5章节的要求" />
+		</module>
+		<module name="JavadocMethod">
+			<property name="scope" value="private" />
+			<property name="excludeScope" value="protected" />
+			<!--允许get set 方法没有注释 -->
+			<property name="allowMissingPropertyJavadoc" value="true" />
+			<message key="javadoc.missing"
+				value="方法注释:缺少Javadoc注释,违反《迷彩CMS平台Java编码规范  V1.0》3.5章节的要求" />
+		</module>
+		<!-- 命名规范 -->
+		<!--章节4.2 -->
+		<!-- 包名命名规范 -->
+		<module name="PackageName">
+			<property name="format" value="^org\.neris\.[a-z]+(\.[a-z]+)+$" />
+			<message key="name.invalidPattern"
+				value="包名 ''{0}'' 不符合org.neris.项目名.模块名,违反《迷彩CMS平台Java编码规范  V1.0》4.2章节的要求" />
+		</module>
+
+		<!--章节4.3,4.4 -->
+		<!-- 类的命名,匹配规则默认:(^[A-Z][a-zA-Z0-9]*$),必须以大写字母开始 -->
+		<module name="TypeName">
+			<property name="tokens" value="CLASS_DEF" />
+			<message key="name.invalidPattern"
+				value="类名 ''{0}''没有通过大驼峰命名法命名,具体名称应使用意义完整的英文描述,违反《迷彩CMS平台Java编码规范  V1.0》4.3章节的要求" />
+		</module>
+
+		<!-- 接口命名,匹配规则默认:(^[A-Z][a-zA-Z0-9]*$),必须以大写字母开始 -->
+		<module name="TypeName">
+			<property name="tokens" value="INTERFACE_DEF" />
+			<message key="name.invalidPattern"
+				value="接口名 ''{0}''没有通过大驼峰命名法命名,具体名称应使用意义完整的英文描述,违反《迷彩CMS平台Java编码规范  V1.0》4.3章节的要求" />
+		</module>
+
+		<!--章节4.6 -->
+		<!-- 方法名命名 -->
+		<module name="MethodName">
+			<property name="severity" value="error" />
+			<property name="format" value="(^[a-z][a-zA-Z0-9]*$)" />
+			<message key="name.invalidPattern"
+				value="方法名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反《迷彩CMS平台Java编码规范  V1.0》4.6章节的要求" />
+		</module>
+
+		<!--章节4.7 -->
+		<!--章节4.7.1 -->
+		<!-- 局部变量命名 -->
+		<module name="LocalVariableName">
+			<property name="format" value="(^[a-z][a-zA-Z0-9]*$)" />
+			<message key="name.invalidPattern"
+				value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反《迷彩CMS平台Java编码规范  V1.0》4.7章节的要求" />
+		</module>
+		<!-- 局部的final变量,包括catch中的参数的检查 -->
+		<module name="LocalFinalVariableName">
+			<property name="severity" value="error" />
+			<message key="name.invalidPattern"
+				value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反《迷彩CMS平台Java编码规范  V1.0》4.7章节的要求" />
+		</module>
+		<!-- 变量命名 -->
+		<module name="MemberName">
+			<message key="name.invalidPattern"
+				value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反《迷彩CMS平台Java编码规范  V1.0》4.7章节的要求" />
+		</module>
+		<!-- 静态变量命名 -->
+		<module name="StaticVariableName">
+			<message key="name.invalidPattern"
+				value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反《迷彩CMS平台Java编码规范  V1.0》4.7章节的要求" />
+		</module>
+		<!--章节4.7.2 -->
+		<!-- 数组变量命名 -->
+		<module name="ArrayTypeStyle">
+			<property name="severity" value="error" />
+			<message key="array.type.style"
+				value="数组定义没有采取String [] args这种方式,违反《迷彩CMS平台Java编码规范  V1.0》4.7.2章节的要求" />
+		</module>
+
+		<!--章节4.8 -->
+		<!-- 常量命名 -->
+		<module name="ConstantName">
+			<property name="severity" value="error" />
+			<message key="name.invalidPattern" value="''{0}'' 常量名违反《迷彩CMS平台Java编码规范  V1.0》4.8章节的要求." />
+		</module>
+
+		<!--章节5.1 -->
+		<!-- import语句不使用通配符 -->
+		<module name="AvoidStarImport">
+			<property name="severity" value="error" />
+			<message key="import.avoidStar" value="引用包时不能使用*号.违反《迷彩CMS平台Java编码规范  V1.0》5.1章节的要求" />
+		</module>
+
+		<!--章节5.2 -->
+		<!-- 魔法数检测 -->
+		<module name="MagicNumber">
+			<property name="severity" value="error" />
+			<message key="magic.number"
+				value="''{0}'' 是一个魔法数(即常数).违反《迷彩CMS平台Java编码规范  V1.0》5.2章节的要求" />
+		</module>
+
+		<!--章节5.4 -->
+		<!-- 多余的关键字,包含不适用this作为关键字 -->
+		<module name="RedundantModifier">
+			<message key="redundantModifier"
+				value="''{0}'' 多余的修饰符.违反《迷彩CMS平台Java编码规范  V1.0》5.4章节的要求" />
+		</module>
+
+		<!--章节5.5 -->
+		<!-- 重载父类方法 -->
+		<module name="MissingOverride">
+			<message key="annotation.missing.override"
+				value="重载方法缺少@Override,违反《迷彩CMS平台Java编码规范  V1.0》5.5章节的要求" />
+			<message key="tag.not.valid.on" value="注释-> Javadoc {0}标签在这个位置是无效的." />
+		</module>
+
+		<!--章节5.6 -->
+		<!--判断语句使用 -->
+		<module name="SimplifyBooleanExpression">
+			<property name="severity" value="error" />
+			<message key="simplify.expression" value="布尔冗余,违法《迷彩CMS平台Java编码规范  V1.0》5.6章节的要求." />
+		</module>
+
+		<!--章节5.7 -->
+		<!-- 检查switch语句是否忘记了default标签 -->
+		<module name="MissingSwitchDefault">
+			<property name="severity" value="error" />
+			<message key="missing.switch.default"
+				value="switch 语句后边没有 default 语句.违法《迷彩CMS平台Java编码规范  V1.0》5.7章节的要求" />
+		</module>
+
+		<!-- 检查switch语句中default标签的顺序 -->
+		<module name="DefaultComesLast">
+			<property name="severity" value="error" />
+			<message key="default.comes.last" value="建议Default 放在 switch 语句的最后." />
+		</module>
+
+		<!--章节5.9 -->
+		<!-- 禁止使用System.out.println -->
+		<module name="Regexp">
+			<property name="format" value="System\.out" />
+			<property name="message"
+				value="不要使用 System.out 与 System.err 进行控制台打印,应该使用日志工具类(如:log4j)进行统一记录或者打印,违法《迷彩CMS平台Java编码规范  V1.0》5.9章节的要求" />
+			<property name="illegalPattern" value="true" />
+		</module>
+		<!-- 禁止使用System.err.println -->
+		<module name="Regexp">
+			<property name="format" value="System\.err" />
+			<property name="message"
+				value="不要使用 System.out 与 System.err 进行控制台打印,应该使用日志工具类(如:log4j)进行统一记录或者打印,违法《迷彩CMS平台Java编码规范  V1.0》5.9章节的要求" />
+			<property name="illegalPattern" value="true" />
+		</module>
+
+		<!--章节5.10 -->
+		<!-- 不允许用main方法测试 -->
+		<module name="UncommentedMain">
+			<message key="uncommented.main"
+				value="不允许使用main方法进行测试,违反《迷彩CMS平台Java编码规范  V1.0》5.10章节的要求" />
+		</module>
+
+
+
+
+	</module>
+
+</module>

+ 1182 - 0
src/main/config/code_checker/findbugs_v1.0.xml

@@ -0,0 +1,1182 @@
+<FindbugsPlugin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   				xsi:noNamespaceSchemaLocation="findbugsplugin.xsd"
+				pluginid="edu.umd.cs.findbugs.plugins.core"
+                defaultenabled="true"
+                provider="FindBugs project" 
+                website="http://findbugs.sourceforge.net"
+                >
+				
+  <OrderingConstraints>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.FieldItemSummary"/>
+		<LaterCategory name="reporting" spanplugins="true"/>
+	</SplitPass>
+	<!--
+		NoteSuppressedWarnings should be run in
+		an earlier pass than all reporting detectors, including those in
+		other plugins.
+	-->
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteSuppressedWarnings"/>
+		<LaterCategory name="reporting" spanplugins="true"/>
+	</SplitPass>
+	
+	<!-- NoteCheckReturnValue should happen in an earlier pass than BCPMethodReturnCheck. -->
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteAnnotationRetention"/>
+		<Later class="edu.umd.cs.findbugs.detect.DumbMethods"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteDirectlyRelevantTypeQualifiers"/>
+		<Later class="edu.umd.cs.findbugs.detect.CheckTypeQualifiers"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.BuildObligationPolicyDatabase"/>
+		<Later class="edu.umd.cs.findbugs.detect.FindUnsatisfiedObligation"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteCheckReturnValue"/>
+		<Later class="edu.umd.cs.findbugs.detect.BCPMethodReturnCheck"/>
+	</SplitPass>
+
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.ReflectiveClasses"/>
+		<Later class="edu.umd.cs.findbugs.detect.UnreadFields"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.CalledMethods"/>
+		<Later class="edu.umd.cs.findbugs.detect.UncallableMethodOfAnonymousClass"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.CalledMethods"/>
+		<Later class="edu.umd.cs.findbugs.detect.FindReturnRef"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.Methods"/>
+		<Later class="edu.umd.cs.findbugs.detect.ConfusionBetweenInheritedAndOuterMethod"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteCheckReturnValueAnnotations"/>
+		<Later class="edu.umd.cs.findbugs.detect.MethodReturnCheck"/>
+	</SplitPass>
+	<!-- NoteNonNullAnnotations, NoteUnconditionalParamDerefs
+		 should happen in an earlier pass than FindNullDeref. -->	
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteNonNullAnnotations"/>
+		<Later class="edu.umd.cs.findbugs.detect.TrainUnconditionalDerefParams"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteNonNullAnnotations"/>
+		<Later class="edu.umd.cs.findbugs.detect.FindNullDeref"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteJCIPAnnotation"/>
+		<Later class="edu.umd.cs.findbugs.detect.FindInconsistentSync2"/>
+	</SplitPass>
+	<WithinPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteUnconditionalParamDerefs"/>
+		<Later class="edu.umd.cs.findbugs.detect.FindNullDeref"/>
+	</WithinPass>
+	<WithinPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteNonnullReturnValues"/>
+		<Later class="edu.umd.cs.findbugs.detect.FindNullDeref"/>
+	</WithinPass>
+	<WithinPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.UnreadFields"/>
+		<Later class="edu.umd.cs.findbugs.detect.FindMaskedFields"/>
+	</WithinPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteNonNullAnnotations"/>
+		<Later class="edu.umd.cs.findbugs.detect.NoteUnconditionalParamDerefs"/>
+	</SplitPass>
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.Methods"/>
+		<Later class="edu.umd.cs.findbugs.detect.NoteUnconditionalParamDerefs"/>
+	</SplitPass>
+	
+	<!-- NoteUnconditionalParamDerefs should come before FindBadEqualsImplementation. -->
+	<SplitPass>
+		<Earlier class="edu.umd.cs.findbugs.detect.NoteUnconditionalParamDerefs"/>
+		<Later class="edu.umd.cs.findbugs.detect.FindBadEqualsImplementation"/>
+	</SplitPass>
+
+	<!--
+		Make CheckExpectedWarnings run in a separate pass, after all
+		reporting detectors have completed.
+	-->
+	<SplitPass>
+		<EarlierCategory name="reporting" spanplugins="true"/>
+		<Later class="edu.umd.cs.findbugs.detect.CheckExpectedWarnings"/>
+	</SplitPass>
+  </OrderingConstraints>
+				
+  <Detector class="edu.umd.cs.findbugs.detect.NoteSuppressedWarnings" 
+	        speed="fast"
+	        reports=""
+			hidden="true" /> 
+  <Detector class="edu.umd.cs.findbugs.detect.NoteAnnotationRetention" 
+	        speed="fast"
+	        reports=""
+			hidden="true" /> 
+	      
+  <Detector class="edu.umd.cs.findbugs.detect.NoteDirectlyRelevantTypeQualifiers" 
+	        speed="fast"
+	        reports=""
+			hidden="true" /> 
+  <Detector class="edu.umd.cs.findbugs.detect.BuildInterproceduralCallGraph" 
+	        speed="fast"
+	        reports=""
+		disabled="true"
+			hidden="true" /> 
+
+  <Detector class="edu.umd.cs.findbugs.detect.BuildObligationPolicyDatabase" speed="fast" reports="" hidden="true"/>
+	      
+  <Detector class="edu.umd.cs.findbugs.detect.SynchronizeAndNullCheckField"
+			speed="moderate"
+			reports="NP_SYNC_AND_NULL_CHECK_FIELD" 
+			hidden="false"/>
+
+<Detector class="edu.umd.cs.findbugs.detect.BooleanReturnNull"  
+  			reports="NP_BOOLEAN_RETURN_NULL"
+  			disabled="true"
+  			hidden="true" />
+	       
+  <Detector class="edu.umd.cs.findbugs.detect.NoteJCIPAnnotation"
+                speed="fast"
+                reports=""
+                hidden="true" />
+                 
+  <Detector class="edu.umd.cs.findbugs.detect.Methods" 
+	        speed="fast"
+	        reports=""
+			disabled="false"
+			hidden="true" /> 
+
+  <Detector class="edu.umd.cs.findbugs.detect.ReflectiveClasses" 
+	        speed="fast"
+	        reports=""
+			disabled="false"
+			hidden="true" /> 
+			
+  <Detector class="edu.umd.cs.findbugs.detect.CalledMethods" 
+	        speed="fast"
+	        reports=""
+			disabled="false"
+			hidden="true" /> 
+			
+  <Detector class="edu.umd.cs.findbugs.detect.ConfusionBetweenInheritedAndOuterMethod" 
+	        speed="moderate"
+	        reports="IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD"
+			disabled="false"
+			hidden="false" /> 
+	        
+  <Detector class="edu.umd.cs.findbugs.detect.NoteCheckReturnValue" 
+	        speed="fast"
+	        reports=""
+            hidden="true" /> 
+  <Detector class="edu.umd.cs.findbugs.detect.SynchronizationOnSharedBuiltinConstant" 
+	        speed="fast"
+	        reports="DL_SYNCHRONIZATION_ON_BOOLEAN,DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE,DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE,DL_SYNCHRONIZATION_ON_SHARED_CONSTANT"
+            disabled="true"
+            hidden="true" /> 
+ <Detector class="edu.umd.cs.findbugs.detect.NoteCheckReturnValueAnnotations" 
+	        speed="fast"
+	        reports=""
+	        requirejre="1.5"
+            hidden="true" /> 
+  <Detector class="edu.umd.cs.findbugs.detect.FieldItemSummary"
+            speed="fast"
+            reports=""
+			hidden="true"/>
+  <Detector class="edu.umd.cs.findbugs.detect.NoteNonNullAnnotations"
+            speed="fast"
+            reports=""
+			hidden="true"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.NoteUnconditionalParamDerefs"
+	        speed="slow"
+	        reports=""
+	        hidden="true"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.NoteNonnullReturnValues"
+	        speed="slow"
+	        reports=""
+	        hidden="true"/>
+  <Detector class="edu.umd.cs.findbugs.detect.SynchronizeOnClassLiteralNotGetClass"
+                    speed="fast"
+                    reports="WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL"
+                    disabled="true"
+                    hidden="false"/>        
+	        
+  <Detector class="edu.umd.cs.findbugs.detect.InfiniteRecursiveLoop" 
+	        speed="fast"
+            reports="IL_INFINITE_RECURSIVE_LOOP,IL_CONTAINER_ADDED_TO_ITSELF" /> 
+
+  <Detector class="edu.umd.cs.findbugs.detect.InfiniteLoop" 
+	        speed="fast"
+            reports="IL_INFINITE_LOOP" /> 
+
+  <Detector class="edu.umd.cs.findbugs.detect.InfiniteRecursiveLoop2"
+            speed="slow"
+            reports="IL_INFINITE_RECURSIVE_LOOP,IL_CONTAINER_ADDED_TO_ITSELF"
+            disabled="true"/>
+            
+  <Detector class="edu.umd.cs.findbugs.detect.VolatileUsage" 
+	        speed="fast"
+            reports="VO_VOLATILE_REFERENCE_TO_ARRAY" /> 
+            
+  <Detector class="edu.umd.cs.findbugs.detect.InheritanceUnsafeGetResource" 
+	        speed="fast"
+	        disabled="true"
+            reports="UI_INHERITANCE_UNSAFE_GETRESOURCE" /> 
+            
+  <Detector class="edu.umd.cs.findbugs.detect.EmptyZipFileEntry" 
+	        speed="moderate"
+            reports="AM_CREATES_EMPTY_ZIP_FILE_ENTRY,AM_CREATES_EMPTY_JAR_FILE_ENTRY" />
+          
+ <Detector class="edu.umd.cs.findbugs.detect.DoInsideDoPrivileged" 
+            speed="fast"
+            reports="DP_DO_INSIDE_DO_PRIVILEGED,DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED"/>  
+  <Detector class="edu.umd.cs.findbugs.detect.HugeSharedStringConstants" 
+            speed="fast"
+            disabled="true"
+            reports="HSC_HUGE_SHARED_STRING_CONSTANT" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FinalizerNullsFields"
+  			speed="fast"
+  			reports="FI_FINALIZER_NULLS_FIELDS,FI_FINALIZER_ONLY_NULLS_FIELDS" />
+  			
+  <Detector class="edu.umd.cs.findbugs.detect.InconsistentAnnotations" 
+            speed="fast"
+            disabled="true"
+            reports="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE"/>
+  <Detector class="edu.umd.cs.findbugs.detect.RepeatedConditionals" 
+            speed="fast"
+            disabled="true"
+            reports="RpC_REPEATED_CONDITIONAL_TEST"
+		/>
+  <Detector class="edu.umd.cs.findbugs.detect.CallToUnsupportedMethod" 
+            speed="fast"
+            disabled="true"
+            reports="DMI_UNSUPPORTED_METHOD"
+		/>
+  <Detector class="edu.umd.cs.findbugs.detect.FormatStringChecker" 
+            speed="fast"
+            disabled="true"
+            reports="VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED,VA_FORMAT_STRING_ILLEGAL,VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT,VA_FORMAT_STRING_MISSING_ARGUMENT,VA_FORMAT_STRING_BAD_ARGUMENT"
+             />
+  <Detector class="edu.umd.cs.findbugs.detect.TestingGround" 
+            speed="fast"
+            reports="TESTING"
+            disabled="true"
+            hidden="true" />
+  <Detector class="edu.umd.cs.findbugs.detect.ResolveAllReferences" 
+            speed="fast"
+            reports="VR_UNRESOLVABLE_REFERENCE"
+            disabled="true"
+            hidden="true" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.CheckImmutableAnnotation" 
+	        speed="fast"
+            reports="JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS" />
+  <Detector class="edu.umd.cs.findbugs.detect.DontCatchIllegalMonitorStateException" 
+	        speed="fast"
+            reports="IMSE_DONT_CATCH_IMSE" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindFloatMath"
+            speed="moderate" 
+	        disabled="true"
+			hidden="true"
+            reports="FL_MATH_USING_FLOAT_PRECISION" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.CloneIdiom" 
+            speed="fast" 
+            reports="CN_IDIOM,CN_IDIOM_NO_SUPER_CALL,CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.ComparatorIdiom" 
+            speed="fast" 
+            disabled="true"
+            reports="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindFieldSelfAssignment" 
+            speed="fast"
+            reports="SA_FIELD_SELF_ASSIGNMENT,SA_LOCAL_DOUBLE_ASSIGNMENT" />
+  <Detector class="edu.umd.cs.findbugs.detect.FindSelfComparison" 
+            speed="fast"
+            reports="SA_FIELD_SELF_COMPARISON,SA_LOCAL_SELF_COMPARISON,SA_FIELD_SELF_COMPUTATION,SA_LOCAL_SELF_COMPUTATION,SA_FIELD_DOUBLE_ASSIGNMENT" />
+  <Detector class="edu.umd.cs.findbugs.detect.FindSelfComparison2" 
+            speed="fast"
+            reports="SA_FIELD_SELF_COMPARISON,SA_LOCAL_SELF_COMPARISON,SA_FIELD_SELF_COMPUTATION,SA_LOCAL_SELF_COMPUTATION" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.DroppedException" 
+            speed="fast"
+            reports="DE_MIGHT_DROP,DE_MIGHT_IGNORE" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.LoadOfKnownNullValue" 
+            speed="fast"
+            disabled="false"
+            reports="NP_LOAD_OF_KNOWN_NULL_VALUE"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.DumbMethodInvocations" 
+            speed="fast"
+            disabled="false"
+            reports="DMI_EMPTY_DB_PASSWORD,DMI_CONSTANT_DB_PASSWORD,DMI_USELESS_SUBSTRING,DMI_HARDCODED_ABSOLUTE_FILENAME"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.URLProblems" 
+            speed="fast"
+            reports="DMI_BLOCKING_METHODS_ON_URL,DMI_COLLECTION_OF_URLS"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.DumbMethods" 
+            speed="fast"
+            reports="NP_IMMEDIATE_DEREFERENCE_OF_READLINE,RV_01_TO_INT,DM_RUN_FINALIZERS_ON_EXIT,DM_STRING_CTOR,DM_STRING_VOID_CTOR,DM_STRING_TOSTRING,DM_GC,DM_BOOLEAN_CTOR,DM_STRING_EMPTY_EQUALS,DM_EXIT,DM_CONVERT_CASE,SW_SWING_METHODS_INVOKED_IN_SWING_THREAD,DM_BOXED_PRIMITIVE_TOSTRING,DM_NEW_FOR_GETCLASS,DM_NEXTINT_VIA_NEXTDOUBLE,DM_USELESS_THREAD,DM_MONITOR_WAIT_ON_CONDITION,DMI_CALLING_NEXT_FROM_HASNEXT,RV_REM_OF_HASHCODE,RV_REM_OF_RANDOM_INT,RV_ABSOLUTE_VALUE_OF_RANDOM_INT,RV_ABSOLUTE_VALUE_OF_HASHCODE,BIT_IOR_OF_SIGNED_BYTE,INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE,INT_BAD_COMPARISON_WITH_SIGNED_BYTE,INT_BAD_REM_BY_1,DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION,INT_VACUOUS_COMPARISON,BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS,DMI_RANDOM_USED_ONLY_ONCE,DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT,DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.NumberConstructor"
+            speed="fast"
+            disabled="false"
+            reports="DM_NUMBER_CTOR,DM_FP_NUMBER_CTOR" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindSqlInjection" 
+            speed="moderate"
+            reports="SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE,SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" 
+	    	disabled="false"
+		/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindDoubleCheck" 
+            speed="fast"
+            disabled="true"
+            reports="DC_DOUBLECHECK" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindFinalizeInvocations" 
+            speed="fast"
+            reports="FI_PUBLIC_SHOULD_BE_PROTECTED,FI_EMPTY,FI_NULLIFY_SUPER,FI_USELESS,FI_MISSING_SUPER_CALL,FI_EXPLICIT_INVOCATION" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindHEmismatch" 
+            speed="fast"
+            reports="EQ_DONT_DEFINE_EQUALS_FOR_ENUM,EQ_SELF_USE_OBJECT,EQ_SELF_NO_OBJECT,CO_SELF_NO_OBJECT,HE_HASHCODE_USE_OBJECT_EQUALS,HE_HASHCODE_NO_EQUALS,HE_EQUALS_USE_HASHCODE,HE_EQUALS_NO_HASHCODE,HE_INHERITS_EQUALS_USE_HASHCODE,CO_ABSTRACT_SELF,EQ_ABSTRACT_SELF,HE_USE_OF_UNHASHABLE_CLASS,EQ_COMPARETO_USE_OBJECT_EQUALS,EQ_DOESNT_OVERRIDE_EQUALS,EQ_OTHER_USE_OBJECT,EQ_OTHER_NO_OBJECT" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.OverridingEqualsNotSymmetrical" 
+            speed="fast"
+            disabled="true"
+            reports="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC,EQ_ALWAYS_TRUE,EQ_ALWAYS_FALSE,EQ_COMPARING_CLASS_NAMES,EQ_UNUSUAL,EQ_GETCLASS_AND_CLASS_CONSTANT"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindNakedNotify" 
+            speed="fast"
+            disabled="true"
+            reports="NN_NAKED_NOTIFY" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindReturnRef" 
+            speed="fast"
+            disabled="true"
+            reports="MS_EXPOSE_REP,EI_EXPOSE_REP,EI_EXPOSE_REP2,EI_EXPOSE_STATIC_REP2" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindRunInvocations" 
+            speed="fast"
+            reports="RU_INVOKE_RUN" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.SwitchFallthrough" 
+            speed="fast"
+            reports="SF_SWITCH_FALLTHROUGH,SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindSpinLoop" 
+            speed="fast"
+            reports="SP_SPIN_ON_FIELD" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindNonShortCircuit" 
+            speed="fast"
+            reports="NS_NON_SHORT_CIRCUIT,NS_DANGEROUS_NON_SHORT_CIRCUIT" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindTwoLockWait" 
+            speed="slow"
+            reports="TLW_TWO_LOCK_WAIT" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindUnconditionalWait" 
+            speed="fast" reports="UW_UNCOND_WAIT" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindUninitializedGet" 
+            speed="fast"
+            reports="UR_UNINIT_READ" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.DontUseEnum"
+            speed="fast"
+            reports="NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER,NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindUnsyncGet" 
+            speed="fast"
+            reports="UG_SYNC_SET_UNSYNC_GET" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.InitializationChain" 
+            speed="fast"
+            reports="SI_INSTANCE_BEFORE_FINALS_ASSIGNED,IC_INIT_CIRCULARITY" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.IteratorIdioms" 
+            speed="fast"
+            reports="IT_NO_SUCH_ELEMENT" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.LockedFields" 
+            speed="fast" 
+            disabled="true"
+			hidden="true"
+            reports="IS_INCONSISTENT_SYNC" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.PreferZeroLengthArrays" 
+            speed="fast"
+            disabled="true"
+            reports="PZLA_PREFER_ZERO_LENGTH_ARRAYS" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.EqStringTest" 
+            speed="fast" 
+            disabled="true"
+			hidden="true"
+            reports="ES_COMPARING_STRINGS_WITH_EQ" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.SynchronizingOnContentsOfFieldToProtectField" 
+            speed="fast"
+            disabled="true"
+            reports="ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.MutableLock" 
+            speed="fast"
+            reports="ML_SYNC_ON_UPDATED_FIELD" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.MutableStaticFields" 
+            speed="fast"
+            reports="MS_OOI_PKGPROTECT,MS_FINAL_PKGPROTECT,MS_SHOULD_BE_FINAL,MS_PKGPROTECT,MS_MUTABLE_HASHTABLE,MS_MUTABLE_ARRAY,MS_CANNOT_BE_FINAL" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.Naming" 
+            speed="fast"
+            reports="NM_WRONG_PACKAGE,NM_WRONG_PACKAGE_INTENTIONAL,NM_VERY_CONFUSING,NM_VERY_CONFUSING_INTENTIONAL,NM_CONFUSING,NM_METHOD_CONSTRUCTOR_CONFUSION,NM_LCASE_HASHCODE,NM_LCASE_TOSTRING,NM_BAD_EQUAL,NM_CLASS_NAMING_CONVENTION,NM_FIELD_NAMING_CONVENTION,NM_METHOD_NAMING_CONVENTION,NM_CLASS_NOT_EXCEPTION,NM_SAME_SIMPLE_NAME_AS_SUPERCLASS,NM_SAME_SIMPLE_NAME_AS_INTERFACE" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.ReadReturnShouldBeChecked" 
+            speed="fast"
+            reports="RR_NOT_CHECKED,SR_NOT_CHECKED" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.SerializableIdiom" 
+            speed="fast"
+            reports="SE_NO_SERIALVERSIONID,SE_METHOD_MUST_BE_PRIVATE,WS_WRITEOBJECT_SYNC,RS_READOBJECT_SYNC,SE_INNER_CLASS,SE_BAD_FIELD,SE_BAD_FIELD_STORE,SE_NONLONG_SERIALVERSIONID,SE_NONSTATIC_SERIALVERSIONID,SE_NONFINAL_SERIALVERSIONID,SE_NO_SUITABLE_CONSTRUCTOR,SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION,SE_READ_RESOLVE_MUST_RETURN_OBJECT,SE_TRANSIENT_FIELD_NOT_RESTORED,SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS,SE_BAD_FIELD_INNER_CLASS,SE_READ_RESOLVE_IS_STATIC,SE_PRIVATE_READ_RESOLVE_NOT_INHERITED" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.StartInConstructor" 
+            speed="fast"
+            reports="SC_START_IN_CTOR" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindBadForLoop" 
+            speed="fast"
+            reports="QF_QUESTIONABLE_FOR_LOOP"
+		/>
+  <Detector class="edu.umd.cs.findbugs.detect.UnreadFields" 
+            speed="fast"
+            disabled="true"
+            reports="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD,NP_UNWRITTEN_FIELD,UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR,UWF_NULL_FIELD,UWF_UNWRITTEN_FIELD,SS_SHOULD_BE_STATIC,UUF_UNUSED_FIELD,URF_UNREAD_FIELD,SIC_INNER_SHOULD_BE_STATIC,SIC_INNER_SHOULD_BE_STATIC_ANON,SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.WaitInLoop" 
+            speed="fast"
+            reports="WA_NOT_IN_LOOP,WA_AWAIT_NOT_IN_LOOP,NO_NOTIFY_NOT_NOTIFYALL" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.BCPMethodReturnCheck" 
+            speed="slow"
+            reports="RV_RETURN_VALUE_IGNORED2"
+            disabled="true"
+            hidden="true"
+		 />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindNullDeref" 
+            speed="slow"
+            reports="NP_DEREFERENCE_OF_READLINE_VALUE,NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE,NP_TOSTRING_COULD_RETURN_NULL,NP_CLONE_COULD_RETURN_NULL,NP_ALWAYS_NULL_EXCEPTION,NP_ALWAYS_NULL,NP_STORE_INTO_NONNULL_FIELD,NP_NULL_ON_SOME_PATH_EXCEPTION,NP_NULL_ON_SOME_PATH,NP_NULL_PARAM_DEREF_NONVIRTUAL,NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS,NP_NULL_PARAM_DEREF,RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE,RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE,RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE,RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES,RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE,NP_NONNULL_PARAM_VIOLATION,NP_NONNULL_RETURN_VIOLATION,NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE,NP_GUARANTEED_DEREF,NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH,NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT,NP_ARGUMENT_MIGHT_BE_NULL" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindNullDerefsInvolvingNonShortCircuitEvaluation" 
+            speed="slow"
+            disabled="true"
+            reports="NP_NULL_ON_SOME_PATH,NP_GUARANTEED_DEREF"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindOpenStream" 
+            speed="slow"
+            reports="OS_OPEN_STREAM,OS_OPEN_STREAM_EXCEPTION_PATH,ODR_OPEN_DATABASE_RESOURCE,ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindUselessControlFlow" 
+            speed="fast"
+            reports="UCF_USELESS_CONTROL_FLOW,UCF_USELESS_CONTROL_FLOW_NEXT_LINE" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindUnreleasedLock" 
+            speed="moderate"
+            requirejre="1.5"
+            reports="UL_UNRELEASED_LOCK,UL_UNRELEASED_LOCK_EXCEPTION_PATH" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindRefComparison" 
+            speed="slow"
+            reports="ES_COMPARING_STRINGS_WITH_EQ,ES_COMPARING_PARAMETER_STRING_WITH_EQ,RC_REF_COMPARISON,EC_UNRELATED_TYPES,EC_NULL_ARG,EC_UNRELATED_CLASS_AND_INTERFACE,EC_UNRELATED_INTERFACES,EC_ARRAY_AND_NONARRAY,EC_BAD_ARRAY_COMPARE,EC_UNRELATED_TYPES_USING_POINTER_EQUALITY" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindMismatchedWaitOrNotify" 
+            speed="moderate"
+            disabled="true"
+            reports="MWN_MISMATCHED_WAIT,MWN_MISMATCHED_NOTIFY" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindEmptySynchronizedBlock" 
+            speed="fast"
+            reports="ESync_EMPTY_SYNC" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindInconsistentSync2" 
+            speed="slow"
+            disabled="true"
+            reports="IS2_INCONSISTENT_SYNC,IS_FIELD_NOT_GUARDED,MSF_MUTABLE_SERVLET_FIELD" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindLocalSelfAssignment2" 
+            speed="fast" 
+            reports="SA_LOCAL_SELF_ASSIGNMENT" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.IncompatMask" 
+            speed="fast"
+            reports="BIT_AND,BIT_AND_ZZ,BIT_IOR,BIT_SIGNED_CHECK,BIT_SIGNED_CHECK_HIGH_BIT" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.LazyInit" 
+            speed="moderate"
+            reports="LI_LAZY_INIT_STATIC,LI_LAZY_INIT_UPDATE_STATIC" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindJSR166LockMonitorenter" 
+            speed="moderate"
+            disabled="true" 
+            requirejre="1.5"
+            reports="JLM_JSR166_LOCK_MONITORENTER" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindUncalledPrivateMethods" 
+            speed="fast"
+            reports="UPM_UNCALLED_PRIVATE_METHOD" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.UncallableMethodOfAnonymousClass" 
+            speed="fast"
+            reports="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.StringConcatenation" 
+            speed="fast"
+            reports="SBSC_USE_STRINGBUFFER_CONCATENATION" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.InefficientToArray" 
+            speed="fast"
+            reports="ITA_INEFFICIENT_TO_ARRAY" />
+            
+   <Detector class="edu.umd.cs.findbugs.detect.InvalidJUnitTest" 
+             speed="fast"
+             disabled="true"
+             reports="IJU_SETUP_NO_SUPER,IJU_TEARDOWN_NO_SUPER,IJU_SUITE_NOT_STATIC,IJU_NO_TESTS,IJU_BAD_SUITE_METHOD" />
+             
+   <Detector class="edu.umd.cs.findbugs.detect.BadlyOverriddenAdapter" 
+             speed="fast"
+             disabled="true"
+             reports="BOA_BADLY_OVERRIDDEN_ADAPTER" />
+             
+   <Detector class="edu.umd.cs.findbugs.detect.BadResultSetAccess" 
+             speed="fast"
+   	         reports="SQL_BAD_RESULTSET_ACCESS,SQL_BAD_PREPARED_STATEMENT_ACCESS" />
+   	         
+   <Detector class="edu.umd.cs.findbugs.detect.SuperfluousInstanceOf" 
+             speed="fast"
+             disabled="true"
+   	         reports="SIO_SUPERFLUOUS_INSTANCEOF" />  
+   	         
+   <Detector class="edu.umd.cs.findbugs.detect.BadAppletConstructor" 
+             speed="fast"
+             reports="BAC_BAD_APPLET_CONSTRUCTOR" 
+             disabled="true" /> 
+             
+   <Detector class="edu.umd.cs.findbugs.detect.UseObjectEquals" 
+             speed="fast"
+             reports="UOE_USE_OBJECT_EQUALS"
+             disabled="true" />
+             
+   <Detector class="edu.umd.cs.findbugs.detect.SuspiciousThreadInterrupted" 
+             speed="fast"
+             reports="STI_INTERRUPTED_ON_CURRENTTHREAD,STI_INTERRUPTED_ON_UNKNOWNTHREAD" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindDeadLocalStores"
+            speed="moderate"
+            disabled="true"
+            reports="DLS_DEAD_LOCAL_STORE,IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN,DLS_DEAD_LOCAL_STORE_OF_NULL,DLS_DEAD_STORE_OF_CLASS_LITERAL" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.FindMaskedFields"
+            speed="fast"
+            reports="MF_METHOD_MASKS_FIELD,MF_CLASS_MASKS_FIELD" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.WrongMapIterator" 
+            speed="fast"
+            reports="WMI_WRONG_MAP_ITERATOR" />
+            
+  <Detector class="edu.umd.cs.findbugs.detect.InstantiateStaticClass"
+  			speed="fast"
+  			reports="ISC_INSTANTIATE_STATIC_CLASS" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.RuntimeExceptionCapture"
+            reports="REC_CATCH_EXCEPTION"
+            disabled="true"
+            speed="fast" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindFloatEquality" 
+            speed="fast"
+            reports="FE_FLOATING_POINT_EQUALITY,FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindUnsatisfiedObligation"
+            speed="slow"
+            disabled="true"
+            reports="OBL_UNSATISFIED_OBLIGATION"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.UnnecessaryMath" 
+  			speed="fast"
+			reports="UM_UNNECESSARY_MATH"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindCircularDependencies" 
+  			speed="moderate"
+			disabled="true"
+			reports="CD_CIRCULAR_DEPENDENCY"/>
+			
+  <Detector class="edu.umd.cs.findbugs.detect.RedundantInterfaces"
+  			speed="fast"
+  			reports="RI_REDUNDANT_INTERFACES"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.MultithreadedInstanceAccess"
+  			speed="fast"
+  			disabled="true"
+  			reports="MTIA_SUSPECT_STRUTS_INSTANCE_FIELD,MTIA_SUSPECT_SERVLET_INSTANCE_FIELD"/>
+  			
+  <Detector class="edu.umd.cs.findbugs.detect.PublicSemaphores"
+  			speed="fast"
+			disabled="true"
+  			reports="PS_PUBLIC_SEMAPHORES"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.BadUseOfReturnValue"
+            speed="fast"
+            reports="RV_CHECK_FOR_POSITIVE_INDEXOF,RV_DONT_JUST_NULL_CHECK_READLINE" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.MethodReturnCheck"
+            speed="fast"
+            reports="RV_RETURN_VALUE_IGNORED,RV_RETURN_VALUE_IGNORED_BAD_PRACTICE,RV_EXCEPTION_NOT_THROWN"
+		/>
+  
+  <Detector class="edu.umd.cs.findbugs.detect.IDivResultCastToDouble"
+            speed="fast"
+            reports="ICAST_IDIV_CAST_TO_DOUBLE,ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL,ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND" />
+  			
+  <Detector class="edu.umd.cs.findbugs.detect.FindBadCast"
+            speed="fast"
+            disabled="true"
+            hidden="true"
+            reports="BC_BAD_CAST_TO_CONCRETE_COLLECTION,BC_BAD_CAST_TO_ABSTRACT_COLLECTION,BC_UNCONFIRMED_CAST,BC_IMPOSSIBLE_CAST,BC_IMPOSSIBLE_INSTANCEOF"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.FindBadCast2"
+            speed="fast"
+            disabled="true"
+            reports="BC_BAD_CAST_TO_CONCRETE_COLLECTION,BC_BAD_CAST_TO_ABSTRACT_COLLECTION,BC_UNCONFIRMED_CAST,BC_IMPOSSIBLE_CAST,BC_IMPOSSIBLE_INSTANCEOF,BC_VACUOUS_INSTANCEOF,NP_NULL_INSTANCEOF"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.FindNonSerializableStoreIntoSession"
+            speed="fast"
+            reports="J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.FindNonSerializableValuePassedToWriteObject"
+            speed="fast"
+            reports="DMI_NONSERIALIZABLE_OBJECT_WRITTEN"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.BadSyntaxForRegularExpression"
+            speed="fast"
+            reports="RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION,RE_POSSIBLE_UNINTENDED_PATTERN,RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.VarArgsProblems"
+            speed="fast"
+            disabled="true"
+            reports="VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG"
+	    />
+  <Detector class="edu.umd.cs.findbugs.detect.FindPuzzlers"
+            speed="fast"
+            reports="DLS_DEAD_LOCAL_STORE_IN_RETURN,EC_BAD_ARRAY_COMPARE,DLS_OVERWRITTEN_INCREMENT,ICAST_BAD_SHIFT_AMOUNT,ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT,DMI_BAD_MONTH,IM_MULTIPLYING_RESULT_OF_IREM,IM_BAD_CHECK_FOR_ODD,DMI_INVOKING_TOSTRING_ON_ARRAY,DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY,IM_AVERAGE_COMPUTATION_COULD_OVERFLOW,IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION,ICAST_INTEGER_MULTIPLY_CAST_TO_LONG,BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR,BX_BOXING_IMMEDIATELY_UNBOXED,BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION,IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD"
+	    />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindSleepWithLockHeld"
+		speed="slow"
+		reports="SWL_SLEEP_WITH_LOCK_HELD"
+	 />
+	 
+  <Detector class="edu.umd.cs.findbugs.detect.InefficientMemberAccess"
+  		speed="fast" 
+  		disabled="true" 
+  		reports="IMA_INEFFICIENT_MEMBER_ACCESS"
+  	 />
+  			
+  <Detector class="edu.umd.cs.findbugs.detect.DuplicateBranches"
+  			speed="fast"
+  			reports="DB_DUPLICATE_BRANCHES,DB_DUPLICATE_SWITCH_CLAUSES"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.XMLFactoryBypass"
+  			speed="fast"
+  			reports="XFB_XML_FACTORY_BYPASS"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindBadEqualsImplementation"
+            speed="slow"
+            disabled="true"
+            hidden="true"
+            reports="NP_DOES_NOT_HANDLE_NULL"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.UselessSubclassMethod"
+  			speed="fast"
+  			disabled="true"
+  			reports="USM_USELESS_SUBCLASS_METHOD,USM_USELESS_ABSTRACT_METHOD"/>
+  			
+  <Detector class="edu.umd.cs.findbugs.detect.ConfusedInheritance"
+  			speed="fast"
+  			reports="CI_CONFUSED_INHERITANCE"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.QuestionableBooleanAssignment"
+  			speed="fast"
+  			reports="QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT"/>
+
+
+  <Detector class="edu.umd.cs.findbugs.detect.TrainUnconditionalDerefParams"
+            hidden="true" speed="slow" reports=""/>
+			
+  <Detector class="edu.umd.cs.findbugs.detect.TrainFieldStoreTypes"
+	        hidden="true" speed="slow" reports=""/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.TrainNonNullAnnotations"
+            hidden="true" speed="fast" reports=""/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.CheckCalls"
+	        speed="fast" reports="" disabled="true" hidden="true"/>
+	        
+  <Detector class="edu.umd.cs.findbugs.detect.FindBugsSummaryStats" 
+            speed="fast"
+            hidden="true" />
+  <Detector class="edu.umd.cs.findbugs.detect.AppendingToAnObjectOutputStream" 
+            speed="fast"
+            disabled="true"
+            reports="IO_APPENDING_TO_OBJECT_OUTPUT_STREAM" />
+  <Detector class="edu.umd.cs.findbugs.detect.TestASM" speed="fast" disabled="true" hidden="true" reports="TESTING" />
+
+  <Detector class="edu.umd.cs.findbugs.detect.FindUnrelatedTypesInGenericContainer" 
+            speed="fast"
+            reports="GC_UNRELATED_TYPES" />
+
+       <Detector class="edu.umd.cs.findbugs.detect.StaticCalendarDetector" speed="fast"  reports="STCAL_STATIC_CALENDAR_INSTANCE,STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE,STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE,STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.TestDataflowAnalysis"
+	speed="slow" reports="" disabled="true" hidden="true"/>
+	
+  <Detector class="edu.umd.cs.findbugs.detect.CheckTypeQualifiers"
+    speed="slow" disabled="true" reports="TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED,TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED,TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK,TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK,TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK,TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.CrossSiteScripting"
+      disabled="true" reports="HRS_REQUEST_PARAMETER_TO_HTTP_HEADER,HRS_REQUEST_PARAMETER_TO_COOKIE,XSS_REQUEST_PARAMETER_TO_JSP_WRITER,XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER,XSS_REQUEST_PARAMETER_TO_SEND_ERROR"/>
+
+  <Detector class="edu.umd.cs.findbugs.detect.CheckExpectedWarnings" disabled="true" hidden="true"/>
+
+<!-- Bug Codes -->
+
+
+ <BugCode abbrev="DMI" cweid="440"/>
+ <BugCode abbrev="CN" cweid="580"/>
+ <BugCode abbrev="DLS" cweid="563"/>
+ <BugCode abbrev="RV" cweid="440"/>
+ <BugCode abbrev="IS" cweid="366"/>
+ <BugCode abbrev="NP" cweid="476"/>
+ <BugCode abbrev="RCN" cweid="476"/>
+ <BugCode abbrev="EQ" cweid="595"/>
+ <BugCode abbrev="ES" cweid="597"/>
+ <BugCode abbrev="FI" cweid="586"/>
+ <BugCode abbrev="AM" cweid="227"/>
+ <BugCode abbrev="J2EE" cweid="4"/>
+ <BugCode abbrev="RE" cweid="185"/>
+ <BugCode abbrev="MS" cweid="218"/>
+ <BugCode abbrev="DE" cweid="391"/>
+ <BugCode abbrev="XSS" cweid="79"/>
+ <BugCode abbrev="HRS" cweid="113"/>
+ <BugCode abbrev="STCAL" cweid="366"/>
+ <BugCode abbrev="ICAST" cweid="192"/>
+          
+          
+ 
+ <!-- Bug patterns -->
+ 
+ 
+       <BugPattern abbrev="XSS" type="XSS_REQUEST_PARAMETER_TO_SEND_ERROR" category="SECURITY" />
+       <BugPattern abbrev="SKIPPED" type="SKIPPED_CLASS_TOO_BIG" category="STYLE" />
+       <BugPattern abbrev="XSS" type="XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER" category="SECURITY" />
+       <BugPattern abbrev="XSS" type="XSS_REQUEST_PARAMETER_TO_JSP_WRITER" category="SECURITY" />
+       <BugPattern abbrev="HRS" type="HRS_REQUEST_PARAMETER_TO_HTTP_HEADER" category="SECURITY" />
+       <BugPattern abbrev="HRS" type="HRS_REQUEST_PARAMETER_TO_COOKIE" category="SECURITY" />
+    
+       <BugPattern abbrev="STCAL" type="STCAL_STATIC_CALENDAR_INSTANCE" category="MT_CORRECTNESS" />
+       <BugPattern abbrev="STCAL" type="STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE" category="MT_CORRECTNESS" />
+       <BugPattern abbrev="STCAL" type="STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE" category="MT_CORRECTNESS" />
+       <BugPattern abbrev="STCAL" type="STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE" category="MT_CORRECTNESS" />
+ 
+	<BugPattern abbrev="NP" type="NP_SYNC_AND_NULL_CHECK_FIELD" category="MT_CORRECTNESS" cweid="585"/>
+   <BugPattern abbrev="NP" type="NP_BOOLEAN_RETURN_NULL" category="BAD_PRACTICE" />
+  
+  <BugPattern abbrev="VR" type="VR_UNRESOLVABLE_REFERENCE" category="CORRECTNESS"
+    experimental="true"/>
+
+  <BugPattern abbrev="SW" type="SW_SWING_METHODS_INVOKED_IN_SWING_THREAD" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="IL" type="IL_INFINITE_LOOP" category="CORRECTNESS" />
+  <BugPattern abbrev="IO" type="IO_APPENDING_TO_OBJECT_OUTPUT_STREAM" category="CORRECTNESS" />
+  <BugPattern abbrev="IL" type="IL_INFINITE_RECURSIVE_LOOP" category="CORRECTNESS" cweid="674" />
+  <BugPattern abbrev="FI" type="FI_FINALIZER_ONLY_NULLS_FIELDS" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="FI" type="FI_FINALIZER_NULLS_FIELDS" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="IL" type="IL_CONTAINER_ADDED_TO_ITSELF" category="CORRECTNESS"/>
+  <BugPattern abbrev="VO" type="VO_VOLATILE_REFERENCE_TO_ARRAY" category="MT_CORRECTNESS"/>
+  <BugPattern abbrev="UI" type="UI_INHERITANCE_UNSAFE_GETRESOURCE" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="HSC" type="HSC_HUGE_SHARED_STRING_CONSTANT" category="PERFORMANCE" />
+  <BugPattern abbrev="RpC" type="RpC_REPEATED_CONDITIONAL_TEST" category="CORRECTNESS" />
+  <BugPattern abbrev="TEST" type="UNKNOWN" category="CORRECTNESS" />
+  <BugPattern abbrev="AM" type="AM_CREATES_EMPTY_ZIP_FILE_ENTRY" category="BAD_PRACTICE" />
+
+  <BugPattern abbrev="AM" type="AM_CREATES_EMPTY_JAR_FILE_ENTRY" category="BAD_PRACTICE" />
+
+  <BugPattern abbrev="DP" type="DP_DO_INSIDE_DO_PRIVILEGED" category="BAD_PRACTICE" />
+  <BugPattern abbrev="DP" type="DP_DO_INSIDE_DO_PRIVILEDGED" category="BAD_PRACTICE" 
+         experimental="true" />  <!-- deprecated in favor of DP_DO_INSIDE_DO_PRIVILEGED (no D before G) -->
+  <BugPattern abbrev="DP" type="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED" category="BAD_PRACTICE" />
+  <BugPattern abbrev="DP" type="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEDGED" category="BAD_PRACTICE"
+         experimental="true" />  <!-- deprecated in favor of DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED (no D before G) -->
+  
+  <BugPattern abbrev="IMSE" type="IMSE_DONT_CATCH_IMSE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="FL" type="FL_MATH_USING_FLOAT_PRECISION" category="CORRECTNESS" />
+  <BugPattern abbrev="CN" type="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="CN" type="CN_IDIOM" category="BAD_PRACTICE" />
+  <BugPattern abbrev="CN" type="CN_IDIOM_NO_SUPER_CALL" category="BAD_PRACTICE" />
+  <BugPattern abbrev="DE" type="DE_MIGHT_DROP" category="BAD_PRACTICE" />
+  <BugPattern abbrev="DE" type="DE_MIGHT_IGNORE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Dm" type="DM_EXIT" category="BAD_PRACTICE" cweid="382"/>
+  <BugPattern abbrev="Nm" type="NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER" category="BAD_PRACTICE" />
+  <BugPattern abbrev="JCIP" type="JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS" category="CORRECTNESS" />
+  <BugPattern abbrev="Dm" type="DMI_CONSTANT_DB_PASSWORD" category="SECURITY" cweid="259"/>
+  <BugPattern abbrev="Dm" type="DMI_EMPTY_DB_PASSWORD" category="SECURITY" cweid="259"/>
+  <BugPattern abbrev="Dm" type="DMI_UNSUPPORTED_METHOD" category="STYLE" />
+  <BugPattern abbrev="Dm" type="DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED" category="STYLE" />
+  <BugPattern abbrev="Dm" type="DMI_BLOCKING_METHODS_ON_URL" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DMI_COLLECTION_OF_URLS" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION" category="CORRECTNESS" />
+  <BugPattern abbrev="Dm" type="DM_RUN_FINALIZERS_ON_EXIT" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Dm" type="DM_STRING_CTOR" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DM_STRING_VOID_CTOR" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DM_STRING_TOSTRING" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DM_GC" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DM_BOOLEAN_CTOR" category="PERFORMANCE" />
+  <BugPattern abbrev="Bx" type="DM_NUMBER_CTOR" category="PERFORMANCE" />
+  <BugPattern abbrev="Bx" type="DM_FP_NUMBER_CTOR" category="PERFORMANCE" />  
+  <BugPattern abbrev="Dm" type="DM_STRING_EMPTY_EQUALS" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DM_CONVERT_CASE" category="I18N" />
+  <BugPattern abbrev="Bx" type="DM_BOXED_PRIMITIVE_TOSTRING" category="PERFORMANCE" />
+  <BugPattern abbrev="Bx" type="BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR" category="CORRECTNESS" />
+  <BugPattern abbrev="Bx" type="BX_BOXING_IMMEDIATELY_UNBOXED" category="PERFORMANCE" />
+  <BugPattern abbrev="Bx" type="BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION" category="PERFORMANCE" cweid="192" />
+  <BugPattern abbrev="Dm" type="DM_NEW_FOR_GETCLASS" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DM_MONITOR_WAIT_ON_CONDITION" category="MT_CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="NP_ARGUMENT_MIGHT_BE_NULL" category="CORRECTNESS" />
+  <BugPattern abbrev="NP" type="NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT" category="BAD_PRACTICE" />
+  <BugPattern abbrev="NP" type="NP_DEREFERENCE_OF_READLINE_VALUE" category="STYLE" />
+  <BugPattern abbrev="NP" type="NP_IMMEDIATE_DEREFERENCE_OF_READLINE" category="STYLE" />
+  <BugPattern abbrev="RV" type="RV_ABSOLUTE_VALUE_OF_RANDOM_INT" category="CORRECTNESS" />
+  <BugPattern abbrev="RV" type="RV_ABSOLUTE_VALUE_OF_HASHCODE" category="CORRECTNESS" />
+  <BugPattern abbrev="RV" type="RV_REM_OF_RANDOM_INT" category="STYLE" />
+  <BugPattern abbrev="RV" type="RV_REM_OF_HASHCODE" category="STYLE" />
+  <BugPattern abbrev="RV" type="RV_01_TO_INT" category="CORRECTNESS" />
+  <BugPattern abbrev="Dm" type="DM_NEXTINT_VIA_NEXTDOUBLE" category="PERFORMANCE" />
+  <BugPattern abbrev="Dm" type="DM_USELESS_THREAD" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="SQL" type="SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE" category="SECURITY" cweid="89" />
+  <BugPattern abbrev="SQL" type="SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" category="SECURITY" cweid="89"/>
+  <BugPattern abbrev="DC" type="DC_DOUBLECHECK" category="MT_CORRECTNESS"  cweid="609" />
+  <BugPattern abbrev="FI" type="FI_PUBLIC_SHOULD_BE_PROTECTED" category="MALICIOUS_CODE" cweid="583"/>
+  <BugPattern abbrev="FI" type="FI_EMPTY" category="BAD_PRACTICE" />
+  <BugPattern abbrev="FI" type="FI_NULLIFY_SUPER" category="BAD_PRACTICE" />
+  <BugPattern abbrev="FI" type="FI_USELESS" category="BAD_PRACTICE" />
+  <BugPattern abbrev="FI" type="FI_MISSING_SUPER_CALL" category="BAD_PRACTICE" />
+  <BugPattern abbrev="FI" type="FI_EXPLICIT_INVOCATION" category="BAD_PRACTICE" cweid="586" />
+  <BugPattern abbrev="Eq" type="EQ_COMPARING_CLASS_NAMES" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_UNUSUAL" category="STYLE" />
+  <BugPattern abbrev="Eq" type="EQ_GETCLASS_AND_CLASS_CONSTANT" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_ALWAYS_TRUE" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_ALWAYS_FALSE" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_DOESNT_OVERRIDE_EQUALS" category="STYLE" />
+  <BugPattern abbrev="Eq" type="EQ_DONT_DEFINE_EQUALS_FOR_ENUM" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_SELF_USE_OBJECT" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_OTHER_USE_OBJECT" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_OTHER_NO_OBJECT" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_SELF_NO_OBJECT" category="BAD_PRACTICE" />
+  <BugPattern abbrev="NP" type="NP_DOES_NOT_HANDLE_NULL" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="Co" type="CO_SELF_NO_OBJECT" category="BAD_PRACTICE" />
+  <BugPattern abbrev="ES" type="ES_COMPARING_STRINGS_WITH_EQ" category="BAD_PRACTICE" />
+  <BugPattern abbrev="ES" type="ES_COMPARING_PARAMETER_STRING_WITH_EQ" category="BAD_PRACTICE" />
+  <BugPattern abbrev="HE" type="HE_USE_OF_UNHASHABLE_CLASS" category="CORRECTNESS" />
+  <BugPattern abbrev="Eq" type="EQ_COMPARETO_USE_OBJECT_EQUALS" category="BAD_PRACTICE" />
+  <BugPattern abbrev="HE" type="HE_HASHCODE_USE_OBJECT_EQUALS" category="BAD_PRACTICE" />
+  <BugPattern abbrev="HE" type="HE_HASHCODE_NO_EQUALS" category="BAD_PRACTICE" />
+  <BugPattern abbrev="HE" type="HE_EQUALS_USE_HASHCODE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="HE" type="HE_INHERITS_EQUALS_USE_HASHCODE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="HE" type="HE_EQUALS_NO_HASHCODE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Eq" type="EQ_ABSTRACT_SELF" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Co" type="CO_ABSTRACT_SELF" category="BAD_PRACTICE" />
+  <BugPattern abbrev="DL" type="DL_SYNCHRONIZATION_ON_SHARED_CONSTANT" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="DL" type="DL_SYNCHRONIZATION_ON_BOOLEAN" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="DL" type="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="DL" type="DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="WL" type="WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="ESync" type="ESync_EMPTY_SYNC" category="MT_CORRECTNESS" cweid="585" />
+  <BugPattern abbrev="MSF" type="MSF_MUTABLE_SERVLET_FIELD" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="IS" type="IS2_INCONSISTENT_SYNC" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="NN" type="NN_NAKED_NOTIFY" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="MS" type="MS_EXPOSE_REP" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="EI" type="EI_EXPOSE_REP" category="MALICIOUS_CODE" cweid="374" />
+  <BugPattern abbrev="EI2" type="EI_EXPOSE_REP2" category="MALICIOUS_CODE" cweid="374" />
+  <BugPattern abbrev="MS" type="EI_EXPOSE_STATIC_REP2" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="Ru" type="RU_INVOKE_RUN" category="MT_CORRECTNESS" cweid="572" />
+  <BugPattern abbrev="SP" type="SP_SPIN_ON_FIELD" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="NS" type="NS_NON_SHORT_CIRCUIT" category="STYLE" />
+  <BugPattern abbrev="NS" type="NS_DANGEROUS_NON_SHORT_CIRCUIT" category="STYLE" />
+  <BugPattern abbrev="TLW" type="TLW_TWO_LOCK_WAIT" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="TLW" type="TLW_TWO_LOCK_NOTIFY" category="MT_CORRECTNESS"
+         experimental="true" />  <!-- has never been generated -->
+  <BugPattern abbrev="UW" type="UW_UNCOND_WAIT" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="UR" type="UR_UNINIT_READ" category="CORRECTNESS" />
+  <BugPattern abbrev="UG" type="UG_SYNC_SET_UNSYNC_GET" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="IC" type="IC_INIT_CIRCULARITY" category="STYLE" />
+  <BugPattern abbrev="IC" type="IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION" category="BAD_PRACTICE" />
+  <BugPattern abbrev="SI" type="SI_INSTANCE_BEFORE_FINALS_ASSIGNED" category="BAD_PRACTICE" />
+  <BugPattern abbrev="It" type="IT_NO_SUCH_ELEMENT" category="BAD_PRACTICE" />
+  <BugPattern abbrev="IS" type="IS_INCONSISTENT_SYNC" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="IS" type="IS_FIELD_NOT_GUARDED" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="ML" type="ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="ML" type="ML_SYNC_ON_UPDATED_FIELD" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="MS" type="MS_OOI_PKGPROTECT" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="MS" type="MS_FINAL_PKGPROTECT" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="MS" type="MS_SHOULD_BE_FINAL" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="MS" type="MS_PKGPROTECT" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="MS" type="MS_MUTABLE_HASHTABLE" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="MS" type="MS_MUTABLE_ARRAY" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="MS" type="MS_CANNOT_BE_FINAL" category="MALICIOUS_CODE" />
+  <BugPattern abbrev="Nm" type="NM_METHOD_NAMING_CONVENTION" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_FIELD_NAMING_CONVENTION" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_SAME_SIMPLE_NAME_AS_INTERFACE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_CLASS_NAMING_CONVENTION" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_VERY_CONFUSING" category="CORRECTNESS" />
+  <BugPattern abbrev="Nm" type="NM_VERY_CONFUSING_INTENTIONAL" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_WRONG_PACKAGE" category="CORRECTNESS" />
+  <BugPattern abbrev="Nm" type="NM_WRONG_PACKAGE_INTENTIONAL" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_CONFUSING" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Nm" type="NM_METHOD_CONSTRUCTOR_CONFUSION" category="CORRECTNESS" />
+  <BugPattern abbrev="Nm" type="NM_LCASE_HASHCODE" category="CORRECTNESS" />
+  <BugPattern abbrev="Nm" type="NM_LCASE_TOSTRING" category="CORRECTNESS" />
+  <BugPattern abbrev="Nm" type="NM_BAD_EQUAL" category="CORRECTNESS"/>
+  <BugPattern abbrev="IA" type="IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD" category="STYLE"/>
+  <BugPattern abbrev="Nm" type="NM_CLASS_NOT_EXCEPTION" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="RR" type="RR_NOT_CHECKED" category="BAD_PRACTICE" />
+  <BugPattern abbrev="RR" type="SR_NOT_CHECKED" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_READ_RESOLVE_IS_STATIC" category="CORRECTNESS" />
+  <BugPattern abbrev="Se" type="SE_PRIVATE_READ_RESOLVE_NOT_INHERITED" category="STYLE" />
+  <BugPattern abbrev="Se" type="SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS" category="STYLE" />
+  <BugPattern abbrev="Se" type="SE_NO_SUITABLE_CONSTRUCTOR" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="SnVI" type="SE_NO_SERIALVERSIONID" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_READ_RESOLVE_MUST_RETURN_OBJECT" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_TRANSIENT_FIELD_NOT_RESTORED" category="BAD_PRACTICE" />
+  <BugPattern abbrev="WS" type="WS_WRITEOBJECT_SYNC" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="RS" type="RS_READOBJECT_SYNC" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="Se" type="SE_NONFINAL_SERIALVERSIONID" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_NONSTATIC_SERIALVERSIONID" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_NONLONG_SERIALVERSIONID" category="BAD_PRACTICE" />
+   <BugPattern abbrev="Se" type="SE_METHOD_MUST_BE_PRIVATE" category="CORRECTNESS" />
+  <BugPattern abbrev="Se" type="SE_BAD_FIELD" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_INNER_CLASS" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_BAD_FIELD_INNER_CLASS" category="BAD_PRACTICE" />
+  <BugPattern abbrev="Se" type="SE_BAD_FIELD_STORE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="SC" type="SC_START_IN_CTOR" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="SF" type="SF_SWITCH_FALLTHROUGH" category="STYLE" cweid="484" />
+  <BugPattern abbrev="SF" type="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH" category="CORRECTNESS" />
+  <BugPattern abbrev="SS" type="SS_SHOULD_BE_STATIC" category="PERFORMANCE" />
+  <BugPattern abbrev="UuF" type="UUF_UNUSED_FIELD" category="PERFORMANCE" />
+  <BugPattern abbrev="UrF" type="URF_UNREAD_FIELD" category="PERFORMANCE" />
+  <BugPattern abbrev="QF" type="QF_QUESTIONABLE_FOR_LOOP" category="STYLE" />
+  <BugPattern abbrev="NP" type="NP_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" category="STYLE"
+         experimental="true" />  <!-- deprecated in favor of UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR -->
+  <BugPattern abbrev="NP" type="NP_UNWRITTEN_FIELD" category="CORRECTNESS" />
+  <BugPattern abbrev="UwF" type="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" category="STYLE" />
+  <BugPattern abbrev="UwF" type="UWF_NULL_FIELD" category="CORRECTNESS" />
+  <BugPattern abbrev="UwF" type="UWF_UNWRITTEN_FIELD" category="CORRECTNESS" />
+  <BugPattern abbrev="SIC" type="SIC_INNER_SHOULD_BE_STATIC" category="PERFORMANCE" />
+  <BugPattern abbrev="SIC" type="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" category="PERFORMANCE" />
+  <BugPattern abbrev="SIC" type="SIC_INNER_SHOULD_BE_STATIC_ANON" category="PERFORMANCE" />
+  <BugPattern abbrev="Wa" type="WA_NOT_IN_LOOP" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="Wa" type="WA_AWAIT_NOT_IN_LOOP" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="No" type="NO_NOTIFY_NOT_NOTIFYALL" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="RV" type="RV_RETURN_VALUE_IGNORED" category="CORRECTNESS" />
+  <BugPattern abbrev="RV" type="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" 
+            category="BAD_PRACTICE" cweid="253"/>
+  <BugPattern abbrev="RV" type="RV_EXCEPTION_NOT_THROWN" category="CORRECTNESS" />
+  <BugPattern abbrev="RV" type="RV_RETURN_VALUE_IGNORED2" category="CORRECTNESS" />
+  <BugPattern abbrev="RV" type="RV_CHECK_FOR_POSITIVE_INDEXOF" category="STYLE" />
+  <BugPattern abbrev="RV" type="RV_DONT_JUST_NULL_CHECK_READLINE" category="STYLE" />
+  <BugPattern abbrev="NP" type="NP_ALWAYS_NULL" category="CORRECTNESS" />
+  <BugPattern abbrev="NP" type="NP_STORE_INTO_NONNULL_FIELD" category="CORRECTNESS" />
+  <BugPattern abbrev="NP" type="NP_ALWAYS_NULL_EXCEPTION" category="CORRECTNESS" />
+  <BugPattern abbrev="NP" type="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE" category="CORRECTNESS" />
+  <BugPattern abbrev="NP" type="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE" category="STYLE" />
+  <BugPattern abbrev="NP" type="NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE" category="STYLE" />
+  <BugPattern abbrev="NP" type="NP_NULL_ON_SOME_PATH" category="CORRECTNESS" />
+  <BugPattern abbrev="NP" type="NP_NULL_ON_SOME_PATH_EXCEPTION" category="CORRECTNESS" />
+  <BugPattern abbrev="NP" type="NP_NULL_PARAM_DEREF" category="CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="NP_NULL_PARAM_DEREF_NONVIRTUAL" category="CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS" category="CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="NP_NONNULL_PARAM_VIOLATION" category="CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="NP_NONNULL_RETURN_VIOLATION" category="CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="NP_TOSTRING_COULD_RETURN_NULL" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="NP" type="NP_CLONE_COULD_RETURN_NULL" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="NP" type="NP_LOAD_OF_KNOWN_NULL_VALUE" category="STYLE"/>
+  <BugPattern abbrev="NP" type="NP_GUARANTEED_DEREF" category="CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH" category="CORRECTNESS"/>
+  <BugPattern abbrev="OS" type="OS_OPEN_STREAM" category="BAD_PRACTICE" />
+  <BugPattern abbrev="OS" type="OS_OPEN_STREAM_EXCEPTION_PATH" category="BAD_PRACTICE" />
+  <BugPattern abbrev="PZLA" type="PZLA_PREFER_ZERO_LENGTH_ARRAYS" category="STYLE" />
+  <BugPattern abbrev="UCF" type="UCF_USELESS_CONTROL_FLOW" category="STYLE" />
+  <BugPattern abbrev="UCF" type="UCF_USELESS_CONTROL_FLOW_NEXT_LINE" category="CORRECTNESS" />
+  <BugPattern abbrev="RCN" type="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE" category="STYLE" />
+  <BugPattern abbrev="RCN" type="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE" category="CORRECTNESS" />
+  <BugPattern abbrev="RCN" type="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" category="STYLE" />
+  <BugPattern abbrev="RCN" type="RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES" category="STYLE" />
+  <BugPattern abbrev="RCN" type="RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE" category="STYLE" />
+  <BugPattern abbrev="UL" type="UL_UNRELEASED_LOCK" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="UL" type="UL_UNRELEASED_LOCK_EXCEPTION_PATH" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="RC" type="RC_REF_COMPARISON" category="BAD_PRACTICE" />
+  <BugPattern abbrev="VA" type="VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG" category="CORRECTNESS"/>
+  <BugPattern abbrev="VA" type="VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT" category="CORRECTNESS"/>
+  <BugPattern abbrev="VA" type="VA_FORMAT_STRING_ARG_MISMATCH" category="CORRECTNESS"/>
+  <BugPattern abbrev="VA" type="VA_FORMAT_STRING_BAD_ARGUMENT" category="CORRECTNESS"/>
+  <BugPattern abbrev="VA" type="VA_FORMAT_STRING_MISSING_ARGUMENT" category="CORRECTNESS"/>
+  <BugPattern abbrev="VA" type="VA_FORMAT_STRING_ILLEGAL" category="CORRECTNESS"/>
+  <BugPattern abbrev="VA" type="VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED" category="CORRECTNESS"/>
+  <BugPattern abbrev="EC" type="EC_UNRELATED_TYPES_USING_POINTER_EQUALITY" category="CORRECTNESS"/>
+  <BugPattern abbrev="EC" type="EC_UNRELATED_TYPES" category="CORRECTNESS"/>
+  <BugPattern abbrev="EC" type="EC_ARRAY_AND_NONARRAY" category="CORRECTNESS"/>
+  <BugPattern abbrev="EC" type="EC_NULL_ARG" category="CORRECTNESS"/>
+  <BugPattern abbrev="EC" type="EC_UNRELATED_INTERFACES" category="CORRECTNESS"/>
+  <BugPattern abbrev="EC" type="EC_UNRELATED_CLASS_AND_INTERFACE" category="CORRECTNESS"/>
+  <BugPattern abbrev="MWN" type="MWN_MISMATCHED_WAIT" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="MWN" type="MWN_MISMATCHED_NOTIFY" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="SA" type="SA_LOCAL_SELF_ASSIGNMENT" category="STYLE" />
+  <BugPattern abbrev="INT" type="INT_BAD_COMPARISON_WITH_SIGNED_BYTE"    category="CORRECTNESS" />
+  <BugPattern abbrev="INT" type="INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE"    category="CORRECTNESS" />
+  <BugPattern abbrev="INT" type="INT_BAD_REM_BY_1"    category="CORRECTNESS" />
+  <BugPattern abbrev="INT" type="INT_VACUOUS_COMPARISON"    category="STYLE" />
+  <BugPattern abbrev="BIT" type="BIT_IOR_OF_SIGNED_BYTE"    category="CORRECTNESS" />
+  <BugPattern abbrev="BIT" type="BIT_SIGNED_CHECK"    category="BAD_PRACTICE" />
+  <BugPattern abbrev="BIT" type="BIT_SIGNED_CHECK_HIGH_BIT"    category="CORRECTNESS" />
+  <BugPattern abbrev="BIT" type="BIT_AND"    category="CORRECTNESS" />
+  <BugPattern abbrev="BIT" type="BIT_AND_ZZ" category="CORRECTNESS" />
+  <BugPattern abbrev="BIT" type="BIT_IOR"    category="CORRECTNESS" />
+  <BugPattern abbrev="SA" type="SA_FIELD_SELF_ASSIGNMENT" category="CORRECTNESS" />
+  <BugPattern abbrev="SA" type="SA_LOCAL_DOUBLE_ASSIGNMENT" category="CORRECTNESS" />
+  <BugPattern abbrev="SA" type="SA_FIELD_DOUBLE_ASSIGNMENT" category="CORRECTNESS" />
+  <BugPattern abbrev="SA" type="SA_FIELD_SELF_COMPUTATION" category="CORRECTNESS" />
+  <BugPattern abbrev="SA" type="SA_LOCAL_SELF_COMPUTATION" category="CORRECTNESS" />
+  <BugPattern abbrev="SA" type="SA_FIELD_SELF_COMPARISON" category="CORRECTNESS" />
+  <BugPattern abbrev="SA" type="SA_LOCAL_SELF_COMPARISON" category="CORRECTNESS" />
+  <BugPattern abbrev="LI" type="LI_LAZY_INIT_INSTANCE" category="MT_CORRECTNESS"
+         experimental="true" />  <!-- has never been generated? -->
+  <BugPattern abbrev="LI" type="LI_LAZY_INIT_STATIC" category="MT_CORRECTNESS" cweid="543" />
+  <BugPattern abbrev="LI" type="LI_LAZY_INIT_UPDATE_STATIC" category="MT_CORRECTNESS" cweid="543" />
+  <BugPattern abbrev="JLM" type="JLM_JSR166_LOCK_MONITORENTER" category="MT_CORRECTNESS" />
+  <BugPattern abbrev="UPM" type="UPM_UNCALLED_PRIVATE_METHOD" category="PERFORMANCE"/>
+  <BugPattern abbrev="UMAC" type="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS" category="CORRECTNESS"/>
+  <BugPattern abbrev="ODR" type="ODR_OPEN_DATABASE_RESOURCE" category="BAD_PRACTICE" />
+  <BugPattern abbrev="ODR" type="ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH" category="BAD_PRACTICE" />
+  <BugPattern abbrev="SBSC" type="SBSC_USE_STRINGBUFFER_CONCATENATION" category="PERFORMANCE" />
+  <BugPattern abbrev="ITA" type="ITA_INEFFICIENT_TO_ARRAY" category="PERFORMANCE" />
+  <BugPattern abbrev="IJU" type="IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD" category="CORRECTNESS" />
+  <BugPattern abbrev="IJU" type="IJU_BAD_SUITE_METHOD" category="CORRECTNESS" />
+  <BugPattern abbrev="IJU" type="IJU_SETUP_NO_SUPER" category="CORRECTNESS" />
+  <BugPattern abbrev="IJU" type="IJU_TEARDOWN_NO_SUPER" category="CORRECTNESS" />
+  <BugPattern abbrev="IJU" type="IJU_SUITE_NOT_STATIC" category="CORRECTNESS" />
+  <BugPattern abbrev="IJU" type="IJU_NO_TESTS" category="CORRECTNESS" />
+  <BugPattern abbrev="BOA" type="BOA_BADLY_OVERRIDDEN_ADAPTER" category="CORRECTNESS" />
+  <BugPattern abbrev="SQL" type="BRSA_BAD_RESULTSET_ACCESS" category="CORRECTNESS"
+         experimental="true" />  <!-- deprecated in favor of SQL_BAD_RESULTSET_ACCESS -->
+  <BugPattern abbrev="SQL" type="SQL_BAD_RESULTSET_ACCESS" category="CORRECTNESS"/>
+  <BugPattern abbrev="SQL" type="SQL_BAD_PREPARED_STATEMENT_ACCESS" category="CORRECTNESS" />
+  <BugPattern abbrev="SIO" type="SIO_SUPERFLUOUS_INSTANCEOF" category="CORRECTNESS"/>
+  <BugPattern abbrev="BAC" type="BAC_BAD_APPLET_CONSTRUCTOR" category="CORRECTNESS"
+    experimental="true"/>
+  <BugPattern abbrev="UOE" type="UOE_USE_OBJECT_EQUALS" category="STYLE"
+        experimental="true"/>
+  <BugPattern abbrev="EC" type="EC_BAD_ARRAY_COMPARE" category="CORRECTNESS"/>
+  <BugPattern abbrev="STI" type="STI_INTERRUPTED_ON_CURRENTTHREAD" category="CORRECTNESS"/>
+  <BugPattern abbrev="STI" type="STI_INTERRUPTED_ON_UNKNOWNTHREAD" category="CORRECTNESS"/>
+  <BugPattern abbrev="DLS" type="DLS_DEAD_LOCAL_STORE_IN_RETURN" category="CORRECTNESS"/>
+  <BugPattern abbrev="DLS" type="DLS_DEAD_STORE_OF_CLASS_LITERAL" category="CORRECTNESS"/>
+  <BugPattern abbrev="DLS" type="DLS_DEAD_LOCAL_STORE" category="STYLE"/>
+  <BugPattern abbrev="DLS" type="DLS_DEAD_LOCAL_STORE_OF_NULL" category="STYLE"/>
+  <BugPattern abbrev="IP" type="IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN" category="CORRECTNESS" cweid="563" />
+  <BugPattern abbrev="MF" type="MF_METHOD_MASKS_FIELD" category="CORRECTNESS"/>
+  <BugPattern abbrev="MF" type="MF_CLASS_MASKS_FIELD" category="CORRECTNESS"/>
+  <BugPattern abbrev="WMI" type="WMI_WRONG_MAP_ITERATOR" category="PERFORMANCE"/>
+  <BugPattern abbrev="ISC" type="ISC_INSTANTIATE_STATIC_CLASS" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="REC" type="REC_CATCH_EXCEPTION" category="STYLE" cweid="396" />
+  <BugPattern abbrev="FE" type="FE_FLOATING_POINT_EQUALITY" category="STYLE"/>
+  <BugPattern abbrev="FE" type="FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER" category="CORRECTNESS"/>
+  <BugPattern abbrev="UM" type="UM_UNNECESSARY_MATH" category="PERFORMANCE"/>
+  <BugPattern abbrev="CD" type="CD_CIRCULAR_DEPENDENCY" category="STYLE"
+        experimental="true"/>
+  <BugPattern abbrev="RI" type="RI_REDUNDANT_INTERFACES" category="STYLE"/>
+  <BugPattern abbrev="MTIA" type="MTIA_SUSPECT_STRUTS_INSTANCE_FIELD" category="STYLE"/>
+  <BugPattern abbrev="MTIA" type="MTIA_SUSPECT_SERVLET_INSTANCE_FIELD" category="STYLE"/>
+  <BugPattern abbrev="PS" type="PS_PUBLIC_SEMAPHORES" category="STYLE"/>
+  <BugPattern abbrev="ICAST" type="ICAST_INTEGER_MULTIPLY_CAST_TO_LONG" category="STYLE"/>
+  <BugPattern abbrev="ICAST" type="ICAST_IDIV_CAST_TO_DOUBLE" category="STYLE"/>
+  <BugPattern abbrev="ICAST" type="ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL" category="CORRECTNESS"/>
+  <BugPattern abbrev="ICAST" type="ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND" category="CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="NP_NULL_INSTANCEOF" category="CORRECTNESS"/>
+  <BugPattern abbrev="NP" type="BC_NULL_INSTANCEOF" category="CORRECTNESS"
+         experimental="true" />  <!-- deprecated in favor of NP_NULL_INSTANCEOF -->
+  <BugPattern abbrev="BC" type="DMI_RANDOM_USED_ONLY_ONCE" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="DMI" type="DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT" category="CORRECTNESS"/>
+  <BugPattern abbrev="BC" type="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS" category="BAD_PRACTICE"/>
+  <BugPattern abbrev="BC" type="BC_BAD_CAST_TO_CONCRETE_COLLECTION" category="STYLE"/>
+  <BugPattern abbrev="BC" type="BC_UNCONFIRMED_CAST" category="STYLE"/>
+  <BugPattern abbrev="BC" type="BC_IMPOSSIBLE_CAST_PRIMITIVE_ARRAY" category="CORRECTNESS"/>  <!-- deprecated in favor of BC_IMPOSSIBLE_CAST -->
+  <BugPattern abbrev="BC" type="BC_IMPOSSIBLE_CAST" category="CORRECTNESS" cweid="570"/>
+  <BugPattern abbrev="BC" type="BC_IMPOSSIBLE_INSTANCEOF" category="CORRECTNESS" cweid="570" />
+  <BugPattern abbrev="BC" type="BC_VACUOUS_INSTANCEOF" category="STYLE" cweid="571" />
+  <BugPattern abbrev="BC" type="BC_BAD_CAST_TO_ABSTRACT_COLLECTION" category="STYLE"/>
+  <BugPattern abbrev="RE" type="RE_POSSIBLE_UNINTENDED_PATTERN" category="CORRECTNESS"/>
+  <BugPattern abbrev="RE" type="RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION" category="CORRECTNESS"/>
+  <BugPattern abbrev="RE" type="RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION" category="CORRECTNESS"/>
+  <BugPattern abbrev="DLS" type="DLS_OVERWRITTEN_INCREMENT" category="CORRECTNESS"/>
+  <BugPattern abbrev="ICAST" type="ICAST_BAD_SHIFT_AMOUNT" category="CORRECTNESS"/>
+  <BugPattern abbrev="IM" type="IM_MULTIPLYING_RESULT_OF_IREM" category="CORRECTNESS"/>
+  <BugPattern abbrev="IM" type="IM_BAD_CHECK_FOR_ODD" category="STYLE"/>
+  <BugPattern abbrev="IM" type="IM_AVERAGE_COMPUTATION_COULD_OVERFLOW" category="STYLE"/>
+  <BugPattern abbrev="DMI" type="DMI_INVOKING_TOSTRING_ON_ARRAY" category="CORRECTNESS"/>
+  <BugPattern abbrev="DMI" type="DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY" category="CORRECTNESS"/>
+  <BugPattern abbrev="ICAST" type="ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT" category="STYLE"/>
+  <BugPattern abbrev="DMI" type="DMI_HARDCODED_ABSOLUTE_FILENAME" category="STYLE"/>
+  <BugPattern abbrev="DMI" type="DMI_BAD_MONTH" category="CORRECTNESS"/>
+  <BugPattern abbrev="DMI" type="DMI_USELESS_SUBSTRING" category="STYLE"/>
+  <BugPattern abbrev="DMI" type="DMI_CALLING_NEXT_FROM_HASNEXT" category="CORRECTNESS"/>
+  <BugPattern abbrev="ST" type="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" category="STYLE"/>
+  <BugPattern abbrev="SWL" type="SWL_SLEEP_WITH_LOCK_HELD" category="MT_CORRECTNESS"/>
+  <BugPattern abbrev="J2EE" type="J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION" category="BAD_PRACTICE" cweid="579" />
+  <BugPattern abbrev="DMI" type="DMI_NONSERIALIZABLE_OBJECT_WRITTEN" category="STYLE"/>
+  <BugPattern abbrev="DB" type="DB_DUPLICATE_BRANCHES" category="STYLE"/>
+  <BugPattern abbrev="DB" type="DB_DUPLICATE_SWITCH_CLAUSES" category="STYLE"/>
+  <BugPattern abbrev="IMA" type="IMA_INEFFICIENT_MEMBER_ACCESS" category="PERFORMANCE"
+        experimental="true"/>
+  <BugPattern abbrev="XFB" type="XFB_XML_FACTORY_BYPASS" category="STYLE"/>
+  <BugPattern abbrev="USM" type="USM_USELESS_SUBCLASS_METHOD" category="STYLE"
+        experimental="true"/>
+  <BugPattern abbrev="USM" type="USM_USELESS_ABSTRACT_METHOD" category="STYLE"
+        experimental="true"/>
+  <BugPattern abbrev="CI" type="CI_CONFUSED_INHERITANCE" category="STYLE"/>
+  <BugPattern abbrev="QBA" type="QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT" category="CORRECTNESS" cweid="481" />
+  <BugPattern abbrev="GC" type="GC_UNRELATED_TYPES" category="CORRECTNESS"/>
+  <BugPattern abbrev="TQ" type="TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED" category="CORRECTNESS"/>
+  <BugPattern abbrev="TQ" type="TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED" category="CORRECTNESS"/>
+  <BugPattern abbrev="TQ" type="TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK" category="CORRECTNESS"/>
+  <BugPattern abbrev="TQ" type="TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK" category="CORRECTNESS"/>
+  <BugPattern abbrev="TQ" type="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK" category="CORRECTNESS"/>
+  <BugPattern abbrev="TQ" type="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK" category="CORRECTNESS"/>
+  <BugPattern abbrev="OBL" type="OBL_UNSATISFIED_OBLIGATION" category="STYLE"/>
+</FindbugsPlugin>

+ 107 - 0
src/main/java/com/hnshituo/core/auth/interceptor/JsonPermissionInterceptor.java

@@ -0,0 +1,107 @@
+package com.hnshituo.core.auth.interceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import com.hnshituo.basic.spring.web.interceptor.NoPermissionException;
+import com.hnshituo.core.auth.service.HomeService;
+
+public class JsonPermissionInterceptor extends HandlerInterceptorAdapter {
+//	private static Logger log = Logger.getLogger(JsonPermissionInterceptor.class);
+	
+	@Autowired
+	private HomeService homeService;
+	
+//	@Autowired
+//	private FunctionService functionService;
+	
+//	@Autowired
+//	private RoleService roleService;
+
+	/**
+	 * 在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
+	 * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链,
+	 * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion()
+	 */
+	@Override
+	public boolean preHandle(HttpServletRequest request,
+			HttpServletResponse response, Object handler) throws Exception {
+		String userId = (String) request.getSession().getAttribute(HomeService.SESSION_USER_ID);
+		
+		String requestUri = request.getRequestURI();
+		String contextPath = request.getContextPath();
+		String url = requestUri.substring((contextPath + "/service/").length());
+		
+		if (userId != null && userId.equals("admin")) {
+			setDataPrg(request, userId, url);
+			return true;
+		}
+		String BasePath=requestUri.substring(requestUri.lastIndexOf("/")+1);
+		if(BasePath.contains("Portal")){
+			//大门户则不监听数据权限不判断是否过期
+		}else{
+			if (userId == null) {
+				throw new NoPermissionException("未登录,或登陆已过期。请重新登陆!");
+			} 
+//			else if (!userId.equals("admin") && !homeService.hasPermission(url)) {
+//				throw new NoPermissionException("没有访问该功能的权限。URL: " + url);
+//			}
+		}
+		
+		setDataPrg(request, userId, url);
+		return true;
+	}
+	
+	private void setDataPrg(HttpServletRequest request, String userId, String url) throws Exception {
+		String field = null;
+		String[] dataPrgs = null;
+//		if (functionService.isOpenDataPrg(url)) {
+//			if (userId != null && !userId.equals("admin")) {
+//				field = functionService.getDataPrgField(url);
+//				dataPrgs = roleService.getDataPrg(userId, url);
+//				if (StringUtils.isEmpty(field)) {
+//					field = "DEPT_ID";
+//				}
+//			}
+//		}
+		request.setAttribute(HomeService.REQUEST_DATA_FIELD, field);
+		request.setAttribute(HomeService.REQUEST_DATA_PRG, dataPrgs);
+	}
+
+	/**
+	 * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 可在modelAndView中加入数据,比如当前时间
+	 */
+	@Override
+	public void postHandle(HttpServletRequest request,
+			HttpServletResponse response, Object handler,
+			ModelAndView modelAndView) throws Exception {
+	}
+
+	/**
+	 * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
+	 * 
+	 * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
+	 */
+	@Override
+	public void afterCompletion(HttpServletRequest request,
+			HttpServletResponse response, Object handler, Exception ex)
+			throws Exception {
+	}
+
+	public void setHomeService(HomeService homeService) {
+		this.homeService = homeService;
+	}
+
+//	public void setFunctionService(FunctionService functionService) {
+//		this.functionService = functionService;
+//	}
+//
+//	public void setRoleService(RoleService roleService) {
+//		this.roleService = roleService;
+//	}
+
+}

+ 57 - 0
src/main/java/com/hnshituo/core/auth/interceptor/JsonSessionInterceptor.java

@@ -0,0 +1,57 @@
+package com.hnshituo.core.auth.interceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import com.hnshituo.basic.spring.web.interceptor.SessionTimeOutException;
+import com.hnshituo.core.auth.service.HomeService;
+
+public class JsonSessionInterceptor extends HandlerInterceptorAdapter {
+	
+	/**
+	 * 在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
+	 * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链,
+	 * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion()
+	 */
+	@Override
+	public boolean preHandle(HttpServletRequest request,
+			HttpServletResponse response, Object handler) throws Exception {
+
+		String userId = (String) request.getSession().getAttribute(HomeService.SESSION_USER_ID);
+		//MmpCustomerAccount customerAccount=(MmpCustomerAccount)request.getSession().getAttribute("customerAccount");
+		
+		String requestUri = request.getRequestURI();
+		String BasePath=requestUri.substring(requestUri.lastIndexOf("/")+1);
+		if(BasePath.contains("Portal")){
+			//大门户则不监听数据权限不判断是否过期
+		}else if (userId == null //&& customerAccount==null
+				) {
+			throw new SessionTimeOutException();
+		} 
+		return true;
+	}
+
+	/**
+	 * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 可在modelAndView中加入数据,比如当前时间
+	 */
+	@Override
+	public void postHandle(HttpServletRequest request,
+			HttpServletResponse response, Object handler,
+			ModelAndView modelAndView) throws Exception {
+	}
+
+	/**
+	 * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
+	 * 
+	 * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
+	 */
+	@Override
+	public void afterCompletion(HttpServletRequest request,
+			HttpServletResponse response, Object handler, Exception ex)
+			throws Exception {
+	}
+
+}

+ 139 - 0
src/main/java/com/hnshituo/core/auth/interceptor/RemoteServiceExceptionResolver.java

@@ -0,0 +1,139 @@
+package com.hnshituo.core.auth.interceptor;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.http.HttpInputMessage;
+import org.springframework.http.HttpOutputMessage;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServletServerHttpRequest;
+import org.springframework.http.server.ServletServerHttpResponse;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver;
+
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+
+/**
+ * 不必在Controller中对异常进行处理,抛出即可,由此异常解析器统一控制。<br>
+ * ajax请求(有@ResponseBody的Controller)发生错误,输出JSON。<br>
+ * 页面请求(无@ResponseBody的Controller)发生错误,输出错误页面。<br>
+ * 需要与AnnotationMethodHandlerAdapter使用同一个messageConverters<br>
+ * Controller中需要有专门处理异常的方法。
+ * 
+ * @author dongjian
+ * 
+ * */
+public class RemoteServiceExceptionResolver extends
+		ExceptionHandlerExceptionResolver {
+
+	private String defaultErrorView;
+
+	public String getDefaultErrorView() {
+		return defaultErrorView;
+	}
+
+	public void setDefaultErrorView(String defaultErrorView) {
+		this.defaultErrorView = defaultErrorView;
+	}
+
+	@Override
+	protected ModelAndView doResolveHandlerMethodException(
+			HttpServletRequest request, HttpServletResponse response,
+			HandlerMethod handlerMethod, Exception exception) {
+
+		if (handlerMethod == null) {
+			return null;
+		}
+
+		Method method = handlerMethod.getMethod();
+
+		if (method == null) {
+			return null;
+		}
+
+		ModelAndView returnValue = super.doResolveHandlerMethodException(
+				request, response, handlerMethod, exception);
+
+//		RemoteService responseBodyAnn = AnnotationUtils.findAnnotation(method, RemoteService.class);
+		RemoteService responseBodyAnn = AnnotationUtils.findAnnotation(method.getDeclaringClass(), RemoteService.class);
+		if (responseBodyAnn != null) {
+			try {
+				ResponseStatus responseStatusAnn = AnnotationUtils
+						.findAnnotation(method, ResponseStatus.class);
+				if (responseStatusAnn != null) {
+					HttpStatus responseStatus = responseStatusAnn.value();
+					String reason = responseStatusAnn.reason();
+					if (!StringUtils.hasText(reason)) {
+						response.setStatus(responseStatus.value());
+					} else {
+						try {
+							response.sendError(responseStatus.value(), reason);
+						} catch (IOException e) {
+						}
+					}
+				}
+
+				return handleResponseBody(returnValue, request, response);
+			} catch (Exception e) {
+				return null;
+			}
+		}
+
+		if (returnValue.getViewName() == null) {
+			returnValue.setViewName(defaultErrorView);
+		}
+
+		return returnValue;
+
+	}
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	private ModelAndView handleResponseBody(ModelAndView returnValue,
+			HttpServletRequest request, HttpServletResponse response)
+			throws ServletException, IOException {
+		Map value = returnValue.getModelMap();
+		HttpInputMessage inputMessage = new ServletServerHttpRequest(request);
+		List<MediaType> acceptedMediaTypes = inputMessage.getHeaders()
+				.getAccept();
+		if (acceptedMediaTypes.isEmpty()) {
+			acceptedMediaTypes = Collections.singletonList(MediaType.ALL);
+		}
+		MediaType.sortByQualityValue(acceptedMediaTypes);
+		HttpOutputMessage outputMessage = new ServletServerHttpResponse(
+				response);
+		Class<?> returnValueType = value.getClass();
+		List<HttpMessageConverter<?>> messageConverters = super
+				.getMessageConverters();
+		if (messageConverters != null) {
+			for (MediaType acceptedMediaType : acceptedMediaTypes) {
+				for (HttpMessageConverter messageConverter : messageConverters) {
+					if (messageConverter.canWrite(returnValueType,
+							acceptedMediaType)) {
+						messageConverter.write(value, acceptedMediaType,
+								outputMessage);
+						return new ModelAndView();
+					}
+				}
+			}
+		}
+		if (logger.isWarnEnabled()) {
+			logger.warn("Could not find HttpMessageConverter that supports return type ["
+					+ returnValueType + "] and " + acceptedMediaTypes);
+		}
+		return null;
+	}
+
+}

+ 28 - 0
src/main/java/com/hnshituo/core/auth/listener/ContextHolderUtils.java

@@ -0,0 +1,28 @@
+package com.hnshituo.core.auth.listener;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+public class ContextHolderUtils {
+	/** 
+     * SpringMvc下获取request 
+     * @return 
+     */  
+    public static HttpServletRequest getRequest() {  
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();  
+        return request;  
+  
+    }  
+    /** 
+     * SpringMvc下获取session 
+     * @return 
+     */  
+    public static HttpSession getSession() {  
+        HttpSession session = getRequest().getSession();  
+        return session;  
+  
+    }  
+}

+ 131 - 0
src/main/java/com/hnshituo/core/auth/listener/SessionUserListener.java

@@ -0,0 +1,131 @@
+package com.hnshituo.core.auth.listener;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import com.hnshituo.core.auth.vo.User;
+
+public class SessionUserListener implements HttpSessionListener{  
+	 // key为sessionId,value为HttpSession,使用static,定义静态变量,使之程序运行时,一直存在内存中。    
+	   private static Map<String, HttpSession> sessionMap = new HashMap<String, HttpSession>(500);    
+	   
+	   /**  
+	    * HttpSessionListener中的方法,创建session  
+	    */    
+	   @Override
+	public void sessionCreated(HttpSessionEvent event) {    
+		   
+	   }    
+	   
+	   /**  
+	    * HttpSessionListener中的方法,回收session时,删除sessionMap中对应的session  
+	    */    
+	   @Override
+	public void sessionDestroyed(HttpSessionEvent event) {    
+	       getSessionMap().remove(event.getSession().getId());    
+	   }    
+	   
+	   /**  
+	    * 得到在线用户会话集合  
+	    */    
+	   public static List<HttpSession> getUserSessions() {    
+	       List<HttpSession> list = new ArrayList<HttpSession>();    
+	       Iterator<String> iterator = getSessionMapKeySetIt();    
+	       while (iterator.hasNext()) {    
+	           String key = iterator.next();    
+	           HttpSession session = getSessionMap().get(key);    
+	           list.add(session);    
+	       }    
+	       return list;    
+	   }    
+	   
+	   /**  
+	    * 得到用户对应会话map,key为用户ID,value为会话ID  
+	    */    
+	   public static Map<String, String> getUserSessionMap() {    
+	       Map<String, String> map = new HashMap<String, String>();    
+	       Iterator<String> iter = getSessionMapKeySetIt();    
+	       while (iter.hasNext()) {    
+	           String sessionId = iter.next();    
+	           HttpSession session = getSessionMap().get(sessionId);    
+	           User user = (User) session.getAttribute("LOCAL_CLINET_USER");    
+	           if (user != null) {    
+	               map.put(user.getId(), sessionId);    
+	           }    
+	       }    
+	       return map;    
+	   }    
+	   
+	   /**  
+	    * 移除用户Session  
+	    */    
+	   public synchronized static void removeUserSession(String userId) {    
+	       Map<String, String> userSessionMap = getUserSessionMap();    
+	       if (userSessionMap.containsKey(userId)) {    
+	           String sessionId = userSessionMap.get(userId);    
+	           getSessionMap().get(sessionId).invalidate();    
+	           getSessionMap().remove(sessionId);    
+	       }    
+	   }    
+	   
+	   /**  
+	    * 增加用户到session集合中  
+	    */    
+	   public static void addUserSession(HttpSession session) {    
+	       getSessionMap().put(session.getId(), session);    
+	   }    
+	   
+	   /**  
+	    * 移除一个session  
+	    */    
+	   public static void removeSession(String sessionID) {    
+	       getSessionMap().remove(sessionID);    
+	   }    
+	   
+	   public static boolean containsKey(String key) {    
+	       return getSessionMap().containsKey(key);    
+	   }    
+	   
+	   /**  
+	    * 判断该用户是否已重复登录,使用  
+	    * 同步方法,只允许一个线程进入,才好验证是否重复登录  
+	    * @param user  
+	    * @return  
+	    */    
+	   public synchronized static boolean checkIfHasLogin(User user) {    
+	       Iterator<String> iter = getSessionMapKeySetIt();    
+	       while (iter.hasNext()) {    
+	           String sessionId = iter.next();    
+	           HttpSession session = getSessionMap().get(sessionId);    
+	           User sessionuser = (User) session.getAttribute("LOCAL_CLINET_USER");  // 这是你设置 保存用户对应session名   
+	           if (sessionuser != null) {    
+	               if (sessionuser.getId().equals(user.getId())){    
+	                   return true;    
+	               }    
+	           }    
+	       }    
+	       return false;    
+	   }    
+	   
+	   /**  
+	    * 获取在线的sessionMap  
+	    */    
+	   public static Map<String, HttpSession> getSessionMap() {    
+	       return sessionMap;    
+	   }    
+	   
+	   /**  
+	    * 获取在线sessionMap中的SessionId  
+	    */    
+	   public static Iterator<String> getSessionMapKeySetIt() {    
+	       return getSessionMap().keySet().iterator();    
+	   }    
+}
+

+ 25 - 0
src/main/java/com/hnshituo/core/auth/mapper/DepartmentMapper.java

@@ -0,0 +1,25 @@
+package com.hnshituo.core.auth.mapper;
+
+import java.util.List;
+
+import com.hnshituo.core.auth.vo.Department;
+import com.hnshituo.orm.GenericMapper;
+
+public interface DepartmentMapper extends GenericMapper<Department, String> {
+	public boolean isNameExist(String name);
+	
+	/**
+	  * 获取该部门下及其下所有子部门(包括跨级子部门)
+	 * @param id
+	 * */
+	public List<Department> doQueryById(Department t);
+	
+	/**
+	 * 获取该部门下所有子部门(包括跨级子部门)
+	 * @param pid
+	 * @return
+	 */
+	public List<Department> doQueryByPid(Department t);
+	
+	public void doDelete(Department t);
+}

+ 38 - 0
src/main/java/com/hnshituo/core/auth/mapper/FunctionMapper.java

@@ -0,0 +1,38 @@
+package com.hnshituo.core.auth.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.hnshituo.core.auth.vo.Function;
+import com.hnshituo.core.auth.vo.Role;
+import com.hnshituo.orm.GenericMapper;
+
+public interface FunctionMapper extends GenericMapper<Function, Integer> {
+	
+	public List<Function> findTree4Prv(int roleId);
+	/**
+	 * 根据Role权限查找功能(包含菜单和功能按钮)
+	 * @param roles
+	 * @return
+	 */
+	public List<Function> findByRoles(@Param("roles")List<Role> roles);
+	
+	/**
+	 * 根据Role权限查找功能(包含菜单,不包含功能按钮)
+	 * @param roles
+	 * @return
+	 */
+	public List<Function> findMenuByRoles(@Param("roles")List<Role> roles);
+	
+	/**
+	 * 根据Role权限查找功能(包含功能按钮,不包含菜单)
+	 * @param roles
+	 * @return
+	 */
+	public List<Function> findFuncByRoles(@Param("roles")List<Role> roles);
+	
+	public int findMaxId();
+	
+	
+}

+ 24 - 0
src/main/java/com/hnshituo/core/auth/mapper/PrivilegeMapper.java

@@ -0,0 +1,24 @@
+package com.hnshituo.core.auth.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.hnshituo.core.auth.vo.Function;
+import com.hnshituo.core.auth.vo.Privilege;
+import com.hnshituo.orm.GenericMapper;
+
+public interface PrivilegeMapper extends GenericMapper<Privilege, Integer> {
+
+	
+	public void insertWithFuncs(@Param("roleId")int roleId, @Param("funcs")List<Function> funcs);
+	
+	
+	public Integer[] getPrivilegeByRoleId(@Param("roleId")int roleId);
+	
+	public void deleteByRoleId(@Param("roleId")int roleId);
+
+
+	public void doAdd(Privilege privilege);
+	
+}

+ 31 - 0
src/main/java/com/hnshituo/core/auth/mapper/RoleMapper.java

@@ -0,0 +1,31 @@
+package com.hnshituo.core.auth.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.hnshituo.core.auth.vo.Role;
+import com.hnshituo.orm.GenericMapper;
+
+public interface RoleMapper extends GenericMapper<Role, Integer> {
+
+	public List<Role> findByName(@Param("name")String name);
+	
+	public boolean hasWholeDataPrg(@Param("userId")String userId);
+	
+	public void insertUserRole(@Param("userId")String userId, @Param("ids")int[] ids);
+	
+	public void insertUserRole2(@Param("userId")String userId, @Param("roles")List<Role> roles);
+	
+	public void delRelationByUserId(@Param("userId")String userId);
+	
+	public String[] getDataPrg(@Param("userId")String userId, @Param("url")String url);
+	public void insertDataPrg(@Param("roleId")int roleId, @Param("url")String url, @Param("departmentIds")String[] departmentIds);
+	public void deleteDataPrgByRoleId(@Param("roleId")int roleId);
+	public void deleteDataPrgByRoleIdAndFuncId(@Param("roleId")int roleId, @Param("url")String url);
+	//验证用户是否为管理员
+	public int isAdmin(String userId);
+
+	public int findMaxId();
+	
+}

+ 8 - 0
src/main/java/com/hnshituo/core/auth/mapper/UserGroupMapper.java

@@ -0,0 +1,8 @@
+package com.hnshituo.core.auth.mapper;
+
+import com.hnshituo.core.auth.vo.UserGroup;
+import com.hnshituo.orm.GenericMapper;
+
+public interface UserGroupMapper extends GenericMapper<UserGroup, Object> {
+
+}

+ 8 - 0
src/main/java/com/hnshituo/core/auth/mapper/UserInfoMapper.java

@@ -0,0 +1,8 @@
+package com.hnshituo.core.auth.mapper;
+
+import com.hnshituo.core.auth.vo.UserInfo;
+import com.hnshituo.orm.GenericMapper;
+
+public interface UserInfoMapper extends GenericMapper<UserInfo, Integer> {
+	UserInfo doQueryLogoByUserNo(String userNo);
+}

+ 23 - 0
src/main/java/com/hnshituo/core/auth/mapper/UserLoginMapper.java

@@ -0,0 +1,23 @@
+package com.hnshituo.core.auth.mapper;
+
+import java.util.List;
+
+import com.hnshituo.core.auth.vo.UserLogin;
+import com.hnshituo.orm.GenericMapper;
+
+public interface UserLoginMapper extends GenericMapper<UserLogin, Object> {
+
+	List<UserLogin> doQuery(UserLogin login, String startTime, String endTime,
+			int i, int j);
+
+	int doQueryCount(UserLogin login, String startTime, String endTime);
+
+	List<UserLogin> doQueryCensus(UserLogin login, String startTime,
+			String endTime);
+
+	List<UserLogin> doQueryPerson(UserLogin login, String startTime,
+			String endTime, int i, int j);
+
+	int doQueryPersonCount(UserLogin login, String startTime, String endTime);
+
+}

+ 53 - 0
src/main/java/com/hnshituo/core/auth/mapper/UserMapper.java

@@ -0,0 +1,53 @@
+package com.hnshituo.core.auth.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.hnshituo.core.auth.vo.User;
+import com.hnshituo.orm.GenericMapper;
+
+public interface UserMapper extends GenericMapper<User, String> {
+	public User login(User inUser, String password);
+	
+	public boolean isIdExist(@Param("id")String id);
+	
+	public boolean isLoginNameExist(@Param("loginName")String loginName);
+	
+	public void resetPassword(@Param("id")String id, @Param("password")String password);
+	
+	public void resetDevice(@Param("id")String id, @Param("device")String device);
+	
+	public List<User> findByDeptId(@Param("deptId")String deptId);
+	
+	public List<User> doUserInfo(String dptNo);
+	
+	public List<User> findByUserIdApp(@Param("id")String id);
+	
+	public List<User> findUserInfoApp();
+
+	public List<User> findAllUser();
+	
+	public List<User> findUserByDepartmentNo(String departmentNo,String userName,int pageIndex,int pageSize);
+	
+	public List<User> findUser(String deptNo,String personNo,int pageIndex,int pageSize);
+	
+	public User doQueryByUUID(String UUID);
+	
+	public int countUser(String departmentNo, String userName);
+	
+	public List<User> doQueryByNameBlur(String username,String deptNo,int pageIndex,int pageSize);
+	
+	public int countByNameBlur(String username,String deptNo);
+
+	public List<User> doQueryByDeptNos(String depts);
+
+	public List<User> doQueryByRoleNos(String roles);
+
+	public List<User> doQueryByRoleNo(Integer roleId, String userName, String dptId);
+
+	public int doQueryByRoleNoCount(Integer roleId, String userName, String dptId);
+
+	public void doUpdateUserDpt(String mainDpt,String mainDptName,String childDpt);
+
+}

+ 22 - 0
src/main/java/com/hnshituo/core/auth/mapper/UserRoleMapper.java

@@ -0,0 +1,22 @@
+package com.hnshituo.core.auth.mapper;
+
+import java.util.List;
+
+import com.hnshituo.core.auth.vo.UserRole;
+import com.hnshituo.orm.GenericMapper;
+
+public interface UserRoleMapper extends GenericMapper<UserRole, Integer> {
+
+	List<UserRole> doQuery(String string);
+
+	List<UserRole> doQueryUser(String role);
+
+	void doDelete(UserRole userRole);
+
+	void doAdd(UserRole user);
+
+	int findMaxId();
+
+	void deleteByRoleId(Integer roleId);
+
+}

+ 10 - 0
src/main/java/com/hnshituo/core/auth/mapper/UsersGroupMapper.java

@@ -0,0 +1,10 @@
+package com.hnshituo.core.auth.mapper;
+
+import com.hnshituo.core.auth.vo.UsersGroup;
+import com.hnshituo.orm.GenericMapper;
+
+public interface UsersGroupMapper extends GenericMapper<UsersGroup, Object>{
+//		public void doDeleteByGroupIdAndUserId(String groupId,String userId);
+//
+//		public void doDelete(String  groupId);
+}

+ 58 - 0
src/main/java/com/hnshituo/core/auth/service/DepartmentService.java

@@ -0,0 +1,58 @@
+package com.hnshituo.core.auth.service;
+
+import java.util.List;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.Department;
+
+public interface DepartmentService extends BaseService<Department, String> {
+	/**
+	 * 输出组织数据
+	 * 本功能受权限控制,登录用户所在角色拥有哪些权限,则显示哪些组织
+	 * @return
+	 */
+	public List<Department> findTree();
+	
+	/**
+	 * 根据父组织的ID查询所有该ID下所有子组织的数据
+	 * @param pid
+	 * @return
+	 */
+	public List<Department> doQueryByPidTree(Department t);
+	
+	/**
+	 * 根据ID查询所有该ID及旗下所有子组织的数据
+	 * @param pid
+	 * @return
+	 */
+	public List<Department> doQueryByIdTree(Department t);
+	
+	/**
+	 * 检查组织名称是否合法
+	 * 如检查是否重名
+	 * @param name
+	 * @return
+	 */
+	public boolean validateName(String name);
+	
+	/**
+	 * 一般查询
+	 * */
+	public List<Department> doQueryWeb(Department t);
+	
+	/**
+	 * 新增
+	 * */
+	public Department doAddWeb(Department t) throws Exception;
+	
+	/**
+	 * 修改
+	 * */
+	public Department doUpdateWeb(Department t) throws Exception;
+	
+	/**
+	 * 删除
+	 * */
+	public Department doDeleteWeb(Department t) throws Exception;
+	
+}

+ 98 - 0
src/main/java/com/hnshituo/core/auth/service/FunctionService.java

@@ -0,0 +1,98 @@
+package com.hnshituo.core.auth.service;
+
+import java.util.List;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.Function;
+
+public interface FunctionService extends BaseService<Function, Integer> {
+
+	/**
+	 * 输出功能数据,包括功能按钮,不包含菜单
+	 * 本方法受功能权限控制
+	 * @return
+	 */
+//	public List<Function> findFuncByPrv() throws Exception;
+	
+	/**
+	 * 输出树菜单数据,不包括功能按钮
+	 * 供前端主页面菜单栏显示调用
+	 * 本功能受权限控制,登录用户所在角色拥有哪些权限,则显示哪些菜单
+	 * @return
+	 */
+//	public List<Function> findTree() throws Exception;
+	
+	/**
+	 * 输出所有菜单数据,包括无需显示的菜单,且不考虑权限
+	 * @return
+	 */
+	public List<Function> findTreeAll();
+	
+	/**
+	 * 根据roleId输出所有菜单数据,包括无需显示的菜单。
+	 * 当该role拥有该功能的权限时,返回集合中Function的属性checked为true,否则为false
+	 * @param roleId 角色编号
+	 * @return
+	 */
+	public List<Function> findTreeByRoleId(Integer roleId);
+	
+	/**
+	 * 根据pid,查询该菜单下所有功能按钮的数据
+	 * @param pid
+	 * @return
+	 */
+	public List<Function> findFunctions(Integer pid);
+	
+	/**
+	 * 根据父菜单的ID查询所有该ID下所有子菜单的数据(包含菜单及功能按钮)
+	 * @param pid
+	 * @return
+	 */
+	public List<Function> findByPid(Integer pid);
+	
+	/**
+	 * 修改菜单,并返回该菜单的数据
+	 * @param t
+	 * @return
+	 * @throws Exception
+	 */
+	public Function modify(Function t) throws Exception;
+	
+	/**
+	 * 拖动菜单
+	 * 重新指定菜单所在父菜单的位置
+	 * 该菜单的新的父菜单ID可能与原先不一致
+	 * @param id	需要更改的function的id
+	 * @param pid	更改后该function的pid
+	 * @param ids	更改后该function的父菜单下所有子菜单的id数组。需按数组顺序重新更新其SEQ
+	 */
+	public void dragMenu(int id, int pid, int[] ids);
+	
+	/**
+	 * 按数组顺序重新更新SEQ
+	 * @param ids
+	 */
+	public void reordering(int[] ids);
+	
+	/**
+	 * 检查是否存在指定url的功能
+	 * @param url
+	 * @return
+	 */
+	public boolean hasFunction(String url);
+	
+	/**
+	 * 检查该功能是否开启了数据权限
+	 * @param url
+	 * @return
+	 */
+	public boolean isOpenDataPrg(String url) throws Exception;
+	
+	/**
+	 * 获取该功能数据权限字段
+	 * @param url
+	 * @return
+	 * @throws Exception
+	 */
+	public String getDataPrgField(String url) throws Exception;
+}

+ 30 - 0
src/main/java/com/hnshituo/core/auth/service/HomeService.java

@@ -0,0 +1,30 @@
+package com.hnshituo.core.auth.service;
+
+import com.hnshituo.basic.service.BaseService;
+
+public interface HomeService extends BaseService {
+	public final static String SESSION_USER = "user";
+	public final static String SESSION_USER_ID = "user_id";
+	public final static String SESSION_USER_NAME = "username";
+	/** 功能权限 */
+	public final static String SESSION_FUNC_PRV = "function_privilege";
+	/** 数据权限 */
+	public final static String REQUEST_DATA_PRG = "request_data_prg";
+	public final static String REQUEST_DATA_FIELD = "request_data_field";
+	
+	public final static String SESSION_DEPT_ID = "dept_id";
+	public final static String SESSION_DEPT_NAME = "dept_name";
+	
+	public final static String SESSION_WORK_ORD = "work_ord";
+	public final static String SESSION_WORK_GRP = "work_grp";
+	public final static String SESSION_WORK_TIME = "work_time";
+	
+	public final static String SESSION_ISADMIN = "is_admin";
+	
+	//班次
+	public final static String WRK_ORD = "1";
+	//班组
+	public final static String WRK_GRP = "1";
+	
+	public boolean hasPermission(String url) throws Exception;
+}

+ 18 - 0
src/main/java/com/hnshituo/core/auth/service/PrivilegeService.java

@@ -0,0 +1,18 @@
+package com.hnshituo.core.auth.service;
+
+import java.util.List;
+
+import market.Com.vo.ResultModel;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.Function;
+import com.hnshituo.core.auth.vo.Privilege;
+
+public interface PrivilegeService extends BaseService<Privilege, Integer> {
+	public ResultModel save(int roleId, List<Function> funcs);
+	
+	public Integer[] getByRoleId(int roleId);
+	
+	public void deleteByRoleId(int roleId);
+
+}

+ 17 - 0
src/main/java/com/hnshituo/core/auth/service/RoleService.java

@@ -0,0 +1,17 @@
+package com.hnshituo.core.auth.service;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.Role;
+
+public interface RoleService extends BaseService<Role, Integer> {
+
+	/**
+	 * 该用户所在的角色群是否拥有全局数据权限
+	 * @param userId
+	 * @return
+	 */
+	public boolean hasWholeDataPrg(String userId) throws Exception;
+	
+	public String[] getDataPrg(String userId, String url) throws Exception;
+	
+}

+ 8 - 0
src/main/java/com/hnshituo/core/auth/service/UserGroupService.java

@@ -0,0 +1,8 @@
+package com.hnshituo.core.auth.service;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.UserGroup;
+
+public interface UserGroupService extends BaseService<UserGroup, Object> {
+
+}

+ 8 - 0
src/main/java/com/hnshituo/core/auth/service/UserInfoService.java

@@ -0,0 +1,8 @@
+package com.hnshituo.core.auth.service;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.UserInfo;
+
+public interface UserInfoService extends BaseService<UserInfo, Integer> {
+
+}

+ 8 - 0
src/main/java/com/hnshituo/core/auth/service/UserLoginService.java

@@ -0,0 +1,8 @@
+package com.hnshituo.core.auth.service;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.UserLogin;
+
+public interface UserLoginService extends BaseService<UserLogin, Object> {
+
+}

+ 10 - 0
src/main/java/com/hnshituo/core/auth/service/UserRoleService.java

@@ -0,0 +1,10 @@
+package com.hnshituo.core.auth.service;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.UserRole;
+
+public interface UserRoleService extends BaseService<UserRole, Integer> {
+
+	void deleteByRoleId(Integer id);
+
+}

+ 50 - 0
src/main/java/com/hnshituo/core/auth/service/UserService.java

@@ -0,0 +1,50 @@
+package com.hnshituo.core.auth.service;
+
+import java.util.List;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.User;
+
+public interface UserService extends BaseService<User, String> {
+	
+//	public String login(String username, String password, String vcode) throws Exception;
+	
+	/**
+	 * 获取当前登陆用户
+	 * @return
+	 * @throws Exception
+	 */
+	public User getLoginUser() throws Exception;
+	
+	
+	/**
+	 * 更新当前登陆用户的信息
+	 * @param user
+	 * @return
+	 * @throws Exception
+	 */
+	public User updateLoginUser(User user) throws Exception;
+	/**
+	 * 检查用户编号是否合法
+	 * @param id
+	 * @return true:合法, false:非法
+	 */
+	public boolean validateId(String id);
+	
+	/**
+	 * 检查用户登陆账号是否合法
+	 * @param loginName
+	 * @return true:合法, false:非法
+	 */
+	public boolean validateLoginName(String loginName);
+	
+	
+	/**
+	 * 获取该部门及其子部门下所有用户信息
+	 * @param deptId
+	 * @return
+	 * @throws Exception
+	 */
+	public List<User> findByDeptId(String deptId) throws Exception;
+
+}

+ 8 - 0
src/main/java/com/hnshituo/core/auth/service/UsersGroupService.java

@@ -0,0 +1,8 @@
+package com.hnshituo.core.auth.service;
+
+import com.hnshituo.basic.service.BaseService;
+import com.hnshituo.core.auth.vo.UsersGroup;
+
+public interface UsersGroupService extends BaseService<UsersGroup, Object>{
+
+}

+ 190 - 0
src/main/java/com/hnshituo/core/auth/service/impl/DepartmentServiceImpl.java

@@ -0,0 +1,190 @@
+package com.hnshituo.core.auth.service.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.mapper.DepartmentMapper;
+import com.hnshituo.core.auth.service.DepartmentService;
+import com.hnshituo.core.auth.service.HomeService;
+import com.hnshituo.core.auth.vo.Department;
+
+@RemoteService(path="core/auth/dept")
+public class DepartmentServiceImpl extends BaseServiceImpl<Department, String> implements DepartmentService {
+	/**
+	 * 有权限的所有树节点
+	 * 及其权限数据
+	 * */
+	@RemoteService(path="tree")
+	public List<Department> findTree() {
+		Department t = new Department();
+		t.setDel(false);
+		List<Department> list = this.getMapper(DepartmentMapper.class).findWithCondition(t, null, "SEQ", 0, 0);
+
+		String[] dataPrgs = (String[]) this.getRequest().getAttribute(HomeService.REQUEST_DATA_PRG);
+		if (dataPrgs == null) {
+			return findByPid(list, null);
+		}
+
+		List<Department> result = new ArrayList<Department>();
+		for (String prg : dataPrgs) {
+			Department dept = getByIdFromDepts(prg, list);
+			if (dept != null) {
+				dept.setChildren(this.findByPid(list, dept.getId()));
+				result.add(dept);
+			}
+		}
+		return result;
+	}
+
+	private Department getByIdFromDepts(String id, List<Department> depts) {
+		for (Department department : depts) {
+			if (id != null && id.equals(department.getId())) {
+				return department;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 递归组织数据,输出树形数据对象
+	 * @param all
+	 * @param pid
+	 * @return
+	 */
+	private List<Department> findByPid(List<Department> all, String pid) {
+		List<Department> list = null;
+		for (Department dept : all) {
+			if (StringUtils.isEmpty(pid) && StringUtils.isEmpty(dept.getPid())) {
+				if (list == null) list = new ArrayList<Department>();
+				list.add(dept);
+			} else if (StringUtils.isNotEmpty(pid) && pid.equals(dept.getPid())) {
+				if (list == null) list = new ArrayList<Department>();
+				list.add(dept);
+			}
+		}
+		if (list != null) {
+			for (Department dept : list) {
+				dept.setChildren(findByPid(all, dept.getId()));
+			}
+		}
+		return list;
+	}
+
+	/**
+	 * 随机数生成
+	 * */
+	private String RandomCreate(int i){
+		String str="";
+		for(int k=0;k<i;k++){
+			str+=(int)(Math.random()*10);//[1-10)随机数 即0-9
+		}
+		return str;
+	}
+	
+	/**
+	 * 获得树结构数据,不含权限,不含子集节点
+	 * */
+	@Override
+	public List<Department> doQueryByPidTree(Department t) {
+		t.setDel(false);
+		List<Department> list = this.getMapper(DepartmentMapper.class).doQueryByPid(t);
+
+		List<Department> result = new ArrayList<Department>();
+		for(Department d:list){
+			d.setChildren(this.findByPid(list, d.getId()));
+			result.add(d);
+		}
+
+		return result;
+	}
+	
+	/**
+	 * 获得树结构数据,不含权限,含子集节点
+	 * */
+	@Override
+	public List<Department> doQueryByIdTree(Department t) {
+		t.setDel(false);
+		List<Department> list = this.getMapper(DepartmentMapper.class).doQueryById(t);
+
+		List<Department> result = new ArrayList<Department>();
+		for(Department d:list){
+			d.setChildren(this.findByPid(list, d.getId()));
+			result.add(d);
+		}
+
+		return result;
+	}
+	
+	public List<Department> findAll(){
+		Department dept=new Department();
+		dept.setDel(false);
+		List<Department> departmentList = this.getMapper(DepartmentMapper.class).find(dept, 0, 0);
+		return departmentList;
+	}
+	
+	/**
+	 * 一般查询
+	 * 可查询某节点详情
+	 * 可查询某节点下的子节点
+	 * */
+	@Override
+	public List<Department> doQueryWeb(Department dept) {
+		dept.setDel(false);
+		return this.getMapper(DepartmentMapper.class).findWithCondition(dept, null, " name ", 0, 0);
+	}
+
+	/**
+	 * 新增
+	 * 考虑到子部门下可能存在相同的名称
+	 * */
+	public Department doAddWeb(Department t) throws Exception {
+		if (t==null) return null;
+		String id=new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + RandomCreate(3);
+		t.setId(id);
+		t.setCreate_time(new Date());
+		t.setCreate_man((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+		this.getMapper(DepartmentMapper.class).insert(t);
+		return t;
+	}
+	
+	/**
+	 * 修改
+	 * 修改不能将其状态进行修改
+	 * */
+	@Override
+	public Department doUpdateWeb(Department t) throws Exception {
+		if (t==null) return null;
+		t.setDel(false);
+		t.setUpdate_time(new Date());
+		t.setUpdate_man((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+		this.getMapper(DepartmentMapper.class).update(t);
+		return t;
+	}
+	
+	/**
+	 * 删除
+	 * 逻辑删除
+	 * */
+	@Override
+	public Department doDeleteWeb(Department t) throws Exception {
+		t.setUpdate_man((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+		this.getMapper(DepartmentMapper.class).doDelete(t);
+		return t;
+	}
+
+	/**
+	 * 验证是否重名
+	 * 预留,实际上由于厂里许多部门都是重名的
+	 * */
+	@Override
+	public boolean validateName(String name) {
+		return !this.getMapper(DepartmentMapper.class).isNameExist(name);
+	}
+	 
+}

+ 192 - 0
src/main/java/com/hnshituo/core/auth/service/impl/FunctionServiceImpl.java

@@ -0,0 +1,192 @@
+package com.hnshituo.core.auth.service.impl;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import market.Com.vo.ResultModel;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.mapper.FunctionMapper;
+import com.hnshituo.core.auth.service.FunctionService;
+import com.hnshituo.core.auth.service.HomeService;
+import com.hnshituo.core.auth.vo.Function;
+
+/**
+ * @author pq
+ * 
+ * TODO: 级联删除
+ *
+ */
+@RemoteService(path="core/auth/function")
+public class FunctionServiceImpl extends BaseServiceImpl<Function, Integer> implements FunctionService {
+
+	@RemoteService(path="tree")
+	public List<Function> findTreeAll() {
+		List<Function> all = this.getMapper(FunctionMapper.class).findWithCondition(null, null, "ID", 0, 0);
+		return findByPid(all, null);
+	}
+
+	/**
+	 * 获取不含按钮的界面
+	 * 用于activiti配置界面与流程关联
+	 * */
+	@RemoteService(path="activitiMenu")
+	public List<Function> findActCmbTreeDb() throws Exception {
+		//TODO 权限控制
+		List<Function> all = this.getMapper(FunctionMapper.class).findWithCondition(null, " VISIBLE = 0 AND TYPE = 0 ", " SEQ ", 0, 0);
+		return findByPid(all, 1);
+	}
+
+	@RemoteService(path="tree4Prv")
+	public List<Function> findTreeByRoleId(Integer roleId) {
+		if (roleId==null || roleId==0) return findTreeAll();
+		List<Function> all = this.getMapper(FunctionMapper.class).findTree4Prv(roleId);
+		return findByPid(all, null);
+	}
+
+	/**
+	 * 递归菜单数据,输出树形数据对象
+	 * @param all
+	 * @param pid
+	 * @return
+	 */
+	private List<Function> findByPid(List<Function> all, Integer pid) {
+		List<Function> list = null;
+		for (Function func : all) {
+			if (pid == null && func.getPid() == null) {
+				if (list == null) list = new ArrayList<Function>();
+				list.add(func);
+			} else if (pid != null && pid.equals(func.getPid())) {
+				if (list == null) list = new ArrayList<Function>();
+				list.add(func);
+			}
+		}
+		if (list != null) {
+			for (Function func : list) {
+				func.setChildren(findByPid(all, func.getId()));
+			}
+		}
+		return list;
+	}
+
+	public List<Function> findFunctions(Integer pid) {
+		Function func = new Function();
+		func.setPid(pid);
+		func.setType(1);
+		func.setVisible(0);
+		return this.getMapper(FunctionMapper.class).findWithCondition(func, null, "SEQ", 0, 0);
+	}
+
+	/*public List<Function> findFunctions() {
+		Function func = new Function();
+		func.setType(1);
+		return this.getMapper(FunctionMapper.class).find(func, 0, 0);
+	}*/
+
+	public List<Function> findByPid(Integer pid) {
+		Function func = new Function();
+		func.setPid(pid);
+		return this.getMapper(FunctionMapper.class).find(func, 0, 0);
+	}
+
+	/**
+	 * 新增
+	 * */
+	public ResultModel doAdd(Function t) throws Exception {
+		ResultModel rm=new ResultModel();
+		t.setCreateTime(new Date());
+		t.setCreateMan((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+		//oracle无自动递增
+		int count=this.getMapper(FunctionMapper.class).findMaxId();
+		t.setId(count+1);
+		super.insert(t);
+		rm.setState("200");
+		rm.setData(t);
+		return rm;
+	}
+
+	/**
+	 * 删除
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doDelete(Integer id) throws Exception {
+		ResultModel rm=new ResultModel();
+		try{
+			List<Function> list = this.findByPid(id);
+			for (Function function : list) {
+				delete(function.getId());
+			}
+			super.delete(id);
+			rm.setState("200");
+		}catch(Exception e){
+			rm.setState("500");
+			throw e;
+		}
+		return rm;
+	}
+
+	public Function modify(Function t) throws Exception {
+		t.setUpdateTime(new Date());
+		t.setUpdateMan((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+		super.update(t);
+		return t;
+	}
+
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public void dragMenu(int id, int pid, int[] ids) {
+		Function function = new Function();
+		function.setId(id);
+		function.setPid(pid);
+		this.getMapper(FunctionMapper.class).update(function);
+		reordering(ids);
+	}
+
+	public void reordering(int[] ids) {
+		for (int i = 0; i < ids.length; i++) {
+			//int id = ids[i];
+			Function function = new Function();
+			function.setId(ids[i]);
+			function.setSeq(i + 1);
+			this.getMapper(FunctionMapper.class).update(function);
+		}
+	}
+
+	public boolean hasFunction(String url) {
+		Function function = new Function();
+		function.setUrl(url);
+		int count = this.getMapper(FunctionMapper.class).count(function);
+		if (count > 0) return true;
+		return false;
+	}
+
+	@Override
+	public boolean isOpenDataPrg(String url) throws Exception {
+		Function function = new Function();
+		function.setUrl(url);
+		function.setDataPrg(1);
+		int count = this.getMapper(FunctionMapper.class).count(function);
+		if (count > 0) return true;
+		return false;
+	}
+
+	public String getDataPrgField(String url) throws Exception {
+		Function function = new Function();
+		function.setUrl(url);
+		function.setDataPrg(1);
+		List<Function> funcs = this.getMapper(FunctionMapper.class).find(function, 0, 0);
+		if (funcs != null) {
+			for (Function func : funcs) {
+				if (StringUtils.isNotEmpty(func.getDataPrgField())) {
+					return func.getDataPrgField();
+				}
+			}
+		}
+		return null;
+	}
+
+}

+ 253 - 0
src/main/java/com/hnshituo/core/auth/service/impl/HomeServiceImpl.java

@@ -0,0 +1,253 @@
+package com.hnshituo.core.auth.service.impl;
+
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+
+import org.apache.log4j.Logger;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.basic.util.DataEncoder;
+import com.hnshituo.core.auth.mapper.FunctionMapper;
+import com.hnshituo.core.auth.mapper.RoleMapper;
+import com.hnshituo.core.auth.mapper.UserMapper;
+import com.hnshituo.core.auth.service.FunctionService;
+import com.hnshituo.core.auth.service.HomeService;
+import com.hnshituo.core.auth.service.UserService;
+import com.hnshituo.core.auth.vo.Function;
+import com.hnshituo.core.auth.vo.User;
+import com.hnshituo.core.auth.vo.UserLogin;
+
+@RemoteService(path="core/home")
+public class HomeServiceImpl extends BaseServiceImpl implements HomeService {
+	
+	//获取日志记录器Logger,名字为本类类名
+    private static Logger log = Logger.getLogger(HomeServiceImpl.class);
+	/**
+	 * 用户登录WEB(用对象传参)
+	 */ 
+	public ResultModel login4Web(CommonPage<User> sum) throws Exception {
+		User in_user=sum.getObject();
+		ResultModel rm=new ResultModel();
+		rm.setState("200");
+		String secret=DataEncoder.shaEncode(in_user.getPassword());
+		User user = this.getMapper(UserMapper.class).login(in_user,secret);
+		if (user == null) {
+			rm.setState("500");
+			rm.setMsgInfo("用户名或密码错误");
+			return rm;
+		}
+		if("0".equals(user.getValid_flag())){
+			rm.setState("500");
+			rm.setMsgInfo("该账号已停用");
+			return rm;
+		}
+		
+		this.getSession().setAttribute(SESSION_USER_ID, user.getId());
+		this.getSession().setAttribute(SESSION_USER_NAME, user.getUsername());
+		this.getSession().setAttribute(SESSION_DEPT_ID, user.getDept_id());
+		this.getSession().setAttribute(SESSION_DEPT_NAME, user.getDept_name());
+		this.getSession().setAttribute(SESSION_WORK_ORD, in_user.getWrk_ord());
+		this.getSession().setAttribute(SESSION_WORK_GRP, in_user.getWrk_grp());
+		this.getSession().setAttribute(SESSION_WORK_TIME, in_user.getWrk_date());
+		
+
+		user.setImage(null);
+		user.setPassword(in_user.getPassword());
+		this.getSession().setAttribute(SESSION_USER, user);
+
+		Boolean isAdmin=this.getMapper(RoleMapper.class).isAdmin(in_user.getId())==0?false:true;
+		this.getSession().setAttribute(SESSION_ISADMIN, isAdmin);
+
+		List<Function> funcs = findFuncByPrv();
+		if (funcs != null) {
+			Map<String, Function> funcsMap = new HashMap<String, Function>();
+			for (Function function : funcs) {
+				funcsMap.put(function.getUrl(), function);
+			}
+			this.getSession().setAttribute(SESSION_FUNC_PRV, funcsMap);
+		}
+		user.setPassword(null);
+		rm.setData(user);
+		
+		User u=new User();
+		u.setId(in_user.getId());
+		u.setLogin_time(new Date());
+//		u.setWrk_grp(in_user.getWrk_grp());
+//		u.setWrk_ord(in_user.getWrk_ord());
+		this.getMapper(UserMapper.class).update(u);
+		
+		//记录登录时间
+		UserLogin login=new UserLogin();
+		login.setLogin_name(user.getId());
+		login.setUsername(user.getUsername());
+		login.setDept_id(user.getDept_id());
+		login.setDept_name(user.getDept_name());
+		this.getBean(UserLoginServiceImpl.class).doAdd(login);
+		
+		return rm;
+	}
+	
+	/**
+	 *获取SSO系统的登录信息
+	 */ 
+	public ResultModel getUserInfoBySso(User user) throws Exception {
+		ResultModel rm=new ResultModel();
+		//User in_user=sum.getObject();
+//		ResultModel rm=new ResultModel();
+//		rm.setState("200");
+//		String secret=DataEncoder.shaEncode(in_user.getPassword());
+//		User user = this.getMapper(UserMapper.class).login(in_user,secret);
+		if (user == null) {
+			rm.setState("500");
+			rm.setErrorInfo("用户名或密码错误");
+			return rm;
+		}
+//		if("0".equals(user.getValid_flag())){
+//			rm.setState("500");
+//			rm.setMsgInfo("该账号已停用");
+//			return rm;
+//		}
+		log.debug("User对象:"+user);
+		this.getSession().setAttribute(SESSION_USER_ID, user.getId());
+		this.getSession().setAttribute(SESSION_USER_NAME, user.getUsername());
+		this.getSession().setAttribute(SESSION_DEPT_ID, user.getDept_id());
+		this.getSession().setAttribute(SESSION_DEPT_NAME, user.getDept_name());
+		this.getSession().setAttribute(SESSION_WORK_ORD, user.getWrk_ord());
+		this.getSession().setAttribute(SESSION_WORK_GRP, user.getWrk_grp());
+		this.getSession().setAttribute(SESSION_WORK_TIME, user.getWrk_date());
+		
+		String wrk_ord = (String) this.getSession().getAttribute(HomeService.SESSION_WORK_ORD);
+		String user_name = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		String wrk_grp = (String) this.getSession().getAttribute(HomeService.SESSION_WORK_GRP);
+		String wrk_date = (String) this.getSession().getAttribute(HomeService.SESSION_WORK_TIME);
+		log.debug("wrk_ord:"+wrk_ord);
+		log.debug("user_name:"+user_name);
+		log.debug("wrk_grp:"+wrk_grp);
+		log.debug("wrk_date:"+wrk_date);
+		log.debug(">>>>>>>>>>>>>>>>>>>>");
+
+		user.setImage(null);
+		user.setPassword(user.getPassword());
+		this.getSession().setAttribute(SESSION_USER, user);
+
+		Boolean isAdmin=this.getMapper(RoleMapper.class).isAdmin(user.getId())==0?false:true;
+		this.getSession().setAttribute(SESSION_ISADMIN, isAdmin);
+
+		List<Function> funcs = findFuncByPrv();
+		if (funcs != null) {
+			Map<String, Function> funcsMap = new HashMap<String, Function>();
+			for (Function function : funcs) {
+				funcsMap.put(function.getUrl(), function);
+			}
+			this.getSession().setAttribute(SESSION_FUNC_PRV, funcsMap);
+		}
+		user.setPassword(null);
+		rm.setData(user);
+		
+		User u=new User();
+		u.setId(user.getId());
+		u.setLogin_time(new Date());
+//		u.setWrk_grp(in_user.getWrk_grp());
+//		u.setWrk_ord(in_user.getWrk_ord());
+		this.getMapper(UserMapper.class).update(u);
+		
+		//记录登录时间
+		UserLogin login=new UserLogin();
+		login.setLogin_name(user.getId());
+		login.setUsername(user.getUsername());
+		login.setDept_id(user.getDept_id());
+		login.setDept_name(user.getDept_name());
+		this.getBean(UserLoginServiceImpl.class).doAdd(login);
+		
+		rm.setState("200");
+		return rm;
+	}
+	
+	
+	
+	
+	/**
+	 * 获取用户权限
+	 * */
+	@RemoteService(path="button")
+	public List<Function> findFuncByPrv() throws Exception {
+		String userId = this.getSession().getAttribute(HomeService.SESSION_USER_ID).toString();
+		List<Function> funcs = null;
+		if (userId.equals("admin")) {
+			funcs = this.getMapper(FunctionMapper.class).findWithCondition(null, "VISIBLE = 0 AND TYPE = 1", "SEQ", 0, 0);
+		} else {
+			User user = this.getBean(UserService.class).findById(userId);
+			if (user == null || user.getRoles() == null || user.getRoles().size() < 1) return null;
+			if(user.getRoles().size()>0&&user.getRoles().get(0).getId()==null) return null;
+			funcs = this.getMapper(FunctionMapper.class).findFuncByRoles(user.getRoles());
+		}
+		return funcs;
+	}
+
+	
+	/**
+	 * 用户退出登录
+	 */ 
+	@RemoteService(path="exit")
+	public ResultModel Exit() throws Exception {
+		ResultModel rm=new ResultModel();
+		Enumeration em = this.getSession().getAttributeNames();
+		while(em.hasMoreElements()){
+			this.getRequest().getSession().removeAttribute(em.nextElement().toString());
+		}
+		rm.setState("200");
+		return rm;		
+	}
+
+	/**
+	 * 显示内网地址
+	 * */
+	public String ipAddress() {
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+		String ip = request.getHeader("X-Forwarded-For");
+		if (null == ip || 0 == ip.length() || "UNKNOWN".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("Proxy-Client-IP");
+		}
+		if (null == ip || 0 == ip.length() || "UNKNOWN".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (null == ip || 0 == ip.length() || "UNKNOWN".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("X-Real-IP");
+		}
+		if (null == ip || 0 == ip.length() || "UNKNOWN".equalsIgnoreCase(ip)) {
+			ip = request.getRemoteAddr();
+		}
+		if(ip != null) {
+			return ip.split(",")[0];
+		}else{
+			return ip;
+		}
+	}
+
+	public boolean hasPermission(String url) throws Exception {
+		//如果该功能不受权限权限控制,返回true
+		//TODO 该功能需优化。每次请求都会检查数据库,是否存在受管制的URL,较为费时,有性能优化空间
+		boolean isExist = false;
+		isExist = this.getBean(FunctionService.class).hasFunction(url);
+		if (!isExist) return true; 
+
+		Map<String, Function> funcs = (Map<String, Function>) this.getSession().getAttribute(HomeService.SESSION_FUNC_PRV);
+		if (funcs!=null && funcs.size()>0) {
+			if (funcs.containsKey(url)) {
+				return true;
+			}
+		}
+		return false;
+	}
+}

+ 49 - 0
src/main/java/com/hnshituo/core/auth/service/impl/PrivilegeServiceImpl.java

@@ -0,0 +1,49 @@
+package com.hnshituo.core.auth.service.impl;
+
+import java.util.List;
+
+import market.Com.vo.ResultModel;
+
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.mapper.PrivilegeMapper;
+import com.hnshituo.core.auth.service.PrivilegeService;
+import com.hnshituo.core.auth.vo.Function;
+import com.hnshituo.core.auth.vo.Privilege;
+
+@RemoteService(path="core/auth/privilege")
+public class PrivilegeServiceImpl extends BaseServiceImpl<Privilege, Integer> implements PrivilegeService {
+
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel save(int roleId, List<Function> funcs) {
+		ResultModel rm=new ResultModel();
+		deleteByRoleId(roleId);
+		if(funcs!=null&&funcs.size()>0){
+			for(Function functions:funcs){
+				Privilege privilege=new Privilege();
+				privilege.setRoleId(roleId);
+				privilege.setFuncId(functions.getId());
+				privilege.setType(0);
+				this.getMapper(PrivilegeMapper.class).doAdd(privilege);
+			}
+		}
+//			this.getMapper(PrivilegeMapper.class).insertWithFuncs(roleId, funcs);
+		rm.setState("200");
+		return rm;
+	}
+	
+	/*@RemoteService(path="save2")
+	public void saveWithFuncIds(int roleId, String[] funcIds) {
+		
+	}*/
+	
+	public Integer[] getByRoleId(int roleId) {
+		return this.getMapper(PrivilegeMapper.class).getPrivilegeByRoleId(roleId);
+	}
+	
+	public void deleteByRoleId(int roleId) {
+		this.getMapper(PrivilegeMapper.class).deleteByRoleId(roleId);
+	}
+}

+ 100 - 0
src/main/java/com/hnshituo/core/auth/service/impl/RoleServiceImpl.java

@@ -0,0 +1,100 @@
+package com.hnshituo.core.auth.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.mapper.RoleMapper;
+import com.hnshituo.core.auth.service.HomeService;
+import com.hnshituo.core.auth.service.PrivilegeService;
+import com.hnshituo.core.auth.service.RoleService;
+import com.hnshituo.core.auth.service.UserRoleService;
+import com.hnshituo.core.auth.vo.Role;
+
+@RemoteService(path="core/auth/role")
+public class RoleServiceImpl extends BaseServiceImpl<Role, Integer> implements RoleService {
+
+	public List<Role> query(Role t) {
+		t = (t==null) ? new Role() : t;
+		StringBuilder condition = new StringBuilder();
+		if (StringUtils.isNotEmpty(t.getName())) {
+			condition.append(" NAME LIKE '%" + t.getName() + "%'");
+		}
+		/*String[] dataPrgs = (String[]) this.getRequest().getAttribute(HomeService.REQUEST_DATA_PRG);
+		if (dataPrgs != null) {
+			String deptIdCondition = super.getDataPrgCondition("CREATE_DEPT_ID", dataPrgs);
+			if (deptIdCondition.length() > 0) {
+				condition.append(" AND ").append(deptIdCondition);
+			} else {
+				return null;
+			}
+		}*/
+		return this.getMapper(RoleMapper.class).findWithCondition(null, condition.toString(), "name" , 0, 0);
+	}
+	
+	public List<Role> findByName(String name) {
+		List<Role> list = this.getMapper(RoleMapper.class).findByName(name);
+		return list;
+	}
+	
+	public Role add(Role t) throws Exception {
+		if (t== null) return null;
+		int count=this.getMapper(RoleMapper.class).findMaxId();
+		t.setId(count+1);
+		t.setCreateTime(new Date());
+		t.setCreateMan((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+		super.insert(t);
+		return t;
+	}
+	
+	public Role modify(Role t) throws Exception {
+		if (t== null) return null;
+		t.setUpdateTime(new Date());
+		t.setUpdateMan((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+		super.update(t);
+		return t;
+	}
+
+	
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public void doDelete(Integer id) throws Exception {
+		this.getBean(PrivilegeService.class).deleteByRoleId(id);
+		this.getBean(UserRoleService.class).deleteByRoleId(id);
+		super.delete(id);
+	}
+	
+	
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	@RemoteService(path="save")
+	public void saveDataPrg(int roleId, String url, String[] departmentIds) throws Exception {
+		this.deleteByRoleIdAndFuncId(roleId, url);
+		if (departmentIds != null && departmentIds.length > 0) {
+			this.getMapper(RoleMapper.class).insertDataPrg(roleId, url, departmentIds);
+		}
+	}
+	
+	public void deleteByRoleIdAndFuncId(int roleId, String url) throws Exception {
+		this.getMapper(RoleMapper.class).deleteDataPrgByRoleIdAndFuncId(roleId, url);
+	}
+	
+	public boolean hasWholeDataPrg(String userId) throws Exception {
+		return this.getMapper(RoleMapper.class).hasWholeDataPrg(userId);
+	}
+	
+	public String[] getDataPrg(String userId, String url) throws Exception {
+		//如果拥有全局数据权限,则查url为空的数据权限
+		url = this.hasWholeDataPrg(userId) ? "" : url;
+		String[] dataPrgs = this.getMapper(RoleMapper.class).getDataPrg(userId, url);
+		return dataPrgs;
+	}
+
+	public Role doQueryById(Integer roleId) {
+		Role role=this.getMapper(RoleMapper.class).findById(roleId);
+		return role;
+	}
+	
+}

+ 162 - 0
src/main/java/com/hnshituo/core/auth/service/impl/UserGroupServiceImpl.java

@@ -0,0 +1,162 @@
+package com.hnshituo.core.auth.service.impl;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.UserGroupService;
+import com.hnshituo.core.auth.vo.UserGroup;
+
+@RemoteService(path = "UserGroup")
+public class UserGroupServiceImpl extends BaseServiceImpl<UserGroup, Object>
+		implements UserGroupService {
+//	private Logger logger = Logger.getLogger(UserGroupServiceImpl.class);
+//
+//	// 新增用户分组
+//	public ResultModel doAdd(UserGroup group) {
+//		ResultModel rm = new ResultModel();
+//		String id = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + PbMethod.RandomCreate(3);
+//		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+//		String departmentNo = (String) this.getSession().getAttribute(HomeService.SESSION_DEPT_ID);
+//		String departmentName = (String) this.getSession().getAttribute(HomeService.SESSION_DEPT_NAME);
+//		group.setGroup_id(id);
+//		group.setDepartment_no(departmentNo);
+//		group.setDepartment_name(departmentName);
+//		group.setCreat_man(userName);
+//		group.setCreat_time(new Date());
+//		try {
+//			this.getMapper(UserGroupMapper.class).insert(group);
+//			rm.setState("200");
+//		} catch (Exception e) {
+//			rm.setState("500");
+//			logger.error("insert with a exception!");
+//		}
+//		return rm;
+//	}
+//
+//	// 返回用户分组详情
+//	public UserGroup doQuery(String groupId) {
+//		return this.getMapper(UserGroupMapper.class).findById(groupId);
+//	}
+//
+//	// 修改用户分组信息表
+//	public ResultModel doUpdate(UserGroup group) {
+//		ResultModel rm = new ResultModel();
+//		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+//		group.setUpdate_name(userName);
+//		group.setUpdate_time(new Date());
+//		try {
+//			this.getMapper(UserGroupMapper.class).update(group);
+//			rm.setState("200");
+//		} catch (Exception e) {
+//			rm.setState("500");
+//			logger.error("update with a exception!");
+//		}
+//		return rm;
+//
+//	}
+//	
+//	//=========================================web=======================================
+//	//返回所有的分组
+//	public ResultModel doQueryAllWeb(CommonPage<UserGroup> sum){
+//		int pageIndex = sum.getPageIndex();
+//		int pageSize = sum.getPageSize();
+//		ResultModel rm = new ResultModel();
+//		List<UserGroup> list = new ArrayList<UserGroup>();
+//		PageModel<UserGroup> pm=new PageModel<UserGroup>(pageIndex, pageSize);
+//		int count = 0;
+//		try{
+//			list = this.getMapper(UserGroupMapper.class).find(null, (pageIndex-1)*pageSize, pageSize);
+//			if(list.size() > 0){
+//				for(UserGroup userGroup : list){
+//					if(null != userGroup.getGroup_person_no()){
+//						User u=this.getMapper(UserMapper.class).findById(userGroup.getGroup_person_no());
+//						userGroup.setGroup_person_logo(u.getLogo());
+//						userGroup.setGroup_person_deptId(u.getDept_id());
+//						userGroup.setGroup_person_deptName(u.getDept_name());
+//					}
+//				}
+//			}
+//			count = this.getMapper(UserGroupMapper.class).count(null);
+//			pm.setRows(list);
+//			pm.setTotal(count);
+//			rm.setData(pm);
+//			rm.setState("200");
+//		}catch(Exception e){
+//			rm.setState("500");
+//		}
+//		return rm;
+//	}
+//		
+//
+//	// 新增用户分组
+//	public ResultModel doAddWeb(UserGroup group) {
+//		ResultModel rm = new ResultModel();
+//		String id = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + PbMethod.RandomCreate(3);
+//		String departmentNo = (String) this.getSession().getAttribute(HomeService.SESSION_DEPT_ID);
+//		String departmentName = (String) this.getSession().getAttribute(HomeService.SESSION_DEPT_NAME);
+//		group.setGroup_id(id);
+//		group.setDepartment_no(departmentNo);
+//		group.setDepartment_name(departmentName);
+//		group.setCreat_time(new Date());
+//		try {
+//			this.getMapper(UserGroupMapper.class).insert(group);
+//			rm.setData(group);
+//			rm.setState("200");
+//		} catch (Exception e) {
+//			rm.setState("500");
+//			logger.error("insert with a exception!");
+//		}
+//		return rm;
+//	}
+//
+//	// 返回用户分组详情
+//	public UserGroup doQueryWeb(String groupId) {
+//		return this.getMapper(UserGroupMapper.class).findById(groupId);
+//	}
+//
+//	// 修改用户分组信息表
+//	public ResultModel doUpdateWeb(UserGroup group) {
+//		ResultModel rm = new ResultModel();
+//		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+//		group.setUpdate_name(userName);
+//		group.setUpdate_time(new Date());
+//		try {
+//			this.getMapper(UserGroupMapper.class).update(group);
+//			rm.setState("200");
+//		} catch (Exception e) {
+//			rm.setState("500");
+//			logger.error("update with a exception!");
+//		}
+//		return rm;
+//	}
+//	
+//	//删除群组
+//	public ResultModel doDeleteGroup(UserGroup group){
+//		ResultModel rm = new ResultModel();
+//		String groupId = group.getGroup_id();
+//		if(null == groupId || groupId.isEmpty()){
+//			rm.setMsgInfo("群组ID为空");
+//			rm.setState("500");
+//		}else{
+//			try{
+//				//删除群组
+//				this.getMapper(UserGroupMapper.class).delete(groupId);
+//
+//				//删除群组成员
+//				UsersGroup usersGroup = new UsersGroup();
+//				usersGroup.setGroupId(groupId);
+//				List<UsersGroup> usersList = this.getMapper(UsersGroupMapper.class).find(usersGroup, 0, 0);
+//				if(usersList.size() > 0){
+//					for(UsersGroup users : usersList){
+//						if(users.getId() != null){
+//							this.getMapper(UsersGroupMapper.class).delete(users.getId());
+//						}
+//					}
+//				}
+//				rm.setState("200");
+//			}catch(Exception e){
+//				rm.setState("500");
+//			}
+//		}
+//		return rm;
+//	}
+}

+ 297 - 0
src/main/java/com/hnshituo/core/auth/service/impl/UserLoginServiceImpl.java

@@ -0,0 +1,297 @@
+package com.hnshituo.core.auth.service.impl;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import market.Com.pb.PbMethod;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.service.support.PageModel;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.mapper.UserLoginMapper;
+import com.hnshituo.core.auth.mapper.UserMapper;
+import com.hnshituo.core.auth.service.UserLoginService;
+import com.hnshituo.core.auth.vo.User;
+import com.hnshituo.core.auth.vo.UserLogin;
+
+@RemoteService(path = "UserLoginService")
+public class UserLoginServiceImpl extends BaseServiceImpl<UserLogin, Object>	implements UserLoginService {
+
+	/**
+	 * 查询
+	 * */
+	public ResultModel doQueryWeb(CommonPage<UserLogin> sum){
+		ResultModel rm=new ResultModel();
+		UserLogin login=sum.getObject();
+		if(login==null) login=new UserLogin();
+		String startTime=sum.getStartTime();
+		String endTime=sum.getEndTime();
+		int pageIndex=sum.getPageIndex();
+		int pageSize=sum.getPageSize();
+		PageModel<UserLogin> pm=new PageModel<UserLogin>(pageIndex, pageSize);
+		try{
+			List<UserLogin> loginList=this.getMapper(UserLoginMapper.class).doQuery(login,startTime,endTime,(pageIndex-1)*pageSize,pageSize*pageIndex);
+			int count=this.getMapper(UserLoginMapper.class).doQueryCount(login,startTime,endTime);
+			pm.setRows(loginList);
+			pm.setTotal(count);
+			rm.setData(pm);
+			rm.setState("200");
+		}catch(Exception e){
+			rm.setState("500");
+			rm.setMsgInfo("查询失败");
+			e.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * 报表
+	 * */
+	public ResultModel doQueryCensusWeb(CommonPage<UserLogin> sum){
+		ResultModel rm=new ResultModel();
+		UserLogin login=sum.getObject();
+		if(login==null) login=new UserLogin();
+		String startTime=sum.getStartTime();
+		String endTime=sum.getEndTime();
+		int pageIndex=sum.getPageIndex();
+		int pageSize=sum.getPageSize();
+		String flag=sum.getMemo1();		
+		PageModel<UserLogin> pm=new PageModel<UserLogin>(pageIndex, pageSize);
+		try{
+			int pre_pageSize=0;
+			//			if("1".equals(flag)){
+			pre_pageSize=pageSize;
+			pageSize=0;
+			//			}
+			if(endTime!=null)
+				endTime+=" 23:59:59";
+			List<UserLogin> loginList=this.getMapper(UserLoginMapper.class).doQueryCensus(login,startTime,endTime);
+			List<UserLogin> personList=this.getMapper(UserLoginMapper.class).doQueryPerson(login,startTime,endTime,(pageIndex-1)*pageSize,pageIndex*pageSize);
+			int total=this.getMapper(UserLoginMapper.class).doQueryPersonCount(login,startTime,endTime);
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+			long twoTime = 2*24*60*60*1000; //获取2天的毫秒数
+			GregorianCalendar gc = new GregorianCalendar(); 
+			for(UserLogin persons:personList){		//人员列表
+				int count=0;		//异常次数2天
+				String firstLogin="";
+				boolean in=true;
+				Date sTime=null;
+				Date eTime=null;
+				int eva=0;
+				int seven=0;
+				for(UserLogin ur:loginList){
+					if(ur.getLogin_name().equals(persons.getLogin_name())){
+						seven++;
+						long time= sdf.parse(ur.getCheck_time()).getTime();
+						long times = time - twoTime;
+						Date date=new Date(times); 	//将毫秒数转日期
+						gc.setTime(date); 
+						String startDate=sdf.format(gc.getTime()); //两天前的日期
+						String endDate=ur.getCheck_time();
+						List<UserLogin> checkList=this.getMapper(UserLoginMapper.class).doQueryCensus(persons, startDate, endDate);
+						if(checkList.size()==0)		//2天异常次数
+							count++;
+						firstLogin=endDate;
+						//最长未登录
+						if(in){
+							sTime=sdf.parse(ur.getCheck_time());
+							in=false;
+						}else{
+							eTime=sdf.parse(ur.getCheck_time());		//计算两个时间差
+							int cha = (int) ((sTime.getTime() - eTime.getTime()) / (1000*3600*24));
+							if(cha>eva)
+								eva=cha;		
+							sTime=eTime;
+						}
+					}
+				}
+				List<UserLogin> checkList=this.getMapper(UserLoginMapper.class).doQueryCensus(persons, null, firstLogin);
+				if(checkList.size()==0)			//如果是第一次登录该系统,则减一次异常
+					count--;
+				//判断选择的时间段内
+				long time= sdf.parse(endTime).getTime();
+				long times = time - twoTime;
+				Date date=new Date(times); 	//将毫秒数转日期
+				gc.setTime(date); 
+				String startDate=sdf.format(gc.getTime()); //两天前的日期
+				List<UserLogin> checkList2=this.getMapper(UserLoginMapper.class).doQueryCensus(persons, startDate, endTime);
+				if(checkList2.size()==0)			//未登录过
+					count++;
+				persons.setCount(count);
+				if(eTime==null&&startTime!=null){
+					eTime=sdf.parse(startTime);
+					int cha = (int) ((sTime.getTime() - eTime.getTime()) / (1000*3600*24));
+					if(cha>eva)
+						eva=cha;		
+					sTime=eTime;
+				}
+				if(eTime!=null&&startTime!=null){
+					sTime=sdf.parse(startTime);
+					eTime=sdf.parse(endTime);
+					int cnm = (int) ((eTime.getTime() - sTime.getTime()) / (1000*3600*24));
+					int cao=cnm-seven;
+					cao++;
+					if(cao<0) cao=0;
+					persons.setSeven_count(cao);
+				}
+				persons.setLong_count(eva);
+			}
+			if("1".equals(flag)){
+				personList=doOrder(personList, flag);
+			}
+			if("".equals(login.getDept_id())&&"".equals(login.getLogin_name())&&"".equals(login.getUsername()))
+				personList=doAddUser(personList,startTime,endTime);
+			List<UserLogin> list = new ArrayList<UserLogin>();
+			int startSize=(pageIndex-1)*pre_pageSize;
+			int endSize=pageIndex*pre_pageSize;
+			if(pre_pageSize>personList.size()||endSize>personList.size())
+				endSize=personList.size();
+			for(int a=startSize;a<endSize;a++){
+				list.add(personList.get(a));
+			}
+			total=personList.size();
+			personList=list;
+
+			pm.setRows(personList);
+			pm.setTotal(total);
+			rm.setData(pm);
+			rm.setState("200");
+		}catch(Exception e){                                                                 
+			rm.setState("500");
+			rm.setMsgInfo("查询失败"+e.getMessage());
+			e.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * 个人详情
+	 * */
+	public ResultModel doQueryDetailWeb(CommonPage<UserLogin> sum){
+		ResultModel rm=new ResultModel();
+		UserLogin login=sum.getObject();
+		if(login==null) login=new UserLogin();
+		String startTime=sum.getStartTime();
+		String endTime=sum.getEndTime();
+		try{
+			endTime+=" 23:59:59";
+			List<UserLogin> list=new ArrayList<UserLogin>();
+			List<UserLogin> loginList=this.getMapper(UserLoginMapper.class).doQueryCensus(login,startTime,endTime);
+			if(startTime!=null&&endTime!=null&&loginList.size()>0){
+				SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
+				Date sTime=sdf.parse(startTime);
+				Date eTime=sdf.parse(endTime);
+				Calendar cal1 = Calendar.getInstance();
+				cal1.setTime(sTime);
+				Calendar cal2 = Calendar.getInstance();
+				cal2.setTime(eTime);
+				int sday= cal1.get(Calendar.DAY_OF_YEAR);
+				int eday= cal2.get(Calendar.DAY_OF_YEAR);
+				int eva=eday-sday;		//计算两个时间差
+				for(int v=0;v<=eva;v++){
+					boolean flag=true;
+					for(int a=loginList.size()-1;a>=0;a--){
+						cal2.set(Calendar.DATE,cal1.get(Calendar.DATE)+v);
+						if(sdf.format(cal2.getTime()).equals(loginList.get(a).getCheck_time())){		//如果有登录记录,插入list
+							list.add(loginList.get(a));
+							flag=false;
+						}
+					}
+					if(flag){		//如果没有登录记录,新建对象插入list
+						UserLogin ul=new UserLogin();
+						ul.setCheck_time(sdf.format(cal2.getTime()));
+						ul.setCount(0);
+						ul.setLogin_name(loginList.get(0).getLogin_name());
+						ul.setDept_id(loginList.get(0).getDept_id());
+						ul.setDept_name(loginList.get(0).getDept_name());
+						list.add(ul);
+					}
+				}
+			}
+			rm.setData(list);
+			rm.setState("200");
+		}catch(Exception e){                                                                 
+			rm.setState("500");
+			rm.setMsgInfo("查询失败"+e.getMessage());
+			e.printStackTrace();
+		}
+		return rm;
+	}
+
+	public ResultModel doAdd(UserLogin login){
+		ResultModel rm=new ResultModel();
+		try{
+			login.setSeq(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())+PbMethod.RandomCreate(3));
+			login.setLogin_time(new Date());
+			this.getMapper(UserLoginMapper.class).insert(login);
+			rm.setState("200");
+		}catch(Exception e){
+			rm.setState("500");
+		}
+		return rm;
+	}
+
+	//使用迟到次数进行排序
+	private List<UserLogin> doOrder(List<UserLogin> list,String order){
+		for(UserLogin ur:list){		// 1迟到多 2迟到少 3考勤多 4考勤少
+			switch(Integer.parseInt(order)){
+			case 1:
+				Collections.sort(list, new Comparator<UserLogin>(){
+					@Override  
+					public int compare(UserLogin o1, UserLogin o2){
+						int i = o2.getCount() - o1.getCount() ;  
+						if(i == 0){  
+							return o2.getCount() - o1.getCount();  
+						}  
+						return i;  
+					}
+				});  
+				break;
+			default:break;
+			}
+		}
+		return list;
+	}
+
+	public List<UserLogin> doAddUser(List<UserLogin> personList, String startTime, String endTime) throws ParseException{
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		List<User> userList=this.getMapper(UserMapper.class).findWithCondition(null, " valid_flag='1'", null,0,0);
+		Date sTime=null;
+		Date eTime=null;
+		int cha =0;
+		if(startTime!=null&&endTime!=null){
+			sTime=sdf.parse(startTime);
+			eTime=sdf.parse(endTime);
+			cha = (int) ((eTime.getTime() - sTime.getTime()) / (1000*3600*24));
+		}
+		for(User user:userList){
+			int in=0;
+			for(UserLogin urs:personList){
+				if(urs.getLogin_name().equals(user.getId()))
+					in++;
+			}
+			if(in==0){
+				UserLogin ur=new UserLogin();
+				ur.setLogin_name(user.getId());
+				ur.setUsername(user.getUsername());
+				ur.setDept_id(user.getDept_id());
+				ur.setDept_name(user.getDept_name());
+				ur.setLogin_in(false);
+				ur.setLong_count(cha);
+				ur.setSeven_count(cha);
+				ur.setCount(1);
+				personList.add(ur);
+			}
+		}
+		return personList;
+	}
+}

+ 80 - 0
src/main/java/com/hnshituo/core/auth/service/impl/UserRoleServiceImpl.java

@@ -0,0 +1,80 @@
+package com.hnshituo.core.auth.service.impl;
+
+import java.util.List;
+
+import market.Com.vo.ResultModel;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.mapper.UserRoleMapper;
+import com.hnshituo.core.auth.service.UserRoleService;
+import com.hnshituo.core.auth.vo.UserRole;
+
+@RemoteService(path = "UserRoleService")
+public class UserRoleServiceImpl extends BaseServiceImpl<UserRole, Integer> implements UserRoleService {
+	public List<UserRole> doQuery(UserRole userRole){
+		List<UserRole> list=this.getMapper(UserRoleMapper.class).doQuery(userRole.getUserId());
+		return list;
+	}
+
+	public List<UserRole> doQueryUser(String role) {
+		List<UserRole> list=this.getMapper(UserRoleMapper.class).doQueryUser(role);
+		return list;
+	}
+	//新增
+	public ResultModel doAdd(UserRole userRole){
+		ResultModel rm=new ResultModel();
+		try{
+//			int roleId = userRole.getRoleId();
+//			UserRole role = new UserRole();
+//			role.setRoleId(roleId);
+//			List<UserRole> roleList = this.getMapper(UserRoleMapper.class).find(role, 0, 0);
+//			if(roleList.size() > 0){
+//				for(UserRole ur : roleList){
+//					this.getMapper(UserRoleMapper.class).doDelete(ur);
+//				}
+//			}
+			
+				for(UserRole userRoles:userRole.getUserRoleList()){
+					if(userRoles.getRoleId()==null||"".equals(userRoles.getRoleId()))
+						userRoles.setRoleId(userRole.getRoleId());
+					if(this.getMapper(UserRoleMapper.class).count(userRoles) <= 0) {
+						int count =this.getMapper(UserRoleMapper.class).findMaxId();
+						userRoles.setId(count+1);
+						this.getMapper(UserRoleMapper.class).insert(userRoles);
+					}	
+			}
+//			User user = new User();
+//			String userId = (String) this.getSession().getAttribute(HomeService.SESSION_USER_ID);
+//			user.setId(userId);
+//			user.setUpdate_time(new Date());
+//			this.getMapper(UserMapper.class).update(user);
+			rm.setState("200");
+		}catch(Exception e){
+			rm.setState("500");
+			rm.setMsgInfo("新增失败"+e.getMessage());
+		}
+		return rm;
+	}
+
+	public ResultModel doDelete(UserRole userRole){
+		ResultModel rm=new ResultModel();
+		try{
+			this.getMapper(UserRoleMapper.class).doDelete(userRole);
+//			User user = new User();
+//			String userId = (String) this.getSession().getAttribute(HomeService.SESSION_USER_ID);
+//			user.setId(userId);
+//			user.setUpdate_time(new Date());
+//			this.getMapper(UserMapper.class).update(user);
+			rm.setState("200");
+		}catch(Exception e){
+			rm.setState("500");
+			rm.setMsgInfo("删除失败"+e.getMessage());
+		}
+		return rm;
+	}
+
+	public void deleteByRoleId(Integer roleId) {
+		this.getMapper(UserRoleMapper.class).deleteByRoleId(roleId);
+	}
+}

+ 549 - 0
src/main/java/com/hnshituo/core/auth/service/impl/UserServiceImpl.java

@@ -0,0 +1,549 @@
+package com.hnshituo.core.auth.service.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import market.Com.pb.SpeOptBaseService;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.service.support.PageModel;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.basic.util.DataEncoder;
+import com.hnshituo.core.auth.mapper.RoleMapper;
+import com.hnshituo.core.auth.mapper.UserInfoMapper;
+import com.hnshituo.core.auth.mapper.UserMapper;
+import com.hnshituo.core.auth.mapper.UserRoleMapper;
+import com.hnshituo.core.auth.service.HomeService;
+import com.hnshituo.core.auth.service.UserService;
+import com.hnshituo.core.auth.vo.Role;
+import com.hnshituo.core.auth.vo.User;
+import com.hnshituo.core.auth.vo.UserInfo;
+import com.hnshituo.core.auth.vo.UserRole;
+
+@RemoteService(path="core/auth/user")
+public class UserServiceImpl extends BaseServiceImpl<User, String> implements UserService {
+
+	private static Logger logger = Logger.getLogger(UserServiceImpl.class);
+
+	/**
+	 * 密码加密
+	 * */
+	public String encrypted(String inStr) throws Exception {
+		return DataEncoder.shaEncode(inStr);
+	}
+
+	/**
+	 * 获取当前登录人信息
+	 * */
+	@Override
+	@RemoteService(path="loginUser")
+	public User getLoginUser() throws Exception {
+		String userId = (String) this.getSession().getAttribute(HomeService.SESSION_USER_ID);
+		User user = super.findById(userId);
+		return user;
+	}
+
+	/**
+	 * 更新当前登陆用户的信息
+	 * */
+	@Override
+	@RemoteService(path="updateCurrent")
+	public User updateLoginUser(User user) throws Exception {
+		String userId = (String) this.getSession().getAttribute(HomeService.SESSION_USER_ID);
+		user.setId(userId);
+		this.update(user);
+		return this.findById(userId);
+	}
+
+	/**
+	 * 分页获取人员信息
+	 * */
+	public PageModel<User> findUserInfo(User user, int pageNumber, int pageSize) {
+		PageModel<User> pm = new PageModel<User>(pageNumber, pageSize);
+		user = (user == null) ? new User() : user;
+		StringBuilder sb = new StringBuilder(" 1=1 ");
+		if (StringUtils.isNotEmpty(user.getDept_id())) {
+			sb.append("AND DEPT_ID ='" + user.getDept_id() + "' ");
+		}
+
+		pm.setRows(this.getMapper(UserMapper.class).findWithCondition(null, sb.toString(), " CREATE_TIME DESC , UPDATE_TIME DESC ", (pageNumber - 1) * pageSize, pageSize));
+		pm.setTotal(this.getMapper(UserMapper.class).countWithCondition(null, sb.toString()));
+		return pm;
+	}
+
+	/**
+	 * 验证id是否重复
+	 * */
+	@Override
+	public boolean validateId(String id) {
+		return !this.getMapper(UserMapper.class).isIdExist(id);
+	}
+
+	/**
+	 * 验证登录名是否重复
+	 * */
+	@Override
+	public boolean validateLoginName(String loginName) {
+		return !this.getMapper(UserMapper.class).isLoginNameExist(loginName);
+	}
+
+	//	/**
+	//	 * 用户注册
+	//	 * */
+	//	@Override
+	//	@Transactional(value="tm", rollbackFor=Exception.class)
+	//	public void insert(User t) throws Exception {
+	//		try{
+	//			if (t==null) return;
+	//			t.setCreate_time(new Date());
+	//			t.setCreate_man((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+	//			t.setLogo(this.getBean(SpeOptBaseService.class).doAdd(t.getLogo()));
+	//			//-----------------------
+	//			super.insert(t);
+	//			this.getMapper(UserMapper.class).resetPassword(t.getId(), encrypted("123456"));
+	//			this.getMapper(RoleMapper.class).delRelationByUserId(t.getId());
+	//		}catch(Exception e){
+	//			return;
+	//		}
+	//		
+	//
+	//		if (t.getRoles() != null && t.getRoles().size() > 0)
+	//			this.getMapper(RoleMapper.class).insertUserRole2(t.getId(), t.getRoles());
+	//
+	//		//为用户设置token(RongCloud)
+	//		/*if(t.getId()!=null&&t.getUsername()!=null)
+	//			setToken(t.getId(),t.getUsername(),"");*/
+	//	}
+
+
+	/**
+	 * web用户注册
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel registerWeb(User t) throws Exception {
+		ResultModel rm = new ResultModel();
+		try{
+			if (t==null) {
+				rm.setState("500");
+				return rm;
+			}
+
+			t.setCreate_time(new Date());
+			t.setCreate_man((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+			if(t.getLogo()!=null&&!"".equals(t.getLogo()))
+				t.setLogo(this.getBean(SpeOptBaseService.class).doAdd(t.getLogo()));
+			//-----------------------
+			t.setPassword("123456");
+			t.setValid_flag("1");
+			super.insert(t);
+			this.getMapper(UserMapper.class).resetPassword(t.getId(), encrypted("123456"));
+			this.getMapper(RoleMapper.class).delRelationByUserId(t.getId());
+
+			rm.setData(t);
+			rm.setState("200");
+			if (t.getRoles() != null ){
+				for(Role roles:t.getRoles()){
+					UserRole ur=new UserRole();
+					ur.setRoleId(roles.getId());
+					ur.setUserId(t.getId());
+					int count=this.getMapper(UserRoleMapper.class).findMaxId();
+					ur.setId(count+1);
+					this.getMapper(UserRoleMapper.class).insert(ur);
+				}
+			}
+//				this.getMapper(RoleMapper.class).insertUserRole2(t.getId(), t.getRoles());
+		}catch(Exception e){
+			rm.setState("500");
+						if(e.getMessage().contains("LOGIN_NAME")||e.getMessage().contains("ID")){
+							rm.setMsgInfo("该用户名已存在");
+							return rm;
+						}
+			throw e;
+		}
+		//为用户设置token(RongCloud)
+		/*ResultModel result =  new ResultModel();
+		if(t.getId()!=null&&t.getUsername()!=null)
+			result = setToken(t.getId(),t.getUsername(),"");
+		if(result.getMsgInfo() != null){
+			rm.setMsgInfo(result.getMsgInfo());
+		}*/
+		return rm;
+	}
+
+	/**
+	 * 修改用户信息
+	 */
+	@Override
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public void update(User t) throws Exception {
+		try{
+			if (t==null || t.getId() == null) return;
+			t.setUpdate_time(new Date());
+			t.setUpdate_man((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+			super.update(t);
+			this.getMapper(RoleMapper.class).delRelationByUserId(t.getId());
+		}catch(Exception e){
+			return;
+		}
+
+		if (t.getRoles() != null && t.getRoles().size() > 0){
+			for(Role role:t.getRoles()){
+				int count=this.getMapper(UserRoleMapper.class).findMaxId()+1;
+				UserRole ur=new UserRole();
+				ur.setId(count);
+				ur.setUserId(t.getId());
+				ur.setRoleId(role.getId());
+				this.getMapper(UserRoleMapper.class).insert(ur);
+			}
+		}
+	}
+
+	/**
+	 * 前端界面查看用户个人信息操作
+	 * */
+	public List<User> userPersonInforApp(User t){
+		//if (t==null || t.getId() == null) return null;
+		List<User> userList = this.getMapper(UserMapper.class).findWithCondition(t,null, null, 0, 0);
+		return userList;
+	}
+
+	/**
+	 * 前端界面查看用户DEPT_ID
+	 * */
+	public List<User> findByUserDeptIdApp(User t) throws Exception{
+		return this.getMapper(UserMapper.class).findByUserIdApp(t.getId());
+	}
+
+	/**
+	 * 前端界面修改用户信息操作,仅修改用户的基本信息不含密码,权限,部门等数据
+	 * */
+	//	public void updateApp(User t) throws Exception {
+	//		if (t==null || t.getId() == null) return;
+	//		t.setUpdateTime(new Date());
+	//		t.setUpdateMan((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+	//		if(t.getAge()==null)
+	//			t.setAge(0);
+	//		List<String> ls=new ArrayList<String>();
+	//		ls.add(t.getLogo());
+	//		List<String> arr=speOptService.confirmUpload(ls);
+	//		if(arr.size()>0){
+	//			t.setLogo(arr.get(0));
+	//		}
+	//		super.update(t);
+	//	}
+	//	
+	/**
+	 * 前端界面修改用户信息操作,仅修改用户的基本信息不含密码,权限,部门等数据
+	 * */
+	public ResultModel updateApp(User t) throws Exception {
+		ResultModel rm = new ResultModel();
+		if (t==null || t.getId() == null) {
+			rm.setState("500");
+			rm.setMsgInfo("修改失败:Id不能为空");
+			return rm ;
+		}else{
+			t.setUpdate_time(new Date());
+			t.setUpdate_man((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+			if(t.getAge()==null)
+				t.setAge(0);
+			String true_path=this.getBean(SpeOptBaseService.class).doAdd(t.getLogo());
+			t.setLogo(true_path);
+			super.update(t);
+			rm.setState("200");
+			return rm;
+		}
+	}
+
+	/**
+	 * 前端界面获取所有用户信息(包括用户名,登录名,该用户所在组织ID,组织部门名称)
+	 * */
+	public List<User> allUserInfoApp(){
+		return this.getMapper(UserMapper.class).findWithCondition(null, null, null, 0, 0);
+	}
+
+	/**
+	 * 前端界面获取所有用户信息,不去查部门, 只带用户基本信息
+	 * */
+	public List<UserInfo> userInfoApp(){
+		List<UserInfo> list=this.getMapper(UserInfoMapper.class).findWithCondition(null, null, null, 0, 0);
+		for(UserInfo user:list){
+			UserRole userRole=new UserRole();
+			userRole.setUserId(user.getId());
+			List<UserRole> roleList=this.getBean(UserRoleServiceImpl.class).doQuery(userRole);
+			String position="";
+			for(UserRole roles:roleList){
+				Role role=this.getBean(RoleServiceImpl.class).doQueryById(roles.getRoleId());
+				if(role!=null)
+					position+=role.getName()+",";
+			}
+			if(!"".equals(position)){
+				position=position.substring(0, position.length()-1);
+				user.setPositions(position);
+			}
+		}
+		return list;
+	}
+
+
+	/**
+	 * 根据部门编号得到该部门及其子部门下的所有人员信息
+	 * */
+	public List<User> findByDeptId(String deptId) throws Exception {
+		if (StringUtils.isEmpty(deptId)) return null;
+		return this.getMapper(UserMapper.class).findWithCondition(null, " (DEPT_ID LIKE '" + deptId + "%' or DEPT_ID='"+deptId+"')", "convert(username using gbk) asc", 0, 0);
+	}
+
+	/**
+	 * 根据部门编号得到该部门下的所有人员信息
+	 * */
+	public List<User> findByDeptIds(String deptId) throws Exception {
+		if (StringUtils.isEmpty(deptId)) return null;
+		return this.getMapper(UserMapper.class).findWithCondition(null, "DEPT_ID='" + deptId + "'", 
+				null, 0, 0);
+	}
+
+
+	public PageModel<User> findPageModel(User user, int pageNumber, int pageSize) {
+		PageModel<User> pm = new PageModel<User>(pageNumber, pageSize);
+		user = (user == null) ? new User() : user;
+		StringBuilder sb = new StringBuilder(" 1=1 ");
+		if (StringUtils.isNotEmpty(user.getLogin_name())) {
+			sb.append("AND LOGIN_NAME LIKE '%" + user.getLogin_name() + "%' ");
+			user.setLogin_name(null);
+		}
+		if (StringUtils.isNotEmpty(user.getUsername())) {
+			sb.append(" AND USERNAME LIKE '%" + user.getUsername() + "%' ");
+			user.setUsername(null);
+		}
+		if(StringUtils.isNotEmpty(user.getDept_name())) {
+			sb.append("ANd DEPT_NAME like  '%" + user.getDept_name() + "%' ");
+			user.setDept_name(null);
+		}
+		if (StringUtils.isNotEmpty(user.getId())) {
+			sb.append(" AND ID LIKE '%" + user.getId() + "%' ");
+			user.setId(null);
+		}
+		if(user.getLogin_time()!=null){
+			SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
+			String str=sdf.format(user.getLogin_time());  
+
+			sb.append(" AND (login_time < '" + str + "' or login_time is null)");
+			user.setLogin_time(null);
+		}
+		pm.setRows(this.getMapper(UserMapper.class).findWithCondition(user, sb.toString(), " valid_flag desc,id ", (pageNumber - 1) * pageSize, pageSize));
+		pm.setTotal(this.getMapper(UserMapper.class).countWithCondition(user, sb.toString()));
+		return pm;
+	}
+
+	//根据session中的用户名去查询用户信息
+	public User findUserById(String userId){
+		return this.getMapper(UserMapper.class).findById(userId);
+	}
+	/**
+	 * 重置为默认密码为123456
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public void defaultPassword(String id,String password) throws Exception {
+		if((!id.isEmpty() && id != null) && (!password.isEmpty() && password != null)){
+			this.getMapper(UserMapper.class).resetPassword(id, encrypted(password));
+		}
+	}
+
+	/**
+	 * 重置设备锁默认为空
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public void defaultDevice(String id) throws Exception {
+		this.getMapper(UserMapper.class).resetDevice(id, null);
+	}
+
+	/**
+	 * 后台管理修改密码
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel resetPassword(String id,String OldPwd, String NewPwd) throws Exception {
+		ResultModel rm = new ResultModel();
+		if (StringUtils.isEmpty(id) || StringUtils.isEmpty(NewPwd)) {
+			rm.setState("500");
+			rm.setMsgInfo("用户ID或密码不能为空");
+			return rm;
+		}
+		User u=new User();
+		u.setId(id);
+		//验证当前登陆人密码是否与之前的一致
+		User user = this.getMapper(UserMapper.class).login(u, DataEncoder.shaEncode(OldPwd));
+		if(user!=null){
+			this.getMapper(UserMapper.class).resetPassword(id, encrypted(NewPwd));
+			rm.setState("200");			
+		}else{
+			rm.setState("500");
+			rm.setMsgInfo("原密码错误");
+		}
+		return rm;
+	}
+
+	/*************↓***************WEB*******************↓*****************/
+
+	/**
+	 * 前端界面获取所有用户信息(包括用户名,登录名,该用户所在组织ID,组织部门名称)
+	 * 含分页,模糊查询DEPT_NAME,username
+	 * */
+	public ResultModel allUserInfoWeb(CommonPage<User> sum){
+		int PageIndex=sum.getPageIndex();
+		int PageSize=sum.getPageSize();
+		User user=sum.getObject();
+		ResultModel rm=new ResultModel();
+		PageModel<User> pm=new PageModel<User>(PageIndex, PageSize);
+		String sWh="";
+		if(user.getId()!=null && !"".equals(user.getId()))
+			sWh+=" id like '%"+user.getId()+"%' or ";
+		if(user.getDept_name()!=null && !"".equals(user.getDept_name()))
+			sWh+=" DEPT_NAME like '%"+user.getDept_name()+"%' or ";
+		if(user.getUsername()!=null && !"".equals(user.getUsername()))
+			sWh+=" USERNAME like '%"+user.getUsername()+"%' or ";
+
+		if(!sWh.equals("")){
+			sWh=sWh.substring(0, sWh.length()-3);
+		}
+
+		List<User> list=this.getMapper(UserMapper.class).findWithCondition(null, sWh, "USERNAME", (PageIndex-1)*PageSize,PageSize);
+		int count=this.getMapper(UserMapper.class).countWithCondition(null, sWh);
+		pm.setRows(list);
+		pm.setTotal(count);
+		rm.setData(pm);
+		rm.setState("200");
+		return rm;
+	}
+
+	/**
+	 * Web端修改密码
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel resetPasswordWeb(CommonPage<User> sum) throws Exception{
+		String id=sum.getMemo1();
+		String OldPwd=sum.getMemo2();
+		String NewPwd=sum.getMemo3();
+		ResultModel rm=new ResultModel();
+		rm.setState("200");
+		if (StringUtils.isEmpty(id) || StringUtils.isEmpty(NewPwd)) {
+			rm.setState("500");
+			rm.setMsgInfo("用户ID或密码不能为空");
+			return rm;
+		}
+		User u=new User();
+		u.setId(id);
+		//验证当前登陆人密码是否与之前的一致
+		User user = this.getMapper(UserMapper.class).login(u, DataEncoder.shaEncode(OldPwd));
+		if(user!=null){
+			//可修改密码
+			this.getMapper(UserMapper.class).resetPassword(id, encrypted(NewPwd));
+		}else{
+			rm.setState("500");
+			rm.setMsgInfo("当前密码错误!");
+		}
+		return rm;
+	}
+
+	/**
+	 * WEB前端界面修改用户信息操作,仅修改用户的基本信息不含密码,权限,部门等数据
+	 * */
+	public ResultModel updateWeb(User t) throws Exception {
+		ResultModel rm = new ResultModel();
+		t.setUpdate_time(new Date());
+		t.setUpdate_man((String)getSession().getAttribute(HomeService.SESSION_USER_NAME));
+		if(t.getAge()==null)
+			t.setAge(0);
+		if(t.getLogo()!=null&!"".equals(t.getLogo()))
+			t.setLogo(this.getBean(SpeOptBaseService.class).doAdd(t.getLogo()));
+		super.update(t);
+		rm.setState("200");
+		return rm;
+	}
+	/**
+	 * 前端界面查看用户个人信息操作
+	 * */
+	public ResultModel userPersonInfoWeb(){
+		ResultModel rm=new ResultModel();
+		String id=(String) this.getSession().getAttribute(HomeService.SESSION_USER_ID);
+		User user= this.getMapper(UserMapper.class).findById(id);
+		rm.setState("200");
+		rm.setData(user);
+		return rm;
+	}
+
+	/**
+	 * WEB端根据用户ID数组查询用户们的信息
+	 * */
+	public ResultModel doQueryPartWeb(User user){
+		ResultModel rm = new ResultModel();
+		List<User> userList=user.getUsers();
+		List<User> list=new ArrayList<User>();
+		for(User users:userList){
+			User u=this.getMapper(UserMapper.class).findById(users.getId());
+			list.add(u);
+		}
+		rm.setState("200");
+		rm.setData(list);
+		return rm;
+	}
+
+	/**
+	 * 根据部门编号查询该部门下的人员信息
+	 * */
+	public ResultModel findByDeptIdWeb(CommonPage<User> sum) throws Exception {
+		ResultModel rm=new ResultModel();
+		String deptId=sum.getMemo1();
+		if (StringUtils.isEmpty(deptId)) return rm;
+		List<User> list=this.getMapper(UserMapper.class).findWithCondition(null, "DEPT_ID='" + deptId + "'", null, 0, 0);
+		rm.setState("200");
+		rm.setData(list);
+		return rm;
+	}
+
+	/**
+	 * 根据角色编号得到该角色下的所有人员信息
+	 * */
+	public ResultModel findByRoleIdWeb(CommonPage<UserRole> sum) throws Exception {
+		ResultModel rm=new ResultModel();
+		try{
+			UserRole userRole=sum.getObject();
+			String userName=sum.getMemo1();
+			String dept=sum.getMemo2();
+			List<User> urList=this.getBean(UserMapper.class).doQueryByRoleNo(userRole.getRoleId(),userName,dept);
+
+			rm.setData(urList);
+			rm.setState("200");
+		}catch(Exception ex){
+			rm.setState("500");
+			rm.setMsgInfo(ex.getMessage());
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * 删除用户 参数id
+	 * */
+	public ResultModel doDeleteWeb(User user){
+		ResultModel rm=new ResultModel();
+		try{
+			user.setValid_flag("0");		//离职
+			this.getMapper(UserMapper.class).update(user);
+			rm.setState("200");
+		}catch(Exception e){
+			rm.setState("500");
+			rm.setMsgInfo("删除失败"+e.getMessage());
+		}
+		return rm;
+	}
+	/*****************************WEB*************************************/
+
+}

+ 281 - 0
src/main/java/com/hnshituo/core/auth/service/impl/UsersGroupServiceImpl.java

@@ -0,0 +1,281 @@
+package com.hnshituo.core.auth.service.impl;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.UsersGroupService;
+import com.hnshituo.core.auth.vo.UsersGroup;
+
+@RemoteService(path = "UsersGroup")
+public class UsersGroupServiceImpl extends BaseServiceImpl<UsersGroup, Object> implements UsersGroupService {
+
+//	private Logger logger = Logger.getLogger(UsersGroupServiceImpl.class);
+//
+//	// 根据登录用户的id来返回该用户所在的所有分组的所有成员
+//	public List<User> doQueryAll() throws Exception {
+//		String userId = (String) this.getSession().getAttribute(HomeService.SESSION_USER_ID);
+//		UsersGroup group1 = new UsersGroup();
+//		group1.setUserId(userId);
+//		List<UsersGroup> list1 = this.getMapper(UsersGroupMapper.class).find(group1, 0, 0);
+//		List<String> str = new ArrayList<String>();
+//		for (int i = 0; i < list1.size(); i++) {
+//			String groupId = list1.get(i).getGroupId();
+//			UsersGroup group2 = new UsersGroup();
+//			group2.setGroupId(groupId);
+//			List<UsersGroup> list2 = this.getMapper(UsersGroupMapper.class).find(group2, 0, 0);
+//			for (UsersGroup g : list2) {
+//				String groupUserId = g.getUserId();
+//				str.add(groupUserId);
+//			}
+//		}
+//		HashSet<String> hs = new HashSet<String>(str);
+//		str.clear();
+//		str.addAll(hs);
+//		str.remove(userId);
+//		List<User> list3 = new ArrayList<User>();
+//
+//		for (int k = 0; k < str.size(); k++) {
+//			String userID = str.get(k);
+//			list3.add(this.getBean(UserService.class).findById(userID));
+//		}
+//		return list3;
+//	}
+//
+//	// 为分组新增成员
+//	public ResultModel doAdd(String userId, String userName, String groupId)
+//			throws Exception {
+//		ResultModel rm = new ResultModel();
+//		UsersGroup usersGroup = new UsersGroup();
+//		String id = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + PbMethod.RandomCreate(3);
+//		usersGroup.setId(id);
+//
+//		UserGroup userGroup = this.getBean(UserGroupService.class).findById(groupId);
+//		usersGroup.setGroupId(groupId);
+//		usersGroup.setGroupName(userGroup.getGroupName());
+//		usersGroup.setUserId(userId);
+//		usersGroup.setUserName(userName);
+//		try {
+//			this.getMapper(UsersGroupMapper.class).insert(usersGroup);
+//			rm.setState("200");
+//		} catch (Exception e) {
+//			logger.error("insert with a exception!");
+//			rm.setState("500");
+//		}
+//		return rm;
+//	}
+//
+//	// 删除指定组的指定成员
+//	public ResultModel doDelete(String userId, String groupId) {
+//		ResultModel rm = new ResultModel();
+//		UsersGroup usersGroup = new UsersGroup();
+//		usersGroup.setGroupId(groupId);
+//		usersGroup.setUserId(userId);
+//		try {
+//			this.getMapper(UsersGroupMapper.class).delete(usersGroup);
+//			rm.setState("200");
+//		} catch (Exception e) {
+//			logger.error("delete with a exception!");
+//			rm.setState("500");
+//		}
+//		return rm;
+//	}
+//	
+//	//============================================web=====================================
+//	//新增成员
+//	public ResultModel doAddWeb(UsersGroupSum usersSum)throws Exception {
+//		ResultModel rm = new ResultModel();
+//		List<UsersGroup> usersGroupList = usersSum.getUsersList();
+//		
+//		try {
+//			if(usersGroupList.size() > 0){
+//				this.getMapper(UsersGroupMapper.class).doDelete(usersGroupList.get(0).getGroupId());
+//				int i=0;
+//				for(UsersGroup ug : usersGroupList){
+//					i++;
+//					String user = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+//					
+//					ug.setCreatTime(new Date());
+//					ug.setCreatMan(user);
+//					ug.setId(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())+String.format("%03d", i));
+//				
+//					this.getMapper(UsersGroupMapper.class).insert(ug);
+//				}
+//				rm.setState("200");
+//			}
+//		} catch (Exception e) {
+//			logger.error("insert with a exception!");
+//			rm.setState("500");
+//		}
+//		return rm;
+//	}
+//	
+//	//根据员工ID查询所加入的所有分组
+//	public ResultModel doQueryListAll(CommonPage<UsersGroup> sum){
+//		ResultModel rm = new ResultModel();
+//		String userId = sum.getMemo1();
+//		int pageIndex = sum.getPageIndex();
+//		int pageSize = sum.getPageSize();
+//		int count = 0 ;
+//		UsersGroup group = new UsersGroup();
+//		group.setUserId(userId);
+//		List<UsersGroup> list = new ArrayList<UsersGroup>();
+//		List<UserGroup> groupList = new ArrayList<UserGroup>();
+//		PageModel<UserGroup> pm=new PageModel<UserGroup>(pageIndex, pageSize);
+//		try{
+//			list = this.getMapper(UsersGroupMapper.class).find(group, (pageIndex-1)*pageSize, pageSize);
+//			UserGroup g = new UserGroup();
+//			//g.setStatus("0");
+//			count = this.getMapper(UserGroupMapper.class).countWithCondition(g, "group_id in (select group_id from CORE_AUTH_USERS_GROUP where user_id ='"+userId+"' )");
+//			for(UsersGroup usersGroup : list){
+//				UserGroup userGroup = this.getMapper(UserGroupMapper.class).findById(usersGroup.getGroupId());
+//				if(userGroup != null){
+//					groupList.add(userGroup);
+//				}
+//			}
+//			pm.setRows(groupList);
+//			pm.setTotal(count);
+//			rm.setData(pm);
+//			rm.setState("200");
+//		}catch(Exception e){
+//			rm.setState("500");
+//		}
+//		return rm;
+//	}
+//	
+//	//查询分组下的所有成员
+//	public ResultModel doQueryAllMember(CommonPage<UsersGroup> sum){
+//		ResultModel rm = new ResultModel();
+//		String groupNo = sum.getMemo1();
+//		int pageIndex = sum.getPageIndex();
+//		int pageSize = sum.getPageSize();
+//		int count = 0;
+//		UsersGroup usersGroup = new UsersGroup();
+//		List<UsersGroup> list = new ArrayList<UsersGroup>();
+//		PageModel<UsersGroup> pm=new PageModel<UsersGroup>(pageIndex, pageSize);
+//		if(null != groupNo){
+//			usersGroup.setGroupId(groupNo);
+//		}else{
+//			rm.setState("500");
+//			return rm;
+//		}
+//		try{
+//			list = this.getMapper(UsersGroupMapper.class).find(usersGroup, (pageIndex-1)*pageSize, pageSize);
+//			if(list.size() > 0){
+//				for(UsersGroup uu : list){
+//					User u=this.getMapper(UserMapper.class).findById(uu.getUserId());
+//					uu.setDeptId(u.getDept_id());
+//					uu.setDeptName(u.getDept_name());
+//				}
+//			}
+//			count = this.getMapper(UsersGroupMapper.class).count(usersGroup);
+//			pm.setRows(list);
+//			pm.setTotal(count);
+//			rm.setData(pm);
+//			rm.setState("200");
+//		}catch(Exception e){
+//			rm.setState("500");
+//		}
+//		return rm;
+//	}
+//	
+//	//删除群组成员
+//	public ResultModel doDeleteMember(CommonPage<UsersGroup> sum){
+//		ResultModel rm = new ResultModel();
+//		String groupId = sum.getMemo1();
+//		String userId= sum.getMemo2();
+//		UsersGroup usersGroup = new UsersGroup();
+//		if((null == groupId ||groupId.isEmpty()) && (null == userId || userId.isEmpty())){
+//			rm.setMsgInfo("输入数据为空");
+//			rm.setState("500");
+//		}else{
+//			usersGroup.setGroupId(groupId);
+//			usersGroup.setUserId(userId);
+//		}
+//		try{
+//			this.getMapper(UsersGroupMapper.class).doDeleteByGroupIdAndUserId(groupId, userId);
+//			rm.setState("200");
+//		}catch(Exception e){
+//			rm.setMsgInfo("删除失败");
+//			rm.setState("500");
+//		}
+//		return rm;
+//	}
+//	
+//	// 根据登录用户的id来返回该用户所在的所有分组的所有成员
+//	public ResultModel doQueryAllWeb(CommonPage<User> sum) throws Exception {
+//		ResultModel rm = new ResultModel();
+//		String param = sum.getMemo1();
+//		int pageIndex = sum.getPageIndex();
+//		int pageSize = sum.getPageSize();
+//		String userId = (String) this.getSession().getAttribute(HomeService.SESSION_USER_ID);
+//		PageModel<User> pm = new PageModel<User>(pageIndex, pageSize);
+//		try{
+//			UsersGroup group = new UsersGroup();
+//			group.setUserId(userId);
+//			List<UsersGroup> usersGroupList = this.getMapper(UsersGroupMapper.class).find(group, 0, 0);
+//			List<String> str = new ArrayList<String>();
+//			for (int i = 0; i < usersGroupList.size(); i++) {
+//				String groupId = usersGroupList.get(i).getGroupId();
+//				UsersGroup groups = new UsersGroup();
+//				groups.setGroupId(groupId);
+//				List<UsersGroup> usersGroupLists = this.getMapper(UsersGroupMapper.class).find(groups, 0, 0);
+//				for (UsersGroup g : usersGroupLists) {
+//					String groupUserId = g.getUserId();
+//					str.add(groupUserId);
+//				}
+//			}
+//			//去除相同的人
+//			HashSet<String> hs = new HashSet<String>(str);
+//			str.clear();
+//			str.addAll(hs);
+//			str.remove(userId);
+//			List<User> userList = new ArrayList<User>();
+//			List<User> userLists = new ArrayList<User>();
+//			List<User> returnList = new ArrayList<User>();
+//
+//			for (int k = 0; k < str.size(); k++) {
+//				String userID = str.get(k);
+//				userList.add(this.getBean(UserService.class).findById(userID));
+//			}
+//			if(userList.size() > 0){
+//				if(param != null && !param.isEmpty()){
+//					for(User u :userList){
+//						if(u.getDept_name().contains(param) || u.getUsername().contains(param)){
+//							userLists.add(u);
+//						}
+//					}
+//				}else{
+//					for(User u :userList){
+//						userLists.add(u);
+//					}
+//				}
+//			}
+//			int count = userLists.size();
+//			returnList = paging(userLists,pageIndex,pageSize);
+//			pm.setRows(returnList);
+//			pm.setTotal(count);
+//			rm.setData(pm);
+//			rm.setState("200");
+//		}catch(Exception e){
+//			rm.setState("500");
+//		}
+//		return rm;
+//	}
+//	
+//	//分页
+//	private <T extends Object> List<T> paging(List<T> list,int pageIndex,int pageSize){
+//		List<T> returnList = new ArrayList<T>();
+//		int total = 0;
+//		if(list.size() > 0){
+//			if(list.size() > (pageIndex-1)*pageSize && list.size() <= pageIndex * pageSize){
+//				total = list.size();
+//			}else if(list.size() > pageIndex * pageSize){
+//				total = pageIndex * pageSize;
+//			}
+//			for(int i = (pageIndex-1)*pageSize;i < total;i++){
+//				returnList.add(list.get(i));
+//			}
+//		}
+//		return returnList;
+//	}
+	
+}

+ 177 - 0
src/main/java/com/hnshituo/core/auth/vo/Department.java

@@ -0,0 +1,177 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.DepartmentMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Table;
+
+@Table(name="CORE_AUTH_DEPARTMENT", namespace=DepartmentMapper.class, cache=true)
+public class Department extends BaseVO implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -2152729175686224249L;
+
+	/** 编号 */
+	@Id
+	private String id;
+
+	/** 名称 */
+	@Column
+	private String name;
+
+	/** 父编号 */
+	@Column
+	private String pid;
+
+	/** 组织类型 */
+	@Column
+	private Integer type;
+
+	/** 序号 */
+	@Column
+	private Integer seq;
+	
+	/** 删除状态(0:否, 1:是) */
+	@Column
+	private boolean del;
+
+	@Column
+	private String create_man;
+
+	/** 创建时间 */
+	@Column
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date create_time;
+
+	/** 修改人 */
+	@Column
+	private String update_man;
+
+	/** 修改时间 */
+	@Column
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date update_time;
+
+	/** 照片 */
+	@Column
+	private String logo;
+
+	/** 备注 */
+	@Column
+	private String memo;
+	
+	private List<Department> children;
+
+	public String getId() {
+		return this.id;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public String getPid() {
+		return this.pid;
+	}
+
+	public Integer getType() {
+		return this.type;
+	}
+
+	public Integer getSeq() {
+		return this.seq;
+	}
+
+	public String getCreate_man() {
+		return create_man;
+	}
+
+	public void setCreate_man(String create_man) {
+		this.create_man = create_man;
+	}
+
+	public Date getCreate_time() {
+		return create_time;
+	}
+
+	public void setCreate_time(Date create_time) {
+		this.create_time = create_time;
+	}
+
+	public String getUpdate_man() {
+		return update_man;
+	}
+
+	public void setUpdate_man(String update_man) {
+		this.update_man = update_man;
+	}
+
+	public Date getUpdate_time() {
+		return update_time;
+	}
+
+	public void setUpdate_time(Date update_time) {
+		this.update_time = update_time;
+	}
+
+	public String getMemo() {
+		return this.memo;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPid(String pid) {
+		this.pid = pid;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+	public void setSeq(Integer seq) {
+		this.seq = seq;
+	}
+
+	
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public List<Department> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<Department> children) {
+		this.children = children;
+	}
+
+	public boolean isDel() {
+		return del;
+	}
+
+	public void setDel(boolean del) {
+		this.del = del;
+	}
+
+	public String getLogo() {
+		return logo;
+	}
+
+	public void setLogo(String logo) {
+		this.logo = logo;
+	}
+}

+ 269 - 0
src/main/java/com/hnshituo/core/auth/vo/Function.java

@@ -0,0 +1,269 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.FunctionMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Id.GenerationStrategy;
+import com.hnshituo.orm.annotation.Table;
+
+@Table(name="CORE_AUTH_FUNCTION", namespace=FunctionMapper.class, cache=true)
+public class Function extends BaseVO implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 515614599603927054L;
+
+	/** 功能编号 */
+	@Id(generationStrategy=GenerationStrategy.AUTO)
+	private Integer id;
+
+	/** 功能名称 */
+	@Column
+	private String text;
+	
+	/** 功能别名 */
+	@Column
+	private String alias;
+
+	/** 父功能编号 */
+	@Column
+	private Integer pid;
+
+	/** 功能URL */
+	@Column
+	private String url;
+
+	/** 功能类型(0:菜单;1:功能;) */
+	@Column
+	private Integer type;
+	
+	/** 是否启用数据权限(0-否;1-是) */
+	@Column("DATA_PRG")
+	private Integer dataPrg;
+	
+	/** 数据权限字段名 */
+	@Column("DATA_PRG_FIELD")
+	private String dataPrgField;
+
+	/** 功能按钮渲染DOM的ID */
+	@Column("PANEL_ID")
+	private String panelId;
+
+	/** 图标样式 */
+	@Column("ICON_CLS")
+	private String iconCls;
+
+	/** Javascript处理函数 */
+	@Column
+	private String handler;
+
+	/** 顺序号 */
+	@Column
+	private Integer seq;
+
+	/** 权限编号 */
+	@Column("PRG_ID")
+	private Integer prgId;
+
+	/** 是否显示(0-显示;1-不显示) */
+	@Column
+	private Integer visible;
+	
+	/** 是否拥有权限 */
+	private boolean checked;
+
+	@Column("CREATE_MAN")
+	private String createMan;
+
+	@Column("CREATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+
+	@Column("UPDATE_MAN")
+	private String updateMan;
+
+	@Column("UPDATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+
+	@Column
+	private String memo;
+	
+	private List<Function> children;
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public String getText() {
+		return this.text;
+	}
+
+	public Integer getPid() {
+		return this.pid;
+	}
+
+	public String getUrl() {
+		return this.url;
+	}
+
+	public Integer getType() {
+		return this.type;
+	}
+
+	public String getIconCls() {
+		return this.iconCls;
+	}
+
+	public String getHandler() {
+		return this.handler;
+	}
+
+	public Integer getSeq() {
+		return this.seq;
+	}
+
+	public Integer getPrgId() {
+		return this.prgId;
+	}
+
+	public Integer getVisible() {
+		return this.visible;
+	}
+
+	public String getCreateMan() {
+		return this.createMan;
+	}
+
+	public Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public String getUpdateMan() {
+		return this.updateMan;
+	}
+
+	public Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	public String getMemo() {
+		return this.memo;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public void setPid(Integer pid) {
+		this.pid = pid;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+	public void setIconCls(String iconCls) {
+		this.iconCls = iconCls;
+	}
+
+	public void setHandler(String handler) {
+		this.handler = handler;
+	}
+
+	public void setSeq(Integer seq) {
+		this.seq = seq;
+	}
+
+	public void setPrgId(Integer prgId) {
+		this.prgId = prgId;
+	}
+
+	public void setVisible(Integer visible) {
+		this.visible = visible;
+	}
+
+	public void setCreateMan(String createMan) {
+		this.createMan = createMan;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public void setUpdateMan(String updateMan) {
+		this.updateMan = updateMan;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public List<Function> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<Function> children) {
+		this.children = children;
+	}
+
+	public String getPanelId() {
+		return panelId;
+	}
+
+	public void setPanelId(String panelId) {
+		this.panelId = panelId;
+	}
+
+	public boolean isChecked() {
+		return checked;
+	}
+
+	public void setChecked(boolean checked) {
+		this.checked = checked;
+	}
+
+	public String getAlias() {
+		return alias;
+	}
+
+	public void setAlias(String alias) {
+		this.alias = alias;
+	}
+
+	public Integer getDataPrg() {
+		return dataPrg;
+	}
+
+	public void setDataPrg(Integer dataPrg) {
+		this.dataPrg = dataPrg;
+	}
+
+	public String getDataPrgField() {
+		return dataPrgField;
+	}
+
+	public void setDataPrgField(String dataPrgField) {
+		this.dataPrgField = dataPrgField;
+	}
+
+}

+ 54 - 0
src/main/java/com/hnshituo/core/auth/vo/Privilege.java

@@ -0,0 +1,54 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.PrivilegeMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Table;
+
+@Table(name="CORE_AUTH_PRIVILEGE", namespace=PrivilegeMapper.class)
+public class Privilege extends BaseVO implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1022183331880051424L;
+
+	/** 角色编号 */
+	@Column("ROLE_ID")
+	private Integer roleId;
+
+	/** 功能编号 */
+	@Column("FUNC_ID")
+	private Integer funcId;
+
+	/** 权限类型(0:可访问,1:可授权) */
+	@Column
+	private Integer type;
+
+	public Integer getRoleId() {
+		return this.roleId;
+	}
+
+	public Integer getFuncId() {
+		return this.funcId;
+	}
+
+	public Integer getType() {
+		return this.type;
+	}
+
+	public void setRoleId(Integer roleId) {
+		this.roleId = roleId;
+	}
+
+	public void setFuncId(Integer funcId) {
+		this.funcId = funcId;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+}

+ 142 - 0
src/main/java/com/hnshituo/core/auth/vo/Role.java

@@ -0,0 +1,142 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.RoleMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Id.GenerationStrategy;
+import com.hnshituo.orm.annotation.Table;
+
+@Table(name="CORE_AUTH_ROLE", namespace=RoleMapper.class, cache=true)
+public class Role extends BaseVO implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 7813210874372788042L;
+
+	/** 角色编号 */
+	@Id(generationStrategy=GenerationStrategy.AUTO)
+	private Integer id;
+
+	/** 角色名称 */
+	@Column
+	private String name;
+
+	/** 父角色编号 */
+	@Column
+	private Integer pid;
+
+	/** 创建部门 */
+	@Column("CREATE_DEPT_ID")
+	private String createDeptId;
+	
+	@Column("WHOLE_DATA_PRG")
+	private Integer wholeDataPrg;
+
+	@Column("CREATE_MAN")
+	private String createMan;
+
+	/** 创建时间 */
+	@Column("CREATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+
+	/** 修改人 */
+	@Column("UPDATE_MAN")
+	private String updateMan;
+
+	/** 修改时间 */
+	@Column("UPDATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+
+	/** 备注 */
+	@Column
+	private String memo;
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public Integer getPid() {
+		return this.pid;
+	}
+
+	public String getCreateDeptId() {
+		return this.createDeptId;
+	}
+
+	public String getCreateMan() {
+		return this.createMan;
+	}
+
+	public Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public String getUpdateMan() {
+		return this.updateMan;
+	}
+
+	public Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	public String getMemo() {
+		return this.memo;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPid(Integer pid) {
+		this.pid = pid;
+	}
+
+	public void setCreateDeptId(String createDeptId) {
+		this.createDeptId = createDeptId;
+	}
+
+	public void setCreateMan(String createMan) {
+		this.createMan = createMan;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public void setUpdateMan(String updateMan) {
+		this.updateMan = updateMan;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public Integer getWholeDataPrg() {
+		return wholeDataPrg;
+	}
+
+	public void setWholeDataPrg(Integer wholeDataPrg) {
+		this.wholeDataPrg = wholeDataPrg;
+	}
+}
+

+ 603 - 0
src/main/java/com/hnshituo/core/auth/vo/User.java

@@ -0,0 +1,603 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.UserMapper;
+import com.hnshituo.orm.annotation.Association;
+import com.hnshituo.orm.annotation.Collection;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Join;
+import com.hnshituo.orm.annotation.Table;
+
+@JsonInclude(Include.NON_EMPTY)
+@Table(name="CORE_AUTH_USER", namespace=UserMapper.class, cache=true)
+public class User extends BaseVO implements Serializable {
+
+	/**
+	 * 用户信息表
+	 */
+	private static final long serialVersionUID = 3050537317325073462L;
+
+	/** 用户编号 */
+	@Id
+	private String id;
+	
+	private MultipartFile mFile;
+	
+	/** 个性签名*/
+	@Column
+	private String individuality_signature;
+
+	/** 科室编号 */
+	@Column
+	private String offices_no;
+	
+	/** 登录名 */
+	@Column
+	private String login_name;
+
+	/** 密码 */
+	@Column
+	private String password;
+
+	/** 用户姓名 */
+	@Column
+	private String username;
+	
+	/**班次*/
+	@Column
+	private String wrk_ord;
+	
+	/**班组*/
+	@Column
+	private String wrk_grp;
+	
+	/**当班日期*/
+	@Column
+//	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private String wrk_date;
+
+	/** 组织ID */
+	@Column
+	private String dept_id;
+	
+	/** 组织部门名称 */
+	@Column
+	private String dept_name;
+
+	/** 性别 */
+	@Column
+	private Integer sex;
+
+	/** 年龄 */
+	@Column
+	private Integer age;
+
+	/** IP地址 */
+	@Column
+	private String ip;
+
+	/** 邮箱 */
+	@Column
+	private String email;
+
+	/** 地址 */
+	@Column
+	private String address;
+
+	/** 电话 */
+	@Column
+	private String phone;
+	
+	/**手机*/
+	@Column
+	private String telephone;
+
+	/** 照片 base64 */
+	@Column
+	private byte[] image;
+	
+	/** 照片 路径*/
+	@Column
+	private String logo;
+
+	/** 加入公司日期 */
+	@Column
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date join_date;
+
+	/** 生日 */
+	@Column
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date birthday;
+
+	/** 籍贯 */
+	@Column
+	private String native_place;
+
+	/** 政治面貌 */
+	@Column
+	private String political;
+
+	/** 职务 */
+	@Column
+	private String duty;
+
+	/** 职称 */
+	@Column
+	private String title;
+
+	/** 文化程度 */
+	@Column
+	private String education;
+
+	/** 专业 */
+	@Column
+	private String profession;
+
+	/** 毕业院校 */
+	@Column
+	private String graduate_school;
+
+	/** 是否登录(0-未登录;1-已登录) */
+	@Column
+	private Integer islogin;
+
+	/** 用户状态(1在职使用 0 离职停用) */
+	@Column
+	private String valid_flag;
+
+	/** 创建部门 */
+	@Column
+	private String create_dept_id;
+
+	/** 创建人 */
+	@Column
+	private String create_man;
+
+	/** 创建时间 */
+	@Column
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date create_time;
+
+	/** 修改人 */
+	@Column
+	private String update_man;
+
+	/** 修改时间 */
+	@Column
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date update_time;
+	
+	/** 移动设备 */
+	@Column
+	private String device;
+
+	@Column
+	private String memo;
+	
+	@Column		
+	private String token;
+	
+	@Column
+	private String qr_code;
+	
+	@Column
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date login_time;
+	
+	@Column
+	// 0代表禁用 1 代表启用
+	private String status;
+	
+
+	/**验证码*/
+	private String vcode;
+
+	/** 科室名称*/
+	@Column
+	private String offices_name;
+	
+	@Association(column="DEPT_ID", foreignColumn="ID")
+	private Department department;
+	
+	@Join(column="id", foreignColumn="USER_ID", table="CORE_AUTH_USER_ROLE",alias="CORE_AUTH_USER_ROLE")
+	@Collection(column="ROLE_ID", foreignColumn="ID", javaType=Role.class)
+	private List<Role> roles;
+  
+	private List<User> users;
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public MultipartFile getmFile() {
+		return mFile;
+	}
+
+	public void setmFile(MultipartFile mFile) {
+		this.mFile = mFile;
+	}
+
+	public String getIndividuality_signature() {
+		return individuality_signature;
+	}
+
+	public void setIndividuality_signature(String individuality_signature) {
+		this.individuality_signature = individuality_signature;
+	}
+
+	public String getOffices_no() {
+		return offices_no;
+	}
+
+	public void setOffices_no(String offices_no) {
+		this.offices_no = offices_no;
+	}
+
+	public String getLogin_name() {
+		return login_name;
+	}
+
+	public void setLogin_name(String login_name) {
+		this.login_name = login_name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getWrk_ord() {
+		return wrk_ord;
+	}
+
+	public void setWrk_ord(String wrk_ord) {
+		this.wrk_ord = wrk_ord;
+	}
+
+	public String getWrk_grp() {
+		return wrk_grp;
+	}
+
+	public void setWrk_grp(String wrk_grp) {
+		this.wrk_grp = wrk_grp;
+	}
+
+	public String getDept_id() {
+		return dept_id;
+	}
+
+	public void setDept_id(String dept_id) {
+		this.dept_id = dept_id;
+	}
+
+	public String getDept_name() {
+		return dept_name;
+	}
+
+	public void setDept_name(String dept_name) {
+		this.dept_name = dept_name;
+	}
+
+	public Integer getSex() {
+		return sex;
+	}
+
+	public void setSex(Integer sex) {
+		this.sex = sex;
+	}
+
+	public Integer getAge() {
+		return age;
+	}
+
+	public void setAge(Integer age) {
+		this.age = age;
+	}
+
+	public String getIp() {
+		return ip;
+	}
+
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getTelephone() {
+		return telephone;
+	}
+
+	public void setTelephone(String telephone) {
+		this.telephone = telephone;
+	}
+
+	public byte[] getImage() {
+		return image;
+	}
+
+	public void setImage(byte[] image) {
+		this.image = image;
+	}
+
+	public String getLogo() {
+		return logo;
+	}
+
+	public void setLogo(String logo) {
+		this.logo = logo;
+	}
+
+	public Date getJoin_date() {
+		return join_date;
+	}
+
+	public void setJoin_date(Date join_date) {
+		this.join_date = join_date;
+	}
+
+	public Date getBirthday() {
+		return birthday;
+	}
+
+	public void setBirthday(Date birthday) {
+		this.birthday = birthday;
+	}
+
+	public String getNative_place() {
+		return native_place;
+	}
+
+	public void setNative_place(String native_place) {
+		this.native_place = native_place;
+	}
+
+	public String getPolitical() {
+		return political;
+	}
+
+	public void setPolitical(String political) {
+		this.political = political;
+	}
+
+	public String getDuty() {
+		return duty;
+	}
+
+	public void setDuty(String duty) {
+		this.duty = duty;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getEducation() {
+		return education;
+	}
+
+	public void setEducation(String education) {
+		this.education = education;
+	}
+
+	public String getProfession() {
+		return profession;
+	}
+
+	public void setProfession(String profession) {
+		this.profession = profession;
+	}
+
+	public String getGraduate_school() {
+		return graduate_school;
+	}
+
+	public void setGraduate_school(String graduate_school) {
+		this.graduate_school = graduate_school;
+	}
+
+	public Integer getIslogin() {
+		return islogin;
+	}
+
+	public void setIslogin(Integer islogin) {
+		this.islogin = islogin;
+	}
+
+	public String getValid_flag() {
+		return valid_flag;
+	}
+
+	public void setValid_flag(String valid_flag) {
+		this.valid_flag = valid_flag;
+	}
+
+	public String getCreate_dept_id() {
+		return create_dept_id;
+	}
+
+	public void setCreate_dept_id(String create_dept_id) {
+		this.create_dept_id = create_dept_id;
+	}
+
+	public String getCreate_man() {
+		return create_man;
+	}
+
+	public void setCreate_man(String create_man) {
+		this.create_man = create_man;
+	}
+
+	public Date getCreate_time() {
+		return create_time;
+	}
+
+	public void setCreate_time(Date create_time) {
+		this.create_time = create_time;
+	}
+
+	public String getUpdate_man() {
+		return update_man;
+	}
+
+	public void setUpdate_man(String update_man) {
+		this.update_man = update_man;
+	}
+
+	public Date getUpdate_time() {
+		return update_time;
+	}
+
+	public void setUpdate_time(Date update_time) {
+		this.update_time = update_time;
+	}
+
+	public String getDevice() {
+		return device;
+	}
+
+	public void setDevice(String device) {
+		this.device = device;
+	}
+
+	public String getMemo() {
+		return memo;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public String getToken() {
+		return token;
+	}
+
+	public void setToken(String token) {
+		this.token = token;
+	}
+
+	public String getQr_code() {
+		return qr_code;
+	}
+
+	public void setQr_code(String qr_code) {
+		this.qr_code = qr_code;
+	}
+
+	public Date getLogin_time() {
+		return login_time;
+	}
+
+	public void setLogin_time(Date login_time) {
+		this.login_time = login_time;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public String getVcode() {
+		return vcode;
+	}
+
+	public void setVcode(String vcode) {
+		this.vcode = vcode;
+	}
+
+	public String getOffices_name() {
+		return offices_name;
+	}
+
+	public void setOffices_name(String offices_name) {
+		this.offices_name = offices_name;
+	}
+
+	public Department getDepartment() {
+		return department;
+	}
+
+	public void setDepartment(Department department) {
+		this.department = department;
+	}
+
+	public List<Role> getRoles() {
+		return roles;
+	}
+
+	public void setRoles(List<Role> roles) {
+		this.roles = roles;
+	}
+
+	public List<User> getUsers() {
+		return users;
+	}
+
+	public void setUsers(List<User> users) {
+		this.users = users;
+	}
+
+	public String getWrk_date() {
+		return wrk_date;
+	}
+
+	public void setWrk_date(String wrkDate) {
+		wrk_date = wrkDate;
+	}
+
+}

+ 188 - 0
src/main/java/com/hnshituo/core/auth/vo/UserGroup.java

@@ -0,0 +1,188 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.UserGroupMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Table;
+
+@Table(name="CORE_AUTH_USER_GROUP", namespace=UserGroupMapper.class)
+public class UserGroup extends BaseVO implements Serializable {
+
+	private static final long serialVersionUID = -6018914145868078321L;
+	
+	/** 分组编号 */
+	@Id
+	private String group_id;
+
+	/** 用户编号 */
+	@Column("GROUP_NAME")
+	private String groupName;
+	
+	@Column("DEPARTMENT_NO")
+	private String department_no;
+	
+	@Column("DEPARTMENT_NAEM")
+	private String department_name;
+	
+	@Column("CREATE_MAN")
+	private String creat_man;
+	
+	@Column("CREATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date creat_time;
+	
+	@Column("UPDATE_MAN")
+	private String update_name;
+	
+	@Column("UPDATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date update_time;
+	
+	@Column("MEMO")
+	private String memo;
+	
+	@Column("STATUS")
+	private String status;
+	
+	@Column("GROUP_PERSON_NO")
+	private String group_person_no;
+	
+	@Column("GROUP_PERSON_NAME")
+	private String group_person_name;
+	
+	//管理员头像
+	private String group_person_logo;
+	
+	//管理员部门ID
+	private String group_person_deptId;
+
+	//管理员部门名称
+	private String group_person_deptName;
+
+	
+	public String getGroup_person_deptId() {
+		return group_person_deptId;
+	}
+
+	public void setGroup_person_deptId(String group_person_deptId) {
+		this.group_person_deptId = group_person_deptId;
+	}
+
+	public String getGroup_person_deptName() {
+		return group_person_deptName;
+	}
+
+	public void setGroup_person_deptName(String group_person_deptName) {
+		this.group_person_deptName = group_person_deptName;
+	}
+
+	public String getGroup_person_logo() {
+		return group_person_logo;
+	}
+
+	public void setGroup_person_logo(String group_person_logo) {
+		this.group_person_logo = group_person_logo;
+	}
+
+	public String getGroup_id() {
+		return group_id;
+	}
+
+	public void setGroup_id(String group_id) {
+		this.group_id = group_id;
+	}
+
+	public String getGroupName() {
+		return groupName;
+	}
+
+	public void setGroupName(String groupName) {
+		this.groupName = groupName;
+	}
+
+	public String getDepartment_no() {
+		return department_no;
+	}
+
+	public void setDepartment_no(String department_no) {
+		this.department_no = department_no;
+	}
+
+	public String getDepartment_name() {
+		return department_name;
+	}
+
+	public void setDepartment_name(String department_name) {
+		this.department_name = department_name;
+	}
+
+	public String getCreat_man() {
+		return creat_man;
+	}
+
+	public void setCreat_man(String creat_man) {
+		this.creat_man = creat_man;
+	}
+
+	public Date getCreat_time() {
+		return creat_time;
+	}
+
+	public void setCreat_time(Date creat_time) {
+		this.creat_time = creat_time;
+	}
+
+	public String getUpdate_name() {
+		return update_name;
+	}
+
+	public void setUpdate_name(String update_name) {
+		this.update_name = update_name;
+	}
+
+	public Date getUpdate_time() {
+		return update_time;
+	}
+
+	public void setUpdate_time(Date update_time) {
+		this.update_time = update_time;
+	}
+
+	public String getMemo() {
+		return memo;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public String getGroup_person_no() {
+		return group_person_no;
+	}
+
+	public void setGroup_person_no(String group_person_no) {
+		this.group_person_no = group_person_no;
+	}
+
+	public String getGroup_person_name() {
+		return group_person_name;
+	}
+
+	public void setGroup_person_name(String group_person_name) {
+		this.group_person_name = group_person_name;
+	}
+
+}

+ 497 - 0
src/main/java/com/hnshituo/core/auth/vo/UserInfo.java

@@ -0,0 +1,497 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.UserInfoMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Table;
+
+@JsonInclude(Include.NON_EMPTY)
+@Table(name="CORE_AUTH_USER", namespace=UserInfoMapper.class)
+public class UserInfo extends BaseVO implements Serializable {
+	
+	/*
+	 * 新增UserInfo对象,包含user的除department、roles以外的所有信息,只查user表,节省时间
+	 */
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -4638410623393187798L;
+
+	/** 用户编号 */
+	@Id
+	private String id;
+	
+	private MultipartFile mFile;
+	
+	/** 个性签名*/
+	@Column("INDIVIDUALITY_SIGNATURE")
+	private String individuality_signature;
+
+	/** 科室编号 */
+	@Column
+	private String offices_no;
+	
+	/** 登录名 */
+	@Column("LOGIN_NAME")
+	private String loginName;
+
+	/** 密码 */
+	@Column
+	private String password;
+
+	/** 用户姓名 */
+	@Column
+	private String username;
+
+	/** 组织ID */
+	@Column("DEPT_ID")
+	private String deptId;
+	
+	/** 组织部门名称 */
+	@Column("DEPT_NAME")
+	private String deptName;
+
+	/** 性别 */
+	@Column
+	private Integer sex;
+
+	/** 年龄 */
+	@Column
+	private Integer age;
+
+	/** IP地址 */
+	@Column
+	private String ip;
+
+	/** 邮箱 */
+	@Column
+	private String email;
+
+	/** 地址 */
+	@Column
+	private String address;
+
+	/** 电话 */
+	@Column
+	private String phone;
+	
+	/**手机*/
+	@Column("TELEPHONE")
+	private String telephone;
+
+	/** 照片 */
+	@Column
+	private byte[] image;
+	
+	/** 照片 */
+	@Column
+	private String logo;
+
+	/** 加入公司日期 */
+	@Column("JOIN_DATE")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date joinDate;
+
+	/** 生日 */
+	@Column
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date birthday;
+
+	/** 籍贯 */
+	@Column("NATIVE_PLACE")
+	private String nativePlace;
+
+	/** 政治面貌 */
+	@Column
+	private String political;
+
+	/** 职务 */
+	@Column
+	private String duty;
+
+	/** 职称 */
+	@Column
+	private String title;
+
+	/** 文化程度 */
+	@Column
+	private String education;
+
+	/** 专业 */
+	@Column
+	private String profession;
+
+	/** 毕业院校 */
+	@Column("GRADUATE_SCHOOL")
+	private String graduateSchool;
+
+	/** 是否登录(0-未登录;1-已登录) */
+	@Column
+	private Integer islogin;
+
+	/** 用户状态(0-启用;1-停用) */
+	@Column
+	private Integer status;
+
+	/** 创建部门 */
+	@Column("CREATE_DEPT_ID")
+	private String createDeptId;
+
+	/** 创建人 */
+	@Column("CREATE_MAN")
+	private String createMan;
+
+	/** 创建时间 */
+	@Column("CREATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+
+	/** 修改人 */
+	@Column("UPDATE_MAN")
+	private String updateMan;
+
+	/** 修改时间 */
+	@Column("UPDATE_TIME")
+	private Date updateTime;
+	
+	/** 移动设备 */
+	@Column("DEVICE")
+	private String device;
+
+	@Column
+	private String memo;
+	
+	@Column		
+	private String token;
+
+	/** 科室名称*/
+	@Column
+	private String offices_name;
+	
+	/**角色信息串*/
+	private String positions;
+  
+	public String getId() {
+		return this.id;
+	}
+
+	public String getLoginName() {
+		return this.loginName;
+	}
+
+	public String getPassword() {
+		return this.password;
+	}
+
+	public String getUsername() {
+		return this.username;
+	}
+
+	public String getTelephone() {
+		return telephone;
+	}
+
+	public void setTelephone(String telephone) {
+		this.telephone = telephone;
+	}
+
+	public String getDeptId() {
+		return this.deptId;
+	}
+	
+	public String getDeptName() {
+		return this.deptName;
+	}
+
+	public Integer getSex() {
+		return this.sex;
+	}
+
+	public Integer getAge() {
+		return this.age;
+	}
+
+	public String getIp() {
+		return this.ip;
+	}
+
+	public String getEmail() {
+		return this.email;
+	}
+
+	public String getAddress() {
+		return this.address;
+	}
+
+	public String getPhone() {
+		return this.phone;
+	}
+
+	public byte[] getImage() {
+		return this.image;
+	}
+	
+	public String getLogo() {
+		return this.logo;
+	}
+
+	public Date getJoinDate() {
+		return this.joinDate;
+	}
+
+	public Date getBirthday() {
+		return this.birthday;
+	}
+
+	public String getNativePlace() {
+		return this.nativePlace;
+	}
+
+	public String getPolitical() {
+		return this.political;
+	}
+
+	public String getDuty() {
+		return this.duty;
+	}
+
+	public String getTitle() {
+		return this.title;
+	}
+
+	public String getEducation() {
+		return this.education;
+	}
+
+	public String getProfession() {
+		return this.profession;
+	}
+
+	public String getGraduateSchool() {
+		return this.graduateSchool;
+	}
+
+	public Integer getIslogin() {
+		return this.islogin;
+	}
+
+	public Integer getStatus() {
+		return this.status;
+	}
+
+	public String getCreateDeptId() {
+		return this.createDeptId;
+	}
+
+	public String getCreateMan() {
+		return this.createMan;
+	}
+
+	public Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public String getUpdateMan() {
+		return this.updateMan;
+	}
+
+	public Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	public String getMemo() {
+		return this.memo;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public void setLoginName(String loginName) {
+		this.loginName = loginName;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public void setDeptId(String deptId) {
+		this.deptId = deptId;
+	}
+	
+	public void setDeptName(String deptName) {
+		this.deptName = deptName;
+	}
+
+	public void setSex(Integer sex) {
+		this.sex = sex;
+	}
+
+	public void setAge(Integer age) {
+		this.age = age;
+	}
+
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public void setImage(byte[] image) {
+		this.image = image;
+	}
+	
+	public void setLogo(String logo) {
+		this.logo = logo;
+	}
+
+	public void setJoinDate(Date joinDate) {
+		this.joinDate = joinDate;
+	}
+
+	public void setBirthday(Date birthday) {
+		this.birthday = birthday;
+	}
+
+	public void setNativePlace(String nativePlace) {
+		this.nativePlace = nativePlace;
+	}
+
+	public void setPolitical(String political) {
+		this.political = political;
+	}
+
+	public void setDuty(String duty) {
+		this.duty = duty;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public void setEducation(String education) {
+		this.education = education;
+	}
+
+	public void setProfession(String profession) {
+		this.profession = profession;
+	}
+
+	public void setGraduateSchool(String graduateSchool) {
+		this.graduateSchool = graduateSchool;
+	}
+
+	public void setIslogin(Integer islogin) {
+		this.islogin = islogin;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public void setCreateDeptId(String createDeptId) {
+		this.createDeptId = createDeptId;
+	}
+
+	public void setCreateMan(String createMan) {
+		this.createMan = createMan;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public void setUpdateMan(String updateMan) {
+		this.updateMan = updateMan;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public MultipartFile getmFile() {
+		return mFile;
+	}
+
+	public void setmFile(MultipartFile mFile) {
+		this.mFile = mFile;
+	}
+
+	public void setDevice(String device) {
+		this.device = device;
+	}
+
+	public String getDevice() {
+		return device;
+	}
+
+	public String getIndividuality_signature() {
+		return individuality_signature;
+	}
+	public void setIndividuality_signature(String individuality_signature) {
+		this.individuality_signature = individuality_signature;
+	}
+
+	
+	public String getOffices_name() {
+		return offices_name;
+	}
+	public void setOffices_name(String offices_name) {
+		this.offices_name = offices_name;
+	}
+	
+	
+	public String getOffices_no() {
+		return offices_no;
+	}
+
+	public void setOffices_no(String offices_no) {
+		this.offices_no = offices_no;
+	}
+
+	public void setToken(String token) {
+		this.token = token;
+	}
+
+	public String getToken() {
+		return token;
+	}
+
+	public void setPositions(String positions) {
+		this.positions = positions;
+	}
+
+	public String getPositions() {
+		return positions;
+	}
+
+	
+}

+ 159 - 0
src/main/java/com/hnshituo/core/auth/vo/UserLogin.java

@@ -0,0 +1,159 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.UserLoginMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Table;
+
+@Table(name="CORE_AUTH_USER_LOGIN", namespace=UserLoginMapper.class)
+public class UserLogin extends BaseVO implements Serializable {
+	/**
+	 * 用户登录时间表
+	 */
+	private static final long serialVersionUID = 5866647375020618956L;
+
+	@Id
+	//主键
+	private String seq;
+	
+	@Column
+	//账号
+	private String login_name;
+	
+	@Column
+	//用户名
+	private String username;
+	
+	@Column
+	//部门编号
+	private String dept_id;
+	
+	@Column
+	//部门名称
+	private String dept_name;
+	
+	@Column
+	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	//登陆时间
+	private Date login_time;
+	
+	//检验时间
+	private String check_time;
+	
+	//每天的登录次数
+	private int day_count;
+	
+	//异常次数2天未登录
+	private int count;
+	
+	//时间段内未登录天数
+	private int seven_count;
+	
+	//最长未登录时长(天)
+	private int long_count;
+	
+	//是否登录过系统
+	private boolean login_in=true;
+	
+	public int getSeven_count() {
+		return seven_count;
+	}
+
+	public void setSeven_count(int sevenCount) {
+		seven_count = sevenCount;
+	}
+
+	public int getLong_count() {
+		return long_count;
+	}
+
+	public void setLong_count(int longCount) {
+		long_count = longCount;
+	}
+
+	public String getSeq() {
+		return seq;
+	}
+
+	public void setSeq(String seq) {
+		this.seq = seq;
+	}
+
+	public String getLogin_name() {
+		return login_name;
+	}
+
+	public void setLogin_name(String loginName) {
+		login_name = loginName;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getDept_id() {
+		return dept_id;
+	}
+
+	public void setDept_id(String deptId) {
+		dept_id = deptId;
+	}
+
+	public String getDept_name() {
+		return dept_name;
+	}
+
+	public void setDept_name(String deptName) {
+		dept_name = deptName;
+	}
+
+	public Date getLogin_time() {
+		return login_time;
+	}
+
+	public void setLogin_time(Date loginTime) {
+		login_time = loginTime;
+	}
+
+	public void setCount(int count) {
+		this.count = count;
+	}
+
+	public int getCount() {
+		return count;
+	}
+
+	public void setCheck_time(String check_time) {
+		this.check_time = check_time;
+	}
+
+	public String getCheck_time() {
+		return check_time;
+	}
+
+	public void setDay_count(int day_count) {
+		this.day_count = day_count;
+	}
+
+	public int getDay_count() {
+		return day_count;
+	}
+
+	public void setLogin_in(boolean login_in) {
+		this.login_in = login_in;
+	}
+
+	public boolean isLogin_in() {
+		return login_in;
+	}
+	
+}

+ 65 - 0
src/main/java/com/hnshituo/core/auth/vo/UserRole.java

@@ -0,0 +1,65 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.UserRoleMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Table;
+
+@Table(name="CORE_AUTH_USER_ROLE", namespace=UserRoleMapper.class)
+public class UserRole extends BaseVO implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -6443056419789286141L;
+
+	@Id
+	private Integer id;
+
+	/** 用户编号 */
+	@Column("USER_ID")
+	private String userId;
+
+	/** 角色编号 */
+	@Column("ROLE_ID")
+	private Integer roleId;
+	
+	private List<UserRole> userRoleList;
+
+	public Integer getId() {
+		return this.id;
+	}
+
+	public String getUserId() {
+		return this.userId;
+	}
+
+	public Integer getRoleId() {
+		return this.roleId;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+
+	public void setRoleId(Integer roleId) {
+		this.roleId = roleId;
+	}
+
+	public void setUserRoleList(List<UserRole> userRoleList) {
+		this.userRoleList = userRoleList;
+	}
+
+	public List<UserRole> getUserRoleList() {
+		return userRoleList;
+	}
+
+}

+ 159 - 0
src/main/java/com/hnshituo/core/auth/vo/UsersGroup.java

@@ -0,0 +1,159 @@
+package com.hnshituo.core.auth.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hnshituo.basic.vo.BaseVO;
+import com.hnshituo.core.auth.mapper.UsersGroupMapper;
+import com.hnshituo.orm.annotation.Column;
+import com.hnshituo.orm.annotation.Id;
+import com.hnshituo.orm.annotation.Table;
+
+@Table(name="CORE_AUTH_USERS_GROUP", namespace=UsersGroupMapper.class)
+public class UsersGroup extends BaseVO implements Serializable {
+
+	private static final long serialVersionUID = 22673269970780796L;
+	
+	/**
+	 * 组成员信息表
+	 */
+	@Id
+	private String id;
+	
+	@Column("GROUP_ID")
+	private String groupId;
+	
+	@Column("GROUP_NAME")
+	private String groupName;
+	
+	@Column("USER_ID")
+	private String userId;
+	
+	@Column("USER_NAEM")
+	private String userName;
+	
+	@Column("CREATE_MAN")
+	private String creatMan;
+	
+	@Column("CREATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date creatTime;
+	
+	@Column("UPDATE_MAN")
+	private String updateMan;
+	
+	@Column("UPDATE_TIME")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+
+	private List<UsersGroup> userGroups;
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getGroupId() {
+		return groupId;
+	}
+
+	public void setGroupId(String groupId) {
+		this.groupId = groupId;
+	}
+
+	public String getGroupName() {
+		return groupName;
+	}
+
+	public void setGroupName(String groupName) {
+		this.groupName = groupName;
+	}
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getCreatMan() {
+		return creatMan;
+	}
+
+	public void setCreatMan(String creatMan) {
+		this.creatMan = creatMan;
+	}
+
+	public Date getCreatTime() {
+		return creatTime;
+	}
+
+	public void setCreatTime(Date creatTime) {
+		this.creatTime = creatTime;
+	}
+
+	public String getUpdateMan() {
+		return updateMan;
+	}
+
+	public void setUpdateMan(String updateMan) {
+		this.updateMan = updateMan;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+	
+	public String toString(){
+		return "UsersGroup [id=" + id + ", groupId=" + groupId + ", groupName="
+				+ groupName + ", userId=" + userId + ", userName=" + userName + ", creatMan="
+				+ creatMan + ", creatTime=" + creatTime + "]";
+		
+	}
+
+	public void setUserGroups(List<UsersGroup> userGroups) {
+		this.userGroups = userGroups;
+	}
+
+	public List<UsersGroup> getUserGroups() {
+		return userGroups;
+	}
+	
+	//成员所属部门ID
+	private String deptId;
+	//成员所属部门名称
+	private String deptName;
+	public String getDeptId() {
+		return deptId;
+	}
+
+	public void setDeptId(String deptId) {
+		this.deptId = deptId;
+	}
+
+	public String getDeptName() {
+		return deptName;
+	}
+
+	public void setDeptName(String deptName) {
+		this.deptName = deptName;
+	}
+
+}

+ 17 - 0
src/main/java/com/hnshituo/core/auth/vo/UsersGroupSum.java

@@ -0,0 +1,17 @@
+package com.hnshituo.core.auth.vo;
+
+import java.util.List;
+
+public class UsersGroupSum {
+	
+	public List<UsersGroup> usersList;
+
+	public List<UsersGroup> getUsersList() {
+		return usersList;
+	}
+
+	public void setUsersList(List<UsersGroup> usersList) {
+		this.usersList = usersList;
+	}
+	
+}

+ 174 - 0
src/main/java/com/hnshituo/core/orm/plugins/MybatisInterceptor.java

@@ -0,0 +1,174 @@
+package com.hnshituo.core.orm.plugins;
+
+
+ 
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.ParameterMapping;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Plugin;
+import org.apache.ibatis.plugin.Signature;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+import org.apache.ibatis.type.TypeHandlerRegistry;
+import org.apache.log4j.Logger;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.hnshituo.core.auth.service.HomeService;
+ 
+@Intercepts({
+        @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
+                RowBounds.class, ResultHandler.class }) })
+public class MybatisInterceptor implements Interceptor {
+	private static Logger logger = Logger.getLogger(MybatisInterceptor.class);
+    private Properties properties;
+    
+    @Override
+	public Object intercept(Invocation invocation) throws Throwable {
+        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
+        Object parameter = null;
+        if (invocation.getArgs().length > 1) {
+            parameter = invocation.getArgs()[1];
+        }
+        
+        String sqlId = mappedStatement.getId();
+        String dataPrgCondition = null;
+        
+        if (parameter != null && Map.class.isAssignableFrom(parameter.getClass())) {
+        	HttpServletRequest request = getRequest();
+            String[] dataPrgs = (String[]) request.getAttribute(HomeService.REQUEST_DATA_PRG);
+            String fieldName = (String) request.getAttribute(HomeService.REQUEST_DATA_FIELD);
+            
+            if (fieldName != null) {
+            	dataPrgCondition = getDataPrgCondition(fieldName, dataPrgs);
+            }
+            ((Map)parameter).put("_dataPrg", dataPrgCondition);
+        }
+        
+        BoundSql boundSql = mappedStatement.getBoundSql(parameter);
+        Configuration configuration = mappedStatement.getConfiguration();
+        Object returnValue = null;
+        long start = System.currentTimeMillis();
+        
+        returnValue = invocation.proceed();
+        long end = System.currentTimeMillis();
+        long time = (end - start);
+        if (time > 1000) {
+        	String sql = getSql(configuration, boundSql, sqlId, time);
+            logger.warn("SQL执行时长:" + time + ", SQL:" + sql);
+        }
+        return returnValue;
+    }
+    
+    protected String getDataPrgCondition(String field, String[] dataPrgs) {
+    	String result = null;
+		StringBuilder deptIdCondition = null;
+		if (field != null && dataPrgs != null) {
+			deptIdCondition = new StringBuilder();
+			for (int i = 0; i < dataPrgs.length; i++) {
+				String deptId = dataPrgs[i];
+				if (i==0) {
+					deptIdCondition.append(" " + field + " LIKE '" + deptId + "%' ");
+				} else {
+					deptIdCondition.append(" OR " + field + " LIKE '" + deptId + "%'");
+				}
+			}
+			
+			if (deptIdCondition.length() > 0) {
+				deptIdCondition.insert(0, " (").append(") ");
+			} else {
+				deptIdCondition.append(" " + field + " is null ");
+			}
+			result = deptIdCondition.toString();
+		}		
+		return result;
+	}
+    
+    public HttpServletRequest getRequest() {
+		 return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+	}
+ 
+    public static String getSql(Configuration configuration, BoundSql boundSql, String sqlId, long time) {
+        String sql = showSql(configuration, boundSql);
+        StringBuilder str = new StringBuilder(100);
+        str.append(sqlId);
+        str.append(":");
+        str.append(sql);
+        str.append(":");
+        str.append(time);
+        str.append("ms");
+        return str.toString();
+    }
+ 
+    private static String getParameterValue(Object obj) {
+        String value = null;
+        if (obj instanceof String) {
+            value = "'" + obj.toString() + "'";
+        } else if (obj instanceof Date) {
+            DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);
+            value = "'" + formatter.format(new Date()) + "'";
+        } else {
+            if (obj != null) {
+                value = obj.toString();
+            } else {
+                value = "";
+            }
+ 
+        }
+        return value;
+    }
+ 
+    public static String showSql(Configuration configuration, BoundSql boundSql) {
+        Object parameterObject = boundSql.getParameterObject();
+        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
+        String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
+        if (parameterMappings.size() > 0 && parameterObject != null) {
+            TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
+            if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
+                sql = sql.replaceFirst("\\?", getParameterValue(parameterObject));
+ 
+            } else {
+                MetaObject metaObject = configuration.newMetaObject(parameterObject);
+                for (ParameterMapping parameterMapping : parameterMappings) {
+                    String propertyName = parameterMapping.getProperty();
+                    if (metaObject.hasGetter(propertyName)) {
+                        Object obj = metaObject.getValue(propertyName);
+                        sql = sql.replaceFirst("\\?", getParameterValue(obj));
+                    } else if (boundSql.hasAdditionalParameter(propertyName)) {
+                        Object obj = boundSql.getAdditionalParameter(propertyName);
+                        sql = sql.replaceFirst("\\?", getParameterValue(obj));
+                    }
+                }
+            }
+        }
+        return sql;
+    }
+ 
+    @Override
+	public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+ 
+    @Override
+	public void setProperties(Properties properties) {
+    	 String prop1 = properties.getProperty("prop1");
+         String prop2 = properties.getProperty("prop2");
+         System.out.println(prop1 + "------" + prop2);
+        this.properties = properties;
+    }
+}

+ 13 - 0
src/main/java/license.xml

@@ -0,0 +1,13 @@
+<License>
+  <Data>
+    <Products>
+      <Product>Aspose.Total for Java</Product>
+      <Product>Aspose.Words for Java</Product>
+    </Products>
+    <EditionType>Enterprise</EditionType>
+    <SubscriptionExpiry>20991231</SubscriptionExpiry>
+    <LicenseExpiry>20991231</LicenseExpiry>
+    <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
+  </Data>
+  <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
+</License>

+ 3500 - 0
src/main/java/market/Api/Lms/impl/LmsApiServiceImpl.java

@@ -0,0 +1,3500 @@
+/***文档注释***********************************************
+ * 作者               :                   龙文航
+ * 创建日期      :                   2017.11.29
+ * 描述               :                   Lms提供其他系统调用的公共接口
+ * 注意事项      :                   无
+ * 遗留BUG :                   无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+ ***********************************************************/
+
+package market.Api.Lms.impl;
+
+import static market.Api.Mes.impl.RestfulHttpClient.getClient;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import market.Api.Lms.service.LmsApiService;
+import market.Api.Mes.impl.MesApiDesignInfoImpl;
+import market.Api.Mes.impl.MesApiServiceImpl;
+import market.Api.Mes.impl.ProcessPoint;
+import market.Api.Mes.impl.RestfulHttpClient;
+import market.Api.Mes.impl.Utils;
+import market.Api.Qms.impl.QmsApiServiceImpl;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.mapper.ComBaseMachineMapper;
+import market.Com.vo.ComBaseInfo;
+import market.Com.vo.ComBaseMachine;
+import market.Com.vo.CommonPage;
+import market.Com.vo.PassportInfo;
+import market.Com.vo.PbModelDb;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.impl.IfRawMtrCoilChemServiceImpl;
+import market.Lms.Warehouse.impl.IfRawMtrCoilPfmcServiceImpl;
+import market.Lms.Warehouse.impl.YdmProductOutlistServiceImpl;
+import market.Lms.Warehouse.mapper.IfRawMtrCoilChemMapper;
+import market.Lms.Warehouse.mapper.IfRawMtrCoilChemMidMapper;
+import market.Lms.Warehouse.mapper.IfRawMtrCoilMMapper;
+import market.Lms.Warehouse.mapper.IfRawMtrCoilMMidMapper;
+import market.Lms.Warehouse.mapper.IfRawMtrCoilPfmcMapper;
+import market.Lms.Warehouse.mapper.IfRawMtrCoilPfmcMidMapper;
+import market.Lms.Warehouse.mapper.YdmBaseButtressconfigMapper;
+import market.Lms.Warehouse.mapper.YdmProductButtresslistMapper;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.mapper.YdmProductInlistMapper;
+import market.Lms.Warehouse.mapper.YdmProductOutlistMapper;
+import market.Lms.Warehouse.vo.IfRawMtrCoilChem;
+import market.Lms.Warehouse.vo.IfRawMtrCoilChemMid;
+import market.Lms.Warehouse.vo.IfRawMtrCoilM;
+import market.Lms.Warehouse.vo.IfRawMtrCoilMMid;
+import market.Lms.Warehouse.vo.IfRawMtrCoilPfmc;
+import market.Lms.Warehouse.vo.IfRawMtrCoilPfmcMid;
+import market.Lms.Warehouse.vo.YdmProductButtresslist;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Lms.Warehouse.vo.YdmProductInlist;
+import market.Lms.Warehouse.vo.YdmProductOutlist;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingDMapper;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingMMapper;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingD;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingM;
+import market.Mes.Lengthwise.Plan.mapper.MesCrCrossCuttingDMapper;
+import market.Mes.Lengthwise.Plan.mapper.MesCrCrossCuttingMMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMatReplaceLogMapper;
+import market.Mes.Lengthwise.Plan.vo.MesCrCrossCuttingD;
+import market.Mes.Lengthwise.Plan.vo.MesCrCrossCuttingM;
+import market.Mes.Lengthwise.Plan.vo.PlnMatReplaceLog;
+import market.Mes.MaterielTrack.vo.PrcMaterielProcess;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.Packing.Performance.mapper.MesCoilPackingMMapper;
+import market.Mes.Packing.Performance.vo.MesCoilPackingM;
+import market.Mes.anneal.vo.MesCrAnnealM;
+import market.Qms.common.DataHelper;
+import market.Qms.slmord.vo.SlmOrdDesignMscPlSti;
+import market.Qms.slmord.vo.SlmOrdDesignMscTic;
+import market.Qms.slmord.vo.SlmOrdDesignMscTicItem;
+import market.Slm.DeliveryManagement.mapper.SlmLadingBillHeatMapper;
+import market.Slm.DeliveryManagement.vo.SlmLadingBillHeat;
+import market.Slm.OrderManagement.impl.SlmOrderInfoServiceImpl;
+import market.Slm.OrderManagement.mapper.SlmOrderInfoMapper;
+import market.Slm.OrderManagement.vo.SlmOrderInfo;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.google.gson.Gson;
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.service.support.PageModel;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path="LmsApiService")
+public class LmsApiServiceImpl extends BaseServiceImpl implements LmsApiService {	
+
+	/**
+	 * 查询库存信息中是否存在相应卷号的数据
+	 * */
+	public ResultModel doFindCoilno(CommonPage<YdmProductDetail> cp)
+	{
+		ResultModel rm=new ResultModel();
+		try
+		{
+			//			YdmProductDetail ypd=new YdmProductDetail();
+			//			ypd.setCoilno(cp.getObject().getCoilno());
+			List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(cp.getObject(), 0, 0);
+			if(lypd!=null&&lypd.size()>0)
+			{
+				rm.setState("200");
+				rm.setData(lypd);
+			}
+			else
+			{
+				rm.setState("500");
+				rm.setMsgInfo("库存中无实物["+cp.getObject().getCoilno()+"]信息!");
+			}
+		}
+		catch(Exception ex)
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询卷号失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * 查询库存信息
+	 * */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryWebBySQLOther(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm=new ResultModel();
+		int pageIndex=cp.getPageIndex();
+		int pageSize=cp.getPageSize();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex,pageSize);
+		try {
+			cp.setMemo1(null);
+			cp.setMemo2(null);
+
+			Object wjmin="",wjmax="";
+			if(cp.getMemo1()!=null&&cp.getMemo1()!="")
+				wjmin=Double.valueOf(cp.getMemo1()).doubleValue();
+			if(cp.getMemo2()!=null&&cp.getMemo2()!="")
+				wjmax=Double.valueOf(cp.getMemo2()).doubleValue();
+			Object thick,width;
+			if(cp.getObject().getThick()!=null && cp.getObject().getThick()==0)
+				thick="";
+			else 
+				thick=cp.getObject().getThick();
+			if(cp.getObject().getWidth()!=null && cp.getObject().getWidth()==0)
+				width="";
+			else 
+				width=cp.getObject().getWidth();
+
+			if((cp.getObject().getJudgesteelcode()==null||"".equals(cp.getObject().getJudgesteelcode()))&&cp.getObject().getSteelcode()!=null&&!"".equals(cp.getObject().getSteelcode()))
+				cp.getObject().setJudgesteelcode(cp.getObject().getSteelcode());
+
+
+			pm.setRows(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySQLOther
+					((pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize, cp.getStartTime(), cp.getEndTime(), cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+							thick,width,wjmin,wjmax,cp.getObject().getStorageattr(),cp.getObject().getJudgesteelcode()));
+			pm.setTotal(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySQLCountOther
+					(cp.getStartTime(), cp.getEndTime(), cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+							thick,width,wjmin,wjmax,cp.getObject().getStorageattr(),cp.getObject().getJudgesteelcode()));
+			rm.setData(pm);
+			rm.setState("200");
+		}
+		catch(Exception ex)
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * 投料出库
+	 * cp.object<YdmProductDetail>,ypd.setCoilno()
+	 * @throws Exception 
+	 * */
+	public void doOutStorage(CommonPage<YdmProductDetail> cp) throws Exception {
+		YdmProductDetail ypdo= new YdmProductDetail();
+		ypdo.setCoilno(cp.getObject().getCoilno());	
+		ypdo.setState("0");
+		List<YdmProductDetail> list=this.getMapper(YdmProductDetailMapper.class).find(ypdo, 0, 0);
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date now = new Date();
+		if(list!=null && list.size()>0) {
+			for(YdmProductDetail ypd:list) {
+				String lastChar = ypd.getCoilno().substring(ypd.getCoilno().length()-1);
+				if (!"B".equals(lastChar) && !"H".equals(lastChar)) {
+					if (ypd.getJudgeresult()==null || "".equals(ypd.getJudgeresult())) {
+						throw new Exception("卷号【"+ypd.getCoilno()+"】没有综合判定,无法投料出库");
+					}
+				}
+				
+				//插入出库信息
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setOutbillno(this.getBean(YdmProductOutlistServiceImpl.class).createOUTBILLNO());
+				ypo.setCreater(username);
+				ypo.setCreatedate(now);
+				ypo.setOuttype("500501");
+				ypo.setOutdate(now);
+				ypo.setOutoperator(username);
+				ypo.setOutorder("2");
+				ypo.setOutteam("3");
+
+				ypo.setCoilno(ypd.getCoilno());
+				//QmsApiServiceImpl.Copy(ypd, ypo);
+				ypo.setCoiltype(ypd.getCoiltype());
+				ypo.setMaterailtype(ypd.getMaterailtype());
+				ypo.setSource(ypd.getSource());
+				ypo.setMaterailsupplier(ypd.getMaterailsupplier());
+				ypo.setIsbox(ypd.getIsbox());
+				ypo.setBoxno(ypd.getBoxno());
+				ypo.setDrawingno(ypd.getDrawingno());
+				ypo.setBatchno(ypd.getBatchno());
+				ypo.setHeatno(ypd.getBatchno());
+				ypo.setSmpno(ypd.getSmpno());
+				ypo.setManagementno(ypd.getManagementno());
+				ypo.setStorageattr(ypd.getStorageattr());
+				ypo.setProd_code(ypd.getProd_code());
+				ypo.setProd_name(ypd.getProd_name());
+				ypo.setStd_code(ypd.getStd_code());
+				ypo.setStd_name(ypd.getStd_name());
+				ypo.setUse_code(ypd.getUse_code());
+				ypo.setUse_name(ypd.getUse_name());
+				ypo.setPline_name(ypd.getPline_name());
+				ypo.setPostid(ypd.getPostid());
+				ypo.setThick(ypd.getThick());
+				ypo.setWidth(ypd.getWidth());
+				ypo.setLength(ypd.getLength());
+				ypo.setDiameter_inn(ypd.getDiameter_inn());
+				ypo.setDiameter_out(ypd.getDiameter_out());
+				ypo.setQuantity(ypd.getQuantity());
+				ypo.setTheoryweight(ypd.getTheoryweight());
+				ypo.setCoreweight(ypd.getCoreweight());
+				ypo.setGrossweight(ypd.getGrossweight());
+				ypo.setPackweight(ypd.getPackweight());
+				ypo.setFactweight(ypd.getFactweight());
+				ypo.setCustomer_nm(ypd.getCustomer_nm());
+				ypo.setCustomer_no(ypd.getCustomer_no());
+				ypo.setReceiv_no(ypd.getReceiv_no());
+				ypo.setReceiv_nm(ypd.getReceiv_nm());
+				ypo.setOrderno(ypd.getOrderno());
+				ypo.setProdorderno(ypd.getProdorderno());
+				ypo.setSteelcode(ypd.getSteelcode());
+				ypo.setJudgesteelcode(ypd.getJudgesteelcode());
+				ypo.setPacking_group(ypd.getPacking_group());
+				ypo.setChemresult(ypd.getChemresult());
+				ypo.setSizeresult(ypd.getSizeresult());
+				ypo.setSurfaceresult(ypd.getSurfaceresult());
+				ypo.setWeightresult(ypd.getWeightresult());
+				ypo.setJudgeresult(ypd.getJudgeresult());
+				ypo.setPhysresult(ypd.getPhysresult());
+				ypo.setSpyresult(ypd.getSpyresult());
+				ypo.setProducedate(ypd.getProducedate());
+				ypo.setProduceorder(ypd.getProduceorder());
+				ypo.setProduceteam(ypd.getProduceteam());
+				ypo.setIndate(ypd.getIndate());
+				ypo.setInorder(ypd.getInorder());
+				ypo.setInteam(ypd.getInteam());
+
+				YdmProductButtresslist but = new YdmProductButtresslist();
+				but.setCoilno(ypd.getCoilno());
+				List<YdmProductButtresslist> butlist =	this.getMapper(YdmProductButtresslistMapper.class).find(but, 0, 0);
+				if(butlist!=null&&butlist.size()>0) {
+					ypo.setButtressno(butlist.get(0).getButtressno());
+					ypo.setLocality((long)butlist.get(0).getLocality());
+					ypo.setLayer((long) 1);
+				}
+				else {
+					ypo.setButtressno(ypd.getButtressno());
+				}
+				
+				// 加入物料属性:20230725刘侣
+				ypo.setObj_attr_out(ypd.getObject_attr());
+				// end
+				
+				this.getMapper(YdmProductOutlistMapper.class).insert(ypo);
+				//删除垛位信息
+				if((ypd.getBoxno()!=null&&ypd.getBoxno()!="")||(ypd.getCoilno()!=null&&ypd.getCoilno()!="")){
+					this.getMapper(YdmProductButtresslistMapper.class).doDelete(ypd.getCoilno(),ypd.getBoxno());
+				}
+				
+				//修改库存信息
+				ypd.setUpdater(username);
+				ypd.setUpdatedate(now);
+				ypd.setState("5");
+				this.getMapper(YdmProductDetailMapper.class).doUpdate(ypd);
+
+				//调用生产计划模块物料跟踪接口
+				PrcMaterielProcess pmp = new PrcMaterielProcess();
+				pmp.setObject_no(ypd.getCoilno());
+				pmp.setPrc_code("5BYS10");
+
+				//这里的格式要和字符串日期的格式匹配,不然会抛出转换异常   
+				SimpleDateFormat   dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+				Date date2 = dateFormat.parse(cp.getObject().getMemo());
+				if(date2!=null&&!"".equals(date2)) {
+					pmp.setCreate_time(date2);
+				}
+				else {
+					pmp.setCreate_time(now);
+				}
+				pmp.setRemark("投料出库");
+				pmp.setCreate_man_name(username);
+				this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+				//int tmp= this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+			}
+		}
+		else{
+			throw new Exception("不在库不允许操作!");
+		}
+	}
+
+
+
+
+
+	/**
+	 * 生成主键
+	 * @return
+	 * @throws Exception 
+	 */
+	@SuppressWarnings("rawtypes")
+	public String createINBILLNO() throws Exception {
+		try {
+			String inbillno="";
+			List<HashMap> list = this.getMapper(YdmProductInlistMapper.class).getNo("IN"+(new SimpleDateFormat("yyyyMMdd").format(new Date())));
+			inbillno = (String) list.get(0).get("MAXNO");
+			return inbillno;
+		} 
+		catch (Exception ex) 
+		{
+			throw (ex);
+		}
+	}
+
+	/**
+	 * 原料卷退回原料库
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doCanceOutStorage(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+
+		//YdmProductDetail ypdo=cp.getObject();
+		//ypdo.setState("0");
+		//	List<YdmProductDetail> list=this.getMapper(YdmProductDetailMapper.class).find(ypdo, 0, 0);
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		ResultModel rm=new ResultModel();
+		for(YdmProductDetail ypd:cp.getObjectList())
+		{
+			YdmProductDetail yd= new YdmProductDetail();
+			yd.setCoilno(ypd.getMaterailcoilno());
+			//获取老卷号信息
+			List<YdmProductDetail> ago = this.getMapper(YdmProductDetailMapper.class).find(yd, 0, 1);
+
+			yd = ago.get(0);
+
+			yd.setCoilno(ypd.getCoilno());
+
+			yd.setLength(ypd.getLength());
+			yd.setDiameter_inn(ypd.getDiameter_inn());
+			yd.setDiameter_out(ypd.getDiameter_out());
+			yd.setTheoryweight(ypd.getTheoryweight());
+			yd.setFactweight(ypd.getFactweight());
+			yd.setOrderno(null);
+			yd.setProdorderno(null);
+			yd.setState("0");
+
+			this.getMapper(YdmProductDetailMapper.class).doInsert(yd);
+
+			//插入垛位信息
+			YdmProductButtresslist ybt = new YdmProductButtresslist();
+			ybt.setButtressno("100102001");
+			ybt.setCoilno(ypd.getCoilno());
+			ybt.setStorageattr(ypd.getSteelcode());
+			ybt.setCreatedate(new Date());
+			ybt.setAreano("100102");
+			ybt.setLayer(1);
+			ybt.setLocality(0);
+			this.getMapper(YdmProductButtresslistMapper.class).doInsert(ybt);
+
+
+			//插入入库信息
+			YdmProductInlist ypi=new YdmProductInlist();
+			ypi.setInbillno(this.createINBILLNO());
+			if(ypi.getCreatedate()==null||"".equals(ypi.getCreatedate())) {
+				ypi.setCreatedate(new Date());
+			}
+			if (ypi.getCreater()==null||"".equals(ypi.getCreater())) {
+				ypi.setCreater(username);
+			}
+			ypi.setCoilno(yd.getCoilno());
+			ypi.setCoiltype(yd.getCoiltype());
+			ypi.setMaterailtype(yd.getMaterailtype());
+			ypi.setSource(yd.getSource());
+			ypi.setMaterailsupplier(yd.getMaterailsupplier());
+			ypi.setIsbox(yd.getIsbox());
+			ypi.setBoxno(yd.getBoxno());
+			ypi.setDrawingno(yd.getDrawingno());
+			ypi.setBatchno(yd.getBatchno());
+			ypi.setHeatno(yd.getBatchno());
+			ypi.setSmpno(yd.getSmpno());
+			ypi.setManagementno(yd.getManagementno());
+			ypi.setStorageattr(yd.getStorageattr());
+			ypi.setProd_code(yd.getProd_code());
+			ypi.setProd_name(yd.getProd_name());
+			ypi.setStd_code(yd.getStd_code());
+			ypi.setStd_name(yd.getStd_name());
+			ypi.setUse_code(yd.getUse_code());
+			ypi.setUse_name(yd.getUse_name());
+			ypi.setPline_name(yd.getPline_name());
+			ypi.setPostid(yd.getPostid());
+			ypi.setThick(yd.getThick());
+			ypi.setWidth(yd.getWidth());
+			ypi.setLength(yd.getLength());
+			ypi.setDiameter_inn(yd.getDiameter_inn());
+			ypi.setDiameter_out(yd.getDiameter_out());
+			ypi.setQuantity(yd.getQuantity());
+			ypi.setTheoryweight(yd.getTheoryweight());
+			ypi.setCoreweight(yd.getCoreweight());
+			ypi.setGrossweight(yd.getGrossweight());
+			ypi.setPackweight(yd.getPackweight());
+			ypi.setFactweight(yd.getFactweight());
+			ypi.setCustomer_nm(yd.getCustomer_nm());
+			ypi.setCustomer_no(yd.getCustomer_no());
+			ypi.setReceiv_no(yd.getReceiv_no());
+			ypi.setReceiv_nm(yd.getReceiv_nm());
+			ypi.setOrderno(yd.getOrderno());
+			ypi.setProdorderno(yd.getProdorderno());
+			ypi.setSteelcode(yd.getSteelcode());
+			ypi.setJudgesteelcode(yd.getJudgesteelcode());
+			ypi.setPacking_group(yd.getPacking_group());
+			ypi.setChemresult(yd.getChemresult());
+			ypi.setSizeresult(yd.getSizeresult());
+			ypi.setSurfaceresult(yd.getSurfaceresult());
+			ypi.setWeightresult(yd.getWeightresult());
+			ypi.setJudgeresult(yd.getJudgeresult());
+			ypi.setPhysresult(yd.getPhysresult());
+			ypi.setSpyresult(yd.getSpyresult());
+			ypi.setProducedate(yd.getProducedate());
+			ypi.setProduceorder(yd.getProduceorder());
+			ypi.setProduceteam(yd.getProduceteam());
+			if(ypi.getIndate()==null||"".equals(ypi.getIndate()))
+			{
+				ypi.setIndate(new Date());
+			}
+			///ypi.setInorder(order);
+			//ypi.setInteam(team);
+			ypi.setOperator(username);
+			ypi.setIntype("500405");
+			ypi.setLocality("1");
+
+			ypi.setPosition("0");
+			ypi.setMemo(yd.getMemo());
+			ypi.setButtressno("100102001");
+			
+			// 加入物料属性:20230725刘侣
+			ypi.setObj_attr_in(yd.getObject_attr());
+			// end
+			
+			this.getMapper(YdmProductInlistMapper.class).insert(ypi);
+
+
+
+
+			rm.setState("200");
+
+		}
+
+		return rm;
+
+	}
+
+
+	/**
+	 * 判断是否允许出库撤销
+	 * cp.object<YdmProductDetail>,ypd.setCoilno()
+	 * */
+	public ResultModel doDepend(CommonPage<YdmProductDetail> cp)
+	{
+		ResultModel rm=new ResultModel();
+		try
+		{
+			YdmProductDetail ypdo= new  YdmProductDetail();
+			ypdo.setCoilno(cp.getObject().getCoilno());
+			ypdo.setState("5");
+			List<YdmProductDetail> list=this.getMapper(YdmProductDetailMapper.class).find(ypdo, 0, 0);
+			if(list!=null&&list.size()>0)
+			{
+				rm.setState("200");
+			}
+			else 
+			{
+				rm.setState("500");
+				rm.setMsgInfo("未出库不允许操作!");
+			}
+		}
+		catch(Exception ex)
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,判断失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * 撤销出库
+	 * cp.object<YdmProductDetail>,ypd.setCoilno()
+	 * @throws Exception 
+	 * */
+	public void doCancelOut(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+
+		YdmProductDetail ypdo= new YdmProductDetail();
+		ypdo.setCoilno(cp.getObject().getCoilno());
+		ypdo.setState("5");
+		List<YdmProductDetail> list=this.getMapper(YdmProductDetailMapper.class).find(ypdo, 0, 0);
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		if(list!=null&&list.size()>0)
+		{
+			for(YdmProductDetail ypd:list)
+			{
+				//修改库存信息
+				ypd.setState("0");
+				ypd.setUpdatedate(new Date());
+				ypd.setUpdater(username);
+				this.getMapper(YdmProductDetailMapper.class).doUpdate(ypd);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setOuttype("500501");
+				ypo.setCoilno(ypd.getCoilno());				
+				if(ypo.getCoilno()!=null&&ypo.getCoilno()!="")
+				{
+					//保存要删除的最近一条出库记录的垛位信息
+					YdmProductOutlist ypo1=new YdmProductOutlist();
+					ypo1=this.getMapper(YdmProductOutlistMapper.class).doFindRecent(ypo.getCoilno(), ypo.getOuttype());
+					//插入垛位信息
+					YdmProductButtresslist ypb=new YdmProductButtresslist();
+					ypb.setCoilno(ypo1.getCoilno());
+					if(ypo1.getLayer()!=null)
+						ypb.setLayer(ypo1.getLayer().intValue());
+					ypb.setButtressno(ypo1.getButtressno());
+					if(ypo1.getLocality()!=null)
+						ypb.setLocality(ypo1.getLocality().intValue());
+					ypb.setStorageattr(ypo1.getStorageattr());
+					ypb.setBoxno(ypo1.getBoxno());
+					ypb.setCreater(username);
+					ypb.setCreatedate(new Date());
+					this.getMapper(YdmProductButtresslistMapper.class).doInsert(ypb);
+					//删除最近一条出库记录
+					this.getMapper(YdmProductOutlistMapper.class).doDeleteRecent(ypo.getCoilno(), ypo.getOuttype());
+				}
+			}
+		}
+		else {
+			throw new Exception("未出库不允许操作!");
+		}
+
+	}
+
+	/**
+	 * 修改包装等级
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doUpdatePackingGroup(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+		ResultModel rm=new ResultModel();
+		List<YdmProductDetail> list=cp.getObjectList();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		//修改库存信息
+		for(YdmProductDetail ypd:list)
+		{
+			if(ypd.getCoilno()!=null&&ypd.getCoilno()!="")
+			{
+				YdmProductDetail ypd1=new YdmProductDetail();
+				ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+				if(ypd1!=null)
+				{
+					ypd1.setUpdatedate(new Date());
+					ypd1.setUpdater(username);
+					ypd1.setPacking_group(ypd.getPacking_group());
+					this.getMapper(YdmProductDetailMapper.class).doUpdate(ypd1);
+				}
+				else 
+				{
+					throw new Exception();
+				}
+			}
+			else 
+			{
+				rm.setState("500");
+				rm.setMsgInfo(rm.getMsgInfo()+"传入的卷号为空!");
+			}
+		}
+		rm.setState("200");
+		return rm;
+	}
+
+	/**
+	 * 原始钢卷出库
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doRollOut(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+		ResultModel rm=new ResultModel();
+		List<YdmProductDetail> list=cp.getObjectList();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		//修改库存信息
+		for(YdmProductDetail ypd:list)
+		{
+			YdmProductDetail ypd1=new YdmProductDetail();
+			if(ypd.getCoilno()!=null&&ypd.getCoilno()!="")
+			{
+				ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+				if(ypd1!=null)
+				{
+					ypd1.setUpdatedate(new Date());
+					ypd1.setUpdater(username);
+					ypd1.setState("4");
+					this.getMapper(YdmProductDetailMapper.class).doUpdate(ypd1);
+					//插入出库信息
+					YdmProductOutlist ypo=new YdmProductOutlist();
+					ypo.setCreatedate(new Date());
+					ypo.setCreater(username);
+					ypo.setOutbillno(this.getBean(YdmProductOutlistServiceImpl.class).createOUTBILLNO());
+					ypo.setOutdate(new Date());
+					ypo.setOutoperator(username);
+					ypo.setOuttype("500507");
+					ypo.setOutorder("2");
+					ypo.setOutteam("3");
+					ypo.setCoilno(ypd1.getCoilno());
+					ypo.setCoiltype(ypd1.getCoiltype());
+					ypo.setMaterailtype(ypd1.getMaterailtype());
+					ypo.setSource(ypd1.getSource());
+					ypo.setMaterailsupplier(ypd1.getMaterailsupplier());
+					ypo.setIsbox(ypd1.getIsbox());
+					ypo.setBoxno(ypd1.getBoxno());
+					ypo.setDrawingno(ypd1.getDrawingno());
+					ypo.setBatchno(ypd1.getBatchno());
+					ypo.setHeatno(ypd1.getBatchno());
+					ypo.setSmpno(ypd1.getSmpno());
+					ypo.setManagementno(ypd1.getManagementno());
+					ypo.setStorageattr(ypd1.getStorageattr());
+					ypo.setProd_code(ypd1.getProd_code());
+					ypo.setProd_name(ypd1.getProd_name());
+					ypo.setStd_code(ypd1.getStd_code());
+					ypo.setStd_name(ypd1.getStd_name());
+					ypo.setUse_code(ypd1.getUse_code());
+					ypo.setUse_name(ypd1.getUse_name());
+					ypo.setPline_name(ypd1.getPline_name());
+					ypo.setPostid(ypd1.getPostid());
+					ypo.setThick(ypd1.getThick());
+					ypo.setWidth(ypd1.getWidth());
+					ypo.setLength(ypd1.getLength());
+					ypo.setDiameter_inn(ypd1.getDiameter_inn());
+					ypo.setDiameter_out(ypd1.getDiameter_out());
+					ypo.setQuantity(ypd1.getQuantity());
+					ypo.setTheoryweight(ypd1.getTheoryweight());
+					ypo.setCoreweight(ypd1.getCoreweight());
+					ypo.setGrossweight(ypd1.getGrossweight());
+					ypo.setPackweight(ypd1.getPackweight());
+					ypo.setFactweight(ypd1.getFactweight());
+					ypo.setCustomer_nm(ypd1.getCustomer_nm());
+					ypo.setCustomer_no(ypd1.getCustomer_no());
+					ypo.setReceiv_no(ypd1.getReceiv_no());
+					ypo.setReceiv_nm(ypd1.getReceiv_nm());
+					ypo.setOrderno(ypd1.getOrderno());
+					ypo.setProdorderno(ypd1.getProdorderno());
+					ypo.setSteelcode(ypd1.getSteelcode());
+					ypo.setJudgesteelcode(ypd1.getJudgesteelcode());
+					ypo.setPacking_group(ypd1.getPacking_group());
+					ypo.setChemresult(ypd1.getChemresult());
+					ypo.setSizeresult(ypd1.getSizeresult());
+					ypo.setSurfaceresult(ypd1.getSurfaceresult());
+					ypo.setWeightresult(ypd1.getWeightresult());
+					ypo.setJudgeresult(ypd1.getJudgeresult());
+					ypo.setPhysresult(ypd1.getPhysresult());
+					ypo.setSpyresult(ypd1.getSpyresult());
+					ypo.setProducedate(ypd1.getProducedate());
+					ypo.setProduceorder(ypd1.getProduceorder());
+					ypo.setProduceteam(ypd1.getProduceteam());
+					ypo.setIndate(ypd1.getIndate());
+					ypo.setInorder(ypd1.getInorder());
+					ypo.setInteam(ypd1.getInteam());
+					ypo.setButtressno(ypd1.getButtressno());
+					
+					// 加入物料属性:20230725刘侣
+					ypo.setObj_attr_out(ypd1.getObject_attr());
+					// end
+					
+					this.getMapper(YdmProductOutlistMapper.class).insert(ypo);
+				}
+				else 
+				{
+					throw new Exception();
+				}
+			}
+			else 
+			{
+				rm.setState("500");
+				rm.setMsgInfo(rm.getMsgInfo()+"传入的卷号为空!");
+			}
+		}
+		rm.setState("200");
+		return rm;
+	}
+
+	/**
+	 * 成品包号插入库存
+	 * @throws Exception 
+	 * */
+	public ResultModel doFinishedIn(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+		ResultModel rm=new ResultModel();
+		YdmProductDetail ypd=cp.getObject();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		if(ypd.getPacking_no()!=null&&ypd.getPacking_no()!=null)
+		{
+			//插入库存
+			MesCoilPackingM mes=this.getMapper(MesCoilPackingMMapper.class).findById(ypd.getPacking_no());
+			if(mes!=null)
+			{
+				YdmProductDetail ypd2=new YdmProductDetail();
+				ypd2.setCreatedate(new Date());
+				ypd2.setCreater(username);
+				ypd2.setCoiltype("2");
+				ypd2.setState("-1");
+				ypd2.setSource("1");
+				ypd2.setSteelcode(mes.getSteel_code());
+				ypd2.setCoilno(mes.getPacking_no());
+				ypd2.setThick(mes.getOrd_thk());
+				ypd2.setWidth(mes.getOrd_wdt());
+				ypd2.setLength(mes.getOrd_len());
+				ypd2.setDiameter_inn(mes.getOrd_inn_dia());
+				ypd2.setDiameter_out(mes.getOrd_out_dia());
+				ypd2.setQuantity(mes.getCoil_cnt());
+				ypd2.setGrossweight(mes.getCoil_gross_wgt());
+				ypd2.setFactweight(mes.getCoil_net_wgt());
+				ypd2.setPackweight(mes.getCoil_tare_wgt());
+				ypd2.setOrderno(mes.getOrder_no());
+				ypd2.setProdorderno(mes.getProd_order_no());
+				this.getMapper(YdmProductDetailMapper.class).doInsert(ypd2);
+				rm.setState("200");
+			}
+			else 
+			{
+				throw new Exception();
+			}
+		}
+		else 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("传入的包装卷包号为空!");
+		}
+		return rm;
+	}
+
+	/**
+	 * 验证包装出库
+	 * */
+	public ResultModel doConfirmPackingOut(CommonPage<YdmProductDetail> cp)
+	{
+		ResultModel rm=new ResultModel();
+		try 
+		{
+			YdmProductDetail ypd=cp.getObject();
+			if(ypd.getCoilno()!=null&&!"".equals(ypd.getCoilno()))
+			{
+				YdmProductDetail ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+				if(ypd1!=null)
+				{
+					if("4".equals(ypd1.getState()))
+						rm.setState("200");
+					else 
+					{
+						rm.setState("500");
+						rm.setMsgInfo("库存记录状态不为包装出库!");
+					}
+				}
+				else 
+				{
+					rm.setState("500");
+					rm.setMsgInfo("库存记录不存在!");
+				}
+			}
+			else 
+			{
+				rm.setState("500");
+				rm.setMsgInfo("传入卷号为空!");
+			}
+		} 
+		catch (Exception ex) 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,验证包装出库失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * cp.getObject().getCoilno()
+	 * 传入卷号进行验证,验证卷号是否为待入库状态
+	 * 验证待入库
+	 * */
+	public ResultModel doConfirmWaitIn(CommonPage<YdmProductDetail> cp)
+	{
+		ResultModel rm=new ResultModel();
+		try 
+		{
+			YdmProductDetail ypd=cp.getObject();
+			if(ypd.getCoilno()!=null&&!"".equals(ypd.getCoilno()))
+			{
+				YdmProductDetail ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+				if(ypd1!=null)
+				{
+					if("-1".equals(ypd1.getState()))
+						rm.setState("200");
+					else 
+					{
+						rm.setState("500");
+						rm.setMsgInfo("库存记录状态不为待入库!");
+					}
+				}
+				else 
+				{
+					rm.setState("500");
+					rm.setMsgInfo("库存记录不存在!");
+				}
+			}
+			else 
+			{
+				rm.setState("500");
+				rm.setMsgInfo("传入卷号为空!");
+			}
+		} 
+		catch (Exception ex) 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,验证包装出库失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * 撤销包装出库
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doCancelPackingOut(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+		ResultModel rm=new ResultModel();
+		List<YdmProductDetail> list=cp.getObjectList();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		for(YdmProductDetail ypd:list)
+		{
+			if(ypd.getCoilno()!=null&&!"".equals(ypd.getCoilno()))
+			{
+				YdmProductDetail ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+				if(ypd1!=null)
+				{
+					//修改库存信息
+					ypd1.setUpdatedate(new Date());
+					ypd1.setUpdater(username);
+					ypd1.setPacking_group(null);
+					ypd1.setState("0");
+					this.getMapper(YdmProductDetailMapper.class).doUpdate(ypd1);
+					//删除出库记录
+					this.getMapper(YdmProductOutlistMapper.class).doDeleteByCoilno(ypd1.getCoilno());
+					rm.setState("200");
+				}
+				else 
+				{
+					throw new Exception();
+				}
+			}
+			else 
+			{
+				rm.setState("500");
+				rm.setMsgInfo(rm.getMsgInfo()+"传入的卷号为空!");
+			}
+		}
+		return rm;
+	}
+
+	/**
+	 * 删除包装后库存
+	 * */
+	public ResultModel doDeleteFinishedRoll(CommonPage<YdmProductDetail> cp)
+	{
+		ResultModel rm=new ResultModel();
+		YdmProductDetail ypd=cp.getObject();
+		if(ypd.getCoilno()!=""&&ypd.getCoilno()!=null)
+		{
+			this.getMapper(YdmProductDetailMapper.class).doDelete(ypd.getCoilno(), ypd.getBoxno());
+			rm.setState("200");
+		}
+		else 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("传入的卷号为空!");
+		}
+		return rm;
+	}
+
+	/**
+	 * 修改卷包库存明细
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doUpdateDetail(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+		ResultModel rm=new ResultModel();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		YdmProductDetail ypd=cp.getObject();
+		if(ypd.getCoilno()!=""&&ypd.getCoilno()!=null)
+		{
+			YdmProductDetail ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+			if(ypd1!=null)
+			{
+				ypd1.setPacking_group(ypd.getPacking_group());
+				ypd1.setGrossweight(ypd.getGrossweight());
+				ypd1.setFactweight(ypd.getFactweight());
+				ypd1.setPackweight(ypd.getPackweight());
+				ypd1.setUpdatedate(new Date());
+				ypd1.setUpdater(username);
+				this.getMapper(YdmProductDetailMapper.class).doUpdate(ypd1);
+				rm.setState("200");
+			}
+			else 
+			{
+				throw new Exception();
+			}
+		}
+		else 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("传入的卷号为空!");
+		}
+		return rm;
+	}
+
+	/**
+	 * 修改库存班次班组
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doUpdateOrderTeam(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+		ResultModel rm=new ResultModel();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		List<YdmProductDetail> list=cp.getObjectList();
+		for(YdmProductDetail ypd:list)
+		{
+			if(ypd.getCoilno()!=null&&ypd.getCoilno()!="")
+			{
+				YdmProductDetail ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+				if(ypd1!=null)
+				{
+					ypd1.setUpdatedate(new Date());
+					ypd1.setUpdater(username);
+					ypd1.setProducedate(ypd.getProducedate());
+					ypd1.setProduceorder(ypd.getProduceorder());
+					ypd1.setProduceteam(ypd.getProduceteam());
+					this.getMapper(YdmProductDetailMapper.class).doUpdate(ypd1);
+					rm.setState("200");
+				}
+				else 
+				{
+					throw new Exception();
+				}
+			}
+			else 
+			{
+				rm.setState("500");
+				rm.setMsgInfo(rm.getMsgInfo()+"传入的卷号为空!");
+			}
+		}
+		return rm;
+	}
+
+	/**
+	 * cp.getObject(),传入卷号或者箱号
+	 * 分条/包装生产下线
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doProduceOutLine(CommonPage<YdmProductDetail> cp)
+	{
+		ResultModel rm=new ResultModel();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		YdmProductDetail ypd=cp.getObject();
+		if((ypd.getCoilno()!=null&&ypd.getCoilno()!="")||(ypd.getBoxno()!=null&&ypd.getBoxno()!=""))
+		{
+			YdmProductDetail ypdtest=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+			if(ypdtest!=null)
+			{
+				rm.setState("500");
+				rm.setMsgInfo("已存在对应箱号/卷号的库存信息!");
+			}
+			else 
+			{
+				//新增库存记录
+				if(ypd.getStorageattr()!=null&&!"".equals(ypd.getStorageattr()))
+				{
+					ypd.setManagementno(this.getMapper(YdmBaseButtressconfigMapper.class).GetManagementNo(ypd.getStorageattr()));
+				}
+				ypd.setCreatedate(new Date());
+				ypd.setCreater(username);
+				ypd.setJudgesteelcode(ypd.getSteelcode());
+				ypd.setState("-1");
+				ypd.setSource("0");
+				this.getMapper(YdmProductDetailMapper.class).doInsert(ypd);
+			}
+		}
+		else 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("传入的卷号/箱号均为空!");
+		}
+		return rm;
+	}
+
+	/**
+	 * cp.getObject();传入卷号或者箱号
+	 * 入库撤销
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doCancelIn(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+		ResultModel rm=new ResultModel();
+		YdmProductDetail ypd=cp.getObject();
+		if((ypd.getCoilno()!=null&&!"".equals(ypd.getCoilno()))||(ypd.getBoxno()!=null&&!"".equals(ypd.getBoxno())))
+		{
+			YdmProductDetail ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(ypd.getCoilno(), ypd.getBoxno());
+			if(ypd1!=null&&"-1".equals(ypd1.getState()))
+			{
+				this.getMapper(YdmProductDetailMapper.class).doDelete(ypd.getCoilno(), ypd.getBoxno());
+			}
+			else 
+			{
+				throw new Exception();
+			}
+		}
+		else 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("传入的卷号/箱号为空!");
+		}
+		return rm;
+	}
+
+	/**
+	 * 新钢原料卷获取
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doGetRoll() throws Exception {
+		ResultModel rm=new ResultModel();
+		IfRawMtrCoilMMid mmid = new IfRawMtrCoilMMid();
+		mmid.setStatus("0");
+		List<IfRawMtrCoilMMid> list=this.getMapper(IfRawMtrCoilMMidMapper.class).find(mmid, 0, 0);
+		if(list!=null&&list.size()>0) {
+			for(IfRawMtrCoilMMid mid:list) {
+				String chemid="";
+				String physid="";
+				//成分处理
+				if(mid.getHeatno()!=null&&mid.getHeatno()!="") {
+					IfRawMtrCoilChem Chem=new IfRawMtrCoilChem();
+					Chem.setHeatno(mid.getHeatno());
+					Chem.setSource("0");
+					List<IfRawMtrCoilChem> lchem=this.getMapper(IfRawMtrCoilChemMapper.class).find(Chem,0,0);
+					if(lchem!=null&&lchem.size()>0) {
+						for(IfRawMtrCoilChem chem1:lchem) {
+							chemid=chem1.getChemid();
+						}
+					}
+					else {
+						chemid=this.getBean(IfRawMtrCoilChemServiceImpl.class).createXGChemID();
+					}
+					IfRawMtrCoilChemMid chemMid=new IfRawMtrCoilChemMid();
+					chemMid.setHeatno(mid.getHeatno());
+
+					List<IfRawMtrCoilChemMid> lchemMid=this.getMapper(IfRawMtrCoilChemMidMapper.class).find(chemMid, 0, 0);
+					if(lchemMid!=null&&lchemMid.size()>0) {
+						for(IfRawMtrCoilChemMid chemmid:lchemMid) {
+							IfRawMtrCoilChem chem2=new IfRawMtrCoilChem();
+							chem2.setChemid(chemid);
+							chem2.setChemCode(chemmid.getChemCode());
+							chem2.setCreateOpr(chemmid.getCreateOpr());
+							chem2.setCreateTime(chemmid.getCreateTime());
+							chem2.setSource("0");
+							chem2.setHeatno(mid.getHeatno());
+							chem2.setChemValue(chemmid.getChemValue());
+							chem2.setInspectTime(chemmid.getInspectTime());
+							chem2.setRemark(chemmid.getRemark());
+							this.getMapper(IfRawMtrCoilChemMapper.class).insert(chem2);
+						}
+					}
+				}
+				//材质处理
+				if(mid.getSmpNo()!=null&&mid.getSmpNo()!="")
+				{
+					IfRawMtrCoilPfmc pfmc=new IfRawMtrCoilPfmc();
+					pfmc.setSmpNo(mid.getSmpNo());
+					pfmc.setSource("0");
+					List<IfRawMtrCoilPfmc> lpfmc=this.getMapper(IfRawMtrCoilPfmcMapper.class).find(pfmc,0,0);
+					if(lpfmc!=null&&lpfmc.size()>0)
+					{
+						for(IfRawMtrCoilPfmc pfmc1:lpfmc)
+						{
+							physid=pfmc1.getPhysid();
+						}
+					}
+					else 
+					{
+						physid=this.getBean(IfRawMtrCoilPfmcServiceImpl.class).createXGPhySID();
+					}
+					IfRawMtrCoilPfmcMid pfmcMid=new IfRawMtrCoilPfmcMid();
+					pfmcMid.setSmpNo(mid.getSmpNo());
+					List<IfRawMtrCoilPfmcMid> lpfmcMid=this.getMapper(IfRawMtrCoilPfmcMidMapper.class).find(pfmcMid, 0, 0);
+					if(lpfmcMid!=null&&lpfmcMid.size()>0)
+					{
+						for(IfRawMtrCoilPfmcMid pfmcmid:lpfmcMid)
+						{
+							IfRawMtrCoilPfmc pfmc2=new IfRawMtrCoilPfmc();
+							pfmc2.setPhysid(physid);
+							pfmc2.setSmpNo(mid.getSmpNo());
+
+
+
+							pfmc2.setCreateOpr(pfmcmid.getCreateOpr());
+							pfmc2.setCreateTime(pfmcmid.getCreateTime());
+							pfmc2.setSource("0");
+
+							pfmc2.setPfmcCode(pfmcmid.getPfmcCode());
+							pfmc2.setPfmcName(pfmcmid.getPfmcName());
+							pfmc2.setPfmcValue((double) pfmcmid.getPfmcValue());
+							pfmc2.setPfmcTypeCode(pfmcmid.getPfmcTypeCode());
+							pfmc2.setPfmcTypeName(pfmcmid.getPfmcTypeName());
+							pfmc2.setPfmcUnitCode(pfmcmid.getPfmcUnitCode());
+							pfmc2.setPfmcUnitName(pfmcmid.getPfmcUnitName());
+							pfmc2.setInspectTime(pfmcmid.getInspectTime());
+							pfmc2.setRemark(pfmcmid.getRemark());
+							this.getMapper(IfRawMtrCoilPfmcMapper.class).doInsert(pfmc2);
+						}
+					}
+				}
+				//插入原料主实绩
+				IfRawMtrCoilM m=new IfRawMtrCoilM();
+
+				DataHelper.CopyEntity(mid, m);
+
+				//				m.setCoilNo(mid.getCoilNo());
+				m.setCoilSource("0");
+				//				m.setCoilSort(mid.getCoilSort());
+				//				m.setSupplierCode(mid.getSupplierCode());
+				//				m.setSupplierName(mid.getSupplierName());
+				//				m.setHeatno(mid.getHeatno());
+				//				m.setSmpNo(mid.getSmpNo());
+				//				m.setPrdCode(mid.getPrdCode());
+				//				m.setPrdName(mid.getPrdName());
+				//				m.setStdCode(mid.getStdCode());
+				//				m.setStdName(mid.getStdName());
+				//				m.setSteelCode(mid.getSteelCode());
+				//				m.setSteelName(mid.getSteelName());
+				//				m.setCoilThk(mid.getCoilThk());
+				//				m.setCoilWdt(mid.getCoilWdt());
+				//				m.setCoilLen(mid.getCoilLen());
+				//				m.setCoilInnDia(mid.getCoilInnDia());
+				//				m.setCoilOutDia(mid.getCoilOutDia());
+				//				m.setCoilThrWgt(mid.getCoilThrWgt());
+				//				m.setCoilActWgt(mid.getCoilActWgt());
+				//				m.setProduceTime(mid.getProduceTime());
+				//				m.setFlawCode1(mid.getFlawCode1());
+				//				m.setFlawCode2(mid.getFlawCode2());
+				//				m.setFlawCode3(mid.getFlawCode3());
+				//				m.setFlawCode4(mid.getFlawCode4());
+				//				m.setFlawCode5(mid.getFlawCode5());
+				//				m.setFlawName1(mid.getFlawName1());
+				//				m.setFlawName2(mid.getFlawName2());
+				//				m.setFlawName3(mid.getFlawName3());
+				//				m.setFlawName4(mid.getFlawName4());
+				//				m.setFlawName5(mid.getFlawName5());
+				//				m.setChemDecRstCode(mid.getChemDecRstCode());
+				//				m.setChemDecRstName(mid.getChemDecRstName());
+				//				m.setSurfaceDecRstCode(mid.getSurfaceDecRstCode());
+				//				m.setSurfaceDecRstName(mid.getSurfaceDecRstName());
+				//				m.setSizeDecRstCode(mid.getSizeDecRstCode());
+				//				m.setSizeDecRstName(mid.getSizeDecRstName());
+				//				m.setPfmcDecRstCode(mid.getPfmcDecRstCode());
+				//				m.setPfmcDecRstName(mid.getPfmcDecRstName());
+				//				m.setWgtDecRstCode(mid.getWgtDecRstCode());
+				//				m.setWgtDecRstName(mid.getWgtDecRstName());
+				//				m.setTotalDecRstCode(mid.getTotalDecRstCode());
+				//				m.setTotalDecRstName(mid.getTotalDecRstName());
+				m.setStatus("0");
+				//				m.setRemark(mid.getRemark());
+				//				m.setCreateOpr(mid.getCreateOpr());
+				//				m.setCreateTime(mid.getCreateTime());
+				m.setChemid(chemid);
+				m.setPhysid(physid);
+				this.getMapper(IfRawMtrCoilMMapper.class).insert(m);
+
+				mid.setStatus("1");
+				this.getMapper(IfRawMtrCoilMMidMapper.class).update(mid);
+			}
+			rm.setState("200");
+		}
+		else 
+		{
+			rm.setState("500");
+			rm.setState("原料库中间表为空!");
+		}
+		return rm;
+	}
+
+	/**
+	 *分条脱单 库存品查询
+	 * */
+	public ResultModel doQueryWebBySQLOutBill(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm=new ResultModel();
+		int pageIndex=cp.getPageIndex();
+		int pageSize=cp.getPageSize();
+		PageModel<YdmProductDetail> pm = new PageModel<YdmProductDetail>(pageIndex,pageSize);
+		try {
+			Object wjmin="",wjmax="";
+			if(cp.getMemo1()!=null&&cp.getMemo1()!="") 
+				wjmin=Double.valueOf(cp.getMemo1()).doubleValue();
+			if(cp.getMemo2()!=null&&cp.getMemo2()!="")
+				wjmax=Double.valueOf(cp.getMemo2()).doubleValue();
+			Object thick,width;
+			if(cp.getObject().getThick() ==null || cp.getObject().getThick()==0)
+				thick="";
+			else 
+				thick=cp.getObject().getThick();
+			if(cp.getObject().getWidth() ==null || cp.getObject().getWidth()==0)
+				width="";
+			else 
+				width=cp.getObject().getWidth();
+			pm.setRows(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySQLOutBill
+					((pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize, cp.getStartTime(), cp.getEndTime(), cp.getObject().getCoilno(), cp.getObject().getJudgesteelcode(), 
+							thick,width,wjmin,wjmax,cp.getObject().getContract_no(),cp.getObject().getOrderno()));
+			pm.setTotal(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySQLOutBillCount
+					(cp.getStartTime(), cp.getEndTime(), cp.getObject().getCoilno(), cp.getObject().getJudgesteelcode(), 
+							thick,width,wjmin,wjmax,cp.getObject().getContract_no(),cp.getObject().getOrderno()));
+			rm.setData(pm);
+			rm.setState("200");
+		}
+		catch(Exception ex)
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 *分条挂单 库存品查询
+	 * */
+	public ResultModel doQueryWebBySQLOnBill(CommonPage<YdmProductDetail> cp)
+	{
+		ResultModel rm=new ResultModel();
+		int pageIndex=cp.getPageIndex();
+		int pageSize=cp.getPageSize();
+		PageModel<YdmProductDetail> pm = new PageModel<YdmProductDetail>(pageIndex,pageSize);
+		try {
+			Object wjmin="",wjmax="",thickmin="",thickmax="";
+			if(cp.getMemo1()!=null&&!"".equals(cp.getMemo1()))
+				wjmin=Double.valueOf(cp.getMemo1()).doubleValue();
+			if(cp.getMemo2()!=null&&!"".equals(cp.getMemo2()))
+				wjmax=Double.valueOf(cp.getMemo2()).doubleValue();
+
+			if(cp.getMemo3()!=null&&!"".equals(cp.getMemo3()))
+				thickmin=Double.valueOf(cp.getMemo3()).doubleValue();
+			if(cp.getMemo4()!=null&&!"".equals(cp.getMemo4()))
+				thickmax=Double.valueOf(cp.getMemo4()).doubleValue();
+
+			Object thick,width;
+			if(cp.getObject().getThick()!=null&&cp.getObject().getThick()==0)
+				thick="";
+			else 
+				thick=cp.getObject().getThick();
+			if(cp.getObject().getWidth()!=null&&cp.getObject().getWidth()==0)
+				width="";
+			else 
+				width=cp.getObject().getWidth();
+			String order =null,condition = null ,ord_pk = null ;
+			// 匹配采购订单号
+			if (cp.getObject().getOrderno()!=null&&!"".equals(cp.getObject().getOrderno())) {
+				ResultModel rms =this.getBean(MesApiServiceImpl.class).getPurchaseContractNoInfo(cp.getObject().getOrderno());
+				if (rms.getData()==null) {
+					order =null;
+				}else {
+					order =rms.getData().toString();
+				}
+			}
+			// 拆分订单所挂物料锁定在原订单范围内
+			if (cp.getObject().getMaterailorderno()!=null&&!"".equals(cp.getObject().getMaterailorderno())) {
+				List<PlnProdorder> lppq = this.getMapper(PlnProdorderMapper.class)
+						.findWithCondition(null, " order_no = '"+cp.getObject().getMaterailorderno()+"'", null, 0, 1);
+				// 是拆分订单
+				if (Utils.isNotEmpty(lppq) && lppq.get(0).getIs_split() != null && "1".equals(lppq.get(0).getIs_split())) {
+					// 获取原订单数据
+					List<PlnProdorder> lppo = this.getMapper(PlnProdorderMapper.class)
+							.findWithCondition(null, " ord_pk = '"+lppq.get(0).getP_order_no()+"'", null, 0, 1);
+//					condition = " (select distinct object_no from pln_mat_replace_log where length(object_no) > 8 and order_no = '"+lppo.get(0).getOrder_no()+"')";
+					// 有可能被拆分的订单就没有经过加工, 卷号还是没变.
+					condition = " (select distinct object_no from pln_mat_replace_log where order_no = '"+lppo.get(0).getOrder_no()+"')";
+				}
+			}
+			if((cp.getObject().getJudgesteelcode()==null||"".equals(cp.getObject().getJudgesteelcode()))&&cp.getObject().getSteelcode()!=null&&!"".equals(cp.getObject().getSteelcode()))
+				cp.getObject().setJudgesteelcode(cp.getObject().getSteelcode());
+
+			pm.setRows(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySQLOnBill(
+					(pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize, null, null, cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+					thick,width,null,null,cp.getObject().getJudgesteelcode()
+					,thickmin,thickmax,order,cp.getObject().getOrder_nature(),cp.getObject().getStorageattr(),cp.getObject().getOrder_nature()
+					,cp.getObject().getMaterailcoilno(),cp.getMemo5(),condition)
+					
+
+					);
+			pm.setTotal(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySQLOnBillCount
+					(null, null, cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+							thick,width,null,null,cp.getObject().getJudgesteelcode()
+							,thickmin,thickmax,order,cp.getObject().getOrder_nature(),cp.getObject().getStorageattr(),cp.getObject().getOrder_nature()
+							,cp.getObject().getMaterailcoilno(),cp.getMemo5(),condition
+							));
+			rm.setData(pm);
+			rm.setState("200");
+		}
+		catch(Exception ex)
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 *开平挂单 库存品查询
+	 * */
+	public ResultModel doQueryCuttoLengthWeb(CommonPage<YdmProductDetail> cp)
+	{
+		ResultModel rm=new ResultModel();
+		int pageIndex=cp.getPageIndex();
+		int pageSize=cp.getPageSize();
+		PageModel<YdmProductDetail> pm = new PageModel<YdmProductDetail>(pageIndex,pageSize);
+		try
+		{
+			Object wjmin="",wjmax="",thickmin="",thickmax="";
+			if(cp.getMemo1()!=null&&!"".equals(cp.getMemo1()))
+				wjmin=Double.valueOf(cp.getMemo1()).doubleValue();
+			if(cp.getMemo2()!=null&&!"".equals(cp.getMemo2()))
+				wjmax=Double.valueOf(cp.getMemo2()).doubleValue();
+
+			if(cp.getMemo3()!=null&&!"".equals(cp.getMemo3()))
+				thickmin=Double.valueOf(cp.getMemo3()).doubleValue();
+			if(cp.getMemo4()!=null&&!"".equals(cp.getMemo4()))
+				thickmax=Double.valueOf(cp.getMemo4()).doubleValue();
+
+			Object thick,width;
+			if(cp.getObject().getThick()!=null&&cp.getObject().getThick()==0)
+				thick="";
+			else 
+				thick=cp.getObject().getThick();
+			if(cp.getObject().getWidth()!=null&&cp.getObject().getWidth()==0)
+				width="";
+			else 
+				width=cp.getObject().getWidth();
+			String order =null,condition = null ,ord_pk = null ;
+			// 匹配采购订单号
+			if (cp.getObject().getOrderno()!=null&&!"".equals(cp.getObject().getOrderno())) {
+				ResultModel rms =this.getBean(MesApiServiceImpl.class).getPurchaseContractNoInfo(cp.getObject().getOrderno());
+				if (rms.getData()==null) {
+					order =null;
+				}else {
+					order =rms.getData().toString();
+				}
+			}
+			// 拆分订单所挂物料锁定在原订单范围内
+			if (cp.getObject().getMaterailorderno()!=null&&!"".equals(cp.getObject().getMaterailorderno())) {
+				List<PlnProdorder> lppq = this.getMapper(PlnProdorderMapper.class)
+						.findWithCondition(null, " order_no = '"+cp.getObject().getMaterailorderno()+"'", null, 0, 1);
+				// 是拆分订单
+				if (Utils.isNotEmpty(lppq) && lppq.get(0).getIs_split() != null && "1".equals(lppq.get(0).getIs_split())) {
+					// 获取原订单数据
+					List<PlnProdorder> lppo = this.getMapper(PlnProdorderMapper.class)
+							.findWithCondition(null, " ord_pk = '"+lppq.get(0).getP_order_no()+"'", null, 0, 1);
+//					condition = " (select distinct object_no from pln_mat_replace_log where length(object_no) > 8 and order_no = '"+lppo.get(0).getOrder_no()+"')";
+					// 有可能被拆分的订单就没有经过加工, 卷号还是没变.
+					condition = " (select distinct object_no from pln_mat_replace_log where order_no = '"+lppo.get(0).getOrder_no()+"')";
+				}
+			}
+			if((cp.getObject().getJudgesteelcode()==null||"".equals(cp.getObject().getJudgesteelcode()))&&cp.getObject().getSteelcode()!=null&&!"".equals(cp.getObject().getSteelcode()))
+				cp.getObject().setJudgesteelcode(cp.getObject().getSteelcode());
+
+			pm.setRows(this.getMapper(YdmProductDetailMapper.class).doQueryCuttoLengthWeb(
+					(pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize, null, null, cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+					thick,width,null,null,cp.getObject().getJudgesteelcode()
+					,thickmin,thickmax,order,cp.getObject().getOrder_nature(),cp.getObject().getStorageattr(),cp.getObject().getOrder_nature()
+					,cp.getObject().getMaterailcoilno(),cp.getMemo5(),condition)
+					);
+			pm.setTotal(this.getMapper(YdmProductDetailMapper.class).doQueryCuttoLengthWebCount
+					(null, null, cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+							thick,width,null,null,cp.getObject().getJudgesteelcode()
+							,thickmin,thickmax,order,cp.getObject().getOrder_nature(),cp.getObject().getStorageattr(),cp.getObject().getOrder_nature()
+							,cp.getObject().getMaterailcoilno(),cp.getMemo5(),condition
+							));
+			rm.setData(pm);
+			rm.setState("200");
+		}
+		catch(Exception ex)
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 *罩退挂单 库存品查询
+	 * */
+	public ResultModel doQueryAnnealWeb(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm=new ResultModel();
+		int pageIndex=cp.getPageIndex();
+		int pageSize=cp.getPageSize();
+		PageModel<YdmProductDetail> pm = new PageModel<YdmProductDetail>(pageIndex,pageSize);
+		try {
+			Object wjmin="",wjmax="",thickmin="",thickmax="";
+			if(cp.getMemo1()!=null&&!"".equals(cp.getMemo1()))
+				wjmin=Double.valueOf(cp.getMemo1()).doubleValue();
+			if(cp.getMemo2()!=null&&!"".equals(cp.getMemo2()))
+				wjmax=Double.valueOf(cp.getMemo2()).doubleValue();
+
+			if(cp.getMemo3()!=null&&!"".equals(cp.getMemo3()))
+				thickmin=Double.valueOf(cp.getMemo3()).doubleValue();
+			if(cp.getMemo4()!=null&&!"".equals(cp.getMemo4()))
+				thickmax=Double.valueOf(cp.getMemo4()).doubleValue();
+
+			Object thick,width;
+			if(cp.getObject().getThick()!=null&&cp.getObject().getThick()==0)
+				thick="";
+			else 
+				thick=cp.getObject().getThick();
+			if(cp.getObject().getWidth()!=null&&cp.getObject().getWidth()==0)
+				width="";
+			else 
+				width=cp.getObject().getWidth();
+			String order =null , condition = null ,ord_pk = null ;
+			// 匹配采购订单号
+			if (cp.getObject().getOrderno()!=null&&!"".equals(cp.getObject().getOrderno())) {
+				ResultModel rms =this.getBean(MesApiServiceImpl.class).getPurchaseContractNoInfo(cp.getObject().getOrderno());
+				if (rms.getData()==null) {
+					order =null;
+				}else {
+					order =rms.getData().toString();
+				}
+			}
+			// 拆分订单所挂物料锁定在原订单范围内
+			if (cp.getObject().getMaterailorderno()!=null&&!"".equals(cp.getObject().getMaterailorderno())) {
+				List<PlnProdorder> lppq = this.getMapper(PlnProdorderMapper.class)
+						.findWithCondition(null, " order_no = '"+cp.getObject().getMaterailorderno()+"'", null, 0, 1);
+				// 是拆分订单
+				if (Utils.isNotEmpty(lppq) && lppq.get(0).getIs_split() != null && "1".equals(lppq.get(0).getIs_split())) {
+					// 获取原订单数据
+					List<PlnProdorder> lppo = this.getMapper(PlnProdorderMapper.class)
+							.findWithCondition(null, " ord_pk = '"+lppq.get(0).getP_order_no()+"'", null, 0, 1);
+//					condition = " (select distinct object_no from pln_mat_replace_log where length(object_no) > 8 and order_no = '"+lppo.get(0).getOrder_no()+"')";
+					// 有可能被拆分的订单就没有经过加工, 卷号还是没变.
+					condition = " (select distinct object_no from pln_mat_replace_log where order_no = '"+lppo.get(0).getOrder_no()+"')";
+				}
+			}
+			if((cp.getObject().getJudgesteelcode()==null||"".equals(cp.getObject().getJudgesteelcode()))&&cp.getObject().getSteelcode()!=null&&!"".equals(cp.getObject().getSteelcode()))
+				cp.getObject().setJudgesteelcode(cp.getObject().getSteelcode());
+
+			pm.setRows(this.getMapper(YdmProductDetailMapper.class).doQueryAnnealWeb(
+					(pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize, null, null, cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+					thick,width,null,null,cp.getObject().getJudgesteelcode()
+					,thickmin,thickmax,order,cp.getObject().getOrder_nature(),cp.getObject().getStorageattr(),cp.getObject().getOrder_nature()
+					,cp.getObject().getMaterailcoilno(),cp.getMemo5(),condition)
+					);
+			pm.setTotal(this.getMapper(YdmProductDetailMapper.class).doQueryAnnealWebCount
+					(null, null, cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+							thick,width,null,null,cp.getObject().getJudgesteelcode()
+							,thickmin,thickmax,order,cp.getObject().getOrder_nature(),cp.getObject().getStorageattr(),cp.getObject().getOrder_nature()
+							,cp.getObject().getMaterailcoilno(),cp.getMemo5(),condition
+							));
+			rm.setData(pm);
+			rm.setState("200");
+		}
+		catch(Exception ex)
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+	
+	/**
+	 *轧制挂单 库存品查询
+	 * @throws Exception 
+	 * */
+	public ResultModel doQueryRollingWeb(CommonPage<YdmProductDetail> cp) throws Exception
+	{
+		ResultModel rm=new ResultModel();
+		int pageIndex=cp.getPageIndex();
+		int pageSize=cp.getPageSize();
+		
+		PageModel<YdmProductDetail> pm = new PageModel<YdmProductDetail>(pageIndex,pageSize);
+		// 工序点信息
+		List<ComBaseInfo> infoI = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoI);
+		Object thickmin="",thickmax="";
+		// 如果生产订单号不为空获取入口厚度范围
+		if (Utils.isNotEmpty(cp.getObject().getProdorderno())) {
+			// 获取生产订单信息
+			List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class)
+					.findWithCondition(null, " prod_order_no = '"+cp.getObject().getProdorderno()+"'", null, 0, 1);
+			// 获取质量设计信息取第一次轧制
+			SlmOrdDesignMscPlSti sti = new SlmOrdDesignMscPlSti();
+//			List<SlmOrdDesignMscTic> tics = new ArrayList<SlmOrdDesignMscTic>();
+			sti.setDesign_key(ppo.get(0).getDesign_key());
+			sti.setMsc_pline(ppo.get(0).getMsc_pline());
+			sti.setProcess_code(processpoint.rolling_code);
+			
+			List<SlmOrdDesignMscPlSti> stis = this.getBean(MesApiDesignInfoImpl.class).getQcmDesignInfo(sti);
+//			for (SlmOrdDesignMscPlSti pl : stis) {
+//				SlmOrdDesignMscTic tmp = new SlmOrdDesignMscTic();
+//				BeanUtils.copyProperties(pl, tmp);
+//				tmp.setPline_code("C016");
+//				tmp.setMachine_code("M0008");
+//				tics.add(tmp);
+//			}
+			SlmOrdDesignMscTic tmp = new SlmOrdDesignMscTic();
+			BeanUtils.copyProperties(stis.get(0), tmp);
+			tmp.setPline_code("C016");
+			tmp.setMachine_code("M0008");
+			CommonPage<SlmOrdDesignMscTic> com = new CommonPage<SlmOrdDesignMscTic>();
+			com.setObject(tmp);
+			ResultModel tic_f = this.getBean(QmsApiServiceImpl.class).getGongYi(com);
+			if ("500".equals(tic_f.getState())) {
+				throw new Exception("获取["+tmp.getProcess_point_desc()+"]工艺标准失败!"+tic_f.getMsgInfo());
+			}
+			List<SlmOrdDesignMscTicItem> item_f = (List<SlmOrdDesignMscTicItem>) tic_f.getData();
+			if (Utils.isNotEmpty(item_f)) {
+			// 获取轧制原卷和成品厚度范围的代码
+			List<PbModelDb> code = this.getBean(MesApiDesignInfoImpl.class).getBase_Name("201001");
+			if (item_f.get(0).getCraft_param_code().equals(code.get(0).getText())) {
+				if (Utils.isNotEmpty(item_f.get(0).getMin_value())) {
+					thickmin = Double.valueOf(item_f.get(0).getMin_value());
+				}
+				if (Utils.isNotEmpty(item_f.get(0).getMax_value())) {
+					thickmax = Double.valueOf(item_f.get(0).getMax_value());
+				}
+			}
+			
+//			for (SlmOrdDesignMscTicItem slm : item_f) {
+//				// 入口厚度
+//				if (slm.getCraft_param_code().equals(code.get(0).getText())) {
+//					if (Utils.isNotEmpty(slm.getMin_value())) {
+//						thickmin = Double.valueOf(slm.getMin_value());
+//					}
+//					if (Utils.isNotEmpty(slm.getMax_value())) {
+//						thickmax = Double.valueOf(slm.getMax_value());
+//					}
+//					break;
+//				}
+//			}
+		  }
+		}
+		
+		try
+		{
+			Object thick,width;
+			if(cp.getObject().getThick()!=null&&cp.getObject().getThick()==0)
+				thick="";
+			else 
+				thick=cp.getObject().getThick();
+			if(cp.getObject().getWidth()!=null&&cp.getObject().getWidth()==0)
+				width="";
+			else 
+				width=cp.getObject().getWidth();
+			String order =null , condition = null ,ord_pk = null;
+			// 匹配采购订单号
+			if (cp.getObject().getOrderno()!=null&&!"".equals(cp.getObject().getOrderno())) {
+				ResultModel rms =this.getBean(MesApiServiceImpl.class).getPurchaseContractNoInfo(cp.getObject().getOrderno());
+				if (rms.getData()==null) {
+					order =null;
+				}else {
+					order =rms.getData().toString();
+				}
+			}
+			// 拆分订单所挂物料锁定在原订单范围内
+			if (cp.getObject().getMaterailorderno()!=null&&!"".equals(cp.getObject().getMaterailorderno())) {
+				List<PlnProdorder> lppq = this.getMapper(PlnProdorderMapper.class)
+						.findWithCondition(null, " order_no = '"+cp.getObject().getMaterailorderno()+"'", null, 0, 1);
+				// 是拆分订单
+				if (Utils.isNotEmpty(lppq) && lppq.get(0).getIs_split() != null && "1".equals(lppq.get(0).getIs_split())) {
+					// 获取原订单数据
+					List<PlnProdorder> lppo = this.getMapper(PlnProdorderMapper.class)
+							.findWithCondition(null, " ord_pk = '"+lppq.get(0).getP_order_no()+"'", null, 0, 1);
+//					condition = " (select distinct object_no from pln_mat_replace_log where length(object_no) > 8 and order_no = '"+lppo.get(0).getOrder_no()+"')";
+					// 有可能被拆分的订单就没有经过加工, 卷号还是没变.
+					condition = " (select distinct object_no from pln_mat_replace_log where order_no = '"+lppo.get(0).getOrder_no()+"')";
+				}
+			}
+			if((cp.getObject().getJudgesteelcode()==null||"".equals(cp.getObject().getJudgesteelcode()))&&cp.getObject().getSteelcode()!=null&&!"".equals(cp.getObject().getSteelcode()))
+				cp.getObject().setJudgesteelcode(cp.getObject().getSteelcode());
+			
+			pm.setRows(this.getMapper(YdmProductDetailMapper.class).doQueryRollingWeb(
+					(pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize, null, null, cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+					thick,width,null,null,cp.getObject().getJudgesteelcode()
+					,thickmin,thickmax,order,cp.getObject().getOrder_nature(),cp.getObject().getStorageattr(),cp.getObject().getOrder_nature()
+					,cp.getObject().getMaterailcoilno(),cp.getMemo5(),condition)
+					);
+			pm.setTotal(this.getMapper(YdmProductDetailMapper.class).doQueryRollingWebCount
+					(null, null, cp.getObject().getCoilno(), cp.getObject().getSteel_name(), 
+							thick,width,null,null,cp.getObject().getJudgesteelcode()
+							,thickmin,thickmax,order,cp.getObject().getOrder_nature(),cp.getObject().getStorageattr(),cp.getObject().getOrder_nature()
+							,cp.getObject().getMaterailcoilno(),cp.getMemo5(),condition
+							));
+			rm.setData(pm);
+			rm.setState("200");
+		}
+		catch(Exception ex)
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+
+	/**
+	 * Mes插入库存(大小纵剪 12mm---4mm)
+	 * @throws Exception 
+	 * */
+	public  ResultModel doMesIn(CommonPage<MesCrSlittingD> cp) throws Exception{
+		ResultModel rm = new ResultModel();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		MesCrSlittingD mes=cp.getObject();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		if(mes.getCoil_no()!=null&&mes.getCoil_no()!=""){
+			MesCrSlittingD mesD=this.getMapper(MesCrSlittingDMapper.class).findById(mes.getCoil_no());
+
+			if(mesD!=null){
+				YdmProductDetail ypd=new YdmProductDetail();
+				//调用库存接口存数据时,保存 虚拟物料号 ,机台代码,机台名称
+				MesCrSlittingM mcsm = this.getMapper(MesCrSlittingMMapper.class).findById(mesD.getProcess_no());
+				List<ComBaseMachine> listcom=this.getMapper(ComBaseMachineMapper.class).findWithCondition(null, "machine_code='"+mcsm.getMachine_code()+"'", null, 0, 0);
+				ypd.setMachine_code(mcsm.getMachine_code());
+				if(listcom!=null && listcom.size()>0){
+					ypd.setMachine_name(listcom.get(0).getMachine_name());
+				}
+				List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno ='"+mcsm.getMaterial_no()+"'", null, 0, 0);
+				if(list!=null && list.size()>0){
+					ypd.setMaterailtype(list.get(0).getMaterailtype());
+				}
+				ypd.setObject_no_vt(mes.getCoil_no_vt());
+				ypd.setOrderno(mesD.getOrder_no());
+				ypd.setProdorderno(mesD.getProd_order_no());
+
+				String order_pk="";
+				if(mesD.getProd_order_no()!=null&&!"".equals(mesD.getProd_order_no())){
+					PlnProdorder pp=new PlnProdorder();
+					pp.setProd_order_no(mesD.getProd_order_no());
+					List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+					if(lpp!=null&&lpp.size()>0){
+						ypd.setCustomer_no(lpp.get(0).getCustomer_no());
+						ypd.setCustomer_nm(lpp.get(0).getCustomer_name());
+						ypd.setPsc(lpp.get(0).getPsc());
+						ypd.setDelivery_state_code(lpp.get(0).getDelivery_state_code());//交货状态
+						ypd.setDelivery_state_desc(lpp.get(0).getDelivery_state_desc());
+						ypd.setProd_code(lpp.get(0).getProd_code());
+						ypd.setProd_name(lpp.get(0).getProd_name());
+						ypd.setStd_code(lpp.get(0).getStd_code());
+						ypd.setStd_name(lpp.get(0).getStd_name());
+						ypd.setUse_code(lpp.get(0).getUse_code());
+						ypd.setUse_name(lpp.get(0).getUser_name());
+						ypd.setPlan_code(lpp.get(0).getPline_code());
+						ypd.setPline_name(lpp.get(0).getPline_name());
+						ypd.setReceiv_no(lpp.get(0).getReciver_unit_no());
+						ypd.setReceiv_nm(lpp.get(0).getReciver_unit_name());
+						order_pk=lpp.get(0).getOrd_pk();
+					}
+
+					//------------------------------------------2018-06-25 边丝单独处理(没有生产订单信息),取第一个子卷的生产订单信息。
+				}else if (mes.getCoil_no()!=null && "B".equals(mes.getCoil_no().substring(mes.getCoil_no().length()-1))) {
+					//如果第一个子卷xxx01没有。则返回的bsMesd为null。即findById没有找到对应的值,返回null。
+					//MesCrSlittingD bsMesd=this.getMapper(MesCrSlittingDMapper.class).findById(mes.getCoil_no().substring(0, mes.getCoil_no().length()-1)+"1");
+					List<MesCrSlittingD> bsMesd_list = this.getMapper(MesCrSlittingDMapper.class).findWithCondition(null, "coil_no like '%"+mes.getCoil_no().substring(0, mes.getCoil_no().length()-2)+"%' and order_no is not null and prod_order_no is not null ", 
+							"coil_no", 0, 0);
+					MesCrSlittingD bsMesd=null;
+					if(bsMesd_list !=null && bsMesd_list.size()>0){
+						bsMesd=bsMesd_list.get(0);
+					}
+					if(bsMesd!=null && bsMesd.getProd_order_no()!=null&&!"".equals(bsMesd.getProd_order_no())){
+						PlnProdorder pp=new PlnProdorder();
+						pp.setProd_order_no(bsMesd.getProd_order_no());
+						List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+						if(lpp!=null&&lpp.size()>0){
+							ypd.setCustomer_no(lpp.get(0).getCustomer_no());
+							ypd.setCustomer_nm(lpp.get(0).getCustomer_name());
+							ypd.setPsc(lpp.get(0).getPsc());
+							ypd.setDelivery_state_code(lpp.get(0).getDelivery_state_code());//交货状态
+							ypd.setDelivery_state_desc(lpp.get(0).getDelivery_state_desc());
+							ypd.setProd_code(lpp.get(0).getProd_code());
+							ypd.setProd_name(lpp.get(0).getProd_name());
+							ypd.setStd_code(lpp.get(0).getStd_code());
+							ypd.setStd_name(lpp.get(0).getStd_name());
+							ypd.setUse_code(lpp.get(0).getUse_code());
+							ypd.setUse_name(lpp.get(0).getUser_name());
+							ypd.setPlan_code(lpp.get(0).getPline_code());
+							ypd.setPline_name(lpp.get(0).getPline_name());
+							ypd.setProdorderno(bsMesd.getProd_order_no());
+							ypd.setOrderno(bsMesd.getOrder_no());
+							ypd.setReceiv_no(lpp.get(0).getReciver_unit_no());
+							ypd.setReceiv_nm(lpp.get(0).getReciver_unit_name());
+							order_pk=lpp.get(0).getOrd_pk();
+						}
+					}
+				}
+				ypd.setCreater(username);
+				ypd.setCreatedate(new Date());
+				ypd.setCoilno(mesD.getCoil_no());
+				ypd.setSteelcode(mesD.getSteel_code());
+				
+				// 改为获取投料卷信息里的判定牌号:20240722刘侣 改回来不动 20240815
+				ypd.setJudgesteelcode(mesD.getSteel_code());	
+//				ypd.setJudgesteelcode(list.get(0).getJudgesteelcode());	
+				
+				
+				ypd.setSurfaceresult(mesD.getSurface_rst());
+				ypd.setProduceorder(mesD.getWrk_ord());
+				ypd.setProduceteam(mesD.getWrk_grp());
+				if (mesD.getWrk_date()!=null && !"".equals(mesD.getWrk_date())) {
+					// new SimpleDateFormat("yyyy-MM-dd").parse(mesD.getWrk_date()) 改成当前时间
+					ypd.setProducedate(new Date());					
+				}
+				//ypd.setProducedate(mesD.getProduce_time());
+				ypd.setState("-1");
+				ypd.setSource("0");
+				if(cp.getMemo1()==null || "".equals(cp.getMemo1())){
+					ypd.setStorageattr("500203");					
+				}else{
+					ypd.setStorageattr(cp.getMemo1());
+				}
+				ypd.setCoiltype("500203".equals(ypd.getStorageattr())?"2":"1");
+				ypd.setThick(mesD.getAct_thk());
+				ypd.setWidth(mesD.getAct_wdt());
+				ypd.setLength(mesD.getAct_len());
+				//20191018:包括目标宽度,目标厚度到库存表
+				ypd.setLz_thick(mesD.getAim_thk());//合同厚度(目标厚度)
+				ypd.setLz_width(mesD.getAim_wdt());//合同宽度(目标宽度)
+				ypd.setDiameter_inn(mesD.getAct_inn_dia());
+				ypd.setDiameter_out(mesD.getAct_out_dia());
+				ypd.setFactweight(mesD.getCoil_act_wgt());
+				ypd.setTheoryweight(mesD.getCoil_thr_wgt());
+				ypd.setPsc("");
+				ypd.setPlan_code("");
+				ypd.setInspection_lot("");
+				ypd.setObject_no_xg("");
+				String order1=(String)this.getSession().getAttribute(HomeService.SESSION_WORK_ORD);
+				String team1=(String)this.getSession().getAttribute(HomeService.SESSION_WORK_GRP);
+				ypd.setInorder(order1);
+				ypd.setInteam(team1);
+				YdmProductDetail yyd=new YdmProductDetail();
+				yyd = this.getMapper(YdmProductDetailMapper.class).doFind(mcsm.getMaterial_no(), null);
+				if(yyd==null){
+					yyd=new YdmProductDetail();
+				}
+				if(yyd.getMaterailcoilno()!=null&&!"".equals(yyd.getMaterailcoilno())){
+					ypd.setMaterailcoilno(yyd.getMaterailcoilno());
+				}
+				//炉号
+				if(yyd.getHeatno()!=null&&!"".equals(yyd.getHeatno())){
+					ypd.setHeatno(yyd.getHeatno());
+				}
+				//增加物料属性
+				if(yyd.getObject_attr()!=null&&!"".equals(yyd.getObject_attr())){
+					ypd.setObject_attr(yyd.getObject_attr());
+				}
+				//2019-02-21  物料属性
+				if(cp.getMemo3()!=null && !"".equals(cp.getMemo3())){
+					ypd.setObject_attr(cp.getMemo3());
+					ypd.setIsbl("1");
+				}
+				//检验号
+				ypd.setInspection_lot(mesD.getInspection_lot());
+				ypd.setBatchno(mcsm.getSchedule_no());
+
+				if(yyd.getLzorderno()!=null&&!"".equals(yyd.getLzorderno()))
+				{
+					ypd.setLzorderno(yyd.getLzorderno());
+				}
+
+				//20190801 边丝和头尾卷默认综判判废//20191025 进废副品库
+				String lastChar = ypd.getCoilno().substring(ypd.getCoilno().length()-1);
+				if ("B".equals(lastChar) || "H".equals(lastChar)) {
+					ypd.setJudgeresult("40740804");
+					//20200317 净重的头尾卷及边丝入废钢库  毛重进成品库 黄涛提出
+					String condition = "contract_no||contract_line_seq||order_seq = '"+ypd.getOrderno()+"' and nvl(change_flag,'0')<>'1'";
+					List<SlmOrderInfo> soiList = this.getMapper(SlmOrderInfoMapper.class).findWithCondition(null, condition, null, 0, 0);
+					if (soiList!=null && soiList.size()>0) {
+						String weight_type_no = soiList.get(0).getWeight_type_no();
+						if ("102301".equals(weight_type_no)) {//净重:入废副品库,脱单
+							
+							// 净重的头尾卷和边丝脱单后需要手动插入脱单信息:20230725刘侣
+							// 前提是这个卷没有做过脱单插入:
+							String conditiontd = " and OBJECT_NO = '"+ypd.getCoilno()+"' and OPT_TYPE = '0'";
+							List<PlnMatReplaceLog> pmrList = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, conditiontd, null, 0, 0);
+							if (pmrList.size() == 0) {
+								List<PlnMatReplaceLog> lmmrl = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, "",
+										" serial_no desc ", 0, 1);
+								long iNo = 1;
+								if (lmmrl != null && lmmrl.size() > 0) {
+									iNo = lmmrl.get(0).getSerial_no() + 1;
+								}
+								PlnMatReplaceLog mmrl = new PlnMatReplaceLog();
+								mmrl.setSerial_no(iNo++);
+								mmrl.setObject_no(ypd.getCoilno());
+								mmrl.setOpt_type("0");
+								mmrl.setStatus("0");
+								mmrl.setOrder_no(ypd.getOrderno());
+								
+								mmrl.setCreate_man_name(userName);
+								mmrl.setCreate_time(new Date());
+								mmrl.setMemo("净重头尾边丝卷补脱单信息");
+								this.getMapper(PlnMatReplaceLogMapper.class).insert(mmrl);
+							}
+							
+							// end
+							
+							ypd.setStorageattr("500210");
+							ypd.setOrderno("");
+							ypd.setProdorderno("");
+							ypd.setObject_no_vt("");
+							
+						}else if ("102302".equals(weight_type_no)) {//毛重:进成品库,不脱单
+							ypd.setStorageattr("500203");
+							// 毛重头尾边丝默认合格:20231024刘侣
+							ypd.setJudgeresult("40740801");
+						}
+					}
+				}
+				//包装状态(20191016)
+				ypd.setIs_package("0");
+				this.getMapper(YdmProductDetailMapper.class).insert(ypd);				
+
+				//-------2018.3.27-----修改销售订单状态 -----vir-----
+				if(mesD.getOrder_no()!=null&&mesD.getOrder_no().length()>6){
+					String contract_no=mesD.getOrder_no().substring(0, mesD.getOrder_no().length()-6);
+					String contract_line_seq=mesD.getOrder_no().substring(mesD.getOrder_no().length()-6, mesD.getOrder_no().length()-3);
+					String order_seq=mesD.getOrder_no().substring(mesD.getOrder_no().length()-3);
+					SlmOrderInfo order=new SlmOrderInfo();
+					order.setContract_no(contract_no);
+					order.setContract_line_seq(contract_line_seq);
+					order.setOrder_seq(order_seq);
+					order.setValid_flag("1");
+					List<SlmOrderInfo> orderList=this.getBean(SlmOrderInfoServiceImpl.class).doQuery(order);
+					boolean in=true;
+					if(orderList.size()==1){
+						order=orderList.get(0);
+					}else if(orderList.size()>1 && order_pk!=null && (!"".equals(order_pk))){
+						SlmOrderInfo pk_order=this.getMapper(SlmOrderInfoMapper.class).findById(order_pk);
+						if(pk_order!=null)
+							order=pk_order;
+					}else{
+						in=false;
+					}
+					if(in){
+						order.setP_order_flag_no(order.getOrder_flag_no());
+						order.setP_order_flag_name(order.getOrder_flag_name());
+						order.setOrder_flag_no("103409");
+						order.setOrder_flag_name("缴库");
+						this.getBean(SlmOrderInfoServiceImpl.class).doUpdate(order);
+						
+					}
+				}
+
+			}
+			else {
+				rm.setState("500");
+				rm.setMsgInfo("传入的主键为空!");
+			}
+		}
+		rm.setState("200");
+		return rm;
+	}
+
+	//===============20180709============================
+	/**
+	 * Mes横剪插入库存
+	 * @throws Exception 
+	 * */
+	public  ResultModel doMesIn1(CommonPage<MesCrCrossCuttingD> cp) throws Exception{
+		ResultModel rm = new ResultModel();
+
+		MesCrCrossCuttingD mesxx=cp.getObject();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		if(mesxx.getPacking_no()!=null&&mesxx.getPacking_no()!=""){
+			MesCrCrossCuttingD mcccD=this.getMapper(MesCrCrossCuttingDMapper.class).findById(mesxx.getPacking_no());
+			if(mcccD!=null){
+				YdmProductDetail ypd=new YdmProductDetail();
+				ypd.setObject_no_xg(mcccD.getPacking_no_ext());
+				//调用库存接口存数据时,保存 虚拟物料号,机台代码,机台名称
+				MesCrCrossCuttingM mcccm=new MesCrCrossCuttingM();
+				mcccm.setProcess_no(mcccD.getProcess_no());
+				MesCrCrossCuttingM mcsm = this.getMapper(MesCrCrossCuttingMMapper.class).findById(mcccm.getProcess_no());
+				List<ComBaseMachine> listcom=this.getMapper(ComBaseMachineMapper.class).findWithCondition(null, "machine_code='"+mcsm.getMachine_code()+"'", null, 0, 0);
+				ypd.setMachine_code(mcsm.getMachine_code());
+				if(listcom!=null && listcom.size()>0){
+					ypd.setMachine_name(listcom.get(0).getMachine_name());
+				}		
+				List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno ='"+mcsm.getMaterial_no()+"'", null, 0, 0);
+				if(list!=null && list.size()>0){
+					ypd.setMaterailtype(list.get(0).getMaterailtype());
+				}
+
+				//				//20180418新增 保存 虚拟物料号
+				//				if(mcsm!=null){
+				//					ypd.setObject_no_vt(mcsm.getMaterial_no_vt());//虚拟原料卷号
+				//				}
+
+				ypd.setMaterailcoilno(mcsm.getMaterial_no_src());
+				ypd.setObject_no_vt(mcccD.getPacking_no_vt());
+				ypd.setOrderno(mcccD.getOrder_no());
+				ypd.setProdorderno(mcccD.getProd_order_no());
+				String order_pk="";
+				if(mcccD.getProd_order_no()!=null&&!"".equals(mcccD.getProd_order_no())){
+					PlnProdorder pp=new PlnProdorder();
+					pp.setProd_order_no(mcccD.getProd_order_no());
+					List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+					if(lpp!=null&&lpp.size()>0){
+						pp = lpp.get(0);
+						ypd.setCustomer_no(pp.getCustomer_no());
+						ypd.setCustomer_nm(pp.getCustomer_name());
+						ypd.setPsc(pp.getPsc());
+						ypd.setDelivery_state_code(pp.getDelivery_state_code());//交货状态
+						ypd.setDelivery_state_desc(pp.getDelivery_state_desc());
+						ypd.setProd_code(pp.getProd_code());
+						ypd.setProd_name(pp.getProd_name());
+						ypd.setStd_code(pp.getStd_code());
+						ypd.setStd_name(pp.getStd_name());
+						ypd.setUse_code(pp.getUse_code());
+						ypd.setUse_name(pp.getUser_name());
+						ypd.setPlan_code(pp.getPline_code());
+						ypd.setPline_name(pp.getPline_name());
+						ypd.setSteelcode(pp.getSteel_code());
+						ypd.setReceiv_no(pp.getReciver_unit_no());
+						ypd.setReceiv_nm(pp.getReciver_unit_name()); 
+					}
+
+					//------------------------------------------2018-06-25 边丝单独处理(没有生产订单信息),取第一个子卷的生产订单信息。
+				}else if (mcccD.getPacking_no()!=null && "B".equals(mcccD.getPacking_no().substring(mcccD.getPacking_no().length()-1))) {
+					//MesCrCrossCuttingD bsMesd=this.getMapper(MesCrCrossCuttingDMapper.class).findById(mcccD.getPacking_no().substring(0, mcccD.getPacking_no().length()-1)+"1");
+					List<MesCrCrossCuttingD> bsMesd_list = this.getMapper(MesCrCrossCuttingDMapper.class).findWithCondition(null, "packing_no like '%"+mcccD.getPacking_no().substring(0, mcccD.getPacking_no().length()-2)+"%' and order_no is not null and prod_order_no is not null ", 
+							"packing_no", 0, 0);
+					MesCrCrossCuttingD bsMesd=null;
+					if(bsMesd_list!=null && bsMesd_list.size()>0){
+						bsMesd=bsMesd_list.get(0);
+					}
+					if(bsMesd!=null && bsMesd.getProd_order_no()!=null&&!"".equals(bsMesd.getProd_order_no())){
+						PlnProdorder pp=new PlnProdorder();
+						pp.setProd_order_no(bsMesd.getProd_order_no());
+						List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+						if(lpp!=null&&lpp.size()>0){
+							ypd.setProdorderno(bsMesd.getProd_order_no());
+							ypd.setOrderno(bsMesd.getOrder_no());
+							ypd.setPsc(lpp.get(0).getPsc());
+							ypd.setDelivery_state_code(lpp.get(0).getDelivery_state_code());//交货状态
+							ypd.setDelivery_state_desc(lpp.get(0).getDelivery_state_desc());
+							ypd.setProd_code(lpp.get(0).getProd_code());
+							ypd.setProd_name(lpp.get(0).getProd_name());
+							ypd.setStd_code(lpp.get(0).getStd_code());
+							ypd.setStd_name(lpp.get(0).getStd_name());
+							ypd.setUse_code(lpp.get(0).getUse_code());
+							ypd.setUse_name(lpp.get(0).getUser_name());
+							ypd.setPline_name(lpp.get(0).getPline_name());
+							ypd.setCustomer_no(lpp.get(0).getCustomer_no());
+							ypd.setCustomer_nm(lpp.get(0).getCustomer_name());
+							ypd.setReceiv_no(lpp.get(0).getReciver_unit_no());
+							ypd.setReceiv_nm(lpp.get(0).getReciver_unit_name());
+							order_pk=lpp.get(0).getOrd_pk();
+						}
+					}
+				}
+				ypd.setCreater(username);
+				ypd.setCreatedate(new Date());
+				ypd.setCoilno(mcccD.getPacking_no());
+				ypd.setSteelcode(mcccD.getSteel_code());
+				ypd.setJudgesteelcode(mcccD.getSteel_code());
+				ypd.setSurfaceresult(mcccD.getSurface_rst());
+				ypd.setProduceorder(mcccD.getWrk_ord());
+				ypd.setProduceteam(mcccD.getWrk_grp());
+				if (mcccD.getWrk_date()!=null && !"".equals(mcccD.getWrk_date())) {
+					ypd.setProducedate(new SimpleDateFormat("yyyy-MM-dd").parse(mcccD.getWrk_date()));				
+				}
+				//ypd.setProducedate(mcccD.getProduce_time());
+				ypd.setState("-1");
+				ypd.setSource("0");
+				if(cp.getMemo1()==null || "".equals(cp.getMemo1())){
+					ypd.setStorageattr("500203");
+				}else{
+					ypd.setStorageattr(cp.getMemo1());
+				}
+				ypd.setCoiltype("500203".equals(ypd.getStorageattr())?"2":"1");
+				ypd.setThick(mcccD.getAct_thk());
+				ypd.setWidth(mcccD.getAct_wdt());
+				ypd.setLength(mcccD.getAct_len());
+				//20191018:包括目标宽度,目标厚度到库存表
+				ypd.setLz_thick(mcccD.getAim_thk());//合同厚度(目标厚度)
+				ypd.setLz_width(mcccD.getAim_wdt());//合同宽度(目标宽度)
+				//ypd.setDiameter_inn(mcccD.getAct_inn_dia());
+				//ypd.setDiameter_out(mcccD.getAct_out_dia());
+				//ypd.setProducedate(mcccD.getProduce_time());
+				ypd.setFactweight(mcccD.getPacking_net_wgt());
+				ypd.setTheoryweight(mcccD.getPacking_thr_wgt());
+
+				//20180709
+				ypd.setGrossweight(mcccD.getPacking_ttl_wgt());
+				//库存的块数
+				if(mcccD.getPlate_cnt()!=null){
+					ypd.setQuantity(mcccD.getPlate_cnt().intValue());
+				}
+
+				ypd.setPsc("");
+				ypd.setPlan_code("");
+				ypd.setInspection_lot("");
+				ypd.setObject_no_xg("");
+				String order1=(String)this.getSession().getAttribute(HomeService.SESSION_WORK_ORD);
+				String team1=(String)this.getSession().getAttribute(HomeService.SESSION_WORK_GRP);
+				ypd.setInorder(order1);
+				ypd.setInteam(team1);
+				//String coco = mcccD.getPacking_no().substring(0,8);
+				//2018-07-09
+				YdmProductDetail yyd=new YdmProductDetail();
+				yyd = this.getMapper(YdmProductDetailMapper.class).doFind(mcsm.getMaterial_no(), null);
+				if(yyd==null){
+					yyd=new YdmProductDetail();
+				}
+				if(yyd.getMaterailcoilno()!=null&&!"".equals(yyd.getMaterailcoilno())){
+					ypd.setMaterailcoilno(yyd.getMaterailcoilno());
+				}
+				//炉号
+				if(yyd.getHeatno()!=null&&!"".equals(yyd.getHeatno())){
+					ypd.setHeatno(yyd.getHeatno());
+				}
+				// 增加物料属性
+				if(yyd.getObject_attr()!=null&&!"".equals(yyd.getObject_attr())){
+					ypd.setObject_attr(yyd.getObject_attr());
+				}
+				//2019-02-21  物料属性
+				if(cp.getMemo3()!=null && !"".equals(cp.getMemo3())){
+					ypd.setObject_attr(cp.getMemo3());
+					ypd.setIsbl("1");
+				}
+				//检验号
+				ypd.setInspection_lot(mcccD.getInspection_lot());
+				ypd.setBatchno(mcsm.getSchedule_no());
+
+				if(yyd.getLzorderno()!=null&&!"".equals(yyd.getLzorderno())){
+					ypd.setLzorderno(yyd.getLzorderno());
+				}
+				ypd.setMaterailcoilno(mcsm.getMaterial_no_src());//主表的原始卷号。
+
+				//20190801 边丝和头尾卷默认综判判废
+				//20191025 进废副品库
+				String lastChar = ypd.getCoilno().substring(ypd.getCoilno().length()-1);
+				if ("B".equals(lastChar) || "H".equals(lastChar)) {
+					ypd.setJudgeresult("40740804");
+					//20200317 净重的头尾卷及边丝入废钢库  毛重进成品库 黄涛提出
+					String condition = "contract_no||contract_line_seq||order_seq = '"+ypd.getOrderno()+"' and nvl(change_flag,'0')<>'1'";
+					List<SlmOrderInfo> soiList = this.getMapper(SlmOrderInfoMapper.class).findWithCondition(null, condition, null, 0, 0);
+					if (soiList!=null && soiList.size()>0) {
+						String weight_type_no = soiList.get(0).getWeight_type_no();
+						if ("102301".equals(weight_type_no)) {//净重:需要脱单,入废副品
+							ypd.setStorageattr("500210");
+							ypd.setOrderno("");
+							ypd.setProduceorder("");
+							ypd.setObject_no_vt("");
+						}else if ("102302".equals(weight_type_no)) {//毛重:不脱单,入成品库
+							ypd.setStorageattr("500203");
+							// 毛重头尾边丝默认合格:20231024刘侣
+							ypd.setJudgeresult("40740801");
+						}
+					}
+				}
+				//包装状态(20191016)
+				ypd.setIs_package("0");
+				
+				
+				this.getMapper(YdmProductDetailMapper.class).insert(ypd);
+				rm.setState("200");
+
+				//-------2018.3.27-----修改销售订单状态 -----vir-----
+				if(mcccD.getOrder_no()!=null&&mcccD.getOrder_no().length()>6){
+						String contract_no=mcccD.getOrder_no().substring(0, mcccD.getOrder_no().length()-6);
+						String contract_line_seq=mcccD.getOrder_no().substring(mcccD.getOrder_no().length()-6, mcccD.getOrder_no().length()-3);
+						String order_seq=mcccD.getOrder_no().substring(mcccD.getOrder_no().length()-3);
+						SlmOrderInfo order=new SlmOrderInfo();
+						order.setContract_no(contract_no);
+						order.setContract_line_seq(contract_line_seq);
+						order.setOrder_seq(order_seq);
+						order.setValid_flag("1");
+						List<SlmOrderInfo> orderList=this.getBean(SlmOrderInfoServiceImpl.class).doQuery(order);
+						boolean in=true;
+						if(orderList.size()==1){
+							order=orderList.get(0);
+						}else if(orderList.size()>1&&order_pk!=null && (!"".equals(order_pk))){
+							SlmOrderInfo pk_order=this.getMapper(SlmOrderInfoMapper.class).findById(order_pk);
+							if(pk_order!=null)
+								order=pk_order;
+						}else{
+							in=false;
+						}
+						if(in){
+							order.setP_order_flag_no(order.getOrder_flag_no());
+							order.setP_order_flag_name(order.getOrder_flag_name());
+							order.setOrder_flag_no("103409");
+							order.setOrder_flag_name("缴库");
+							this.getBean(SlmOrderInfoServiceImpl.class).doUpdate(order);
+						}
+					}
+				//-------2018.3.27-----修改销售订单状态 -----vir-----
+				//}
+				//else 
+				//{
+				//	rm.setState("500");
+				//	rm.setMsgInfo("不存在记录!");
+				//}
+			}
+			else {
+				rm.setState("500");
+				rm.setMsgInfo("传入的主键为空!");
+			}
+
+		}
+		return rm;
+	}
+
+	/**
+	 * 罩退入库接口
+	 * @param cp2
+	 * @return
+	 * @throws Exception 
+	 */
+	public ResultModel doMesIn2(CommonPage<MesCrAnnealM> cp2) throws Exception {
+		ResultModel rm = new ResultModel();
+
+		MesCrAnnealM mesxx=cp2.getObject();
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date now = new Date();
+		if(mesxx.getCoil_no()!=null&&mesxx.getCoil_no()!=""){
+			YdmProductDetail ypd=new YdmProductDetail();
+			//调用库存接口存数据时,保存 虚拟物料号,机台代码,机台名称
+			List<ComBaseMachine> listcom=this.getMapper(ComBaseMachineMapper.class).findWithCondition(null, "machine_code='"+mesxx.getMachine_code()+"'", null, 0, 0);
+			ypd.setMachine_code(mesxx.getMachine_code());
+			if(listcom!=null && listcom.size()>0){
+				ypd.setMachine_name(listcom.get(0).getMachine_name());
+			}	
+			List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno ='"+mesxx.getMaterial_no()+"'", null, 0, 0);
+			if(list!=null && list.size()>0){
+				ypd.setMaterailtype(list.get(0).getMaterailtype());
+			}
+			//ypd.setMaterailcoilno(mesxx.getMaterial_no());
+			ypd.setMaterailcoilno(mesxx.getMaterial_no_src());
+			ypd.setObject_no_vt(mesxx.getMaterial_no_vt());
+			ypd.setOrderno(mesxx.getOrder_no());
+			ypd.setProdorderno(mesxx.getProd_order_no());
+
+			
+			
+			String order_pk="";
+			if(mesxx.getProd_order_no()!=null&&!"".equals(mesxx.getProd_order_no())){
+				//注意!!
+				PlnProdorder pp=new PlnProdorder();
+				pp.setProd_order_no(mesxx.getProd_order_no());
+				List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+				if(lpp!=null&&lpp.size()>0){
+					pp = lpp.get(0);
+					ypd.setCustomer_no(pp.getCustomer_no());
+					ypd.setCustomer_nm(pp.getCustomer_name());
+					ypd.setPsc(pp.getPsc());
+					ypd.setDelivery_state_code(pp.getDelivery_state_code());//交货状态
+					ypd.setDelivery_state_desc(pp.getDelivery_state_desc());
+					ypd.setProd_code(pp.getProd_code());
+					ypd.setProd_name(pp.getProd_name());
+					ypd.setStd_code(pp.getStd_code());
+					ypd.setStd_name(pp.getStd_name());
+					ypd.setUse_code(pp.getUse_code());
+					ypd.setUse_name(pp.getUser_name());
+					ypd.setPlan_code(pp.getPline_code());
+					ypd.setPline_name(pp.getPline_name());
+					ypd.setSteelcode(pp.getSteel_code());
+					ypd.setReceiv_no(pp.getReciver_unit_no());
+					ypd.setReceiv_nm(pp.getReciver_unit_name()); 
+				}
+
+			}
+			ypd.setCreater(username);
+			ypd.setCreatedate(now);
+			ypd.setCoilno(mesxx.getCoil_no());
+			
+			ypd.setSteelcode(mesxx.getSteel_code());
+			
+			// 改为获取投料卷信息里的判定牌号:20240722刘侣 改回来不动 20240815
+			ypd.setJudgesteelcode(mesxx.getSteel_code());	
+//			ypd.setJudgesteelcode(list.get(0).getJudgesteelcode());	
+			
+			
+			//ypd.setSurfaceresult(mesxx.getSurface_rst());
+			//ypd.setProduceorder(mesxx.getWrk_ord());
+			//ypd.setProduceteam(mcccD.getWrk_grp());
+			ypd.setProduceorder(mesxx.getDischarge_ord());//产出班次
+			ypd.setProduceteam(mesxx.getDischarge_grp());//产出班组
+			/*if (mesxx.getDischarge_date()!=null && !"".equals(mesxx.getDischarge_date())) {				
+				ypd.setProducedate(new SimpleDateFormat("yyyy-MM-dd").parse(mesxx.getDischarge_date()));//产出时间/生产结束时间
+			}
+			if (ypd.getProducedate()==null) {
+			}*/
+			//20210628 取交工时间
+			ypd.setProducedate(now);//产出时间/生产结束时间
+			//ypd.setProducedate(mesxx.getDischarge_time());//产出时间/生产结束时间
+			ypd.setState("-1");
+			ypd.setSource("0");
+			//ypd.setStorageattr("500203");//?
+			ypd.setStorageattr(cp2.getMemo1());
+			ypd.setCoiltype("500203".equals(ypd.getStorageattr())?"2":"1");
+			ypd.setThick(mesxx.getAct_thk());
+			ypd.setWidth(mesxx.getAct_wdt());
+			ypd.setLength(mesxx.getAct_len());
+			//20191018:包括目标宽度,目标厚度到库存表
+			ypd.setLz_thick(mesxx.getAim_thk());//合同厚度(目标厚度)
+			ypd.setLz_width(mesxx.getAim_wdt());//合同宽度(目标宽度)
+			ypd.setDiameter_inn(mesxx.getAct_inn_dia());
+			ypd.setDiameter_out(mesxx.getAct_out_dia());
+			//ypd.setProducedate(mesxx.getProduce_time());
+			ypd.setFactweight(mesxx.getCoil_act_wgt());//产出卷实重    不是原料卷实重?
+			ypd.setTheoryweight(mesxx.getCoil_thr_wgt());
+			ypd.setQuantity(1);
+
+			ypd.setPsc("");
+			ypd.setPlan_code("");
+			ypd.setInspection_lot("");
+			ypd.setObject_no_xg("");
+			String order1=(String)this.getSession().getAttribute(HomeService.SESSION_WORK_ORD);
+			String team1=(String)this.getSession().getAttribute(HomeService.SESSION_WORK_GRP);
+			ypd.setInorder(order1);
+			ypd.setInteam(team1);
+			//String coco = mesxx.getCoil_no().substring(0,8);
+			//2018-07-09
+			YdmProductDetail yyd=new YdmProductDetail();
+			yyd = this.getMapper(YdmProductDetailMapper.class).doFind(mesxx.getMaterial_no(), null);
+			if(yyd==null){
+				yyd=new YdmProductDetail();
+			}
+			
+			// 退火交工将投料卷的表面判定结果id赋值道产出的退火卷中库存表的up_surface_flaw列中:20230419刘侣:bug修复:20230706
+//			if (yyd.getUp_surface_result_id() != null && !"".equals(yyd.getUp_surface_result_id())) {
+			ypd.setUp_surface_flaw(yyd.getUp_surface_result_id());
+//			}
+			// end
+			
+			if(yyd.getMaterailcoilno()!=null&&!"".equals(yyd.getMaterailcoilno())){
+				ypd.setMaterailcoilno(yyd.getMaterailcoilno());
+			}
+			//炉号
+			if(yyd.getHeatno()!=null&&!"".equals(yyd.getHeatno())){
+				ypd.setHeatno(yyd.getHeatno());
+			}
+			// 增加物料属性
+			if(yyd.getObject_attr()!=null&&!"".equals(yyd.getObject_attr())){
+				ypd.setObject_attr(yyd.getObject_attr());
+			}
+			//2019-02-21  物料属性
+			if(cp2.getMemo3()!=null && !"".equals(cp2.getMemo3())){
+				ypd.setObject_attr(cp2.getMemo3());
+				ypd.setIsbl("1");
+			}
+			//检验号
+			ypd.setInspection_lot(mesxx.getInspection_lot());
+			ypd.setBatchno(mesxx.getBatch_no());
+
+
+			if(yyd.getLzorderno()!=null&&!"".equals(yyd.getLzorderno())){
+				ypd.setLzorderno(yyd.getLzorderno());
+			}
+			ypd.setMaterailcoilno(mesxx.getMaterial_no_src());//主表的原始卷号。
+
+			//20190801 边丝和头尾卷默认综判判废//20191025 进废副品库
+			String lastChar = ypd.getCoilno().substring(ypd.getCoilno().length()-1);
+			if ("B".equals(lastChar) || "H".equals(lastChar)) {
+				ypd.setJudgeresult("40740804");
+				//20200317 净重的头尾卷及边丝入废钢库  毛重进成品库 黄涛提出
+				String condition = "contract_no||contract_line_seq||order_seq = '"+ypd.getOrderno()+"' and nvl(change_flag,'0')<>'1'";
+				List<SlmOrderInfo> soiList = this.getMapper(SlmOrderInfoMapper.class).findWithCondition(null, condition, null, 0, 0);
+				if (soiList!=null && soiList.size()>0) {
+					String weight_type_no = soiList.get(0).getWeight_type_no();
+					if ("102301".equals(weight_type_no)) {//净重
+						
+						// 净重的头尾卷和边丝脱单后需要手动插入脱单信息:20230725刘侣
+						// 前提是这个卷没有做过脱单插入:
+						String userName=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+						String conditiontd = " and OBJECT_NO = '"+ypd.getCoilno()+"' and OPT_TYPE = '0'";
+						List<PlnMatReplaceLog> pmrList = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, conditiontd, null, 0, 0);
+						if (pmrList.size() == 0) {
+							List<PlnMatReplaceLog> lmmrl = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, "",
+									" serial_no desc ", 0, 1);
+							long iNo = 1;
+							if (lmmrl != null && lmmrl.size() > 0) {
+								iNo = lmmrl.get(0).getSerial_no() + 1;
+							}
+							PlnMatReplaceLog mmrl = new PlnMatReplaceLog();
+							mmrl.setSerial_no(iNo++);
+							mmrl.setObject_no(ypd.getCoilno());
+							mmrl.setOpt_type("0");
+							mmrl.setStatus("0");
+							mmrl.setOrder_no(ypd.getOrderno());
+							
+							mmrl.setCreate_man_name(userName);
+							mmrl.setCreate_time(new Date());
+							mmrl.setMemo("净重头尾边丝卷补脱单信息");
+							this.getMapper(PlnMatReplaceLogMapper.class).insert(mmrl);
+						}
+						
+						// end
+						
+						ypd.setStorageattr("500210");
+						ypd.setOrderno("");
+						ypd.setProdorderno("");
+						ypd.setObject_no_vt("");
+					}else if ("102302".equals(weight_type_no)) {//毛重
+						ypd.setStorageattr("500203");
+						// 毛重头尾边丝默认合格:20231024刘侣
+						ypd.setJudgeresult("40740801");
+					}
+				}
+			}
+			//包装状态(20191016)
+			ypd.setIs_package("0");
+			//20200716退火默认合格
+			ypd.setJudgeresult("40740801");
+			this.getMapper(YdmProductDetailMapper.class).insert(ypd);
+			rm.setState("200");
+
+			//-------2018.3.27-----修改销售订单状态 -----vir-----
+			if(mesxx.getOrder_no()!=null&&mesxx.getOrder_no().length()>6){
+					String contract_no=mesxx.getOrder_no().substring(0, mesxx.getOrder_no().length()-6);
+					String contract_line_seq=mesxx.getOrder_no().substring(mesxx.getOrder_no().length()-6, mesxx.getOrder_no().length()-3);
+					String order_seq=mesxx.getOrder_no().substring(mesxx.getOrder_no().length()-3);
+					SlmOrderInfo order=new SlmOrderInfo();
+					order.setContract_no(contract_no);
+					order.setContract_line_seq(contract_line_seq);
+					order.setOrder_seq(order_seq);
+					order.setValid_flag("1");
+					List<SlmOrderInfo> orderList=this.getBean(SlmOrderInfoServiceImpl.class).doQuery(order);
+					boolean in=true;
+					if(orderList.size()==1){
+						order=orderList.get(0);
+					}else if(orderList.size()>1&&order_pk!=null && (!"".equals(order_pk))){
+						SlmOrderInfo pk_order=this.getMapper(SlmOrderInfoMapper.class).findById(order_pk);
+						if(pk_order!=null)
+							order=pk_order;
+					}else{
+						in=false;
+					}
+					if(in){
+						order.setP_order_flag_no(order.getOrder_flag_no());
+						order.setP_order_flag_name(order.getOrder_flag_name());
+						order.setOrder_flag_no("103409");
+						order.setOrder_flag_name("缴库");
+						this.getBean(SlmOrderInfoServiceImpl.class).doUpdate(order);
+					}
+				}
+			//-------2018.3.27-----修改销售订单状态 -----vir-----
+			//}
+			//else 
+			//{
+			//	rm.setState("500");
+			//	rm.setMsgInfo("不存在记录!");
+			//}
+		}
+		else {
+			rm.setState("500");
+			rm.setMsgInfo("传入的主键为空!");
+		}
+		return rm;
+	}
+
+	/**
+	 * 吊销卷插入,就是原料卷退回原料库
+	 * queryNo:原始卷号;ypdi:吊销卷信息[新卷号Coilno(吊销卷卷号),长度Length、内径Diameter_inn、外径Diameter_out、理重Theoryweight、实重Factweight]
+	 * */
+	public ResultModel doInsertRevoke(String queryNo,YdmProductDetail ypdi)
+	{
+		ResultModel rm=new ResultModel();
+		try 
+		{
+			if(queryNo!=null&&queryNo!="")
+			{
+				YdmProductDetail ypd=this.getMapper(YdmProductDetailMapper.class).doFind(queryNo, null);
+				if(ypd!=null)
+				{
+					if(ypdi.getCoilno()!=null)
+					{
+						YdmProductDetail yd = ypd;
+
+						yd.setCoilno(ypdi.getCoilno());
+						yd.setLength(ypdi.getLength());
+						yd.setDiameter_inn(ypdi.getDiameter_inn());
+						yd.setDiameter_out(ypdi.getDiameter_out());
+						yd.setTheoryweight(ypdi.getTheoryweight());
+						yd.setFactweight(ypdi.getFactweight());
+						yd.setOrderno(null);
+						yd.setProdorderno(null);
+						yd.setState("0");
+
+						List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).find(yd, 0, 1);
+						if (list!=null && list.size()>0) {
+							rm.setState("500");
+							rm.setMsgInfo("新增卷号重复!");
+						}else{
+							this.getMapper(YdmProductDetailMapper.class).doInsert(yd);
+						}
+
+						//插入垛位信息
+						YdmProductButtresslist ybt = new YdmProductButtresslist();
+						ybt.setButtressno("100102001");
+						ybt.setCoilno(ypd.getCoilno());
+						ybt.setStorageattr(ypd.getSteelcode());
+						ybt.setCreatedate(new Date());
+						ybt.setAreano("100102");
+						ybt.setLayer(1);
+						ybt.setLocality(0);
+						this.getMapper(YdmProductButtresslistMapper.class).doInsert(ybt);
+
+
+						//插入入库信息
+						YdmProductInlist ypi=new YdmProductInlist();
+						ypi.setInbillno(this.createINBILLNO());
+						if(ypi.getCreatedate()==null||"".equals(ypi.getCreatedate())) {
+							ypi.setCreatedate(new Date());
+						}
+						if (ypi.getCreater()==null||"".equals(ypi.getCreater())) {
+							ypi.setCreater("");
+						}
+						ypi.setCoilno(yd.getCoilno());
+						ypi.setCoiltype(yd.getCoiltype());
+						ypi.setMaterailtype(yd.getMaterailtype());
+						ypi.setSource(yd.getSource());
+						ypi.setMaterailsupplier(yd.getMaterailsupplier());
+						ypi.setIsbox(yd.getIsbox());
+						ypi.setBoxno(yd.getBoxno());
+						ypi.setDrawingno(yd.getDrawingno());
+						ypi.setBatchno(yd.getBatchno());
+						ypi.setHeatno(yd.getBatchno());
+						ypi.setSmpno(yd.getSmpno());
+						ypi.setManagementno(yd.getManagementno());
+						ypi.setStorageattr(yd.getStorageattr());
+						ypi.setProd_code(yd.getProd_code());
+						ypi.setProd_name(yd.getProd_name());
+						ypi.setStd_code(yd.getStd_code());
+						ypi.setStd_name(yd.getStd_name());
+						ypi.setUse_code(yd.getUse_code());
+						ypi.setUse_name(yd.getUse_name());
+						ypi.setPline_name(yd.getPline_name());
+						ypi.setPostid(yd.getPostid());
+						ypi.setThick(yd.getThick());
+						ypi.setWidth(yd.getWidth());
+						ypi.setLength(yd.getLength());
+						ypi.setDiameter_inn(yd.getDiameter_inn());
+						ypi.setDiameter_out(yd.getDiameter_out());
+						ypi.setQuantity(yd.getQuantity());
+						ypi.setTheoryweight(yd.getTheoryweight());
+						ypi.setCoreweight(yd.getCoreweight());
+						ypi.setGrossweight(yd.getGrossweight());
+						ypi.setPackweight(yd.getPackweight());
+						ypi.setFactweight(yd.getFactweight());
+						ypi.setCustomer_nm(yd.getCustomer_nm());
+						ypi.setCustomer_no(yd.getCustomer_no());
+						ypi.setReceiv_no(yd.getReceiv_no());
+						ypi.setReceiv_nm(yd.getReceiv_nm());
+						ypi.setOrderno(yd.getOrderno());
+						ypi.setProdorderno(yd.getProdorderno());
+						ypi.setSteelcode(yd.getSteelcode());
+						ypi.setJudgesteelcode(yd.getJudgesteelcode());
+						ypi.setPacking_group(yd.getPacking_group());
+						ypi.setChemresult(yd.getChemresult());
+						ypi.setSizeresult(yd.getSizeresult());
+						ypi.setSurfaceresult(yd.getSurfaceresult());
+						ypi.setWeightresult(yd.getWeightresult());
+						ypi.setJudgeresult(yd.getJudgeresult());
+						ypi.setPhysresult(yd.getPhysresult());
+						ypi.setSpyresult(yd.getSpyresult());
+						ypi.setProducedate(yd.getProducedate());
+						ypi.setProduceorder(yd.getProduceorder());
+						ypi.setProduceteam(yd.getProduceteam());
+						if(ypi.getIndate()==null||"".equals(ypi.getIndate()))
+						{
+							ypi.setIndate(new Date());
+						}
+						///ypi.setInorder(order);
+						//ypi.setInteam(team);
+						ypi.setOperator("");
+						ypi.setIntype("500405");
+						ypi.setLocality("1");
+
+						ypi.setPosition("0");
+						ypi.setMemo(yd.getMemo());
+						ypi.setButtressno("100102001");
+						//20190220:赵淋支:将库存表的检验号待入到入库表
+						ypi.setInspection_lot(yd.getInspection_lot());
+						
+						// 加入物料属性:20230725刘侣
+						ypi.setObj_attr_in(yd.getObject_attr());
+						// end
+						
+						this.getMapper(YdmProductInlistMapper.class).insert(ypi);
+
+
+						rm.setState("200");
+
+					}
+					else
+					{
+						rm.setState("500");
+						rm.setMsgInfo("新增卷号为空!");
+					}
+				}
+				else 
+				{
+					rm.setState("500");
+					rm.setMsgInfo("库存中不存在原始卷号记录!");
+				}
+			}
+			else
+			{
+				rm.setState("500");
+				rm.setMsgInfo("原始卷号为空!");
+			}
+			rm.setState("200");
+		} 
+		catch (Exception ex) 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,吊销卷插入库存失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+
+	/**
+	 * 吊销卷插入撤销
+	 * queryNo:吊销卷卷号
+	 * */
+	public ResultModel doInsertRevokeCanl(String queryNo)
+	{
+		ResultModel rm=new ResultModel();
+		try 
+		{
+			if(queryNo!=null&&queryNo!="")
+			{
+				YdmProductDetail ypd=this.getMapper(YdmProductDetailMapper.class).doFind(queryNo, null);
+				if(ypd!=null)
+				{
+					if(!"0".equals(ypd.getState())||!"500201".equals(ypd.getStorageattr()))
+					{
+						rm.setState("500");
+						rm.setMsgInfo("原料卷不在库或或不在原料库,不能撤销!");
+						return rm;
+					}
+					this.getMapper(YdmProductButtresslistMapper.class).doDelete(queryNo, null);
+					//2018-09-26
+					//this.getMapper(YdmProductInlistMapper.class).doDelete(queryNo);
+					this.getMapper(YdmProductInlistMapper.class).doDeleteByCoilno(queryNo,"500405");
+					this.getMapper(YdmProductDetailMapper.class).doDelete(queryNo, null);
+					rm.setState("200");
+				}
+				else 
+				{
+					rm.setState("500");
+					rm.setMsgInfo("库存中不存在卷号记录!");
+				}
+			}
+			else
+			{
+				rm.setState("500");
+				rm.setMsgInfo("卷号为空!");
+			}
+			rm.setState("200");
+		} 
+		catch (Exception ex) 
+		{
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,吊销卷插入库存失败!");
+			ex.printStackTrace();
+		}
+		return rm;
+
+	}
+
+	/**
+	 * 可充当原料卷查询
+	 * 从原料库存YDM_PRODUCT_DETAIL中查询可充当的原料卷
+	 * */
+	public ResultModel doFindYD(){
+		ResultModel rm=new ResultModel();
+		try {
+			rm.setData(this.getMapper(YdmProductDetailMapper.class).doFindPD());
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setMsgInfo("查询失败!");
+			rm.setState("500");
+		}
+		return rm;	
+	}
+	/**
+	 * 原料卷充当-重制
+	 * sum.coilno 充当卷号
+	 * sum.prodorderno 生产订单号
+	 * sum.orderno 销售订单号
+	 * sum.object_no_vt 虚拟物料号
+	 * sum.customer_no 客户编码
+	 * sum.customer_nm 客户名称
+	 * sum.receiv_no 收货单位编码
+	 * sum.receiv_nm 收货单位名称
+	 * */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public ResultModel doVolRawMat(CommonPage<YdmProductDetail> sum)
+			throws Exception{
+		ResultModel rm=new ResultModel();
+		try {
+			YdmProductDetail yd=sum.getObject();
+			if(yd==null){
+				throw new Exception("请传入数据");
+			}
+			//有效性检查
+			YdmProductDetail yd2=this.getMapper(YdmProductDetailMapper.class).doFindById(yd);
+			if(yd2.getProdorderno()!=null||!yd2.getState().equals("0")||(!yd2.getStorageattr().equals("500201")&&!yd2.getStorageattr().equals("500204"))){
+				rm.setState("500");
+				rm.setMsgInfo("不允许进行充当!");
+			}
+			//修改对应卷号数据设置 生产订单号、销售订单号、虚拟物料号、客户编码、客户名称、收货单位编码、收货单位名称
+			this.getMapper(YdmProductDetailMapper.class).update(yd);
+			rm.setState("200");
+
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("充当失败!");
+			e.printStackTrace();
+		}
+		return rm;
+	}
+	/**
+	 * 原料卷充当撤销
+	 * sum.coilno 充当卷号
+	 * */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public ResultModel doCanlVolRawMat(CommonPage<YdmProductDetail> sum)
+			throws Exception{
+		ResultModel rm=new ResultModel();
+		try {
+			YdmProductDetail yd=sum.getObject();
+			if(yd==null){
+				throw new Exception("请传入数据");
+			}
+			//有效性检查
+			YdmProductDetail yd2=this.getMapper(YdmProductDetailMapper.class).doFindById(yd);
+			if(yd2.getProdorderno()==null||!yd2.getState().equals("0")||(!yd2.getStorageattr().equals("500201")&&!yd2.getStorageattr().equals("500204"))){
+				rm.setState("500");
+				rm.setMsgInfo("不允许撤销充当!");
+			}
+			this.getMapper(YdmProductDetailMapper.class).DoUpdateRM(yd);
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("撤销充当失败!");
+			e.printStackTrace();
+		}
+		return rm;
+	}
+	
+	/**
+	 * 原料卷充当
+	 * @throws Exception 
+	 * */
+	public ResultModel doFinshedProductActUpdate(YdmProductDetail queryNo) throws Exception {
+		ResultModel rm=new ResultModel();
+		if(queryNo.getCoilno()!=""&&queryNo.getCoilno()!=null) {
+			YdmProductDetail ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(queryNo.getCoilno(), null);
+			if(ypd1!=null) {
+				if(!"0".equals(ypd1.getState())||!"".equals(ypd1.getProdorderno())||ypd1.getProdorderno()!=null
+						 ||(!"500201".equals(ypd1.getStorageattr())&&!"500204".equals(ypd1.getStorageattr()))) {
+					rm.setState("500");
+					rm.setMsgInfo("原料卷不在库或生产订单号不为空或不在原料库,不能充当!");
+					return rm;
+				}
+				this.getMapper(YdmProductDetailMapper.class).doFinshedProductActUpdate(queryNo);
+				rm.setState("200");
+			}
+			else {
+				throw new Exception();
+			}
+		}
+		else {
+			rm.setState("500");
+			rm.setMsgInfo("传入的卷号为空!");
+		}
+		return rm;
+	}
+
+	/**
+	 * 撤销原料卷充当
+	 * @throws Exception 
+	 * */
+	public ResultModel doActAs(String queryNo) throws Exception {
+		ResultModel rm=new ResultModel();
+		if(queryNo!=""&&queryNo!=null) {
+			YdmProductDetail ypd1=this.getMapper(YdmProductDetailMapper.class).doFind(queryNo, null);
+			if(ypd1!=null) {
+				if(!"0".equals(ypd1.getState())||"".equals(ypd1.getProdorderno()) ||ypd1.getProdorderno()==null
+						|| (!"500201".equals(ypd1.getStorageattr())&&!"500204".equals(ypd1.getStorageattr()))) {
+					rm.setState("500");
+					rm.setMsgInfo("原料卷不在库或生产订单号为空或不在原料库,不能撤销充当!");
+					return rm;
+				}
+				YdmProductDetail ypd2 = new YdmProductDetail();
+				ypd2.setCoilno(queryNo);
+				this.getMapper(YdmProductDetailMapper.class).doMaterialReplaceUpdateB(ypd2);
+				rm.setState("200");
+			} else {
+				throw new Exception();
+			}
+		} else {
+			rm.setState("500");
+			rm.setMsgInfo("传入的卷号为空!");
+		}
+		return rm;
+	}
+
+
+
+	/**
+	 * 可发资源查询(查询可发明细)
+	 * */
+	public ResultModel doQueryWebBySales(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm=new ResultModel();
+		int pageIndex=cp.getPageIndex();
+		int pageSize=cp.getPageSize();
+		PageModel<YdmProductDetail> pm = new PageModel<YdmProductDetail>(pageIndex,pageSize);
+		try {
+			cp.setMemo1(null);
+			cp.setMemo2(null);
+			Object wjmin="",wjmax="";
+			if(cp.getMemo1()!=null&&cp.getMemo1()!="")
+				wjmin=Double.valueOf(cp.getMemo1()).doubleValue();
+			if(cp.getMemo2()!=null&&cp.getMemo2()!="")
+				wjmax=Double.valueOf(cp.getMemo2()).doubleValue();
+			Object thick,width;
+			if(cp.getObject().getThick()!=null && cp.getObject().getThick()==0)
+				thick="";
+			else 
+				thick=cp.getObject().getThick();
+			if(cp.getObject().getWidth()!=null && cp.getObject().getWidth()==0)
+				width="";
+			else 
+				width=cp.getObject().getWidth();
+			String State =cp.getObject().getState();
+			if ("1".equals(State)) {
+				pm.setRows(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySale
+						((pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize, cp.getStartTime(), cp.getEndTime(), cp.getObject().getCoilno(), cp.getObject().getJudgesteelcode(), 
+								thick,width,wjmin,wjmax,cp.getObject().getStorageattr(),cp.getObject().getOrderno()));
+				pm.setTotal(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySaleCount
+						(cp.getStartTime(), cp.getEndTime(), cp.getObject().getCoilno(), cp.getObject().getJudgesteelcode(), 
+								thick,width,wjmin,wjmax,cp.getObject().getStorageattr(),cp.getObject().getOrderno()));
+			}else {
+				String order_no=cp.getObject().getOrderno();
+				String whole="0";
+				if(order_no!=null){
+					String contract_no=order_no.substring(0,order_no.length()-6);
+					String line_seq=order_no.substring(order_no.length()-6,order_no.length()-3);
+					String order_seq=order_no.substring(order_no.length()-3);
+					SlmOrderInfo order=new SlmOrderInfo();
+					order.setContract_no(contract_no);
+					order.setContract_line_seq(line_seq);
+					order.setOrder_seq(order_seq);
+					List<SlmOrderInfo> order_list=this.getMapper(SlmOrderInfoMapper.class).find(order,0,0);
+					if(order_list.size()>0){
+						if("1".equals(order_list.get(0).getWhole_coil()))
+							whole="1";
+					}
+				}
+				pm.setRows(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySales
+						((pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize, cp.getStartTime(), cp.getEndTime(), cp.getObject().getCoilno(), cp.getObject().getJudgesteelcode(), 
+								thick,width,wjmin,wjmax,cp.getObject().getStorageattr(),cp.getObject().getOrderno(),cp.getObject().getOrder_nature(),cp.getObject().getWeight_type_no(),whole));
+				pm.setTotal(this.getMapper(YdmProductDetailMapper.class).doQueryWebBySalesCount
+						(cp.getStartTime(), cp.getEndTime(), cp.getObject().getCoilno(), cp.getObject().getJudgesteelcode(), 
+								thick,width,wjmin,wjmax,cp.getObject().getStorageattr(),cp.getObject().getOrderno(),cp.getObject().getOrder_nature(),cp.getObject().getWeight_type_no(),whole));
+			}
+			rm.setData(pm);
+			rm.setState("200");
+		}
+		catch(Exception ex) {
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!"+ex.getMessage());
+			ex.printStackTrace();
+		}
+		return rm;
+	}
+
+
+	/**
+	 * 提货单指定物料
+	 * */
+	public ResultModel doShippingLock(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm=new ResultModel();
+		try {
+			if(cp.getObject().getCoilno()!=null&&!"".equals(cp.getObject().getCoilno())) {
+				YdmProductDetail ypd = new YdmProductDetail();
+				ypd.setCoilno(cp.getObject().getCoilno());
+				if(cp.getObject().getBoxno()!=null&&!"".equals(cp.getObject().getBoxno())) {
+					ypd.setBoxno(cp.getObject().getBoxno());
+				}
+				ypd.setState("0");
+				List<YdmProductDetail> lst = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+				if(lst==null||lst.size()==0) {
+					rm.setState("500");
+					rm.setMsgInfo("库存状态发生改变,请重新查询再操作!");
+					return rm; 
+				}
+
+				ypd.setState("2");
+				if(cp.getObject().getBill_no()!=null&&!"".equals(cp.getObject().getBill_no()))
+					ypd.setBill_no(cp.getObject().getBill_no());
+				if(cp.getObject().getLine_no()!=null&&!"".equals(cp.getObject().getLine_no()))
+					ypd.setLine_no(cp.getObject().getLine_no());
+				ypd.setUpdatedate(new Date());
+				this.getMapper(YdmProductDetailMapper.class).doUpdate(ypd);
+				rm.setState("200");
+			} else {
+				rm.setState("500");
+				rm.setMsgInfo("传入卷号COILNO 箱号BOXNO 为空,不允许操作!");
+				return rm;
+			}
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!"+e.getMessage());
+			e.printStackTrace();
+		}
+		return rm;
+	}
+
+
+	/**
+	 * 提货单指定物料
+	 * */
+	public ResultModel doShippingLockCanl(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm=new ResultModel();
+		try {
+			if(cp.getObject().getCoilno()!=null&&!"".equals(cp.getObject().getCoilno())) {
+				YdmProductDetail ypd = new YdmProductDetail();
+				ypd.setCoilno(cp.getObject().getCoilno());
+				if(cp.getObject().getBoxno()!=null&&!"".equals(cp.getObject().getBoxno())) {
+					ypd.setBoxno(cp.getObject().getBoxno());
+				}
+				ypd.setState("2");
+				List<YdmProductDetail> lst = 	this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+				if(lst==null||lst.size()==0) {
+					rm.setState("500");
+					rm.setMsgInfo("库存状态发生改变,请重新查询再操作!");
+					return rm; 
+				}
+				ypd.setState("0");
+				ypd.setUpdatedate(new Date());
+				this.getMapper(YdmProductDetailMapper.class).doUpdateApi(ypd);
+			} else {
+				rm.setState("500");
+				rm.setMsgInfo("传入卷号COILNO 箱号BOXNO 为空,不允许操作!");
+				return rm;
+			}
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!");
+			e.printStackTrace();
+		}
+		return rm;
+	}
+
+	/**
+	 * 查询原始卷号
+	 * */
+	public ResultModel dogetDetailCoilno(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm=new ResultModel();
+
+		try {
+			if(cp.getObject().getCoilno()!=null&&!"".equals(cp.getObject().getCoilno())) {
+				YdmProductDetail ypd = new YdmProductDetail();
+				ypd.setCoilno(cp.getObject().getCoilno());
+				List<YdmProductDetail> list1 = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+				if(list1.size()>0){					
+					rm.setData(list1.get(0));
+				}
+			}
+			else {
+				rm.setState("500");
+				rm.setMsgInfo("传入卷号 为空,不允许操作!");
+				return rm;
+			}
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("服务端异常,查询失败!");
+			e.printStackTrace();
+		}
+		rm.setState("200");
+		return rm;
+	}
+
+	/**
+	 * 内部接口-获取成品物料检验、判定结果  
+	 * @param sum
+	 * @return
+	 */
+	public ResultModel doFindResultByCoilno(CommonPage<YdmProductDetail> sum){
+		ResultModel rm =new ResultModel();
+		if(sum.getObject()==null){
+			rm.setState("500");
+			rm.setMsgInfo("请传入参数");
+			return rm;
+		}
+		if(sum.getObject().getCoilno()==null){
+			rm.setState("500");
+			rm.setMsgInfo("请传入物料号");
+			return rm;
+		}
+		YdmProductDetail ypd = sum.getObject();
+		//int count = this.getMapper(YdmProductDetailMapper.class).countWithCondition(sum.getObject(), null);
+		try {
+			rm.setData(this.getMapper(YdmProductDetailMapper.class).doFindResultByCoilno(ypd));
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setState("500");
+			e.getStackTrace();
+			rm.setMsgInfo("获取失败!"+e.getMessage());
+		}
+		return rm;
+	}
+
+
+	/**
+	 * 更新成品物料检验、判定结果接口
+	 * @param
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doUpdateResultByCoilno(CommonPage<YdmProductDetail> sum) throws Exception{
+		ResultModel rm =new ResultModel();
+		if(sum.getObjectList().size()<=0){
+			throw new Exception("请传入参数");
+		}
+		List<YdmProductDetail> ypd = sum.getObjectList();
+		for (YdmProductDetail ypdd : ypd) {
+			YdmProductDetail y = ypdd;
+			this.getMapper(YdmProductDetailMapper.class).update(y);
+		}
+		rm.setState("200");
+		return rm;
+	}
+	/***
+	 * 调用物流模块提供的接口从库存表中获取物料状态=‘在库’的物料信息;默认显示未进行综合判定的物料信息
+	 * @param cp
+	 * @return
+	 */
+	public ResultModel doFindYdmQS(CommonPage<YdmProductDetail> cp){
+		ResultModel r=new ResultModel();
+		YdmProductDetail ydm = cp.getObject();
+		int index = cp.getPageIndex();
+		int size = cp.getPageSize();
+		PageModel<YdmProductDetail> pm = new PageModel<YdmProductDetail>(index,size);
+		try{
+			List<YdmProductDetail> findbyYDM = this.getMapper(YdmProductDetailMapper.class).findYdmQS(ydm==null?new YdmProductDetail():ydm,index,size);
+			int count = this.getMapper(YdmProductDetailMapper.class).findYdmQSCount(ydm==null?new YdmProductDetail():ydm);
+			pm.setRows(findbyYDM);
+			pm.setTotal(count);
+			r.setData(pm);
+			r.setState("200");
+		}catch(Exception e){
+			e.printStackTrace();
+			r.setState("500");
+			r.setErrorInfo("查询失败");
+		}
+		return r;
+	}
+	/**
+	 * 
+	 * @param cp
+	 * @return
+	 */
+	public ResultModel doCheckQS(CommonPage<YdmProductDetail> cp){
+		ResultModel rm= new ResultModel();
+		boolean b = true ;
+		try{
+			List<YdmProductDetail> list = cp.getObjectList();
+			for (YdmProductDetail y : list) {
+				List<YdmProductDetail> qs = this.getMapper(YdmProductDetailMapper.class).doCheckQS(y);
+				if (qs==null || qs.isEmpty()) {
+					rm.setData("500");
+					rm.setErrorInfo("查询失败,没有【"+y.getCoilno()+"】对应的物料");
+					return rm;
+				}else{
+					YdmProductDetail detail = qs.get(0);
+					String st = detail.getState();
+					if (st==null || "".equals(st)) {
+						rm.setData("500");
+						rm.setErrorInfo("数据不对,没有【"+y.getCoilno()+"】物料的在库状态,请联系DBA或相关人员检查数据。");
+						return rm;
+					}else{
+						if (!"0".equals(st)) {
+							b=false;
+							break;
+						}
+					}
+				}
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+		}finally{
+			if (b) {
+				rm.setState("200");
+			}else{
+				rm.setState("500");
+			}
+		}
+		return rm;
+	}
+	/*
+	 * 更新综合判定结果
+	 * 
+	 * */
+	public ResultModel updareUlJudgeResult(String UlId,String result){
+		ResultModel rm=new ResultModel();
+		try {
+			this.getMapper(YdmProductDetailMapper.class).updateUlJudgeResult(UlId, result);
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("更新结果失败");
+			rm.setErrorInfo(e.getMessage());
+		}
+		return rm;
+	}
+	/**
+	 * 提货单跟踪页面调用,查询提货单(提货单跟踪页面,添加更多查询条件,卷号、原料卷号、合同号)
+	 * @return
+	 */
+	public ResultModel BillHeat_doQueryWeb(CommonPage<SlmLadingBillHeat> sum){
+		ResultModel rm=new ResultModel();
+		SlmLadingBillHeat heat=sum.getObject();
+		int pageIndex=sum.getPageIndex();
+		int pageSize=sum.getPageSize(); 
+		String startTime=sum.getStartTime();
+		String endTime=sum.getEndTime();
+		PageModel<SlmLadingBillHeat> pm=new PageModel<SlmLadingBillHeat>(pageIndex, pageSize);
+		try{
+			if(startTime!=null&&!"".equals(startTime))		startTime+=" 00:00:00";
+			if(endTime!=null&&!"".equals(endTime))		endTime+=" 23:59:59";
+			List<SlmLadingBillHeat> map = this.getMapper(SlmLadingBillHeatMapper.class).findBillHeats(heat==null?new SlmLadingBillHeat():heat,pageIndex,pageSize,startTime,endTime);
+			int count = this.getMapper(SlmLadingBillHeatMapper.class).CountfindBillHeat(heat==null?new SlmLadingBillHeat():heat,startTime,endTime);
+			pm.setRows(map);
+			pm.setTotal(count);
+			rm.setData(pm);
+			rm.setState("200");
+		}catch(Exception e){
+			e.printStackTrace();
+			rm.setState("500");
+			rm.setErrorInfo("查询失败"+e.getMessage());
+		}
+		return rm;
+	}
+
+	/**
+	 * 库存质量锁定
+	 * @param Coilno
+	 * @param state
+	 * @return
+	 * @throws Exception 
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel  UpdateYdmState(String Coilno,String state) throws Exception
+	{
+		ResultModel rm =new ResultModel();
+		if(Coilno!=null&&!"".equals(Coilno)&&state!=null&&!"".equals(state)) {
+			YdmProductDetail ypd = new YdmProductDetail();
+			//根据传入状态  分 6锁定和0解锁
+			if(state.equals("0")) {
+				ypd.setCoilno(Coilno);
+				ypd.setState("6");
+				List<YdmProductDetail> listYdm =	this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+				if(listYdm!=null&&listYdm.size()>0) {
+					ypd.setState(state);
+					this.getMapper(YdmProductDetailMapper.class).update(ypd);
+					this.getMapper(YdmProductDetailMapper.class).kctbYdd(Coilno);
+				}
+				else {
+					rm.setState("500");
+					throw  new Exception("钢材状态不为质量锁定,无法解锁");
+				}
+
+			}
+			else if(state.equals("6")) {
+				ypd.setCoilno(Coilno);
+				ypd.setState("0");
+				List<YdmProductDetail> listYdm =	this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+				if(listYdm!=null&&listYdm.size()>0) {
+					ypd.setState(state);
+					this.getMapper(YdmProductDetailMapper.class).update(ypd);
+				}
+				else {
+					rm.setState("500");
+					throw  new Exception("钢材状态不为在库,无法质量锁定");
+				}
+			}
+		}
+		else {
+			rm.setState("500");
+			throw  new Exception("卷号和状态不能为空");
+		}
+		rm.setState("200");
+		return rm;
+	}
+
+	/**
+	 * 查询没有销售订单号并且在库的所有成品
+	 * @return
+	 */
+	public ResultModel selectYdm(){
+		ResultModel rm = new ResultModel();
+		try {
+			List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).selectYdm();
+			rm.setData(list);
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setMsgInfo("查询失败!");
+			rm.setState("500");
+		}
+		return rm;
+	}
+
+	/**
+	 * @author 赵淋支
+	 * @date   2018年12月1日
+	 * @description 查询所有的投料卷
+	 */
+	public ResultModel doQuaryDetailForM(CommonPage<YdmProductDetail> cp){
+		ResultModel rm = new ResultModel();
+		try {
+			YdmProductDetail ydm = cp.getObject();
+			int pageIndex = cp.getPageIndex();
+			int pageSize = cp.getPageSize();
+			String swhere = "";
+			// 原料卷
+			if (ydm.getCoilno()!=null && !"".equals(ydm.getCoilno())) {
+				swhere += " and ypd.coilno like '%"+ydm.getCoilno()+"%'";
+			}
+			// 机台号
+			if (ydm.getMachine_code()!=null && !"".equals(ydm.getMachine_code())) {
+				swhere += " and mcm.machine_code like '%"+ydm.getMachine_code()+"%'";
+			}
+			List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).doQuaryDetailForM(swhere,(pageIndex-1)*pageSize, (pageIndex-1)*pageSize+pageSize);
+			rm.setData(list);
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setMsgInfo("查询失败!");
+			rm.setState("500");
+		}
+		return rm;
+	}
+
+	/**
+	 * 
+	 * @author 赵淋支
+	 * @date   2018年12月1日
+	 * @description 投料卷:通过大卷,查询下面的小卷
+	 */
+	public ResultModel doQuaryDetailForC(CommonPage<YdmProductDetail> cp){
+		ResultModel rm = new ResultModel();
+		try {
+			YdmProductDetail ydm = cp.getObject();
+			if (ydm.getCoilno()==null || "".equals(ydm.getCoilno())) {
+				rm.setState("200");
+				rm.setMsgInfo("请传入投料大卷号!");
+				return rm;
+			}
+			String swhere = "";
+			// 原料卷
+			if (ydm.getCoilno()!=null && !"".equals(ydm.getCoilno())) {
+				swhere += " and mcm.material_no = '"+ydm.getCoilno()+"'";
+			}
+			rm.setData(this.getMapper(YdmProductDetailMapper.class).doQuaryDetailForC(swhere));
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setMsgInfo("查询失败!");
+			rm.setState("500");
+		}
+		return rm;
+	}
+
+	/**
+	 * 
+	 * @author 赵淋支
+	 * @date   2019年1月22日
+	 * @parameter 
+	 * @return 
+	 * @description 订单变更时,处理仓库的变动
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel doChangeMaterialStorage(CommonPage<YdmProductDetail> cp)
+			throws Exception{
+		ResultModel rm = new ResultModel();
+		if (cp.getObjectList() == null || cp.getObjectList().size() == 0) {
+			rm.setState("500");
+			rm.setMsgInfo("请选择库存数据!");
+			return rm;
+		}
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		//String team = (String) this.getSession().getAttribute(HomeService.SESSION_WORK_GRP);
+		//String order = (String) this.getSession().getAttribute(HomeService.SESSION_WORK_ORD);
+		String toStorage = cp.getMemo1(); //去向仓库
+
+		Date now = new Date();
+		for (YdmProductDetail YPD : cp.getObjectList()) {
+			YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class).doFind(YPD.getCoilno(),null);
+			if (ypd==null) {
+				throw new Exception("卷号【"+YPD.getCoilno()+"】数据不存在");
+			}
+			if ("-1".equals(ypd.getState())) { //物料还没有入库
+				//1.修改库存记录的仓库
+				YdmProductDetail newYpd = new YdmProductDetail();
+				newYpd.setCoilno(ypd.getCoilno());
+				newYpd.setStorageattr(toStorage);//设置新仓库
+				newYpd.setMemo(YPD.getMemo());//挪库原因
+				this.getMapper(YdmProductDetailMapper.class).update(newYpd);
+				//2.修改入库记录的仓库
+				YdmProductInlist YPI = new YdmProductInlist();
+				YPI.setCoilno(ypd.getCoilno());
+				YPI.setStorageattr(ypd.getStorageattr());
+				List<YdmProductInlist> ypiList = this.getMapper(YdmProductInlistMapper.class).find(YPI, 0, 0);
+				if (ypiList!=null && ypiList.size()>0) {
+					YdmProductInlist ypi = new YdmProductInlist();
+					ypi.setInbillno(ypiList.get(0).getInbillno());
+					ypi.setStorageattr(toStorage);//设置新仓库
+					this.getMapper(YdmProductInlistMapper.class).update(ypi);
+				}
+			}else if ("0".equals(ypd.getState())) { //物料处于在库状态  
+				YdmProductInlist YPI = new YdmProductInlist();
+				YPI.setCoilno(ypd.getCoilno());
+				YPI.setStorageattr(ypd.getStorageattr());
+				List<YdmProductInlist> ypiList = this.getMapper(YdmProductInlistMapper.class).find(YPI, 0, 0);
+				if (ypiList!=null && ypiList.size()>0) {
+					//1.从(前仓库)先撤销入库
+					this.getMapper(YdmProductInlistMapper.class).delete(ypiList.get(0).getInbillno());
+					//2.删除(前仓库)垛位信息
+					this.getMapper(YdmProductButtresslistMapper.class).doDelete(ypd.getCoilno(), ypd.getBoxno());				
+					//3.修改库存的仓库及状态
+					YdmProductDetail newYpd = new YdmProductDetail();
+					newYpd.setCoilno(ypd.getCoilno());
+					newYpd.setStorageattr(toStorage);//设置新仓库
+					newYpd.setState("-1");//新仓库变成待入库状态
+					if (cp.getMemo2()!=null && !"".equals(cp.getMemo2())) {
+						newYpd.setState(cp.getMemo2());//新仓库变成待入库状态/入库状态						
+					}
+					newYpd.setIs_can_load("0");// 将卷子可发运状态取消20230210刘侣
+					newYpd.setMemo(YPD.getMemo());//挪库原因
+					this.getMapper(YdmProductDetailMapper.class).update(newYpd);
+					this.getMapper(YdmProductDetailMapper.class).kctbYdd(newYpd.getCoilno());
+					//4.调用生产计划模块物料跟踪接口
+					PrcMaterielProcess pmp = new PrcMaterielProcess();
+					pmp.setObject_no(ypd.getCoilno());
+					pmp.setPrc_code("5BYA05");
+					pmp.setCreate_time(now);
+					if ("-1".equals(cp.getMemo2())) {
+						pmp.setRemark("订单变更成待入库");
+					}else if ("0".equals(cp.getMemo2())) {
+						pmp.setRemark("订单变更成入库");
+					}					
+					pmp.setCreate_man_name(userName);
+					int tmp= this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+					if(tmp==-1){
+						throw new Exception("物料跟踪失败");
+					}
+				}
+			}else if (!"-1".equals(ypd.getState()) && !"0".equals(ypd.getState())) {
+				// 物料不是待入库也不是在库的
+				throw new Exception("当前物料不是在库,也不是待入库!");
+			}
+		}
+		rm.setState("200");
+		rm.setMsgInfo("操作成功!");
+		return rm;
+	}
+
+	/**
+	 * 调用铁前MES新增出厂证接口
+	 * @param passportInfo
+	 * @return
+	 */
+	public ResultModel insertPassport(PassportInfo passportInfo, int current, int limit) {
+		ResultModel rm = new ResultModel();
+		try {
+			// 以前的
+//			String url = "http://172.16.0.18/ZyTg/services/Passport/sv";
+			// 现在的,待测试 20230506 刘侣
+			String url = "http://172.16.0.169:82/ZyTg/services/Passport/sv";
+			Gson gson = new Gson();
+			String str = gson.toJson(passportInfo);
+			System.out.println("参数:" + str);
+			RestfulHttpClient.HttpResponse response = getClient(url)
+					.post()
+					.addHeader("Content-Type", "application/json; charset=utf-8")
+					.body(str)
+					.request();
+			if (response.getCode() == 200) {
+				String result = response.getContent();
+				System.out.println("result: " + result + ", " + passportInfo.getForecast());
+				
+//				System.out.println("最终result: " + result);
+				
+				JSONObject jo = JSONObject.fromObject(result);
+				if (StringUtils.isNotEmpty(jo.getString("status")) && "TRUE" .equals(jo.getString("status").toUpperCase())) {
+					rm.setState("200");
+					rm.setMsgInfo("新增出厂证成功!");
+				} else {
+					if (jo.toString().contains("发货单已经存在")) {
+						rm.setState("200");
+						rm.setMsgInfo("发货单已经存在");
+					}else {					
+						rm.setState("500");
+						rm.setMsgInfo("新增出厂证失败!");
+						rm.setErrorInfo(jo.getString("errMsg") + "aa");
+					}
+				}
+			} else {
+				rm.setState("500");
+				rm.setMsgInfo("新增出厂证失败!");
+				rm.setErrorInfo(response.getContent() + "bb");
+			}
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("新增出厂证失败!");
+			rm.setErrorInfo(e.getMessage() + "cc");
+		}
+		return rm;
+	}
+
+	/**
+	 * 调用铁前MES作废出厂证接口
+	 * @param forecastNo 发运号
+	 * @param reason 原因
+	 * @param username 操作人
+	 * @return
+	 */
+	public ResultModel cancelPassport(String forecastNo,String reason,String username){
+		ResultModel rm = new ResultModel();
+		try {
+			String url = "http://172.16.0.169:82/ZyTg/services/Passport/sv";
+			String params = "{\n" +
+					"    \"Forecast\": \""+forecastNo+"\"," +
+					"    \"Reason\": \""+reason+"\",\n" +
+					"    \"Recoder\": \""+username+"\"\n" +
+					"}";
+			RestfulHttpClient.HttpResponse response = getClient(url)
+					.put()
+					.addHeader("Content-Type", "application/json; charset=utf-8")
+					.body(params)
+					.request();
+			if (response.getCode() == 200) {
+				String result = response.getContent();
+				System.out.println("result: " + result);
+				JSONObject jo = JSONObject.fromObject(result);
+				if (StringUtils.isNotEmpty(jo.getString("status")) && "TRUE".equals(jo.getString("status").toUpperCase())) {
+					rm.setState("200");
+					rm.setMsgInfo("作废出厂证成功!");
+				} else {
+					rm.setState("500");
+					rm.setMsgInfo(result);
+					rm.setErrorInfo(jo.getString("errMsg"));
+				}
+			} else {
+				rm.setState("500");
+				rm.setMsgInfo("作废出厂证失败!");
+				rm.setErrorInfo(response.getContent());
+			}
+		}catch (Exception e){
+			rm.setState("500");
+			rm.setMsgInfo("作废出厂证失败!");
+			rm.setErrorInfo(e.getMessage());
+		}
+		return rm;
+	}
+
+	/**
+	 * 以发运号查询铁前MES出厂信息
+	 * @param listForecastNo 发运号数组
+	 * @return
+	 */
+	public ResultModel queryPassportInfo(List<String> listForecastNo){
+		ResultModel rm = new ResultModel();
+		try {
+			String url = "http://172.16.0.169:82/ZyTg/services/Passport/sv?forecastList=";
+			String params = "";
+			for(String forecastNo:listForecastNo){
+				params+=forecastNo+"','";
+			}
+			if (StringUtils.isNotBlank(params) && params.length() > 3){
+				params = params.substring(0,params.length()-3);
+			}
+			url += "'"+params+"'";
+			RestfulHttpClient.HttpResponse response = getClient(url)
+					.get()
+					.addHeader("Content-Type", "application/json; charset=utf-8")
+					//.addQueryParam("forecastList",params)
+					.request();
+			if (response.getCode() == 200) {
+				String result = response.getContent();
+				rm.setData(JSONArray.fromObject(result));
+				rm.setState("200");
+				rm.setMsgInfo("查询成功!");
+			} else {
+				rm.setState("500");
+				rm.setMsgInfo("查询失败!");
+				rm.setErrorInfo(response.getContent());
+			}
+		}catch (Exception e){
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!");
+			rm.setErrorInfo(e.getMessage());
+		}
+		return rm;
+	}
+	
+	public ResultModel queryPassportWeight(List<String> carnoList){
+		ResultModel rm = new ResultModel();
+		try {
+			String url = "http://172.16.0.169:82/ZyTg/services/Passport/weight?plateList=";
+			String params = "";
+			for(String carno:carnoList){
+				params+=carno+"','";
+			}
+			if (StringUtils.isNotBlank(params) && params.length() > 3){
+				params = params.substring(0,params.length()-3);
+			}
+			url += "'"+params+"'";
+			RestfulHttpClient.HttpResponse response = getClient(url)
+					.get()
+					.addHeader("Content-Type", "application/json; charset=utf-8")
+					//.addQueryParam("forecastList",params)
+					.request();
+			if (response.getCode() == 200) {
+				String result = response.getContent();
+				rm.setData(JSONArray.fromObject(result));
+				rm.setState("200");
+				rm.setMsgInfo("查询成功!");
+			} else {
+				rm.setState("500");
+				rm.setMsgInfo("查询失败!");
+				rm.setErrorInfo(response.getContent());
+			}
+		}catch (Exception e){
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!");
+			rm.setErrorInfo(e.getMessage());
+		}
+		return rm;
+	}
+	
+}
+

+ 510 - 0
src/main/java/market/Api/Lms/impl/LmsMesApiServiceImpl.java

@@ -0,0 +1,510 @@
+/***文档注释***********************************************
+ * 作者               :                  
+ * 创建日期      :                   2019.02.24
+ * 描述               :                   物流和质量模块调用的公共接口
+ * 注意事项      :                    无
+ * 遗留BUG :                     无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+ ***********************************************************/
+
+package market.Api.Lms.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import market.Api.Lms.service.LmsMesApiService;
+import market.Com.mapper.ComBaseMachineMapper;
+import market.Com.vo.ComBaseMachine;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Mes.Lengthwise.Plan.mapper.PlnMatReplaceLogMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnMatReplaceLog;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.Pickle.Performance.mapper.MesPlmMMapper;
+import market.Mes.Pickle.Performance.vo.MesPlmD;
+import market.Mes.Pickle.Performance.vo.MesPlmM;
+import market.Mes.Rolling.Performance.mapper.MesRcmMMapper;
+import market.Mes.Rolling.Performance.vo.MesRcmD;
+import market.Mes.Rolling.Performance.vo.MesRcmM;
+import market.Slm.OrderManagement.mapper.SlmOrderInfoMapper;
+import market.Slm.OrderManagement.vo.SlmOrderInfo;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path="LmsMesApiService")
+public class LmsMesApiServiceImpl extends BaseServiceImpl<Object,Object> implements LmsMesApiService {
+	
+	/**
+	 * 轧机新增库存数据
+	 * @param cp
+	 * @return
+	 * @throws Exception
+	 */
+	public ResultModel doInsertMesRcm(CommonPage<MesRcmD> cp) throws Exception {
+		ResultModel rm=new ResultModel();
+
+		MesRcmD mtd = cp.getObject(); 
+		MesRcmM mtm=new MesRcmM();//轧机生产主实绩
+		mtm.setProcess_no(mtd.getProcess_no());
+		List<MesRcmM> list_mtm = this.getMapper(MesRcmMMapper.class).find(mtm, 0, 0);
+		if(list_mtm==null || list_mtm.size()<=0){
+			rm.setState("500");
+			rm.setMsgInfo("不存在生产主实绩,请重新进行上料操作!");
+			return rm;
+		}
+		mtm=list_mtm.get(0);
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		
+		try { 
+			if (mtd==null || mtd.getCoil_no()==null || "".equals(mtd.getCoil_no())) {
+				rm.setState("500");
+				rm.setMsgInfo("请传入卷号!");
+				return rm;
+			}
+			//1.判断是否已经存在库存信息
+			YdmProductDetail YPD = new YdmProductDetail();
+			if ("0".equals(cp.getMemo5())) {//吊销卷号
+				YPD.setCoilno(mtm.getRejected_coil_no());
+			}
+			YPD.setCoilno(mtd.getCoil_no());
+			int count = this.getMapper(YdmProductDetailMapper.class).count(YPD);
+			if (count > 0) {
+				rm.setState("500");
+				rm.setMsgInfo("卷号["+YPD.getCoilno()+"]已存在库存数据!");
+				return rm;
+			}
+			
+			YdmProductDetail ypd = new YdmProductDetail();
+			//ypd.setCoilno(mtm.getCoil_no());
+			//ypd.setCoiltype("?");//卷类别(0原料卷、1中间卷、2成品卷)
+			//原料卷类型(1酸洗卷、2酸轧卷、3连退卷、4重卷卷、0其它卷)					
+			List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno ='"+mtm.getMaterial_no()+"'", null, 0, 0);
+			if(list!=null && list.size()>0){
+				ypd.setMaterailtype(list.get(0).getMaterailtype());
+				ypd.setHeatno(list.get(0).getHeatno());//将原料卷的炉号带入分条退火信息
+			}
+			ypd.setSource("0");//原料卷来源(0新钢、1其它)
+			
+			if (mtm.getMachine_code()!=null && !"".equals(mtm.getMachine_code())) {
+				ypd.setMachine_code(mtm.getMachine_code());//机台号代码
+				ComBaseMachine machine = this.getMapper(ComBaseMachineMapper.class).findById(mtm.getMachine_code());
+				if (machine!=null) {
+					ypd.setMachine_name(machine.getMachine_name());//机台号名称
+				}
+			}
+			ypd.setMaterailcoilno(mtm.getMaterial_no_src());//原始卷号
+			ypd.setObject_no_vt(mtd.getCoil_no_vt());						
+			
+			
+			
+			if ("0".equals(cp.getMemo5())) {
+				//吊销卷号
+				ypd.setCoilno(mtm.getRejected_coil_no());//吊销卷号
+				ypd.setTheoryweight(mtm.getRejected_coil_thr_wgt());//吊销卷理重
+				ypd.setFactweight(mtm.getRejected_coil_act_wgt());//吊销卷实重
+				ypd.setLength(mtm.getRejected_coil_len());//吊销卷长度
+				ypd.setDiameter_out(mtm.getRejected_coil_out_dia());//吊销卷外径
+			}else{
+				//产出卷号
+				ypd.setCoilno(mtd.getCoil_no());
+				ypd.setThick(mtd.getAct_thk());
+				ypd.setWidth(mtd.getAct_wdt());
+				ypd.setLength(mtd.getAct_len());
+				//20191018:包括目标宽度,目标厚度到库存表
+				ypd.setLz_thick(mtd.getAim_thk());//合同厚度(目标厚度)
+				ypd.setLz_width(mtd.getAim_wdt());//合同宽度(目标宽度)
+				ypd.setDiameter_inn(mtd.getAct_inn_dia());
+				ypd.setDiameter_out(mtd.getAct_out_dia());
+				ypd.setTheoryweight(mtd.getCoil_thr_wgt());
+				ypd.setFactweight(mtd.getCoil_act_wgt());
+				ypd.setProdorderno(mtd.getProd_order_no());
+				ypd.setOrderno(mtd.getOrder_no());
+				ypd.setInspection_lot(mtd.getInspection_lot());
+				if(mtd.getProd_order_no()!=null && !"".equals(mtd.getProd_order_no())){
+					//生产订单信息
+					PlnProdorder pp=new PlnProdorder();
+					pp.setProd_order_no(mtd.getProd_order_no());
+					List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+					if(lpp!=null&&lpp.size()>0){
+						pp = lpp.get(0);
+						ypd.setCustomer_no(pp.getCustomer_no());
+						ypd.setCustomer_nm(pp.getCustomer_name());
+						ypd.setPsc(pp.getPsc());
+						ypd.setDelivery_state_code(pp.getDelivery_state_code());//交货状态
+						ypd.setDelivery_state_desc(pp.getDelivery_state_desc());
+						ypd.setProd_code(pp.getProd_code());
+						ypd.setProd_name(pp.getProd_name());
+						ypd.setStd_code(pp.getStd_code());
+						ypd.setStd_name(pp.getStd_name());
+						ypd.setUse_code(pp.getUse_code());
+						ypd.setUse_name(pp.getUser_name());
+						ypd.setPlan_code(pp.getPline_code());
+						ypd.setPline_name(pp.getPline_name());
+						ypd.setSteelcode(pp.getSteel_code());
+						ypd.setReceiv_no(pp.getReciver_unit_no());
+						ypd.setReceiv_nm(pp.getReciver_unit_name()); 
+					}
+				}
+			}
+			
+			ypd.setCreater(username);
+			ypd.setCreatedate(new Date()); 
+			
+			ypd.setSteelcode(mtd.getSteel_code());
+			
+			// 改为获取投料卷信息里的判定牌号:20240722刘侣 改回来不动 20240815
+			ypd.setJudgesteelcode(mtd.getSteel_code());	
+//			ypd.setJudgesteelcode(list.get(0).getJudgesteelcode());	
+			
+			//20200807 :易XP XG130QR(1173) 经过轧机 自动转换成 XG130Q(1204)
+			if ("1173".equals(mtd.getSteel_code())) {
+				ypd.setSteelcode("1204");
+				ypd.setJudgesteelcode("1204");
+			}
+			ypd.setProduceorder(mtd.getWrk_ord());//作业班次 --》生产班次
+			ypd.setProduceteam(mtd.getWrk_grp());//作业班组 --》生产班组
+			if (mtd.getWrk_date()!=null && !"".equals(mtd.getWrk_date())) {
+				ypd.setProducedate(new Date());		
+			}
+			//ypd.setProducedate(mtd.getCreate_time());					
+			ypd.setState("-1"); 
+			ypd.setStorageattr(cp.getMemo1());//仓库编码
+			ypd.setCoiltype("500203".equals(ypd.getStorageattr())?"2":"1");
+			ypd.setManagementno(cp.getMemo2());//部门
+			
+			ypd.setQuantity(1);
+			ypd.setBatchno(mtm.getSchedule_no());
+			ypd.setObject_no_xg("");
+			ypd.setInteam((String)this.getSession().getAttribute(HomeService.SESSION_WORK_GRP));
+			ypd.setInorder((String)this.getSession().getAttribute(HomeService.SESSION_WORK_ORD));
+			
+			if (mtd.getCoil_no().length() >= 8) { 
+				//String coco = mtd.getCoil_no().substring(0,8);
+				YdmProductDetail yyd=new YdmProductDetail();
+				yyd = this.getMapper(YdmProductDetailMapper.class).doFind(mtm.getMaterial_no(), null);
+				if(yyd!=null){
+					if(yyd.getMaterailcoilno()!=null&&!"".equals(yyd.getMaterailcoilno())){
+						ypd.setMaterailcoilno(yyd.getMaterailcoilno());//原料卷号
+					}
+					if(yyd.getObject_attr()!=null&&!"".equals(yyd.getObject_attr())){
+						ypd.setObject_attr(yyd.getObject_attr());//物料属性
+					}
+					//物料属性
+					if(cp.getMemo3()!=null && !"".equals(cp.getMemo3())){
+						ypd.setObject_attr(cp.getMemo3());
+						ypd.setIsbl("1");
+					}
+					
+					if(yyd.getLzorderno()!=null&&!"".equals(yyd.getLzorderno())){
+						ypd.setLzorderno(yyd.getLzorderno());//冷轧销售订单号
+					}
+				} 
+			}
+			//20190801 边丝和头尾卷默认综判判废//20191025 进废副品库
+			String lastChar = ypd.getCoilno().substring(ypd.getCoilno().length()-1);
+			if ("B".equals(lastChar) || "H".equals(lastChar)) {
+				ypd.setJudgeresult("40740804");
+				//20200317 净重的头尾卷及边丝入废钢库  毛重进成品库 黄涛提出
+				String condition = "contract_no||contract_line_seq||order_seq = '"+ypd.getOrderno()+"' and nvl(change_flag,'0')<>'1'";
+				List<SlmOrderInfo> soiList = this.getMapper(SlmOrderInfoMapper.class).findWithCondition(null, condition, null, 0, 0);
+				if (soiList!=null && soiList.size()>0) {
+					String weight_type_no = soiList.get(0).getWeight_type_no();
+					if ("102301".equals(weight_type_no)) {//净重
+						
+						// 净重的头尾卷和边丝脱单后需要手动插入脱单信息:20230725刘侣
+						// 前提是这个卷没有做过脱单插入:
+						
+						String conditiontd = " and OBJECT_NO = '"+ypd.getCoilno()+"' and OPT_TYPE = '0'";
+						List<PlnMatReplaceLog> pmrList = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, conditiontd, null, 0, 0);
+						if (pmrList.size() == 0) {
+							List<PlnMatReplaceLog> lmmrl = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, "",
+									" serial_no desc ", 0, 1);
+							long iNo = 1;
+							if (lmmrl != null && lmmrl.size() > 0) {
+								iNo = lmmrl.get(0).getSerial_no() + 1;
+							}
+							PlnMatReplaceLog mmrl = new PlnMatReplaceLog();
+							mmrl.setSerial_no(iNo++);
+							mmrl.setObject_no(ypd.getCoilno());
+							mmrl.setOpt_type("0");
+							mmrl.setStatus("0");
+							mmrl.setOrder_no(ypd.getOrderno());
+							
+							mmrl.setCreate_man_name(username);
+							mmrl.setCreate_time(new Date());
+							mmrl.setMemo("净重头尾边丝卷补脱单信息");
+							this.getMapper(PlnMatReplaceLogMapper.class).insert(mmrl);
+						}
+						
+						// end
+						
+						
+						ypd.setStorageattr("500210");
+						ypd.setOrderno("");
+						ypd.setProdorderno("");
+						ypd.setObject_no_vt("");
+					}else if ("102302".equals(weight_type_no)) {//毛重
+						ypd.setStorageattr("500203");
+						// 毛重头尾边丝默认合格:20231024刘侣
+						ypd.setJudgeresult("40740801");
+					}
+				}
+			} else {
+				// 非边丝非头尾:如果memo7为1,那么需要二次切头尾 20220802 treals
+				// 只有大卷才需要二次切头尾:
+//				if ("1".equals(cp.getMemo7())) {
+//					ypd.setYsstate("1");
+//				}
+				// end
+			}
+			//包装状态(20191016)
+			ypd.setIs_package("0");
+			this.getMapper(YdmProductDetailMapper.class).insert(ypd);
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("新增库存数据失败!");
+			return rm;
+		}
+		rm.setState("200");
+		return rm; 
+	}
+		
+	/**
+	 *  酸洗交工新增库存数据
+	 * @param cp
+	 * @return
+	 * @throws Exception
+	 */
+	public ResultModel doInsertMesPlm(CommonPage<MesPlmD> cp) throws Exception {
+		ResultModel rm=new ResultModel();
+
+		MesPlmD mpd = cp.getObject(); 
+		MesPlmM mpm=new MesPlmM();//酸洗生产主实绩
+		mpm.setProcess_no(mpd.getProcess_no());
+		List<MesPlmM> list_mpm = this.getMapper(MesPlmMMapper.class).find(mpm, 0, 0);
+		if(list_mpm==null || list_mpm.size()<=0){
+			rm.setState("500");
+			rm.setMsgInfo("不存在酸洗生产主实绩,请重新进行上料操作!");
+			return rm;
+		}
+		mpm=list_mpm.get(0);
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		try { 
+			if (mpd==null || mpd.getCoil_no()==null || "".equals(mpd.getCoil_no())) {
+				rm.setState("500");
+				rm.setMsgInfo("请传入卷号!");
+				return rm;
+			}
+			//1.判断是否已经存在库存信息
+			YdmProductDetail YPD = new YdmProductDetail();
+			if ("0".equals(cp.getMemo5())) {//吊销卷号
+				YPD.setCoilno(mpm.getRejected_coil_no());
+			}
+			YPD.setCoilno(mpd.getCoil_no());
+			int count = this.getMapper(YdmProductDetailMapper.class).count(YPD);
+			if (count > 0) {
+				rm.setState("500");
+				rm.setMsgInfo("卷号["+YPD.getCoilno()+"]已存在库存数据!");
+				return rm;
+			}
+			
+			YdmProductDetail ypd = new YdmProductDetail();
+			//ypd.setCoilno(mpm.getCoil_no());
+			//ypd.setCoiltype("?");//卷类别(0原料卷、1中间卷、2成品卷)
+			//原料卷类型(1酸洗卷、2酸轧卷、3连退卷、4重卷卷、0其它卷)					
+			List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno ='"+mpm.getMaterial_no()+"'", null, 0, 0);
+			if(list!=null && list.size()>0){
+				ypd.setMaterailtype(list.get(0).getMaterailtype());
+				ypd.setHeatno(list.get(0).getHeatno());//将原料卷的炉号带入分条退火信息
+			}
+			ypd.setSource("0");//原料卷来源(0新钢、1其它)
+			
+			if (mpm.getMachine_code()!=null && !"".equals(mpm.getMachine_code())) {
+				ypd.setMachine_code(mpm.getMachine_code());//机台号代码
+				ComBaseMachine machine = this.getMapper(ComBaseMachineMapper.class).findById(mpm.getMachine_code());
+				if (machine!=null) {
+					ypd.setMachine_name(machine.getMachine_name());//机台号名称
+				}
+			}
+			ypd.setMaterailcoilno(mpm.getMaterial_no_src());//原始卷号
+			ypd.setObject_no_vt(mpd.getCoil_no_vt());						
+			
+			
+			
+			if ("0".equals(cp.getMemo5())) {
+				//吊销卷号
+				ypd.setCoilno(mpm.getRejected_coil_no());//吊销卷号
+				ypd.setTheoryweight(mpm.getRejected_coil_thr_wgt());//吊销卷理重
+				ypd.setFactweight(mpm.getRejected_coil_act_wgt());//吊销卷实重
+				ypd.setLength(mpm.getRejected_coil_len());//吊销卷长度
+				ypd.setDiameter_out(mpm.getRejected_coil_out_dia());//吊销卷外径
+			}else{
+				//产出卷号
+				ypd.setCoilno(mpd.getCoil_no());
+				ypd.setThick(mpd.getAct_thk());
+				ypd.setWidth(mpd.getAct_wdt());
+				ypd.setLength(mpd.getAct_len());
+				//20191018:包括目标宽度,目标厚度到库存表
+				ypd.setLz_thick(mpd.getAim_thk());//合同厚度(目标厚度)
+				ypd.setLz_width(mpd.getAim_wdt());//合同宽度(目标宽度)
+				ypd.setDiameter_inn(mpd.getAct_inn_dia());
+				ypd.setDiameter_out(mpd.getAct_out_dia());
+				//理论重量取实重2020-1-11
+				ypd.setTheoryweight(mpd.getCoil_act_wgt()); 
+				ypd.setFactweight(mpd.getCoil_act_wgt());
+				ypd.setProdorderno(mpd.getProd_order_no());
+				ypd.setOrderno(mpd.getOrder_no());
+				ypd.setInspection_lot(mpd.getInspection_lot());
+				if(mpd.getProd_order_no()!=null && !"".equals(mpd.getProd_order_no())){
+					//生产订单信息
+					PlnProdorder pp=new PlnProdorder();
+					pp.setProd_order_no(mpd.getProd_order_no());
+					List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+					if(lpp!=null&&lpp.size()>0){
+						pp = lpp.get(0);
+						ypd.setCustomer_no(pp.getCustomer_no());
+						ypd.setCustomer_nm(pp.getCustomer_name());
+						ypd.setPsc(pp.getPsc());
+						ypd.setDelivery_state_code(pp.getDelivery_state_code());//交货状态
+						ypd.setDelivery_state_desc(pp.getDelivery_state_desc());
+						ypd.setProd_code(pp.getProd_code());
+						ypd.setProd_name(pp.getProd_name());
+						ypd.setStd_code(pp.getStd_code());
+						ypd.setStd_name(pp.getStd_name());
+						ypd.setUse_code(pp.getUse_code());
+						ypd.setUse_name(pp.getUser_name());
+						ypd.setPlan_code(pp.getPline_code());
+						ypd.setPline_name(pp.getPline_name());
+						ypd.setSteelcode(pp.getSteel_code());
+						ypd.setReceiv_no(pp.getReciver_unit_no());
+						ypd.setReceiv_nm(pp.getReciver_unit_name()); 
+					}
+				}
+			}
+			
+			ypd.setCreater(username);
+			ypd.setCreatedate(new Date()); 
+			
+			ypd.setSteelcode(mpd.getSteel_code());
+			
+			// 改为获取投料卷信息里的判定牌号:20240722刘侣 改回来不动 20240815
+			ypd.setJudgesteelcode(mpd.getSteel_code());	
+//			ypd.setJudgesteelcode(list.get(0).getJudgesteelcode());	
+			
+			//20200807 :易XP XG130Q(1204)经过酸洗 自动转换成 XG130QR(1173)
+			if ("1204".equals(mpd.getSteel_code())) {
+				ypd.setSteelcode("1173");
+				ypd.setJudgesteelcode("1173");
+			}
+			ypd.setProduceorder(mpd.getWrk_ord());//作业班次 --》生产班次
+			ypd.setProduceteam(mpd.getWrk_grp());//作业班组 --》生产班组
+			//if (mpd.getWrk_date()!=null && !"".equals(mpd.getWrk_date())) {
+				//ypd.setProducedate(new SimpleDateFormat("yyyy-MM-dd").parse(mpd.getWrk_date()));
+			//}
+			ypd.setProducedate(new Date());
+			ypd.setState("-1"); 
+			ypd.setStorageattr(cp.getMemo1());//仓库编码
+			ypd.setCoiltype("500203".equals(ypd.getStorageattr())?"2":"1");
+			ypd.setManagementno(cp.getMemo2());//部门
+			
+			ypd.setQuantity(1);
+			ypd.setBatchno(mpm.getSchedule_no());
+			ypd.setObject_no_xg("");
+			ypd.setInteam((String)this.getSession().getAttribute(HomeService.SESSION_WORK_GRP));
+			ypd.setInorder((String)this.getSession().getAttribute(HomeService.SESSION_WORK_ORD));
+			
+			if (mpd.getCoil_no().length() >= 8) { 
+				//String coco = mpd.getCoil_no().substring(0,8);
+				YdmProductDetail yyd=new YdmProductDetail();
+				yyd = this.getMapper(YdmProductDetailMapper.class).doFind(mpm.getMaterial_no(), null);
+				if(yyd!=null){
+					if(yyd.getMaterailcoilno()!=null&&!"".equals(yyd.getMaterailcoilno())){
+						ypd.setMaterailcoilno(yyd.getMaterailcoilno());//原料卷号
+					}
+					if(yyd.getObject_attr()!=null&&!"".equals(yyd.getObject_attr())){
+						ypd.setObject_attr(yyd.getObject_attr());//物料属性
+					}
+					//物料属性
+					if(cp.getMemo3()!=null && !"".equals(cp.getMemo3())){
+						ypd.setObject_attr(cp.getMemo3());
+						ypd.setIsbl("1");
+					}
+					
+					if(yyd.getLzorderno()!=null&&!"".equals(yyd.getLzorderno())){
+						ypd.setLzorderno(yyd.getLzorderno());//冷轧销售订单号
+					}
+				} 
+			}
+			//20190801 边丝和头尾卷默认综判判废//20191025 进废副品库
+			String lastChar = ypd.getCoilno().substring(ypd.getCoilno().length()-1);
+			if ("B".equals(lastChar) || "H".equals(lastChar)) {
+				ypd.setJudgeresult("40740804");
+				//ypd.setStorageattr("500210");
+				//20200317 净重的头尾卷及边丝入废钢库  毛重进成品库 黄涛提出
+				String condition = "contract_no||contract_line_seq||order_seq = '"+ypd.getOrderno()+"' and nvl(change_flag,'0')<>'1'";
+				List<SlmOrderInfo> soiList = this.getMapper(SlmOrderInfoMapper.class).findWithCondition(null, condition, null, 0, 0);
+				if (soiList!=null && soiList.size()>0) {
+					String weight_type_no = soiList.get(0).getWeight_type_no();
+					if ("102301".equals(weight_type_no)) {//净重
+						
+						// 净重的头尾卷和边丝脱单后需要手动插入脱单信息:20230725刘侣
+						// 前提是这个卷没有做过脱单插入:
+						
+						String conditiontd = " and OBJECT_NO = '"+ypd.getCoilno()+"' and OPT_TYPE = '0'";
+						List<PlnMatReplaceLog> pmrList = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, conditiontd, null, 0, 0);
+						if (pmrList.size() == 0) {
+							List<PlnMatReplaceLog> lmmrl = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, "",
+									" serial_no desc ", 0, 1);
+							long iNo = 1;
+							if (lmmrl != null && lmmrl.size() > 0) {
+								iNo = lmmrl.get(0).getSerial_no() + 1;
+							}
+							PlnMatReplaceLog mmrl = new PlnMatReplaceLog();
+							mmrl.setSerial_no(iNo++);
+							mmrl.setObject_no(ypd.getCoilno());
+							mmrl.setOpt_type("0");
+							mmrl.setStatus("0");
+							mmrl.setOrder_no(ypd.getOrderno());
+							
+							mmrl.setCreate_man_name(username);
+							mmrl.setCreate_time(new Date());
+							mmrl.setMemo("净重头尾边丝卷补脱单信息");
+							this.getMapper(PlnMatReplaceLogMapper.class).insert(mmrl);
+						}
+						
+						// end
+						
+						
+						ypd.setStorageattr("500210");
+						ypd.setOrderno("");
+						ypd.setProdorderno("");
+						ypd.setObject_no_vt("");
+					}else if ("102302".equals(weight_type_no)) {//毛重
+						ypd.setStorageattr("500203");
+						// 毛重头尾边丝默认合格:20231024刘侣
+						ypd.setJudgeresult("40740801");
+					}
+				}
+			}
+			//包装状态(20191016)
+			ypd.setIs_package("0");
+			this.getMapper(YdmProductDetailMapper.class).insert(ypd);
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("新增库存数据失败!");
+			return rm;
+		}
+		rm.setState("200");
+		return rm; 
+	}
+	
+}
+

+ 293 - 0
src/main/java/market/Api/Lms/impl/LmsQmsApiServiceImpl.java

@@ -0,0 +1,293 @@
+/***文档注释***********************************************
+ * 作者               :                  
+ * 创建日期      :                   2019.02.24
+ * 描述               :                   物流和质量模块调用的公共接口
+ * 注意事项      :                    无
+ * 遗留BUG :                     无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+ ***********************************************************/
+
+package market.Api.Lms.impl;
+
+import java.util.HashMap;
+import java.util.List;
+
+import market.Api.Lms.service.LmsQmsApiService;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+
+@RemoteService(path="LmsQmsApiService")
+public class LmsQmsApiServiceImpl extends BaseServiceImpl<Object,Object> implements LmsQmsApiService {
+	
+	/**
+	 * 
+	 * @author 赵淋支
+	 * @date   2019年2月24日
+	 * @parameter memo1:销售订单号orderno  检验号inspection_lot
+	 * @return 200 ✔  500✘
+	 * @description 判定销售合同号和检验号的综合判定结果是否都存在
+	 */
+	public ResultModel doJudgeIsPhysresult(CommonPage<YdmProductDetail> cp) throws Exception {
+		ResultModel rm = new ResultModel();
+		String orderno = cp.getMemo1();//销售合同号
+		String inspection_lot = cp.getMemo2();//检验号
+		try {
+			YdmProductDetail ypd = new YdmProductDetail();
+			ypd.setOrderno(orderno);
+			ypd.setState("0");
+			ypd.setInspection_lot(inspection_lot);
+			List<YdmProductDetail> ypdList = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+			if (ypdList!=null && ypdList.size()>0) {
+				boolean b = false;
+				for (YdmProductDetail ypD : ypdList) {
+					if (ypD.getPhysresult()!=null || !"".equals(ypD.getPhysresult())) {
+						b=true;//如果有综合判定结果不为空,则跳出循环
+						continue;
+					}
+				}
+				if (!b) {//b=true
+					rm.setState("500");
+					rm.setMsgInfo("销售订单号【"+orderno+"】对应的库存信息已经存在综合判定结果");
+					return rm;
+				}
+			}else {
+				rm.setState("500");
+				rm.setMsgInfo("未找到销售订单号【"+orderno+"】对应的在库库存信息");
+				return rm;
+			}
+		} catch (Exception e) {
+			throw new Exception("判断销售订单号的综合判定结果失败");
+		}
+		rm.setState("200");
+		rm.setMsgInfo("销售订单号【"+orderno+"】都有对应的综合判定结果");
+		return rm;
+	}
+	
+
+	/**
+	 * 根据卷号更新库存表 的 材质判定结果和材质判定结果id(PHYSRESULT)
+	 * @param coilno 卷号
+	 * @param result 材质判定结果
+	 * @param resultId 材质判定结果id
+	 * @return
+	 */
+	public ResultModel updatePhysResultByCoilno(String coilno,String result,String resultId){
+		ResultModel rm = new ResultModel();
+		if (coilno==null || "".equals(coilno)) {
+			rm.setData("500");
+			rm.setMsgInfo("卷号不能为空!");
+		}
+		if (result==null || "".equals(result)) {
+			rm.setData("500");
+			rm.setMsgInfo("材质检验结果不能为空!");
+		}	
+		if (resultId==null || "".equals(resultId)) {
+			rm.setData("500");
+			rm.setMsgInfo("材质判定结果ID不能为空!");
+		}
+		this.getMapper(YdmProductDetailMapper.class).updatePhysResultByCoilno(coilno,result,resultId);
+		rm.setMsgInfo("更新材质判定结果成功");
+		rm.setState("200");
+		return rm;		
+	}
+	
+	
+	
+	/**
+	 * 根据卷号更新库存表 的 探伤判定结果和探伤判定结果id(SPYRESULT)
+	 * @param coilno 卷号
+	 * @param result 探伤判定结果
+	 * @param resultId 探伤判定结果id
+	 * @return
+	 */
+	public ResultModel updateSpyResultByCoilno(String coilno,String result,String resultId){
+		ResultModel rm = new ResultModel();
+		if (coilno==null || "".equals(coilno)) {
+			rm.setData("500");
+			rm.setMsgInfo("卷号不能为空!");
+		}
+		if (result==null || "".equals(result)) {
+			rm.setData("500");
+			rm.setMsgInfo("探伤检验结果不能为空!");
+		}	
+		if (resultId==null || "".equals(resultId)) {
+			rm.setData("500");
+			rm.setMsgInfo("探伤判定结果ID不能为空!");
+		}
+		this.getMapper(YdmProductDetailMapper.class).updateSpyResultByCoilno(coilno,result,resultId);
+		rm.setMsgInfo("更新探伤判定结果成功");
+		rm.setState("200");
+		return rm;		
+	}
+	
+	/**
+	 * 根据卷号更新库存表 的 卡量判定结果和卡量判定结果id(MEASURE_RESULT)
+	 * @param coilno 卷号
+	 * @param result 卡量判定结果
+	 * @param resultId 卡量判定结果id
+	 * @return
+	 */
+	public ResultModel updateMeaResultByCoilno(String coilno,String result,String resultId){
+		ResultModel rm = new ResultModel();
+		if (coilno==null || "".equals(coilno)) {
+			rm.setData("500");
+			rm.setMsgInfo("卷号不能为空!");
+			return rm; 
+		}
+		if (result==null || "".equals(result)) {
+			rm.setData("500");
+			rm.setMsgInfo("卡量检验结果不能为空!");
+			return rm; 
+		}	
+		if (resultId==null || "".equals(resultId)) {
+			rm.setData("500");
+			rm.setMsgInfo("卡量判定结果ID不能为空!");
+			return rm; 
+		}
+		this.getMapper(YdmProductDetailMapper.class).updateMeaResultByCoilno(coilno,result,resultId);
+		rm.setMsgInfo("更新卡量判定结果成功");
+		rm.setState("200");
+		return rm;		
+	}
+	
+	/**
+	 * 分机台 查询投料卷下的物料的质量信息
+	 * @param cp coilno:投料卷号 machine_code:机台代码
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQuaryQmsDetailByCoilno(CommonPage<YdmProductDetail> cp){
+		ResultModel rm = new ResultModel();
+		try {
+			YdmProductDetail ypd = cp.getObject();
+			if (ypd.getCoilno()==null || "".equals(ypd.getCoilno())) {
+				rm.setState("200");
+				rm.setMsgInfo("请传入投料大卷号!");
+				return rm;
+			}
+			if (ypd.getMachine_code()==null || "".equals(ypd.getMachine_code())) {
+				rm.setState("200");
+				rm.setMsgInfo("请传入机台代码!");
+				return rm;
+			}
+			String swhere = "";
+			List<HashMap> list = null;
+			if ("M0001".equals(ypd.getMachine_code()) || 
+				"M0002".equals(ypd.getMachine_code())) {
+				//4mm分条机组 12mm分条机组
+				swhere += " and mcm.material_no = '"+ypd.getCoilno()+"'";
+				list = this.getMapper(YdmProductDetailMapper.class).doQuaryDetailZJ(swhere);
+			}else if ("M0003".equals(ypd.getMachine_code())) {
+				//3mm横剪机组
+				swhere += " and mccm.material_no = '"+ypd.getCoilno()+"'";
+				list = this.getMapper(YdmProductDetailMapper.class).doQuaryDetailHJ(swhere);
+			}else if ("M0007".equals(ypd.getMachine_code())) {
+				//平整机组
+				swhere += " and mtm.material_no = '"+ypd.getCoilno()+"'";
+				list = this.getMapper(YdmProductDetailMapper.class).doQuaryDetailPZ(swhere);
+			}else if ("M0008".equals(ypd.getMachine_code())) {
+				//轧机机组
+				swhere += " and mrm.material_no = '"+ypd.getCoilno()+"'";
+				list = this.getMapper(YdmProductDetailMapper.class).doQuaryDetailZhaJ(swhere);
+			}else if ("M0004".equals(ypd.getMachine_code()) || "M000T".equals(ypd.getMachine_code()) ||
+					  "M0005".equals(ypd.getMachine_code()) || 
+					  "M0006".equals(ypd.getMachine_code()) || 
+					  "M0009".equals(ypd.getMachine_code())) {
+				//退火炉宝信  退火炉南方D 退火炉艾伯纳  退火炉南方G
+				swhere += " and mcam.material_no = '"+ypd.getCoilno()+"'";
+				list = this.getMapper(YdmProductDetailMapper.class).doQuaryDetailTH(swhere);
+			}else if ("M0010".equals(ypd.getMachine_code())) {
+				//酸洗
+				swhere += " and mpm.material_no = '"+ypd.getCoilno()+"'";
+				list = this.getMapper(YdmProductDetailMapper.class).doQuaryDetailSX(swhere);
+			}
+			rm.setData(list);
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setMsgInfo("查询失败!");
+			rm.setState("500");
+		}
+		return rm;
+	}
+	
+	/**
+	 * 新增质量接口:根据卷号清除库存表质量信息
+	 * @param cp
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public ResultModel removeDetailQmsInfo(CommonPage<YdmProductDetail> cp) throws Exception{
+		ResultModel rm = new ResultModel();
+		List<YdmProductDetail> ypdList = cp.getObjectList();
+		if (ypdList==null || ypdList.size()<=0) {
+			throw new Exception("请传入参数");
+		}
+		for (YdmProductDetail ypd : ypdList) {
+			if (ypd.getCoilno()==null || "".equals(ypd.getCoilno())) {
+				throw new Exception("请传入卷号");
+			}			
+			this.getMapper(YdmProductDetailMapper.class).removeDetailQmsInfo(ypd.getCoilno());		
+		}		
+		rm.setMsgInfo("清空库存表的质量信息成功");
+		rm.setState("200");
+		return rm;		
+	}
+
+	/**
+	 * 查询 脱单、在库、没有被质量锁定的物料库存信息
+	 * @param cp
+	 * @return
+	 * @throws Exception
+	 */
+	public ResultModel doQuaryQmsDetailInfo(CommonPage<YdmProductDetail> cp) throws Exception{
+		ResultModel rm = new ResultModel();
+		YdmProductDetail ypd = cp.getObject();
+		try {
+			List<YdmProductDetail> list = this.getMapper(YdmProductDetailMapper.class).doQuaryQmsDetailInfo(ypd);
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception e) {
+			throw new Exception("查询失败,请联系管理员");
+		}
+		rm.setMsgInfo("查询质量信息成功");
+		rm.setState("200");
+		return rm;		
+	}
+	
+	/**
+	 * 质量模块,根据卷号修改库存状态
+	 * @param coilno
+	 * @param state
+	 */
+	public void doUpdateLmsQmsState(String coilno,String state){
+		 YdmProductDetail ypd = new YdmProductDetail();
+		 ypd.setCoilno(coilno);
+		 ypd.setState(state);
+		 this.getMapper(YdmProductDetailMapper.class).update(ypd);
+	}
+	
+	/**
+	 * 质量模块,根据卷号修改库存信息
+	 * @param coilno
+	 * @param state
+	 * @throws Exception 
+	 */
+	public void doUpdateLmsQmsInfo(YdmProductDetail ypd) throws Exception{
+		if (ypd.getCoilno()==null || "".equals(ypd.getCoilno())) {
+			throw new Exception("卷号不能为null");
+		}
+		this.getMapper(YdmProductDetailMapper.class).update(ypd);
+	}
+	
+}
+

+ 94 - 0
src/main/java/market/Api/Lms/impl/LmsSlmApiServiceImpl.java

@@ -0,0 +1,94 @@
+/***文档注释***********************************************
+ * 作者               :                  
+ * 创建日期      :                   2019.02.24
+ * 描述               :                   物流和质量模块调用的公共接口
+ * 注意事项      :                    无
+ * 遗留BUG :                     无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+ ***********************************************************/
+
+package market.Api.Lms.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+import market.Api.Lms.service.LmsSlmApiService;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+import market.Lms.Logistics.mapper.SpmDeliveryMapper;
+import market.Lms.Logistics.mapper.SpmTransportDetailMapper;
+import market.Lms.Logistics.vo.SpmDelivery;
+import market.Lms.Logistics.vo.SpmTransportDetail;
+import market.Lms.Warehouse.mapper.YdmProductOutlistMapper;
+import market.Lms.Warehouse.vo.YdmProductOutlist;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path="LmsSlmApiService")
+public class LmsSlmApiServiceImpl extends BaseServiceImpl<Object,Object> implements LmsSlmApiService {
+	
+	/**
+	 * 
+	 * @author 赵淋支
+	 * @date   2019年2月24日
+	 * @parameter [{"objectList":[{"deliveryno":"Y20190408****"}],"startTime":"装车时间,到秒"}]
+	 * @return 200 ✔  500✘
+	 * @description 修改提货单的装车时间
+	 */
+	public ResultModel doUpdateLoadTime(CommonPage<SpmDelivery> cp) throws Exception {
+		ResultModel rm = new ResultModel();
+		String username = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		List<SpmDelivery> list = cp.getObjectList();
+		String loadTime = cp.getStartTime();//装车时间
+		if (list==null || list.size() <= 0) {
+			rm.setState("500");
+			rm.setMsgInfo("传入的参数为空");
+			return rm;
+		}
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		for (SpmDelivery sp : list) {
+			if (sp.getDeliveryno()!=null && !"".equals(sp.getDeliveryno())) {
+				SpmDelivery sd = this.getMapper(SpmDeliveryMapper.class).findById(sp.getDeliveryno());
+				if (sd!=null){
+					if ("3".equals(sd.getState())||"4".equals(sd.getState())||
+							"5".equals(sd.getState())||"6".equals(sd.getState())) {						
+						SpmTransportDetail std = new SpmTransportDetail();
+						std.setBillNo(sd.getDeliveryno());
+						List<SpmTransportDetail> stdList = this.getMapper(SpmTransportDetailMapper.class).find(std, 0, 0);
+						if (stdList!=null && stdList.size() > 0) {
+							for (SpmTransportDetail STD : stdList) {
+								//1.修改装车时间
+								STD.setLoaddate(sdf.parse(loadTime));
+								STD.setLoadoperator(username);
+								this.getMapper(SpmTransportDetailMapper.class).doUpdate(STD);
+								//2.修改出库时间
+								YdmProductOutlist ypo = new YdmProductOutlist();
+								ypo.setStorageattr(STD.getStorageattr());
+								ypo.setCoilno(STD.getObjectno());
+								List<YdmProductOutlist> ypoList = this.getMapper(YdmProductOutlistMapper.class).find(ypo, 0, 0);
+								if (ypoList!=null && ypoList.size()>0) {
+									ypo = ypoList.get(0);
+									ypo.setOutdate(sdf.parse(loadTime));
+									ypo.setOutoperator(username);
+									this.getMapper(YdmProductOutlistMapper.class).update(ypo);
+								}
+								//3.修改库存历史记录数据
+								this.getMapper(YdmProductOutlistMapper.class).doDeleteYpdHistory(STD.getObjectno(),STD.getStorageattr(),loadTime);
+							}
+						}
+					}
+				}
+			}
+		}
+		rm.setState("200");
+		rm.setMsgInfo("修改装车时间成功");
+		return rm;
+	}
+		
+	
+}
+

+ 7 - 0
src/main/java/market/Api/Lms/service/LmsApiService.java

@@ -0,0 +1,7 @@
+package market.Api.Lms.service;
+
+import com.hnshituo.basic.service.BaseService;
+
+public interface LmsApiService extends BaseService {
+
+}

+ 7 - 0
src/main/java/market/Api/Lms/service/LmsMesApiService.java

@@ -0,0 +1,7 @@
+package market.Api.Lms.service;
+
+import com.hnshituo.basic.service.BaseService;
+
+public interface LmsMesApiService extends BaseService<Object,Object> {
+	//物流和车间模块的接口 20190403 zlz
+}

+ 7 - 0
src/main/java/market/Api/Lms/service/LmsQmsApiService.java

@@ -0,0 +1,7 @@
+package market.Api.Lms.service;
+
+import com.hnshituo.basic.service.BaseService;
+
+public interface LmsQmsApiService extends BaseService<Object,Object> {
+	//物流和质量模块的接口 20190224 赵淋支
+}

+ 7 - 0
src/main/java/market/Api/Lms/service/LmsSlmApiService.java

@@ -0,0 +1,7 @@
+package market.Api.Lms.service;
+
+import com.hnshituo.basic.service.BaseService;
+
+public interface LmsSlmApiService extends BaseService<Object,Object> {
+	//物流和销售模块的接口 20190408 zlz
+}

+ 44 - 0
src/main/java/market/Api/Mes/impl/DateJsonValueProcessor.java

@@ -0,0 +1,44 @@
+package market.Api.Mes.impl;
+
+import java.text.SimpleDateFormat;
+
+import net.sf.json.JsonConfig;
+import net.sf.json.processors.JsonValueProcessor;
+
+/**
+ * json-lib 日期处理类
+ * @author syh
+ *
+ */
+public class DateJsonValueProcessor implements JsonValueProcessor{
+
+	private String format;  
+	
+    public DateJsonValueProcessor(String format){  
+        this.format = format;  
+    }  
+    
+	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
+		return null;
+	}
+
+	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
+		if(value == null)  
+        {  
+            return "";  
+        }  
+        if(value instanceof java.sql.Timestamp)  
+        {  
+            String str = new SimpleDateFormat(format).format((java.sql.Timestamp)value);  
+            return str;  
+        }  
+        if (value instanceof java.util.Date)  
+        {  
+            String str = new SimpleDateFormat(format).format((java.util.Date) value);  
+            return str;  
+        }  
+          
+        return value.toString(); 
+	}
+
+}

+ 81 - 0
src/main/java/market/Api/Mes/impl/DesignInfo.java

@@ -0,0 +1,81 @@
+package market.Api.Mes.impl;
+
+import java.util.ArrayList;
+
+public class DesignInfo {
+	
+	/**
+	 * 虚拟物料号
+	 */
+	private String object_no_vt;
+	
+	public String getObject_no_vt() {
+		return object_no_vt;
+	}
+
+	public void setObject_no_vt(String object_no_vt) {
+		this.object_no_vt = object_no_vt;
+	}
+	
+	/**
+	 * 物料号
+	 */
+	private String object_no;
+	public String getObject_no() {
+		return object_no;
+	}
+
+	public void setObject_no(String object_no) {
+		this.object_no = object_no;
+	}
+
+	/**
+	 * 单重
+	 */
+	private Double single_wgt;
+	public Double getSingle_wgt() {
+		return single_wgt;
+	}
+	
+	public void setSingle_wgt(Double single_wgt) {
+		this.single_wgt = single_wgt;
+	}
+	/**
+	 * 生产订单号
+	 */
+	private String prod_order_no;
+	public String getProd_order_no() {
+		return prod_order_no;
+	}
+
+	public void setProd_order_no(String prod_order_no) {
+		this.prod_order_no = prod_order_no;
+	}
+	
+	/**
+	 * 工序点集合
+	 */
+	private ArrayList<String> process;
+	public ArrayList<String> getProcess() {
+		return process;
+	}
+
+	public void setProcess(ArrayList<String> process) {
+		this.process = process;
+	}
+
+
+	
+	/**
+	 * 当前处理工序序号
+	 */
+	private int CurrentProcIndex;
+	public int getCurrentProcIndex() {
+		return CurrentProcIndex;
+	}
+
+	public void setCurrentProcIndex(int currentProcIndex) {
+		CurrentProcIndex = currentProcIndex;
+	}
+
+}

+ 24 - 0
src/main/java/market/Api/Mes/impl/DoubleJsonValueProcessor.java

@@ -0,0 +1,24 @@
+package market.Api.Mes.impl;
+
+import net.sf.json.JsonConfig;
+import net.sf.json.processors.JsonValueProcessor;
+
+public class DoubleJsonValueProcessor implements JsonValueProcessor{
+
+	@Override
+	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
+		return null;
+	}
+
+	@Override
+	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
+		//如果vlaue为null,就返回"",不为空就返回他的值,
+		if(value == null)  
+        {  
+            return "";  
+        }  
+        //return value.toString(); 
+		return value;
+	}
+
+}

+ 23 - 0
src/main/java/market/Api/Mes/impl/IntegerJsonValueProcessor.java

@@ -0,0 +1,23 @@
+package market.Api.Mes.impl;
+
+import net.sf.json.JsonConfig;
+import net.sf.json.processors.JsonValueProcessor;
+
+public class IntegerJsonValueProcessor implements JsonValueProcessor{
+
+	@Override
+	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
+		return null;
+	}
+
+	@Override
+	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
+		//如果vlaue为null,就返回"",不为空就返回他的值,
+		if(value == null)  
+        {  
+            return "";  
+        }  
+        //return value.toString(); 
+		return value;
+	}
+}

+ 470 - 0
src/main/java/market/Api/Mes/impl/Judge_Prc_Info.java

@@ -0,0 +1,470 @@
+package market.Api.Mes.impl;
+
+import java.util.List;
+
+import market.Qms.slmord.vo.SlmOrdDesignMscPlSti;
+
+public class Judge_Prc_Info {
+	
+	// 质量设计信息
+	private  List<SlmOrdDesignMscPlSti> listSti ; 
+	
+	// 产品序号
+	private String object_no;
+	
+	// 虚拟母卷号
+	private String mat_object_no_vt;
+
+	// 等级
+	private String level;
+	
+	// 工序次数
+	private int proc_repeat_index;
+
+	// 上表面检验结果
+	private String up_surface_result;
+
+	// 下表面检验结果
+	private String ud_surface_result;
+
+	// 边部检验结果
+	private String marginal_result;
+
+	// 卡量检验结果
+	private String measure_result;
+
+	// 成分判定结果
+	private String chemresult;
+
+	// 材质判定结果ID
+	private String physresult;
+
+	// 公差判定结果
+	private String sizeresult;
+
+	// 探伤判定结果ID
+	private String spyresult;
+
+	// 上表面检验结果ID
+	private String up_surface_result_id;
+
+	// 下表面检验结果ID
+	private String ud_surface_result_id;
+
+	// 边部检验结果ID
+	private String marginal_result_id;
+
+	// 卡量检验结果ID
+	private String measure_result_id;
+
+	// 成分判定结果ID
+	private String chemresult_id;
+
+	// 材质判定结果ID
+	private String physresult_id;
+
+	// 公差判定结果
+	private String sizeresult_id;
+
+	// 探伤判定结果ID
+	private String spyresult_id;
+
+	// 综合判定结果
+	private String judgeresult;
+
+	// 综合判定结果
+	private String judgeresult_id;
+
+	// 重量判定结果
+	private String weightresult;
+
+	// 产品名称
+	private String prod_code;
+
+	private String prod_name;
+
+	public String getObject_no() {
+		return object_no;
+	}
+
+	public void setObject_no(String object_no) {
+		this.object_no = object_no;
+	}
+
+	public String getLevel() {
+		return level;
+	}
+
+	public void setLevel(String level) {
+		this.level = level;
+	}
+
+	public String getUp_surface_result() {
+		return up_surface_result;
+	}
+
+	public void setUp_surface_result(String up_surface_result) {
+		this.up_surface_result = up_surface_result;
+	}
+
+	public String getUd_surface_result() {
+		return ud_surface_result;
+	}
+
+	public void setUd_surface_result(String ud_surface_result) {
+		this.ud_surface_result = ud_surface_result;
+	}
+
+	public String getMarginal_result() {
+		return marginal_result;
+	}
+
+	public void setMarginal_result(String marginal_result) {
+		this.marginal_result = marginal_result;
+	}
+
+	public String getMeasure_result() {
+		return measure_result;
+	}
+
+	public void setMeasure_result(String measure_result) {
+		this.measure_result = measure_result;
+	}
+
+	public String getChemresult() {
+		return chemresult;
+	}
+
+	public void setChemresult(String chemresult) {
+		this.chemresult = chemresult;
+	}
+
+	public String getPhysresult() {
+		return physresult;
+	}
+
+	public void setPhysresult(String physresult) {
+		this.physresult = physresult;
+	}
+
+	public String getSizeresult() {
+		return sizeresult;
+	}
+
+	public void setSizeresult(String sizeresult) {
+		this.sizeresult = sizeresult;
+	}
+
+	public String getSpyresult() {
+		return spyresult;
+	}
+
+	public void setSpyresult(String spyresult) {
+		this.spyresult = spyresult;
+	}
+
+	public String getUp_surface_result_id() {
+		return up_surface_result_id;
+	}
+
+	public void setUp_surface_result_id(String up_surface_result_id) {
+		this.up_surface_result_id = up_surface_result_id;
+	}
+
+	public String getUd_surface_result_id() {
+		return ud_surface_result_id;
+	}
+
+	public void setUd_surface_result_id(String ud_surface_result_id) {
+		this.ud_surface_result_id = ud_surface_result_id;
+	}
+
+	public String getMarginal_result_id() {
+		return marginal_result_id;
+	}
+
+	public void setMarginal_result_id(String marginal_result_id) {
+		this.marginal_result_id = marginal_result_id;
+	}
+
+	public String getMeasure_result_id() {
+		return measure_result_id;
+	}
+
+	public void setMeasure_result_id(String measure_result_id) {
+		this.measure_result_id = measure_result_id;
+	}
+
+	public String getChemresult_id() {
+		return chemresult_id;
+	}
+
+	public void setChemresult_id(String chemresult_id) {
+		this.chemresult_id = chemresult_id;
+	}
+
+	public String getPhysresult_id() {
+		return physresult_id;
+	}
+
+	public void setPhysresult_id(String physresult_id) {
+		this.physresult_id = physresult_id;
+	}
+
+	public String getSizeresult_id() {
+		return sizeresult_id;
+	}
+
+	public void setSizeresult_id(String sizeresult_id) {
+		this.sizeresult_id = sizeresult_id;
+	}
+
+	public String getSpyresult_id() {
+		return spyresult_id;
+	}
+
+	public void setSpyresult_id(String spyresult_id) {
+		this.spyresult_id = spyresult_id;
+	}
+
+	public String getJudgeresult() {
+		return judgeresult;
+	}
+
+	public void setJudgeresult(String judgeresult) {
+		this.judgeresult = judgeresult;
+	}
+
+	public String getJudgeresult_id() {
+		return judgeresult_id;
+	}
+
+	public void setJudgeresult_id(String judgeresult_id) {
+		this.judgeresult_id = judgeresult_id;
+	}
+
+	public String getWeightresult() {
+		return weightresult;
+	}
+
+	public void setWeightresult(String weightresult) {
+		this.weightresult = weightresult;
+	}
+
+	public String getProd_code() {
+		return prod_code;
+	}
+
+	public void setProd_code(String prod_code) {
+		this.prod_code = prod_code;
+	}
+
+	public String getProd_name() {
+		return prod_name;
+	}
+
+	public void setProd_name(String prod_name) {
+		this.prod_name = prod_name;
+	}
+
+	public int getProc_repeat_index() {
+		return proc_repeat_index;
+	}
+
+	public void setProc_repeat_index(int proc_repeat_index) {
+		this.proc_repeat_index = proc_repeat_index;
+	}
+	
+	/** 
+	 * DESIGN_KEY
+	 */ 
+	private String design_key;
+	public String  getDesign_key() {
+		return this.design_key;
+	}
+	public void setDesign_key(String design_key) {
+		this.design_key = design_key;
+	}
+
+	/** 
+	 * 全程产线号(COM_MSC_BACKLOG)
+	 */ 
+	private String msc_pline;
+	public String  getMsc_pline() {
+		return this.msc_pline;
+	}
+	public void setMsc_pline(String msc_pline) {
+		this.msc_pline = msc_pline;
+	}
+
+	/** 
+	 * 全程途径码
+	 */ 
+	private String whole_backlog;
+	public String  getWhole_backlog() {
+		return this.whole_backlog;
+	}
+	public void setWhole_backlog(String whole_backlog) {
+		this.whole_backlog = whole_backlog;
+	}
+
+	/** 
+	 * 全程途径描述
+	 */ 
+	private String whole_backlog_desc;
+	public String  getWhole_backlog_desc() {
+		return this.whole_backlog_desc;
+	}
+	public void setWhole_backlog_desc(String whole_backlog_desc) {
+		this.whole_backlog_desc = whole_backlog_desc;
+	}
+
+	/** 
+	 * 全程工序顺序号(COM_MSC_PROCESS)
+	 */ 
+	private Long backlog_seq;
+	public Long  getBacklog_seq() {
+		return this.backlog_seq;
+	}
+	public void setBacklog_seq(Long backlog_seq) {
+		this.backlog_seq = backlog_seq;
+	}
+
+	/** 
+	 * 工序代码(COM_MSC_PROCESS)
+	 */ 
+	private String process_code;
+	public String  getProcess_code() {
+		return this.process_code;
+	}
+	public void setProcess_code(String process_code) {
+		this.process_code = process_code;
+	}
+
+	/** 
+	 * 工序名称(COM_MSC_PROCESS)
+	 */ 
+	private String process_desc;
+	public String  getProcess_desc() {
+		return this.process_desc;
+	}
+	public void setProcess_desc(String process_desc) {
+		this.process_desc = process_desc;
+	}
+
+	/** 
+	 * 同工序流水号
+	 */ 
+	private Long process_seq;
+	public Long  getProcess_seq() {
+		return this.process_seq;
+	}
+	public void setProcess_seq(Long process_seq) {
+		this.process_seq = process_seq;
+	}
+
+	/** 
+	 * 二级工序代码(COM_MSC_PROCESS)
+	 */ 
+	private String process_code_c;
+	public String  getProcess_code_c() {
+		return this.process_code_c;
+	}
+	public void setProcess_code_c(String process_code_c) {
+		this.process_code_c = process_code_c;
+	}
+
+	/** 
+	 * 二级工序名称(COM_MSC_PROCESS)
+	 */ 
+	private String process_desc_c;
+	public String  getProcess_desc_c() {
+		return this.process_desc_c;
+	}
+	public void setProcess_desc_c(String process_desc_c) {
+		this.process_desc_c = process_desc_c;
+	}
+
+	/** 
+	 * 工序点顺序号(COM_MSC_STATION)
+	 */ 
+	private Long process_point_seq;
+	public Long  getProcess_point_seq() {
+		return this.process_point_seq;
+	}
+	public void setProcess_point_seq(Long process_point_seq) {
+		this.process_point_seq = process_point_seq;
+	}
+
+	/** 
+	 * 工序点代码(COM_MSC_STATION)
+	 */ 
+	private String process_point_code;
+	public String  getProcess_point_code() {
+		return this.process_point_code;
+	}
+	public void setProcess_point_code(String process_point_code) {
+		this.process_point_code = process_point_code;
+	}
+
+	/** 
+	 * 工序点名称(COM_MSC_STATION)
+	 */ 
+	private String process_point_desc;
+	public String  getProcess_point_desc() {
+		return this.process_point_desc;
+	}
+	public void setProcess_point_desc(String process_point_desc) {
+		this.process_point_desc = process_point_desc;
+	}
+
+	/** 
+	 * 工序点类型(验验类、判定类、工艺类...)(COM_MSC_STATION)
+	 */ 
+	private String process_point_type;
+	public String  getProcess_point_type() {
+		return this.process_point_type;
+	}
+	public void setProcess_point_type(String process_point_type) {
+		this.process_point_type = process_point_type;
+	}
+
+	/** 
+	 * 工艺参数代码
+	 */ 
+	private String craft_param_code;
+	public String  getCraft_param_code() {
+		return this.craft_param_code;
+	}
+	public void setCraft_param_code(String craft_param_code) {
+		this.craft_param_code = craft_param_code;
+	}
+
+	/** 
+	 * 工艺参数名称
+	 */ 
+	private String craft_param_desc;
+	public String  getCraft_param_desc() {
+		return this.craft_param_desc;
+	}
+	public void setCraft_param_desc(String craft_param_desc) {
+		this.craft_param_desc = craft_param_desc;
+	}
+
+	public String getMat_object_no_vt() {
+		return mat_object_no_vt;
+	}
+
+	public void setMat_object_no_vt(String mat_object_no_vt) {
+		this.mat_object_no_vt = mat_object_no_vt;
+	}
+
+	public List<SlmOrdDesignMscPlSti> getListSti() {
+		return listSti;
+	}
+
+	public void setListSti(List<SlmOrdDesignMscPlSti> listSti) {
+		this.listSti = listSti;
+	}
+
+}

+ 23 - 0
src/main/java/market/Api/Mes/impl/LongJsonValueProcessor.java

@@ -0,0 +1,23 @@
+package market.Api.Mes.impl;
+
+import net.sf.json.JsonConfig;
+import net.sf.json.processors.JsonValueProcessor;
+
+public class LongJsonValueProcessor implements JsonValueProcessor{
+
+	@Override
+	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
+		return null;
+	}
+
+	@Override
+	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
+		//如果vlaue为null,就返回"",不为空就返回他的值,
+		if(value == null)  
+        {  
+            return "";  
+        }  
+        //return value.toString(); 
+		return value;
+	}
+}

+ 2411 - 0
src/main/java/market/Api/Mes/impl/MesApi12mmPdiPdoImpl.java

@@ -0,0 +1,2411 @@
+/***文档注释***********************************************
+ * 作者               :                   宋燕辉
+ * 创建日期      :                   2018.07.23
+ * 描述               :                  12mm pdipdo
+ * 注意事项      :                   无
+ * 遗留BUG :                   无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+ ***********************************************************/
+package market.Api.Mes.impl;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import market.Api.Lms.impl.LmsApiServiceImpl;
+import market.Api.Mes.service.MesApi12mmPdiPdoService;
+import market.Com.impl.PbModelDbServiceImpl;
+import market.Com.mapper.ComBaseMachineMapper;
+import market.Com.mapper.ComBaseSteelMapper;
+import market.Com.pb.DoubleUtil;
+import market.Com.pb.PropertiesUtils;
+import market.Com.vo.ComBaseMachine;
+import market.Com.vo.ComBaseSteel;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.mapper.YdmProductOutlistMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Lms.Warehouse.vo.YdmProductOutlist;
+import market.Mes.Lengthwise.Performance.mapper.IfSlit01LogMapper;
+import market.Mes.Lengthwise.Performance.mapper.IfSlit01PdiMapper;
+import market.Mes.Lengthwise.Performance.mapper.IfSlit01PdoCoilsMapper;
+import market.Mes.Lengthwise.Performance.mapper.IfSlit01PdoRejectMapper;
+import market.Mes.Lengthwise.Performance.mapper.IfSlit01PdoShiftMapper;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingDMapper;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingMMapper;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingTrcMapper;
+import market.Mes.Lengthwise.Performance.vo.IfSlit01Pdi;
+import market.Mes.Lengthwise.Performance.vo.IfSlit01PdoCoils;
+import market.Mes.Lengthwise.Performance.vo.IfSlit01PdoReject;
+import market.Mes.Lengthwise.Performance.vo.IfSlit01PdoShift;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingD;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingM;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingTrc;
+import market.Mes.Lengthwise.Plan.mapper.PlnLengthwisePlanDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnLengthwisePlanMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnLengthwisePlan;
+import market.Mes.Lengthwise.Plan.vo.PlnLengthwisePlanDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.Shift.mapper.MesShiftDRptSltMapper;
+import market.Mes.Shift.mapper.MesShiftMMapper;
+import market.Mes.Shift.vo.MesShiftDRptSlt;
+import market.Mes.Shift.vo.MesShiftM;
+import market.Mes.anneal.vo.MesJihuaZhi;
+import market.Mes.util.DateUtil;
+import market.Mes.util.MesUtil;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+import org.apache.log4j.Logger;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+
+@RemoteService(path = "MesApi12mmPdiPdoService")
+public class MesApi12mmPdiPdoImpl extends BaseServiceImpl implements  MesApi12mmPdiPdoService{
+	
+	//public static String pdiohost = PropertiesUtils.getImageProperties().getProperty("PDIOHOST");
+	public static String pdiohost = PropertiesUtils.getPdioProperties().getProperty("PDIOHOST");
+	//获取日志记录器Logger,名字为本类类名
+    private static Logger log = Logger.getLogger(MesApi12mmPdiPdoImpl.class);
+	
+    
+    /**
+	 * 12mm作业指示
+	 * @param oci
+	 * object:
+	 * material_no:投料卷号
+	 * materailcoilno:原始卷号
+	 * steel_name:牌号
+	 * order_no:订单号
+	 * reciver_unit_name:客户名称
+	 * memo1:传机台代码
+	 * startTime:开始时间
+	 * endTime:结束时间
+	 * @return
+	 */
+	public ResultModel doQuery12mmWeb(CommonPage<MesJihuaZhi> oci){
+		ResultModel rm=new ResultModel();
+		if(oci.getMemo1()==null || "".equals(oci.getMemo1())){
+			rm.setState("500");
+			rm.setMsgInfo("请输入机台代码");
+			return rm;
+		}
+		try{
+			List<HashMap> lpav=this.getMapper(IfSlit01PdiMapper.class).doQueryWeb(oci.getObject(),oci.getMemo1(),oci.getMemo2(),oci.getStartTime(),oci.getEndTime(),oci.getMemo3());
+			rm.setData(lpav);
+			rm.setState("200");
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+    
+	
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Send12mmSlitPDI(String v_mch_code,String v_plan_no,String v_object_no_vt,String v_opr_name,String v_message) throws Exception {
+		//ResultModel rm=new ResultModel();
+		/*
+		 *   12mm分条机PDI下发
+		 */
+		Integer v_cnt;
+		//--(1)、验证当前还未收到L2生产实绩
+		v_cnt = this.getMapper(PlnLengthwisePlanDetailMapper.class).findCount(v_mch_code,v_plan_no,v_object_no_vt);
+		if(v_cnt<=0){
+			v_message="分条作业计划不存在!";
+			return v_message;
+		}
+		List<PlnLengthwisePlanDetail> l_v_rec_pln_d = this.getMapper(PlnLengthwisePlanDetailMapper.class).findPmp(v_mch_code,v_plan_no,v_object_no_vt);
+		PlnLengthwisePlanDetail v_rec_pln_d=l_v_rec_pln_d.get(0);
+		if("2".equals(v_rec_pln_d.getSend_flag())){
+			v_message="原料卷号{"+v_rec_pln_d.getObject_no()+"} 已收到L2生产实绩,不能重复下发!";
+			return v_message;
+		}
+		//--(2)、验证当前还未生产交工
+		v_cnt= this.getMapper(MesCrSlittingMMapper.class).countWithCondition(null, "schedule_no='"+v_plan_no+"' and material_no_vt='"+v_object_no_vt+"'");
+		if(v_cnt>0){
+			List<MesCrSlittingM> v_rec_slt_m = this.getMapper(MesCrSlittingMMapper.class).findWithCondition(null, "schedule_no='"+v_plan_no+"' and material_no_vt='"+v_object_no_vt+"'",
+					null, 0, 0);
+			if("1".equals(v_rec_slt_m.get(0).getHand_over_status())){
+				v_message="原料卷号{"+v_rec_slt_m.get(0).getMaterial_no()+"} 已生产交工,不能重复下发!";
+				return v_message;
+			}
+		}
+		// --(3)、验证虚拟物料表中,原料卷计划信息存在
+		v_cnt=this.getMapper(PlnMaterielDetailMapper.class).countWithCondition(null,"object_no_vt='"+v_object_no_vt+"'");
+		if(v_cnt<=0){
+			return "原料卷号{"+v_rec_pln_d.getObject_no()+"} 原料卷虚拟物料信息不存在!";
+		}
+		List<PlnMaterielDetail> v_rec_mat_d = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt='"+v_object_no_vt+"'", null, 0, 0);
+		
+		//  --(4)、验证原料卷库存明细存在
+		v_cnt = this.getMapper(YdmProductDetailMapper.class).countWithCondition(null, "coilno='"+v_rec_pln_d.getObject_no()+"'");
+		if(v_cnt<=0){
+			return "原料卷号{"+v_rec_pln_d.getObject_no()+"}  库存明细记录不存在!";
+		}
+		List<YdmProductDetail> v_rec_ydm_d = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_pln_d.getObject_no()+"'", null, 0, 0);
+		
+		//--(5)、获取生产订单信息
+		v_cnt=this.getMapper(PlnProdorderMapper.class).countWithCondition(null, "prod_order_no='"+v_rec_mat_d.get(0).getProd_order_no()+"'");
+		if(v_cnt<=0){
+			return "原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"} 生产订单号{"
+					+v_rec_mat_d.get(0).getProd_order_no()+"} 生产订单信息不存在!";
+		}
+		List<PlnProdorder> v_rec_prod = this.getMapper(PlnProdorderMapper.class).findWithCondition(null, "prod_order_no='"+v_rec_mat_d.get(0).getProd_order_no()+"'", null, 0, 0);
+		//v_rec_prod.get(0).setCustomer_name(null);
+		//取客户名称改为取客户简称
+//		SlmCustomerInfo slmCustomerInfo = this.getMapper(SlmCustomerInfoMapper.class).findById(v_rec_prod.get(0).getCustomer_no());
+//		if(slmCustomerInfo!=null){
+//			v_rec_prod.get(0).setCustomer_name(slmCustomerInfo.getCustomer_abbr());
+//		}
+		
+		
+		// --(6)、获取牌号(名称)
+		String v_steel_grade=null;
+		List<ComBaseSteel> lcbs = this.getMapper(ComBaseSteelMapper.class).findWithCondition(null, "steel_code='"+v_rec_mat_d.get(0).getSteel_code()+"'", null, 0, 0);
+		if(lcbs==null || lcbs.size()<=0){
+			v_steel_grade="";
+		}else{
+			if(lcbs.get(0).getSteel_name()==null){
+				v_steel_grade=lcbs.get(0).getSteel_code();
+			}else{
+				v_steel_grade=lcbs.get(0).getSteel_name();
+			}
+		}
+		
+		// --(7)、入口卷相关信息赋值
+		IfSlit01Pdi v_rec_pdi=new IfSlit01Pdi();
+		v_rec_pdi.setEntry_coil_id(v_rec_mat_d.get(0).getObject_no());//入口卷号
+		v_rec_pdi.setMaterial_coil_width(v_rec_ydm_d.get(0).getWidth());//入口卷宽度(mm)
+		v_rec_pdi.setMaterial_coil_thickness(v_rec_ydm_d.get(0).getThick());//入口卷厚度(mm)
+		v_rec_pdi.setMaterial_coil_weight(v_rec_ydm_d.get(0).getFactweight());//
+		if(v_rec_ydm_d.get(0).getLength()==null){
+			v_rec_pdi.setMaterial_coil_length(0d);//入口卷长度(m)  赋值可能为空,在L2数据库中不能为空
+		}else{
+			v_rec_pdi.setMaterial_coil_length(v_rec_ydm_d.get(0).getLength());//入口卷长度(m)  赋值可能为空,在L2数据库中不能为空
+		}
+		
+		if(v_steel_grade!=null && !"".equals(v_steel_grade)){
+			v_rec_pdi.setSteel_grade(v_steel_grade);
+		}else{
+			// --牌号(牌号基础信息不存在,则传入牌号编码)
+			v_rec_pdi.setSteel_grade(v_rec_mat_d.get(0).getSteel_code());
+		}
+		v_rec_pdi.setUncoiler_inner_diameter(v_rec_ydm_d.get(0).getDiameter_inn());//开卷内径
+		v_rec_pdi.setProcess_type("01");//--加工类别:01= SLITTING
+		v_rec_pdi.setOrder_number(v_rec_prod.get(0).getOrder_no());
+		v_rec_pdi.setCustomer_name(v_rec_prod.get(0).getCustomer_name());
+		v_rec_pdi.setThickness_tolerance_min(0d);//--厚度公差最小值:待确认,目前原料无此信息
+		v_rec_pdi.setThickness_tolerance_max(0d);// --厚度公差最大值:待确认,目前原料无此信息
+		v_rec_pdi.setWidth_tolerance_min(0d);//--宽度公差最小值:待确认,目前原料无此信息
+		v_rec_pdi.setWidth_tolerance_max(0d);//--宽度公差最大值:待确认,目前原料无此信息
+		// --工作模式(0= Loop / 1= Tension Mode):待确认,开发时提醒确认此项目
+		v_rec_pdi.setWorking_mode(0);
+		v_rec_pdi.setRecoiler_inner_diameter(0d);//--收卷内径:待确认是否必须项,目前计划模块无法给定
+		v_rec_pdi.setBabys_outer_diameter(0d);//--子卷外径:待确认是否必须项,目前计划模块无法给定
+		//2018-08-21
+		v_rec_pdi.setNum_of_baby_coils_1(0l);//--1段_子卷数,先置0
+		v_rec_pdi.setNum_of_baby_coils_2(0l);//--2段_子卷数,先置0
+		v_rec_pdi.setNum_of_baby_coils_3(0l);//--3段_子卷数,先置0
+		
+		//--(8)、分条子卷相关信息赋值(取生产加工表数据:PLN_PROCESS_PLAN)
+		v_cnt=0;//--计数器归零
+		List<PlnProcessPlan> cur01=this.getMapper(PlnProcessPlanMapper.class).findPp(v_rec_mat_d.get(0).getProd_order_no(),"");
+		if(cur01!=null && cur01.size()>0){
+			for(PlnProcessPlan ppp:cur01){
+				// --(8.0)、根据加工计划中,CUT_NUM,确定每段子卷数(新加字段)
+				v_rec_pdi.setNum_of_baby_coils_1(v_rec_pdi.getNum_of_baby_coils_1()+ppp.getCut_num());
+				//-- 一切二 或 一切三
+				if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+					v_rec_pdi.setNum_of_baby_coils_2(v_rec_pdi.getNum_of_baby_coils_2()+ppp.getCut_num());
+				}
+				if("3".equals(ppp.getCrosscut_style())){
+					v_rec_pdi.setNum_of_baby_coils_3(v_rec_pdi.getNum_of_baby_coils_3()+ppp.getCut_num());
+				}
+				
+				// --(8.1)、根据加工计划中,CUT_NUM,确定每个分条规格的条数
+				for(int i=0;i<ppp.getCut_num();i++){
+					v_cnt=v_cnt+1;
+					if(v_cnt==1){
+						//第一卷
+						v_rec_pdi.setSlit_width_1(ppp.getWidth());//-- 1段_分条宽度_1
+						v_rec_pdi.setOrder_number_1(ppp.getOrder_no());//-- 1段_订单号_1
+						v_rec_pdi.setCustomer_name_1(v_rec_prod.get(0).getCustomer_name());//-- 1段_客户名称_1
+						v_rec_pdi.setSlit_id_create_1(0);//-- 1段_是否创建子卷号_1(0= Create / 1= Not Create)
+						v_rec_pdi.setCalc_weight_1(1);// -- 1段_是否计算子卷重量_1(0= Calculated / 1= Weigthted)
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							v_rec_pdi.setSlit_width_1_1(ppp.getWidth());//-- 2段_分条宽度_1
+							v_rec_pdi.setOrder_number_1_1(ppp.getOrder_no());//-- 2段_订单号_1
+							v_rec_pdi.setCustomer_name_1_1(v_rec_prod.get(0).getCustomer_name());//-- 2段_客户名称_1
+							v_rec_pdi.setSlit_id_create_1_1(0);//-- 2段_是否创建子卷号_1(0= Create / 1= Not Create)
+							v_rec_pdi.setCalc_weight_1_1(1);//-- 2段_是否计算子卷重量_1(0= Calculated / 1= Weigthted)     
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							v_rec_pdi.setSlit_width_1_2(ppp.getWidth());// -- 3段_分条宽度_1
+							v_rec_pdi.setOrder_number_1_2(ppp.getOrder_no());//-- 3段_订单号_1
+							v_rec_pdi.setCustomer_name_1_2(v_rec_prod.get(0).getCustomer_name());//-- 3段_客户名称_1
+							v_rec_pdi.setSlit_id_create_1_2(0);//-- 3段_是否创建子卷号_1(0= Create / 1= Not Create)
+							v_rec_pdi.setCalc_weight_1_2(1);//-- 3段_是否计算子卷重量_1(0= Calculated / 1= Weigthted)
+						}
+					}if(v_cnt==2){
+						//第2卷
+						v_rec_pdi.setSlit_width_2(ppp.getWidth());
+						v_rec_pdi.setOrder_number_2(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_2(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_2(0);
+						v_rec_pdi.setCalc_weight_2(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_2_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_2_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_2_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_2_1(0);
+							v_rec_pdi.setCalc_weight_2_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_2_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_2_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_2_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_2_2(0);
+							v_rec_pdi.setCalc_weight_2_2(1);
+							
+						}
+					}if (v_cnt==3) {
+						//第3卷
+						v_rec_pdi.setSlit_width_3(ppp.getWidth());
+						v_rec_pdi.setOrder_number_3(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_3(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_3(0);
+						v_rec_pdi.setCalc_weight_3(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_3_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_3_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_3_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_3_1(0);
+							v_rec_pdi.setCalc_weight_3_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_3_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_3_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_3_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_3_2(0);
+							v_rec_pdi.setCalc_weight_3_2(1);
+							
+						}
+					}if (v_cnt==4) {
+						//第4卷
+						v_rec_pdi.setSlit_width_4(ppp.getWidth());
+						v_rec_pdi.setOrder_number_4(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_4(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_4(0);
+						v_rec_pdi.setCalc_weight_4(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_4_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_4_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_4_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_4_1(0);
+							v_rec_pdi.setCalc_weight_4_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_4_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_4_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_4_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_4_2(0);
+							v_rec_pdi.setCalc_weight_4_2(1);
+						}
+					}if (v_cnt==5) {
+						//第5卷
+						v_rec_pdi.setSlit_width_5(ppp.getWidth());
+						v_rec_pdi.setOrder_number_5(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_5(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_5(0);
+						v_rec_pdi.setCalc_weight_5(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_5_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_5_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_5_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_5_1(0);
+							v_rec_pdi.setCalc_weight_5_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_5_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_5_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_5_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_5_2(0);
+							v_rec_pdi.setCalc_weight_5_2(1);
+						}
+					}if (v_cnt==6) {
+						//第6卷
+						v_rec_pdi.setSlit_width_6(ppp.getWidth());
+						v_rec_pdi.setOrder_number_6(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_6(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_6(0);
+						v_rec_pdi.setCalc_weight_6(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_6_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_6_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_6_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_6_1(0);
+							v_rec_pdi.setCalc_weight_6_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_6_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_6_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_6_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_6_2(0);
+							v_rec_pdi.setCalc_weight_6_2(1);
+						}
+					}if (v_cnt==7) {
+						//第7卷
+						v_rec_pdi.setSlit_width_7(ppp.getWidth());
+						v_rec_pdi.setOrder_number_7(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_7(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_7(0);
+						v_rec_pdi.setCalc_weight_7(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_7_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_7_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_7_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_7_1(0);
+							v_rec_pdi.setCalc_weight_7_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_7_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_7_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_7_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_7_2(0);
+							v_rec_pdi.setCalc_weight_7_2(1);
+						}
+					}if (v_cnt==8) {
+						//第8卷
+						v_rec_pdi.setSlit_width_8(ppp.getWidth());
+						v_rec_pdi.setOrder_number_8(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_8(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_8(0);
+						v_rec_pdi.setCalc_weight_8(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_8_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_8_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_8_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_8_1(0);
+							v_rec_pdi.setCalc_weight_8_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_8_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_8_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_8_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_8_2(0);
+							v_rec_pdi.setCalc_weight_8_2(1);
+						}
+					}if (v_cnt==9) {
+						//第9卷
+						v_rec_pdi.setSlit_width_9(ppp.getWidth());
+						v_rec_pdi.setOrder_number_9(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_9(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_9(0);
+						v_rec_pdi.setCalc_weight_9(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_9_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_9_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_9_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_9_1(0);
+							v_rec_pdi.setCalc_weight_9_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_9_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_9_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_9_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_9_2(0);
+							v_rec_pdi.setCalc_weight_9_2(1);
+						}
+					}if (v_cnt==10) {
+						//第10卷
+						v_rec_pdi.setSlit_width_10(ppp.getWidth());
+						v_rec_pdi.setOrder_number_10(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_10(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_10(0);
+						v_rec_pdi.setCalc_weight_10(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_10_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_10_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_10_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_10_1(0);
+							v_rec_pdi.setCalc_weight_10_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_10_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_10_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_10_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_10_2(0);
+							v_rec_pdi.setCalc_weight_10_2(1);
+						}
+					}if (v_cnt==11) {
+						//第11卷
+						v_rec_pdi.setSlit_width_11(ppp.getWidth());
+						v_rec_pdi.setOrder_number_11(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_11(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_11(0);
+						v_rec_pdi.setCalc_weight_11(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_11_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_11_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_11_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_11_1(0);
+							v_rec_pdi.setCalc_weight_11_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_11_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_11_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_11_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_11_2(0);
+							v_rec_pdi.setCalc_weight_11_2(1);
+						}
+					}if (v_cnt==12) {
+						//第12卷
+						v_rec_pdi.setSlit_width_12(ppp.getWidth());
+						v_rec_pdi.setOrder_number_12(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_12(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_12(0);
+						v_rec_pdi.setCalc_weight_12(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_12_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_12_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_12_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_12_1(0);
+							v_rec_pdi.setCalc_weight_12_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_12_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_12_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_12_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_12_2(0);
+							v_rec_pdi.setCalc_weight_12_2(1);
+						}
+					}if (v_cnt==13) {
+						//第13卷
+						v_rec_pdi.setSlit_width_13(ppp.getWidth());
+						v_rec_pdi.setOrder_number_13(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_13(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_13(0);
+						v_rec_pdi.setCalc_weight_13(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_13_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_13_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_13_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_13_1(0);
+							v_rec_pdi.setCalc_weight_13_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_13_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_13_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_13_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_13_2(0);
+							v_rec_pdi.setCalc_weight_13_2(1);
+						}
+					}if (v_cnt==14) {
+						//第14卷
+						v_rec_pdi.setSlit_width_14(ppp.getWidth());
+						v_rec_pdi.setOrder_number_14(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_14(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_14(0);
+						v_rec_pdi.setCalc_weight_14(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_14_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_14_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_14_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_14_1(0);
+							v_rec_pdi.setCalc_weight_14_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_14_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_14_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_14_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_14_2(0);
+							v_rec_pdi.setCalc_weight_14_2(1);
+						}
+					}if (v_cnt==15) {
+						//第15卷
+						v_rec_pdi.setSlit_width_15(ppp.getWidth());
+						v_rec_pdi.setOrder_number_15(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_15(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_15(0);
+						v_rec_pdi.setCalc_weight_15(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_15_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_15_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_15_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_15_1(0);
+							v_rec_pdi.setCalc_weight_15_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_15_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_15_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_15_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_15_2(0);
+							v_rec_pdi.setCalc_weight_15_2(1);
+						}
+					}if (v_cnt==16) {
+						//第16卷
+						v_rec_pdi.setSlit_width_16(ppp.getWidth());
+						v_rec_pdi.setOrder_number_16(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_16(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_16(0);
+						v_rec_pdi.setCalc_weight_16(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_16_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_16_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_16_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_16_1(0);
+							v_rec_pdi.setCalc_weight_16_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_16_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_16_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_16_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_16_2(0);
+							v_rec_pdi.setCalc_weight_16_2(1);
+						}
+					}if (v_cnt==17) {
+						//第17卷
+						v_rec_pdi.setSlit_width_17(ppp.getWidth());
+						v_rec_pdi.setOrder_number_17(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_17(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_17(0);
+						v_rec_pdi.setCalc_weight_17(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_17_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_17_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_17_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_17_1(0);
+							v_rec_pdi.setCalc_weight_17_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_17_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_17_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_17_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_17_2(0);
+							v_rec_pdi.setCalc_weight_17_2(1);
+						}
+					}if (v_cnt==18) {
+						//第18卷
+						v_rec_pdi.setSlit_width_18(ppp.getWidth());
+						v_rec_pdi.setOrder_number_18(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_18(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_18(0);
+						v_rec_pdi.setCalc_weight_18(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_18_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_18_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_18_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_18_1(0);
+							v_rec_pdi.setCalc_weight_18_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_18_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_18_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_18_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_18_2(0);
+							v_rec_pdi.setCalc_weight_18_2(1);
+						}
+					}if (v_cnt==19) {
+						//第19卷
+						v_rec_pdi.setSlit_width_19(ppp.getWidth());
+						v_rec_pdi.setOrder_number_19(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_19(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_19(0);
+						v_rec_pdi.setCalc_weight_19(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_19_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_19_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_19_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_19_1(0);
+							v_rec_pdi.setCalc_weight_19_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_19_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_19_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_19_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_19_2(0);
+							v_rec_pdi.setCalc_weight_19_2(1);
+						}
+					}if (v_cnt==20) {
+						//第20卷
+						v_rec_pdi.setSlit_width_20(ppp.getWidth());
+						v_rec_pdi.setOrder_number_20(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_20(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_20(0);
+						v_rec_pdi.setCalc_weight_20(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_20_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_20_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_20_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_20_1(0);
+							v_rec_pdi.setCalc_weight_20_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_20_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_20_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_20_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_20_2(0);
+							v_rec_pdi.setCalc_weight_20_2(1);
+						}
+					}if (v_cnt==21) {
+						//第21卷
+						v_rec_pdi.setSlit_width_21(ppp.getWidth());
+						v_rec_pdi.setOrder_number_21(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_21(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_21(0);
+						v_rec_pdi.setCalc_weight_21(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_21_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_21_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_21_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_21_1(0);
+							v_rec_pdi.setCalc_weight_21_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_21_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_21_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_21_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_21_2(0);
+							v_rec_pdi.setCalc_weight_21_2(1);
+						}
+					}if (v_cnt==22) {
+						//第22卷
+						v_rec_pdi.setSlit_width_22(ppp.getWidth());
+						v_rec_pdi.setOrder_number_22(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_22(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_22(0);
+						v_rec_pdi.setCalc_weight_22(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_22_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_22_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_22_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_22_1(0);
+							v_rec_pdi.setCalc_weight_22_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_22_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_22_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_22_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_22_2(0);
+							v_rec_pdi.setCalc_weight_22_2(1);
+						}
+					}if (v_cnt==23) {
+						//第23卷
+						v_rec_pdi.setSlit_width_23(ppp.getWidth());
+						v_rec_pdi.setOrder_number_23(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_23(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_23(0);
+						v_rec_pdi.setCalc_weight_23(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_23_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_23_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_23_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_23_1(0);
+							v_rec_pdi.setCalc_weight_23_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_23_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_23_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_23_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_23_2(0);
+							v_rec_pdi.setCalc_weight_23_2(1);
+						}
+					}if (v_cnt==24) {
+						//第24卷
+						v_rec_pdi.setSlit_width_24(ppp.getWidth());
+						v_rec_pdi.setOrder_number_24(ppp.getOrder_no());
+						v_rec_pdi.setCustomer_name_24(v_rec_prod.get(0).getCustomer_name());
+						v_rec_pdi.setSlit_id_create_24(0);
+						v_rec_pdi.setCalc_weight_24(1);
+						if("2".equals(ppp.getCrosscut_style()) || "3".equals(ppp.getCrosscut_style())){
+							// 一切二 或一切三
+							v_rec_pdi.setSlit_width_24_1(ppp.getWidth());
+							v_rec_pdi.setOrder_number_24_1(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_24_1(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_24_1(0);
+							v_rec_pdi.setCalc_weight_24_1(1);
+						}
+						if("3".equals(ppp.getCrosscut_style())){
+							//一切三
+							v_rec_pdi.setSlit_width_24_2(ppp.getWidth());
+							v_rec_pdi.setOrder_number_24_2(ppp.getOrder_no());
+							v_rec_pdi.setCustomer_name_24_2(v_rec_prod.get(0).getCustomer_name());
+							v_rec_pdi.setSlit_id_create_24_2(0);
+							v_rec_pdi.setCalc_weight_24_2(1);
+						}
+					}
+				}
+			}
+		}
+		v_rec_pdi.setSend_time(new Date());
+		v_rec_pdi.setSend_opr(v_opr_name);
+		
+		//======================================================
+		//测试所用
+		//v_rec_pdi.setBabys_outer_diameter(babys_outer_diameter);
+//		v_rec_pdi.setOrder_number_3_2("测试所用!!");
+//		v_rec_pdi.setThickness_tolerance_max(888.88);
+//		v_rec_pdi.setSlit_width_3_1(100.008);
+//		v_rec_pdi.setSlit_id_create_3(0);
+//		v_rec_pdi.setMaterial_coil_width(777.77);
+//		v_rec_pdi.setThickness_tolerance_min(0.001);
+//		v_rec_pdi.setWidth_tolerance_min(0.0021);
+		//======================================================
+		
+	    //  --(12)、调用公司电文处理,真正下发PDI给L2(v_rec_pdi 对象)
+		//  --无接口调试时,设置1,直接跳过,否则设置为0
+		int v_flag=0;
+		JsonConfig jsonConfig=new JsonConfig();
+		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+		jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+		JSONObject jsonObject=JSONObject.fromObject(v_rec_pdi,jsonConfig);
+		//System.out.println(jsonObject.toString());
+		try{
+			//System.out.println(pdiohost);
+			log.debug("url:"+pdiohost);
+			//http://172.16.0.76:83/v1/intpdis/
+			String url = pdiohost;
+	        //String url="http://172.16.0.76:83/v1/intpdis/";
+			String body = jsonObject.toString();
+	        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+	                .post()              //设置post请求
+	                .addPostParam("body", "json")
+	                .body(body)
+	                .addHeader("Content-type", "application/json")   //添加header
+	                //.addPathParam("id", "2")        //设置url路径参数
+	                //.addQueryParam("test", "value") //设置url请求参数
+	                .request();         //发起请求
+	        System.out.println(response.getCode());     //响应状态码
+	        System.out.println(response.getRequestUrl());//最终发起请求的地址
+	        if(response.getCode() == 200){
+	            //请求成功
+	            System.out.println(response.getContent());  //响应内容
+	            //if("success".equals(response.getContent()) || "成功".equals(response.getContent())){//成功往L2的pdi表中插入数据
+	            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+	            	v_flag=1;
+	            	v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}PDI下发成功!";
+	            }else{
+	            	if(response.getContent()!=null && response.getContent().length()>200){
+	    				v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}已下发PDI给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+	    			}else{
+	    				v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}已下发PDI给L2,插入失败!【"+response.getContent()+"】";
+	    			}
+	            }
+	            //v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}已下发PDI给L2!";
+	        }else{
+	        	v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}下发PDI给L2失败!发送请求失败!";
+	        }
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}下发PDI给L2失败!【通讯过程出错:"+e.getMessage()+"】";
+		}
+		if(v_flag==0){
+			v_message="电文发送失败!"+v_message;
+			return v_message;
+		}
+		
+		//  --(9)、插入PDI记录表
+		this.getMapper(IfSlit01PdiMapper.class).insert(v_rec_pdi);
+		
+		//  --(10)、修改作业计划表下发L2状态
+		this.getMapper(PlnLengthwisePlanDetailMapper.class).updatePpd(v_plan_no,v_object_no_vt,v_opr_name);
+		
+		//--(11)、提交事务
+		//v_message= "原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"} PDI下发成功!";
+		
+		return v_message;
+	}
+	
+	
+	public String Receive12mmSlitPDO_Coils_list(List<IfSlit01PdoCoils> jsonList){
+		StringBuilder v_message=new StringBuilder();
+		for(IfSlit01PdoCoils json:jsonList){
+			v_message.append(json.getMsgcounter()+"-");
+			v_message.append(Receive12mmSlitPDO_Coils(json));
+		}
+		return v_message.toString();
+	}
+	/**
+	 * 此接口为纯后台逻辑,不与前端页面交互,由L2接口系统收到12mm分条机子卷实绩PDO时调用;																																							
+	         此接口参数为JSON对象(对象结构见数据库表 IF_SLIT01_PDO_COILS);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Receive12mmSlitPDO_Coils(IfSlit01PdoCoils json){
+	   String v_message="";
+
+		IfSlit01PdoCoils  v_rec_pdo_coils=json;
+		if(v_rec_pdo_coils==null){
+			//v_message="参数错误:二级接口-12mm纵剪PDO-子卷实绩为空";
+			v_message="500";
+			return v_message;
+		}
+		//   --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_pdo_coils.getMsg_time()==null){
+			v_rec_pdo_coils.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入PDO子卷实绩表(单独的事务)  
+		try{
+			this.getMapper(IfSlit01PdoCoilsMapper.class).insert(v_rec_pdo_coils);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理PDO子卷实绩函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApi12mmPdiPdoImpl.class).Receive12mmSlitPDO_Coils_D(v_rec_pdo_coils, v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+			//throw new Exception(e.getMessage());
+		}finally{
+			//  --(5)、拼接返回字符串
+			v_message = "入口卷号{"+v_rec_pdo_coils.getEntry_coil_id()+"}"+v_message;
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfSlit01LogMapper.class).insertIf_slit01_log(null,"Receive12mmSlitPDO_Coils","",v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+	  	return v_message;
+	}
+	
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 Receive12mmSlitPDO_Coils 调用;																																							
+		1)、	接口参数 IN:V_REC_PDO_COILS(PDO子卷实绩实体对象实例)																																							
+		2)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdo_coils
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Receive12mmSlitPDO_Coils_D(IfSlit01PdoCoils v_rec_pdo_coils,String v_message) throws Exception{
+		//--请定义为常量:12mm分条机代码,用于判断 
+		final String v_mch_code="M0002";
+		Integer v_cnt;
+		//  --(1)、如果对象中入口卷号为空,则返回错误信息
+		if(v_rec_pdo_coils.getEntry_coil_id()==null || "".equals(v_rec_pdo_coils.getEntry_coil_id())){
+			v_message="电文入口卷号为空,无法处理!";
+			return v_message;
+		}
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); 
+		Date creaTime = new Date();
+		String createTime = formatter.format(creaTime);
+		try{
+			/*
+			   --处理逻辑思路:																																							
+			  --将用户通过页面按钮操作的相关处理,如上料、批量新增子卷、称重保存等功能																																							
+			  --按L2系统返回的子卷实绩,生成上述相关业务数据																																							
+			 */
+			//  --(2)、通过PDO入口卷号,去找分条作业计划明细记录(存在一条记录才合理)
+			 v_cnt = this.getMapper(PlnLengthwisePlanDetailMapper.class).countWithCondition(null,
+					"object_no='"+v_rec_pdo_coils.getEntry_coil_id()+"'");
+			if(v_cnt<=0){
+				v_message="分条作业计划明细记录不存在!";
+				return v_message;
+			}else if(v_cnt>=2){
+				v_message="存在2条或以上分条作业计划明细记录!";
+				return v_message;
+			}
+			List<PlnLengthwisePlanDetail> v_rec_pln_d = this.getMapper(PlnLengthwisePlanDetailMapper.class).findWithCondition(null, "object_no='"+v_rec_pdo_coils.getEntry_coil_id()+"'",
+					null, 0, 0);
+			
+			// --(3)、验证分条作业计划主记录
+			v_cnt = this.getMapper(PlnLengthwisePlanMapper.class).countWithCondition(null,"lw_plan_no='"+v_rec_pln_d.get(0).getLw_plan_no()+"'");
+			if(v_cnt<=0){
+				v_message="作业计划号{"+v_rec_pln_d.get(0).getLw_plan_no()+"} 分条作业计划主记录不存在!";
+				return v_message;
+			}
+			List<PlnLengthwisePlan> v_rec_pln_m = this.getMapper(PlnLengthwisePlanMapper.class).findWithCondition(null, "lw_plan_no='"+v_rec_pln_d.get(0).getLw_plan_no()+"'", 
+					null, 0, 0);
+			if(!v_mch_code.equals(v_rec_pln_m.get(0).getMachine_code())){
+				v_message="作业计划号{"+v_rec_pln_m.get(0).getLw_plan_no()+"} 机台代码{"+v_rec_pln_m.get(0).getMachine_code()+"}错误!12mm分条机正确的机台代码为{"+v_mch_code+"}";
+				return v_message;
+			}
+			// --(4)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此PDO子卷实绩)
+			List<MesCrSlittingM> v_rec_slt_m=new ArrayList<>();
+			v_cnt = this.getMapper(MesCrSlittingMMapper.class).countWithCondition(null,"schedule_no='"+v_rec_pln_d.get(0).getLw_plan_no()+"' and material_no_vt='"+v_rec_pln_d.get(0).getObject_no_vt()+"'");
+			if(v_cnt>0){
+				v_rec_slt_m= this.getMapper(MesCrSlittingMMapper.class).findWithCondition(null, "schedule_no='"+v_rec_pln_d.get(0).getLw_plan_no()+"' and material_no_vt='"+v_rec_pln_d.get(0).getObject_no_vt()+"'", 
+						null, 0, 0);
+				if("1".equals(v_rec_slt_m.get(0).getHand_over_status())){
+					v_message="作业计划号{"+v_rec_pln_d.get(0).getLw_plan_no()+"} 已生产交工,忽略此PDO子卷实绩!";
+					return v_message;
+				}
+			}
+			
+			/*
+			 * 这里
+			 */
+			//  --(5)、验证虚拟物料表中,原料卷计划信息存在
+			v_cnt=this.getMapper(PlnMaterielDetailMapper.class).countWithCondition(null, "object_no_vt='"+v_rec_pln_d.get(0).getObject_no_vt()+"'");
+			if(v_cnt<=0){
+				v_message="虚拟原料卷号{"+v_rec_pln_d.get(0).getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			List<PlnMaterielDetail> v_rec_mat_d = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt='"+v_rec_pln_d.get(0).getObject_no_vt()+"'", null, 0, 0);
+			if(!v_rec_pdo_coils.getEntry_coil_id().equals(v_rec_mat_d.get(0).getObject_no())){
+				v_message="与原料卷虚拟物料信息中钢卷号{"+v_rec_mat_d.get(0).getObject_no()+"}不一致!";
+				return v_message;
+			}
+			//  --(6)、验证原料卷库存明细存在
+			v_cnt = this.getMapper(YdmProductDetailMapper.class).countWithCondition(null,"coilno='"+v_rec_pdo_coils.getEntry_coil_id()+"'");
+			if(v_cnt<=0){
+				v_message="库存明细记录不存在!";
+				return v_message;
+			}
+			List<YdmProductDetail> v_rec_ydm_d = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_pdo_coils.getEntry_coil_id()+"'",
+					null, 0, 0);
+			//  --(7)、验证机台基础信息存在
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).countWithCondition(null,"machine_code='"+v_mch_code+"'");
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 机台基础信息不存在!";
+				return v_message;
+			}
+			//  --(7.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class).findWithCondition(null,
+					"machine_code='"+v_mch_code+"'", null, 0, 0);
+			String v_machine_mark=lcbm.get(0).getMachine_mark();
+			if(v_machine_mark==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法创建作业记录号!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null && v_rec_pln_d.size()>0){
+				if(!("5BLW02".equals(v_rec_pln_d.get(0).getStatus()) || "5BLW03".equals(v_rec_pln_d.get(0).getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.get(0).getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			/*
+			 --(7.2)、大写字母'F' + 6位日期(YYMMDD,取数据库时间) + 2位纵剪设备编号(不足位前面补0)																																							
+	  		 --(7.3)、注意:页面操作的首字母为'S',通过L2实绩自动创建的记录,首字母为'F',以示区别																																							
+			 */
+			ResultModel rmDb=this.getBean(PbModelDbServiceImpl.class).findDbTime();
+			String dbTime=rmDb.getData().toString().substring(0,10);
+			String v_process_no="F"+dbTime.substring(2, 4)+dbTime.substring(5, 7)+dbTime.substring(8, 10)+lpad(v_machine_mark,2,"0");
+			Integer count=this.getMapper(MesCrSlittingMMapper.class).findByProces(v_process_no,"");
+			if(count==null){
+				count=1;//当天的第一条
+			}
+			//  --(7.4)、生产处理号PROCESS_NO的生成规则:固定1位大写字母'F' + 6位日期(YYMMDD) + 2位纵剪设备编号(1) + 3位流水号(001 - 999)
+			v_process_no=v_process_no+lpad(count+"",3,"0");
+			//  --(8)、根据当前时刻,计算日期班次
+			String wrk_date=null,wrk_ord=null,wrk_grp=null;
+			if("200".equals(rmDb.getState())){
+				dbTime=rmDb.getData().toString().substring(11);
+				wrk_date=rmDb.getData().toString().substring(0,10);
+				
+				if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+					wrk_ord="1";
+				}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+					wrk_ord="2";
+				}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+					wrk_ord="1";
+					SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+					Date date;
+					try {
+						date = formatYmd.parse(wrk_date);
+					} catch (Exception e) {
+						throw new Exception("获取数据库时间失败,请稍后重试");
+					}
+					Calendar c = Calendar.getInstance();  
+	    	        c.setTime(date);  
+	    	        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+					wrk_date=formatYmd.format(c.getTime());
+				}
+			}else{
+				throw new Exception("获取数据库时间失败!请稍后重试");
+			}
+			//  --(8.4)、根据计算的日期班次,获取交接班记录的班组
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(wrk_date);
+			msm.setWrk_ord(wrk_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			if(v_cnt<=0){
+				wrk_grp="0";//--暂无交接班记录,则设置为0:常白班,由用户到页面上调整
+			}else{
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				wrk_grp=lmsm.get(0).getWrk_grp();
+			}
+			//  --(9)、获取横切方式(:1:不横切、2:一切二、3:一切三)
+			String v_crs_cut_mode=null;
+			try{
+				v_crs_cut_mode=this.getMapper(PlnProcessPlanMapper.class).findPp1(v_rec_mat_d.get(0).getProd_order_no(), "");
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+			double v_ttl_width=0;
+			double v_ttl_weight=0;
+			List<MesCrSlittingD> lipc=new ArrayList<>();
+			//  --(10)、创建各子卷实绩对象集合 v_rec_slt_d,元素为 mes_cr_slitting_d 对象,缓存PDO各子卷宽度、重量(实重)
+			if(v_rec_pdo_coils.getSlit_1_id()!=null && v_rec_pdo_coils.getWidth_1()!=null 
+					&& v_rec_pdo_coils.getWeigth_1()!=null){
+				//第1卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_1());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_1());//--子卷实绩对象实重赋值
+				mcsm.setXh(1);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_1();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_1();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_1());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_1());
+			}
+			if(v_rec_pdo_coils.getSlit_2_id()!=null && v_rec_pdo_coils.getWidth_2()!=null
+					&& v_rec_pdo_coils.getWeigth_2()!=null){
+				//第2卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_2());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_2());//--子卷实绩对象实重赋值
+				mcsm.setXh(2);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_2();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_2();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_2());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_2());
+			}
+			if(v_rec_pdo_coils.getSlit_3_id()!=null && v_rec_pdo_coils.getWidth_3()!=null
+					&& v_rec_pdo_coils.getWeigth_3()!=null){
+				//第3卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_3());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_3());//--子卷实绩对象实重赋值
+				mcsm.setXh(3);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_3();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_3();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_3());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_3());
+			}
+			if(v_rec_pdo_coils.getSlit_4_id()!=null && v_rec_pdo_coils.getWidth_4()!=null
+					&& v_rec_pdo_coils.getWeigth_4()!=null){
+				//第4卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_4());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_4());//--子卷实绩对象实重赋值
+				mcsm.setXh(4);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_4();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_4();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_4());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_4());
+			}
+			if(v_rec_pdo_coils.getSlit_5_id()!=null && v_rec_pdo_coils.getWidth_5()!=null
+					&& v_rec_pdo_coils.getWeigth_5()!=null){
+				//第5卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_5());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_5());//--子卷实绩对象实重赋值
+				mcsm.setXh(5);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_5();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_5();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_5());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_5());
+			}
+			if(v_rec_pdo_coils.getSlit_6_id()!=null && v_rec_pdo_coils.getWidth_6()!=null
+					&& v_rec_pdo_coils.getWeigth_6()!=null){
+				//第6卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_6());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_6());//--子卷实绩对象实重赋值
+				mcsm.setXh(6);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_6();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_6();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_6());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_6());
+			}
+			if(v_rec_pdo_coils.getSlit_7_id()!=null && v_rec_pdo_coils.getWidth_7()!=null
+					&& v_rec_pdo_coils.getWeigth_7()!=null){
+				//第7卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_7());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_7());//--子卷实绩对象实重赋值
+				mcsm.setXh(7);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_7();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_7();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_7());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_7());
+			}
+			if(v_rec_pdo_coils.getSlit_8_id()!=null && v_rec_pdo_coils.getWidth_8()!=null
+					&& v_rec_pdo_coils.getWeigth_8()!=null){
+				//第8卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_8());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_8());//--子卷实绩对象实重赋值
+				mcsm.setXh(8);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_8();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_8();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_8());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_8());
+			}
+			if(v_rec_pdo_coils.getSlit_9_id()!=null && v_rec_pdo_coils.getWidth_9()!=null
+					&& v_rec_pdo_coils.getWeigth_9()!=null){
+				//第9卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_9());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_9());//--子卷实绩对象实重赋值
+				mcsm.setXh(9);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_9();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_9();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_9());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_9());
+			}
+			if(v_rec_pdo_coils.getSlit_10_id()!=null && v_rec_pdo_coils.getWidth_10()!=null
+					&& v_rec_pdo_coils.getWeigth_10()!=null){
+				//第10卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_10());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_10());//--子卷实绩对象实重赋值
+				mcsm.setXh(10);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_10();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_10();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_10());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_10());
+			}
+			if(v_rec_pdo_coils.getSlit_11_id()!=null && v_rec_pdo_coils.getWidth_11()!=null
+					&& v_rec_pdo_coils.getWeigth_11()!=null){
+				//第11卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_11());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_11());//--子卷实绩对象实重赋值
+				mcsm.setXh(11);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_11();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_11();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_11());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_11());
+			}
+			if(v_rec_pdo_coils.getSlit_12_id()!=null && v_rec_pdo_coils.getWidth_12()!=null
+					&& v_rec_pdo_coils.getWeigth_12()!=null){
+				//第12卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_12());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_12());//--子卷实绩对象实重赋值
+				mcsm.setXh(12);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_12();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_12();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_12());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_12());
+			}
+			if(v_rec_pdo_coils.getSlit_13_id()!=null && v_rec_pdo_coils.getWidth_13()!=null
+					&& v_rec_pdo_coils.getWeigth_13()!=null){
+				//第13卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_13());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_13());//--子卷实绩对象实重赋值
+				mcsm.setXh(13);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_13();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_13();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_13());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_13());
+			}
+			if(v_rec_pdo_coils.getSlit_14_id()!=null && v_rec_pdo_coils.getWidth_14()!=null
+					&& v_rec_pdo_coils.getWeigth_14()!=null){
+				//第14卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_14());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_14());//--子卷实绩对象实重赋值
+				mcsm.setXh(14);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_14();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_14();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_14());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_14());
+			}
+			if(v_rec_pdo_coils.getSlit_15_id()!=null && v_rec_pdo_coils.getWidth_15()!=null
+					&& v_rec_pdo_coils.getWeigth_15()!=null){
+				//第15卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_15());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_15());//--子卷实绩对象实重赋值
+				mcsm.setXh(15);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_15();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_15();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_15());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_15());
+			}
+			if(v_rec_pdo_coils.getSlit_16_id()!=null && v_rec_pdo_coils.getWidth_16()!=null
+					&& v_rec_pdo_coils.getWeigth_16()!=null){
+				//第16卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_16());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_16());//--子卷实绩对象实重赋值
+				mcsm.setXh(16);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_16();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_16();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_16());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_16());
+			}
+			if(v_rec_pdo_coils.getSlit_17_id()!=null && v_rec_pdo_coils.getWidth_17()!=null
+					&& v_rec_pdo_coils.getWeigth_17()!=null){
+				//第17卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_17());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_17());//--子卷实绩对象实重赋值
+				mcsm.setXh(17);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_17();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_17();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_17());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_17());
+			}
+			if(v_rec_pdo_coils.getSlit_18_id()!=null && v_rec_pdo_coils.getWidth_18()!=null
+					&& v_rec_pdo_coils.getWeigth_18()!=null){
+				//第18卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_18());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_18());//--子卷实绩对象实重赋值
+				mcsm.setXh(18);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_18();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_18();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_18());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_18());
+			}
+			if(v_rec_pdo_coils.getSlit_19_id()!=null && v_rec_pdo_coils.getWidth_19()!=null
+					&& v_rec_pdo_coils.getWeigth_19()!=null){
+				//第19卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_19());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_19());//--子卷实绩对象实重赋值
+				mcsm.setXh(19);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_19();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_19();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_19());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_19());
+			}
+			if(v_rec_pdo_coils.getSlit_20_id()!=null && v_rec_pdo_coils.getWidth_20()!=null
+					&& v_rec_pdo_coils.getWeigth_20()!=null){
+				//第20卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_20());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_20());//--子卷实绩对象实重赋值
+				mcsm.setXh(20);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_20();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_20();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_20());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_20());
+			}
+			if(v_rec_pdo_coils.getSlit_21_id()!=null && v_rec_pdo_coils.getWidth_21()!=null
+					&& v_rec_pdo_coils.getWeigth_21()!=null){
+				//第21卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_21());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_21());//--子卷实绩对象实重赋值
+				mcsm.setXh(21);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_21();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_21();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_21());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_21());
+			}
+			if(v_rec_pdo_coils.getSlit_22_id()!=null && v_rec_pdo_coils.getWidth_22()!=null
+					&& v_rec_pdo_coils.getWeigth_22()!=null){
+				//第22卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_22());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_22());//--子卷实绩对象实重赋值
+				mcsm.setXh(22);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_22();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_22();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_22());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_22());
+			}
+			if(v_rec_pdo_coils.getSlit_23_id()!=null && v_rec_pdo_coils.getWidth_23()!=null
+					&& v_rec_pdo_coils.getWeigth_23()!=null){
+				//第23卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_23());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_23());//--子卷实绩对象实重赋值
+				mcsm.setXh(23);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_23();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_23();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_23());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_23());
+			}
+			if(v_rec_pdo_coils.getSlit_24_id()!=null && v_rec_pdo_coils.getWidth_24()!=null
+					&& v_rec_pdo_coils.getWeigth_24()!=null){
+				//第24卷
+				MesCrSlittingD mcsm=new MesCrSlittingD();
+				mcsm.setAct_wdt(v_rec_pdo_coils.getWidth_24());//--子卷实绩对象宽度赋值
+				mcsm.setCoil_act_wgt(v_rec_pdo_coils.getWeigth_24());//--子卷实绩对象实重赋值
+				mcsm.setXh(24);
+				lipc.add(mcsm);
+				//v_ttl_width+=v_rec_pdo_coils.getWidth_24();//--计算宽度之和
+				//v_ttl_weight+=v_rec_pdo_coils.getWeigth_24();//--计算实重之和
+				v_ttl_width=DoubleUtil.add(v_ttl_width, v_rec_pdo_coils.getWidth_24());
+				v_ttl_weight=DoubleUtil.add(v_ttl_weight, v_rec_pdo_coils.getWeigth_24());
+			}
+			//  --(11)、获取横切方式(:1:不横切、2:一切二、3:一切三)
+			if(lipc.size()<=0 || v_ttl_width<=0){
+				v_message="无子卷信息,或子卷宽度之和≤0!";
+				return v_message;
+			}
+			//2018-09-06 
+			if(v_ttl_weight<=0){
+				v_message="子卷重量之和≤0!";
+				return v_message;
+			}
+			
+			//==2018-11-21==
+			if(v_rec_slt_m.size()>0){
+				if(v_rec_slt_m.get(0).getProcess_no()!=null){
+					List<MesCrSlittingD> list = this.getMapper(MesCrSlittingDMapper.class).findWithCondition(null, 
+							"process_no='"+v_rec_slt_m.get(0).getProcess_no()+"'", null, 0, 0);
+					if(list!=null && list.size()>0){
+						MesCrSlittingM mcsm2=new MesCrSlittingM();
+						mcsm2.setProcess_no(v_rec_slt_m.get(0).getProcess_no());
+						mcsm2.setTime_loading_time(v_rec_pdo_coils.getTime_loading_time());//上料时长(sec)																																							
+						//mcsm.setUncoil_time(v_rec_pdo_coils.getUncoil_time());//开卷时长(sec)																																							
+//						mcsm.setCut_str_time(v_rec_pdo_coils.getLengthways_cutting_time());//纵切开始时刻																																							
+//						mcsm.setCut_end_time(v_rec_pdo_coils.getFinished_time_cuting());//纵切结束时刻	
+						mcsm2.setCut_str_time(v_rec_pdo_coils.getSliting_start_time());//纵切开始时刻	
+						mcsm2.setCut_end_time(v_rec_pdo_coils.getSliting_end_time());//纵切结束时刻	
+						mcsm2.setDecoil_time(v_rec_pdo_coils.getDecoil_time());//开卷时间
+						
+						mcsm2.setDecoil_tension_max(v_rec_pdo_coils.getMax_uncoiler_tension());//开卷张力最大值(Newton/mm2)																																							
+						mcsm2.setDecoil_tension_min(v_rec_pdo_coils.getMin_uncoiler_tension());//开卷张力最小值(Newton/mm2)																																							
+						mcsm2.setDecoil_tension(v_rec_pdo_coils.getAverage_uncoiler_tension());//开卷张力平均值(Newton/mm2)																																							
+						mcsm2.setThread_speed_max(v_rec_pdo_coils.getMax_coil_cross_speed());//穿带速度最大值(m/min)																																							
+						mcsm2.setProcess_speed_max(v_rec_pdo_coils.getMax_line_speed());//线速度最大值(m/min)																																							
+						mcsm2.setProcess_speed_min(v_rec_pdo_coils.getMin_line_speed());//线速度最小值(m/min)																																							
+						mcsm2.setProcess_speed(v_rec_pdo_coils.getAverage_line_speed());//线速度平均值(m/min)																																							
+						mcsm2.setCoil_tension_max(v_rec_pdo_coils.getMax_recoiler_tension());//收卷张力最大值(Newton/mm2)																																							
+						mcsm2.setCoil_tension_min(v_rec_pdo_coils.getMin_recoiler_tension());//收卷张力最小值(Newton/mm2)																																							
+						mcsm2.setCoil_tension(v_rec_pdo_coils.getAverage_recoiler_tension());//收卷张力平均值(Newton/mm2)																																							
+						mcsm2.setEnergy_expended_coil_process(v_rec_pdo_coils.getEnergy_expended_coil_process());//电耗(kwh)	
+						mcsm2.setUpdate_opr("L2_PDO");
+						mcsm2.setUpdate_time(new Date());
+						//  --(14)、插入分条主实绩
+						this.getMapper(MesCrSlittingMMapper.class).update(mcsm2);
+						
+						v_message="投料卷号【"+v_rec_pdo_coils.getEntry_coil_id()+"】已存在分条子卷实绩,忽略此PDO子卷实绩!";
+						return v_message;
+					}
+				}
+			}
+			
+			MesCrSlittingM mcsm=new MesCrSlittingM();
+			//--(12)、v_rec_slt_m 对象为可能存在的分条主实绩(前面已获取)																																							
+			//--(12.1)、如果对象不为空,并且对象的 process_no 属性不为空:
+			if(v_rec_slt_m.size()>0){
+				if(v_rec_slt_m.get(0).getProcess_no()!=null){
+					mcsm=v_rec_slt_m.get(0);
+					//    --(12.2)、删除可能存在的分条子卷实绩
+					MesCrSlittingD d=new MesCrSlittingD();
+					d.setProcess_no(v_rec_slt_m.get(0).getProcess_no());
+					this.getMapper(MesCrSlittingDMapper.class).doDelete(d);
+					//    --(12.3)、删除可能存在的分条主实绩
+					this.getMapper(MesCrSlittingMMapper.class).delete(v_rec_slt_m.get(0).getProcess_no());
+				}
+			}
+			//  --(13)、在 v_rec_slt_m 对象基础上,构建分条主记录:保留原有吊销卷等相关信息
+			//v_rec_slt_m.get
+			//MesCrSlittingM mcsm=new MesCrSlittingM();
+			//mcsm=v_rec_slt_m.get(0);
+			mcsm.setProcess_no(v_process_no);
+			mcsm.setMachine_code(v_mch_code);
+			mcsm.setSchedule_no(v_rec_pln_d.get(0).getLw_plan_no());
+			mcsm.setInner_seq(v_rec_pln_d.get(0).getLw_seq());//Long转int
+			mcsm.setMaterial_no_vt(v_rec_mat_d.get(0).getObject_no_vt());
+			mcsm.setPln_steel_code(v_rec_mat_d.get(0).getSteel_code());
+			mcsm.setPln_mtr_thk(v_rec_mat_d.get(0).getThick());
+			mcsm.setPln_mtr_wdt(v_rec_mat_d.get(0).getWidth());
+			mcsm.setPln_mtr_len(v_rec_mat_d.get(0).getLength());
+			mcsm.setPln_mtr_inn_dia(v_rec_mat_d.get(0).getDiameter_inn());
+			mcsm.setPln_mtr_out_dia(v_rec_mat_d.get(0).getDiameter_out());
+			mcsm.setPln_mtr_thr_wgt(v_rec_mat_d.get(0).getSingle_weight());
+			mcsm.setMaterial_no(v_rec_pdo_coils.getEntry_coil_id());
+			mcsm.setSteel_code(v_rec_ydm_d.get(0).getSteelcode());
+			mcsm.setMtr_thk(v_rec_ydm_d.get(0).getThick());
+			mcsm.setMtr_wdt(v_rec_ydm_d.get(0).getWidth());
+			mcsm.setMtr_len(v_rec_ydm_d.get(0).getLength());
+			mcsm.setMtr_inn_dia(v_rec_ydm_d.get(0).getDiameter_inn());
+			mcsm.setMtr_out_dia(v_rec_ydm_d.get(0).getDiameter_out());
+			if(v_rec_ydm_d.get(0).getTheoryweight()!=null){
+				mcsm.setMtr_thr_wgt(v_rec_ydm_d.get(0).getTheoryweight());
+			}else{
+				mcsm.setMtr_thr_wgt(v_rec_ydm_d.get(0).getFactweight());
+			}
+			mcsm.setMtr_act_wgt(v_rec_ydm_d.get(0).getFactweight());
+			mcsm.setWrk_date(wrk_date);
+			mcsm.setWrk_ord(wrk_ord);
+			if(!"0".equals(wrk_grp) && v_rec_slt_m!=null && v_rec_slt_m.size()>0 && v_rec_slt_m.get(0).getWrk_grp()==null){
+				mcsm.setWrk_grp(wrk_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)
+			}
+			if(mcsm.getFeeding_time()==null){
+				//    --原上料时间为空,才更新为当前时刻
+				mcsm.setFeeding_time(new Date());
+			}
+			if(mcsm.getCrs_cut_mode()==null){
+				mcsm.setCrs_cut_mode(v_crs_cut_mode);// --横切方式(:1:不横切、2:一切二、3:一切三)
+			}
+			//2018-08-21
+			mcsm.setTime_loading_time(v_rec_pdo_coils.getTime_loading_time());//上料时长(sec)																																							
+			//mcsm.setUncoil_time(v_rec_pdo_coils.getUncoil_time());//开卷时长(sec)																																							
+//			mcsm.setCut_str_time(v_rec_pdo_coils.getLengthways_cutting_time());//纵切开始时刻																																							
+//			mcsm.setCut_end_time(v_rec_pdo_coils.getFinished_time_cuting());//纵切结束时刻	
+			mcsm.setCut_str_time(v_rec_pdo_coils.getSliting_start_time());//纵切开始时刻	
+			mcsm.setCut_end_time(v_rec_pdo_coils.getSliting_end_time());//纵切结束时刻	
+			mcsm.setDecoil_time(v_rec_pdo_coils.getDecoil_time());//开卷时间
+			
+			mcsm.setDecoil_tension_max(v_rec_pdo_coils.getMax_uncoiler_tension());//开卷张力最大值(Newton/mm2)																																							
+			mcsm.setDecoil_tension_min(v_rec_pdo_coils.getMin_uncoiler_tension());//开卷张力最小值(Newton/mm2)																																							
+			mcsm.setDecoil_tension(v_rec_pdo_coils.getAverage_uncoiler_tension());//开卷张力平均值(Newton/mm2)																																							
+			mcsm.setThread_speed_max(v_rec_pdo_coils.getMax_coil_cross_speed());//穿带速度最大值(m/min)																																							
+			mcsm.setProcess_speed_max(v_rec_pdo_coils.getMax_line_speed());//线速度最大值(m/min)																																							
+			mcsm.setProcess_speed_min(v_rec_pdo_coils.getMin_line_speed());//线速度最小值(m/min)																																							
+			mcsm.setProcess_speed(v_rec_pdo_coils.getAverage_line_speed());//线速度平均值(m/min)																																							
+			mcsm.setCoil_tension_max(v_rec_pdo_coils.getMax_recoiler_tension());//收卷张力最大值(Newton/mm2)																																							
+			mcsm.setCoil_tension_min(v_rec_pdo_coils.getMin_recoiler_tension());//收卷张力最小值(Newton/mm2)																																							
+			mcsm.setCoil_tension(v_rec_pdo_coils.getAverage_recoiler_tension());//收卷张力平均值(Newton/mm2)																																							
+			mcsm.setEnergy_expended_coil_process(v_rec_pdo_coils.getEnergy_expended_coil_process());//电耗(kwh)	
+			
+			
+			mcsm.setUpdate_opr("L2_PDO");
+			mcsm.setUpdate_time(new Date());
+			//  --(14)、插入分条主实绩
+			this.getMapper(MesCrSlittingMMapper.class).insert(mcsm);
+			
+			//  --(15)、以下处理子卷实绩:
+			//  --(15.1)、子卷编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(分条F)+ 2位设备代号(01-99)
+			String v_coil_no=v_rec_pdo_coils.getEntry_coil_id().substring(0, 8)+"F"+lpad(v_machine_mark,2,"0");
+			//  --(15.2)、根据已有子卷,获取当前起始流水号
+			v_cnt= this.getMapper(MesCrSlittingDMapper.class).doQueryD(v_coil_no);
+			if(v_cnt==null){
+				v_cnt=1;
+			}else if(v_cnt+lipc.size()-1>99){
+				v_message="子卷号超出规则范围,流水号超出最大值99!";
+				throw new Exception(v_message);
+			}
+			//
+			double v_tmp_weight = 0; // --清零
+		    // --(15.3)、循环上面创建的子卷对象集合(JAVA编码时,使用集合对象,一定要按子卷的真实顺序排序)
+			//v_rec_slt_m.get(0) 為 mcsm
+			//对子卷集合排序
+			MesUtil.sortIntMethod(lipc);  
+			int i=0;
+			for(MesCrSlittingD mcsd:lipc){
+				i++;
+				//--(15.4)、子卷编码规则:子卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(分条F)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)
+				v_coil_no=v_rec_pdo_coils.getEntry_coil_id().substring(0, 8)+"F"+lpad(v_machine_mark,2,"0")+lpad(v_cnt+"",2,"0");
+				mcsd.setCoil_no(v_coil_no);
+				mcsd.setProcess_no(mcsm.getProcess_no());
+				mcsd.setWrk_date(mcsm.getWrk_date());
+				mcsd.setWrk_ord(mcsm.getWrk_ord());
+				mcsd.setWrk_grp(mcsm.getWrk_grp());
+				mcsd.setSteel_code(v_rec_mat_d.get(0).getSteel_code());
+				mcsd.setAim_thk(v_rec_mat_d.get(0).getThick());
+				mcsd.setAim_wdt(mcsd.getAct_wdt());//--目标宽度(取实际宽度)
+				mcsd.setAim_len(null);
+				mcsd.setAim_inn_dia(null);
+				mcsd.setAim_out_dia(null);
+				//2018-08-19
+				//mcsd.setAct_thk(v_rec_mat_d.get(0).getThick());
+				mcsd.setAct_thk(v_rec_ydm_d.get(0).getThick());
+				
+				mcsd.setAct_len(null);
+				//mcsd.setAct_inn_dia(null);
+				//mcsd.setAct_out_dia(null);
+				mcsd.setAct_inn_dia(v_rec_pdo_coils.getBabys_inner_diameter());
+				mcsd.setAct_out_dia(v_rec_pdo_coils.getBabys_outer_diameter());
+				
+				
+				//根据前端传入的子卷卷号集合,按各子卷的宽度占勾选的所有子卷的宽度和的比例,对重量进行分摊,
+				//当做勾选的当个子卷的重量,同时,将上面创建的记录称重编号写入子卷实绩,方便信息反查
+				//四舍五入
+				BigDecimal b= new BigDecimal((mcsd.getCoil_act_wgt()/v_ttl_weight)*v_rec_mat_d.get(0).getSingle_weight());  
+				double f1 = b.setScale(0,   BigDecimal.ROUND_HALF_UP).doubleValue();
+				if(i==lipc.size()){
+					//  --最后一套:原料卷总重 - ∑(前N-1卷理重)
+					if(v_rec_mat_d.get(0).getSingle_weight()-v_tmp_weight<=0){
+						f1=0;
+					}else{
+						f1=v_rec_mat_d.get(0).getSingle_weight()-v_tmp_weight;
+					}
+				}else{
+					v_tmp_weight+=f1;
+				}
+				mcsd.setCoil_thr_wgt(f1);
+				mcsd.setProduce_time(new Date());//--生产时间
+				mcsd.setOrder_no(v_rec_mat_d.get(0).getOrder_no());
+				mcsd.setProd_order_no(v_rec_mat_d.get(0).getProd_order_no());
+				mcsd.setSurface_rst("40740601");//--表面检验结果(SORT_CODE = 407406)
+				mcsd.setPck_flag("0");
+				mcsd.setCreate_opr("L2_PDO");
+				mcsd.setCreate_time(new Date());
+				//子卷称重时间
+				//mcsd.setCoil_wgt_time(new Date());
+				//因为从L2收集的磅重不准,赋值为0d
+				mcsd.setCoil_act_wgt(0d);
+				//mcsd.setCoil_act_wgt(null);
+				//    --(15.5)、插入分条子卷实绩
+				this.getMapper(MesCrSlittingDMapper.class).insert(mcsd);
+				//    --(15.6)、子卷号中流水号加1
+				v_cnt=v_cnt+1;
+			}
+			//  --(16)、追加一条边丝物料实绩:
+			//  --(16.1)、边丝编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(分条F)+ 2位设备代号(01-99)
+//			v_coil_no=v_rec_pdo_coils.getEntry_coil_id().substring(0, 8)+"F"+lpad(v_machine_mark,2,"0");
+//			//  --(16.2)、根据已有边丝,获取边丝物料编号流水号
+//			v_cnt=this.getMapper(MesCrSlittingDMapper.class).doQuery2(v_coil_no);
+//			if(v_cnt==null){
+//				v_cnt=0;
+//			}else if(v_cnt>9){
+//				v_message="边丝物料编号超出规则范围,流水号超出最大值9!";
+//				throw new Exception(v_message);
+//			}
+//			// --(16.3)、边丝编码规则:边丝编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(分条F)+ 2位设备代号(01-99)】+ 1位流水号(0-9) + 'B'
+//			v_coil_no=v_rec_pdo_coils.getEntry_coil_id().substring(0, 8)+"F"+lpad(v_machine_mark,2,"0")+v_cnt+"B";
+			String sNo=v_rec_pdo_coils.getEntry_coil_id().substring(0, 8)+"F"+lpad(v_machine_mark,2,"0");
+			v_coil_no=null;
+			List<MesCrSlittingD> lm_biansi=this.getMapper(MesCrSlittingDMapper.class).findWithCondition
+					(null, " coil_no like '"+sNo+"%' and substr(coil_no, -1) = 'B' ", "coil_no", 0, 0);
+			if(lm_biansi==null||lm_biansi.size()==0){
+				v_cnt=0;
+				v_coil_no=sNo+v_cnt+"B";
+			}else{
+				int i_biansi=0;
+				for(MesCrSlittingD msbe:lm_biansi){
+					int m=Integer.parseInt(msbe.getCoil_no().substring(msbe.getCoil_no().length()-2,msbe.getCoil_no().length()-1));
+					if(i_biansi!=m){
+						//sum.getObject().setEmp_no("E"+String.format("%03d", i));
+						v_coil_no=sNo+i_biansi+"B";
+						break;
+					}
+					i_biansi++;
+					if(i_biansi>9){
+						throw new Exception("边丝物料编号超出规则范围,流水号超出最大值9!");
+					}
+				}
+				if(i_biansi>=lm_biansi.size()){
+					//sum.getObject().setEmp_no("E"+String.format("%03d", i));
+					v_coil_no=sNo+i_biansi+"B";
+				}
+			}
+			
+			
+			MesCrSlittingD d=new MesCrSlittingD();
+			//v_cnt=
+			//  --(16.4)、边丝对象属性赋值(未指定的字段,必须是空值,不能默认值)
+			d.setCoil_no(v_coil_no);
+			d.setProcess_no(mcsm.getProcess_no());
+			d.setWrk_date(mcsm.getWrk_date());
+			d.setWrk_ord(mcsm.getWrk_ord());
+			d.setWrk_grp(mcsm.getWrk_grp());
+			d.setSteel_code(v_rec_mat_d.get(0).getSteel_code());
+			d.setAim_thk(null);
+			d.setAim_wdt(null);
+			d.setAim_len(null);
+			d.setAim_inn_dia(null);
+			d.setAim_out_dia(null);
+			d.setAct_thk(null);
+			d.setAct_wdt(null);
+			d.setAct_len(null);
+			d.setAct_inn_dia(null);
+			d.setAct_out_dia(null);
+			d.setCoil_thr_wgt(null);
+			if(v_rec_mat_d.get(0).getSingle_weight()-v_ttl_weight<=0){
+				d.setCoil_act_wgt(0d);
+			}else{
+				d.setCoil_act_wgt(v_rec_mat_d.get(0).getSingle_weight()-v_ttl_weight);
+			}
+			d.setProduce_time(new Date());
+			d.setOrder_no(null);
+			d.setProd_order_no(null);
+			d.setSurface_rst("40740601");
+			d.setPck_flag("0");
+			d.setCreate_opr("L2_PDO");
+			d.setCreate_time(new Date());
+			//子卷称重时间
+			//d.setCoil_wgt_time(new Date());
+			//因为从L2收集的磅重不准,赋值为0d
+			d.setCoil_act_wgt(0d);
+			//d.setCoil_act_wgt(null);
+			//  --(16.5)、插入边丝子卷实绩
+			this.getMapper(MesCrSlittingDMapper.class).insert(d);
+			
+		    //--(17)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);																																							
+		    //--(17.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+			//???		
+			MesCrSlittingM mcsm1=new MesCrSlittingM();
+			mcsm1.setMachine_code(v_mch_code);//机台号
+			mcsm1.setSchedule_no(v_rec_pln_d.get(0).getLw_plan_no());//作业计划号
+			mcsm1.setMaterial_no(v_rec_pdo_coils.getEntry_coil_id());//投料卷号
+			mcsm1.setMaterial_no_vt(v_rec_mat_d.get(0).getObject_no_vt());//虚拟卷号 
+			// 传入带毫秒的字符串
+			mcsm1.setMemo(createTime);
+			List<MesCrSlittingM> lmcsm=new ArrayList<MesCrSlittingM>();
+			lmcsm.add(mcsm1);
+			//调用生产管理接口验证作业计划状态能执行此操作
+			boolean flag=true;
+			try{
+				this.getBean(MesApiServiceImpl.class).MesCrSlittingMAddValid(lmcsm);
+			}catch(Exception e){
+				flag=false;
+				e.printStackTrace();
+			}
+			if(flag){
+				//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+				this.getBean(MesApiServiceImpl.class).MesCrSlittingMAdd(lmcsm);
+			}
+		    //--(18)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			//--(18.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作	
+			//判断原料卷是否已生产投料出库
+			YdmProductOutlist ypo=new YdmProductOutlist();
+			ypo.setCoilno(v_rec_pdo_coils.getEntry_coil_id());
+			ypo.setOuttype("500501");
+			v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+			if(v_cnt<=0){
+				CommonPage<YdmProductDetail> cp=new CommonPage<YdmProductDetail>();
+				YdmProductDetail ypdu=new YdmProductDetail();
+				ypdu.setCoilno(v_rec_pdo_coils.getEntry_coil_id());//注意
+				// 传入操作时间字符串带毫秒
+				ypdu.setMemo(createTime);
+				cp.setObject(ypdu);
+				this.getBean(LmsApiServiceImpl.class).doOutStorage(cp);
+			}
+			v_message="PDO子卷实绩处理完成!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="PDO子卷实绩处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="PDO子卷实绩处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	public String Receive12mmSlitPDO_Reject_list(List<IfSlit01PdoReject> jsonList){
+		StringBuilder v_message=new StringBuilder();
+		for(IfSlit01PdoReject json:jsonList){
+			v_message.append(json.getMsgcounter()+"-");
+			v_message.append(Receive12mmSlitPDO_Reject(json));
+		}
+		return v_message.toString();
+	}
+	
+	
+	/**
+	 * 1)、	此接口为纯后台逻辑,不与前端页面交互,由L2接口系统收到12mm分条机吊销实绩PDO时调用;																																							
+		2)、	此接口参数为JSON对象(对象结构见数据库表 IF_SLIT01_PDO_REJECT);																																							
+	 * @param v_rec_pdo_coils
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	public String Receive12mmSlitPDO_Reject(IfSlit01PdoReject json){
+		String v_message="";
+
+		IfSlit01PdoReject v_rec_pdo_reject=json;
+		if(json==null){
+			v_message="参数错误:二级接口-12mm纵剪PDO-吊销实绩为空";
+			return v_message;
+		}
+		System.out.println(v_rec_pdo_reject.getMsg_time()+"        ");
+		//  --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_pdo_reject.getMsg_time()==null){
+			v_rec_pdo_reject.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入PDO部分吊销实绩表(单独的事务)
+		try{
+			this.getMapper(IfSlit01PdoRejectMapper.class).insert(v_rec_pdo_reject);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理PDO部分吊销实绩函数(事务在函数内)
+		try{
+			//MesApi12mmPdiPdoImpl mesApi12mmPdiPdoImpl=new MesApi12mmPdiPdoImpl();
+			//v_message=mesApi12mmPdiPdoImpl.Receive12mmSlitPDO_Reject_D(v_rec_pdo_reject, v_message);
+			v_message=this.getBean(MesApi12mmPdiPdoImpl.class).Receive12mmSlitPDO_Reject_D(v_rec_pdo_reject, v_message);
+			//v_message=Receive12mmSlitPDO_Reject_D(v_rec_pdo_reject, v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+			//throw new Exception(e.getMessage());
+		}finally{
+			//  --(5)、拼接返回字符串
+			v_message="入口卷号{"+v_rec_pdo_reject.getEntry_coil_id()+"}"+v_message;
+			//  --(6)、写接口日志:与业务处理分开,单独的事务		
+			try{
+				this.getMapper(IfSlit01LogMapper.class).insertIf_slit01_log(null,"Receive12mmSlitPDO_Reject","",v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+
+	/**
+	 * 此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 Receive12mmSlitPDO_Reject 调用;																																							
+		接口参数 IN:V_REC_PDO_REJECT(PDO吊销实绩实体对象实例)																																							
+		接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdo_reject
+	 * @param v_message
+	 * @return
+	 * @throws Exception 
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Receive12mmSlitPDO_Reject_D(
+			IfSlit01PdoReject v_rec_pdo_reject, String v_message) throws Exception{
+		final String v_mch_code="M0002";
+		Integer v_cnt;
+		//  --(1)、如果对象中入口卷号为空,则返回错误信息
+		if(v_rec_pdo_reject.getEntry_coil_id()==null){
+			v_message="电文入口卷号为空,无法处理!";
+			return v_message;
+		}
+		//  --(2)、如果对象中吊销卷号为空,则返回错误信息
+		if(v_rec_pdo_reject.getRejet_coil_id()==null){
+			v_message="电文吊销卷号为空,无法处理!";
+			return v_message;
+		}
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); 
+		Date creaTime = new Date();
+		String createTime = formatter.format(creaTime);
+		try{
+			//  --处理逻辑思路:																																						
+			//  --按L2系统返回的部分吊销实绩,生成分条业务主数据中相关信息																																						
+			//  --(3)、通过PDO入口卷号,去找分条作业计划明细记录(存在一条记录才合理)
+			v_cnt = this.getMapper(PlnLengthwisePlanDetailMapper.class).countWithCondition(null,
+						"object_no='"+v_rec_pdo_reject.getEntry_coil_id()+"'");
+			if(v_cnt<=0){
+				v_message="分条作业计划明细记录不存在!";
+				return v_message;
+			}else if(v_cnt>=2){
+				v_message="存在2条或以上分条作业计划明细记录!";
+				return v_message;
+			}
+			List<PlnLengthwisePlanDetail> v_rec_pln_d = this.getMapper(PlnLengthwisePlanDetailMapper.class).findWithCondition(null, "object_no='"+v_rec_pdo_reject.getEntry_coil_id()+"'",
+					null, 0, 0);
+			// --(4)、验证分条作业计划主记录
+			v_cnt = this.getMapper(PlnLengthwisePlanMapper.class).countWithCondition(null,"lw_plan_no='"+v_rec_pln_d.get(0).getLw_plan_no()+"'");
+			if(v_cnt<=0){
+				v_message="作业计划号{"+v_rec_pln_d.get(0).getLw_plan_no()+"} 分条作业计划主记录不存在!";
+				return v_message;
+			}
+			List<PlnLengthwisePlan> v_rec_pln_m = this.getMapper(PlnLengthwisePlanMapper.class).findWithCondition(null, "lw_plan_no='"+v_rec_pln_d.get(0).getLw_plan_no()+"'", 
+					null, 0, 0);
+			if(!v_mch_code.equals(v_rec_pln_m.get(0).getMachine_code())){
+				v_message="作业计划号{"+v_rec_pln_m.get(0).getLw_plan_no()+"} 机台代码{"+v_rec_pln_m.get(0).getMachine_code()+"}错误!12mm分条机正确的机台代码为{"+v_mch_code+"}";
+				return v_message;
+			}
+			//--(5)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此PDO部分吊销实绩)
+			List<MesCrSlittingM> v_rec_slt_m=new ArrayList<>();
+			v_cnt = this.getMapper(MesCrSlittingMMapper.class).countWithCondition(null,"schedule_no='"+v_rec_pln_d.get(0).getLw_plan_no()+"' and material_no_vt='"+v_rec_pln_d.get(0).getObject_no_vt()+"'");
+			if(v_cnt>0){
+				v_rec_slt_m= this.getMapper(MesCrSlittingMMapper.class).findWithCondition(null, "schedule_no='"+v_rec_pln_d.get(0).getLw_plan_no()+"' and material_no_vt='"+v_rec_pln_d.get(0).getObject_no_vt()+"'", 
+						null, 0, 0);
+				if("1".equals(v_rec_slt_m.get(0).getHand_over_status())){
+					v_message="作业计划号{"+v_rec_pln_d.get(0).getLw_plan_no()+"} 已生产交工,忽略此PDO部分吊销实绩!";
+					return v_message;
+				}
+			}
+			//  --(6)、验证虚拟物料表中,原料卷计划信息存在
+			v_cnt=this.getMapper(PlnMaterielDetailMapper.class).countWithCondition(null, "object_no_vt='"+v_rec_pln_d.get(0).getObject_no_vt()+"'");
+			if(v_cnt<=0){
+				v_message="虚拟原料卷号{"+v_rec_pln_d.get(0).getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			List<PlnMaterielDetail> v_rec_mat_d = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt='"+v_rec_pln_d.get(0).getObject_no_vt()+"'", null, 0, 0);
+			if(!v_rec_mat_d.get(0).getObject_no().equals(v_rec_pdo_reject.getEntry_coil_id())){
+				v_message="与原料卷虚拟物料信息中钢卷号{"+v_rec_mat_d.get(0).getObject_no()+"}不一致!";
+				return v_message;
+			}
+			//  --(7)、验证原料卷库存明细存在
+			v_cnt = this.getMapper(YdmProductDetailMapper.class).countWithCondition(null,"coilno='"+v_rec_pdo_reject.getEntry_coil_id()+"'");
+			if(v_cnt<=0){
+				v_message="库存明细记录不存在!";
+				return v_message;
+			}
+			List<YdmProductDetail> v_rec_ydm_d = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_pdo_reject.getEntry_coil_id()+"'",
+					null, 0, 0);
+			//  --(8)、验证机台基础信息存在
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).countWithCondition(null,"machine_code='"+v_mch_code+"'");
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 机台基础信息不存在!";
+				return v_message;
+			}
+			//  --(8.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class).findWithCondition(null,
+					"machine_code='"+v_mch_code+"'", null, 0, 0);
+			String v_machine_mark=lcbm.get(0).getMachine_mark();
+			if(v_machine_mark==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法创建作业记录号!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null && v_rec_pln_d.size()>0){
+				if(!("5BLW02".equals(v_rec_pln_d.get(0).getStatus()) || "5BLW03".equals(v_rec_pln_d.get(0).getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.get(0).getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			/*
+			 --(8.2)、大写字母'F' + 6位日期(YYMMDD,取数据库时间) + 2位纵剪设备编号(不足位前面补0)																																							
+	  		 --(8.3)、注意:页面操作的首字母为'S',通过L2实绩自动创建的记录,首字母为'F',以示区别																																							
+			 */
+			ResultModel rmDb=this.getBean(PbModelDbServiceImpl.class).findDbTime();
+			String dbTime=rmDb.getData().toString().substring(0,10);
+			String v_process_no="F"+dbTime.substring(2, 4)+dbTime.substring(5, 7)+dbTime.substring(8, 10)+lpad(v_machine_mark,2,"0");
+			v_cnt=this.getMapper(MesCrSlittingMMapper.class).findByProces(v_process_no,"");
+			if(v_cnt==null){
+				v_cnt=1;//当天的第一条
+			}
+			//  --(8.4)、生产处理号PROCESS_NO的生成规则:固定1位大写字母'F' + 6位日期(YYMMDD) + 2位纵剪设备编号(1) + 3位流水号(001 - 999)
+			v_process_no=v_process_no+lpad(v_cnt+"",3,"0");
+
+			String v_reject_coil_no=null;
+			String process_no=null;
+			// --(9)、计算吊销卷号  ????
+			for(int i=1;i<=9;i++){
+				//    --(9.1)、吊销卷号编码规则:原料卷号(8位最初始原料卷号) + 1位工序代号(分条F)+ 2位设备代号(01-99)+ 'R' + 1位流水(1 - 9)
+				v_reject_coil_no=v_rec_pdo_reject.getEntry_coil_id().substring(0, 8)+"F"+lpad(v_machine_mark,2,"0")+"R"+i;
+				if(v_rec_slt_m!=null && v_rec_slt_m.size()>0){
+					process_no=v_rec_slt_m.get(0).getProcess_no();
+				}
+				//注意!!
+				v_cnt=this.getMapper(MesCrSlittingMMapper.class).doQueryM(process_no,v_reject_coil_no);
+				//  --(9.2)、--吊销卷号未占用
+				if(v_cnt==0){
+					break;
+				}
+			}
+			//  --(9.3)、--吊销卷号无法生成(1-9序号全部被使用)
+			if(v_cnt>0){
+				v_message="吊销卷号生成失败,序号已全部占用!";
+				return v_message;
+			}
+			//  --(10)、根据当前时刻,计算日期班次
+			String wrk_date=null,wrk_ord=null,wrk_grp=null;
+			if("200".equals(rmDb.getState())){
+				dbTime=rmDb.getData().toString().substring(11);
+				wrk_date=rmDb.getData().toString().substring(0,10);
+				
+				if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+					wrk_ord="1";
+				}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+					wrk_ord="2";
+				}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+					wrk_ord="1";
+					SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+					Date date;
+					try {
+						date = formatYmd.parse(wrk_date);
+					} catch (Exception e) {
+						throw new Exception("获取数据库时间失败,请稍后重试");
+					}
+					Calendar c = Calendar.getInstance();  
+	    	        c.setTime(date);  
+	    	        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+					wrk_date=formatYmd.format(c.getTime());
+				}
+			}else{
+				throw new Exception("获取数据库时间失败!请稍后重试");
+			}
+			//  --(10.4)、根据计算的日期班次,获取交接班记录的班组
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(wrk_date);
+			msm.setWrk_ord(wrk_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			if(v_cnt<=0){
+				wrk_grp="0";//    v_wrk_grp := '0'; --暂无交接班记录,则设置为0:常白班,由用户到页面上调整
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				wrk_grp=lmsm.get(0).getWrk_grp();
+			}
+			//  --(11)、获取横切方式(:1:不横切、2:一切二、3:一切三)
+			String v_crs_cut_mode=null;
+			try{
+				v_crs_cut_mode=this.getMapper(PlnProcessPlanMapper.class).findPp1(v_rec_mat_d.get(0).getProd_order_no(), "");
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+			//  --(12)、v_rec_slt_m 对象为可能存在的分条主实绩(前面已获取)																																						
+			//  --(12.1)、如果对象不为空,并且对象的 process_no 属性不为空:即主实绩记录之前已创建过,则更新记录																																						
+			if(v_rec_slt_m!=null && v_rec_slt_m.size()>0 && v_rec_slt_m.get(0).getProcess_no()!=null){
+				//    --(12.2)、更新主实绩中吊销卷信息
+				MesCrSlittingM m=new MesCrSlittingM();
+				m.setPartial_rejected("1");
+				m.setRejected_coil_no(v_reject_coil_no);
+				m.setProcess_no(v_rec_slt_m.get(0).getProcess_no());
+				m.setRejected_coil_act_wgt(v_rec_pdo_reject.getRejet_coil_weight());
+				m.setRejected_coil_len(v_rec_pdo_reject.getRejet_coil_lenght());
+				m.setUpdate_opr("L2_PDO");
+				m.setUpdate_time(new Date());
+				this.getMapper(MesCrSlittingMMapper.class).update(m);
+			}else{
+				//    --(12.3)、否则,创建 v_rec_slt_m 对象实例,构建分条主实绩记录   ??
+				MesCrSlittingM mm=new MesCrSlittingM();
+			    //mm=v_rec_slt_m.get(0); // ??
+				mm.setProcess_no(v_process_no);
+				mm.setMachine_code(v_mch_code);
+				mm.setSchedule_no(v_rec_pln_d.get(0).getLw_plan_no());
+				mm.setInner_seq(v_rec_pln_d.get(0).getLw_seq());
+				mm.setMaterial_no_vt(v_rec_mat_d.get(0).getObject_no_vt());
+				mm.setPln_steel_code(v_rec_mat_d.get(0).getSteel_code());
+				mm.setPln_mtr_thk(v_rec_mat_d.get(0).getThick());
+				mm.setPln_mtr_wdt(v_rec_mat_d.get(0).getWidth());
+				mm.setPln_mtr_len(v_rec_mat_d.get(0).getLength());
+				mm.setPln_mtr_inn_dia(v_rec_mat_d.get(0).getDiameter_inn());
+				mm.setPln_mtr_out_dia(v_rec_mat_d.get(0).getDiameter_out());
+				mm.setPln_mtr_thr_wgt(v_rec_mat_d.get(0).getSingle_weight());
+				mm.setMaterial_no(v_rec_pdo_reject.getEntry_coil_id());
+				mm.setSteel_code(v_rec_ydm_d.get(0).getSteelcode());
+				mm.setMtr_thk(v_rec_ydm_d.get(0).getThick());
+				mm.setMtr_wdt(v_rec_ydm_d.get(0).getWidth());
+				mm.setMtr_len(v_rec_ydm_d.get(0).getLength());
+				mm.setMtr_inn_dia(v_rec_ydm_d.get(0).getDiameter_inn());
+				mm.setMtr_out_dia(v_rec_ydm_d.get(0).getDiameter_out());
+				if(v_rec_ydm_d.get(0).getTheoryweight()!=null){
+					mm.setMtr_thr_wgt(v_rec_ydm_d.get(0).getTheoryweight());
+				}else{
+					mm.setMtr_thr_wgt(v_rec_ydm_d.get(0).getFactweight());
+				}
+				mm.setMtr_act_wgt(v_rec_ydm_d.get(0).getFactweight());
+				mm.setWrk_date(wrk_date);
+				mm.setWrk_ord(wrk_ord);
+				if(wrk_grp!=null && !"0".equals(wrk_grp)){
+					//      --不为空且不为常白班,才更新
+					mm.setWrk_grp(wrk_grp);
+				}
+				if(v_rec_slt_m==null || v_rec_slt_m.size()<=0 
+						|| v_rec_slt_m.get(0).getFeeding_time()==null){
+				      //--原上料时间为空,才更新为当前时刻
+					mm.setFeeding_time(new Date());
+				}
+				if(mm.getCrs_cut_mode()==null){
+					mm.setCrs_cut_mode(v_crs_cut_mode);
+				}
+				mm.setPartial_rejected("1");//--部分原料卷吊销(1是、0否)
+				mm.setRejected_coil_no(v_reject_coil_no);//--吊销卷号
+				//2018-08-21
+				mm.setRejected_coil_thr_wgt(v_rec_pdo_reject.getRejet_coil_weight());//吊销卷理重
+				mm.setRejected_coil_act_wgt(v_rec_pdo_reject.getRejet_coil_weight());
+				mm.setRejected_coil_len(v_rec_pdo_reject.getRejet_coil_lenght());
+				mm.setUpdate_opr("L2_PDO");
+				mm.setUpdate_time(new Date());
+				//    --(12.4)、插入分条主实绩
+				this.getMapper(MesCrSlittingMMapper.class).insert(mm);
+				
+			    // --(12.5)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);																																						
+				//????	
+				MesCrSlittingM mcsm=new MesCrSlittingM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.get(0).getLw_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_pdo_reject.getEntry_coil_id());//投料卷号         吊销卷??还是入口卷号
+				//mcsm.setMaterial_no(mm.getRejected_coil_no());
+				mcsm.setMaterial_no_vt(v_rec_mat_d.get(0).getObject_no_vt());//虚拟卷号 
+				// 传入带毫秒的字符串
+				mcsm.setMemo(createTime);
+				List<MesCrSlittingM> lmcsm=new ArrayList<MesCrSlittingM>();
+				lmcsm.add(mcsm);
+//				//调用生产管理接口验证作业计划状态能执行此操作
+//				this.getBean(MesApiServiceImpl.class).MesCrSlittingMAddValid(lmcsm);
+//				//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+//				this.getBean(MesApiServiceImpl.class).MesCrSlittingMAdd(lmcsm);
+				//2018-09-17
+				//调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag=true;
+				try{
+					this.getBean(MesApiServiceImpl.class).MesCrSlittingMAddValid(lmcsm);
+				}catch(Exception e){
+					flag=false;
+					e.printStackTrace();
+				}
+				if(flag){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiServiceImpl.class).MesCrSlittingMAdd(lmcsm);
+				}
+				
+				// --(12.6)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);	??吊销卷
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_pdo_reject.getEntry_coil_id());
+				//ypo.setCoilno(mm.getRejected_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_pdo_reject.getEntry_coil_id());//注意     是吊销卷吗??还是入口卷
+					//ypdu.setCoilno(mm.getRejected_coil_no());
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(createTime);
+					cp.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp);
+				}
+				
+			}
+			//  --(13)、提交事务
+			v_message="PDO部分吊销实绩处理完成!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="PDO部分吊销实绩处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="PDO部分吊销实绩处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	public String Receive12mmSlitPDO_Shift_list(List<IfSlit01PdoShift> jsonList){
+		StringBuilder v_message=new StringBuilder();
+		for(IfSlit01PdoShift json:jsonList){
+			v_message.append(json.getMsgcounter()+"-");
+			v_message.append(Receive12mmSlitPDO_Shift(json));
+			v_message.append(";");
+		}
+		return v_message.toString();
+	}
+	/**
+	 此接口为纯后台逻辑,不与前端页面交互,由L2接口系统收到12mm分条机班报实绩PDO时调用;																																							
+	此接口参数为JSON对象(对象结构见数据库表 IF_SLIT01_PDO_SHIFT);																																	
+	 * @param v_rec_pdo_coils
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	public String Receive12mmSlitPDO_Shift(IfSlit01PdoShift json){
+		String v_message="";
+		IfSlit01PdoShift v_rec_pdo_shift=json;
+		/**
+		 * 注意:因为老外的表没有wrk_date作业时间字段,用他传过来的mes_time字段作为wrk_date
+		 */
+		if(json==null ){
+			v_message="参数错误:二级接口-12mm纵剪PDO-班报为空";
+			//v_message="500";
+			return v_message;
+		}
+		
+		//  --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_pdo_shift.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_pdo_shift.setMsg_time(new Date());
+		}
+		//用他传过来的mes_time字段作为wrk_date
+		v_rec_pdo_shift.setWrk_date(DateUtil.formatDate(v_rec_pdo_shift.getMsg_time(), "yyyy-MM-dd HH:mm:ss"));
+		//  --(3)、将对象,插入PDO班报实绩表(单独的事务)
+		try{
+			this.getMapper(IfSlit01PdoShiftMapper.class).insert(v_rec_pdo_shift);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理PDO班报实绩函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApi12mmPdiPdoImpl.class).Receive12mmSlitPDO_Shift_D(v_rec_pdo_shift,v_message);
+			//this.getSqlSession("sqlSessionFactory").getConnection().
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+			//throw new Exception(e.getMessage());
+		}finally{
+			//  --(5)、拼接返回字符串
+			v_message = "报告时间{"+v_rec_pdo_shift.getWrk_date()+"}"+v_message;	
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfSlit01LogMapper.class).insertIf_slit01_log(null,"Receive12mmSlitPDO_Shift","",v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Receive12mmSlitPDO_Shift_D(IfSlit01PdoShift v_rec_pdo_shift,
+			String v_message) throws Exception {
+		final String v_mch_code="M0002";
+		Integer v_cnt;
+		//  --(1)、如果对象中日期时间为空,则返回错误信息
+		if(v_rec_pdo_shift.getWrk_date()==null || "".equals(v_rec_pdo_shift.getWrk_date())){
+			v_message="电文报告时间为空,无法处理!";
+			return v_message;
+		}
+		try{
+		//  --(2)、根据报告时间,计算日期班次
+//			Date v_rpt_time = v_rec_pdo_shift.getWrk_date();
+//			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//			String wrkdStr=sdf.format(v_rpt_time);
+			String wrkdStr=v_rec_pdo_shift.getWrk_date();//一定要有yyyy-MM-dd HH:mm:ss时分秒 !!!
+			try{
+				new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(wrkdStr);
+			}catch(Exception e){
+				v_message="参数错误:作业时间【wrk_date】格式应该为【yyyy-MM-dd HH:mm:ss】";
+				return v_message;
+			}
+			String wrk_date=null,wrk_ord=null,wrk_grp=null;
+			String dbTime=wrkdStr.substring(11);
+			wrk_date=wrkdStr.substring(0,10);
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				wrk_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				wrk_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				wrk_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(wrk_date);
+				} catch (Exception e) {
+					throw new Exception("获取数据库时间失败,请稍后重试");
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期加1天
+				wrk_date=formatYmd.format(c.getTime());
+			}
+			//  --(3)、验证岗位交接班统计-分条记录是否存在
+			MesShiftDRptSlt msdr=new MesShiftDRptSlt();
+			msdr.setMachine_code(v_mch_code);
+			msdr.setWrk_date(wrk_date);
+			msdr.setWrk_ord(wrk_ord);
+			v_cnt = this.getMapper(MesShiftDRptSltMapper.class).count(msdr);
+			if(v_cnt>0){
+				//    --(3.1)、存在则更新记录
+				MesShiftDRptSlt md=new MesShiftDRptSlt();
+				md.setMachine_code(v_mch_code);
+				md.setWrk_date(wrk_date);
+				md.setWrk_ord(wrk_ord);
+				md.setTtl_cnt_i(v_rec_pdo_shift.getNumber_input_coil());
+				md.setTtl_wgt_i(v_rec_pdo_shift.getTotal_input_mat_wt());
+				md.setTtl_cnt_o(v_rec_pdo_shift.getNumber_baby_coil());
+				md.setTtl_wgt_o(v_rec_pdo_shift.getTotal_wt_output_mat());
+				md.setTtl_cnt_r(v_rec_pdo_shift.getTotal_rejet_coil());
+				md.setTtl_wgt_r(v_rec_pdo_shift.getTotal_wt_rejet_coil());
+				md.setTime_stp(v_rec_pdo_shift.getStop_line());
+				md.setTime_rdy(v_rec_pdo_shift.getReady_line());
+				md.setTime_prd(v_rec_pdo_shift.getProduction_line());
+				//2018-08-21
+				md.setEnergy_expended_shift(v_rec_pdo_shift.getEnergy_expended_shift());
+				md.setUpdate_opr("L2_PDO");
+				md.setUpdate_time(new Date());
+				this.getMapper(MesShiftDRptSltMapper.class).update(md);
+			}else{
+				//    --(3.2)、不存在则插入记录
+				MesShiftDRptSlt md1=new MesShiftDRptSlt();
+				md1.setMachine_code(v_mch_code);
+				md1.setWrk_date(wrk_date);
+				md1.setWrk_ord(wrk_ord);
+				md1.setTtl_cnt_i(v_rec_pdo_shift.getNumber_input_coil());
+				md1.setTtl_wgt_i(v_rec_pdo_shift.getTotal_input_mat_wt());
+				md1.setTtl_cnt_o(v_rec_pdo_shift.getNumber_baby_coil());
+				md1.setTtl_wgt_o(v_rec_pdo_shift.getTotal_wt_output_mat());
+				md1.setTtl_cnt_r(v_rec_pdo_shift.getTotal_rejet_coil());
+				md1.setTtl_wgt_r(v_rec_pdo_shift.getTotal_wt_rejet_coil());
+				md1.setTime_stp(v_rec_pdo_shift.getStop_line());
+				md1.setTime_rdy(v_rec_pdo_shift.getReady_line());
+				md1.setTime_prd(v_rec_pdo_shift.getProduction_line());
+				//2018-08-21
+				md1.setEnergy_expended_shift(v_rec_pdo_shift.getEnergy_expended_shift());
+				md1.setUpdate_opr("L2_PDO");
+				md1.setUpdate_time(new Date());
+				this.getMapper(MesShiftDRptSltMapper.class).insert(md1);
+			}
+			//  --(4)、提交事务
+			v_message="PDO班报实绩处理完成!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="PDO班报实绩处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="PDO班报实绩处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		纵剪生产跟踪表																												
+	 * @param MesCrSlittingTrc
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	public String Receive12mmMesCrSlitTrc(MesCrSlittingTrc json){
+		String v_message="";
+		MesCrSlittingTrc v_rec_slit_trc=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-纵剪生产跟踪为空";
+			return v_message;
+		}
+		//大纵剪的机台代码
+        final String machine_code="M0002";		
+        v_rec_slit_trc.setMachine_code(machine_code);
+        //更新时间(L3)
+        v_rec_slit_trc.setUpdate_time_l3(new Date());
+		try{
+		    int count = this.getMapper(MesCrSlittingTrcMapper.class).countWithCondition(null,"machine_code='"+machine_code+"'");
+			if(count<=0){
+				this.getMapper(MesCrSlittingTrcMapper.class).insert(v_rec_slit_trc);
+			}else{
+				this.getMapper(MesCrSlittingTrcMapper.class).doUpdate(v_rec_slit_trc);
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
+		String update_time_l3 = formatter.format(v_rec_slit_trc.getUpdate_time_l3());
+		//拼接返回字符串
+		v_message = "入口卷号{"+v_rec_slit_trc.getEntry_coil_id()+"},更新时间(L3){"+update_time_l3+"}纵剪生产跟踪成功";	
+		//写接口日志:与业务处理分开,单独的事务
+//		try{
+//			 this.getMapper(IfSlit01LogMapper.class).insertIf_slit01_log(null,"Receive12mmMesCrSlitTrc","",v_message);
+//		}catch(Exception e){
+//			e.printStackTrace();
+//		}
+		return v_message;
+	}
+	
+
+	// 补零
+	public static String lpad(String str, int num, String pad) {
+		String n_str = str;
+		if (str == null && "".equals(str))
+			n_str = " ";
+		for (int i = str.length(); i < num; i++) {
+			n_str = pad + n_str;
+		}
+		return n_str;
+	}
+	
+	
+//	public ResultModel test(){
+//		String t=null;
+//		Integer v_cnt;
+//		v_cnt = this.getMapper(YdmProductDetailMapper.class).countWithCondition(null,"coilno='"+t+"'");
+//		return null;
+//	}
+	
+//	public void testgetObjectJson(){
+//		List<IfSlit01PdoCoils> list = this.getMapper(IfSlit01PdoCoilsMapper.class).findWithCondition(null, "", "msg_time desc", 0, 0);
+//		
+////		JsonConfig jsonConfig=new JsonConfig();
+////		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+////		jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+////		jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+////		jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+////		JSONObject jsonObject=JSONObject.fromObject(list.get(0),jsonConfig);
+//		//System.out.println(jsonObject.toString());
+//		Receive12mmSlitPDO_Coils(list.get(0));
+//	}
+	
+	/*
+	 * https://blog.csdn.net/soonfly/article/details/70305683
+	 * 事务属性之7种传播行为   非常重要@!!!
+	 */
+//	//测试Receive12mmSlitPDO_Coils接口
+//	public ResultModel test_Receive12mmSlitPDO_Coils(Object json){
+//		//String json="{\"entry_coil_id\":\"入口卷号1\",\"msg_time\":\"\",\"material_coil_thickness\":\"12.3\",\"babys_inner_diameter\":\"199.377\"}";
+//		ResultModel rm= new ResultModel();
+//		//String str=Receive12mmSlitPDO_Coils(""+json);
+//		//rm.setData(str);
+//		rm.setState("200");
+//		return rm;
+//	}
+//	//测试Receive12mmSlitPDO_Reject接口
+//	public ResultModel test_Receive12mmSlitPDO_Reject(Object json){
+//		ResultModel rm= new ResultModel();
+//		String str=Receive12mmSlitPDO_Reject(json);
+//		rm.setData(str);
+//		rm.setState("200");
+//		return rm;
+//	}
+//	//测试Receive12mmSlitPDO_Shift接口
+//	public ResultModel test_Receive12mmSlitPDO_Shift(Object json){
+//		ResultModel rm= new ResultModel();
+//		String str=Receive12mmSlitPDO_Shift(json);
+//		rm.setData(str);
+//		rm.setState("200");
+//		return rm;
+//	}
+	
+}

+ 2871 - 0
src/main/java/market/Api/Mes/impl/MesApiAnnealPdiPdoImpl.java

@@ -0,0 +1,2871 @@
+/***文档注释***********************************************
+ * 作者               :                   宋燕辉
+ * 创建日期      :                   2018.08.13
+ * 描述               :                  罩退  pdipdo
+ * 注意事项      :                   无
+ * 遗留BUG :                   无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+ ***********************************************************/
+package market.Api.Mes.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import market.Api.Lms.impl.LmsApiServiceImpl;
+import market.Api.Mes.service.MesApiAnnealPdiPdoService;
+import market.Api.Qms.impl.QmsApiServiceImpl;
+import market.Com.mapper.ComBaseMachineMapper;
+import market.Com.mapper.ComBasePlineMapper;
+import market.Com.mapper.ComBaseSteelMapper;
+import market.Com.pb.DoubleUtil;
+import market.Com.pb.PropertiesUtils;
+import market.Com.vo.ComBaseMachine;
+import market.Com.vo.ComBasePline;
+import market.Com.vo.ComBaseSteel;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.mapper.YdmProductOutlistMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Lms.Warehouse.vo.YdmProductOutlist;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.Shift.mapper.MesShiftMMapper;
+import market.Mes.Shift.vo.MesShiftM;
+import market.Mes.anneal.mapper.IfBaf01L2AswL3PlanMapper;
+import market.Mes.anneal.mapper.IfBaf01L3AswL2PlanMapper;
+import market.Mes.anneal.mapper.IfBaf01LogMapper;
+import market.Mes.anneal.mapper.IfBaf01PdiMapper;
+import market.Mes.anneal.mapper.IfBaf01PdoEnergyMapper;
+import market.Mes.anneal.mapper.IfBaf01PdoMMapper;
+import market.Mes.anneal.mapper.IfBaf01PdoProcMapper;
+import market.Mes.anneal.mapper.IfBaf01RevokeL2Mapper;
+import market.Mes.anneal.mapper.IfBaf01RevokeL3Mapper;
+import market.Mes.anneal.mapper.MesCrAnnealEnergyMapper;
+import market.Mes.anneal.mapper.MesCrAnnealMMapper;
+import market.Mes.anneal.mapper.PlnAnnealPlanDetailMapper;
+import market.Mes.anneal.mapper.PlnAnnealPlanMapper;
+import market.Mes.anneal.vo.IfBaf01L2AswL3Plan;
+import market.Mes.anneal.vo.IfBaf01L3AswL2Plan;
+import market.Mes.anneal.vo.IfBaf01Pdi;
+import market.Mes.anneal.vo.IfBaf01PdoEnergy;
+import market.Mes.anneal.vo.IfBaf01PdoM;
+import market.Mes.anneal.vo.IfBaf01PdoProc;
+import market.Mes.anneal.vo.IfBaf01RevokeL2;
+import market.Mes.anneal.vo.IfBaf01RevokeL3;
+import market.Mes.anneal.vo.MesCrAnnealEnergy;
+import market.Mes.anneal.vo.MesCrAnnealM;
+import market.Mes.anneal.vo.MesJihuaZhi;
+import market.Mes.anneal.vo.PlnAnnealPlanDetail;
+import market.Mes.util.DateUtil;
+import market.Qms.qcm.service.impl.QcmJhySampleConsignDItemServiceImpl;
+import market.Qms.qcm.vo.QcmJhySampleFromPlan;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+import org.apache.log4j.Logger;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path = "MesApiAnnealPdiPdoService")
+public class MesApiAnnealPdiPdoImpl extends BaseServiceImpl implements MesApiAnnealPdiPdoService{
+ 
+	public static String ANNEALPDI1 = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI1");
+	public static String ANNEALPDI2 = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI2");
+	public static String ANNEALPDI3 = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI3");
+	public static String ANNEALPDI1_NAN = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI1_NAN");
+	public static String ANNEALPDI2_NAN = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI2_NAN");
+	public static String ANNEALPDI3_NAN = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI3_NAN");
+	public static String ANNEALPDI1_AI = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI1_AI");
+	public static String ANNEALPDI2_AI = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI2_AI");
+	public static String ANNEALPDI3_AI = PropertiesUtils.getPdioProperties().getProperty("ANNEALPDI3_AI");
+	
+	//获取日志记录器Logger,名字为本类类名
+    private static Logger log = Logger.getLogger(MesApiAnnealPdiPdoImpl.class);
+    
+    
+    /**
+	 * 宝信退火炉作业指示、艾伯纳退火炉作业指示
+	 * @param oci
+	 * object:
+	 * material_no:投料卷号
+	 * materailcoilno:原始卷号
+	 * steel_name:牌号
+	 * order_no:订单号
+	 * reciver_unit_name:客户名称
+	 * furnace_no:炉座号
+	 * memo1:传机台代码
+	 * startTime:开始时间
+	 * endTime:结束时间
+	 * @return
+	 */
+	public ResultModel doQueryAnnealWeb(CommonPage<MesJihuaZhi> oci){
+		ResultModel rm=new ResultModel();
+		if(oci.getMemo1()==null || "".equals(oci.getMemo1())){
+			rm.setState("500");
+			rm.setMsgInfo("请输入机台代码");
+			return rm;
+		}
+		try{
+			List<HashMap> lpav=this.getMapper(IfBaf01PdiMapper.class).doQueryWeb(oci.getObject(),oci.getMemo1(),oci.getMemo2(),oci.getStartTime(),oci.getEndTime(),oci.getMemo3());
+			rm.setData(lpav);
+			rm.setState("200");
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+    
+	  /**
+		 * 南方退火炉作业指示
+		 * @param oci
+		 * object:
+		  * material_no:投料卷号
+		 * materailcoilno:原始卷号
+		 * steel_name:牌号
+		 * order_no:订单号
+		 * reciver_unit_name:客户名称
+		 * furnace_no:炉座号
+		 * memo1:传机台代码    传M0005
+		 * startTime:开始时间
+		 * endTime:结束时间
+		 * @return
+		 */
+		public ResultModel doQueryAnnealDG_Web(CommonPage<MesJihuaZhi> oci){
+			ResultModel rm=new ResultModel();
+			if(oci.getMemo1()==null || "".equals(oci.getMemo1())){
+				rm.setState("500");
+				rm.setMsgInfo("请输入机台代码");
+				return rm;
+			}
+			try{
+				List<HashMap> lpav=this.getMapper(IfBaf01PdiMapper.class).doQueryWeb_DG(oci.getObject(),oci.getMemo1(),oci.getMemo2(),oci.getStartTime(),oci.getEndTime(),oci.getMemo3());
+				rm.setData(lpav);
+				rm.setState("200");
+			}catch(Exception ex){
+				ex.printStackTrace();
+				rm.setState("500");
+				rm.setMsgInfo("查询失败!"+ex.getMessage());
+			}
+			return rm;
+		}
+	
+	
+    
+	//下发PDI
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String SendBaf01Pdi(String v_mch_code, String v_plan_no,
+			String v_object_no_vt, String v_material_no, String v_opr_name,
+			String v_message) throws Exception{
+		
+		Integer v_cnt ;
+		//  --(1)、验证前端传入参数的基本有效性
+		if(v_mch_code==null){
+			v_message="参数错误:机台代码不能为空!";
+			return v_message;
+		}
+		//  --(1.1)、验证机台基础信息存在
+		v_cnt = this.getMapper(ComBaseMachineMapper.class).countWithCondition(null,"machine_code='"+v_mch_code+"'");
+		if(v_cnt<=0){
+			v_message="机台代码{"+v_mch_code+"} 机台基础信息不存在!";
+			return v_message;
+		}
+		//  --(1.2)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+		List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class).findWithCondition(null,
+				"machine_code='"+v_mch_code+"'", null, 0, 0);
+		String v_mch_mark=lcbm.get(0).getMachine_mark();
+		if(v_mch_mark==null){
+			v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+			return v_message;
+		}
+		//  --(2)、验证当前还未收到L2生产实绩
+		List<PlnAnnealPlanDetail> v_rec_pln_d=this.getMapper(PlnAnnealPlanDetailMapper.class).doQuery(v_mch_code,v_plan_no,v_object_no_vt,v_material_no);
+		if(v_rec_pln_d==null || v_rec_pln_d.size()<=0){
+			v_message="罩退作业计划不存在!";
+			return v_message;
+		}
+		//--此处暂且限制,可能实际应用过程中,需要去掉此限制,先保留,后续根据实际需要再屏蔽
+		if("2".equals(v_rec_pln_d.get(0).getSend_flag())){
+			//v_message="原料卷号{"+v_material_no+"} 已收到L2生产实绩,不能重复下发!";
+			v_message="已收到L2生产实绩,不能重复下发!";
+			return v_message;
+		}
+		//  --(3)、验证当前还未生产交工
+		List<MesCrAnnealM> v_rec_anl_m = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null, "schedule_no='"+v_plan_no+"' and material_no='"+v_material_no+"'", null, 0, 0);
+		if(v_rec_anl_m!=null && v_rec_anl_m.size()>0){
+			if("1".equals(v_rec_anl_m.get(0).getHand_over_status())){
+				v_message="已生产交工,不能重复下发!";
+				return v_message;
+			}
+		}
+		//  --(4)、验证虚拟物料表中,原料卷计划信息存在
+		List<PlnMaterielDetail> v_rec_mtr_in = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,"object_no_vt='"+v_object_no_vt+"'", null, 0, 0);
+		if(v_rec_mtr_in==null || v_rec_mtr_in.size()<=0){
+			v_message="原料卷虚拟物料信息不存在!";
+			return v_message;
+		}
+		//  --(5)、验证虚拟物料表中,出口卷虚拟物料信息存在
+		PlnMaterielDetail pmd2=new PlnMaterielDetail();
+		pmd2.setMat_object_no_vt(v_object_no_vt);
+		v_cnt = this.getMapper(PlnMaterielDetailMapper.class).count(pmd2);
+		if (v_cnt<=0) {
+			v_message="出口卷虚拟物料信息不存在!";
+			return v_message;
+		}
+		List<PlnMaterielDetail> v_rec_mtr_out=this.getMapper(PlnMaterielDetailMapper.class).doQueryWeb2(v_object_no_vt,"");
+		//  --(6)、验证原料卷库存明细存在
+		List<YdmProductDetail> v_rec_ydm_d = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_material_no+"'", null, 0, 0);
+		if(v_rec_ydm_d==null || v_rec_ydm_d.size()<=0){
+			v_message="库存明细记录不存在!";
+			return v_message;
+		}
+		//  --(7)、获取生产订单信息
+		List<PlnProdorder> v_rec_prod = this.getMapper(PlnProdorderMapper.class).findWithCondition(null, "prod_order_no='"+v_rec_mtr_in.get(0).getProd_order_no()+"'", null, 0, 0);
+		if(v_rec_prod==null || v_rec_prod.size()<=0){
+			v_message="生产订单号{"+v_rec_mtr_in.get(0).getProd_order_no()+"} 生产订单信息不存在!";
+			return v_message;
+		}
+		//  --(8)、获取牌号(名称)
+		String v_steel=null;
+		List<ComBaseSteel> lcbs = this.getMapper(ComBaseSteelMapper.class).findWithCondition(null, "steel_code='"+v_rec_mtr_in.get(0).getSteel_code()+"'", null, 0, 0);
+		if(lcbs==null || lcbs.size()<=0){
+			v_steel="";
+		}else{
+			if(lcbs.get(0).getSteel_name()==null){
+				v_steel=lcbs.get(0).getSteel_code();
+			}else{
+				v_steel=lcbs.get(0).getSteel_name();
+			}
+		}
+		//  --(9)、获取库区
+		String v_stock_code=this.getMapper(MesCrAnnealMMapper.class).doQueryStock(v_material_no);
+		if(v_stock_code==null){
+			v_stock_code="";
+		}
+		//  --(10)、获取库位
+		String v_location_no=this.getMapper(MesCrAnnealMMapper.class).doQueryLocation(v_material_no);
+		if(v_location_no==null){
+			v_location_no="";
+		}
+		//  --(11)、获取备注
+		String  v_memo=this.getMapper(MesCrAnnealMMapper.class).doQueryMemo(v_material_no);
+		if(v_memo==null){
+			 v_memo="";
+		}
+		//  --(12)、出口卷编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(退火T)+ 2位设备代号(01-99)
+		String v_coil_no=null;
+		if(v_rec_anl_m!=null && v_rec_anl_m.size()>0){
+			if(v_rec_anl_m.get(0).getFurnace_no()!=null){
+				v_coil_no = v_material_no.substring(0, 8) + "T"+ lpad(v_rec_anl_m.get(0).getFurnace_no(), 2, "0");
+			}else{
+				v_coil_no = v_material_no.substring(0, 8) + "T"+ lpad(v_mch_mark, 2, "0");
+			}
+		}else{
+			v_coil_no = v_material_no.substring(0, 8) + "T"+ lpad(v_mch_mark, 2, "0");
+		}
+		
+		//    --(12.1)、获取当前起始流水号
+		v_cnt=this.getMapper(MesCrAnnealMMapper.class).doQueryWeb5(v_coil_no,v_plan_no,v_material_no);
+		if(v_cnt==null){
+			v_cnt=1;
+		}else if(v_cnt>99){
+			v_message="出口钢卷号超出规则范围,流水号超出最大值99!";
+			return v_message;
+		}
+		//  --(12.2)、出口卷编码规则:出口卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(退火T)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)																																							
+		v_coil_no=v_coil_no+lpad(v_cnt+"",2,"0");
+		//  --(13)、组装PDI数据项
+		IfBaf01Pdi v_rec_pdi=new IfBaf01Pdi();
+		v_rec_pdi.setPlan_no ( v_plan_no);//计划号																																							
+		v_rec_pdi.setSeq_no( v_rec_pln_d.get(0).getAn_seq());//序号					
+		//2018-11-06  机组代码  二级长度为4
+		if(v_mch_code.contains("M")){
+			v_rec_pdi.setUnit_code(v_mch_code.substring(1));//机组代码(区分厂家:艾伯纳、中冶南方、宝信)	
+		}
+		v_rec_pdi.setPlan_type ("0");//计划类型(0:正常计划、1:返修计划)																																							
+		v_rec_pdi.setRepair_type ( null);//返修类型																																							
+		v_rec_pdi.setDivide_num( 0l);//等分卷数																																							
+		v_rec_pdi.setIn_mat_type ("1");//入口钢卷类型(0:虚拟钢卷、1:实物钢卷)
+		if(!v_mch_code.equals("M0006")){
+			v_rec_pdi.setStock_code( v_stock_code);//库区代码				
+			v_rec_pdi.setLocation_no ( v_location_no);//库位号		
+		}
+																																							
+		v_rec_pdi.setIn_mat_no ( v_material_no);//入口钢卷号																																							
+		v_rec_pdi.setIn_mat_thick( v_rec_ydm_d.get(0).getThick());//入口钢卷厚度(mm)																																							
+		v_rec_pdi.setIn_mat_width( v_rec_ydm_d.get(0).getWidth());//入口钢卷宽度(mm)
+		if(v_rec_ydm_d.get(0).getLength()!=null){
+			v_rec_pdi.setIn_mat_len(v_rec_ydm_d.get(0).getLength()/1000);//入口钢卷长度(m)  9,3				
+		}
+		
+		v_rec_pdi.setIn_mat_in_dia ( v_rec_ydm_d.get(0).getDiameter_inn());//入口钢卷内径(mm)																																							
+		v_rec_pdi.setIn_mat_dia( v_rec_ydm_d.get(0).getDiameter_out());//入口钢卷外径(mm)	
+		if(v_mch_code.equals("M0006")){
+			if(v_rec_pdi.getIn_mat_in_dia()==null || v_rec_pdi.getIn_mat_in_dia().intValue()==0){
+				v_rec_pdi.setIn_mat_in_dia(610d);
+			}
+			if(v_rec_pdi.getIn_mat_dia()==null || v_rec_pdi.getIn_mat_dia().intValue()==0){
+				v_rec_pdi.setIn_mat_dia(1710d);
+			}
+		}
+		
+		if(v_rec_ydm_d.get(0).getFactweight()!=null){
+			v_rec_pdi.setIn_mat_wt ( v_rec_ydm_d.get(0).getFactweight()/1000);//入口钢卷重量(t)	
+			v_rec_pdi.setOut_mat_wt( v_rec_ydm_d.get(0).getFactweight()/1000);//出口材料重量(t)																																							
+			v_rec_pdi.setOut_mat_min_wt( v_rec_ydm_d.get(0).getFactweight()/1000);//出口材料重量最小值(t)																																							
+			v_rec_pdi.setOut_mat_max_wt( v_rec_ydm_d.get(0).getFactweight()/1000);//出口材料重量最大值(t)	
+		}
+		v_rec_pdi.setOut_mat_no( v_coil_no);//出口材料号																																							
+		v_rec_pdi.setOut_mat_thick ( v_rec_mtr_out.get(0).getThick());//出口钢卷厚度(mm)																																							
+		v_rec_pdi.setOut_mat_min_thick ( v_rec_mtr_out.get(0).getThick());//出口材料厚度最小值(mm)																																							
+		v_rec_pdi.setOut_mat_max_thick ( v_rec_mtr_out.get(0).getThick());//出口材料厚度最大值(mm)																																							
+		v_rec_pdi.setOut_mat_width ( v_rec_mtr_out.get(0).getWidth());//出口材料宽度(mm)																																							
+		v_rec_pdi.setOut_mat_min_width ( v_rec_mtr_out.get(0).getWidth());//出口材料宽度最小值(mm)																																							
+		v_rec_pdi.setOut_mat_max_width ( v_rec_mtr_out.get(0).getWidth());//出口材料宽度最大值(mm)	
+		if(v_rec_mtr_out.get(0).getLength()!=null){
+			v_rec_pdi.setOut_mat_len ( v_rec_mtr_out.get(0).getLength()/1000);//出口材料长度(m)																																							
+			v_rec_pdi.setOut_mat_min_len ( v_rec_mtr_out.get(0).getLength()/1000);//出口材料长度最小值(m)																																							
+			v_rec_pdi.setOut_mat_max_len ( v_rec_mtr_out.get(0).getLength()/1000);//出口材料长度最大值(m)	
+		}
+		v_rec_pdi.setOut_mat_inner_dia ( v_rec_ydm_d.get(0).getDiameter_inn());//出口材料内径(mm)																																							
+		v_rec_pdi.setOut_mat_outer_dia ( v_rec_ydm_d.get(0).getDiameter_out());//出口材料外径(mm)	
+																																								
+		v_rec_pdi.setWt_mode ("1");//出口计重方式																																							
+		v_rec_pdi.setNext_whole_backlog_code ( null);//后工序代码																																							
+		v_rec_pdi.setPrev_whole_backlog_code ( null);//前工序代码																																							
+		v_rec_pdi.setOrder_no( v_rec_mtr_out.get(0).getOrder_no());//合同号																																							
+		v_rec_pdi.setOrder_thick ( v_rec_prod.get(0).getThick());//订货厚度(mm)	
+		//订货宽度  ORDER_WIDTH	订货宽度	N	5,1						NUMBER(7,3)
+		if(v_rec_prod.get(0).getWidth()!=null){
+			v_rec_pdi.setOrder_width (DoubleUtil.round(v_rec_prod.get(0).getWidth(), 1));//订货宽度(mm)
+		}
+//		if(v_rec_prod.get(0).getSingle_weight()!=null){//PLN_PRODORDER的Single_weight没有值
+//		}
+		//v_rec_pdi.setOrder_unit_max_wt ( v_rec_prod.get(0).getSingle_weight()/1000);//订货单件最大重量(t)	null	
+		if(v_rec_prod.get(0).getSingle_weight_max()!=null){
+			v_rec_pdi.setOrder_unit_max_wt ( v_rec_prod.get(0).getSingle_weight_max()/1000);//订货单件最大重量(t)	22000.000/1000
+			v_rec_pdi.setOrder_unit_aim_wt ( v_rec_prod.get(0).getSingle_weight_max()/1000);//订货单件目标重量(t)	22000.000/1000
+		}
+		if(v_rec_prod.get(0).getSingle_weight_min()!=null){
+			v_rec_pdi.setOrder_unit_min_wt (v_rec_prod.get(0).getSingle_weight_min()/1000);//订货单件最小重量(t)		18000.000/1000
+		}
+		
+		v_rec_pdi.setPono_no ( null);//炉号																																							
+		v_rec_pdi.setPono( null);//制造命令号			
+		//2018-11-06 产品最终用途码      二级长度是4
+		if(v_rec_prod.get(0).getUse_code()!=null){
+			if(v_rec_prod.get(0).getUse_code().length()>4){
+				v_rec_pdi.setApn ( v_rec_prod.get(0).getUse_code().substring(v_rec_prod.get(0).getUse_code().length()-4, 
+						v_rec_prod.get(0).getUse_code().length()));//产品最终用途码	
+			}else{
+				v_rec_pdi.setApn ( v_rec_prod.get(0).getUse_code());//产品最终用途码	
+			}
+		}
+		
+		String formatDate = DateUtil.formatDate(v_rec_prod.get(0).getDeliver_date(), "yyyyMMddHHmmss");
+		v_rec_pdi.setDelivy_date (formatDate);//交货日期(14位字符串)																																							
+		v_rec_pdi.setPackage_code( null);//包装代码																																							
+		v_rec_pdi.setSg_sign ( v_steel);//钢种																																							
+		v_rec_pdi.setDensity ( 7.85);//密度																																							
+		v_rec_pdi.setOrder_special ( null);//合同特殊要求																																							
+		v_rec_pdi.setSurface_struct_code ( null);//目标表面结构(毛面、光面)																																							
+		v_rec_pdi.setAnneal_diagram_code ( null);//退火曲线代码																																							
+		v_rec_pdi.setAnneal_temp_min ( null);//退火温度最小值																																							
+		v_rec_pdi.setAnneal_temp_aim ( null);//退火温度目标值																																							
+		v_rec_pdi.setAnneal_temp_max ( null);//退火温度最大值																																							
+		v_rec_pdi.setRemark("【"+v_rec_ydm_d.get(0).getMaterailcoilno()+"】"+ (v_memo==null?"":v_memo));//备注		
+//		//测试2019-04-26 
+//		v_rec_pdi.setRemark( "备注信息测试");//备注		
+		
+		
+		v_rec_pdi.setSend_time ( new Date());																																							
+		v_rec_pdi.setSend_opr( v_opr_name);		
+		
+		//  --(14)、无接口调试时,设置1,直接跳过,否则设置为0
+		int v_flag=0;//
+		//  --(14.1)、调用公司接口,将“PDI电文” v_rec_pdi 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+		JsonConfig jsonConfig=new JsonConfig();
+		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+		jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+		JSONObject jsonObject=JSONObject.fromObject(v_rec_pdi,jsonConfig);
+		System.out.println(jsonObject.toString());
+		try{
+			String url="";
+			if(v_mch_code.equals("M0004")){
+				url = ANNEALPDI1;
+			}else if(v_mch_code.equals("M0006")){
+				url = ANNEALPDI1_AI;
+			}else if(v_mch_code.equals("M0005") || v_mch_code.equals("M0009")){
+				url = ANNEALPDI1_NAN;
+			}
+			log.debug("url:"+url);
+			
+			String body = jsonObject.toString();
+	        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+	                .post()              //设置post请求
+	                .addPostParam("body", "json")
+	                .body(body)
+	                .addHeader("Content-type", "application/json")   //添加header
+	                //.addPathParam("id", "2")        //设置url路径参数
+	                //.addQueryParam("test", "value") //设置url请求参数
+	                .request();         //发起请求
+	        System.out.println(response.getCode());     //响应状态码
+	        System.out.println(response.getRequestUrl());//最终发起请求的地址
+	        if(response.getCode() == 200){
+	            //请求成功
+	            //System.out.println(response.getContent());  //响应内容
+	            log.debug("responseCONTENT:"+response.getContent());
+	            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+	            	v_flag=1;
+	            	v_message="PDI下发成功!";
+	            }else{
+	            	if(response.getContent()!=null && response.getContent().length()>200){
+	    				v_message="已下发PDI给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+	    			}else{
+	    				v_message="已下发PDI给L2,插入失败!【"+response.getContent()+"】";
+	    			}
+	            }
+	            //v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}已下发PDI给L2!";
+	        }else{
+	        	v_message="下发PDI给L2失败!发送请求失败!";
+	        }
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message="【通讯过程出错:"+e.getMessage()+"】";
+		}
+		//  --(14.1.1)、电文发送失败(失败状态,根据接口提供定义确定)
+		if(v_flag==0){
+			v_message="SendBaf01Pdi PDI电文发送失败!"+v_message;
+			return v_message;
+		}
+		//  --(14)、插入PDI记录表
+		this.getMapper(IfBaf01PdiMapper.class).insert(v_rec_pdi);
+		//  --(15)、修改作业计划表下发L2状态
+		//this.getMapper(PlnAnnealPlanDetailMapper.class).doUpdate(v_plan_no,v_object_no_vt,v_opr_name);
+		v_message="操作人{"+v_opr_name+"} PDI下发成功!";
+		//  --(16)、提交事务
+		//  --(17)、调用公司电文处理,真正下发PDI给L2(v_rec_pdi 对象) ??
+		return v_message;
+	}
+
+	//撤销PDI
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String L3RevokeBaf01Pdi(String v_mch_code, String v_plan_no,
+			String v_object_no_vt, String v_material_no, String v_opr_name,String v_message) throws Exception{
+		
+		Integer v_cnt;
+		// --(1)、验证作业计划存在
+		List<PlnAnnealPlanDetail> v_rec_pln_d=this.getMapper(PlnAnnealPlanDetailMapper.class).doQuery(v_mch_code,v_plan_no,v_object_no_vt,v_material_no);
+		if(v_rec_pln_d==null || v_rec_pln_d.size()<=0){
+			v_message="罩退作业计划不存在!";
+			return v_message;
+		}
+		//  --(2)、验证已下发过PDI
+		if(v_rec_pln_d.get(0).getSend_flag()==null || "0".equals(v_rec_pln_d.get(0).getSend_flag())){
+			v_message="还未下发PDI!";
+			return v_message;
+		}
+		
+		//--(3)、验证还未收到PDO,否则不允许撤销PDI
+		if("2".equals(v_rec_pln_d.get(0).getSend_flag())){
+			v_message="已收到L2生产实绩,不能撤销PDI!";
+			return v_message;
+		}
+		//  --(4)、验证当前还未生产交工
+		List<MesCrAnnealM> v_rec_anl_m = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null, "schedule_no='"+v_plan_no+"' and material_no='"+v_material_no+"'", null, 0, 0);
+		if(v_rec_anl_m!=null && v_rec_anl_m.size()>0){
+			if("1".equals(v_rec_anl_m.get(0).getHand_over_status())){
+				v_message="已生产交工,不能撤销PDI!";
+				return v_message;
+			}
+		}
+		//  --(5)、组装撤销PDI对象数据项
+		IfBaf01RevokeL3 v_rec_revoke=new IfBaf01RevokeL3();
+		v_rec_revoke.setPlan_no ( v_plan_no); //计划号																																							
+		v_rec_revoke.setSeq_no( v_rec_pln_d.get(0).getAn_seq()); //序号																																							
+		//2018-11-06  机组代码  二级长度为4
+		if(v_mch_code.contains("M")){
+			v_rec_revoke.setUnit_code(v_mch_code.substring(1));//机组代码(区分厂家:艾伯纳、中冶南方、宝信)	
+		}
+		v_rec_revoke.setIn_mat_no ( v_material_no); //入口钢卷号																																							
+		v_rec_revoke.setRevoke_time ( new Date());																																							
+		v_rec_revoke.setRevoke_opr( v_opr_name);
+		
+	    //  --(14)、无接口调试时,设置1,直接跳过,否则设置为0
+		int v_flag=0;
+		//  --(14.1)、调用公司接口,将“PDI电文” v_rec_pdi 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+		JsonConfig jsonConfig=new JsonConfig();
+		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+		jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+		JSONObject jsonObject=JSONObject.fromObject(v_rec_revoke,jsonConfig);
+		System.out.println(jsonObject.toString());
+		try{
+			String url="";
+			if(v_mch_code.equals("M0004")){
+				url = ANNEALPDI2;
+			}else if(v_mch_code.equals("M0006")){
+				url = ANNEALPDI2_AI;
+			}else if(v_mch_code.equals("M0005") || v_mch_code.equals("M0009")){
+				url = ANNEALPDI2_NAN;
+			}
+			log.debug("url:"+url);
+			
+			
+			String body = jsonObject.toString();
+	        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+	                .post()              //设置post请求
+	                .addPostParam("body", "json")
+	                .body(body)
+	                .addHeader("Content-type", "application/json")   //添加header
+	                //.addPathParam("id", "2")        //设置url路径参数
+	                //.addQueryParam("test", "value") //设置url请求参数
+	                .request();         //发起请求
+	        System.out.println(response.getCode());     //响应状态码
+	        System.out.println(response.getRequestUrl());//最终发起请求的地址
+	        if(response.getCode() == 200){
+	            //请求成功
+	            //System.out.println(response.getContent());  //响应内容
+	            log.debug("responseCONTENT:"+response.getContent());
+	            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+	            	v_flag=1;
+	            	v_message="撤销PDI成功!";
+	            }else{
+	            	if(response.getContent()!=null && response.getContent().length()>200){
+	    				v_message="撤销PDI电文下发给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+	    			}else{
+	    				v_message="撤销PDI电文下发给L2,插入失败!【"+response.getContent()+"】";
+	    			}
+	            }
+	            //v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}已下发PDI给L2!";
+	        }else{
+	        	v_message="撤销PDI电文下发失败!发送请求失败!";
+	        }
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message="【通讯过程出错:"+e.getMessage()+"】";
+		}
+		//  --(14.1.1)、电文发送失败(失败状态,根据接口提供定义确定)
+		if(v_flag==0){
+			v_message="L3RevokeBaf01Pdi 撤销PDI电文下发失败!"+v_message;
+			return v_message;
+		}
+		//  --(6)、插入PDI撤销下发记录表
+		this.getMapper(IfBaf01RevokeL3Mapper.class).insert(v_rec_revoke);
+		//  --(7)、修改作业计划表下发L2状态
+		//this.getMapper(PlnAnnealPlanDetailMapper.class).doUpdate2(v_plan_no, v_object_no_vt);
+		v_message="操作人{"+v_opr_name+"} 撤销PDI电文下发成功!";
+		return v_message;
+	}
+	
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到罩退L2应答L3计划信息电文时调用;																																							
+		2)、	此接口参数为JSON对象(对象结构见数据库表 IF_BAF01_L2_ASW_L3_PLAN);																																							
+	 * @param IfBaf01L2AswL3Plan  L2应答L3计划信息电文对象
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	public String Baf01L2AswL3Revoke(IfBaf01L2AswL3Plan json){
+		String v_message="";
+		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_asw 代替描述
+		IfBaf01L2AswL3Plan v_rec_asw=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-宝信罩退炉-L2应答L3计划信息电文为空";
+			//v_message="500";
+			return v_message;
+		}
+		//  --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_asw.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_asw.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入L2应答L3计划信息表(单独的事务)
+		try{
+			this.getMapper(IfBaf01L2AswL3PlanMapper.class).insert(v_rec_asw);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理L2应答L3计划信息函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).Baf01L2AswL3Revoke_D(v_rec_asw,v_message);
+			//this.getSqlSession("sqlSessionFactory").getConnection().
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+			//throw new Exception(e.getMessage());
+		}finally{
+			//  --(5)、拼接参数
+			String v_param="作业计划号{"+v_rec_asw.getPlan_no()+"}入口钢卷号{"+v_rec_asw.getIn_mat_no()+"}机台代码{"+v_rec_asw.getUnit_code()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfBaf01LogMapper.class).doInsert(null,"Baf01L2AswL3Revoke",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 Baf01L2AswL3Revoke 调用;																																							
+		2)、	接口参数 IN:V_REC_ASW(L2应答L3计划信息电文对象)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_asw
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Baf01L2AswL3Revoke_D(IfBaf01L2AswL3Plan v_rec_asw,
+			String v_message) throws Exception {
+		try{
+			// --(1)、验证罩退作业计划存在
+			List<PlnAnnealPlanDetail> v_rec_pln_d=this.getMapper(PlnAnnealPlanDetailMapper.class).doQuery2(v_rec_asw.getPlan_no(),v_rec_asw.getIn_mat_no());
+			if(v_rec_pln_d==null || v_rec_pln_d.size()<=0){
+				v_message="罩退作业计划不存在!";
+				return v_message;
+			}
+			//flg为null,flag为null???
+			if(v_rec_asw.getFlg()==null || v_rec_asw.getFlag()==null 
+					|| "".equals(v_rec_asw.getFlg()) || "".equals(v_rec_asw.getFlag()) ){
+				v_message="L2应答L3计划信息电文中操作标识flg【"+v_rec_asw.getFlg()+"】,处理标志flag【"+v_rec_asw.getFlag()+"】无效!";
+				return v_message;
+			}
+			//L2-L3在后台自动处理,所以获取SESSION中的登录人员为空     
+			String vOprName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			List<IfBaf01Pdi> lib01p = this.getMapper(IfBaf01PdiMapper.class).findWithCondition(null, "plan_no ='"+v_rec_asw.getPlan_no()+"' and in_mat_no='"+v_rec_asw.getIn_mat_no()+"'", null, 0, 0);
+			if(lib01p!=null && lib01p.size()>0){
+				vOprName=lib01p.get(0).getSend_opr();
+			}
+			if(vOprName==null){
+				vOprName="L2Asw";
+			}
+			//  --(2)、开始事务:修改作业计划表下发L2状态
+			if("1".equals(v_rec_asw.getFlg()) && "0".equals(v_rec_asw.getFlag())){
+				//    --(2.1)、flg = '1' && v_rec_asw.flag = '0' 代表L2新增操作成功
+				this.getMapper(PlnAnnealPlanDetailMapper.class).doUpdate4(v_rec_asw.getPlan_no(),v_rec_asw.getIn_mat_no(),vOprName);
+			}else if("2".equals(v_rec_asw.getFlg()) && "0".equals(v_rec_asw.getFlag())){
+				//    --(2.2)、flg = '2' && v_rec_asw.flag = '0' 代表L2撤销操作成功
+				this.getMapper(PlnAnnealPlanDetailMapper.class).doUpdate3(v_rec_asw.getPlan_no(),v_rec_asw.getIn_mat_no());
+			}
+			//  --(3)、提交事务
+			v_message="L2应答L3计划信息电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="L2应答L3计划信息电文处理失败:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="L2应答L3计划信息电文处理失败:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到罩退L2删除计划钢卷电文时调用;																																							
+		2)、	此接口参数为JSON对象(对象结构见数据库表 IF_BAF01_REVOKE_L2);																																							
+	 * @param json
+	 * @return
+	 */
+	public String L2RevokeBaf01Pdi(IfBaf01RevokeL2 json) throws Exception{
+		String v_message="";
+		if(json==null || "".equals(json.toString())){
+			v_message="二级接口-宝信罩退炉PDI-L2删除为空";
+			return v_message;
+		}
+		IfBaf01RevokeL2 v_rec_revoke=json;
+		//   --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_revoke.getMsg_time()==null){
+			v_rec_revoke.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入L2计划钢卷删除表(单独的事务)  
+		try{
+			this.getMapper(IfBaf01RevokeL2Mapper.class).insert(v_rec_revoke);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理L2计划钢卷删除函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).L2RevokeBaf01Pdi_D(v_rec_revoke, v_message);
+			//this.getSqlSession("sqlSessionFactory").getConnection().
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+			//throw new Exception(e.getMessage());
+		}
+		// --(5)、拼接返回字符串
+		 v_message = "作业计划号{"+v_rec_revoke.getPlan_no()+"}入口钢卷号{"+v_rec_revoke.getIn_mat_no()+"}机台代码{"+v_rec_revoke.getUnit_code()+"}"+v_message;
+		//  --(6)、写接口日志:与业务处理分开,单独的事务
+		try{
+			 this.getMapper(IfBaf01LogMapper.class).doInsert(null,"L2RevokeBaf01Pdi","",v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		return v_message;
+	}
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 L2RevokeBaf01Pdi 调用;																																							
+		2)、	接口参数 IN:V_REC_REVOKE(L2计划钢卷删除实体对象实例)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_revoke
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String L2RevokeBaf01Pdi_D(IfBaf01RevokeL2 v_rec_revoke,
+			String v_message) throws Exception {
+		Integer v_success=null;//--操作成功标志(1:成功、0:失败)
+		IfBaf01L3AswL2Plan v_rec_asw=new IfBaf01L3AswL2Plan();//--L3应答L2计划信息电文对象
+		try{
+			//  --(1)、调用处理L2计划钢卷删除函数(事务在函数内)																																							
+			//  --(1.1)、输出参数 v_success = 1,表示L3处理L2计划钢卷删除操作成功,否则失败																																							
+			try{
+				v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).L2RevokeBaf01Pdi_D_D(v_rec_revoke, v_success, v_message);
+				//this.getSqlSession("sqlSessionFactory").getConnection().
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message=e.getMessage();
+				//throw new Exception(e.getMessage());
+			}
+			if(v_message==null){
+				v_message="";
+			}
+			String v_success_str="";
+			//对v_message和v_success进行处理
+			//if("_success:".equals(v_message)){
+			if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				//v_success= Integer.parseInt(v_success_str);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			}
+			//  --(2)、构建应答电文对象(电文格式见接口文档对应电文格式部分)
+			v_rec_asw.setSend_time(new Date());//--发送时间
+			v_rec_asw.setSend_opr("L3Asw");//--发送人
+			v_rec_asw.setPlan_no(v_rec_revoke.getPlan_no());//--计划号
+			v_rec_asw.setSeq_no(v_rec_revoke.getSeq_no());// --序号
+			v_rec_asw.setUnit_code(v_rec_revoke.getUnit_code());//--机组代码(区分厂家:艾伯纳、中冶南方、宝信)
+			v_rec_asw.setIn_mat_no(v_rec_revoke.getIn_mat_no());//--入口钢卷号
+			if("1".equals(v_success_str)){
+				v_rec_asw.setFlag("0");//--处理标志(0:成功、1:不成功)
+			}else{
+				v_rec_asw.setFlag("1");//--处理标志(0:成功、1:不成功)
+			}
+			v_rec_asw.setDeal_result("");// --处理结果(异常处理原因描述)
+			//  --(3)、调用L3应答L2计划信息处理函数
+			String v_message2="";
+			try{
+				v_message2=this.getBean(MesApiAnnealPdiPdoImpl.class).Baf01L3AswL2Revoke(v_rec_asw, v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message2=e.getMessage();
+			}
+			//  --(4)、拼接返回字符串
+			String v_param="作业计划号{"+v_rec_asw.getPlan_no()+"}入口钢卷号{"+v_rec_asw.getIn_mat_no()+"}机台代码{"+v_rec_asw.getUnit_code()+"}";
+			//  --(5)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfBaf01LogMapper.class).doInsert(null,"Baf01L3AswL2Revoke",v_param,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="L2RevokeBaf01Pdi_D处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="L2RevokeBaf01Pdi_D处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 L2RevokeBaf01Pdi 调用;																																							
+		2)、	接口参数 IN:V_REC_REVOKE(L2计划钢卷删除实体对象实例)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_revoke
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String L2RevokeBaf01Pdi_D_D(IfBaf01RevokeL2 v_rec_revoke,Integer v_success,
+			String v_message) throws Exception {
+		//  --(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		try{
+			String plan_no=v_rec_revoke.getPlan_no()==null?"":v_rec_revoke.getPlan_no();
+			String in_mat_no=v_rec_revoke.getIn_mat_no()==null?"":v_rec_revoke.getIn_mat_no();//入口钢卷号
+			// --(1)、验证作业计划存在
+			List<PlnAnnealPlanDetail> v_rec_pln_d=this.getMapper(PlnAnnealPlanDetailMapper.class).doQuery2(plan_no,in_mat_no);
+			if(v_rec_pln_d==null || v_rec_pln_d.size()<=0){
+				v_message="罩退作业计划不存在!";
+				return v_message+"_success:"+v_success;
+			}
+			//  --(2)、验证已下发过PDI
+			if(v_rec_pln_d.get(0).getSend_flag()==null || "0".equals(v_rec_pln_d.get(0).getSend_flag())){
+				v_message="还未下发PDI!";
+				return v_message+"_success:"+v_success;
+			}
+			//  --(4)、验证当前还未生产交工
+			List<MesCrAnnealM> v_rec_anl_m = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null, "schedule_no='"+plan_no+"' and material_no='"+in_mat_no+"'", null, 0, 0);
+			if(v_rec_anl_m!=null && v_rec_anl_m.size()>0){
+				if("1".equals(v_rec_anl_m.get(0).getHand_over_status())){
+					v_message="已生产交工,不能删除钢卷!";
+					return v_message+"_success:"+v_success;
+				}
+			}
+			
+			//  --(3)、修改作业计划表下发L2状态
+			this.getMapper(PlnAnnealPlanDetailMapper.class).doUpdate3(v_rec_revoke.getPlan_no(),v_rec_revoke.getIn_mat_no());
+			//  --(4)、提交事务
+			//唯一标示操作成功的地方
+			v_success=1;
+			v_message="L2计划钢卷删除处理完成!"+"_success:"+v_success;
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="L2计划钢卷删除处理出错:"+e.getMessage().substring(0,200)+"_success:"+v_success;
+			}else{
+				v_message="L2计划钢卷删除处理出错:"+e.getMessage()+"_success:"+v_success;
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 L2RevokeBaf01Pdi_D 调用;																																							
+	    2)、	接口参数 IN:V_REC_ASW(L3应答L2计划信息电文对象)																																							
+	    3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_asw
+	 * @param v_message
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Baf01L3AswL2Revoke(IfBaf01L3AswL2Plan v_rec_asw,
+			String v_message) throws Exception{
+		Integer v_flag=null;// --电文发送成功标志
+		try{
+			//  --(1)、无接口调试时,设置1,直接跳过,否则设置为0
+			v_flag=0;//
+			//  --(2)、调用公司接口,将“L3应答L2计划信息电文” v_rec_asw 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_asw,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				String url="";
+				if("M0004".equals(v_rec_asw.getUnit_code())){
+					url = ANNEALPDI3;
+				}else if("M0006".equals(v_rec_asw.getUnit_code())){
+					url = ANNEALPDI3_AI;
+				}else if("M0005".equals(v_rec_asw.getUnit_code()) || "M0009".equals(v_rec_asw.getUnit_code())){
+					url = ANNEALPDI3_NAN;
+				}
+				log.debug("url:"+url);
+				
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3应答L2计划信息电文成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="L3应答L2计划信息电文,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="L3应答L2计划信息电文,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		            //v_message="原料卷号{"+v_rec_mat_d.get(0).getObject_no()+"}已下发PDI给L2!";
+		        }else{
+		        	v_message="L3应答L2计划信息电文失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			//  --(2.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Baf01L3AswL2Revoke L3应答L2计划信息电文发送失败!"+v_message;
+				return v_message;
+			}
+			//  --(3)、开始事物:插入接口记录表相关信息																																							
+			//  --(3.1)、插入 IF_BAF01_L3_ASW_L2_PLAN L3应答L2计划信息电文发送记录																																							
+			this.getMapper(IfBaf01L3AswL2PlanMapper.class).insert(v_rec_asw);
+			//  --(4)、提交事务
+			v_message="Baf01L3AswL2Revoke L3应答L2计划信息电文发送成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(5)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(5.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Baf01L3AswL2Revoke L3应答L2计划信息电文发送成功:"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Baf01L3AswL2Revoke L3应答L2计划信息电文发送成功:"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Baf01L3AswL2Revoke L3应答L2计划信息电文发送失败:"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Baf01L3AswL2Revoke L3应答L2计划信息电文发送失败:"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到罩退L2产出实绩电文时调用;																																							
+		2)、	此接口参数为JSON对象(对象结构见数据库表 IF_BAF01_PDO_M);																																							
+	 * @param json
+	 * @return
+	 */
+	public String ReceiveBaf01Pdo_M(IfBaf01PdoM json) throws Exception{
+		String v_message="";
+		if(json==null || "".equals(json.toString())){
+			v_message="二级接口-宝信罩退炉PDO-产出实绩为空";
+			return v_message;
+		}
+		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_pdo 代替描述
+		//暂定
+		IfBaf01PdoM v_rec_pdo=json;
+		//  --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_pdo.getMsg_time()==null){
+			v_rec_pdo.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入L2产出实绩表(单独的事务)  
+		try{
+			this.getMapper(IfBaf01PdoMMapper.class).insert(v_rec_pdo);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理L2产出实绩函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).ReceiveBaf01Pdo_M_D(v_rec_pdo, v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}
+		//  --(5)、拼接接口参数字符串
+		String  v_params = "作业计划号1{"+v_rec_pdo.getPlan_no_1()+"} "+"入口钢卷号1{" +																																							
+	              v_rec_pdo.getIn_mat_no_1()+"} "+"炉内序号1{" +																																							
+	              v_rec_pdo.getIn_fur_seq_1()+"} "+"作业计划号2{" +																																							
+	              v_rec_pdo.getPlan_no_2()+"} "+"入口钢卷号2{" +																																							
+	              v_rec_pdo.getIn_mat_no_2()+"} "+"炉内序号2{" +																																							
+	              v_rec_pdo.getIn_fur_seq_2()+"} "+"作业计划号3{" +																																							
+	              v_rec_pdo.getPlan_no_3()+"} "+"入口钢卷号3{" +																																							
+	              v_rec_pdo.getIn_mat_no_3()+"} "+"炉内序号3{" +																																							
+	              v_rec_pdo.getIn_fur_seq_3()+"} "+"作业计划号4{" +																																							
+	              v_rec_pdo.getPlan_no_4()+"} "+"入口钢卷号4{" +																																							
+	              v_rec_pdo.getIn_mat_no_4()+"} "+"炉内序号4{" +																																							
+	              v_rec_pdo.getIn_fur_seq_4()+"} "+"作业计划号5{" +																																							
+	              v_rec_pdo.getPlan_no_5()+"} "+"入口钢卷号5{" +																																							
+	              v_rec_pdo.getIn_mat_no_5()+"} "+"炉内序号5{" +																																							
+	              v_rec_pdo.getIn_fur_seq_5()+"} "+"作业计划号6{" +																																							
+	              v_rec_pdo.getPlan_no_6()+"} "+"入口钢卷号6{" +																																							
+	              v_rec_pdo.getIn_mat_no_6()+"} "+"炉内序号6{" +																																							
+	              v_rec_pdo.getIn_fur_seq_6()+"} "+"作业计划号7{" +																																							
+	              v_rec_pdo.getPlan_no_7()+"} "+"入口钢卷号7{" +																																							
+	              v_rec_pdo.getIn_mat_no_7()+"} "+"炉内序号7{" +																																							
+	              v_rec_pdo.getIn_fur_seq_7()+"} "+"作业计划号8{" +																																							
+	              v_rec_pdo.getPlan_no_8()+"} "+"入口钢卷号8{" +																																							
+	              v_rec_pdo.getIn_mat_no_8()+"} "+"炉内序号8{" +																																							
+	              v_rec_pdo.getIn_fur_seq_8()+"} "+"炉次号{" +																																							
+	              v_rec_pdo.getFurnace_batch_no()+"}"; 																																			
+		//  --(6)、写接口日志:与业务处理分开,单独的事务
+		try{
+			List<MesCrAnnealM> list = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null, "material_no='"+v_rec_pdo.getIn_mat_no_1()+"'", "", 0, 0);
+			if(list!=null && list.size()>0){
+				v_params="机台代码【"+list.get(0).getMachine_code()+"】"+v_params;
+			}
+			this.getMapper(IfBaf01LogMapper.class).doInsert(null,"ReceiveBaf01Pdo_M",v_params,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		return v_message;
+	}
+		
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 ReceiveBaf01Pdo_M 调用;																																							
+		2)、	接口参数 IN:V_REC_PDO(L2产出实绩对象实例)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdo
+	 * @param v_message
+	 * @return
+	 * @throws Exception 
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String ReceiveBaf01Pdo_M_D(IfBaf01PdoM v_rec_pdo, String v_message) throws Exception {
+		Integer v_cnt;
+		//  --(1)、根据电文中,构建作业计划号、钢卷号、炉内序号集合
+		List<String> v_plan_no=new ArrayList<>();
+		List<String> v_material_no=new ArrayList<>();
+		List<Long> v_fur_seq=new ArrayList<>();
+		try{
+			
+		//  --炉内第1卷(炉内位置由下往上递增)
+		if(v_rec_pdo.getPlan_no_1()!=null && v_rec_pdo.getIn_mat_no_1()!=null
+				&& !"".equals(v_rec_pdo.getPlan_no_1()) && !"".equals(v_rec_pdo.getIn_mat_no_1())){
+			v_plan_no.add(v_rec_pdo.getPlan_no_1());
+			v_material_no.add(v_rec_pdo.getIn_mat_no_1());
+			v_fur_seq.add(v_rec_pdo.getIn_fur_seq_1());
+		}
+		//  --炉内第2卷(炉内位置由下往上递增)
+		if(v_rec_pdo.getPlan_no_2()!=null && v_rec_pdo.getIn_mat_no_2()!=null
+				&& !"".equals(v_rec_pdo.getPlan_no_2()) && !"".equals(v_rec_pdo.getIn_mat_no_2())){
+			v_plan_no.add(v_rec_pdo.getPlan_no_2());
+			v_material_no.add(v_rec_pdo.getIn_mat_no_2());
+			v_fur_seq.add(v_rec_pdo.getIn_fur_seq_2());
+		}
+		//  --炉内第3卷(炉内位置由下往上递增)
+		if(v_rec_pdo.getPlan_no_3()!=null && v_rec_pdo.getIn_mat_no_3()!=null
+				&& !"".equals(v_rec_pdo.getPlan_no_3()) && !"".equals(v_rec_pdo.getIn_mat_no_3())){
+			v_plan_no.add(v_rec_pdo.getPlan_no_3());
+			v_material_no.add(v_rec_pdo.getIn_mat_no_3());
+			v_fur_seq.add(v_rec_pdo.getIn_fur_seq_3());
+		}
+		//  --炉内第4卷(炉内位置由下往上递增)
+		if(v_rec_pdo.getPlan_no_4()!=null && v_rec_pdo.getIn_mat_no_4()!=null
+				&& !"".equals(v_rec_pdo.getPlan_no_4()) && !"".equals(v_rec_pdo.getIn_mat_no_4())){
+			v_plan_no.add(v_rec_pdo.getPlan_no_4());
+			v_material_no.add(v_rec_pdo.getIn_mat_no_4());
+			v_fur_seq.add(v_rec_pdo.getIn_fur_seq_4());
+		}
+		//  --炉内第5卷(炉内位置由下往上递增)
+		if(v_rec_pdo.getPlan_no_5()!=null && v_rec_pdo.getIn_mat_no_5()!=null
+				&& !"".equals(v_rec_pdo.getPlan_no_5()) && !"".equals(v_rec_pdo.getIn_mat_no_5())){
+			v_plan_no.add(v_rec_pdo.getPlan_no_5());
+			v_material_no.add(v_rec_pdo.getIn_mat_no_5());
+			v_fur_seq.add(v_rec_pdo.getIn_fur_seq_5());
+		}		
+		//  --炉内第6卷(炉内位置由下往上递增)
+		if(v_rec_pdo.getPlan_no_6()!=null && v_rec_pdo.getIn_mat_no_6()!=null
+				&& !"".equals(v_rec_pdo.getPlan_no_6()) && !"".equals(v_rec_pdo.getIn_mat_no_6())){
+			v_plan_no.add(v_rec_pdo.getPlan_no_6());
+			v_material_no.add(v_rec_pdo.getIn_mat_no_6());
+			v_fur_seq.add(v_rec_pdo.getIn_fur_seq_6());
+		}
+		//  --炉内第7卷(炉内位置由下往上递增)
+		if(v_rec_pdo.getPlan_no_7()!=null && v_rec_pdo.getIn_mat_no_7()!=null
+				&& !"".equals(v_rec_pdo.getPlan_no_7()) && !"".equals(v_rec_pdo.getIn_mat_no_7())){
+			v_plan_no.add(v_rec_pdo.getPlan_no_7());
+			v_material_no.add(v_rec_pdo.getIn_mat_no_7());
+			v_fur_seq.add(v_rec_pdo.getIn_fur_seq_7());
+		}	
+		//  --炉内第8卷(炉内位置由下往上递增)
+		if(v_rec_pdo.getPlan_no_8()!=null && v_rec_pdo.getIn_mat_no_8()!=null
+				&& !"".equals(v_rec_pdo.getPlan_no_8()) && !"".equals(v_rec_pdo.getIn_mat_no_8())){
+			v_plan_no.add(v_rec_pdo.getPlan_no_8());
+			v_material_no.add(v_rec_pdo.getIn_mat_no_8());
+			v_fur_seq.add(v_rec_pdo.getIn_fur_seq_8());
+		}		
+		if(v_plan_no.size()<=0){
+			v_message="电文中未包含钢卷信息,无法处理!";
+			return v_message;
+		}
+		//  --(1.1)、根据生产开始时刻,计算投料日期、班次
+		Date v_charge_time=null;
+		if(v_rec_pdo.getStart_prod_time()==null || "".equals(v_rec_pdo.getStart_prod_time())){
+			v_message="电文中生产开始时间为空,无法计算投料日期班次!";
+			return v_message;
+		}else{
+			//    --将生产开始时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+			try {
+				//v_charge_time = DateUtil.formatString(v_rec_pdo.getStart_prod_time(), "yyyyMMddHHmmss");
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_pdo.getStart_prod_time());
+				v_charge_time=li.get(0).getCreate_time();
+			} catch (Exception e) {
+				e.printStackTrace();
+				v_message="电文中生产开始时间{"+v_rec_pdo.getStart_prod_time()+"} 格式转化失败,无法计算投料日期班次!约定的标准格式【yyyyMMddHHmmss】";
+				return v_message;
+			}
+		}
+		String rmDb=DateUtil.formatDate(v_charge_time, "yyyy-MM-dd HH:mm:ss");
+		String v_charge_date=null,v_charge_ord=null;
+		String dbTime=rmDb.substring(11);
+		v_charge_date=rmDb.substring(0,10);
+		// --(1.1.1)、如果 v_charge_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_charge_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+		if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+			v_charge_ord="1";
+		}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+			v_charge_ord="2";
+		}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+			v_charge_ord="1";
+			SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+			Date date;
+			try {
+				date = formatYmd.parse(v_charge_date);
+			} catch (Exception e) {
+				return "获取数据库时间失败,请稍后重试";
+			}
+			Calendar c = Calendar.getInstance();  
+	        c.setTime(date);  
+	        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+	        v_charge_date=formatYmd.format(c.getTime());
+		}
+		//  --(1.2)、根据生产结束时刻,计算产出日期、班次
+		Date v_discharge_time=null;
+		if(v_rec_pdo.getEnd_prod_time()==null || "".equals(v_rec_pdo.getEnd_prod_time())){
+			v_message="电文中生产结束时间为空,无法计算产出日期班次!";
+			return v_message;
+		}else{
+			//    --将生产结束时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+			try {
+				//v_discharge_time = DateUtil.formatString(v_rec_pdo.getEnd_prod_time(), "yyyyMMddHHmmss");
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_pdo.getEnd_prod_time());
+				v_discharge_time=li.get(0).getCreate_time();
+				//L2发送的生产结束时间不准,生产结束时间   !!!!!
+				
+			} catch (Exception e) {
+				e.printStackTrace();
+				v_message="电文中生产结束时间{"+v_rec_pdo.getEnd_prod_time()+"} 格式转化失败,无法计算产出日期班次!约定的标准格式【yyyyMMddHHmmss】";
+				return v_message;
+			}
+		}
+		String rmDb2=DateUtil.formatDate(v_discharge_time, "yyyy-MM-dd HH:mm:ss");
+		String v_discharge_date=null,v_discharge_ord=null;
+		String dbTime2=rmDb2.substring(11);
+		v_discharge_date=rmDb2.substring(0,10);
+		// --(1.2.1)、如果 v_discharge_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_discharge_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+		if(dbTime2.compareTo(DateUtil.NBeginTime)>-1&&dbTime2.compareTo(DateUtil.BeginTime)<0){
+			v_discharge_ord="1";
+		}else if(dbTime2.compareTo(DateUtil.BeginTime)>-1&&dbTime2.compareTo(DateUtil.EndTime)<0){
+			v_discharge_ord="2";
+		}else if(dbTime2.compareTo(DateUtil.EndTime)>-1&&dbTime2.compareTo(DateUtil.NEndTime)<0){
+			v_discharge_ord="1";
+			SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+			Date date;
+			try {
+				date = formatYmd.parse(v_discharge_date);
+			} catch (Exception e) {
+				return "获取数据库时间失败,请稍后重试";
+			}
+			Calendar c = Calendar.getInstance();  
+	        c.setTime(date);  
+	        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+	        v_discharge_date=formatYmd.format(c.getTime());
+		}
+		
+		//2019-02-21
+		/*
+		检验批分批规则:
+			同炉次号向下相同牌号、相同尺寸(厚度、宽度)的物料集合生成一个检验批号
+			检验批号编码规则:炉次号+两位流水号,示例:2619000401) 
+		 */
+		List<MesCrAnnealM> v_rec_baf_mList = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null,"batch_no='"+v_rec_pdo.getFurnace_batch_no()+"'", null, 0, 0);
+		Map<String, List<MesCrAnnealM>> mc_list =new HashMap<String, List<MesCrAnnealM>>();
+		if(v_rec_baf_mList!=null && v_rec_baf_mList.size()>0){
+				try{
+					mc_list = groupBillingDataByExcpBatchCode(v_rec_baf_mList);
+				}catch(Exception e){
+					
+				}
+		}
+				
+		
+		
+		//质量检验委托
+		List<QcmJhySampleFromPlan> lqsfp=new ArrayList<>();
+		//  --处理逻辑思路:类似页面“上料”按钮操作的相关处理逻辑
+		//  --(2)、循环 { 作业计划号、原料卷号 } 集合中各元素
+		//for(String plan_no:v_plan_no){
+		for(int i=0;i<v_plan_no.size();i++){
+			//    --(2.1)、验证罩退作业计划主记录存在
+			v_cnt = this.getMapper(PlnAnnealPlanMapper.class).countWithCondition(null, "an_plan_no='"+v_plan_no.get(i)+"'");
+			if(v_cnt<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 作业计划主记录不存在!";
+				throw new Exception(v_message);
+			}
+			//    --(2.2)、验证罩退作业计划明细记录存在
+			v_cnt=this.getMapper(PlnAnnealPlanDetailMapper.class).countWithCondition(null, "an_plan_no='"+v_plan_no.get(i)+"' and object_no='"+v_material_no.get(i)+"'");
+			if(v_cnt<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 作业计划明细记录不存在!";
+				throw new Exception(v_message);
+			}else if(v_cnt>1){
+				//      --计划表 pln_anneal_plan_detail 未设置唯一约束,考虑极端情况下程序BUG导致的数据错误
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 存在一条以上作业计划明细记录,无法处理!";
+				throw new Exception(v_message);
+			}
+			List<PlnAnnealPlanDetail> v_rec_pln_d_list = this.getMapper(PlnAnnealPlanDetailMapper.class).findWithCondition(null, "an_plan_no='"+v_plan_no.get(i)+"' and object_no='"+v_material_no.get(i)+"'", null, 0, 0);
+			PlnAnnealPlanDetail v_rec_pln_d=v_rec_pln_d_list.get(0);
+			//    --(2.3)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此PDO生产主实绩)
+			List<MesCrAnnealM> v_rec_baf_m_list = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null,"schedule_no='"+v_plan_no.get(i)+"' and material_no='"+v_material_no.get(i)+"'", null, 0, 0);
+			MesCrAnnealM v_rec_baf_m=new MesCrAnnealM();
+			MesCrAnnealM v_rec_baf_m_last=new MesCrAnnealM();
+			if(v_rec_baf_m_list!=null && v_rec_baf_m_list.size()>0){
+				if("1".equals(v_rec_baf_m_list.get(0).getHand_over_status())){
+					v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 已生产交工,忽略此PDO生产主实绩!";
+					throw new Exception(v_message);
+				}
+				v_rec_baf_m=v_rec_baf_m_list.get(0);
+				v_rec_baf_m_last=v_rec_baf_m_list.get(0);
+			}
+			
+			
+			//    --(2.4)、验证机台基础信息存在
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).countWithCondition(null,"machine_code='"+v_rec_pln_d.getMachine_code()+"'");
+			if(v_cnt<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 机台代码{"+v_rec_pln_d.getMachine_code()+"} 机台基础信息不存在!";
+				throw new Exception(v_message);
+			}
+			//    --(2.5)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class).findWithCondition(null,
+					"machine_code='"+v_rec_pln_d.getMachine_code()+"'", null, 0, 0);
+			String v_mch_mark=lcbm.get(0).getMachine_mark();
+			if(v_mch_mark==null){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 机台代码{"+v_rec_pln_d.getMachine_code()+"} 设备编号未配置,无法处理!";
+				throw new Exception(v_message);
+			}
+			//    --(2.6)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in==null || v_rec_mtr_in.size()<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";
+				throw new Exception(v_message);
+			}
+			//    --(2.7)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_material_no.get(i)+"'", null, 0, 0);
+			if(v_rec_ydm_d==null || v_rec_ydm_d.size()<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 原料卷库存明细记录不存在!";
+				throw new Exception(v_message);
+			}
+			//验证原料卷号库存明细记录为“在库”状态 ??
+			
+			//    --(2.8)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			PlnMaterielDetail pmd2=new PlnMaterielDetail();
+			pmd2.setMat_object_no_vt(v_rec_pln_d.getObject_no_vt());
+			v_cnt = this.getMapper(PlnMaterielDetailMapper.class).count(pmd2);
+			if (v_cnt<=0) {
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 出口卷虚拟物料信息不存在!";
+				throw new Exception(v_message);
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BAN02".equals(v_rec_pln_d.getStatus()) || "5BAN03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			List<PlnMaterielDetail> v_rec_mtr_out=this.getMapper(PlnMaterielDetailMapper.class).doQueryWeb2(v_rec_pln_d.getObject_no_vt(),"");
+			//    --(2.9)、根据计算的投料日期班次,获取交接班记录的班组 
+			MesShiftM msm=new MesShiftM();
+			if(v_rec_pln_d.getMachine_code().equals("M0009")){
+				msm.setMachine_code("M0005");
+			}else{
+				msm.setMachine_code(v_rec_pln_d.getMachine_code());
+			}
+			msm.setWrk_date(v_charge_date);
+			msm.setWrk_ord(v_charge_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_charge_grp=null;
+			if(v_cnt<=0){
+				 v_charge_grp="";// --无交接班记录,则赋空值(交工时,会提示用户完善信息)
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_charge_grp=lmsm.get(0).getWrk_grp();
+			}
+			//    --(2.10)、根据计算的产出日期班次,获取交接班记录的班组
+			MesShiftM msm2=new MesShiftM();
+			if(v_rec_pln_d.getMachine_code().equals("M0009")){
+				msm2.setMachine_code("M0005");
+			}else{
+				msm2.setMachine_code(v_rec_pln_d.getMachine_code());
+			}
+			msm2.setWrk_date(v_discharge_date);
+			msm2.setWrk_ord(v_discharge_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm2);
+			String v_discharge_grp=null;
+			if(v_cnt<=0){
+				  String l2_grp=v_rec_pdo.getProd_shift_group(); //--无交接班记录,是使用电文中的生产班别
+				  if("A".equals(l2_grp)){
+					  v_discharge_grp = "1"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("B".equals(l2_grp)){
+					  v_discharge_grp = "2"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("C".equals(l2_grp)){
+					  v_discharge_grp = "3"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("D".equals(l2_grp)){
+					  v_discharge_grp = "4"; //--无交接班记录,是使用电文中的生产班别
+				  }
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm2, 0, 0);
+				v_discharge_grp=lmsm.get(0).getWrk_grp();
+			}
+			//    --(2.11)、出口卷编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(退火T)+ 2位设备代号(01-99)
+			//String v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_mch_mark, 2, "0");
+//			String v_coil_no=null;
+//			if(v_rec_pdo.getFurnace_no()!=null && !"".equals(v_rec_pdo.getFurnace_no())){
+//				v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_rec_pdo.getFurnace_no(), 2, "0");
+//			}else{
+//				v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_mch_mark, 2, "0");
+//			}
+			String v_coil_no=null;
+			String v_leo="";
+			if(v_rec_pdo.getFurnace_no()!=null && !"".equals(v_rec_pdo.getFurnace_no())){
+				int leo1x = Integer.parseInt(v_rec_pdo.getFurnace_no());
+				v_rec_pdo.setFurnace_no(leo1x+"");
+				String v_syh=lpad(v_rec_pdo.getFurnace_no(), 2, "0");
+				if(v_rec_baf_m.getCoil_no()!=null){
+					v_leo=v_rec_baf_m.getCoil_no().substring(v_rec_baf_m.getCoil_no().length()-4, v_rec_baf_m.getCoil_no().length()-2);
+					if(!v_syh.equals(v_leo)){
+						v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_rec_pdo.getFurnace_no(), 2, "0");
+					}else{
+						v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_rec_pdo.getFurnace_no(), 2, "0");
+					}
+				}else{
+					v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_rec_pdo.getFurnace_no(), 2, "0");
+				}
+				
+			}else{
+				v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_mch_mark, 2, "0");
+			}
+			
+			
+			//    --(2.11.1)、获取当前起始流水号
+			v_cnt=this.getMapper(MesCrAnnealMMapper.class).doQueryWeb6(v_coil_no,v_plan_no.get(i),v_material_no.get(i));
+			if(v_cnt==null){
+				v_cnt=1;
+			}else if(v_cnt>99){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 出口钢卷号超出规则范围,流水号超出最大值99!";
+				throw new Exception(v_message);
+			}
+			//--(2.11.2)、出口卷编码规则:出口卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(退火T)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)																																						
+			v_coil_no=v_coil_no+lpad(v_cnt+"",2,"0");
+			//如果之前有,就用之前的
+			if(v_rec_pdo.getFurnace_no()!=null && !"".equals(v_rec_pdo.getFurnace_no())){
+				String v_syh=lpad(v_rec_pdo.getFurnace_no(), 2, "0");
+				if(v_rec_baf_m.getCoil_no()!=null){
+					v_leo=v_rec_baf_m.getCoil_no().substring(v_rec_baf_m.getCoil_no().length()-4, v_rec_baf_m.getCoil_no().length()-2);
+					if(v_syh.equals(v_leo)){
+						v_coil_no=v_rec_baf_m.getCoil_no();
+					}else{
+						
+					}
+					
+				}else{
+					//v_rec_cam.setCoil_no(v_coil_no);
+				}
+				
+			}
+			
+			
+			
+			//    --(2.12)、删除可能存在罩退作业实绩
+			this.getMapper(MesCrAnnealMMapper.class).doDelete2(v_plan_no.get(i),v_material_no.get(i));
+			
+		    //--(2.13)、在 v_rec_baf_m 对象基础上,构建罩退主实绩,并插入记录																																							
+		    //--(2.13.1):v_rec_baf_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值,如:相关事件时刻)																																							
+		    //--(2.13.2):v_rec_baf_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)																																							
+			//MesCrAnnealM v_rec_baf_m=new MesCrAnnealM();
+			v_rec_baf_m.setSchedule_no ( v_plan_no.get(i)); //作业计划号																																							
+			v_rec_baf_m.setMaterial_no ( v_material_no.get(i)); //原料卷号																																							
+			v_rec_baf_m.setMaterial_no_vt( v_rec_pln_d.getObject_no_vt()); //虚拟原料卷号																																							
+			v_rec_baf_m.setPln_steel_code( v_rec_mtr_in.get(0).getSteel_code()); //计划原料卷牌号																																							
+			v_rec_baf_m.setPln_mtr_thk ( v_rec_mtr_in.get(0).getThick()); //计划原料卷厚度																																							
+			v_rec_baf_m.setPln_mtr_wdt ( v_rec_mtr_in.get(0).getWidth()); //计划原料卷宽度																																							
+			v_rec_baf_m.setPln_mtr_len ( v_rec_mtr_in.get(0).getLength()); //计划原料卷长度																																							
+			v_rec_baf_m.setPln_mtr_inn_dia ( v_rec_mtr_in.get(0).getDiameter_inn()); //计划原料卷内径																																							
+			v_rec_baf_m.setPln_mtr_out_dia (v_rec_mtr_in.get(0).getDiameter_out()); //计划原料卷外径																																							
+			v_rec_baf_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.get(0).getSingle_weight()); //计划原料卷理重																																							
+			v_rec_baf_m.setMaterial_no_src ( v_rec_ydm_d.get(0).getMaterailcoilno()); //原始卷号																																							
+			v_rec_baf_m.setMtr_thk ( v_rec_ydm_d.get(0).getThick()); //原料卷厚度																																							
+			v_rec_baf_m.setMtr_wdt ( v_rec_ydm_d.get(0).getWidth()); //原料卷宽度																																							
+			v_rec_baf_m.setMtr_len ( v_rec_ydm_d.get(0).getLength()); //原料卷长度																																							
+			v_rec_baf_m.setMtr_inn_dia ( v_rec_ydm_d.get(0).getDiameter_inn()); //原料卷内径																																							
+			v_rec_baf_m.setMtr_out_dia ( v_rec_ydm_d.get(0).getDiameter_out()); //原料卷外径																																							
+			v_rec_baf_m.setMtr_thr_wgt ( v_rec_ydm_d.get(0).getTheoryweight()); //原料卷理重																																							
+			v_rec_baf_m.setMtr_act_wgt ( v_rec_ydm_d.get(0).getFactweight()); //原料卷实重																																							
+			v_rec_baf_m.setSteel_code( v_rec_ydm_d.get(0).getSteelcode()); //原料卷牌号																																							
+			v_rec_baf_m.setMachine_code( v_rec_pln_d.getMachine_code()); //机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			v_rec_baf_m.setBatch_no( v_rec_pdo.getFurnace_batch_no()); //炉批号(2位炉座号+ 2位年份 + 4位流水号)																																							
+			v_rec_baf_m.setFurnace_no( v_rec_pdo.getFurnace_no()); //炉座号(1-5 艾伯纳,6-16中冶南方、17-26宝信)																																							
+			v_rec_baf_m.setIn_fur_seq( v_fur_seq.get(i)); //炉内位置																																							
+			v_rec_baf_m.setStatus( "12"); //状态(00:组垛完成、01:上炉台、02:扣加热罩、03:加热开始、04:加热结束、05:带罩冷却开始、06:带罩冷却结束、07:风冷开始、08:风冷结束、09:水冷开始、10:水冷结束、11:出炉/上终冷台、12:下终冷台)																																							
+			v_rec_baf_m.setCharge_date ( v_charge_date); //投料日期(YYYY-MM-DD)																																							
+			v_rec_baf_m.setCharge_ord( v_charge_ord); //投料班次(1晚班、2白班、3中班)																																							
+			v_rec_baf_m.setCharge_grp( v_charge_grp); //投料班组(1甲班、2乙班、3丙班、4丁班)																																							
+			v_rec_baf_m.setCharge_time ( v_charge_time); //投料时间/生产开始时间																																							
+			//v_rec_baf_m.setHeat_hood ( v_rec_pdo.getHeat_hood()); //加热罩号	
+			if(v_rec_baf_m.getHeat_hood()!=null && !v_rec_baf_m.getHeat_hood().contains("-")){
+				
+			}else{
+				v_rec_baf_m.setHeat_hood ( v_rec_pdo.getHeat_hood()); //加热罩号		
+			}
+			
+			//加热开始时刻(字符串转化为时间,可能为空,做好异常处理)	
+			Date event_time_heat_str =null;
+			try{
+				if(v_rec_pdo.getHeat_start_time()!=null && v_rec_pdo.getHeat_start_time().length()>0){
+					List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_pdo.getHeat_start_time());
+					if(li!=null && li.size()>0){
+						event_time_heat_str=li.get(0).getCreate_time();
+					}
+				}
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+			//v_rec_baf_m.setEvent_time_heat_str ( DateUtil.formatString(v_rec_pdo.getHeat_start_time(), "yyyyMMddHHmmss")); //加热开始时刻(字符串转化为时间,可能为空,做好异常处理)																																							
+			v_rec_baf_m.setEvent_time_heat_str (event_time_heat_str); //加热开始时刻(字符串转化为时间,可能为空,做好异常处理)																																							
+			
+			v_rec_baf_m.setHeating_time( v_rec_pdo.getHeating_time()); //实际升温时间																																							
+			v_rec_baf_m.setKeeping_time( v_rec_pdo.getKeeping_time()); //实际保温时间																																							
+			v_rec_baf_m.setHoodoff_temp( v_rec_pdo.getHoodoff_temp()); //去加热罩温度																																							
+			v_rec_baf_m.setAnneal_diagram_code ( v_rec_pdo.getAnneal_diagram_code()); //退火曲线代码																																							
+			v_rec_baf_m.setAnneal_temp_min ( v_rec_pdo.getAnneal_temp_min()); //退火温度最小值																																							
+			v_rec_baf_m.setAnneal_temp_avg ( v_rec_pdo.getAnneal_temp_avg()); //退火温度平均值																																							
+			v_rec_baf_m.setAnneal_temp_max ( v_rec_pdo.getAnneal_temp_max()); //退火温度最大值	
+			//注意!!!!!
+			v_rec_baf_m.setCooling_time_hood ( v_rec_pdo.getCooling_time_hood()); //带罩冷却时长(min)																																							
+			//v_rec_baf_m.setCool_hood ( v_rec_pdo.getCool_hood()); //冷却罩号
+			if(v_rec_baf_m.getCool_hood()!=null && !v_rec_baf_m.getCool_hood().contains("-")){
+				
+			}else{
+				v_rec_baf_m.setCool_hood ( v_rec_pdo.getCool_hood()); //冷却罩号
+			}
+			//冷却开始时刻(字符串转化为时间,可能为空,做好异常处理)	
+			Date cool_start_time =null;
+			try{
+				if(v_rec_pdo.getCool_start_time()!=null && v_rec_pdo.getCool_start_time().length()>0){
+					List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_pdo.getCool_start_time());
+					if(li!=null && li.size()>0){
+						cool_start_time=li.get(0).getCreate_time();
+					}
+				}
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+			//v_rec_baf_m.setCool_start_time (DateUtil.formatString(v_rec_pdo.getCool_start_time(), "yyyyMMddHHmmss")); //冷却开始时刻(字符串转化为时间,可能为空,做好异常处理)																																							
+			v_rec_baf_m.setCool_start_time (cool_start_time);
+			
+			v_rec_baf_m.setCooling_time( v_rec_pdo.getCooling_time()); //实际冷却时间																																							
+			v_rec_baf_m.setCooling_mode( v_rec_pdo.getCooling_mode()); //冷却方式(01:带罩、02:不带罩)																																							
+			//v_rec_baf_m.setFc_no ( v_rec_pdo.getFc_no()); //终冷台号	
+			if(v_rec_baf_m.getFc_no()!=null && !v_rec_baf_m.getFc_no().contains("-")){
+				
+			}else{
+				v_rec_baf_m.setFc_no ( v_rec_pdo.getFc_no()); //终冷台号		
+			}
+			
+			v_rec_baf_m.setOut_temp_set( v_rec_pdo.getOut_temp_set()); //出炉设定温度		
+			//L2发送的生产结束时间不准,生产结束时间   !!!!!
+			v_rec_baf_m.setDischarge_date( v_discharge_date); //产出日期(YYYY-MM-DD)																																							
+			v_rec_baf_m.setDischarge_ord ( v_discharge_ord); //产出班次(1晚班、2白班、3中班)																																							
+			v_rec_baf_m.setDischarge_grp ( v_discharge_grp); //产出班组(1甲班、2乙班、3丙班、4丁班)																																							
+			v_rec_baf_m.setDischarge_time( v_discharge_time); //产出时间/生产结束时间																																							
+			v_rec_baf_m.setPersist_prod_time ( v_rec_pdo.getPersist_prod_time()); //生产持续时长																																							
+			v_rec_baf_m.setCoil_no ( v_coil_no); //产出卷号																																							
+			v_rec_baf_m.setAim_thk ( v_rec_mtr_out.get(0).getThick()); //产出卷目标厚度																																							
+			v_rec_baf_m.setAim_wdt ( v_rec_mtr_out.get(0).getWidth()); //产出卷目标宽度																																							
+			v_rec_baf_m.setAim_len ( v_rec_mtr_out.get(0).getLength()); //产出卷目标长度																																							
+			v_rec_baf_m.setAim_inn_dia ( v_rec_mtr_out.get(0).getDiameter_inn()); //产出卷目标内径																																							
+			v_rec_baf_m.setAim_out_dia ( v_rec_mtr_out.get(0).getDiameter_out()); //产出卷目标外径																																							
+			v_rec_baf_m.setAct_thk ( v_rec_ydm_d.get(0).getThick()); //产出卷厚度																																							
+			v_rec_baf_m.setAct_wdt ( v_rec_ydm_d.get(0).getWidth()); //产出卷宽度																																							
+			v_rec_baf_m.setAct_len ( v_rec_ydm_d.get(0).getLength()); //产出卷长度																																							
+			v_rec_baf_m.setAct_inn_dia ( v_rec_ydm_d.get(0).getDiameter_inn()); //产出卷内径																																							
+			v_rec_baf_m.setAct_out_dia ( v_rec_ydm_d.get(0).getDiameter_out()); //产出卷外径																																							
+			v_rec_baf_m.setCoil_thr_wgt( v_rec_ydm_d.get(0).getTheoryweight()); //产出卷理重																																							
+			v_rec_baf_m.setCoil_act_wgt( v_rec_ydm_d.get(0).getFactweight()); //产出卷实量																																							
+			v_rec_baf_m.setProd_order_no ( v_rec_mtr_out.get(0).getProd_order_no()); //生产订单号																																							
+			v_rec_baf_m.setOrder_no( v_rec_mtr_out.get(0).getOrder_no()); //订单号																																							
+			v_rec_baf_m.setMemo( null); //备注																																							
+			v_rec_baf_m.setHand_over_status( "0"); //交工状态																																							
+			v_rec_baf_m.setHand_over_time( null); //交工时间																																							
+			v_rec_baf_m.setHand_over_opr ( null); //交工人
+			//    --如果 v_rec_baf_m 对象为空(即之前无生产实绩),则:
+			if(v_rec_baf_m.getCreate_opr()==null){
+				v_rec_baf_m.setCreate_opr("L2_PDO");
+				v_rec_baf_m.setCreate_time(new Date());
+			}else{//    --如果 v_rec_baf_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				v_rec_baf_m.setUpdate_opr("L2_PDO");
+				v_rec_baf_m.setUpdate_time(new Date());
+			}
+			//    --(2.13.3)、插入罩退实绩记录
+			this.getMapper(MesCrAnnealMMapper.class).insert(v_rec_baf_m);
+		    //	  --(2.14)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			//  --(2.14.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+			  																																							
+			//  --(2.15)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			//  --(2.15.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+			//  --(4.10)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供); ??
+			MesCrAnnealM  mcsm=new MesCrAnnealM();
+			mcsm.setMachine_code(v_rec_baf_m.getMachine_code());//机台号
+			mcsm.setSchedule_no(v_rec_baf_m.getSchedule_no());//作业计划号
+			mcsm.setMaterial_no(v_rec_baf_m.getMaterial_no());//投料卷号
+			mcsm.setMaterial_no_vt(v_rec_baf_m.getMaterial_no_vt());//虚拟卷号 
+			List<MesCrAnnealM> lmcsm=new ArrayList<MesCrAnnealM>();
+			//时间
+			SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+		    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+		    mcsm.setMemo(date);
+		    lmcsm.add(mcsm);
+			//调用生产管理接口验证作业计划状态能执行此操作
+			boolean flag=true;
+			try{
+				this.getBean(MesApiAnnealPlanImpl.class).MesCrAnnealMAddValid(lmcsm);
+			}catch(Exception e){
+				flag=false;
+				e.printStackTrace();
+			}
+			if(flag){
+				//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+				this.getBean(MesApiAnnealPlanImpl.class).MesCrAnnealMAdd(lmcsm); 
+			}
+		    //--(18)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			//--(18.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作	
+			//判断原料卷是否已生产投料出库
+			YdmProductOutlist ypo=new YdmProductOutlist();
+			//ypo.setCoilno(v_rec_ydm_d.get(0).getCoilno());
+			ypo.setCoilno(v_rec_baf_m.getMaterial_no());
+			ypo.setOuttype("500501");
+			v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+			if(v_cnt<=0){
+				CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+				YdmProductDetail ypdu=new YdmProductDetail();
+				//ypdu.setCoilno(v_rec_ydm_d.get(0).getCoilno());//注意
+				ypdu.setCoilno(v_rec_baf_m.getMaterial_no());//注意
+				// 传入操作时间字符串带毫秒
+				ypdu.setMemo(date);
+				cp2.setObject(ypdu);
+				this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+			}
+			//=======================质量检验委托参数开始=============================
+			try{
+				QcmJhySampleFromPlan ajsfp=new QcmJhySampleFromPlan();
+				String prod_order_no=v_rec_mtr_out.get(0).getProd_order_no();
+				List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).findWithCondition(null, "prod_order_no='"+prod_order_no+"'", null, 0, 0);
+				if(lpp!=null && lpp.size()>0){
+					
+					if(mc_list!=null && mc_list.size()>0){
+						for(Map.Entry<String, List<MesCrAnnealM>> grouplist :mc_list.entrySet()){
+							String key = grouplist.getKey();
+							List<MesCrAnnealM> listCes = grouplist.getValue();
+							for(MesCrAnnealM mcam:listCes){
+								String anm_key=v_rec_baf_m.getSteel_code()+"T"+v_rec_baf_m.getMtr_thk()+"T"+v_rec_baf_m.getMtr_wdt();
+								if(anm_key.equals(key) && v_rec_baf_m.getMaterial_no().equals(mcam.getMaterial_no())){
+									ajsfp.setInspection_lot(mcam.getInspection_lot());
+									
+									MesCrAnnealM mCrossleo = new MesCrAnnealM();
+									//mCrossleo.setMachine_code(sum.getMemo1());
+									mCrossleo.setSchedule_no(mcam.getSchedule_no());
+									//mCrossleo.setMaterial_no_vt(mcm.getMaterial_no_vt());
+									mCrossleo.setMaterial_no(mcam.getMaterial_no());
+									mCrossleo.setInspection_lot(mcam.getInspection_lot());
+									this.getMapper(MesCrAnnealMMapper.class).update(mCrossleo);
+									
+								}
+							}
+						}
+					}
+					if(v_rec_baf_m_last!=null && v_rec_baf_m_last.getBatch_no()!=null){
+						if(!v_rec_baf_m_last.getBatch_no().equals(v_rec_pdo.getFurnace_batch_no())){
+							QcmJhySampleFromPlan qjsprem=new QcmJhySampleFromPlan();
+							qjsprem.setDesign_key(lpp.get(0).getDesign_key());
+							qjsprem.setInspection_lot(v_rec_baf_m_last.getInspection_lot());
+							CommonPage<QcmJhySampleFromPlan> sum=new CommonPage<QcmJhySampleFromPlan>();
+							sum.setObject(qjsprem);
+							this.getBean(QmsApiServiceImpl.class).removeInspection(sum);
+						}
+					}
+					
+					
+					ajsfp.setBatch_no(v_rec_baf_m.getBatch_no());//轧批号    炉次号
+					List<PlnProcessPlan> list_plnP = this.getMapper(PlnProcessPlanMapper.class).findWithCondition(null, "produce_no='"+lpp.get(0).getProduce_no()+"' and cut_order_no = 1", "", 0, 0);
+					if(list_plnP!=null && list_plnP.size()>0){
+						ajsfp.setContract_line_no(list_plnP.get(0).getPlan_no());//合同行信息  销售的订单的加工计划号
+					}
+					
+					ajsfp.setDesign_key(lpp.get(0).getDesign_key());//design_key的集合
+					//ajsfp.setGrade_code(lpp.get(0).getGrade_code());//炼钢牌号代码
+					//ajsfp.setGrade_name(grade_name);//炼钢牌号名称
+					ajsfp.setHeat_no(v_rec_baf_m.getBatch_no());//炉号       炉次号,??
+					//ajsfp.setInspection_lot(v_rec_baf_m.getBatch_no());//检验号    炉次号
+					ajsfp.setJudge("0");//用于判断是改判还是原判 0:原判;1:改判  no
+					ajsfp.setMaterial_no(v_rec_baf_m.getMaterial_no());//取样材料号   
+					ajsfp.setMsc_pline(lpp.get(0).getMsc_pline());//全程产线号  制成号
+					ajsfp.setOrder_no(lpp.get(0).getOrder_no());//销售订单号(合同号+订单行号,示例:YT-66G66001)
+					ajsfp.setBoard_no(v_rec_baf_m.getMaterial_no());
+					
+					ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_rec_baf_m.getMachine_code());
+					ComBasePline cbp = this.getMapper(ComBasePlineMapper.class).findById(cbm.getPline_code());
+					ajsfp.setPline_code(cbm.getPline_code());//产线代码
+					ajsfp.setPline_name(cbp.getPline_name());// 产线名称
+					//后期需要修改
+					ajsfp.setProcess_code("B");//工序代码    com_base_process表
+					ajsfp.setPsc(lpp.get(0).getPsc());//物料编码,
+					//ajsfp.setPline_seq(3l);//产线顺序  计划上道工序?还是计划下道工序?  当前工序点代码 1 分条/2 开平/3 罩退/4 平整
+					CommonPage<QcmJhySampleFromPlan>  cpqjsfp=new CommonPage<QcmJhySampleFromPlan>();
+					
+					int judge_Contain_Qcm = this.getBean(MesApiDesignInfoImpl.class).Judge_Contain_Qcm(v_rec_baf_m.getMaterial_no_vt(), "B");
+					// 获取工艺路径包含成分或者材质类
+					if(judge_Contain_Qcm!=-1){
+						ajsfp.setPline_seq((long)judge_Contain_Qcm);
+						if(v_rec_baf_m_last!=null && v_rec_baf_m_last.getBatch_no()!=null){
+							if(!v_rec_baf_m_last.getBatch_no().equals(v_rec_pdo.getFurnace_batch_no())){
+								QcmJhySampleFromPlan qjsprem=new QcmJhySampleFromPlan();
+								qjsprem.setDesign_key(lpp.get(0).getDesign_key());
+								qjsprem.setInspection_lot(v_rec_baf_m_last.getInspection_lot());
+								CommonPage<QcmJhySampleFromPlan> sum=new CommonPage<QcmJhySampleFromPlan>();
+								sum.setObject(qjsprem);
+								this.getBean(QmsApiServiceImpl.class).removeInspection(sum);
+							}
+						}
+						lqsfp.add(ajsfp);
+					}
+					
+				}
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+			//==========================质量检验委托参数结束==================================
+			
+		}
+		//=========调用质量检验委托接口==============================
+		try{
+			if(lqsfp!=null && lqsfp.size()>0){
+				CommonPage<QcmJhySampleFromPlan>  cpqjsfp=new CommonPage<QcmJhySampleFromPlan>();
+				cpqjsfp.setObjectList(lqsfp);
+				ResultModel reModel = this.getBean(QcmJhySampleConsignDItemServiceImpl.class).AutoGenerationSampleInfo(cpqjsfp);
+				if(reModel!=null){
+					System.out.println(reModel.getState());
+					System.out.println(reModel.getMsgInfo());
+				}
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(3)、提交事务
+		v_message="L2产出实绩处理完成!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(v_message==null || "".equals(v_message)){
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="L2产出实绩处理出错:"+e.getMessage().substring(0,200);
+				}else{
+					v_message="L2产出实绩处理出错:"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到罩退L2生产过程事件电文时调用;																																							
+		2)、	此接口参数为JSON对象(对象结构见数据库表 IF_BAF01_PDO_PROC);																																							
+	 * @param json
+	 * @return
+	 */
+	public String ReceiveBaf01Pdo_Proc(IfBaf01PdoProc json) throws Exception{
+		String v_message="";
+		if(json==null || "".equals(json.toString())){
+			v_message="二级接口-宝信罩退炉PDO-过程事件为空";
+			return v_message;
+		}
+		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_pdo_proc 代替描述
+		//暂定
+		IfBaf01PdoProc v_rec_pdo_proc=json;
+		//  --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_pdo_proc.getMsg_time()==null){
+			v_rec_pdo_proc.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入L2生产过程事件表(单独的事务)
+		try{
+			this.getMapper(IfBaf01PdoProcMapper.class).insert(v_rec_pdo_proc);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理L2生产过程事件函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).ReceiveBaf01Pdo_Proc_D(v_rec_pdo_proc, v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}
+		//  --(5)、拼接接口参数字符串
+		String v_params ="作业计划号1{" + v_rec_pdo_proc.getPlan_no_1() + "} " + "入口钢卷号1{" +																																							
+	              v_rec_pdo_proc.getIn_mat_no_1() + "} " + "炉内序号1{" +																																							
+	              v_rec_pdo_proc.getIn_fur_seq_1() + "} " + "作业计划号2{" +																																							
+	              v_rec_pdo_proc.getPlan_no_2() + "} " + "入口钢卷号2{" +																																							
+	              v_rec_pdo_proc.getIn_mat_no_2() + "} " + "炉内序号2{" +																																							
+	              v_rec_pdo_proc.getIn_fur_seq_2() + "} " + "作业计划号3{" +																																							
+	              v_rec_pdo_proc.getPlan_no_3() + "} " + "入口钢卷号3{" +																																							
+	              v_rec_pdo_proc.getIn_mat_no_3() + "} " + "炉内序号3{" +																																							
+	              v_rec_pdo_proc.getIn_fur_seq_3() + "} " + "作业计划号4{" +																																							
+	              v_rec_pdo_proc.getPlan_no_4() + "} " + "入口钢卷号4{" +																																							
+	              v_rec_pdo_proc.getIn_mat_no_4() + "} " + "炉内序号4{" +																																							
+	              v_rec_pdo_proc.getIn_fur_seq_4() + "} " + "作业计划号5{" +																																							
+	              v_rec_pdo_proc.getPlan_no_5() + "} " + "入口钢卷号5{" +																																							
+	              v_rec_pdo_proc.getIn_mat_no_5() + "} " + "炉内序号5{" +																																							
+	              v_rec_pdo_proc.getIn_fur_seq_5() + "} " + "作业计划号6{" +																																							
+	              v_rec_pdo_proc.getPlan_no_6() + "} " + "入口钢卷号6{" +																																							
+	              v_rec_pdo_proc.getIn_mat_no_6() + "} " + "炉内序号6{" +																																							
+	              v_rec_pdo_proc.getIn_fur_seq_6() + "} " + "作业计划号7{" +																																							
+	              v_rec_pdo_proc.getPlan_no_7() + "} " + "入口钢卷号7{" +																																							
+	              v_rec_pdo_proc.getIn_mat_no_7() + "} " + "炉内序号7{" +																																							
+	              v_rec_pdo_proc.getIn_fur_seq_7() + "} " + "作业计划号8{" +																																							
+	              v_rec_pdo_proc.getPlan_no_8() + "} " + "入口钢卷号8{" +																																							
+	              v_rec_pdo_proc.getIn_mat_no_8() + "} " + "炉内序号8{" +																																							
+	              v_rec_pdo_proc.getIn_fur_seq_8() + "} " + "炉次号{" +																																							
+	              v_rec_pdo_proc.getFurnace_batch_no() + "}";																																			
+		
+		//  --(6)、写接口日志:与业务处理分开,单独的事务
+		try{
+			List<MesCrAnnealM> list = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null, "material_no='"+v_rec_pdo_proc.getIn_mat_no_1()+"'", "", 0, 0);
+			if(list!=null && list.size()>0){
+				v_params="机台代码【"+list.get(0).getMachine_code()+"】"+v_params;
+			}
+			this.getMapper(IfBaf01LogMapper.class).doInsert(null,"ReceiveBaf01Pdo_Proc",v_params,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		return v_message;
+	}	
+	
+	
+	
+	/**
+	  	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 ReceiveBaf01Pdo_Proc 调用;																																							
+		2)、	接口参数 IN:V_REC_PDO_PROC(L2生产过程事件对象实例)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdo_proc
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String ReceiveBaf01Pdo_Proc_D(IfBaf01PdoProc v_rec_pdo_proc,
+			String v_message) throws Exception{
+		
+		Integer v_cnt;
+		//  --(1)、根据电文中,构建作业计划号、钢卷号、炉内序号集合
+		List<String> v_plan_no=new ArrayList<>();
+		List<String> v_material_no=new ArrayList<>();
+		List<Long> v_fur_seq=new ArrayList<>();
+		try{
+			
+		//  --炉内第1卷(炉内位置由下往上递增)
+		if(v_rec_pdo_proc.getPlan_no_1()!=null && v_rec_pdo_proc.getIn_mat_no_1()!=null
+				&& !"".equals(v_rec_pdo_proc.getPlan_no_1()) && !"".equals(v_rec_pdo_proc.getIn_mat_no_1())){
+			v_plan_no.add(v_rec_pdo_proc.getPlan_no_1());
+			v_material_no.add(v_rec_pdo_proc.getIn_mat_no_1());
+			v_fur_seq.add(v_rec_pdo_proc.getIn_fur_seq_1());
+		}
+		//  --炉内第2卷(炉内位置由下往上递增)
+		if(v_rec_pdo_proc.getPlan_no_2()!=null && v_rec_pdo_proc.getIn_mat_no_2()!=null
+				&& !"".equals(v_rec_pdo_proc.getPlan_no_2()) && !"".equals(v_rec_pdo_proc.getIn_mat_no_2())){
+			v_plan_no.add(v_rec_pdo_proc.getPlan_no_2());
+			v_material_no.add(v_rec_pdo_proc.getIn_mat_no_2());
+			v_fur_seq.add(v_rec_pdo_proc.getIn_fur_seq_2());
+		}
+		//  --炉内第3卷(炉内位置由下往上递增)
+		if(v_rec_pdo_proc.getPlan_no_3()!=null && v_rec_pdo_proc.getIn_mat_no_3()!=null
+				&& !"".equals(v_rec_pdo_proc.getPlan_no_3()) && !"".equals(v_rec_pdo_proc.getIn_mat_no_3())){
+			v_plan_no.add(v_rec_pdo_proc.getPlan_no_3());
+			v_material_no.add(v_rec_pdo_proc.getIn_mat_no_3());
+			v_fur_seq.add(v_rec_pdo_proc.getIn_fur_seq_3());
+		}
+		//  --炉内第4卷(炉内位置由下往上递增)
+		if(v_rec_pdo_proc.getPlan_no_4()!=null && v_rec_pdo_proc.getIn_mat_no_4()!=null
+				&& !"".equals(v_rec_pdo_proc.getPlan_no_4()) && !"".equals(v_rec_pdo_proc.getIn_mat_no_4())){
+			v_plan_no.add(v_rec_pdo_proc.getPlan_no_4());
+			v_material_no.add(v_rec_pdo_proc.getIn_mat_no_4());
+			v_fur_seq.add(v_rec_pdo_proc.getIn_fur_seq_4());
+		}
+		//  --炉内第5卷(炉内位置由下往上递增)
+		if(v_rec_pdo_proc.getPlan_no_5()!=null && v_rec_pdo_proc.getIn_mat_no_5()!=null
+				&& !"".equals(v_rec_pdo_proc.getPlan_no_5()) && !"".equals(v_rec_pdo_proc.getIn_mat_no_5())){
+			v_plan_no.add(v_rec_pdo_proc.getPlan_no_5());
+			v_material_no.add(v_rec_pdo_proc.getIn_mat_no_5());
+			v_fur_seq.add(v_rec_pdo_proc.getIn_fur_seq_5());
+		}		
+		//  --炉内第6卷(炉内位置由下往上递增)
+		if(v_rec_pdo_proc.getPlan_no_6()!=null && v_rec_pdo_proc.getIn_mat_no_6()!=null
+				&& !"".equals(v_rec_pdo_proc.getPlan_no_6()) && !"".equals(v_rec_pdo_proc.getIn_mat_no_6())){
+			v_plan_no.add(v_rec_pdo_proc.getPlan_no_6());
+			v_material_no.add(v_rec_pdo_proc.getIn_mat_no_6());
+			v_fur_seq.add(v_rec_pdo_proc.getIn_fur_seq_6());
+		}		
+		//  --炉内第7卷(炉内位置由下往上递增)
+		if(v_rec_pdo_proc.getPlan_no_7()!=null && v_rec_pdo_proc.getIn_mat_no_7()!=null
+				&& !"".equals(v_rec_pdo_proc.getPlan_no_7()) && !"".equals(v_rec_pdo_proc.getIn_mat_no_7())){
+			v_plan_no.add(v_rec_pdo_proc.getPlan_no_7());
+			v_material_no.add(v_rec_pdo_proc.getIn_mat_no_7());
+			v_fur_seq.add(v_rec_pdo_proc.getIn_fur_seq_7());
+		}		
+		//  --炉内第8卷(炉内位置由下往上递增)
+		if(v_rec_pdo_proc.getPlan_no_8()!=null && v_rec_pdo_proc.getIn_mat_no_8()!=null
+				&& !"".equals(v_rec_pdo_proc.getPlan_no_8()) && !"".equals(v_rec_pdo_proc.getIn_mat_no_8())){
+			v_plan_no.add(v_rec_pdo_proc.getPlan_no_8());
+			v_material_no.add(v_rec_pdo_proc.getIn_mat_no_8());
+			v_fur_seq.add(v_rec_pdo_proc.getIn_fur_seq_8());
+		}		
+		if(v_plan_no.size()<=0){
+			v_message="电文中未包含钢卷信息,无法处理!";
+			return v_message;
+		}
+		//  --(1.1)、验证事件ID的合法性
+		if(v_rec_pdo_proc.getEvent_id()==null ||(
+				!"0000".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0001".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0002".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0003".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0004".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0005".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0006".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0007".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0008".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0009".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0010".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0011".equals(v_rec_pdo_proc.getEvent_id()) &&
+				!"0012".equals(v_rec_pdo_proc.getEvent_id())
+			)	){
+			v_message="电文中事件ID {"+v_rec_pdo_proc.getEvent_id()+"} 为空或无法识别!";
+			return v_message;
+		}
+		Date v_event_time=null;
+		//  --(1.2)、根据事件时刻,计算日期、班次
+		if(v_rec_pdo_proc.getEvent_time()==null || "".equals(v_rec_pdo_proc.getEvent_time())){
+			v_event_time=new Date();
+		}else{
+			//    --(1.2.1)、将生产开始时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+			try {
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_pdo_proc.getEvent_time());
+				if(li!=null && li.size()>0){
+					v_event_time=li.get(0).getCreate_time();
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+				v_message="电文中事件时刻{"+v_rec_pdo_proc.getEvent_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+				return v_message;
+			}
+		}
+		
+		String rmDb=DateUtil.formatDate(v_event_time, "yyyy-MM-dd HH:mm:ss");
+		String v_event_date=null,v_event_ord=null;
+		String dbTime=rmDb.substring(11);
+		v_event_date=rmDb.substring(0,10);
+		// --(1.2.2)、如果 v_event_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_event_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+		if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+			v_event_ord="1";
+		}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+			v_event_ord="2";
+		}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+			v_event_ord="1";
+			SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+			Date date;
+			try {
+				date = formatYmd.parse(v_event_date);
+			} catch (Exception e) {
+				return "获取数据库时间失败,请稍后重试";
+			}
+			Calendar c = Calendar.getInstance();  
+	        c.setTime(date);  
+	        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+	        v_event_date=formatYmd.format(c.getTime());
+		}
+		
+		//2019-02-21
+		/*
+		检验批分批规则:
+			同炉次号向下相同牌号、相同尺寸(厚度、宽度)的物料集合生成一个检验批号
+			检验批号编码规则:炉次号+两位流水号,示例:2619000401) 
+		 */
+		List<MesCrAnnealM> v_rec_baf_mList = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null,"batch_no='"+v_rec_pdo_proc.getFurnace_batch_no()+"'", null, 0, 0);
+		Map<String, List<MesCrAnnealM>> mc_list =new HashMap<String, List<MesCrAnnealM>>();
+		if(v_rec_baf_mList!=null && v_rec_baf_mList.size()>0){
+				try{
+					mc_list = groupBillingDataByExcpBatchCode(v_rec_baf_mList);
+				}catch(Exception e){
+					
+				}
+		}
+		
+		//质量检验委托
+		List<QcmJhySampleFromPlan> lqsfp=new ArrayList<>();
+		//  --处理逻辑思路:类似页面“上料”按钮操作的相关处理逻辑
+		//  --(2)、循环 { 作业计划号、原料卷号 } 集合中各元素
+		for(int i=0;i<v_plan_no.size();i++){
+			//    --(2.1)、验证罩退作业计划主记录存在
+			v_cnt = this.getMapper(PlnAnnealPlanMapper.class).countWithCondition(null, "an_plan_no='"+v_plan_no.get(i)+"'");
+			if(v_cnt<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 作业计划主记录不存在!";
+				throw new Exception(v_message);
+			}
+			//    --(2.2)、验证罩退作业计划明细记录存在
+			v_cnt=this.getMapper(PlnAnnealPlanDetailMapper.class).countWithCondition(null, "an_plan_no='"+v_plan_no.get(i)+"' and object_no='"+v_material_no.get(i)+"'");
+			if(v_cnt<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 作业计划明细记录不存在!";
+				throw new Exception(v_message);
+			}else if(v_cnt>1){
+				//      --计划表 pln_anneal_plan_detail 未设置唯一约束,考虑极端情况下程序BUG导致的数据错误
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 存在一条以上作业计划明细记录,无法处理!";
+				throw new Exception(v_message);
+			}
+			List<PlnAnnealPlanDetail> v_rec_pln_d_list = this.getMapper(PlnAnnealPlanDetailMapper.class).findWithCondition(null, "an_plan_no='"+v_plan_no.get(i)+"' and object_no='"+v_material_no.get(i)+"'", null, 0, 0);
+			PlnAnnealPlanDetail v_rec_pln_d=v_rec_pln_d_list.get(0);
+			//    --(2.3)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此PDO生产过程事件)
+			List<MesCrAnnealM> v_rec_baf_m_list = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null,"schedule_no='"+v_plan_no.get(i)+"' and material_no='"+v_material_no.get(i)+"'", null, 0, 0);
+			MesCrAnnealM v_rec_baf_m=new MesCrAnnealM();
+			if(v_rec_baf_m_list!=null && v_rec_baf_m_list.size()>0){
+				if("1".equals(v_rec_baf_m_list.get(0).getHand_over_status())){
+					v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 已生产交工,忽略此PDO生产过程事件!";
+					throw new Exception(v_message);
+				}
+				v_rec_baf_m=v_rec_baf_m_list.get(0);
+			}
+			
+			//    --(2.4)、验证机台基础信息存在
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).countWithCondition(null,"machine_code='"+v_rec_pln_d.getMachine_code()+"'");
+			if(v_cnt<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 机台代码{"+v_rec_pln_d.getMachine_code()+"} 机台基础信息不存在!";
+				throw new Exception(v_message);
+			}
+			//    --(2.5)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class).findWithCondition(null,
+					"machine_code='"+v_rec_pln_d.getMachine_code()+"'", null, 0, 0);
+			String v_mch_mark=lcbm.get(0).getMachine_mark();
+			if(v_mch_mark==null){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 机台代码{"+v_rec_pln_d.getMachine_code()+"} 设备编号未配置,无法处理!";
+				throw new Exception(v_message);
+			}
+			//    --(2.6)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in==null || v_rec_mtr_in.size()<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";
+				throw new Exception(v_message);
+			}
+			//    --(2.7)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_material_no.get(i)+"'", null, 0, 0);
+			if(v_rec_ydm_d==null || v_rec_ydm_d.size()<=0){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 原料卷库存明细记录不存在!";
+				throw new Exception(v_message);
+			}
+			//    --(2.8)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			PlnMaterielDetail pmd2=new PlnMaterielDetail();
+			pmd2.setMat_object_no_vt(v_rec_pln_d.getObject_no_vt());
+			v_cnt = this.getMapper(PlnMaterielDetailMapper.class).count(pmd2);
+			if (v_cnt<=0) {
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 出口卷虚拟物料信息不存在!";
+				throw new Exception(v_message);
+			}
+			List<PlnMaterielDetail> v_rec_mtr_out=this.getMapper(PlnMaterielDetailMapper.class).doQueryWeb2(v_rec_pln_d.getObject_no_vt(),"");
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BAN02".equals(v_rec_pln_d.getStatus()) || "5BAN03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			//    --(2.9)、根据计算的投料日期班次,获取交接班记录的班组 
+			MesShiftM msm=new MesShiftM();
+			if(v_rec_pln_d.getMachine_code().equals("M0009")){
+				msm.setMachine_code("M0005");
+			}else{
+				msm.setMachine_code(v_rec_pln_d.getMachine_code());
+			}
+			msm.setWrk_date(v_event_date);
+			msm.setWrk_ord(v_event_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_event_grp=null;
+			if(v_cnt<=0){
+				 String l2_grp=v_rec_pdo_proc.getProd_shift_group(); //--无交接班记录,是使用电文中的生产班别
+				  if("A".equals(l2_grp)){
+					  v_event_grp = "1"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("B".equals(l2_grp)){
+					  v_event_grp = "2"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("C".equals(l2_grp)){
+					  v_event_grp = "3"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("D".equals(l2_grp)){
+					  v_event_grp = "4"; //--无交接班记录,是使用电文中的生产班别
+				  }
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_event_grp=lmsm.get(0).getWrk_grp();
+			}
+			
+			//    --(2.10)、出口卷编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(退火T)+ 2位设备代号(01-99)
+			//String v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_mch_mark, 2, "0");
+//			String v_coil_no=null;
+//			if(v_rec_pdo_proc.getFurnace_no()!=null && !"".equals(v_rec_pdo_proc.getFurnace_no())){
+//				v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_rec_pdo_proc.getFurnace_no(), 2, "0");
+//			}else{
+//				v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_mch_mark, 2, "0");
+//			}
+			String v_coil_no=null;
+			String v_leo="";
+			if(v_rec_pdo_proc.getFurnace_no()!=null && !"".equals(v_rec_pdo_proc.getFurnace_no())){
+				int leo1x = Integer.parseInt(v_rec_pdo_proc.getFurnace_no());
+				v_rec_pdo_proc.setFurnace_no(leo1x+"");
+				String v_syh=lpad(v_rec_pdo_proc.getFurnace_no(), 2, "0");
+				if(v_rec_baf_m.getCoil_no()!=null){
+					v_leo=v_rec_baf_m.getCoil_no().substring(v_rec_baf_m.getCoil_no().length()-4, v_rec_baf_m.getCoil_no().length()-2);
+					if(!v_syh.equals(v_leo)){
+						v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_rec_pdo_proc.getFurnace_no(), 2, "0");
+					}else{
+						v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_rec_pdo_proc.getFurnace_no(), 2, "0");
+					}
+				}else{
+					v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_rec_pdo_proc.getFurnace_no(), 2, "0");
+				}
+				
+			}else{
+				v_coil_no = v_material_no.get(i).substring(0, 8) + "T"+ lpad(v_mch_mark, 2, "0");
+			}
+			
+			
+			//    --(2.10.1)、获取当前起始流水号
+			v_cnt=this.getMapper(MesCrAnnealMMapper.class).doQueryWeb6(v_coil_no,v_plan_no.get(i),v_material_no.get(i));
+			if(v_cnt==null){
+				v_cnt=1;
+			}else if(v_cnt>99){
+				v_message="作业计划号{"+v_plan_no.get(i)+"} 原料卷号{"+v_material_no.get(i)+"} 出口钢卷号超出规则范围,流水号超出最大值99!";
+				throw new Exception(v_message);
+			}
+			//--(2.10.2)、出口卷编码规则:出口卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(退火T)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)																																						
+			v_coil_no=v_coil_no+lpad(v_cnt+"",2,"0");
+			
+			//如果之前有,就用之前的
+			if(v_rec_pdo_proc.getFurnace_no()!=null && !"".equals(v_rec_pdo_proc.getFurnace_no())){
+				String v_syh=lpad(v_rec_pdo_proc.getFurnace_no(), 2, "0");
+				if(v_rec_baf_m.getCoil_no()!=null){
+					v_leo=v_rec_baf_m.getCoil_no().substring(v_rec_baf_m.getCoil_no().length()-4, v_rec_baf_m.getCoil_no().length()-2);
+					if(v_syh.equals(v_leo)){
+						v_coil_no=v_rec_baf_m.getCoil_no();
+					}else{
+						
+					}
+					
+				}else{
+					//v_rec_cam.setCoil_no(v_coil_no);
+				}
+				
+			}
+			
+			
+			//    --(2.11)、删除可能存在罩退作业实绩
+			this.getMapper(MesCrAnnealMMapper.class).doDelete2(v_plan_no.get(i),v_material_no.get(i));
+		   
+			//--(2.12)、在 v_rec_baf_m 对象基础上,构建罩退主实绩,并插入记录																																							
+		    //--(2.12.1):v_rec_baf_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+		    //--(2.12.2):v_rec_baf_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)																																							
+			v_rec_baf_m.setSchedule_no(v_plan_no.get(i));//作业计划号																																							
+			v_rec_baf_m.setMaterial_no(v_material_no.get(i));//原料卷号																																							
+			v_rec_baf_m.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟原料卷号																																							
+			v_rec_baf_m.setPln_steel_code(v_rec_mtr_in.get(0).getSteel_code());//计划原料卷牌号																																							
+			v_rec_baf_m.setPln_mtr_thk(v_rec_mtr_in.get(0).getThick());//计划原料卷厚度																																							
+			v_rec_baf_m.setPln_mtr_wdt(v_rec_mtr_in.get(0).getWidth());//计划原料卷宽度																																							
+			v_rec_baf_m.setPln_mtr_len(v_rec_mtr_in.get(0).getLength());//计划原料卷长度																																							
+			v_rec_baf_m.setPln_mtr_inn_dia(v_rec_mtr_in.get(0).getDiameter_inn());//计划原料卷内径																																							
+			v_rec_baf_m.setPln_mtr_out_dia(v_rec_mtr_in.get(0).getDiameter_out());//计划原料卷外径																																							
+			v_rec_baf_m.setPln_mtr_thr_wgt(v_rec_mtr_in.get(0).getSingle_weight());//计划原料卷理重																																							
+			v_rec_baf_m.setMaterial_no_src(v_rec_ydm_d.get(0).getMaterailcoilno());//原始卷号																																							
+			v_rec_baf_m.setMtr_thk(v_rec_ydm_d.get(0).getThick());//原料卷厚度																																							
+			v_rec_baf_m.setMtr_wdt(v_rec_ydm_d.get(0).getWidth());//原料卷宽度																																							
+			v_rec_baf_m.setMtr_len(v_rec_ydm_d.get(0).getLength());//原料卷长度																																							
+			v_rec_baf_m.setMtr_inn_dia(v_rec_ydm_d.get(0).getDiameter_inn());//原料卷内径																																							
+			v_rec_baf_m.setMtr_out_dia(v_rec_ydm_d.get(0).getDiameter_out());//原料卷外径																																							
+			v_rec_baf_m.setMtr_thr_wgt(v_rec_ydm_d.get(0).getTheoryweight());//原料卷理重																																							
+			v_rec_baf_m.setMtr_act_wgt(v_rec_ydm_d.get(0).getFactweight());//原料卷实重																																							
+			v_rec_baf_m.setSteel_code(v_rec_ydm_d.get(0).getSteelcode());//原料卷牌号																																							
+			v_rec_baf_m.setMachine_code(v_rec_pln_d.getMachine_code());//机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			v_rec_baf_m.setBatch_no(v_rec_pdo_proc.getFurnace_batch_no());//炉批号(2位炉座号+2位年份+4位流水号)																																							
+			v_rec_baf_m.setFurnace_no(v_rec_pdo_proc.getFurnace_no());//炉座号(1-5艾伯纳,6-16中冶南方、17-26宝信)																																							
+			v_rec_baf_m.setIn_fur_seq(v_fur_seq.get(i));//炉内位置		
+			//注意:截取电文状态后两位
+			//截取电文状态后两位,状态(00:组垛完成、01:上炉台、02:扣加热罩、03:加热开始、04:加热结束、
+			//05:带罩冷却开始、06:带罩冷却结束、07:风冷开始、08:风冷结束、09:水冷开始、10:水冷结束、
+			//11:出炉/上终冷台、12:下终冷台)
+			v_rec_baf_m.setStatus(v_rec_pdo_proc.getEvent_id().substring(v_rec_pdo_proc.getEvent_id().length()-2));																																							
+
+			
+			if(("0001".equals(v_rec_pdo_proc.getEvent_id()) || "0002".equals(v_rec_pdo_proc.getEvent_id()))
+					&& (v_rec_baf_m.getCharge_date()==null || v_rec_baf_m.getCharge_ord()==null || v_rec_baf_m.getCharge_grp()==null) ){																																							
+				v_rec_baf_m.setCharge_date(v_event_date);//投料日期(YYYY-MM-DD)																																							
+				v_rec_baf_m.setCharge_ord(v_event_ord);//投料班次(1晚班、2白班、3中班)																																							
+				v_rec_baf_m.setCharge_grp(v_event_grp);//投料班组(1甲班、2乙班、3丙班、4丁班)																																							
+				v_rec_baf_m.setCharge_time(v_event_time);//投料时间/生产开始时间																																							
+			};																																							
+																																										
+			if("0012".equals(v_rec_pdo_proc.getEvent_id()) && 
+				(v_rec_baf_m.getDischarge_date()==null || v_rec_baf_m.getDischarge_ord()==null || v_rec_baf_m.getDischarge_grp()==null)){																																					
+				v_rec_baf_m.setDischarge_date(v_event_date);//产出日期(YYYY-MM-DD)																																							
+				v_rec_baf_m.setDischarge_ord(v_event_ord);//产出班次(1晚班、2白班、3中班)																																							
+				v_rec_baf_m.setDischarge_grp(v_event_grp);//产出班组(1甲班、2乙班、3丙班、4丁班)																																							
+				v_rec_baf_m.setDischarge_time(v_event_time);//产出时间/生产结束时间																																							
+			};																																							
+			if("0000".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_batch(v_event_time);//事件时刻:组垛完成		
+			}else if("0001".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_charge(v_event_time);//事件时刻:上炉台	
+			}else if("0002".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_cover(v_event_time);//事件时刻:扣加热罩			
+			}else if("0003".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_heat_str(v_event_time);//事件时刻:加热开始			
+			}else if("0004".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_heat_end(v_event_time);//事件时刻:加热结束	
+			}else if("0005".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_cvr_cool_str(v_event_time);//事件时刻:带罩冷却开始
+			}else if("0006".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_cvr_cool_end(v_event_time);//事件时刻:带罩冷却结束	
+			}else if("0007".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_air_cool_str(v_event_time);//事件时刻:风冷开始	
+			}else if("0008".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_air_cool_end(v_event_time);//事件时刻:风冷结束
+			}else if("0009".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_wtr_cool_str(v_event_time);//事件时刻:水冷开始	
+			}else if("0010".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_wtr_cool_end(v_event_time);//事件时刻:水冷结束	
+			}else if("0011".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_fnl_cool_str(v_event_time);//事件时刻:出炉/上终冷台	
+			}else if("0012".equals(v_rec_pdo_proc.getEvent_id())){
+				v_rec_baf_m.setEvent_time_fnl_cool_end(v_event_time);//事件时刻:下终冷台
+			}
+			
+			if(v_rec_baf_m.getHeat_hood()!=null && !v_rec_baf_m.getHeat_hood().contains("-")){
+				
+			}else{
+				v_rec_baf_m.setHeat_hood(v_rec_pdo_proc.getHeat_hood());//加热罩号		
+			}
+			if(v_rec_baf_m.getCool_hood()!=null && !v_rec_baf_m.getCool_hood().contains("-")){
+				
+			}else{
+				v_rec_baf_m.setCool_hood(v_rec_pdo_proc.getCool_hood());//冷却罩号	
+			}
+			if(v_rec_baf_m.getFc_no()!=null && !v_rec_baf_m.getFc_no().contains("-")){
+				
+			}else{
+				v_rec_baf_m.setFc_no(v_rec_pdo_proc.getFc_no());//终冷台号	
+			}
+			v_rec_baf_m.setCoil_no(v_coil_no);//产出卷号																																							
+			v_rec_baf_m.setAim_thk(v_rec_mtr_out.get(0).getThick());//产出卷目标厚度																																							
+			v_rec_baf_m.setAim_wdt(v_rec_mtr_out.get(0).getWidth());//产出卷目标宽度																																							
+			v_rec_baf_m.setAim_len(v_rec_mtr_out.get(0).getLength());//产出卷目标长度																																							
+			v_rec_baf_m.setAim_inn_dia(v_rec_mtr_out.get(0).getDiameter_inn());//产出卷目标内径																																							
+			v_rec_baf_m.setAim_out_dia(v_rec_mtr_out.get(0).getDiameter_out());//产出卷目标外径																																							
+			v_rec_baf_m.setAct_thk(v_rec_ydm_d.get(0).getThick());//产出卷厚度																																							
+			v_rec_baf_m.setAct_wdt(v_rec_ydm_d.get(0).getWidth());//产出卷宽度																																							
+			v_rec_baf_m.setAct_len(v_rec_ydm_d.get(0).getLength());//产出卷长度																																							
+			v_rec_baf_m.setAct_inn_dia(v_rec_ydm_d.get(0).getDiameter_inn());//产出卷内径																																							
+			v_rec_baf_m.setAct_out_dia(v_rec_ydm_d.get(0).getDiameter_out());//产出卷外径																																							
+			v_rec_baf_m.setCoil_thr_wgt(v_rec_ydm_d.get(0).getTheoryweight());//产出卷理重																																							
+			v_rec_baf_m.setCoil_act_wgt(v_rec_ydm_d.get(0).getFactweight());//产出卷实量																																							
+			v_rec_baf_m.setProd_order_no(v_rec_mtr_out.get(0).getProd_order_no());//生产订单号																																							
+			v_rec_baf_m.setOrder_no(v_rec_mtr_out.get(0).getOrder_no());//订单号																																							
+			v_rec_baf_m.setMemo(null);//备注																																							
+			v_rec_baf_m.setHand_over_status("0");//交工状态																																							
+			v_rec_baf_m.setHand_over_time(null);//交工时间																																							
+			v_rec_baf_m.setHand_over_opr(null);//交工人		
+			//	--如果 v_rec_baf_m 对象为空(即之前无生产实绩),则:
+			if(v_rec_baf_m.getCreate_opr()==null){
+				v_rec_baf_m.setCreate_opr("L2_PDO");
+				v_rec_baf_m.setCreate_time(new Date());
+			}else{//    --如果 v_rec_baf_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				v_rec_baf_m.setUpdate_opr("L2_PDO");
+				v_rec_baf_m.setUpdate_time(new Date());
+			}
+			//2019-02-21
+			if(mc_list!=null && mc_list.size()>0){
+				for(Map.Entry<String, List<MesCrAnnealM>> grouplist :mc_list.entrySet()){
+					String key = grouplist.getKey();
+					List<MesCrAnnealM> listCes = grouplist.getValue();
+					for(MesCrAnnealM mcam:listCes){
+						String anm_key=v_rec_baf_m.getSteel_code()+"T"+v_rec_baf_m.getMtr_thk()+"T"+v_rec_baf_m.getMtr_wdt();
+						if(anm_key.equals(key) && v_rec_baf_m.getMaterial_no().equals(mcam.getMaterial_no())){
+							v_rec_baf_m.setInspection_lot(mcam.getInspection_lot());
+							//this.getMapper(MesCrAnnealMMapper.class).update(v_rec_baf_m);
+						}
+					}
+				}
+			}
+			
+			//    --(2.12.3)、插入罩退实绩记录
+			this.getMapper(MesCrAnnealMMapper.class).insert(v_rec_baf_m);
+			
+			//  --(2.13)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			//  --(2.13.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+			  																																							
+			//  --(2.14)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			//  --(2.14.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作	
+			MesCrAnnealM  mcsm=new MesCrAnnealM();
+			mcsm.setMachine_code(v_rec_baf_m.getMachine_code());//机台号
+			mcsm.setSchedule_no(v_rec_baf_m.getSchedule_no());//作业计划号
+			mcsm.setMaterial_no(v_rec_baf_m.getMaterial_no());//投料卷号
+			mcsm.setMaterial_no_vt(v_rec_baf_m.getMaterial_no_vt());//虚拟卷号 
+			List<MesCrAnnealM> lmcsm=new ArrayList<MesCrAnnealM>();
+			
+			//时间
+			SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+		    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+		    mcsm.setMemo(date);
+		    lmcsm.add(mcsm);
+			
+			//调用生产管理接口验证作业计划状态能执行此操作
+			boolean flag=true;
+			try{
+				this.getBean(MesApiAnnealPlanImpl.class).MesCrAnnealMAddValid(lmcsm);
+			}catch(Exception e){
+				flag=false;
+				e.printStackTrace();
+			}
+			if(flag){
+				//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+				this.getBean(MesApiAnnealPlanImpl.class).MesCrAnnealMAdd(lmcsm); 
+			}
+		    //--(18)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			//--(18.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作	
+			//判断原料卷是否已生产投料出库
+			YdmProductOutlist ypo=new YdmProductOutlist();
+			//ypo.setCoilno(v_rec_ydm_d.get(0).getCoilno());
+			ypo.setCoilno(v_rec_baf_m.getMaterial_no());
+			ypo.setOuttype("500501");
+			v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+			if(v_cnt<=0){
+				CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+				YdmProductDetail ypdu=new YdmProductDetail();
+				//ypdu.setCoilno(v_rec_ydm_d.get(0).getCoilno());//注意
+				ypdu.setCoilno(v_rec_baf_m.getMaterial_no());//注意
+				// 传入操作时间字符串带毫秒
+				ypdu.setMemo(date);
+				cp2.setObject(ypdu);
+				this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+			}
+			//=======================质量检验委托参数开始=============================
+//			try{
+//				QcmJhySampleFromPlan ajsfp=new QcmJhySampleFromPlan();
+//				String prod_order_no=v_rec_mtr_out.get(0).getProd_order_no();
+//				List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).findWithCondition(null, "prod_order_no='"+prod_order_no+"'", null, 0, 0);
+//				if(lpp!=null && lpp.size()>0){
+//					ajsfp.setBatch_no(v_rec_baf_m.getBatch_no());//轧批号    炉次号
+//					ajsfp.setContract_line_no(lpp.get(0).getContract_line_no());//合同行信息
+//					ajsfp.setDesign_key(lpp.get(0).getDesign_key());//design_key的集合
+//					//ajsfp.setGrade_code(lpp.get(0).getGrade_code());//炼钢牌号代码
+//					//ajsfp.setGrade_name(grade_name);//炼钢牌号名称
+//					ajsfp.setHeat_no(v_rec_baf_m.getBatch_no());//炉号       炉次号,??
+//					ajsfp.setInspection_lot(v_rec_baf_m.getBatch_no());//检验号    炉次号
+//					ajsfp.setJudge("0");//用于判断是改判还是原判 0:原判;1:改判  no
+//					ajsfp.setMaterial_no(v_rec_baf_m.getMaterial_no());//取样材料号   
+//					ajsfp.setMsc_pline(lpp.get(0).getMsc_pline());//全程产线号  制成号
+//					ajsfp.setOrder_no(lpp.get(0).getOrder_no());//销售订单号(合同号+订单行号,示例:YT-66G66001)
+//					ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_rec_baf_m.getMachine_code());
+//					ComBasePline cbp = this.getMapper(ComBasePlineMapper.class).findById(cbm.getPline_code());
+//					ajsfp.setPline_code(cbm.getPline_code());//产线代码
+//					ajsfp.setPline_name(cbp.getPline_name());// 产线名称
+//					//后期需要修改
+//					ajsfp.setProcess_code("B");//工序代码    com_base_process表
+//					ajsfp.setPsc(lpp.get(0).getPsc());//物料编码,
+//					ajsfp.setPline_seq(3l);//产线顺序  计划上道工序?还是计划下道工序?  当前工序点代码 1 分条/2 开平/3 罩退/4 平整
+//					// 获取工艺路径包含成分或者材质类
+//					List<SlmOrdDesignMscPlSti> listSti=this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(null, 
+//							" design_key = '"+lpp.get(0).getDesign_key()+"'  AND MSC_PLINE = '"+lpp.get(0).getMsc_pline()+"' and process_code = 'B' and PROCESS_POINT_TYPE in ('403201','403202')", "  BACKLOG_SEQ, PROCESS_POINT_SEQ", 0, 0);
+//					if(listSti!=null && listSti.size()>0){
+//						lqsfp.add(ajsfp);
+//					}
+//				}
+//			}catch(Exception e){
+//				e.printStackTrace();
+//			}
+			//==========================质量检验委托参数结束==================================
+		}
+		
+		//=========调用质量检验委托接口==============================
+//		try{
+//			if(lqsfp!=null && lqsfp.size()>0){
+//				CommonPage<QcmJhySampleFromPlan>  cpqjsfp=new CommonPage<QcmJhySampleFromPlan>();
+//				cpqjsfp.setObjectList(lqsfp);
+//				ResultModel reModel = this.getBean(QcmJhySampleConsignMServiceImpl.class).AutoGenerationSampleInfo(cpqjsfp);
+//				if(reModel!=null){
+//					System.out.println(reModel.getState());
+//					System.out.println(reModel.getMsgInfo());
+//				}
+//			}
+//		}catch(Exception e){
+//			e.printStackTrace();
+//		}
+		v_message="L2生产过程事件电文处理完成!"	;
+		}catch(Exception e){
+			e.printStackTrace();
+			if(v_message==null || "".equals(v_message)){
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="L2生产过程事件电文处理出错:"+e.getMessage().substring(0,200);
+				}else{
+					v_message="L2生产过程事件电文处理出错:"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**宝信
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到罩退L2能耗实绩电文时调用;																																							
+		2)、	此接口参数为JSON对象(对象结构见数据库表 IF_BAF01_PDO_ENERGY);																																							
+	 * @param json
+	 * @return
+	 */
+	public String ReceiveBaf01Pdo_Energy(IfBaf01PdoEnergy json) throws Exception{
+		String v_message="";
+		if(json==null || "".equals(json.toString())){
+			v_message="二级接口-宝信罩退炉PDO-能耗实绩为空";
+			return v_message;
+		}
+		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_pdo_energy 代替描述
+		//暂定
+		IfBaf01PdoEnergy v_rec_pdo_energy=json;
+		//   --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_pdo_energy.getMsg_time()==null){
+			v_rec_pdo_energy.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入PDO能耗实绩表(单独的事务)
+		try{
+			this.getMapper(IfBaf01PdoEnergyMapper.class).insert(v_rec_pdo_energy);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理PDO能耗实绩函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).ReceiveBaf01Pdo_Energy_D(v_rec_pdo_energy, v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}
+		//  --(5)、拼接接口参数字符串
+		 String v_params = "作业日期{"+v_rec_pdo_energy.getWrk_date()+"} 班次{"+v_rec_pdo_energy.getWrk_ord()+"}";
+		//  --(6)、写接口日志:与业务处理分开,单独的事务
+		try{
+			 this.getMapper(IfBaf01LogMapper.class).doInsert(null,"ReceiveBaf01Pdo_Energy",v_params,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		return v_message;
+	}
+	
+	
+	
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 ReceiveBaf01Pdo_Energy 调用;																																							
+		2)、	接口参数 IN:V_REC_PDO_ENERGY(L2能耗实绩对象实例)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdo_energy
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String ReceiveBaf01Pdo_Energy_D(IfBaf01PdoEnergy v_rec_pdo_energy,
+			String v_message) throws Exception {
+		
+		//暂时 ??重要
+		//  v_mch_code varchar2(20); --请定义为常量(3个厂家的罩退炉,3个接口,取各自代码)
+		String v_mch_code = "M0004";//宝信
+		try{
+			//  --(1)、如果对象中作业日期为空,则返回错误信息
+			if(v_rec_pdo_energy.getWrk_date()==null || "".equals(v_rec_pdo_energy.getWrk_date())){
+				v_message="作业日期为空,无法处理!";
+				return v_message;
+			}
+			//  --(2)、如果对象中班次为空,则返回错误信息
+			if(v_rec_pdo_energy.getWrk_ord()==null || "".equals(v_rec_pdo_energy.getWrk_ord())){
+				v_message="作业班次为空,无法处理!";
+				return v_message;
+			}
+			//  --(3)、验证罩退能耗实绩是否存在
+			MesCrAnnealEnergy mcae=new MesCrAnnealEnergy();
+			mcae.setMachine_code(v_mch_code);
+			mcae.setWrk_date(v_rec_pdo_energy.getWrk_date());
+			mcae.setWrk_ord(v_rec_pdo_energy.getWrk_ord());
+			List<MesCrAnnealEnergy> lmcae = this.getMapper(MesCrAnnealEnergyMapper.class).find(mcae, 0, 0);
+			if(lmcae!=null && lmcae.size()>0){
+				//    --(3.1)、存在则更新记录
+				mcae.setCsm_gas(v_rec_pdo_energy.getCsm_gas());
+				mcae.setCsm_h2(v_rec_pdo_energy.getCsm_h2());
+				mcae.setCsm_n2(v_rec_pdo_energy.getCsm_n2());
+				mcae.setCsm_ccl_water(v_rec_pdo_energy.getCsm_ccl_water());
+				mcae.setCsm_acd_water(v_rec_pdo_energy.getCsm_acd_water());
+				mcae.setCsm_cmpr_air(v_rec_pdo_energy.getCsm_cmpr_air());
+				mcae.setCsm_elec(v_rec_pdo_energy.getCsm_elec());
+				mcae.setUpdate_opr("L2_PDO");
+				mcae.setUpdate_time(new Date());
+				this.getMapper(MesCrAnnealEnergyMapper.class).update(mcae);
+			}else{
+				// --(3.2)、不存在则插入记录
+				mcae.setCsm_gas(v_rec_pdo_energy.getCsm_gas());
+				mcae.setCsm_h2(v_rec_pdo_energy.getCsm_h2());
+				mcae.setCsm_n2(v_rec_pdo_energy.getCsm_n2());
+				mcae.setCsm_ccl_water(v_rec_pdo_energy.getCsm_ccl_water());
+				mcae.setCsm_acd_water(v_rec_pdo_energy.getCsm_acd_water());
+				mcae.setCsm_cmpr_air(v_rec_pdo_energy.getCsm_cmpr_air());
+				mcae.setCsm_elec(v_rec_pdo_energy.getCsm_elec());
+				mcae.setCreate_opr("L2_PDO");
+				mcae.setCreate_time(new Date());
+				this.getMapper(MesCrAnnealEnergyMapper.class).insert(mcae);
+			}
+			//  --(4)、提交事务
+			v_message="PDO能耗实绩处理完成!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="PDO能耗实绩处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="PDO能耗实绩处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**南方
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到罩退L2能耗实绩电文时调用;																																							
+		2)、	此接口参数为JSON对象(对象结构见数据库表 IF_BAF01_PDO_ENERGY);																																							
+	 * @param json
+	 * @return
+	 */
+	public String ReceiveBaf01Pdo_Energy_Nan(IfBaf01PdoEnergy json) throws Exception{
+		String v_message="";
+		if(json==null || "".equals(json.toString())){
+			v_message="二级接口-宝信罩退炉PDO-能耗实绩为空";
+			return v_message;
+		}
+		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_pdo_energy 代替描述
+		//暂定
+		IfBaf01PdoEnergy v_rec_pdo_energy=json;
+		//   --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_pdo_energy.getMsg_time()==null){
+			v_rec_pdo_energy.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入PDO能耗实绩表(单独的事务)
+		try{
+			this.getMapper(IfBaf01PdoEnergyMapper.class).insert(v_rec_pdo_energy);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理PDO能耗实绩函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).ReceiveBaf01Pdo_Energy_D_Nan(v_rec_pdo_energy, v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}
+		//  --(5)、拼接接口参数字符串
+		 String v_params = "作业日期{"+v_rec_pdo_energy.getWrk_date()+"} 班次{"+v_rec_pdo_energy.getWrk_ord()+"}";
+		//  --(6)、写接口日志:与业务处理分开,单独的事务
+		try{
+			 this.getMapper(IfBaf01LogMapper.class).doInsert(null,"ReceiveBaf01Pdo_Energy",v_params,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		return v_message;
+	}
+	
+	
+	
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 ReceiveBaf01Pdo_Energy 调用;																																							
+		2)、	接口参数 IN:V_REC_PDO_ENERGY(L2能耗实绩对象实例)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdo_energy
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String ReceiveBaf01Pdo_Energy_D_Nan(IfBaf01PdoEnergy v_rec_pdo_energy,
+			String v_message) throws Exception {
+		
+		//暂时 ??重要
+		//  v_mch_code varchar2(20); --请定义为常量(3个厂家的罩退炉,3个接口,取各自代码)
+		String v_mch_code = "M0005";//南方
+		try{
+			//  --(1)、如果对象中作业日期为空,则返回错误信息
+			if(v_rec_pdo_energy.getWrk_date()==null || "".equals(v_rec_pdo_energy.getWrk_date())){
+				v_message="作业日期为空,无法处理!";
+				return v_message;
+			}
+			//  --(2)、如果对象中班次为空,则返回错误信息
+			if(v_rec_pdo_energy.getWrk_ord()==null || "".equals(v_rec_pdo_energy.getWrk_ord())){
+				v_message="作业班次为空,无法处理!";
+				return v_message;
+			}
+			//  --(3)、验证罩退能耗实绩是否存在
+			MesCrAnnealEnergy mcae=new MesCrAnnealEnergy();
+			mcae.setMachine_code(v_mch_code);
+			mcae.setWrk_date(v_rec_pdo_energy.getWrk_date());
+			mcae.setWrk_ord(v_rec_pdo_energy.getWrk_ord());
+			List<MesCrAnnealEnergy> lmcae = this.getMapper(MesCrAnnealEnergyMapper.class).find(mcae, 0, 0);
+			if(lmcae!=null && lmcae.size()>0){
+				//    --(3.1)、存在则更新记录
+				mcae.setCsm_gas(v_rec_pdo_energy.getCsm_gas());
+				mcae.setCsm_h2(v_rec_pdo_energy.getCsm_h2());
+				mcae.setCsm_n2(v_rec_pdo_energy.getCsm_n2());
+				mcae.setCsm_ccl_water(v_rec_pdo_energy.getCsm_ccl_water());
+				mcae.setCsm_acd_water(v_rec_pdo_energy.getCsm_acd_water());
+				mcae.setCsm_cmpr_air(v_rec_pdo_energy.getCsm_cmpr_air());
+				mcae.setCsm_elec(v_rec_pdo_energy.getCsm_elec());
+				mcae.setUpdate_opr("L2_PDO");
+				mcae.setUpdate_time(new Date());
+				this.getMapper(MesCrAnnealEnergyMapper.class).update(mcae);
+			}else{
+				// --(3.2)、不存在则插入记录
+				mcae.setCsm_gas(v_rec_pdo_energy.getCsm_gas());
+				mcae.setCsm_h2(v_rec_pdo_energy.getCsm_h2());
+				mcae.setCsm_n2(v_rec_pdo_energy.getCsm_n2());
+				mcae.setCsm_ccl_water(v_rec_pdo_energy.getCsm_ccl_water());
+				mcae.setCsm_acd_water(v_rec_pdo_energy.getCsm_acd_water());
+				mcae.setCsm_cmpr_air(v_rec_pdo_energy.getCsm_cmpr_air());
+				mcae.setCsm_elec(v_rec_pdo_energy.getCsm_elec());
+				mcae.setCreate_opr("L2_PDO");
+				mcae.setCreate_time(new Date());
+				this.getMapper(MesCrAnnealEnergyMapper.class).insert(mcae);
+			}
+			//  --(4)、提交事务
+			v_message="PDO能耗实绩处理完成!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="PDO能耗实绩处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="PDO能耗实绩处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**艾伯纳
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到罩退L2能耗实绩电文时调用;																																							
+		2)、	此接口参数为JSON对象(对象结构见数据库表 IF_BAF01_PDO_ENERGY);																																							
+	 * @param json
+	 * @return
+	 */
+	public String ReceiveBaf01Pdo_Energy_Ai(IfBaf01PdoEnergy json) throws Exception{
+		String v_message="";
+		if(json==null || "".equals(json.toString())){
+			v_message="二级接口-宝信罩退炉PDO-能耗实绩为空";
+			return v_message;
+		}
+		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_pdo_energy 代替描述
+		//暂定
+		IfBaf01PdoEnergy v_rec_pdo_energy=json;
+		//   --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_pdo_energy.getMsg_time()==null){
+			v_rec_pdo_energy.setMsg_time(new Date());
+		}
+		//  --(3)、将对象,插入PDO能耗实绩表(单独的事务)
+		try{
+			this.getMapper(IfBaf01PdoEnergyMapper.class).insert(v_rec_pdo_energy);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(4)、调用处理PDO能耗实绩函数(事务在函数内)
+		try{
+			v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).ReceiveBaf01Pdo_Energy_D_Ai(v_rec_pdo_energy, v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}
+		//  --(5)、拼接接口参数字符串
+		 String v_params = "作业日期{"+v_rec_pdo_energy.getWrk_date()+"} 班次{"+v_rec_pdo_energy.getWrk_ord()+"}";
+		//  --(6)、写接口日志:与业务处理分开,单独的事务
+		try{
+			 this.getMapper(IfBaf01LogMapper.class).doInsert(null,"ReceiveBaf01Pdo_Energy",v_params,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		return v_message;
+	}
+	
+	
+	
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 ReceiveBaf01Pdo_Energy 调用;																																							
+		2)、	接口参数 IN:V_REC_PDO_ENERGY(L2能耗实绩对象实例)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdo_energy
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String ReceiveBaf01Pdo_Energy_D_Ai(IfBaf01PdoEnergy v_rec_pdo_energy,
+			String v_message) throws Exception {
+		
+		//暂时 ??重要
+		//  v_mch_code varchar2(20); --请定义为常量(3个厂家的罩退炉,3个接口,取各自代码)
+		String v_mch_code = "M0006";//艾伯纳
+		try{
+			//  --(1)、如果对象中作业日期为空,则返回错误信息
+			if(v_rec_pdo_energy.getWrk_date()==null || "".equals(v_rec_pdo_energy.getWrk_date())){
+				v_message="作业日期为空,无法处理!";
+				return v_message;
+			}
+			//  --(2)、如果对象中班次为空,则返回错误信息
+			if(v_rec_pdo_energy.getWrk_ord()==null || "".equals(v_rec_pdo_energy.getWrk_ord())){
+				v_message="作业班次为空,无法处理!";
+				return v_message;
+			}
+			//  --(3)、验证罩退能耗实绩是否存在
+			MesCrAnnealEnergy mcae=new MesCrAnnealEnergy();
+			mcae.setMachine_code(v_mch_code);
+			mcae.setWrk_date(v_rec_pdo_energy.getWrk_date());
+			mcae.setWrk_ord(v_rec_pdo_energy.getWrk_ord());
+			List<MesCrAnnealEnergy> lmcae = this.getMapper(MesCrAnnealEnergyMapper.class).find(mcae, 0, 0);
+			if(lmcae!=null && lmcae.size()>0){
+				//    --(3.1)、存在则更新记录
+				mcae.setCsm_gas(v_rec_pdo_energy.getCsm_gas());
+				mcae.setCsm_h2(v_rec_pdo_energy.getCsm_h2());
+				mcae.setCsm_n2(v_rec_pdo_energy.getCsm_n2());
+				mcae.setCsm_ccl_water(v_rec_pdo_energy.getCsm_ccl_water());
+				mcae.setCsm_acd_water(v_rec_pdo_energy.getCsm_acd_water());
+				mcae.setCsm_cmpr_air(v_rec_pdo_energy.getCsm_cmpr_air());
+				mcae.setCsm_elec(v_rec_pdo_energy.getCsm_elec());
+				mcae.setUpdate_opr("L2_PDO");
+				mcae.setUpdate_time(new Date());
+				this.getMapper(MesCrAnnealEnergyMapper.class).update(mcae);
+			}else{
+				// --(3.2)、不存在则插入记录
+				mcae.setCsm_gas(v_rec_pdo_energy.getCsm_gas());
+				mcae.setCsm_h2(v_rec_pdo_energy.getCsm_h2());
+				mcae.setCsm_n2(v_rec_pdo_energy.getCsm_n2());
+				mcae.setCsm_ccl_water(v_rec_pdo_energy.getCsm_ccl_water());
+				mcae.setCsm_acd_water(v_rec_pdo_energy.getCsm_acd_water());
+				mcae.setCsm_cmpr_air(v_rec_pdo_energy.getCsm_cmpr_air());
+				mcae.setCsm_elec(v_rec_pdo_energy.getCsm_elec());
+				mcae.setCreate_opr("L2_PDO");
+				mcae.setCreate_time(new Date());
+				this.getMapper(MesCrAnnealEnergyMapper.class).insert(mcae);
+			}
+			//  --(4)、提交事务
+			v_message="PDO能耗实绩处理完成!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="PDO能耗实绩处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="PDO能耗实绩处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+	 *  同炉次号向下相同牌号、相同尺寸(厚度、宽度)的物料集合生成一个检验批号
+		检验批号编码规则:炉次号+两位流水号,示例:2619000401)
+	 * @param billingList
+	 * @return
+	 * @throws Exception
+	 */
+	private Map<String, List<MesCrAnnealM>> groupBillingDataByExcpBatchCode(List<MesCrAnnealM> billingList) throws Exception{
+		Map<String, List<MesCrAnnealM>> resultMap = new HashMap<String, List<MesCrAnnealM>>();
+		try{
+			int i=0;
+			for(MesCrAnnealM tmExcpNew : billingList){
+				String key=tmExcpNew.getSteel_code()+"T"+tmExcpNew.getMtr_thk()+"T"+tmExcpNew.getMtr_wdt();
+				if(resultMap.containsKey(key)){//map中异常批次已存在,将该数据存放到同一个key(key存放的是异常批次)的map中
+//					i++;
+//					String inspection_lot=tmExcpNew.getBatch_no()+lpad(i+"", 2, "0");
+//					tmExcpNew.setInspection_lot(inspection_lot);
+//					resultMap.get(key).add(tmExcpNew);
+//					String inspection_lot=schedule+lpad(i+"", 2, "0");
+					List<MesCrAnnealM> list = resultMap.get(key);
+					if(list!=null && list.size()>0){
+						tmExcpNew.setInspection_lot(list.get(0).getInspection_lot());
+					}
+					resultMap.get(key).add(tmExcpNew);
+				}else{//map中不存在,新建key,用来存放数据
+					i++;
+					String inspection_lot=tmExcpNew.getBatch_no()+lpad(i+"", 2, "0");
+					tmExcpNew.setInspection_lot(inspection_lot);
+					List<MesCrAnnealM> tmpList = new ArrayList<MesCrAnnealM>();
+					tmpList.add(tmExcpNew);
+					resultMap.put(key, tmpList);
+				}
+ 
+			}
+		}catch(Exception e){
+			throw new Exception("炉次号向下相同牌号、相同尺寸(厚度、宽度)的物料集合生成一个检验批号进行分组时出现异常", e);
+		}
+		return resultMap;
+	}
+	
+	
+	
+	
+//	public void testgetObjectJson(){
+//		List<IfBaf01PdoM> list = this.getMapper(IfBaf01PdoMMapper.class).findWithCondition(null, "", "msg_time desc", 0, 0);
+//		
+//		JsonConfig jsonConfig=new JsonConfig();
+//		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+//		jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+//		jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+//		jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+//		JSONObject jsonObject=JSONObject.fromObject(list.get(0),jsonConfig);
+//		System.out.println(jsonObject.toString());
+//		
+//	}
+//	
+//	public String ReceiveBaf01Pdo_M_TrancTest(IfBaf01PdoM json) throws Exception{
+//		String v_message="";
+//		if(json==null || "".equals(json.toString())){
+//			v_message="二级接口-宝信罩退炉PDO-产出实绩为空";
+//			return v_message;
+//		}
+//		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_pdo 代替描述
+//		//暂定
+//		IfBaf01PdoM v_rec_pdo=json;
+//		//  --(2)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+//		if(v_rec_pdo.getMsg_time()==null){
+//			v_rec_pdo.setMsg_time(new Date());
+//		}
+//		//  --(3)、将对象,插入L2产出实绩表(单独的事务)  
+//		try{
+//			this.getMapper(IfBaf01PdoMMapper.class).insert(v_rec_pdo);
+//		}catch(Exception e){
+//			e.printStackTrace();
+//		}
+//		//  --(4)、调用处理L2产出实绩函数(事务在函数内)
+//		try{
+//			v_message=this.getBean(MesApiAnnealPdiPdoImpl.class).ReceiveTRCIFSLITLOG_TrancTest(v_rec_pdo, v_message);
+//		}catch(Exception e){
+//			e.printStackTrace();
+//			v_message=e.getMessage();
+//		}
+//		//  --(5)、拼接接口参数字符串
+//		String  v_params = ""; 																																			
+//		
+//		//  --(6)、写接口日志:与业务处理分开,单独的事务
+//		try{
+//			 this.getMapper(IfBaf01LogMapper.class).doInsert(null,"ReceiveBaf01Pdo_M",v_params,v_message);
+//		}catch(Exception e){
+//			e.printStackTrace();
+//		}
+//		return v_message;
+//	}
+//	
+	/**
+		过程分析:
+		this.getBean(QcmJhySampleConsignMServiceImpl.class).insertIfSlitLog(cpqjsfp);中有
+		@Transactional(propagation = Propagation.REQUIRES_NEW,value = "tm", rollbackFor = Exception.class)
+		REQUIRES_NEW表示:不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
+		即insertIfSlitLog是新的单独的事务。
+		 此结果是this.getMapper(IfTpm01LogMapper.class).doInsert(XXX)会回滚(因为后面的int i=1/0);
+	 	insertIfSlitLog方法里面没有报错的话,会插入this.getMapper(IfSlit01LogMapper.class).insert里面,方法报错的话,只针对insertIfSlitLog方法回滚。
+	 	ReceiveTRCIFSLITLOG_TrancTest继续执行。
+	**/
+//	@Transactional(value="tm", rollbackFor=Exception.class)
+//	public String ReceiveTRCIFSLITLOG_TrancTest(IfBaf01PdoM v_rec_pdo, String v_message) throws Exception {
+//		Integer v_cnt;
+//		//  --(1)、根据电文中,构建作业计划号、钢卷号、炉内序号集合
+//		try{
+//			IfSlit01Log ifs=new IfSlit01Log();
+//			ifs.setCreate_time(new Date());
+//			ifs.setResult_desc("2018-11-12测试多接口之间的事务回滚,可配置型的Spring事务。");
+//			this.getMapper(IfTpm01LogMapper.class).doInsert(null,"测试多接口之间的事务回滚","1","2");
+//			CommonPage<QcmJhySampleFromPlan>  cpqjsfp=new CommonPage<QcmJhySampleFromPlan>();
+//			cpqjsfp.setObject(new QcmJhySampleFromPlan());
+//			try{
+//				this.getBean(QcmJhySampleConsignMServiceImpl.class).insertIfSlitLog(cpqjsfp);
+//			}catch(Exception e){
+//				e.printStackTrace();
+//			}
+//			int i=1/0;
+//		    //  --(3)、提交事务
+//			v_message="L2产出实绩处理完成!";
+//		}catch(Exception e){
+//			e.printStackTrace();
+//			if(v_message==null || "".equals(v_message)){
+//				if(e.getMessage()!=null && e.getMessage().length()>200){
+//					v_message="L2产出实绩处理出错:"+e.getMessage().substring(0,200);
+//				}else{
+//					v_message="L2产出实绩处理出错:"+e.getMessage();
+//				}
+//			}
+//			throw new Exception(v_message);
+//		}
+//		return v_message;
+//	}
+//	
+//	@Transactional(propagation = Propagation.REQUIRES_NEW,value = "tm", rollbackFor = Exception.class)
+//	public ResultModel insertIfSlitLog(CommonPage<QcmJhySampleFromPlan> sum) throws Exception {
+//		ResultModel rm = new ResultModel();
+//		try {
+//			QcmJhySampleFromPlan sm = sum.getObject();
+//			IfSlit01Log ifs=new IfSlit01Log();
+//			ifs.setCreate_time(new Date());
+//			ifs.setResult_desc("2018-11-12测试多接口之间的事务回滚,可配置型的Spring事务。");
+//			this.getMapper(IfSlit01LogMapper.class).insert(ifs);
+//			rm.setState("200");
+//			//int i=1/0;
+//		} catch (Exception e) {
+//			rm.setState("500");
+//			rm.setMsgInfo("插入失败!" + e.getMessage());
+//			throw new Exception(e.getMessage());
+//		}
+//		return rm;
+//	}
+	
+	
+	// 补零
+	public static String lpad(String str, int num, String pad) {
+		String n_str = str;
+		if (str == null && "".equals(str))
+			n_str = " ";
+		for (int i = str.length(); i < num; i++) {
+			n_str = pad + n_str;
+		}
+		return n_str;
+	}
+
+}

+ 1256 - 0
src/main/java/market/Api/Mes/impl/MesApiAnnealPlanImpl.java

@@ -0,0 +1,1256 @@
+package market.Api.Mes.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import market.Api.Mes.service.MesApiAnnealPlanService;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.vo.ComBaseInfo;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielInvalidMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielInvalid;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.MaterielTrack.mapper.PrcMaterielExtinfoMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielRelationMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielVtProcessMapper;
+import market.Mes.MaterielTrack.vo.PrcMaterielProcess;
+import market.Mes.MaterielTrack.vo.PrcMaterielRelation;
+import market.Mes.MaterielTrack.vo.PrcMaterielVtProcess;
+import market.Mes.OrderManager.Plan.mapper.PlnOrderStatisticMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderStatisticMapper;
+import market.Mes.OrderManager.Plan.vo.PlnOrderStatistic;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.OrderManager.Plan.vo.PlnProdorderStatistic;
+import market.Mes.anneal.Design.mapper.PlnAnPlanStatisticMapper;
+import market.Mes.anneal.Design.mapper.PlnAnnealDsnMainMapper;
+import market.Mes.anneal.Design.mapper.PlnAnnealDsnMultinfoMapper;
+import market.Mes.anneal.Design.vo.PlnAnPlanStatistic;
+import market.Mes.anneal.Design.vo.PlnAnnealDsnMain;
+import market.Mes.anneal.Design.vo.PlnAnnealDsnMultinfo;
+import market.Mes.anneal.mapper.MesCrAnnealMMapper;
+import market.Mes.anneal.mapper.PlnAnnealPlanDetailMapper;
+import market.Mes.anneal.mapper.PlnAnnealPlanMapper;
+import market.Mes.anneal.vo.MesCrAnnealM;
+import market.Mes.anneal.vo.PlnAnnealPlan;
+import market.Mes.anneal.vo.PlnAnnealPlanDetail;
+
+import org.springframework.beans.BeanUtils;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path="MesApiAnnealPlanService")
+public class MesApiAnnealPlanImpl extends BaseServiceImpl implements MesApiAnnealPlanService{
+	
+	//--------------------------------罩退上料、下PDI Start----------------------------------------------------
+	
+	/**
+	 * 罩退上料接口 下PDI 验证
+	 * @throws Exception 
+	 * 其实都是单条操作
+	 */
+	public void MesCrAnnealMAddValid(List<MesCrAnnealM> oci) throws Exception{
+		//循环 根据(罩退计划号数组,虚拟物料号数组) 读取 罩退计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for(MesCrAnnealM mcsm:oci){
+			PlnAnnealPlanDetail plpd=new PlnAnnealPlanDetail();
+			plpd.setAn_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			//如果不存在,则报错退出“罩退计划[xxxxx][xx]信息不存在!”
+			List<PlnAnnealPlanDetail> lppd=this.getMapper(PlnAnnealPlanDetailMapper.class).find(plpd, 0, 0);
+			if(lppd==null||lppd.size()==0){
+				throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+			}
+			
+			PlnMaterielDetail M1=new PlnMaterielDetail();
+			//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+			}
+			
+			//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1=lpmd.get(0);
+			if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+				throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+			}
+			
+			//实际上只有一条
+			for(PlnAnnealPlanDetail ppdc:lppd){
+				//判断罩退计划明细的状态【STATUS】
+				if(ppdc.getStatus().compareTo("5BAN02")>0){
+					throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]已上料,不能再次操作!");
+				}
+			}
+		}
+	}
+	/**
+	 * 罩退上料接口 下PDI
+	 * @throws Exception 
+	 * 其实都是单条操作
+	 */
+	public void MesCrAnnealMAdd(List<MesCrAnnealM> oci) throws Exception{
+		
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		
+		//循环 根据(罩退计划号数组,虚拟物料号数组) 读取 罩退计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for(MesCrAnnealM mcsm:oci){
+			PlnAnnealPlanDetail plpd=new PlnAnnealPlanDetail();
+			plpd.setAn_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			//如果不存在,则报错退出“罩退计划[xxxxx][xx]信息不存在!”
+			List<PlnAnnealPlanDetail> lppd=this.getMapper(PlnAnnealPlanDetailMapper.class).find(plpd, 0, 0);
+			if(lppd==null||lppd.size()==0){
+				throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+			}
+			
+			PlnMaterielDetail M1=new PlnMaterielDetail();
+			//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+			}
+			
+			//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1=lpmd.get(0);
+			if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+				throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+			}
+			
+			//实际上只有一条
+			for(PlnAnnealPlanDetail ppdc:lppd){
+				//判断罩退计划明细的状态【STATUS】
+				if(ppdc.getStatus().compareTo("5BAN02")>0){
+					throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]已上料,不能再次操作!");
+				}
+				PrcMaterielProcess pmp=new PrcMaterielProcess();
+				pmp.setPrc_code("5BAN03");//新增的状态
+				
+				//这里的格式要和字符串日期的格式匹配,不然会抛出转换异常   
+				SimpleDateFormat  dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+				if (mcsm.getMemo() != null && !"".equals(mcsm.getMemo())) {
+					Date createdate = dateFormat.parse(mcsm.getMemo());
+					pmp.setCreate_time(createdate);
+				}else {
+					pmp.setCreate_time(new Date());
+				}
+				
+				
+				pmp.setObject_no(M1.getObject_no());
+				pmp.setCreate_man_name(userName);
+				pmp.setRemark(mcsm.getMemo());
+				//新增物料跟踪:
+				this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+				
+				//修改罩退计划明细表
+				PlnAnnealPlanDetail plpdu=new PlnAnnealPlanDetail();
+				plpdu.setStatus("5BAN03");
+				plpdu.setSerial_no(ppdc.getSerial_no());
+				this.getMapper(PlnAnnealPlanDetailMapper.class).update(plpdu);
+			}
+			
+			//根据母卷号,查询对应的所有子卷信息
+			PlnMaterielDetail pmdq=new PlnMaterielDetail();
+			pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+			for(PlnMaterielDetail ppdc:lpmdc){
+				//修改各子卷的 状态 STATUS= 0PAN03; 
+				PlnMaterielDetail pmdu=new PlnMaterielDetail();
+				pmdu.setSerial_no(ppdc.getSerial_no());
+				pmdu.setStatus("0PAN03");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+				
+				//增加子卷的 虚拟物料履历表
+				this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(),"0PAN03",userName,new Date());
+			}
+			
+			//修改罩退计划主表
+			doUpdatePlnAnnealPlan(mcsm.getSchedule_no()); 
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			//修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PAN03");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			//写虚拟物料履历,状态填:	0PAN03	母卷																			
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PAN03",userName,new Date());
+		}
+	}
+	
+	/**
+	 * 撤销罩退上料接口 下PDI 验证
+	 * @param 虚拟子卷号
+	 * @throws Exception 
+	 * 其实都是单条操作
+	 */
+	public void MesCrAnnealMCancelValid(List<MesCrAnnealM> oci) throws Exception{
+		//循环 根据(罩退计划号数组,虚拟物料号数组) 读取 罩退计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for(MesCrAnnealM mcsm:oci){
+			PlnAnnealPlanDetail plpd=new PlnAnnealPlanDetail();
+			plpd.setAn_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			//如果不存在,则报错退出“罩退计划[xxxxx][xx]信息不存在!”
+			List<PlnAnnealPlanDetail> lppd=this.getMapper(PlnAnnealPlanDetailMapper.class).find(plpd, 0, 0);
+			if(lppd==null||lppd.size()==0){
+				throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+			}
+			
+			PlnMaterielDetail M1=new PlnMaterielDetail();
+			//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+			}
+			
+			//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1=lpmd.get(0);
+			if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+				throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+			}
+			
+			//实际上只有一条
+			for(PlnAnnealPlanDetail ppdc:lppd){
+				//判断罩退计划明细的状态【STATUS】
+				if(!"5BAN03".equals(ppdc.getStatus())){
+					throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]上料后,经过其他操作,不允许撤销!");
+				}
+			}
+		}
+	}
+	
+	/**
+	 * 撤销罩退上料接口 下PDI
+	 * @param 虚拟子卷号
+	 * @throws Exception 
+	 * 其实都是单条操作
+	 */
+	public void MesCrAnnealMCancel(List<MesCrAnnealM> oci) throws Exception{
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		
+		//循环 根据(罩退计划号数组,虚拟物料号数组) 读取 罩退计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for(MesCrAnnealM mcsm:oci){
+			PlnAnnealPlanDetail plpd=new PlnAnnealPlanDetail();
+			plpd.setAn_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			//如果不存在,则报错退出“罩退计划[xxxxx][xx]信息不存在!”
+			List<PlnAnnealPlanDetail> lppd=this.getMapper(PlnAnnealPlanDetailMapper.class).find(plpd, 0, 0);
+			if(lppd==null||lppd.size()==0){
+				throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+			}
+			
+			PlnMaterielDetail M1=new PlnMaterielDetail();
+			//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+			}
+			
+			//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1=lpmd.get(0);
+			if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+				throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+			}
+			
+			//实际上只有一条
+			for(PlnAnnealPlanDetail ppdc:lppd){
+				//判断罩退计划明细的状态【STATUS】
+				if(!"5BAN03".equals(ppdc.getStatus())){
+					throw new Exception("罩退计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]上料后,经过其他操作,不允许撤销!");
+				}
+				PrcMaterielProcess pmp=new PrcMaterielProcess();
+				pmp.setObject_no(M1.getObject_no());
+				pmp.setPrc_code("5BAN03");
+				pmp.setRemark("回退上料");
+				pmp.setKeep_sametime_status(0);
+				ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+				//撤销实物物料状态跟踪
+				if(!"0".equals(al.getState())){
+					throw new Exception("物料状态不是已上料状态,不允许撤销!");
+				}
+				//修改罩退计划明细表
+				PlnAnnealPlanDetail plpdu=new PlnAnnealPlanDetail();
+				// V_最后状态
+				plpdu.setStatus(((PrcMaterielProcess)al.getData()).getPrc_code());// "5BAN02"
+				plpdu.setSerial_no(ppdc.getSerial_no());
+				this.getMapper(PlnAnnealPlanDetailMapper.class).update(plpdu);
+			}
+			
+			//根据母卷号,查询对应的所有子卷信息
+			PlnMaterielDetail pmdq=new PlnMaterielDetail();
+			pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+			for(PlnMaterielDetail ppdc:lpmdc){
+				//修改各子卷的 状态 STATUS= 0PAN02; 
+				PlnMaterielDetail pmdu=new PlnMaterielDetail();
+				pmdu.setSerial_no(ppdc.getSerial_no());
+				pmdu.setStatus("0PAN02");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+				//增加子卷的 虚拟物料履历表
+				this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(),"0PAN02",userName,new Date());
+			}
+			//修改罩退计划主表
+			doUpdatePlnAnnealPlan(mcsm.getSchedule_no()); 
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			//修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PAN02");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			//写虚拟物料履历,状态填:	0PAN02	母卷																			
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PAN02",userName,new Date());
+		}
+	}
+	//--------------------------------罩退上料、下PDI End----------------------------------------------------
+	
+	//--------------------------------罩退完成 Start----------------------------------------------------
+	/**
+	 * 罩退完成
+	 * 实物 生成接口  产生实物,未挂上单时调用
+	 * @param OBJECT_NO 实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @param RELATION_TYPE 关系类型     1:改号(原-现号码对应);2:轧制(板坯-钢板对应);3:剪切/切割(母-子对应)
+	 * @throws Exception 
+	 */
+	public void AnnealFinsh_PrcMatRelAdd(PrcMaterielRelation pmr) throws Exception{
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class)
+				.findWithCondition(null, "sort_code = '2002' AND validflag = '1'",
+						null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BAN80,操作时间,操作人,"")
+		PrcMaterielProcess pmp=new PrcMaterielProcess();
+		pmp.setObject_no(pmr.getSub_object_no());
+		pmp.setPrc_code("5BAN80");//新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		//新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+		
+		//调用公共函数2  建立物料母子对应关系 
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRelation_type(2);
+		pmr.setPrc_code("5BAN80");
+		pmr.setRemark("");
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+		
+		// 新增物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmr.getObject_no(), pmr.getSub_object_no(), null, processpoint.anneal_code);
+	}
+	
+	/**
+	 * 撤销罩退
+	 * 实物 撤销生成接口  产生实物,未挂上单时调用
+	 * @param OBJECT_NO 实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @throws Exception 
+	 */
+	public void AnnealFinsh_PrcMatRelRemove(PrcMaterielRelation pmr) throws Exception{
+				
+		//回退子卷物料跟踪:
+		PrcMaterielProcess pmp=new PrcMaterielProcess();
+		pmp.setObject_no(pmr.getSub_object_no());
+		pmp.setPrc_code("5BAN80");
+		pmp.setKeep_sametime_status(0);
+		pmp.setRemark("撤销罩退实物生成");
+		ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		//撤销实物物料状态跟踪
+		if(!"0".equals(al.getState())){
+			throw new Exception("实物["+pmp.getObject_no()+"]状态已发生改变,不能撤销!");
+		}
+		
+		//调用公共函数3  断开物料母子对应关系 
+		PrcMaterielRelation pmrd=new PrcMaterielRelation();
+		pmrd.setObject_no(pmr.getObject_no());
+		pmr.setSub_object_no(pmr.getSub_object_no());
+		this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+		
+		// 删除物料附加信息
+		this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmr.getSub_object_no());
+	}
+	
+	
+	/**
+	 * 罩退完成 虚拟子卷 挂料接口
+	 * 
+	 * @param material_no   实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @param object_no_vt  虚拟子卷号
+	 * @param create_time   操作时间 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+	 * @throws Exception
+	 */
+	public void AnnealFinsh_Relation(PlnMaterielDetail pmd) throws Exception{
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		// 新增物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(),
+				pmd.getObject_no_vt(), processpoint.anneal_code);
+				
+		//调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd=new YdmProductDetail();
+		ypd.setCoilno(pmd.getSub_object_no());
+		List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if(lypd==null||lypd.size()==0){
+			throw new Exception("库存中无["+pmd.getObject_no()+"]实物卷!");
+		}
+		
+		//罩退工序代码processpoint.anneal_code 2018-06-13
+		//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if(lpmd==null||lpmd.size()==0){
+			throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+		}
+		
+		if(!lypd.get(0).getSteelcode().equals(lpmd.get(0).getSteel_code())){
+//			throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的牌号不匹配,不能绑定");
+		}
+		// 2018-08-27 生产完成后厚度按实际情况取值,很有可能和计划不一致,故去此验证.
+//		if(lypd.get(0).getThick().doubleValue()!=lpmd.get(0).getThick().doubleValue()){
+//			throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的厚不匹配,不能绑定");
+//		}
+		//------------------------2018-03-16------------------------------
+		//100-100>5 考虑偏差
+//		if((lypd.get(0).getWidth().doubleValue()-lpmd.get(0).getWidth().doubleValue()>dUpper)
+//				||(lypd.get(0).getWidth().doubleValue()-lpmd.get(0).getWidth().doubleValue()<dLower)){
+//			throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的宽不匹配,不能绑定");
+//		}
+//		//----------------------------------------------------------------
+//		if(lpmd.get(0).getObject_no()!=null&&!"".equals(lpmd.get(0).getObject_no())){
+//			throw new Exception("实物卷["+pmd.getObject_no()+"]已绑定其他计划, 不能再次绑定!");
+//		}
+//		
+		
+		// 修改虚拟物料表
+		PlnMaterielDetail pmdq=new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		pmdq.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdq.setObject_no(pmd.getSub_object_no());
+		pmdq.setStatus("0PAN80");
+		pmdq.setIs_finished("1");
+//		pmdq.setPrev_process_code(processpoint.anneal_code);
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdq);
+		// 新增虚拟子物料履历																			
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PAN80",userName,createTime);
+		
+		//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BAN80,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getSub_object_no());
+		pmp.setPrc_code("5BAN80");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+				
+		// 2018-06-19 去掉 判断下一工序==null条件(判断虚拟子物料是否是其他子料的原料)
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpmd.get(0).getOrder_no());
+		pos.setAn(lpmd.get(0).getSingle_weight());
+		pos.setAn_cnt(1l);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+		pps.setAn(lpmd.get(0).getSingle_weight());
+		pps.setAn_cnt(1l);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+		
+		//修改虚拟物料对应的 罩退计划进程表
+		if(Utils.isNotEmpty(lpmd.get(0).getAn_plan_no())) {
+			PlnAnPlanStatistic plps=new PlnAnPlanStatistic();
+			plps.setAn_plan_no(lpmd.get(0).getAn_plan_no());
+			plps.setAn(lpmd.get(0).getSingle_weight());
+			plps.setAn_cnt(1l);
+			this.getMapper(PlnAnPlanStatisticMapper.class).doUpdatePlaned(plps);
+		}
+		
+		//调用公共函数2  建立物料母子对应关系 
+		PrcMaterielRelation pmr=new PrcMaterielRelation();
+		pmr.setObject_no(pmd.getMaterial_no());
+		pmr.setSub_object_no(pmd.getSub_object_no());
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRemark("");
+		pmr.setRelation_type(2);
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);	
+	}
+	
+	/**
+	 * 罩退完成 不符合计划
+	 * 实物生成, 新增虚拟子卷挂料
+	 * @param sub_object_no 实物子卷号
+	 * @param object_no 实物母卷号
+	 * @param create_time 操作时间
+	 * 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+	 * @throws Exception 
+	 * 2018-06-19
+	 */
+	public ResultModel AnnealFinsh_No_Plan(PlnMaterielDetail pmd) throws Exception {
+		ResultModel rm = new ResultModel("200", "");
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class)
+				.findWithCondition(null, "sort_code = '2002' AND validflag = '1'",
+						null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+		//调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd=new YdmProductDetail();
+		ypd.setCoilno(pmd.getSub_object_no());
+		List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if(lypd==null||lypd.size()==0){
+			throw new Exception("库存中无["+pmd.getSub_object_no()+"]实物卷!");
+		}
+		// 获取母卷虚拟物料信息
+		PlnMaterielDetail pmdcm=new PlnMaterielDetail();
+		pmdcm.setObject_no(pmd.getObject_no());
+		List<PlnMaterielDetail> pmdpp = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdcm, " nvl(invalid_flg,0) = 0 ", "", 0, 1);
+		if (pmdpp == null || pmdpp.size()==0) {
+			rm.setState("500");
+			rm.setMsgInfo("实物["+pmd.getObject_no()+"]的虚拟物料信息不存在!");
+			return rm;
+		}
+		PlnProdorder pp=new PlnProdorder();
+		pp.setProd_order_no(pmdpp.get(0).getProd_order_no());
+		List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		if(lpp==null||lpp.size()==0){
+			rm.setState("500");
+			rm.setMsgInfo("生产订单["+pp.getProd_order_no()+"]不存在!");
+			return rm;
+		}
+		
+		// 获取下一个工序
+		String temp = this.getBean(MesApiDesignInfoImpl.class).getPath(lpp.get(0).getWhole_process_codes(), processpoint.anneal_code, pmdpp.get(0).getProc_repeat_index());
+		String[] path =  temp.split("-");
+		ArrayList<String> validpath = this.getBean(MesApiDesignInfoImpl.class).getProcessPath(path);
+		
+		// 新建虚拟物料表【PLN_MATERIEL_DETAIL】虚拟子卷信息
+		PlnMaterielDetail pmdc=new PlnMaterielDetail();
+		// 获取序列号
+		List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null, " serial_no desc ", 0, 1);
+		long PMDNo=lpmd==null?1:(lpmd.size()==0?1:(lpmd.get(0).getSerial_no()+1));
+		// 6位日期
+		String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+		// 6位流水号
+		int objectnoVtNo=this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate)+1;
+		pmdc.setSerial_no(PMDNo);
+		// 年月日(6位)+6位流水
+		pmdc.setObject_no_vt(sDate+String.format("%06d", objectnoVtNo));
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setObject_no(pmd.getSub_object_no());
+		pmdc.setPline_code(lpp.get(0).getPline_code());
+		pmdc.setStatus("0PAN80");
+		pmdc.setIs_finished("1");
+		pmdc.setPrev_dsn_process_code(processpoint.anneal_code);
+		pmdc.setPrev_process_code(processpoint.anneal_code);
+		pmdc.setIs_prev_dsn_finished("1");//母卷:0
+		pmdc.setCreate_design_no(pmdpp.get(0).getAn_design_no());
+		pmdc.setCreate_process_code(processpoint.anneal_code);
+		if (Utils.isNotEmpty(validpath)) {
+			pmdc.setNext_dsn_process_code(validpath.get(0));
+			pmdc.setNext_process_code(validpath.get(0));
+		}
+		pmdc.setIs_mat(0);//母卷:1
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pmdc.setPline_code(lpp.get(0).getPline_code());
+		pmdc.setLw_design_no(pmdpp.get(0).getLw_design_no());
+		pmdc.setAn_design_no(pmdpp.get(0).getAn_design_no());
+		pmdc.setCl_plan_no(pmdpp.get(0).getCl_plan_no());
+		pmdc.setMat_object_no_vt(pmdpp.get(0).getObject_no_vt());
+		pmdc.setIs_multi("0");
+		pmdc.setSteel_code(lpp.get(0).getSteel_code());
+		pmdc.setWidth(lypd.get(0).getWidth());
+		pmdc.setThick(lypd.get(0).getThick());
+		pmdc.setLength(lypd.get(0).getLength());
+		pmdc.setDiameter_inn(lypd.get(0).getDiameter_inn());
+		pmdc.setDiameter_out(lypd.get(0).getDiameter_out());
+		pmdc.setSingle_weight(lypd.get(0).getFactweight());
+		pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pmdc.setOrd_flg("2");
+		pmdc.setCreate_man_name(userName);
+		pmdc.setCreate_time(createTime);
+		pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+		
+		// 子卷存在下一个工序
+		if (Utils.isNotEmpty(validpath)) {
+			// 调用设计信息接口
+			List<DesignInfo> infos = new ArrayList<>();
+			DesignInfo infor = new DesignInfo();
+			infor.setCurrentProcIndex(0);
+			infor.setObject_no(pmd.getSub_object_no());
+			infor.setObject_no_vt(pmdc.getObject_no_vt());
+			infor.setProcess(validpath);
+			infor.setProd_order_no(pmdpp.get(0).getProd_order_no());
+			infor.setSingle_wgt(lypd.get(0).getFactweight());
+			infos.add(infor);
+			ResultModel result = this.getBean(MesApiDesignInfoImpl.class).Design_Plan_Info(infos,null);
+			if (!"200".equals(result.getState())) {
+				throw new Exception("生产设计信息失败" + result.getMsgInfo());
+			}
+		}
+		
+		// 反写实绩的虚拟物料号 2018-09-20
+		MesCrAnnealM mcd = new MesCrAnnealM();
+		mcd.setMaterial_no(pmd.getSub_object_no());
+		mcd.setMaterial_no_vt(pmdc.getObject_no_vt());
+		this.getMapper(MesCrAnnealMMapper.class).updatebymaterial_no(mcd);
+		
+		// 反写实物虚拟卷号 2018-11-08
+		ypd.setObject_no_vt(pmdc.getObject_no_vt());
+		this.getMapper(YdmProductDetailMapper.class).update(ypd);
+		
+		//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BAN80,操作时间,操作人,"")
+		PrcMaterielProcess pmp=new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getSub_object_no());
+		pmp.setPrc_code("5BAN80");
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+		
+		// 新增虚拟子物料履历																			
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(pmdc.getObject_no_vt(),"0PAN80",userName,createTime);
+		
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpp.get(0).getOrder_no());
+		pos.setAn(pmdc.getSingle_weight());
+		pos.setAn_cnt(1l);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(pmdc.getProd_order_no());
+		pps.setAn(pmdc.getSingle_weight());
+		pps.setAn_cnt(1l);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+		
+		//修改虚拟物料对应的 罩退计划进程表
+		PlnMaterielDetail pmdmq=new PlnMaterielDetail();
+		pmdmq.setObject_no_vt(pmdc.getMat_object_no_vt());
+		List<PlnMaterielDetail> lpmdm=this.getMapper(PlnMaterielDetailMapper.class).find(pmdmq, 0, 1);
+		PlnAnPlanStatistic plps=new PlnAnPlanStatistic();
+		plps.setAn_plan_no(lpmdm.get(0).getAn_plan_no());
+		plps.setAn(pmdc.getSingle_weight());
+		plps.setAn_cnt(1l);
+		this.getMapper(PlnAnPlanStatisticMapper.class).doUpdatePlaned(plps);
+		
+		//调用公共函数2  建立物料母子对应关系 
+		PrcMaterielRelation pmr=new PrcMaterielRelation();
+		pmr.setObject_no(pmd.getObject_no());
+		pmr.setSub_object_no(pmd.getSub_object_no());
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRemark("");
+		pmr.setRelation_type(2);
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+		return rm;
+	}
+	
+	/**
+	 * 撤销罩退
+	 * 虚拟子卷 挂料接口
+	 * @param OBJECT_NO 实物子卷号
+	 * @param object_no_vt 虚拟子卷号
+	 * @throws Exception 
+	 */
+	public void AnnealFinsh_RelationCancel(PlnMaterielDetail pmd) throws Exception{
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+				
+		// 调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd=new YdmProductDetail();
+		ypd.setCoilno(pmd.getObject_no());
+		List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if(lypd==null||lypd.size()==0){
+			throw new Exception("库存中无["+pmd.getObject_no()+"]实物卷!");
+		}
+		 
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if(lpmd==null||lpmd.size()==0){
+			throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+		}
+		
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷的母卷信息
+		List<PlnMaterielDetail> lpmdm=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+lpmd.get(0).getMat_object_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if(lpmdm==null||lpmdm.size()==0){
+			throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+		}
+		
+		if(lpmdm.get(0).getObject_no()==null||"".equals(lpmdm.get(0).getObject_no())){
+			throw new Exception("实物卷["+pmd.getObject_no()+"]尚未绑定该计划,不能回退!");
+		}
+		
+		// 下一个工序做了计划就不能回退
+		if (Utils.isNotEmpty(pmd.getNext_dsn_process_code())) {
+		this.getBean(MesApiDesignInfoImpl.class).JudgeIsOrNotPlan(lpmd.get(0));
+		}
+		//回退子卷物料跟踪:
+		PrcMaterielProcess pmp=new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setPrc_code("5BAN80");
+		pmp.setKeep_sametime_status(0);
+		pmp.setRemark("撤销子卷挂料");
+		ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		//撤销实物物料状态跟踪
+		if(!"0".equals(al.getState())){
+			throw new Exception("罩退完成后,实物["+pmp.getObject_no()+"]状态已发生改变,不能撤销!");
+		}
+		
+		// 物料充当脱单履历
+//		this.getBean(MesApiDesignInfoImpl.class).createMatLog(lpmd.get(0), "厂内合同取消交工",userName, lpmd.get(0).getPrev_process_code() , "-1", pmd.getObject_no());
+		
+		//修改虚拟物料表
+		PlnMaterielDetail pmdu=new PlnMaterielDetail();
+		pmdu.setObject_no_vt(pmd.getObject_no_vt());
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setStatus("0PAN03");
+		pmdu.setIs_finished("0");
+//		pmdu.setPrev_process_code(processpoint.anneal_code);
+		this.getMapper(PlnMaterielDetailMapper.class).doUpdateCancelRelation(pmdu);
+		//新增虚拟子物料履历																			
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PAN03",userName,new Date());
+		//判断虚拟子物料是否有其他子料的原料
+//		if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+			//修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos=new PlnOrderStatistic();
+			pos.setOrder_no(lpmd.get(0).getOrder_no());
+			pos.setAn(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+			pos.setAn_cnt(-1l);
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+			//生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+			PlnProdorderStatistic pps=new PlnProdorderStatistic();
+			pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+			pps.setAn(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+			pps.setAn_cnt(-1l);
+			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//		}
+		
+		//修改虚拟物料对应的 罩退计划进程表
+		PlnAnPlanStatistic plps=new PlnAnPlanStatistic();
+		plps.setAn_plan_no(lpmd.get(0).getAn_plan_no());
+		plps.setAn(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+		plps.setAn_cnt(-1l);
+		this.getMapper(PlnAnPlanStatisticMapper.class).doUpdatePlaned(plps);
+		
+		//调用公共函数3  断开物料母子对应关系 
+		PrcMaterielRelation pmr=new PrcMaterielRelation();
+		pmr.setObject_no(lpmdm.get(0).getObject_no());
+		pmr.setSub_object_no(lpmd.get(0).getObject_no());
+		this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+		
+		// 厂内合同子卷生产完成时,清空库存信息订单信息
+//		boolean flag_Ct = this.getBean(MesApiDesignInfoImpl.class).getContractType(lpmd.get(0).getProd_order_no());
+//		boolean flag_Mf = this.getBean(MesApiDesignInfoImpl.class).matIsFinish(pmd.getObject_no());
+//		if (flag_Mf && flag_Ct) {
+//			YdmProductDetail ydm = new YdmProductDetail();
+//			ydm.setCoilno(pmd.getObject_no());
+//			ydm.setProdorderno(lpmd.get(0).getProd_order_no());
+//			ydm.setOrderno(lpmd.get(0).getOrder_no());
+//			ydm.setObject_no_vt(pmd.getObject_no_vt());
+//			this.getMapper(YdmProductDetailMapper.class).update(ydm);;
+//		}
+		// 删除物料附加信息
+		this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmd.getObject_no());
+		
+		// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果是,则需释放虚拟子堆垛,调用接口:纵剪——虚拟子堆垛 释放接口
+		if ("2".equals(lpmd.get(0).getOrd_flg())) {
+			AnnealFinsh_Release(pmd);
+		}
+	}
+	
+	/**
+	 * 罩退完成
+	 * 虚拟子卷 释放接口
+	 * @param object_no_vt 虚拟子卷号
+	 * @throws Exception 
+	 */
+	public void AnnealFinsh_Release(PlnMaterielDetail pmd) throws Exception{
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+		//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		PlnMaterielDetail pmdq=new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+		if(lpmd==null||lpmd.size()==0){
+			throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+		}
+		
+		// ------------------------2018-06-19-------------------------
+		// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果不成立, 则报错退出,“虚拟物料[xxx]不是额外成品,不能释放!”
+		if (!"2".equals(lpmd.get(0).getOrd_flg())) {
+			throw new Exception("虚拟物料["+pmd.getObject_no_vt()+"]不是额外成品,不能释放!");
+		}
+		// 判断虚拟子卷是否是罩退的虚拟成品
+		if(!processpoint.anneal_code.equals(lpmd.get(0).getPrev_dsn_process_code())){
+			throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]不是罩退设计成品,无法释放!");
+		}
+//		PlnMaterielDetail pmdqd=new PlnMaterielDetail();
+//		pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+//		int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+//		if (count>0) {
+//			throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+//		}
+		PlnMaterielDetail pmdqd=new PlnMaterielDetail();
+		pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> child = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+//		int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+		if (Utils.isNotEmpty(child)) {
+			// 删除子卷
+			this.getBean(MesApiDesignInfoImpl.class).deleteChildTrue(child);
+//			throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+		}
+		//------------------------------------------------------------
+		
+		// 判断虚拟子卷是否是其他物料母卷: IF(NEXT_DSN_PROCESS_CODE == NULL)
+		// if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+		
+			//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录,状态标记为“0PANXX”
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PANXX",userName,new Date());
+			
+			//将虚拟物料信息 从虚拟物料表【PLN_MATERIEL_DETAIL】移动到 无效虚拟物料表【PLN_MATERIEL_INVALID】.
+			//(两个表结构一样,移动后,保持serial_no不变,删除原表记录)
+			List<PlnMaterielInvalid> pmin = this.getMapper(PlnMaterielInvalidMapper.class).findWithCondition(null, " serial_no = '"+lpmd.get(0).getSerial_no()+"' or object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"'", "", 0, 0);
+			if (pmin !=null && pmin.size()>0) {
+				this.getMapper(PlnMaterielInvalidMapper.class).delete(lpmd.get(0).getSerial_no());
+			}
+			PlnMaterielInvalid pmi=new PlnMaterielInvalid();
+			BeanUtils.copyProperties(lpmd.get(0), pmi);
+			this.getMapper(PlnMaterielInvalidMapper.class).insert(pmi);
+			this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(lpmd.get(0));
+			
+	}
+	
+	/**
+	 * 罩退完成
+	 * 虚拟母卷统计
+	 * @param object_no_vt 虚拟母卷号
+	 * @param object_no 实物母卷号
+	 * @throws Exception 
+	 */
+	public void AnnealFinsh_Sum(PlnMaterielDetail pmd) throws Exception{
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		String plan_no = "";
+		// 工序点信息
+				List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+						"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+				ProcessPoint processpoint = new ProcessPoint(infoi);
+				
+		// 修改物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.anneal_code,true);
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+		PlnMaterielDetail pmdq=new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "nvl(invalid_flg , 0) <> 1", null, 0, 1);
+		if(lpmd==null||lpmd.size()==0){
+			throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+		}
+		if(lpmd.get(0).getObject_no()==null||"".equals(lpmd.get(0).getObject_no())){
+			throw new Exception("计划母卷["+pmd.getObject_no_vt()+"]未上料, 不能罩退!");
+		}
+		plan_no = lpmd.get(0).getAn_plan_no();
+		// 新增母卷物料跟踪:调用 新增实物物料状态跟踪
+		PrcMaterielProcess pmp=new PrcMaterielProcess();
+		pmp.setPrc_code("5BAN80");//新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+		// 判断虚拟母卷对应的虚拟子卷是否 挂料完成
+		List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+		int isum=0;
+		if (lpmdc != null && lpmdc.size() > 0) {
+			for (PlnMaterielDetail pmdcc : lpmdc) {
+				PlnMaterielDetail pmdcu = new PlnMaterielDetail();
+				pmdcu.setSerial_no(pmdcc.getSerial_no());
+				pmdcu.setIs_finished("1");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdcu);
+				if (pmdcc.getObject_no() == null || "".equals(pmdcc.getObject_no())) {
+					// 统计 (OBJECT_NO=NULL的子卷数量)、虚拟子卷总数量
+					isum += 1;
+				}
+			}
+			//如果(OBJECT_NO为NULL的数量==子卷总数
+			if(isum==lpmdc.size()){
+				//读取物料关系表【PRC_MATERIEL_RELATION】(where OBJECT_NO=实物母卷号 AND RELATION_TYPE=3)的记录
+				PrcMaterielRelation pmr=new PrcMaterielRelation();
+				pmr.setObject_no(lpmd.get(0).getObject_no());
+				pmr.setRelation_type(2);
+				List<PrcMaterielRelation> lpmr=this.getMapper(PrcMaterielRelationMapper.class).find(pmr, 0, 0);
+				if(lpmr==null||lpmr.size()==0){
+					//如果 关系表记录为空(说明实物卷未切割,计划未执行),直接报错退出“母卷xxxx尚未进行切割操作!”;
+					throw new Exception("母卷["+pmr.getObject_no()+"]尚未进行切割操作!");
+				}else{
+					//修改虚拟物料表的母卷记录:OBJECT_NO=NULL;  NEED_EXTOPT=1;  AN_PLAN_NO=NULL
+					PlnMaterielDetail pmdu=new PlnMaterielDetail();
+					pmdu.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+					pmdu.setNeed_extopt("1");
+					this.getMapper(PlnMaterielDetailMapper.class).doUpdateAnnealFinshSum(pmdu);
+				}
+			}else {
+				// 挂单的时候一起修改了
+//				this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), true);
+			}
+		}
+		
+		//修改虚拟物料表OPT_TIMES+=1; STATUS= 0PAN80; IS_NEXT_FINISHED=1(2018-06-19)(同步修改S1的[OPT_TIMES]、[STATUS]
+		PlnMaterielDetail pmdu=new PlnMaterielDetail();
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setIs_next_finished("1");
+		pmdu.setOpt_times((lpmd.get(0).getOpt_times()==null?0:lpmd.get(0).getOpt_times())+1);
+		pmdu.setStatus("0PAN80");
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+		
+		//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+		//-------------2018-03-21-------这个地方的an_plan_no有点特殊的地方,所以没有直接调用InsertMatVtProc接口------------
+		PlnMaterielDetail pmdcq=new PlnMaterielDetail();
+		pmdcq.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdq = this.getMapper(PlnMaterielDetailMapper.class).find(pmdcq, 0, 0);
+		//写虚拟物料履历,状态填:		子卷																			
+		PrcMaterielVtProcess pmvpc=new PrcMaterielVtProcess();
+		// 20191001
+		long serial_no = 0l;
+		List<PrcMaterielVtProcess> pmpQ = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(null, "", "serial_no desc", 0, 1);
+		if (Utils.isNotEmpty(pmpQ)) {
+			serial_no = pmpQ.get(0).getSerial_no()+1;
+		}
+		pmvpc.setSerial_no(serial_no);
+		// end
+		pmvpc.setObject_no_vt(lpmdq.get(0).getObject_no_vt());
+		pmvpc.setObject_no(lpmdq.get(0).getObject_no());
+		pmvpc.setObject_type(lpmdq.get(0).getObject_type());
+		pmvpc.setPline_code(lpmdq.get(0).getPline_code());
+		pmvpc.setStatus("0PAN80");
+		pmvpc.setOrder_no(lpmdq.get(0).getOrder_no());
+		pmvpc.setProd_order_no(lpmdq.get(0).getProd_order_no());
+		pmvpc.setLw_design_no(lpmdq.get(0).getLw_design_no());
+		pmvpc.setCl_design_no(lpmdq.get(0).getCl_design_no());
+		pmvpc.setRl_design_no(lpmdq.get(0).getRl_design_no());
+		pmvpc.setAn_design_no(lpmdq.get(0).getAn_design_no());
+		pmvpc.setLw_plan_no(lpmdq.get(0).getLw_plan_no());
+		pmvpc.setCl_plan_no(lpmdq.get(0).getCl_plan_no());
+		pmvpc.setRl_plan_no(lpmdq.get(0).getRl_plan_no());
+		pmvpc.setAn_plan_no(lpmdq.get(0).getAn_plan_no());
+		pmvpc.setBatch_no(lpmdq.get(0).getBatch_no());
+		pmvpc.setCreate_man_name(userName);
+		pmvpc.setCreate_time(createTime);
+		this.getMapper(PrcMaterielVtProcessMapper.class).doAdd(pmvpc);
+		//----------------------------------------------------------------------
+		
+		//修改虚拟物料对应的 罩退计划进程表
+		//MesCrSlittingD mcsd=this.getMapper(MesCrSlittingDMapper.class).findById(lpmd.get(0).getObject_no());
+		PlnAnPlanStatistic plps=new PlnAnPlanStatistic();
+		plps.setMat_an(lpmd.get(0).getSingle_weight());//mcsd.getCoil_act_wgt());
+		plps.setMat_an_cnt(1l);
+		plps.setAn_plan_no(plan_no);
+		this.getMapper(PlnAnPlanStatisticMapper.class).doUpdatePlaned(plps);
+		
+		//罩退计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BAN80
+		PlnAnnealPlanDetail plpd=new PlnAnnealPlanDetail();
+		plpd.setAn_plan_no(plan_no);
+		plpd.setStatus("5BAN80");
+		plpd.setObject_no_vt(pmd.getObject_no_vt());		
+		this.getMapper(PlnAnnealPlanDetailMapper.class).doUpdateWSum(plpd);
+		
+		//罩退计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(罩退计划号);
+		doUpdatePlnAnnealPlan(plan_no);
+		
+		// 将未挂单的子卷 置为无效
+//		List<PlnMaterielDetail> child = this.getMapper(
+//				PlnMaterielDetailMapper.class).findWithCondition(
+//				null,
+//				"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//						+ "' and nvl(invalid_flg,0) =0 and object_no is null",
+//				"", 0, 0);
+//		if (Utils.isNotEmpty(child)) {
+//			this.getBean(MesApiDesignInfoImpl.class).deleteChild(child);
+//		}
+	}
+	
+	/**
+	 * 撤销罩退
+	 * 撤销虚拟母卷统计
+	 * @param object_no_vt 虚拟母卷号
+	 * @param object_no 实物母卷号
+	 * @throws Exception 
+	 */
+	public void AnnealFinsh_SumCancel(PlnMaterielDetail pmd) throws Exception{
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+		List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if(lpmd==null||lpmd.size()==0){
+			throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+		}
+	
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		
+		// 修改物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.anneal_code,false);
+
+		// 将无效的虚拟物料子卷恢复
+//		List<PlnMaterielDetail> child = this.getMapper(
+//				PlnMaterielDetailMapper.class).findWithCondition(
+//				null,
+//				"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//						+ "' and invalid_flg = '1'", "", 0, 0);
+//		if (Utils.isNotEmpty(child)) {
+//			this.getBean(MesApiDesignInfoImpl.class).recoveryChild(child);
+//		}
+		
+		//读取虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】,获取虚拟母卷最后一条
+		PrcMaterielVtProcess pmvp=new PrcMaterielVtProcess();
+		pmvp.setStatus("0PAN80");
+		pmvp.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PrcMaterielVtProcess> lpmvp=this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(pmvp, "", " create_time desc ", 0, 1);
+		
+		//循环 (MAT_OBJECT_NO_VT=虚拟母卷号) 的所有虚拟子卷记录
+		PlnMaterielDetail pmdc=new PlnMaterielDetail();
+		pmdc.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).find(pmdc, 0, 0);
+		for(PlnMaterielDetail pmdcc:lpmdc){
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			pmdu.setSerial_no(pmdcc.getSerial_no());
+			pmdu.setIs_finished("0");
+			//修改虚拟物料表【PLN_MATERIEL_DETAIL】:IS_FINISHED=0;
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+		}
+		
+		//修改虚拟物料表_母卷信息
+		PlnMaterielDetail pmdu=new PlnMaterielDetail();
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setNeed_extopt("0");
+		pmdu.setIs_next_finished("0");
+		pmdu.setAn_plan_no(lpmvp.get(0).getAn_plan_no());
+		pmdu.setStatus_desc("0PAN03");
+		
+		if(lpmd.get(0).getObject_no()==null||"".equals(lpmd.get(0).getObject_no())){
+			pmdu.setObject_no(lpmvp.get(0).getObject_no());
+		}
+		// 2018-06-23 opt_Times 之前一直没减,判断条件不对
+		if(lpmd.get(0).getOpt_times()!=null){
+			pmdu.setOpt_times(lpmd.get(0).getOpt_times()-1);
+		}
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+		
+		//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PAN03",userName,new Date());
+		
+		//修改虚拟物料对应的 罩退计划进程表
+		PlnAnPlanStatistic plps=new PlnAnPlanStatistic();
+		plps.setMat_an(-lpmd.get(0).getSingle_weight());
+		plps.setMat_an_cnt(-1l);
+		plps.setAn_plan_no(lpmd.get(0).getAn_plan_no());
+		this.getMapper(PlnAnPlanStatisticMapper.class).doUpdatePlaned(plps);
+		
+		//回退实物母卷的物料跟踪 
+		PrcMaterielProcess pmp=new PrcMaterielProcess();
+		pmp.setObject_no(lpmd.get(0).getObject_no());
+		pmp.setPrc_code("5BAN80");
+		pmp.setRemark("撤销母卷罩退");
+		pmp.setKeep_sametime_status(0);
+		
+		ResultModel rm = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		if(!"0".equals(rm.getState())){
+			throw new Exception("罩退完成后,母卷状态已发生改变,不能撤销!");
+		}
+		
+		//罩退计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BAN03
+		PlnAnnealPlanDetail plpd=new PlnAnnealPlanDetail();
+		plpd.setAn_plan_no(lpmd.get(0).getAn_plan_no());
+		plpd.setStatus("5BAN03");
+		plpd.setObject_no_vt(pmd.getObject_no_vt());		
+		this.getMapper(PlnAnnealPlanDetailMapper.class).doUpdateWSum(plpd);
+		
+		//罩退计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(罩退计划号);
+		doUpdatePlnAnnealPlan(lpmd.get(0).getAn_plan_no());
+		// ----------------------------2018-06-19-------------------------------
+		// ---------------2018-10-16 挂单的时候一起修改
+//		this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), false);
+	}
+	
+	/**
+	 * 函数_通过加工计划产生设计
+	 * @param pro_order_no 生产订单号
+	 * @throws Exception 
+	 * */
+	public PlnAnnealDsnMain ProcessingPlanDsn(String pro_order_no) throws Exception{
+		PlnAnnealDsnMain san_design_no=null;
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		PlnProdorder pp=new PlnProdorder();
+		pp.setProd_order_no(pro_order_no);
+		List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		//根据加工计划号  读取生产订单对应的生产加工表[PLN_PROCESS_PLAN]
+		PlnProcessPlan ppp=new PlnProcessPlan();
+		ppp.setProduce_no(lpp.get(0).getProduce_no());
+		ppp.setValid_flag("1");
+		List<PlnProcessPlan> lppp=this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, null, " cut_order_no ", 0, 0);
+		if(lppp==null||lppp.size()==0){
+			throw new Exception("未找到生产订单["+ppp.getOrder_no()+"]对应的生产加工信息");
+		}
+		
+		//保存设计主表数据:  罩退设计号:DAN+YYMMDD+6流水号
+		String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnAnnealDsnMain pldm=new PlnAnnealDsnMain();
+		List<PlnAnnealDsnMain> lpdmNo=this.getMapper(PlnAnnealDsnMainMapper.class).findWithCondition(null, "", " serial_no desc ", 0, 1);
+		pldm.setAn_design_no("DAN"+sDate+String.format("%06d", 1));
+		if(lpdmNo!=null&&lpdmNo.size()>0){
+			pldm.setSerial_no(lpdmNo.get(0).getSerial_no()+1);
+			if(sDate.equals(lpdmNo.get(0).getAn_design_no().substring(3,9))){
+				pldm.setAn_design_no("DAN"+sDate+String.format("%06d", Integer.parseInt(lpdmNo.get(0).getAn_design_no().substring(9,15))+1 ));
+			}
+		}
+		
+		// 订单信息
+		pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+		pldm.setOrder_no(lpp.get(0).getOrder_no());
+		pldm.setPline_code(lpp.get(0).getPline_code());
+		pldm.setSteel_code(lpp.get(0).getSteel_code());
+		
+		String isMulti="0";//是否拼料 根据订单数判断,多个订单填1,否则填0
+		pldm.setIs_multi(isMulti);
+		
+		// 只有一条加工计划记录情况下
+		if(lppp.size()==1){
+			pldm.setThick(lppp.get(0).getThick());
+			pldm.setWidth(lppp.get(0).getWidth());
+			pldm.setLength(lppp.get(0).getLength());
+			pldm.setDiameter_inn(lppp.get(0).getDiameter_inn());
+			pldm.setDiameter_out(lppp.get(0).getDiameter_out());
+			pldm.setSingle_weight(lppp.get(0).getEstimate_weight());
+		}
+		
+		// 加工计划分切方式
+//		pldm.setCut_style(lppp.get(0).getCut_style());
+//		
+//		pldm.setCrosscut_style(lppp.get(0).getCrosscut_style());
+//		pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//		pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+		
+		pldm.setDesign_quantity(1);
+//		pldm.setDesign_weight(ypd.getFactweight());
+		
+		pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		pldm.setCreate_man_name(userName);
+		pldm.setCreate_time(new Date());
+		pldm.setIs_finished(0L);
+		pldm.setReserve_1(lppp.get(0).getProduce_no());
+		this.getMapper(PlnAnnealDsnMainMapper.class).insert(pldm);
+		san_design_no=pldm;
+		
+		//倒叙取一条拼料信息
+		List<PlnAnnealDsnMultinfo> lpdmM=this.getMapper(PlnAnnealDsnMultinfoMapper.class).findWithCondition(null, "", " serial_no desc ", 0,1);
+		long DsnNo=1;
+		if(lpdmM!=null&&lpdmM.size()>0){
+			DsnNo=lpdmM.get(0).getSerial_no()+1;
+		}
+		
+					//-----------------写拼料-----------------------------
+					PlnAnnealDsnMultinfo pldmc=new PlnAnnealDsnMultinfo();
+					pldmc.setSerial_no(DsnNo++);
+					pldmc.setAn_design_no(pldm.getAn_design_no());
+//					pldmc.setAn_seq(1);
+//					pldmc.setSeg_seq(1);
+					pldmc.setOrder_no(lpp.get(0).getOrder_no());
+					pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+					pldmc.setThick(lpp.get(0).getThick());
+					pldmc.setWidth(lpp.get(0).getWidth());
+					pldmc.setLength(lpp.get(0).getLength());
+					pldmc.setDiameter_inn(lpp.get(0).getDiameter_inn());
+					pldmc.setDiameter_out(lpp.get(0).getDiameter_out());
+					pldmc.setWeight(pldm.getSingle_weight());
+//					pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//					pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+					pldmc.setSub_seq(1);
+					this.getMapper(PlnAnnealDsnMultinfoMapper.class).insert(pldmc);
+		
+		return san_design_no;
+	}
+	
+	
+	/**
+	 * 公共函数1 修改罩退计划主表状态
+	 * @param 罩退计划号
+	 * @throws Exception
+	 */
+	public void doUpdatePlnAnnealPlan(String anPlanNo) throws Exception {
+		PlnAnnealPlan plp = new PlnAnnealPlan();
+		plp.setAn_plan_no(anPlanNo);
+		String MIN_STATUS = "";
+		boolean flag = false;
+		PlnAnnealPlanDetail plpd = new PlnAnnealPlanDetail();
+		plpd.setAn_plan_no(anPlanNo);
+		List<PlnAnnealPlanDetail> lplpd = this.getMapper(PlnAnnealPlanDetailMapper.class)
+				.findWithCondition(plpd, "status <> '0PANXX'", "status asc", 0, 0);
+		if (lplpd == null || lplpd.size() == 0) {
+			throw new Exception("未找到罩退计划明细数据!");
+		}
+		MIN_STATUS = lplpd.get(0).getStatus();
+
+		// 计划状态						// 实物状态		
+		// 0PAN01罩退计划已编制			// 5BAN01罩退计划已编制		
+		// 0PAN02罩退计划已下发			// 5BAN02罩退计划已下发		
+		// 0PAN03开始罩退作业				// 5BAN03开始罩退作业		
+		// 0PAN79罩退剪废				// 5BAN05正在罩退作业		
+		// 0PAN80罩退作业完成				// 5BAN79罩退剪废		
+		// 0PANXX罩退计划已失效			// 5BAN80罩退作业完成		
+										// 5BAN83等待罩退判定		
+										// 5BAN90罩退判定完成		
+		
+		// 如果明细记录中有卷开始作业,主表状态改为开始作业
+		for (PlnAnnealPlanDetail plnL : lplpd) {
+			if ("5BAN03".equals(plnL.getStatus())) {
+				flag = true;
+				break;
+			}
+		}
+		if (flag) {
+			plp.setStatus("0PAN03");
+		} else if ("5BAN01".equals(MIN_STATUS)) {
+			plp.setStatus("0PAN01");
+		} else if (MIN_STATUS.compareTo("5BAN02") <= 0) {
+			plp.setStatus("0PAN02");
+		} else if (MIN_STATUS.compareTo("5BAN03") <= 0) {
+			plp.setStatus("0PAN03");
+		} else if (MIN_STATUS.compareTo("5BAN80") <= 0) {
+			plp.setStatus("0PAN80");
+		}
+		this.getMapper(PlnAnnealPlanMapper.class).doUpdate(plp);
+	}
+
+}

+ 1868 - 0
src/main/java/market/Api/Mes/impl/MesApiCrCrossCuttingMServiceImpl.java

@@ -0,0 +1,1868 @@
+/***文档注释***********************************************
+ * 作者               :                  panbin
+ * 创建日期      :                   2018.06.55
+ * 描述               :                  Mes计划提供生产关于横剪方面的接口
+ * 注意事项      :                   
+ * 遗留BUG :                   
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+***********************************************************/
+package market.Api.Mes.impl;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import market.Api.Mes.service.MesApiCrCrossCuttingMService;
+import market.Com.impl.PbModelDbServiceImpl;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.mapper.ComDsnPltlmtMapper;
+import market.Com.vo.ComBaseInfo;
+import market.Com.vo.ComDsnPltlmt;
+import market.Com.vo.PbModelDb;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Mes.Cuttolength.Design.mapper.PlnCuttolengthDsnMainMapper;
+import market.Mes.Cuttolength.Design.mapper.PlnCuttolengthDsnMultinfoMapper;
+import market.Mes.Cuttolength.Design.vo.ClRestrict;
+import market.Mes.Cuttolength.Design.vo.PlnCuttolengthDsnMain;
+import market.Mes.Cuttolength.Design.vo.PlnCuttolengthDsnMultinfo;
+import market.Mes.Cuttolength.Plan.mapper.PlnClPlanStatisticMapper;
+import market.Mes.Cuttolength.Plan.mapper.PlnCuttolengthPlanDetailMapper;
+import market.Mes.Cuttolength.Plan.mapper.PlnCuttolengthPlanMapper;
+import market.Mes.Cuttolength.Plan.vo.PlnClPlanStatistic;
+import market.Mes.Cuttolength.Plan.vo.PlnCuttolengthPlan;
+import market.Mes.Cuttolength.Plan.vo.PlnCuttolengthPlanDetail;
+import market.Mes.Lengthwise.Design.mapper.PlnDsnOrderInfoMapper;
+import market.Mes.Lengthwise.Design.vo.PlnDsnOrderInfo;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingDMapper;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingD;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielInvalidMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.MesCrCrossCuttingM;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielInvalid;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.MaterielTrack.mapper.PrcMaterielExtinfoMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielRelationMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielVtProcessMapper;
+import market.Mes.MaterielTrack.vo.PrcMaterielProcess;
+import market.Mes.MaterielTrack.vo.PrcMaterielRelation;
+import market.Mes.MaterielTrack.vo.PrcMaterielVtProcess;
+import market.Mes.OrderManager.Plan.mapper.PlnOrderStatisticMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderStatisticMapper;
+import market.Mes.OrderManager.Plan.vo.PlnOrderStatistic;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.OrderManager.Plan.vo.PlnProdorderStatistic;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path = "MesApiCrCrossCuttingMService")
+public class MesApiCrCrossCuttingMServiceImpl extends BaseServiceImpl implements MesApiCrCrossCuttingMService {
+
+	
+	// --------------------------------开平上料、下PDI Start----------------------------------------------------
+	/**
+	 * 开平上料接口 下PDI 验证 
+	 * 
+	 * 开平计划号数组、 计划内序号数组
+	 * @throws Exception
+	 * 其实都是单条操作
+	 */
+	// 循环 根据(开平计划号数组,虚拟物料号数组) 读取 开平计划明细表【PLN_CuttoLength_PLAN_DETAIL】
+	public void MesCrCrossCuttingMAddValid(List<MesCrCrossCuttingM> oci) throws Exception {
+		for (MesCrCrossCuttingM mcsm : oci) {
+			PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+			// 开平计划号
+			plpd.setCl_plan_no(mcsm.getSchedule_no());
+			// 计划内序号
+			plpd.setCl_seq(mcsm.getInner_seq().intValue());
+			// 1、读取横剪计划明细表 如果不存在,则报错退出“开平计划[xxxxx][xx]信息不存在!”
+			List<PlnCuttolengthPlanDetail> lppd = this.getMapper(PlnCuttolengthPlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getInner_seq() + "]信息不存在!");
+			}
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 2、读取根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(lppd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 3、判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("开平计划[" + mcsm.getSchedule_no() + "][" +mcsm.getInner_seq() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnCuttolengthPlanDetail ppdc : lppd) {
+				// 4、 判断开平计划明细的状态【STATUS】
+				if (ppdc.getStatus().compareTo("5BCL02") > 0) {
+					throw new Exception(
+							"开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getInner_seq() + "]已下发PDI/上料,不能再次操作!");
+				}
+			}
+		}
+	}
+
+	/**
+	 * 开平上料接口 下PDI
+	 * 修改时间--2018-06-12
+	 * 开平计划号数组、 计划内序号数组
+	 * @throws Exception
+	 * 其实都是单条操作
+	 */
+	public void MesCrCrossCuttingMAdd(List<MesCrCrossCuttingM> oci) throws Exception {
+		
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 1、循环根据(开平计划号数组,计划内序号数组) 读取 开平计划明细表【PLN_CuttoLength_PLAN_DETAIL】
+		for (MesCrCrossCuttingM mcsm : oci) {
+			PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+			// 开平计划号
+			plpd.setCl_plan_no(mcsm.getSchedule_no());
+			// 计划内序号
+			plpd.setCl_seq(mcsm.getInner_seq()==null ? 1 : mcsm.getInner_seq().intValue());
+			Date createtime= new Date();
+			// 如果不存在,则报错退出“开平计划[xxxxx][xx]信息不存在!”
+			List<PlnCuttolengthPlanDetail> lppd = this.getMapper(PlnCuttolengthPlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getInner_seq() + "]信息不存在!");
+			}
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 2、读取根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(lppd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 3、判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("开平计划[" + mcsm.getSchedule_no() + "][" +mcsm.getInner_seq() + "]尚未挂料!");
+			}
+			// 实际上只有一条
+			for (PlnCuttolengthPlanDetail ppdc : lppd) {
+				// 4、判断开平计划明细的状态【STATUS】
+				if (ppdc.getStatus().compareTo("5BCL02") > 0) {
+					throw new Exception(
+							"开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getInner_seq() + "]已上料,不能再次操作!");
+				}
+				// 修改开平计划明细表
+				PlnCuttolengthPlanDetail plpdu = new PlnCuttolengthPlanDetail();
+				plpdu.setStatus("5BCL03");
+				plpdu.setSerial_no(ppdc.getSerial_no());
+				this.getMapper(PlnCuttolengthPlanDetailMapper.class).update(plpdu);
+			}
+				PrcMaterielProcess pmp = new PrcMaterielProcess();
+				pmp.setPrc_code("5BCL03");// 新增的状态
+				
+				// 这里的格式要和字符串日期的格式匹配,不然会抛出转换异常
+				SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+				if (mcsm.getMemo() != null && !"".equals(mcsm.getMemo())) {
+					Date createdate = dateFormat.parse(mcsm.getMemo());
+					pmp.setCreate_time(createdate);
+				} else {
+					pmp.setCreate_time(new Date());
+				}
+				pmp.setObject_no(M1.getObject_no());
+				pmp.setCreate_man_name(userName);
+				pmp.setRemark("");
+				// 5、新增物料跟踪:
+				this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+				// a、修改开平计划主表
+				doUpdatePlnCuttolengthPlan(mcsm.getSchedule_no());
+			// b、根据母卷号,查询对应的所有板垛信息
+			PlnMaterielDetail pmdq = new PlnMaterielDetail();
+			pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq,
+					"  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+			if(Utils.isNotEmpty(lpmdc)) {
+				for (PlnMaterielDetail ppdc : lpmdc) {
+					// c、修改各板垛的 状态 STATUS= 0PCL03;
+					PlnMaterielDetail pmdu = new PlnMaterielDetail();
+					pmdu.setSerial_no(ppdc.getSerial_no());
+					pmdu.setStatus("0PCL03");
+					this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+	
+					// 增加板垛的 虚拟物料履历表
+					this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(), "0PCL03", userName,
+							new Date());
+				}
+			}
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			// d、修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PCL03");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+			// 写虚拟物料履历,状态填:母卷
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PCL03", userName,
+					new Date());
+		}
+	}
+
+	/**
+	 * 撤销开平上料接口 下PDI 验证
+	 * @param 虚拟物料号
+	 * @throws Exception
+	 * 其实都是单条操作
+	 */
+	public void MesCrCrossCuttingMCancelValid(List<MesCrCrossCuttingM> oci) throws Exception {
+		// 循环 根据(开平计划号数组,虚拟物料号数组) 读取 开平计划明细表【PLN_CuttoLength_PLAN_DETAIL】
+		for (MesCrCrossCuttingM mcsm : oci) {
+			PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+			plpd.setCl_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“开平计划[xxxxx][xx]信息不存在!”
+			List<PlnCuttolengthPlanDetail> lppd = this.getMapper(PlnCuttolengthPlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnCuttolengthPlanDetail ppdc : lppd) {
+				// 判断开平计划明细的状态【STATUS】
+				if (!"5BCL03".equals(ppdc.getStatus())) {
+					throw new Exception(
+							"开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]上料后,经过其他操作,不允许撤销!");
+				}
+			}
+		}
+	}
+
+	/**
+	 * 撤销开平上料接口 下PDI
+	 * @param 虚拟子堆垛号
+	 * @throws Exception
+	 * 其实都是单条操作
+	 */
+	public void MesCrCrossCuttingMCancel(List<MesCrCrossCuttingM> oci) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 循环 根据(开平计划号数组,虚拟物料号数组) 读取 开平计划明细表【PLN_CuttoLength_PLAN_DETAIL】
+		for (MesCrCrossCuttingM mcsm : oci) {
+			PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+			plpd.setCl_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“开平计划[xxxxx][xx]信息不存在!”
+			List<PlnCuttolengthPlanDetail> lppd = this.getMapper(PlnCuttolengthPlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnCuttolengthPlanDetail ppdc : lppd) {
+				// 判断开平计划明细的状态【STATUS】
+				if (!"5BCL03".equals(ppdc.getStatus())) {
+					throw new Exception(
+							"开平计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]上料后,经过其他操作,不允许撤销!");
+				}
+
+				PrcMaterielProcess pmp = new PrcMaterielProcess();
+				pmp.setObject_no(M1.getObject_no());
+				pmp.setPrc_code("5BCL03");
+				pmp.setRemark("回退上料");
+				pmp.setKeep_sametime_status(0);
+
+				ResultModel al = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+				// 撤销实物物料状态跟踪
+				if (!"0".equals(al.getState())) {
+					throw new Exception("物料状态不是已上料状态,不允许撤销!");
+				}
+
+				// 修改开平计划明细表
+				PlnCuttolengthPlanDetail plpdu = new PlnCuttolengthPlanDetail();
+				// "0PCL02"
+				plpdu.setStatus("5BCL02");// ((PrcMaterielProcess)al.getData()).getPrc_code());
+				plpdu.setSerial_no(ppdc.getSerial_no());
+				this.getMapper(PlnCuttolengthPlanDetailMapper.class).update(plpdu);
+			}
+
+			// 根据母卷号,查询对应的所有板剁信息
+			PlnMaterielDetail pmdq = new PlnMaterielDetail();
+			pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq,
+					"  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+			if(Utils.isNotEmpty(lpmdc)) {
+				for (PlnMaterielDetail ppdc : lpmdc) {
+					// 修改各板垛的 状态 STATUS= 0PCL02;
+					PlnMaterielDetail pmdu = new PlnMaterielDetail();
+					pmdu.setSerial_no(ppdc.getSerial_no());
+					pmdu.setStatus("0PCL02");
+					this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+					
+					// 增加板垛的 虚拟物料履历表
+					this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(), "0PCL02", userName,
+							new Date());
+				}
+			}
+
+			// 修改开平计划主表
+			doUpdatePlnCuttolengthPlan(mcsm.getSchedule_no());
+
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			// 修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PCL02");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+			// 写虚拟物料履历,状态填:母卷
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PCl02", userName,
+					new Date());
+		}
+	}
+	// --------------------------------开平上料、下PDI End----------------------------------------------------
+
+	// --------------------------------公共函数 Start----------------------------------------------------
+
+	/**
+	 * 公共函数1 修改横剪计划主表状态
+	 * @param 开平计划号
+	 * @throws Exception
+	 */
+	public void doUpdatePlnCuttolengthPlan(String clPlanNo) throws Exception {
+		PlnCuttolengthPlan plp = new PlnCuttolengthPlan();
+		plp.setCl_plan_no(clPlanNo);
+		String MIN_STATUS = "";
+		boolean flag = false;
+		PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+		plpd.setCl_plan_no(clPlanNo);
+		List<PlnCuttolengthPlanDetail> lplpd = this.getMapper(PlnCuttolengthPlanDetailMapper.class)
+				.findWithCondition(plpd, "status <> '0PCLXX'", "status asc", 0, 0);
+		if (lplpd == null || lplpd.size() == 0) {
+			throw new Exception("未找到开平计划明细数据!");
+		}
+		MIN_STATUS = lplpd.get(0).getStatus();
+
+		// 计划状态
+		// 0PCL01开平计划已编制
+		// 0PCL02开平计划已下发
+		// 0PCL03开始开平作业
+		// 0PCL09开平剪废
+		// 0PCL10开平作业完成
+		// 0PCLXX开平计划已失效
+
+		// 实物状态
+		// 5BCL01开平计划已编制
+		// 5BCL02开平计划已下发
+		// 5BCL03开始开平作业
+		// 5BCL09开平剪废
+		// 5BCL10开平作业完成
+		// 5BCL33等待开平判定
+		// 5BCL40开平判定完成
+		// 2018-06-11
+		// 如果明细记录中有卷开始作业,主表状态改为开始作业
+		for (PlnCuttolengthPlanDetail plnL : lplpd) {
+			if ("5BCL03".equals(plnL.getStatus())) {
+				flag = true;
+				break;
+			}
+		}
+		if (flag) {
+			plp.setStatus("0PCL03");
+		} else if ("5BCL01".equals(MIN_STATUS)) {
+			plp.setStatus("0PCL01");
+		} else if (MIN_STATUS.compareTo("5BCL02") <= 0) {
+			plp.setStatus("0PCL02");
+		} else if (MIN_STATUS.compareTo("5BCL03") <= 0) {
+			plp.setStatus("0PCL03");
+		} else if (MIN_STATUS.compareTo("5BCL10") <= 0) {
+			plp.setStatus("0PCL10");
+		}
+		this.getMapper(PlnCuttolengthPlanMapper.class).doUpdate(plp);
+	}
+
+	// --------------------------------开平完成 Start----------------------------------------------------
+	/**
+	 * 完成 实物 生成接口 产生实物,未挂上单时调用
+	 * 修改时间--2018-06-12
+	 * @param OBJECT_NO
+	 *            实物母卷号
+	 * @param SUB_OBJECT_NO
+	 *            实物子堆垛号
+	 * @param RELATION_TYPE
+	 *            关系类型 1:改号(原-现号码对应);2:轧制(板坯-钢板对应);3:剪切/切割(母-子对应)
+	 * @throws Exception
+	 */
+	public void CuttoLengthFinsh_PrcMatRelAdd(PrcMaterielRelation pmr) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createtime = new Date();
+		// 调用 新增实物物料状态跟踪: 传入(实物子堆垛号,5BCL10,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmr.getSub_object_no());
+		pmp.setPrc_code("5BCL10");// 新增的状态
+		pmp.setCreate_time(createtime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+
+		// 调用公共函数2 建立物料母子对应关系
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createtime);
+		pmr.setRemark("子垛生成,未挂上单");
+		pmr.setRelation_type(3);
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+	}
+
+	/**
+	 * 撤销开平 实物 撤销生成接口 产生实物,未挂上单时调用
+	 * @param OBJECT_NO
+	 *            实物母卷号
+	 * @param SUB_OBJECT_NO
+	 *            实物子堆垛号
+	 * @throws Exception
+	 */
+	public void CuttoLengthFinsh_PrcMatRelRemove(PrcMaterielRelation pmr) throws Exception {
+		// 回退子堆垛物料跟踪:
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmr.getSub_object_no());
+		pmp.setPrc_code("5BCL10");
+		pmp.setKeep_sametime_status(0);
+		pmp.setRemark("撤销开平实物生成");
+		ResultModel al = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		// 撤销实物物料状态跟踪
+		if (!"0".equals(al.getState())) {
+			throw new Exception("实物[" + pmp.getObject_no() + "]状态已发生改变,不能撤销!");
+		}
+
+		// 调用公共函数3 断开物料母子对应关系
+		PrcMaterielRelation pmrd = new PrcMaterielRelation();
+		pmrd.setObject_no(pmr.getObject_no());
+		pmrd.setSub_object_no(pmr.getSub_object_no());
+		this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmrd);
+	}
+
+	/**
+	 * 开平完成 虚拟子堆垛 挂料接口
+	 * 修改时间--2018-06-12
+	 * @param OBJECT_NO  实物母堆垛号
+	 * @param object_no_vt  虚拟子堆垛号
+	 * @param sub_object_no 实物子堆垛号
+	 * @throws Exception
+	 */
+	public void CuttoLengthFinsh_Relation(PlnMaterielDetail pmd) throws Exception {
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		// 新增物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(), pmd.getObject_no_vt(), processpoint.cross_cutting_code);
+		
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		// 1、调用物流接口,获取实物子堆垛信息。
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(pmd.getSub_object_no());
+		List<YdmProductDetail> lypd = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if (lypd == null || lypd.size() == 0) {
+			throw new Exception("库存中无[" + pmd.getSub_object_no() + "]实物堆垛!");
+		}
+		// 2、读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子堆垛信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+		// 3、判断实物堆垛和虚拟堆垛的 牌号、厚、宽、长 是否相等(考虑公差)
+		// 长和宽考虑公差 2018-06-13
+		// 开平成品长度允许公差(mm) (base_code)386201上-386202下,宽度允许公差386301-386302
+		// 定义变量wUpper=0,wLower=0,lUpper,lLower(数值型,实数),分别从基础信息表(COM_BASE_INFO)获取编号(BASE_CODE)=“386201”、“386102”的值(MEMO)并验证,
+		// 只有当记录存在,且值(MEMO)为有效数值时,对应进行赋值:其中dUpper对应381601、dLower对应386102;当381601的值无效时
+		// (无此记录或为空或不是有效数值),dUpper = 5(缺省值);,当381602的值无效时(无此记录或为空或不是有效数值),dLower= -5(缺省值);
+		double wUpper = 0, wLower = 0, lUpper = 0, lLower = 0;
+		ResultModel rmDb = this.getBean(PbModelDbServiceImpl.class).findMesProductWidthCmbDb();
+		if ("200".equals(rmDb.getState())) {
+			if (rmDb.getData() != null) {
+				// 宽上限
+				wUpper = 5;
+				wLower = -5;
+				// 长上限
+				lUpper = 5;
+				lLower = 5;
+				try {
+					@SuppressWarnings("unchecked")
+					List<PbModelDb> pmdb = (List<PbModelDb>) rmDb.getData();
+					for (PbModelDb model : pmdb) {
+						if ("386201".equals(model.getId())) {
+							wUpper = Double.parseDouble(model.getRegionkey());
+						} else if ("386202".equals(model.getId())) {
+							wLower = Double.parseDouble(model.getRegionkey());
+						} else if ("386301".equals(model.getId())) {
+							lUpper = Double.parseDouble(model.getRegionkey());
+						} else if ("386302".equals(model.getId())) {
+							lLower = Double.parseDouble(model.getRegionkey());
+						}
+					}
+				} catch (Exception e) {
+				}
+			}
+		}
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]堆垛!");
+		}
+
+		if (!lypd.get(0).getSteelcode().equals(lpmd.get(0).getSteel_code())) {
+//			throw new Exception("实物堆垛[" + pmd.getSub_object_no() + "]和虚拟堆垛[" + pmd.getObject_no_vt() + "]的牌号不匹配,不能绑定");
+		}
+//		if (lypd.get(0).getThick().doubleValue() != lpmd.get(0).getThick().doubleValue()) {
+//			throw new Exception("实物堆垛[" + pmd.getSub_object_no() + "]和虚拟堆垛[" + pmd.getObject_no_vt() + "]的厚不匹配,不能绑定");
+//		}
+		if ((lypd.get(0).getWidth().doubleValue() - lpmd.get(0).getWidth().doubleValue() > wUpper)
+				|| (lypd.get(0).getWidth().doubleValue() - lpmd.get(0).getWidth().doubleValue() < wLower)) {
+			throw new Exception("实物堆垛[" + pmd.getSub_object_no() + "]和虚拟堆垛[" + pmd.getObject_no_vt() + "]的宽不匹配,不能绑定");
+		}
+		if ((lypd.get(0).getLength().doubleValue() - lpmd.get(0).getLength().doubleValue()>lUpper) ||
+				(lypd.get(0).getLength().doubleValue() - lpmd.get(0).getLength().doubleValue()< lLower)){
+			throw new Exception("实物堆垛[" + pmd.getSub_object_no() + "]和虚拟堆垛[" + pmd.getObject_no_vt() + "]的长不匹配,不能绑定");
+		}
+		if (lpmd.get(0).getSub_object_no() != null && !"".equals(lpmd.get(0).getSub_object_no())) {
+			throw new Exception("实物堆垛[" + pmd.getSub_object_no() + "]已绑定其他计划, 不能再次绑定!");
+		}
+
+		// 5、修改数据
+		// a 修改虚拟物料表
+		pmdq.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdq.setObject_no(pmd.getSub_object_no());
+		pmdq.setStatus("0PCL10");
+		pmdq.setIs_finished("1");
+		// 横剪工序代码
+//		pmdq.setPrev_process_code(processpoint.cross_cutting_code); 
+		// TODO (根据加工计划判断,下一工序是12mm还是包装,填写对应的工序代码,没有则填空)
+		// pmdq.setNext_process_code("60001"); 暂时不填将来加工序再改
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdq);
+
+		// b 新增虚拟子物料履历
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PCL10", userName,createTime);
+		
+		// 4、调用 新增实物物料状态跟踪: 传入(实物子堆垛号,5BCL10,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getSub_object_no());
+		pmp.setPrc_code("5BCL10");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+				
+		// c ----------------------------2018-06-19 去掉判断虚拟子物料是否有其他子料的原料-------------------------------
+			// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(lpmd.get(0).getOrder_no());
+			pos.setCl(lpmd.get(0).getSingle_weight());
+			pos.setCl_cnt(1);
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdateClPlaned(pos);
+
+			// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+			PlnProdorderStatistic pps = new PlnProdorderStatistic();
+			pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+			pps.setCl(lpmd.get(0).getSingle_weight());
+			pps.setCl_cnt(1);
+			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+		// ----------------------------------------------------------------
+		// d 修改虚拟物料对应的 开平计划进程表
+		PlnMaterielDetail pmdmq = new PlnMaterielDetail();
+		pmdmq.setObject_no_vt(lpmd.get(0).getMat_object_no_vt());
+		List<PlnMaterielDetail> lpmdm = this.getMapper(PlnMaterielDetailMapper.class).find(pmdmq, 0, 1);
+		if (lpmdm != null && lpmdm.size() > 0) {
+			PlnClPlanStatistic plps = new PlnClPlanStatistic();
+			plps.setCl_plan_no(lpmdm.get(0).getCl_plan_no());
+			plps.setCl(lpmd.get(0).getSingle_weight());
+			plps.setCl_cnt(1);
+			this.getMapper(PlnClPlanStatisticMapper.class).doUpdatePlaned(plps);
+		}
+
+		// 6、调用公共函数2 建立物料母子对应关系
+		PrcMaterielRelation pmr = new PrcMaterielRelation();
+		pmr.setObject_no(pmd.getObject_no());
+		pmr.setSub_object_no(pmd.getSub_object_no());
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRemark("");
+		pmr.setRelation_type(3);
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+		
+	}
+	
+	/**
+	 * 开平完成 不符合计划
+	 * 实物生成, 新增虚拟子堆垛挂料
+	 * @param sub_object_no 实物子堆垛号
+	 * @param material_no 实物母卷号
+	 * @param create_time 操作时间
+	 * 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+	 * @throws Exception 
+	 * 2018-06-19
+	 */
+	public ResultModel CuttolengthFinsh_No_Plan(PlnMaterielDetail pmd) throws Exception {
+		ResultModel rm = new ResultModel("200", "");
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		Date createTime = new Date();
+		//调用物流接口,获取实物子堆垛信息。
+		YdmProductDetail ypd=new YdmProductDetail();
+		ypd.setCoilno(pmd.getSub_object_no());
+		List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if(lypd==null||lypd.size()==0){
+			throw new Exception("库存中无["+pmd.getObject_no()+"]实物堆垛!");
+		}
+		// 获取母卷虚拟物料信息
+		PlnMaterielDetail pmdcm=new PlnMaterielDetail();
+		pmdcm.setObject_no(pmd.getObject_no());
+		List<PlnMaterielDetail> pmdpp = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdcm, " nvl(invalid_flg,0) = 0 ", "", 0, 1);
+		if (pmdpp == null || pmdpp.size()==0) {
+			rm.setState("500");
+			rm.setMsgInfo("实物["+pmd.getObject_no()+"]的虚拟物料信息不存在!");
+			return rm;
+		}
+		// 获取生产订单信息
+		PlnProdorder pp=new PlnProdorder();
+		pp.setProd_order_no(pmdpp.get(0).getProd_order_no());
+		List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		if(lpp==null||lpp.size()==0){
+			rm.setState("500");
+			rm.setMsgInfo("生产订单["+pp.getProd_order_no()+"]不存在!");
+			return rm;
+		}
+		
+		// 获取下一个工序
+		String temp = this.getBean(MesApiDesignInfoImpl.class)
+				.getPath(lpp.get(0).getWhole_process_codes(), processpoint.cross_cutting_code, pmdpp.get(0).getProc_repeat_index());
+		String[] path =  temp.split("-");
+		ArrayList<String> validpath = this.getBean(MesApiDesignInfoImpl.class).getProcessPath(path);
+				
+				
+		// 新建虚拟物料表【PLN_MATERIEL_DETAIL】虚拟子堆垛信息
+		PlnMaterielDetail pmdc=new PlnMaterielDetail();
+		// 获取序列号
+		List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null, " serial_no desc ", 0, 1);
+		long PMDNo=lpmd==null?1:(lpmd.size()==0?1:(lpmd.get(0).getSerial_no()+1));
+		// 6位日期
+		String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+		// 6位流水号
+		int objectnoVtNo=this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate)+1;
+		pmdc.setSerial_no(PMDNo++);
+		// 年月日(6位)+6位流水
+		pmdc.setObject_no_vt(sDate+String.format("%06d", objectnoVtNo));
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setObject_no(pmd.getSub_object_no());
+		pmdc.setPline_code(lpp.get(0).getPline_code());
+		pmdc.setStatus("0PCL10");
+		pmdc.setIs_finished("1");
+		pmdc.setPrev_dsn_process_code(processpoint.cross_cutting_code);
+		pmdc.setPrev_process_code(processpoint.cross_cutting_code);
+		// 获取下个工序代码暂时方法,将来从质量取值
+//		String process_code = this.getBean(MesApiCrCrossCuttingMServiceImpl.class).getNext_process("2",
+//				pmd.getObject_no_vt());
+//		if (process_code != null && !"".equals(process_code)) {
+//			pmdc.setNext_process_code(process_code);
+//			pmdc.setNext_dsn_process_code(process_code);
+//		}
+		if (Utils.isNotEmpty(validpath)) {
+			pmdc.setNext_dsn_process_code(validpath.get(0));
+			pmdc.setNext_process_code(validpath.get(0));
+		}
+		pmdc.setIs_prev_dsn_finished("1");//母卷:0
+		pmdc.setCreate_design_no(pmdpp.get(0).getCl_design_no());
+		pmdc.setCreate_process_code(processpoint.cross_cutting_code);
+		pmdc.setIs_mat(0);//母卷:1
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pmdc.setCl_design_no(pmdpp.get(0).getCl_design_no());
+		pmdc.setCl_plan_no(pmdpp.get(0).getCl_plan_no());
+		pmdc.setPline_code(lpp.get(0).getPline_code());
+		pmdc.setMat_object_no_vt(pmdpp.get(0).getObject_no_vt());
+		pmdc.setIs_multi("0");
+		pmdc.setSteel_code(lpp.get(0).getSteel_code());
+		pmdc.setWidth(lypd.get(0).getWidth());
+		pmdc.setThick(lypd.get(0).getThick());
+		pmdc.setLength(lypd.get(0).getLength());
+		pmdc.setDiameter_inn(lypd.get(0).getDiameter_inn());
+		pmdc.setDiameter_out(lypd.get(0).getDiameter_out());
+		pmdc.setSingle_weight(lypd.get(0).getFactweight());
+		pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pmdc.setOrd_flg("2");
+		pmdc.setCreate_man_name(userName);
+		pmdc.setCreate_time(createTime);
+		pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+		
+		// 新增物料附加信息
+				this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(), pmdc.getObject_no_vt(), processpoint.cross_cutting_code);
+		// 子卷存在下一个工序
+		if (Utils.isNotEmpty(validpath)) {
+			// 调用设计信息接口
+			List<DesignInfo> infos = new ArrayList<>();
+			DesignInfo infor = new DesignInfo();
+			infor.setCurrentProcIndex(0);
+			infor.setObject_no(pmd.getSub_object_no());
+			infor.setObject_no_vt(pmdc.getObject_no_vt());
+			infor.setProcess(validpath);
+			infor.setProd_order_no(pmdpp.get(0).getProd_order_no());
+			infor.setSingle_wgt(lypd.get(0).getFactweight());
+			infos.add(infor);
+			ResultModel result = this.getBean(MesApiDesignInfoImpl.class)
+					.Design_Plan_Info(infos, null);
+			if (!"200".equals(result.getState())) {
+				throw new Exception("生产设计信息失败" + result.getMsgInfo());
+			}
+		}
+		
+		// 反写子卷实绩的虚拟物料号 2018-09-20
+		MesCrSlittingD mcd = new MesCrSlittingD();
+		mcd.setCoil_no(pmd.getSub_object_no());
+		mcd.setCoil_no_vt(pmdc.getObject_no_vt());
+		this.getMapper(MesCrSlittingDMapper.class).update(mcd);
+		
+		// 反写实物虚拟卷号 2018-11-08
+		ypd.setObject_no_vt(pmdc.getObject_no_vt());
+		this.getMapper(YdmProductDetailMapper.class).update(ypd);
+					
+		//调用 新增实物物料状态跟踪:  传入(实物子堆垛号,5BCl10,操作时间,操作人,"")
+		PrcMaterielProcess pmp=new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getSub_object_no());
+		pmp.setPrc_code("5BCL10");
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+		
+		// 新增虚拟子物料履历																			
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(pmdc.getObject_no_vt(),"0PCL10",userName,createTime);
+		
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpp.get(0).getOrder_no());
+		pos.setCl(pmdc.getSingle_weight());
+		pos.setCl_cnt(1);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(pmdc.getProd_order_no());
+		pps.setCl(pmdc.getSingle_weight());
+		pps.setCl_cnt(1);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+		
+		//修改虚拟物料对应的 开平计划进程表
+		PlnMaterielDetail pmdmq=new PlnMaterielDetail();
+		pmdmq.setObject_no_vt(pmdc.getMat_object_no_vt());
+		List<PlnMaterielDetail> lpmdm=this.getMapper(PlnMaterielDetailMapper.class).find(pmdmq, 0, 1);
+		PlnClPlanStatistic plps=new PlnClPlanStatistic();
+		plps.setCl_plan_no(lpmdm.get(0).getCl_plan_no());
+		plps.setCl(pmdc.getSingle_weight());
+		plps.setCl_cnt(1);
+		this.getMapper(PlnClPlanStatisticMapper.class).doUpdatePlaned(plps);
+		
+		//调用公共函数2  建立物料母子对应关系 
+		PrcMaterielRelation pmr=new PrcMaterielRelation();
+		pmr.setObject_no(pmd.getMaterial_no());
+		pmr.setSub_object_no(pmd.getSub_object_no());
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRemark("");
+		pmr.setRelation_type(3);
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+		return rm;
+	}
+
+	/**
+	 * 撤销开平 虚拟子堆垛 挂料接口
+	 * @param OBJECT_NO
+	 *            实物子堆垛号
+	 * @param object_no_vt
+	 *            虚拟子堆垛号
+	 * @throws Exception
+	 */
+	public void CuttoLengthFinsh_RelationCancel(PlnMaterielDetail pmd) throws Exception {
+		
+		if (pmd == null || pmd.getObject_no() ==null || "".equals(pmd.getObject_no())) {
+			throw new Exception( "请传入子堆垛物料信息(实物子堆垛)!");
+		}
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		Date createTime = new Date();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 调用物流接口,获取实物子堆垛信息。
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(pmd.getObject_no());
+		List<YdmProductDetail> lypd = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if (lypd == null || lypd.size() == 0) {
+			throw new Exception("库存中无[" + pmd.getObject_no() + "]实物堆垛!");
+		}
+
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子堆垛信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no(pmd.getObject_no());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, " nvl(invalid_flg,0) = 0 "," create_time desc",0, 1);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]堆垛!");
+		}
+		// 如果没有传入虚拟子卷号,从虚拟物料信息中查询
+		if (pmd.getObject_no_vt() == null || "".equals(pmd.getObject_no_vt())) {
+						pmd.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+					}
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子堆垛的母卷信息
+		List<PlnMaterielDetail> lpmdm = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+lpmd.get(0).getMat_object_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if (lpmdm == null || lpmdm.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]堆垛!");
+		}
+
+		if (lpmdm.get(0).getObject_no() == null || "".equals(lpmdm.get(0).getObject_no())) {
+			throw new Exception("实物堆垛[" + pmd.getObject_no() + "]尚未绑定该计划,不能回退!");
+		}
+		
+		// 物料充当脱单履历
+//		this.getBean(MesApiDesignInfoImpl.class).createMatLog(lpmd.get(0), "厂内合同取消交工",userName, lpmd.get(0).getPrev_process_code() , "-1", pmd.getObject_no());
+		
+		// 下一个工序做了计划就不能回退
+		if (Utils.isNotEmpty(pmd.getNext_dsn_process_code())) {
+		this.getBean(MesApiDesignInfoImpl.class).JudgeIsOrNotPlan(lpmd.get(0));
+		}
+
+		// 回退子堆垛物料跟踪:
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setPrc_code("5BCL10");
+		pmp.setKeep_sametime_status(0);
+		pmp.setRemark("撤销子堆垛挂料");
+		// 撤销实物物料状态跟踪
+		ResultModel al = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		if (!"0".equals(al.getState())) {
+			throw new Exception("开平完成后,实物[" + pmp.getObject_no() + "]状态已发生改变,不能撤销!");
+		}
+
+		// 修改虚拟物料表
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setObject_no_vt(pmd.getObject_no_vt());
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setStatus("0PCL03");
+		pmdu.setIs_finished("0");
+		pmdu.setPrev_process_code(processpoint.cross_cutting_code);
+		// TODO 将来再加判断"包装"or"12mm"
+		this.getMapper(PlnMaterielDetailMapper.class).doUpdateCancelRelation(pmdu);
+
+		// 新增虚拟子物料履历
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PCL03", userName,createTime);
+
+		// --------------------2018-06-19 去掉 判断虚拟子物料是否有其他子料的原料-------------
+			// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(lpmd.get(0).getOrder_no());
+			pos.setCl(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+			pos.setCl_cnt(-1);
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdateClPlaned(pos);
+
+			// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+			PlnProdorderStatistic pps = new PlnProdorderStatistic();
+			pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+			pps.setCl(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+			pps.setCl_cnt(-1);
+			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+		// ------------------------------------------------------------------------------
+
+		// 修改虚拟物料对应的 开平计划进程表
+		PlnClPlanStatistic plps = new PlnClPlanStatistic();
+		plps.setCl_plan_no(lpmdm.get(0).getCl_plan_no());
+		plps.setCl(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+		plps.setCl_cnt(-1);
+		this.getMapper(PlnClPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 调用公共函数3 断开物料母子对应关系
+		PrcMaterielRelation pmr = new PrcMaterielRelation();
+		pmr.setObject_no(lpmdm.get(0).getObject_no());
+		pmr.setSub_object_no(lpmd.get(0).getObject_no());
+		this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+		
+		// 厂内合同子卷生产完成时,清空库存信息订单信息
+//		boolean flag_Ct = this.getBean(MesApiDesignInfoImpl.class).getContractType(lpmd.get(0).getProd_order_no());
+//		boolean flag_Mf = this.getBean(MesApiDesignInfoImpl.class).matIsFinish(pmd.getObject_no());
+//		if (flag_Mf && flag_Ct) {
+//			YdmProductDetail ydm = new YdmProductDetail();
+//			ydm.setCoilno(pmd.getObject_no());
+//			ydm.setProdorderno(lpmd.get(0).getProd_order_no());
+//			ydm.setOrderno(lpmd.get(0).getOrder_no());
+//			ydm.setObject_no_vt(pmd.getObject_no_vt());
+//			this.getMapper(YdmProductDetailMapper.class).update(ydm);
+//		}
+		// 删除物料附加信息
+		this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmd.getObject_no());
+				
+		// 判断虚拟子堆垛信息,是否是额外的成品(ORD_FLG = 2), 如果是,则需释放虚拟子堆垛,调用接口:横剪——虚拟子堆垛 释放接口
+		if ("2".equals(lpmd.get(0).getOrd_flg())) {
+			CuttoLengthFinsh_Release(pmd);
+		}
+	}
+
+	/**
+	 * 开平完成 虚拟子堆垛 释放接口
+	 * @param object_no_vt 虚拟子堆垛号
+	 * @throws Exception
+	 * 2018-06-12
+	 */
+	public void CuttoLengthFinsh_Release(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子堆垛信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]堆垛!");
+		}
+
+		// 判断虚拟子堆垛是否是开平的虚拟成品
+		if (!processpoint.cross_cutting_code.equals(lpmd.get(0).getPrev_dsn_process_code())) {
+			throw new Exception("虚拟子堆垛不是开平设计成品,无法释放!");
+		}
+
+		// ------------------------2018-06-19-------------------------
+		// 判断虚拟子板信息,是否是额外的成品(ORD_FLG = 2), 如果不成立, 则报错退出,“虚拟物料[xxx]不是额外成品,不能释放!”
+		if (!"2".equals(lpmd.get(0).getOrd_flg())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]不是额外成品,不能释放!");
+		}
+		
+		PlnMaterielDetail pmdqd=new PlnMaterielDetail();
+		pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> child = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+//		int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+		if (Utils.isNotEmpty(child)) {
+			// 删除子卷
+			this.getBean(MesApiDesignInfoImpl.class).deleteChildTrue(child);
+//			throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+		}
+		// ------------------------------------------------------------
+
+		// 判断虚拟子堆垛是否是其他物料母卷: IF(NEXT_DSN_PROCESS_CODE == NULL)
+		if (lpmd.get(0).getNext_dsn_process_code() == null || "".equals(lpmd.get(0).getNext_dsn_process_code())) {
+			// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录,状态标记为“0PCLXX”
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PCLXX", userName,createTime);
+			// 将虚拟物料信息 从虚拟物料表【PLN_MATERIEL_DETAIL】移动到 无效虚拟物料表【PLN_MATERIEL_INVALID】.
+			// (两个表结构一样,移动后,保持serial_no不变,删除原表记录)
+			List<PlnMaterielInvalid> pmin = this.getMapper(PlnMaterielInvalidMapper.class).findWithCondition(null, " serial_no = '"+lpmd.get(0).getSerial_no()+"' or object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"'", "", 0, 0);
+			if (pmin !=null && pmin.size()>0) {
+				this.getMapper(PlnMaterielInvalidMapper.class).delete(lpmd.get(0).getSerial_no());
+			}
+			PlnMaterielInvalid pmi = new PlnMaterielInvalid();
+			BeanUtils.copyProperties(lpmd.get(0), pmi);
+			this.getMapper(PlnMaterielInvalidMapper.class).insert(pmi);
+			this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(lpmd.get(0));
+		}
+	}
+
+	/**
+	 * 开平完成 虚拟母卷统计
+	 * @param object_no_vt
+	 *            虚拟母卷号
+	 * @param object_no
+	 *            实物母卷号
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public void CuttoLengthFinsh_Sum(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		String plan_no = "";
+		String object_no = "";
+		
+		// 工序点信息
+				List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+						"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+				ProcessPoint processpoint = new ProcessPoint(infoi);
+				
+				// 修改物料附加信息
+				this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.cross_cutting_code,true);
+				
+		// 1、读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "nvl(invalid_flg , 0) <> 1", null, 0, 1);
+		plan_no = lpmd.get(0).getCl_plan_no();
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]堆垛!");
+		}
+		if (lpmd.get(0).getObject_no() == null || "".equals(lpmd.get(0).getObject_no())) {
+			throw new Exception("计划母卷[" + pmd.getObject_no() + "]未上料, 不能开平!");
+		}
+		// 2、新增母卷物料跟踪:调用 新增实物物料状态跟踪
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setPrc_code("5BCL10");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+		///3、判断虚拟母卷对应的虚拟子堆垛是否 挂料完成
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdc, "nvl(invalid_flg , 0) <> 1", null, 0, 0);
+		int isum = 0;
+		if (lpmdc != null && lpmdc.size() > 0) {
+			for (PlnMaterielDetail pmdcc : lpmdc) {
+				// a 2018-06-13 无论是否挂单,横剪都已经完成
+				PlnMaterielDetail pmdcu = new PlnMaterielDetail();
+				pmdcu.setSerial_no(pmdcc.getSerial_no());
+				pmdcu.setIs_finished("1");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdcu);
+				// b 统计 (OBJECT_NO=NULL的子堆垛数量)、虚拟子堆垛总数量
+				if (pmdcc.getObject_no() == null || "".equals(pmdcc.getObject_no())) {
+					isum += 1;
+				}
+			}
+			// 4、如果(OBJECT_NO为NULL的数量==子堆垛总数
+			if (isum == lpmdc.size()) {
+				// 读取物料关系表【PRC_MATERIEL_RELATION】(where OBJECT_NO=实物母卷号 AND RELATION_TYPE=3)的记录
+				PrcMaterielRelation pmr = new PrcMaterielRelation();
+				pmr.setObject_no(lpmd.get(0).getObject_no());
+				pmr.setRelation_type(3);
+				List<PrcMaterielRelation> lpmr = this.getMapper(PrcMaterielRelationMapper.class).find(pmr, 0, 0);
+				if (lpmr == null || lpmr.size() == 0) {
+					// 如果 关系表记录为空(说明实物卷未切割,计划未执行),直接报错退出“母卷xxxx尚未进行切割操作!”;
+					throw new Exception("母卷[" + pmr.getObject_no() + "]尚未进行切割操作!");
+				} else {
+					// 脱掉 虚拟母卷和实物卷的关系
+					// 修改虚拟物料表的母卷记录:IS_NEXT_FINISHED=0;OBJECT_NO=NULL; NEED_EXTOPT=1;CL_PLAN_NO=NULL
+					PlnMaterielDetail pmdu = new PlnMaterielDetail();
+					pmdu.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+					pmdu.setNeed_extopt("1");
+					pmdu.setIs_next_finished("0");
+					this.getMapper(PlnMaterielDetailMapper.class).doUpdateCuttoLengthFinshSum(pmdu);
+				}
+			}else {
+				// 2018-10-16 挂单的时候一起修改了
+//				this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), true);
+			}
+		}
+		// 5、修改虚拟物料表OPT_TIMES+=1; STATUS= 0PCL10;Is_next_finished("1") (同步修改S1的[OPT_TIMES]、[STATUS]
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setOpt_times((lpmd.get(0).getOpt_times() == null ? 0 : lpmd.get(0).getOpt_times()) + 1);
+		pmdu.setStatus("0PCL10");
+		pmdu.setIs_next_finished("1");//下一个工序是否完成 2016-06-13
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+		// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+		// 2018-06-12 这个虚拟物料号对应的虚拟物料记录实物号和开平计划号可能为空,所以不调用公共函数.
+		PlnMaterielDetail pmdcq = new PlnMaterielDetail();
+		pmdcq.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdq = this.getMapper(PlnMaterielDetailMapper.class).find(pmdcq, 0, 0);
+		// 6、写虚拟物料履历,状态填: 0PCL10 
+		PrcMaterielVtProcess pmvpc = new PrcMaterielVtProcess();
+		
+		// 20191001
+		long serial_no = 0l;
+		List<PrcMaterielVtProcess> pmpQ = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(null, "", "serial_no desc", 0, 1);
+		if (Utils.isNotEmpty(pmpQ)) {
+			serial_no = pmpQ.get(0).getSerial_no()+1;
+		}
+		pmvpc.setSerial_no(serial_no);
+		// end
+		
+		pmvpc.setObject_no_vt(lpmdq.get(0).getObject_no_vt());
+		pmvpc.setObject_no(object_no);
+		pmvpc.setObject_type(lpmdq.get(0).getObject_type());
+		pmvpc.setPline_code(lpmdq.get(0).getPline_code());
+		pmvpc.setStatus("0PCL10");
+		pmvpc.setOrder_no(lpmdq.get(0).getOrder_no());
+		pmvpc.setProd_order_no(lpmdq.get(0).getProd_order_no());
+		pmvpc.setCl_design_no(lpmdq.get(0).getCl_design_no());
+		pmvpc.setCl_design_no(lpmdq.get(0).getCl_design_no());
+		pmvpc.setRl_design_no(lpmdq.get(0).getRl_design_no());
+		pmvpc.setCl_plan_no(plan_no);
+		pmvpc.setCl_plan_no(lpmdq.get(0).getCl_plan_no());
+		pmvpc.setRl_plan_no(lpmdq.get(0).getRl_plan_no());
+		pmvpc.setBatch_no(lpmdq.get(0).getBatch_no());
+		pmvpc.setCreate_man_name(userName);
+		pmvpc.setCreate_time(createTime);
+		this.getMapper(PrcMaterielVtProcessMapper.class).doAdd(pmvpc);
+		// ----------------------------------------------------------------------
+
+		// 7、修改虚拟物料对应的 开平计划进程表
+		PlnClPlanStatistic plps = new PlnClPlanStatistic();
+		plps.setMat_cl(lpmd.get(0).getSingle_weight());// mcsd.getCoil_act_wgt());
+		plps.setMat_cl_cnt(1);
+		plps.setCl_plan_no(plan_no);
+		this.getMapper(PlnClPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 8、开平计划明细表【PLN_CuttoLength_PLAN_DETAIL】:STATUS= 5BCL10
+		PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+		plpd.setCl_plan_no(plan_no);
+		plpd.setStatus("5BCL10");
+		plpd.setObject_no_vt(pmd.getObject_no_vt());
+		this.getMapper(PlnCuttolengthPlanDetailMapper.class).doUpdateWSum(plpd);
+
+		// 9、开平计划主表【PLN_CuttoLength_PLAN】:调用公共函数1(开平计划号);
+		doUpdatePlnCuttolengthPlan(plan_no);
+		
+//		this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), true);
+		
+		// 将未挂单的子卷 置为无效
+//		List<PlnMaterielDetail> child = this.getMapper(
+//				PlnMaterielDetailMapper.class).findWithCondition(
+//				null,
+//				"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//						+ "' and nvl(invalid_flg,0) =0 and object_no is null",
+//				"", 0, 0);
+//		if (Utils.isNotEmpty(child)) {
+//			this.getBean(MesApiDesignInfoImpl.class).deleteChild(child);
+//		}
+	}
+
+	/**
+	 * 撤销开平 撤销虚拟母卷统计
+	 * @param object_no_vt
+	 *            虚拟母卷号
+	 * @param object_no
+	 *            实物母卷号
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public void CuttoLengthFinsh_SumCancel(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		
+		// 修改物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.cross_cutting_code,false);
+		
+		// 将无效的虚拟物料子卷恢复
+//		List<PlnMaterielDetail> child = this.getMapper(
+//				PlnMaterielDetailMapper.class).findWithCondition(
+//				null,
+//				"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//						+ "' and invalid_flg = '1'", "", 0, 0);
+//		if (Utils.isNotEmpty(child)) {
+//			this.getBean(MesApiDesignInfoImpl.class).recoveryChild(child);
+//		}
+				
+		// 读取虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】,获取虚拟母卷最后一条
+		PrcMaterielVtProcess pmvp = new PrcMaterielVtProcess();
+		pmvp.setStatus("0PCL10");
+		pmvp.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PrcMaterielVtProcess> lpmvp = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(pmvp, ""," create_time desc ", 0, 1);
+
+		// 循环 (MAT_OBJECT_NO_VT=虚拟母卷号) 的所有虚拟子堆垛记录
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).find(pmdc, 0, 0);
+		for (PlnMaterielDetail pmdcc : lpmdc) {
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			pmdu.setSerial_no(pmdcc.getSerial_no());
+			pmdu.setIs_finished("0");
+			// 修改虚拟物料表【PLN_MATERIEL_DETAIL】:IS_FINISHED=0;
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+		}
+
+		// 修改虚拟物料表_母卷信息
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setNeed_extopt("0");
+		pmdu.setCl_plan_no(lpmvp.get(0).getCl_plan_no());
+		pmdu.setIs_next_finished("0");
+		pmdu.setStatus_desc("0PCL03");
+
+		if (lpmd.get(0).getObject_no() == null || "".equals(lpmd.get(0).getObject_no())) {
+			pmdu.setObject_no(lpmvp.get(0).getObject_no());
+		}
+		if (lpmd.get(0).getOpt_times() != null) {
+			pmdu.setOpt_times(lpmd.get(0).getOpt_times() - 1);
+		}
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+		// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PCL03", userName,createTime);
+
+		// 修改虚拟物料对应的 开平计划进程表
+		PlnClPlanStatistic plps = new PlnClPlanStatistic();
+		plps.setMat_cl(-lpmd.get(0).getSingle_weight());
+		plps.setMat_cl_cnt(-1);
+		plps.setCl_plan_no(lpmd.get(0).getCl_plan_no());
+		this.getMapper(PlnClPlanStatisticMapper.class).doUpdatePlaned(plps);
+		
+		// 回退实物母卷的物料跟踪
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(lpmd.get(0).getObject_no());
+		pmp.setPrc_code("5BCL10");
+		pmp.setRemark("撤销母卷开平");
+		pmp.setKeep_sametime_status(0);
+		ResultModel rm = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		if (!"0".equals(rm.getState())) {
+			throw new Exception("开平完成后,母卷状态已发生改变,不能撤销!");
+		}
+		
+		// 开平计划明细表【PLN_CuttoLength_PLAN_DETAIL】:STATUS= 5BCL03
+		PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+		plpd.setCl_plan_no(lpmd.get(0).getCl_plan_no());
+		plpd.setStatus("5BCL03");
+		plpd.setObject_no_vt(pmd.getObject_no_vt());
+		this.getMapper(PlnCuttolengthPlanDetailMapper.class).doUpdateWSum(plpd);
+		
+		// 开平计划主表【PLN_CuttoLength_PLAN】:调用公共函数1(开平计划号);
+		doUpdatePlnCuttolengthPlan(lpmd.get(0).getCl_plan_no());
+		
+		// TODO 将来加上12mm 循环所有 object_no <> null 的虚拟子堆垛,累加统计: 子堆垛个数 T_NUM 和 重量 T_WGT
+	}
+
+	// --------------------------------开平完成 End----------------------------------------------------
+	
+	/**
+	 * 传入虚拟物料当前工序,获取上一个工序
+	 * 暂时从加工计划取,将来从质量取。
+	 * @param str 1:横切;2:纵切;3:纵切并横切
+	 * @param object_no_vt 虚拟物料号
+	 * @return 工序代码
+	 * 2018-06-13
+	 */
+	public  String getPrev_process(String str,String object_no_vt){
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		// 加工计划表获取工序字符串
+		String process = this.getMapper(PlnMaterielDetailMapper.class).findProcess(object_no_vt);
+		String process_code = "";
+		if (str==null || "".equals(str)) {
+			if ("1".equals(process) || "3".equals(process)) {
+				// 横剪代码
+				process_code=processpoint.cross_cutting_code;
+			}else if ("2".equals(process) ) {
+				// 纵剪代码
+				process_code=processpoint.slitting_code;
+			}
+		}else if ("1".equals(str) && "3".equals(process)) {
+			process_code=processpoint.slitting_code;
+		}
+		return process_code;
+	}
+	
+	/**
+	 * 传入虚拟物料当前工序,获取下一个工序
+	 * 暂时从加工计划取,将来从质量取。
+	 * @param str 1:横切;2:纵切;3:纵切并横切
+	 * @param object_no_vt 虚拟物料号
+	 * @return 工序代码
+	 * 2018-06-13
+	 */
+	public String getNext_process(String str,String object_no_vt){
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		// 从加工计划表获取工序字符串
+		String process = this.getMapper(PlnMaterielDetailMapper.class).findProcess(object_no_vt);
+		String process_code = "";
+		if (str == null || "".equals(str)) {
+			if ("1".equals(process)) {
+				// 横剪代码
+				process_code = processpoint.cross_cutting_code;
+			} else if ("2".equals(process) || "3".equals(process)) {
+				// 纵剪代码
+				process_code = processpoint.slitting_code;
+			}
+		} else if ("2".equals(str) && "3".equals(process)) {
+			process_code = processpoint.cross_cutting_code;
+		}
+		return process_code;
+	}
+	
+	// -------------------------------------------------------横剪挂单 2018-07-08-----------------------------------------------------
+	
+	/**
+	 * 函数_建立虚拟物料信息
+	 * @param prod_order_no 生产订单号
+	 * @param ydm 库存信息
+	 * @return 横剪设计号
+	 * 2018-06-21 p b
+	 * @throws Exception 
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String BuildingVirtualMaterialInfo(String prod_order_no,YdmProductDetail ypd) throws Exception{
+		Date createTime = new Date();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		String cl_plan_no = "";
+		//建立虚拟物料表信息
+		String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+		List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null, " serial_no desc ", 0, 1);
+		long PMDNo=lpmd==null?1:(lpmd.size()==0?1:(lpmd.get(0).getSerial_no()+1));
+		int objectnoVtNo=this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate)+1;
+		//根据累加值,建立坯料设计订单组成表
+		long pdoiNo=1;
+		List<PlnDsnOrderInfo> lpdoiq=this.getMapper(PlnDsnOrderInfoMapper.class).findWithCondition(null, "", " serial_no desc", 0, 1);
+		if(lpdoiq!=null&&lpdoiq.size()>0){
+			pdoiNo=lpdoiq.get(0).getSerial_no()+1;
+		}		
+		// 虚拟母卷号
+		String mat_object_no_vt = sDate+String.format("%06d", objectnoVtNo++);
+		// 获取生产订单信息
+		PlnProdorder pp=new PlnProdorder();
+		pp.setProd_order_no(prod_order_no);
+		List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		
+		// 1、1 判断实物是否已经关联到某虚拟物料上
+		List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "NVL(INVALID_FLG,0)=0 AND OBJECT_NO = '"+ypd.getCoilno()+"'", "", 0, 1);
+		// a、如果数据不存在 则建立母卷信息
+		PlnMaterielDetail pmdM=new PlnMaterielDetail();
+		if (pmd == null || pmd.size()==0) {
+			//母卷虚拟物料数据
+			pmdM.setSerial_no(PMDNo++);
+			pmdM.setObject_no_vt(mat_object_no_vt);
+			pmdM.setObject_no(ypd.getCoilno());
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setPline_code(lpp.get(0).getPline_code());
+			pmdM.setStatus("0PDB10");
+			pmdM.setIs_finished("1");//母卷,上一工序是否完成
+			// 通过生产订单表关联加工计划表获取当前工序的上一个工序
+			PlnProcessPlan ppp = new PlnProcessPlan();
+			ppp.setProduce_no(lpp.get(0).getProduce_no());
+			ppp.setValid_flag("1");
+			List<PlnProcessPlan> process = this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, "cut_order_no = 1", "", 0, 1);
+			if (process != null && "3".equals(process.get(0).getCut_style())) {
+				pmdM.setPrev_dsn_process_code(processpoint.slitting_code);
+				pmdM.setPrev_process_code(processpoint.slitting_code);
+				pmdM.setIs_prev_dsn_finished("1");
+			}else {
+				pmdM.setPrev_dsn_process_code(null);
+				pmdM.setPrev_process_code(null);
+				pmdM.setIs_prev_dsn_finished("0");
+			}
+			pmdM.setNext_dsn_process_code(processpoint.cross_cutting_code);
+			pmdM.setNext_process_code(processpoint.cross_cutting_code);
+//			pmdM.setCreate_design_no(pld.getCl_design_no());
+//			pmdM.setCl_design_no(pld.getCl_design_no());
+			pmdM.setCreate_process_code(processpoint.cross_cutting_code);
+			pmdM.setIs_mat(1);
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setIs_multi("0");
+			pmdM.setSteel_code(lpp.get(0).getSteel_code());
+			//母卷厚度、宽度使用实际值
+			pmdM.setWidth(ypd.getWidth());
+			pmdM.setThick(ypd.getThick());
+			pmdM.setLength(ypd.getLength());
+			pmdM.setDiameter_inn(ypd.getDiameter_inn());
+			pmdM.setDiameter_out(ypd.getDiameter_out());
+			pmdM.setSingle_weight(ypd.getFactweight());
+			pmdM.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdM.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdM.setOrd_flg("1");
+			pmdM.setCreate_man_name(userName);
+			pmdM.setCreate_time(createTime);
+			pmdM.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdM.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdM);
+		}else {
+			// b、否则,修改虚拟母卷信息
+			
+		}
+		// 1、2根据横剪设计号,查找 横剪拼料信息表[PLN_CUTTOLENGTH_DSN_MULTINFO],循环读取每一堆垛序号【SUB_SEQ】
+		List<PlnCuttolengthDsnMultinfo> pldm = this.getMapper(PlnCuttolengthDsnMultinfoMapper.class).findWithCondition(null, "CL_PLAN_NO = ", "", 0, 1);
+		double v_total_wgt=0;
+		int v_total_num=0;
+		if (pldm != null && pldm.size()>0) {
+			for (PlnCuttolengthDsnMultinfo pldmc : pldm) {
+				// a、 建立虚拟子堆垛信息
+				PlnMaterielDetail pmdc=new PlnMaterielDetail();
+				pmdc.setSerial_no(PMDNo++);
+				pmdc.setObject_no_vt(sDate+String.format("%06d", objectnoVtNo++));
+				pmdc.setOrder_no(lpp.get(0).getOrder_no());
+				pmdc.setPline_code(lpp.get(0).getPline_code());
+				pmdc.setStatus("0PDB10");
+				pmdc.setIs_finished("0");
+				pmdc.setPrev_dsn_process_code(processpoint.cross_cutting_code);
+				pmdc.setPrev_process_code(processpoint.cross_cutting_code);
+				pmdc.setIs_prev_dsn_finished("1");
+//				pmdc.setCreate_design_no(pld.getCl_design_no());
+				pmdc.setCreate_process_code(processpoint.cross_cutting_code);
+				pmdc.setIs_mat(0);
+				pmdc.setOrder_no(lpp.get(0).getOrder_no());
+				pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+//				pmdc.setCl_design_no(pld.getCl_design_no());
+				pmdc.setMat_object_no_vt(mat_object_no_vt);
+				pmdc.setIs_multi("0");
+				pmdc.setSteel_code(lpp.get(0).getSteel_code());
+				pmdc.setWidth(pldmc.getWidth());
+				pmdc.setThick(pldmc.getThick());
+				pmdc.setLength(pldmc.getLength());
+				
+				pmdc.setSingle_weight(pldmc.getWeight());
+				pmdc.setSub_count((pldmc.getSub_count()));
+				pmdc.setSub_weight(pldmc.getSub_weight());
+				
+				
+				pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+				pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+				pmdc.setOrd_flg("1");
+				pmdc.setCreate_man_name(userName);
+				pmdc.setCreate_time(createTime);
+				pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+				pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+				this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+				
+				// b、 累加 虚拟子堆垛重量, 虚拟子堆垛个数 ---> v_total_wgt, v_total_num
+				v_total_wgt+=pmdc.getSingle_weight().doubleValue();
+				v_total_num+=1;
+			}
+			
+			// 2、根据累加值,建立坯料设计订单组成表【PLN_DSN_ORDER_INFO】信息																			
+			PlnDsnOrderInfo pdoi=new PlnDsnOrderInfo();
+			pdoi.setSerial_no(pdoiNo++);
+//			pdoi.setDesign_no(pld.getCl_design_no());
+			pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+			pdoi.setOrder_no(lpp.get(0).getOrder_no());
+			pdoi.setWeight_in_one(v_total_wgt);
+			pdoi.setQuantity_in_one(v_total_num);
+			this.getMapper(PlnDsnOrderInfoMapper.class).insert(pdoi);
+		}
+		return null;
+	}
+	
+	
+
+	
+	/**
+	 * 函数_通过加工计划产生设计
+	 * @param pro_order_no 生产订单号
+	 * @param design_quantity 设计原料卷总数
+	 * @param ypd 物料信息
+	 * @throws Exception 
+	 * */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public PlnCuttolengthDsnMain ProcessingPlanDsn(String pro_order_no,Integer design_quantity,YdmProductDetail ypd,String pd) throws Exception{
+		PlnCuttolengthDsnMain sCl_design_no=null;
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		PlnProdorder pp=new PlnProdorder();
+		pp.setProd_order_no(pro_order_no);
+		List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).findWithCondition(pp, "", " create_time desc ", 0, 1);
+		
+		// 读取基础配置 产线机组限制表
+		ComDsnPltlmt cdp=new ComDsnPltlmt();
+		cdp.setPlt("Y1");//工厂
+		cdp.setPlt_line("Y1");//产线
+		List<ComDsnPltlmt> lc=this.getMapper(ComDsnPltlmtMapper.class).find(cdp, 0, 0);
+		if(lc==null||lc.size()==0){
+			throw new Exception("未找到产线");
+		}
+		// 获取所有的限制条件
+		ClRestrict MachineRestrict=new ClRestrict(lc);
+		
+		//根据加工计划号  读取生产订单对应的生产加工表[PLN_PROCESS_PLAN]
+		PlnProcessPlan ppp=new PlnProcessPlan();
+		ppp.setProduce_no(lpp.get(0).getProduce_no());
+		ppp.setValid_flag("1");
+		List<PlnProcessPlan> lppp=this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, null, " cut_order_no ", 0, 0);
+		if(lppp==null||lppp.size()==0){
+			throw new Exception("未找到生产订单["+ppp.getOrder_no()+"]对应的生产加工信息");
+		}
+		
+//		ResultModel rm=this.getBean(PbModelDbServiceImpl.class).findPlnThickRangeCmbDb();
+//		if(!"200".equals(rm.getState())){
+//			throw new Exception("获取厚度公差范围失败!");
+//		}
+//		List<PbModelDb> lpmd=(List<PbModelDb>) rm.getData();
+//		if(lpmd==null||lpmd.size()==0){
+//			throw new Exception("请先配置厚度公差范围!");
+//		}
+		
+//		if(!"1".equals(pd)){
+//			//--------------获取配置的值比较公差范围------------------
+//			for(PbModelDb pmd:lpmd){
+//				if(pmd.getId().equals("200101")){//范围
+//					if(ypd.getThick().doubleValue()-MachineRestrict.lim_max_height>(Double.parseDouble(pmd.getRegionkey()))){
+//						throw new Exception("母卷["+ypd.getCoilno()+"]的厚度超出最大公差设备限制范围内,不能挂单!");
+//					}
+//				}
+//				
+//				if(pmd.getId().equals("200102")){
+//					if(ypd.getThick().doubleValue()-MachineRestrict.lim_min_height<(Double.parseDouble(pmd.getRegionkey()))){
+//						throw new Exception("母卷["+ypd.getCoilno()+"]的厚度小于最小公差设备限制范围内,不能挂单!");
+//					}
+//				}
+//			}
+//			//--------------------------------
+//			
+//			if(ypd.getWidth().doubleValue()>MachineRestrict.lim_max_wdt
+//					||ypd.getWidth().doubleValue()<MachineRestrict.lim_min_wdt){
+//				throw new Exception("母卷["+ypd.getCoilno()+"]的宽度不在设备限制范围内,不能挂单!");
+//			}
+//			if(ypd.getFactweight().doubleValue()>MachineRestrict.lim_max_wgt){
+//				throw new Exception("母卷["+ypd.getCoilno()+"]的重量不在设备限制范围内,不能挂单!");
+//			}
+//			//对于母卷S1的 其他规格信息(内径、外径), 如果无值,则继续;  如果有值,则判断是否在设备原料的限制范围内
+//			if(ypd.getDiameter_inn()!=null&&ypd.getDiameter_inn().intValue()!=0){
+//				if(ypd.getDiameter_inn().doubleValue()>MachineRestrict.lim_max_inner
+//						||ypd.getDiameter_inn().doubleValue()<MachineRestrict.lim_min_inner){
+//					throw new Exception("母卷["+ypd.getCoilno()+"]的内径不在设备限制范围内,不能挂单!");
+//				}
+//			}
+//			if(ypd.getDiameter_out()!=null&&ypd.getDiameter_out().intValue()!=0){
+//				if(ypd.getDiameter_out().doubleValue()>MachineRestrict.lim_max_outter
+//						||ypd.getDiameter_out().doubleValue()<MachineRestrict.lim_min_outter){
+//					throw new Exception("母卷["+ypd.getCoilno()+"]的外径不在设备限制范围内,不能挂单!");
+//				}
+//			}
+//		}
+		
+		
+		double sWidth=0,
+				// 每个规格下总堆垛数
+				allboxCount = 0,
+				// 重量判断
+				weightvalid = 0,
+				// 重量上限
+				weightupper = 0,
+				// 临时-重量
+				weighttemp=0,
+				// 单堆垛重量
+				V_singleWeight = 0,	
+				// 单堆垛块数
+				 boxCount ,
+				// 该规格最后一堆,块数
+		        V_lastbox_Count =0;
+		// 总堆垛数/子板总数
+		int iCutCount=0,allsubcount=0;
+		// 加工计划号:单堆垛块数
+		Map<String, Double> boxCounts = new HashMap<String, Double>();
+		// 加工计划号:子堆垛数
+		Map<String, Double> ZddCount = new HashMap<String, Double>();
+		// 加工计划号:最后一堆.堆垛块数
+		Map<String, Double> Last_Count = new HashMap<String, Double>();
+		String  cut_style = "";
+		for(PlnProcessPlan pppc:lppp){
+			//对于子卷S1的 厚、宽、重量信息,判断其是否在设备原料的限制范围内
+			if(!"1".equals(pd)){
+				// 重量判断
+				weightvalid += pppc.getEstimate_weight();
+				//-------------------获取配置的值比较公差范围--------------------
+//				for(PbModelDb pmd:lpmd){
+//					if(pmd.getId().equals("200101")){//范围
+//						if(pppc.getMat_thick()-MachineRestrict.lim_max_sub_thick>(Double.parseDouble(pmd.getRegionkey()))){
+//							throw new Exception("加工计划["+pppc.getProduce_no()+"]的子板厚度超出最大公差设备限制范围内,不能挂单!");
+//						}
+//					}
+//					
+//					if(pmd.getId().equals("200102")){
+//						if(pppc.getMat_thick()-MachineRestrict.lim_min_sub_thick<(Double.parseDouble(pmd.getRegionkey()))){
+//							throw new Exception("加工计划["+pppc.getProduce_no()+"]的子板厚度小于最小公差设备限制范围内,不能挂单!");
+//						}
+//					}
+//				}
+				//--------------------------------------------------------------
+				
+//				if (pppc.getWidth() !=null) {
+//					if(pppc.getWidth()>MachineRestrict.lim_max_sub_wdt
+//							||pppc.getWidth()<MachineRestrict.lim_min_sub_wdt){
+//						throw new Exception("加工计划["+pppc.getProduce_no()+"]的子板的宽度不在设备限制范围内,不能挂单!");
+//					}
+//				}
+//				//对于子板S1的 其他规格信息(长), 如果无值,则继续;  如果有值,则判断是否在设备原料的限制范围内
+//				if(pppc.getLength()!=null){
+//					if(pppc.getLength()>MachineRestrict.lim_max_sub_length
+//							||pppc.getLength()<MachineRestrict.lim_min_sub_length){
+//						throw new Exception("加工计划["+pppc.getProduce_no()+"]的子板的长度不在设备限制范围内,不能挂单!");
+//					}
+//				}
+				// TODO 将来计算 板垛高度范围/板垛重量范围
+				
+			}
+			if (pppc.getMono_stack_max_weight()==null || "".equals(pppc.getMono_stack_max_weight()) || pppc.getMono_stack_max_weight()==0) {
+				weightupper = 99999;
+			}else {
+				weightupper =pppc.getMono_stack_max_weight();
+			}
+			if ( MachineRestrict.lim_max_box_wgt==0) {
+				weighttemp = 99999;
+			}else{
+				weighttemp = MachineRestrict.lim_max_box_wgt;
+			}
+			weightupper = weightupper>weighttemp ? weighttemp:weightupper;
+			// 如果销售加工计划传入了计划块数
+			if ( pppc.getCut_num() != null && pppc.getCut_num() > 1) {
+				// 总堆垛数
+				allboxCount = Math.ceil(1.0 * pppc.getCut_num() * pppc.getThick() / MachineRestrict.lim_max_box_height);
+				// 单堆垛块数
+				boxCount = new BigDecimal(pppc.getCut_num() / allboxCount).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+				// 单堆垛重量
+				V_singleWeight = boxCount * GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength());
+				if (V_singleWeight > weightupper) {
+					boxCount = Math.ceil(weightupper / GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength()));
+					allboxCount = Math.ceil(pppc.getCut_num() / boxCount);
+				}
+				V_lastbox_Count = pppc.getCut_num() - (allboxCount - 1) * boxCount;
+				Last_Count.put(pppc.getPlan_no(), V_lastbox_Count);
+			}else {
+				// 子板重量
+				double weigth = GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength());
+				// 根据加工计划计算 堆垛总数= 向上取整(估算重量/单垛重量上限);
+				allboxCount = Math.ceil(pppc.getEstimate_weight()/weightupper);
+				// 根据 堆垛数 反推 单堆垛块数 =(四舍五入) [估算重量/总堆垛数/(7.85*(10^-6)*厚*宽*长)];	
+				boxCount = new BigDecimal(pppc.getEstimate_weight()/allboxCount/weigth).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+				// 如果 单堆垛块数 * 厚度 > 设备限制高度,则重新计算: 	
+				if (boxCount*pppc.getThick().doubleValue()>MachineRestrict.lim_max_box_height) {
+					// 单堆垛块数_临时= [四舍五入](设备限制高度/厚度);
+					boxCount =  new BigDecimal(MachineRestrict.lim_max_box_height/pppc.getThick()).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+					// 堆垛总数 = (向上取整)[估算重量/(7.85*(10^-6)*厚*宽*长)* 单堆垛块数_临时];
+					allboxCount = Math.ceil(pppc.getEstimate_weight()/(weigth*boxCount));
+					// 单堆垛块数 =(四舍五入) [估算重量/总堆垛数/(7.85*(10^-6)*厚*宽*长)];
+					boxCount = new BigDecimal(pppc.getEstimate_weight()/allboxCount/weigth).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+				}
+			}
+			sWidth+=pppc.getWidth().doubleValue()*allboxCount*boxCount;
+			allsubcount +=allboxCount*boxCount;
+			iCutCount+=allboxCount;
+			boxCounts.put(pppc.getPlan_no(), boxCount);
+			ZddCount.put(pppc.getPlan_no(), allboxCount);
+			cut_style += allboxCount+"*"+boxCount+"*";
+		}
+		
+//		if (!"1".equals(pd)) {
+//			if (ypd.getFactweight() != null) {
+//				if (weightvalid > ypd.getFactweight()) {
+//					throw new Exception(" 卷重小于加工计划各规格要求重量之和,不能挂单!");
+//				}
+//			}
+//		}
+		
+		//保存设计主表数据:  横剪设计号:DCL+YYMMDD+6流水号
+		String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnCuttolengthDsnMain pldm=new PlnCuttolengthDsnMain();
+		List<PlnCuttolengthDsnMain> lpdmNo=this.getMapper(PlnCuttolengthDsnMainMapper.class).findWithCondition(null, "", " to_number(serial_no) desc ", 0, 1);
+		pldm.setCl_design_no("DCL"+sDate+String.format("%06d", 1));
+		pldm.setSerial_no("1");
+		if(lpdmNo!=null&&lpdmNo.size()>0){
+			pldm.setSerial_no(String.valueOf(Integer.parseInt(lpdmNo.get(0).getSerial_no())+1));
+			if(sDate.equals(lpdmNo.get(0).getCl_design_no().substring(3,9))){
+				pldm.setCl_design_no("DCL"+sDate+String.format("%06d", Integer.parseInt(lpdmNo.get(0).getCl_design_no().substring(9,15))+1 ));
+			}
+		}
+		
+		pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+		pldm.setOrder_no(lpp.get(0).getOrder_no());
+		pldm.setPline_code(lpp.get(0).getPline_code());
+		pldm.setSteel_code(lpp.get(0).getSteel_code());
+		
+		String isMulti="0";//是否拼料 根据订单数判断,多个订单填1,否则填0
+		pldm.setIs_multi(isMulti);
+		pldm.setMat_diameter_inn(ypd.getDiameter_inn());
+		pldm.setMat_diameter_out(ypd.getDiameter_out());
+		pldm.setMat_single_weight(ypd.getFactweight());
+		pldm.setMat_width(ypd.getWidth());
+		pldm.setProd_rate(sWidth/lppp.get(0).getMat_width().doubleValue());
+		// 堆垛总数
+		pldm.setSub_count(iCutCount);
+		// 钢板总数
+		pldm.setPlate_count(allsubcount);
+		pldm.setMat_thick(lppp.get(0).getThick());
+		pldm.setMat_length(lppp.get(0).getLength());
+		pldm.setSingle_weight(ypd.getFactweight());
+		if(lppp.size()==1){
+			pldm.setThick(lppp.get(0).getThick());
+			pldm.setWidth(lppp.get(0).getWidth());
+			pldm.setLength(lppp.get(0).getLength());
+			pldm.setDiameter_inn(lppp.get(0).getDiameter_inn());
+			pldm.setDiameter_out(lppp.get(0).getDiameter_out());
+			pldm.setSingle_weight(lppp.get(0).getEstimate_weight());
+		}
+		
+		if(!"1".equals(lpp.get(0).getOrder_nature()) && !"3".equals(lpp.get(0).getOrder_nature())){
+			pldm.setCut_style(lppp.get(0).getCut_style());
+		}
+		
+		pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+		pldm.setDesign_quantity(design_quantity);
+		pldm.setDesign_weight(ypd.getFactweight());
+		
+		pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		pldm.setCreate_man_name(userName);
+		pldm.setCreate_time(new Date());
+		pldm.setIs_finished(0l);
+		pldm.setReserve_1(lppp.get(0).getProduce_no());
+		this.getMapper(PlnCuttolengthDsnMainMapper.class).insert(pldm);
+		sCl_design_no=pldm;
+		
+		//倒叙取一条
+		List<PlnCuttolengthDsnMultinfo> lpdmM=this.getMapper(PlnCuttolengthDsnMultinfoMapper.class).findWithCondition(null, "", " to_number (serial_no) desc ", 0,1);
+		long DsnNo=1;
+		int sub_seq = 1;
+		if(lpdmM!=null&&lpdmM.size()>0){
+			DsnNo=lpdmM.get(0).getSerial_no()+1;
+		}
+		//-----------------写拼料(单个堆垛的信息)-------------------------
+		
+			for(PlnProcessPlan pppc:lppp){
+				for(int idx_sub=1;idx_sub<=ZddCount.get(pppc.getPlan_no()).intValue();idx_sub++){
+					PlnCuttolengthDsnMultinfo pldmc=new PlnCuttolengthDsnMultinfo();
+					pldmc.setSerial_no(DsnNo++);
+					// 子堆垛序号
+					pldmc.setSub_seq(sub_seq++);
+					pldmc.setCl_design_no(pldm.getCl_design_no());
+					pldmc.setOrder_no(lpp.get(0).getOrder_no());
+					pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+					// 堆垛规格
+					pldmc.setThick(pppc.getThick()*boxCounts.get(pppc.getPlan_no()).intValue());
+					pldmc.setWidth(pppc.getWidth());
+					pldmc.setLength(pppc.getLength());
+					// 子板规格
+					pldmc.setSub_thick(pppc.getThick());
+					pldmc.setSub_length(pppc.getLength());
+					pldmc.setSub_width(pppc.getWidth());
+					// 关联加工计划取唯一加工计划
+					pldmc.setPlan_no(pppc.getPlan_no());
+					// 如果传入了规格总块数,按块数来算
+					if ( pppc.getCut_num() != null && pppc.getCut_num()>1 && ZddCount.get(pppc.getPlan_no()).intValue()>1) {
+						if (idx_sub ==ZddCount.get(pppc.getPlan_no()).intValue() ) {
+							// sub_count 最后一剁子板总数
+							pldmc.setSub_count(Last_Count.get(pppc.getPlan_no()).intValue());
+							// 总数*单重
+							pldmc.setWeight(new BigDecimal(GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength())*Last_Count.get(pppc.getPlan_no()).intValue()).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
+						}else {
+							// sub_count 子板总数
+							pldmc.setSub_count(boxCounts.get(pppc.getPlan_no()).intValue());
+							// 总数*单重
+							pldmc.setWeight(new BigDecimal(GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength())*boxCounts.get(pppc.getPlan_no()).intValue()).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
+							
+						}
+					}else {
+						// sub_count 子板总数
+						pldmc.setSub_count(boxCounts.get(pppc.getPlan_no()).intValue());
+						// 总数*单重
+						pldmc.setWeight(new BigDecimal(GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength())*boxCounts.get(pppc.getPlan_no()).intValue()).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
+					}
+					// 子板单重
+					pldmc.setSub_weight(new BigDecimal(GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength())).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
+					// 定尺方式/切边方式
+					pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+					pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+					
+					if(pldmc.getSub_seq()>=1000){
+						throw new Exception("子板序号["+pldmc.getSub_seq()+"]不在设备限制范围内!");
+					}
+					this.getMapper(PlnCuttolengthDsnMultinfoMapper.class).insert(pldmc);
+				}
+			}
+		
+		return sCl_design_no;
+	}
+	
+	/**
+	 * 根据厚宽长获取重量
+	 * @param thick
+	 * @param width
+	 * @param length
+	 * 注意单位都是毫米(传入)
+	 * @return
+	 */
+	@SuppressWarnings("unused")
+	public	static double GetWeightBySize(double thick, double width,double length ){
+        return thick* width*length* 7.85 * Math.pow(10, -6);
+	}
+ 
+	/**
+	 * 根据加工计划和堆垛高度限制获取子堆垛总数和单堆垛块数
+	 * @param pppc 加工计划
+	 * @param height 堆垛高度
+	 * @return 子堆垛总数/单堆垛块数
+	 */
+	public Double[] getBoxCount(PlnProcessPlan pppc,double height){
+		Double[] result =  new Double[2];
+		// 每个规格下堆垛总数/单堆垛块数
+		double  allboxCount = 0, boxCount;
+		// 总堆垛数/子板总数
+		int iCutCount = 0, allsubcount = 0;
+		// 加工计划号:子堆垛数
+		Map<String, BigDecimal> boxCounts = new HashMap<String, BigDecimal>();
+		// 子板重量
+		double weigth = GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength());
+		// 根据加工计划计算 堆垛总数= 向上取整(估算重量/单垛重量上限);
+		allboxCount = Math.ceil(pppc.getEstimate_weight() / pppc.getMono_stack_max_weight());
+		// 根据 堆垛数 反推 单堆垛块数 =(四舍五入) [估算重量/总堆垛数/(7.85*(10^-6)*厚*宽*长)];
+		boxCount = new BigDecimal(pppc.getEstimate_weight() / allboxCount / weigth).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+		// 如果 单堆垛块数 * 厚度 > 设备限制高度,则重新计算:
+		if (boxCount * pppc.getThick().doubleValue() > height) {
+			// 单堆垛块数_临时= [四舍五入](设备限制高度/厚度);
+			boxCount = new BigDecimal(height / pppc.getThick()).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+			// 堆垛总数 = (向上取整)[估算重量/(7.85*(10^-6)*厚*宽*长)* 单堆垛块数_临时];
+			allboxCount = Math.ceil(pppc.getEstimate_weight() / (weigth * boxCount));
+			// 单堆垛块数 =(四舍五入) [估算重量/总堆垛数/(7.85*(10^-6)*厚*宽*长)];
+			boxCount = new BigDecimal(pppc.getEstimate_weight() / allboxCount / weigth).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+		}
+		result[0] = allboxCount;
+		result[1] = boxCount;
+		return result;
+	}
+}

+ 5464 - 0
src/main/java/market/Api/Mes/impl/MesApiDesignInfoImpl.java

@@ -0,0 +1,5464 @@
+/***文档注释***********************************************
+ * 作者            :bin.pan
+ * 创建日期     :2018-09-19
+ * 描述            :工序设计信息
+ * 注意事项     :同一工序可能出现多次,分清楚是第几次
+ * 遗留BUG   :
+ * 修改日期     :
+ * 修改人员     :
+ * 修改内容     :
+***********************************************************/
+package market.Api.Mes.impl;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import market.Api.Lms.impl.LmsApiServiceImpl;
+import market.Api.Mes.service.MesApiDesignInfoService;
+import market.Api.Qms.impl.QmsApiServiceImpl;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.mapper.ComBaseProcessRStationMapper;
+import market.Com.mapper.ComDsnPltlmtMapper;
+import market.Com.mapper.PbModelDbMapper;
+import market.Com.pb.DoubleUtil;
+import market.Com.vo.ComBaseInfo;
+import market.Com.vo.ComBaseProcessRStation;
+import market.Com.vo.ComDsnPltlmt;
+import market.Com.vo.CommonPage;
+import market.Com.vo.PbModelDb;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.mapper.YdmProductInlistMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Lms.Warehouse.vo.YdmProductInlist;
+import market.Mes.Cuttolength.Design.mapper.PlnCuttolengthDsnMainMapper;
+import market.Mes.Cuttolength.Design.mapper.PlnCuttolengthDsnMultinfoMapper;
+import market.Mes.Cuttolength.Design.vo.ClRestrict;
+import market.Mes.Cuttolength.Design.vo.PlnCuttolengthDsnMain;
+import market.Mes.Cuttolength.Design.vo.PlnCuttolengthDsnMultinfo;
+import market.Mes.Cuttolength.Plan.impl.PlnCuttolengthPlanServiceImpl;
+import market.Mes.Cuttolength.Plan.mapper.PlnCuttolengthPlanDetailMapper;
+import market.Mes.Cuttolength.Plan.vo.PlnCuttolengthPlanDetail;
+import market.Mes.Lengthwise.Design.mapper.PlnDsnOrderInfoMapper;
+import market.Mes.Lengthwise.Design.mapper.PlnLengthwiseDsnMainMapper;
+import market.Mes.Lengthwise.Design.mapper.PlnLengthwiseDsnMultinfoMapper;
+import market.Mes.Lengthwise.Design.vo.PlnDsnOrderInfo;
+import market.Mes.Lengthwise.Design.vo.PlnLengthwiseDsnMain;
+import market.Mes.Lengthwise.Design.vo.PlnLengthwiseDsnMultinfo;
+import market.Mes.Lengthwise.Plan.impl.PlnLengthwisePlanServiceImpl;
+import market.Mes.Lengthwise.Plan.mapper.PlnLengthwisePlanDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMatReplaceLogMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnLengthwisePlanDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnMatReplaceLog;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.MaterielTrack.mapper.PrcMaterielExtinfoMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielProcessMapper;
+import market.Mes.MaterielTrack.vo.PrcMaterielExtinfo;
+import market.Mes.Opr.mapper.MesOprLogMapper;
+import market.Mes.Opr.vo.MesOprLog;
+import market.Mes.OrderManager.Plan.mapper.PlnOrderStatisticMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderExtinfoMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderStatisticMapper;
+import market.Mes.OrderManager.Plan.vo.PlnOrderStatistic;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.OrderManager.Plan.vo.PlnProdorderStatistic;
+import market.Mes.Pickle.Design.impl.PlnPickleDsnMultinfoServiceImpl;
+import market.Mes.Pickle.Design.mapper.PlnPickleDsnMainMapper;
+import market.Mes.Pickle.Design.mapper.PlnPickleDsnMultinfoMapper;
+import market.Mes.Pickle.Design.vo.PlnPickleDsnMain;
+import market.Mes.Pickle.Design.vo.PlnPickleDsnMultinfo;
+import market.Mes.Pickle.Plan.mapper.PlnPicklePlanDetailMapper;
+import market.Mes.Pickle.Plan.vo.PlnPicklePlanDetail;
+import market.Mes.Rolling.Design.impl.PlnRollingDsnMultinfoServiceImpl;
+import market.Mes.Rolling.Design.mapper.PlnRollingDsnMainMapper;
+import market.Mes.Rolling.Design.mapper.PlnRollingDsnMultinfoMapper;
+import market.Mes.Rolling.Design.vo.PlnRollingDsnMain;
+import market.Mes.Rolling.Design.vo.PlnRollingDsnMultinfo;
+import market.Mes.Rolling.Plan.mapper.PlnRollingPlanDetailMapper;
+import market.Mes.Rolling.Plan.vo.PlnRollingPlanDetail;
+import market.Mes.Tpm.Design.impl.PlnSkinrollingDsnMultinfoServiceImpl;
+import market.Mes.Tpm.Design.mapper.PlnSkinrollingDsnMainMapper;
+import market.Mes.Tpm.Design.mapper.PlnSkinrollingDsnMultinfoMapper;
+import market.Mes.Tpm.Design.vo.PlnSkinrollingDsnMain;
+import market.Mes.Tpm.Design.vo.PlnSkinrollingDsnMultinfo;
+import market.Mes.Tpm.mapper.PlnSkinrollingPlanDetailMapper;
+import market.Mes.Tpm.vo.PlnSkinrollingPlanDetail;
+import market.Mes.anneal.Design.impl.PlnAnnealDsnMultinfoServiceImpl;
+import market.Mes.anneal.Design.mapper.PlnAnnealDsnMainMapper;
+import market.Mes.anneal.Design.mapper.PlnAnnealDsnMultinfoMapper;
+import market.Mes.anneal.Design.vo.PlnAnnealDsnMain;
+import market.Mes.anneal.Design.vo.PlnAnnealDsnMultinfo;
+import market.Mes.anneal.mapper.PlnAnnealPlanDetailMapper;
+import market.Mes.anneal.vo.PlnAnnealPlanDetail;
+import market.Qms.slmord.mapper.SlmOrdDesignMscPlGxPrlMapper;
+import market.Qms.slmord.mapper.SlmOrdDesignMscPlMapper;
+import market.Qms.slmord.mapper.SlmOrdDesignMscPlStiMapper;
+import market.Qms.slmord.vo.SlmOrdDesignMscPl;
+import market.Qms.slmord.vo.SlmOrdDesignMscPlGxPrl;
+import market.Qms.slmord.vo.SlmOrdDesignMscPlSti;
+import market.Qms.slmord.vo.SlmOrdDesignMscTic;
+import market.Qms.slmord.vo.SlmOrdDesignMscTicItem;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path = "MesApiDesignInfoService")
+public class MesApiDesignInfoImpl extends BaseServiceImpl implements MesApiDesignInfoService {
+
+	/**
+	 * 生成设计信息
+	 * 
+	 * @param prod_order_no    生产订单号
+	 * @param process          订单对应的工序点集合
+	 * @param currentprocindex 对象指针
+	 * @param object_no_vt     虚拟母卷号(不存在则生成)
+	 * @param single_wgt       单重
+	 * @return
+	 * 
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public ResultModel Design_Plan_Info(List<DesignInfo> infos, Map<String, Integer> proc_times) throws Exception {
+		ResultModel rm = new ResultModel("200", "");
+		if (proc_times == null) {
+			proc_times = new HashMap<String, Integer>();
+		}
+		List<DesignInfo> result = new ArrayList<>();
+		String prev_process_code = "", next_process_code = "";
+		if (Utils.isEmpty(infos)) {
+			rm.setState("500");
+			rm.setMsgInfo("请传入数据!");
+			return rm;
+		}
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		for (DesignInfo info : infos) {
+			if (Utils.isEmpty(info.getProcess())) {
+				rm.setState("500");
+				rm.setMsgInfo("传入工艺路径为空!");
+				return rm;
+			}
+			List<DesignInfo> infons = new ArrayList<DesignInfo>();
+			if (info.getCurrentProcIndex() >= info.getProcess().size()) {
+				continue;
+			}
+			// 工序点
+			String cur_proc = info.getProcess().get(info.getCurrentProcIndex());
+			// 复制母卷的设计次数
+			Map<String, Integer> temp = new HashMap<String, Integer>();
+			temp.putAll(proc_times);
+			if (temp.containsKey(cur_proc)) {
+				temp.put(cur_proc, temp.get(cur_proc) + 1);
+			} else {
+				temp.put(cur_proc, 1);
+			}
+
+			// 罩退
+			if (cur_proc.equals(processpoint.anneal_code)) {
+				// 获取当前工序的上下工序
+				if (info.getCurrentProcIndex() > 0) {
+					prev_process_code = info.getProcess().get(info.getCurrentProcIndex() - 1);
+				}
+				if (info.getCurrentProcIndex() < info.getProcess().size() - 1) {
+					next_process_code = info.getProcess().get(info.getCurrentProcIndex() + 1);
+				}
+				// 生成设计信息
+				result = AnnealPlanDsn(info.getProd_order_no(), info.getObject_no_vt(), prev_process_code,
+						next_process_code, info.getSingle_wgt(), info.getObject_no(),
+						temp.get(processpoint.anneal_code));
+				// 引用指针加一
+				info.setCurrentProcIndex(info.getCurrentProcIndex() + 1);
+				// 生成当前工序子卷参数
+				infons = GetChildParam(result, info);
+				// 分条
+			} else if (cur_proc.equals(processpoint.slitting_code)) {
+				// 获取当前工序的上下工序
+				if (info.getCurrentProcIndex() > 0) {
+					prev_process_code = info.getProcess().get(info.getCurrentProcIndex() - 1);
+				}
+				if (info.getCurrentProcIndex() < info.getProcess().size() - 1) {
+					next_process_code = info.getProcess().get(info.getCurrentProcIndex() + 1);
+				}
+				// 生成设计信息
+				result = LengthwisePlanDsn(info.getProd_order_no(), info.getObject_no_vt(), prev_process_code,
+						next_process_code, info.getSingle_wgt(), info.getObject_no(),
+						temp.get(processpoint.slitting_code));
+				// 引用指针加一
+				info.setCurrentProcIndex(info.getCurrentProcIndex() + 1);
+				// 生成当前工序子卷参数
+				infons = GetChildParam(result, info);
+				// 开平
+			} else if (cur_proc.equals(processpoint.cross_cutting_code)) {
+				// 获取当前工序的上下工序
+				if (info.getCurrentProcIndex() > 0) {
+					prev_process_code = info.getProcess().get(info.getCurrentProcIndex() - 1);
+				}
+				if (info.getCurrentProcIndex() < info.getProcess().size() - 1) {
+					next_process_code = info.getProcess().get(info.getCurrentProcIndex() + 1);
+				}
+				// 生成设计信息
+				result = CuttolengthPlanDsn(info.getProd_order_no(), info.getObject_no_vt(), prev_process_code,
+						next_process_code, info.getSingle_wgt(), info.getObject_no(),
+						temp.get(processpoint.cross_cutting_code));
+				// 引用指针加一
+				info.setCurrentProcIndex(info.getCurrentProcIndex() + 1);
+				// 生成当前工序子卷参数
+				infons = GetChildParam(result, info);
+				// 平整
+			} else if (cur_proc.equals(processpoint.smooth_code)) {
+				// 获取当前工序的上下工序
+				if (info.getCurrentProcIndex() > 0) {
+					prev_process_code = info.getProcess().get(info.getCurrentProcIndex() - 1);
+				}
+				if (info.getCurrentProcIndex() < info.getProcess().size() - 1) {
+					next_process_code = info.getProcess().get(info.getCurrentProcIndex() + 1);
+				}
+				// 生成设计信息
+				result = SrPlanDsn(info.getProd_order_no(), info.getObject_no_vt(), prev_process_code,
+						next_process_code, info.getSingle_wgt(), info.getObject_no(),
+						temp.get(processpoint.smooth_code));
+				// 引用指针加一
+				info.setCurrentProcIndex(info.getCurrentProcIndex() + 1);
+				// 生成当前工序子卷参数
+				infons = GetChildParam(result, info);
+				// 轧制
+			} else if (cur_proc.equals(processpoint.rolling_code)) {
+				// 获取当前工序的上下工序
+				if (info.getCurrentProcIndex() > 0) {
+					prev_process_code = info.getProcess().get(info.getCurrentProcIndex() - 1);
+				}
+				if (info.getCurrentProcIndex() < info.getProcess().size() - 1) {
+					next_process_code = info.getProcess().get(info.getCurrentProcIndex() + 1);
+				}
+				// 生成设计信息
+				result = RollingPlanDsn(info.getProd_order_no(), info.getObject_no_vt(), prev_process_code,
+						next_process_code, info.getSingle_wgt(), info.getObject_no(),
+						temp.get(processpoint.rolling_code));
+				// 引用指针加一
+				info.setCurrentProcIndex(info.getCurrentProcIndex() + 1);
+				// 生成当前工序子卷参数
+				infons = GetChildParam(result, info);
+				// 酸洗
+			} else if (cur_proc.equals(processpoint.pickle_code)) {
+				// 获取当前工序的上下工序
+				if (info.getCurrentProcIndex() > 0) {
+					prev_process_code = info.getProcess().get(info.getCurrentProcIndex() - 1);
+				}
+				if (info.getCurrentProcIndex() < info.getProcess().size() - 1) {
+					next_process_code = info.getProcess().get(info.getCurrentProcIndex() + 1);
+				}
+				// 生成设计信息
+				result = PicklePlanDsn(info.getProd_order_no(), info.getObject_no_vt(), prev_process_code,
+						next_process_code, info.getSingle_wgt(), info.getObject_no(),
+						temp.get(processpoint.pickle_code));
+				// 引用指针加一
+				info.setCurrentProcIndex(info.getCurrentProcIndex() + 1);
+				// 生成当前工序子卷参数
+				infons = GetChildParam(result, info);
+			}
+			if (Utils.isEmpty(infons)) {
+				continue;
+			}
+			if (info.getCurrentProcIndex() < info.getProcess().size()) {
+				rm = Design_Plan_Info(infons, temp);
+				if (!"200".equals(rm.getState())) {
+					throw new Exception(rm.getMsgInfo());
+				}
+			}
+		}
+		return rm;
+	}
+
+	/**
+	 * 轧制设计信息
+	 * 
+	 * @param prod_order_no     生产订单号
+	 * @param object_no_vt      虚拟母卷号
+	 * @param prev_process_code 上道工序
+	 * @param next_process_code 下道工序
+	 * @param proc_times        生成主表设计信息、拼料信息、虚拟物料信息、订单组成信息
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public List<DesignInfo> RollingPlanDsn(String prod_order_no, String object_no_vt, String prev_process_code,
+			String next_process_code, Double single_wgt, String object_no, Integer proc_times) throws Exception {
+
+		List<DesignInfo> result = new ArrayList<>();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+//		double othickmin = 0, othickmax = 0, thick = 0;
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+//		Double width = 0d;
+
+		boolean obv_flg = false;
+		// 获取虚拟母卷信息
+		List<PlnMaterielDetail> pmdel = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			pmdel = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		if (Utils.isNotEmpty(pmdel) && pmdel.get(0).getRl_design_no() != null) {
+			obv_flg = true;
+		}
+		// 获取订单信息
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(prod_order_no);
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		// 获取成品厚度信息
+		// 获取轧制工序信息
+		// 获取质量设计信息取轧制工序最后一个道次信息
+//		SlmOrdDesignMscPlSti sti = new SlmOrdDesignMscPlSti();
+//		sti.setDesign_key(lpp.get(0).getDesign_key());
+//		sti.setMsc_pline(lpp.get(0).getMsc_pline());
+//		sti.setProcess_code(processpoint.rolling_code);
+//		List<SlmOrdDesignMscPlSti> stis = this.getBean(MesApiDesignInfoImpl.class).getQcmPrcInfo(sti);
+//		// 获取当前工序的最后一个道次信息
+//		sti.setBacklog_seq(stis.get(proc_times - 1).getBacklog_seq());
+//		// 只查询工艺类工序点
+//		sti.setProcess_point_type("403206");
+//		List<SlmOrdDesignMscPlSti> listSti = this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(sti, "",
+//				" PROCESS_POINT_SEQ desc", 0, 0);
+//		SlmOrdDesignMscPlSti smp = listSti.get(0);
+//		SlmOrdDesignMscTic tmp = new SlmOrdDesignMscTic();
+//		BeanUtils.copyProperties(smp, tmp);
+//		tmp.setPline_code("C016");
+//		tmp.setMachine_code("M0008");
+//		CommonPage<SlmOrdDesignMscTic> com = new CommonPage<SlmOrdDesignMscTic>();
+//		com.setObject(tmp);
+//		ResultModel tic_f = this.getBean(QmsApiServiceImpl.class).getGongYi(com);
+//		if ("500".equals(tic_f.getState())) {
+//			throw new Exception("获取[" + tmp.getProcess_point_desc() + "]工艺标准失败!" + tic_f.getMsgInfo());
+//		}
+//		if (Utils.isNotEmpty(tic_f)) {
+//			List<SlmOrdDesignMscTicItem> item_f = (List<SlmOrdDesignMscTicItem>) tic_f.getData();
+//			// 获取轧制入口厚度出口厚度的代码
+////		SlmOrdDesignMscTicItem tmp = new SlmOrdDesignMscTicItem();
+//			List<PbModelDb> code = this.getBean(MesApiDesignInfoImpl.class).getBase_Name("201001");
+//			for (SlmOrdDesignMscTicItem slm : item_f) {
+//				// 出口厚度
+//				if (slm.getCraft_param_code().equals(code.get(1).getText())) {
+//					othickmin = Double.valueOf(slm.getMin_value() == null ? "0" : slm.getMin_value());
+//					if (Utils.isNotEmpty(slm.getMax_value())) {
+//						othickmax = Double.valueOf(slm.getMax_value());
+//					}
+//					break;
+//				}
+//				// 入口厚度
+//// 
+//			}
+//			thick = othickmin == 0 ? othickmax : othickmin;
+//			if (Utils.isNotEmpty(pmdel)) {
+//				width = pmdel.get(0).getWidth();
+//			} else {
+//				width = lpp.get(0).getWidth();
+//			}
+//		}
+		// 计算所需原料卷数量
+//		int db_cnt = (new BigDecimal(lpp.get(0).getEstimate_weight()).setScale(0, BigDecimal.ROUND_HALF_UP)).intValue() == 0 ? 1:(new BigDecimal(lpp.get(0).getEstimate_weight()).setScale(0, BigDecimal.ROUND_HALF_UP)).intValue();
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnRollingDsnMain pldm = new PlnRollingDsnMain();
+
+		// 设计信息存在就修改设计主表
+		if (obv_flg) {
+			// 设计主表不变
+			// 删除原有拼料信息'
+			pldm.setThick(lpp.get(0).getThick());
+			pldm.setWidth(lpp.get(0).getWidth());
+			pldm.setLength(lpp.get(0).getLength());
+			pldm.setRl_design_no(pmdel.get(0).getRl_design_no());
+			this.getMapper(PlnRollingDsnMultinfoMapper.class).doDelete(pmdel.get(0).getRl_design_no());
+		} else {
+			// 保存设计主表数据: 轧制设计号:DRL+YYMMDD+6流水号
+			List<PlnRollingDsnMain> lpdmNo = this.getMapper(PlnRollingDsnMainMapper.class).findWithCondition(null, "",
+					" serial_no desc ", 0, 1);
+			pldm.setSerial_no(1l);
+			pldm.setRl_design_no("DRL" + sDate + String.format("%06d", 1));
+			if (lpdmNo != null && lpdmNo.size() > 0) {
+				pldm.setSerial_no(lpdmNo.get(0).getSerial_no() + 1);
+				if (sDate.equals(lpdmNo.get(0).getRl_design_no().substring(3, 9))) {
+					pldm.setRl_design_no("DRL" + sDate + String.format("%06d",
+							Integer.parseInt(lpdmNo.get(0).getRl_design_no().substring(9, 15)) + 1));
+				}
+			}
+
+			// 订单信息
+			pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldm.setOrder_no(lpp.get(0).getOrder_no());
+			pldm.setPline_code(lpp.get(0).getPline_code());
+			pldm.setSteel_code(lpp.get(0).getSteel_code());
+			String isMulti = "0";// 是否拼料 根据订单数判断,多个订单填1,否则填0
+			pldm.setIs_multi(isMulti);
+			pldm.setThick(lpp.get(0).getThick());
+			pldm.setWidth(lpp.get(0).getWidth());
+			pldm.setLength(lpp.get(0).getLength());
+			pldm.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pldm.setDiameter_out(lpp.get(0).getDiameter_out());
+			pldm.setSingle_weight(single_wgt);
+//		pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//		pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+			pldm.setDesign_quantity(1);
+			pldm.setDesign_weight(single_wgt); // 实物单重
+			pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pldm.setSub_count(1L);
+			pldm.setCreate_man_name(userName);
+			pldm.setCreate_time(new Date());
+			pldm.setIs_finished(0L);
+			pldm.setReserve_1(lpp.get(0).getProduce_no());
+			this.getMapper(PlnRollingDsnMainMapper.class).insert(pldm);
+		}
+
+		// 倒叙取一条拼料信息
+		List<PlnRollingDsnMultinfo> lpdmM = this.getMapper(PlnRollingDsnMultinfoMapper.class).findWithCondition(null,
+				"", " serial_no desc ", 0, 1);
+		long DsnNo = 1;
+		if (lpdmM != null && lpdmM.size() > 0) {
+			DsnNo = lpdmM.get(0).getSerial_no() + 1;
+		}
+
+		// -----------------写拼料信息-----------------------------
+		PlnRollingDsnMultinfo pldmc = new PlnRollingDsnMultinfo();
+		pldmc.setSerial_no(DsnNo);
+		pldmc.setRl_design_no(pldm.getRl_design_no());
+		pldmc.setSeg_seq(1);
+		pldmc.setOrder_no(lpp.get(0).getOrder_no());
+		pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pldmc.setThick(lpp.get(0).getThick());
+		pldmc.setWidth(lpp.get(0).getWidth());
+		pldmc.setLength(lpp.get(0).getLength());
+		pldmc.setDiameter_inn(lpp.get(0).getDiameter_inn());
+		pldmc.setDiameter_out(lpp.get(0).getDiameter_out());
+		pldmc.setWeight(single_wgt);
+//		pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//		pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pldmc.setSub_seq(1);
+		this.getMapper(PlnRollingDsnMultinfoMapper.class).insert(pldmc);
+
+		// 生成虚拟物料信息倒叙去一条
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		long PMDNo = 1;
+		if (lpmd != null && lpmd.size() > 0) {
+			PMDNo = lpmd.get(0).getSerial_no() + 1;
+		}
+		int objectnoVtNo = this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate) + 1;
+
+		List<PlnMaterielDetail> detail = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			detail = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+		
+		YdmProductDetail ypd = new YdmProductDetail();
+		if (Utils.isNotEmpty(object_no)) {
+			// 获取实物库存信息
+			ypd = this.getMapper(YdmProductDetailMapper.class).findById(object_no);
+		}
+
+		// 虚拟母卷计划内的才需要新增或者修改
+		PlnMaterielDetail pmdM = new PlnMaterielDetail();
+		if (Utils.isNotEmpty(detail)) {
+			pmdM = detail.get(0);
+			pmdM.setStatus("0PDE10");
+			if (Utils.isNotEmpty(object_no)) {
+				pmdM.setObject_no(object_no);
+				if(Utils.isNotEmpty(ypd)) {
+					pmdM.setThick(ypd.getThick());
+				}
+			}
+			pmdM.setNext_dsn_process_code(processpoint.rolling_code);
+			pmdM.setNext_process_code(processpoint.rolling_code);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setRl_design_no(pldm.getRl_design_no());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			// 存在大批量脱单的时候,卷子虚拟物料信息的卷号信息没被清空,所以再次挂单的时候,选择直接更新订单号:
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdM);
+		} else {
+			pmdM.setSerial_no(PMDNo++);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setObject_no_vt(object_no_vt == null ? sDate + String.format("%06d", objectnoVtNo++) : object_no_vt);
+			pmdM.setObject_no(object_no);
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setPline_code(lpp.get(0).getPline_code());
+			pmdM.setStatus("0PDE10");
+			pmdM.setIs_finished("0");
+//			pmdM.setPrev_dsn_process_code(prev_process_code);
+//			pmdM.setPrev_process_code(prev_process_code);
+			pmdM.setNext_dsn_process_code(processpoint.rolling_code);
+			pmdM.setNext_process_code(processpoint.rolling_code);
+			pmdM.setIs_prev_dsn_finished("0");// 母卷:0
+			pmdM.setCreate_design_no(pldm.getRl_design_no());
+			pmdM.setCreate_process_code(processpoint.rolling_code);
+			pmdM.setIs_mat(1);// 母卷:1
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setRl_design_no(pldm.getRl_design_no());
+			pmdM.setIs_multi("0");
+			pmdM.setSteel_code(lpp.get(0).getSteel_code());
+			// 母卷厚度、宽度使用实物规格
+			if (Utils.isNotEmpty(object_no)) {
+				if(Utils.isNotEmpty(ypd)) {
+					pmdM.setThick(ypd.getThick());
+					pmdM.setWidth(ypd.getWidth());
+					pmdM.setLength(ypd.getLength());
+				}else {
+					pmdM.setWidth(lpp.get(0).getWidth());
+					pmdM.setThick(lpp.get(0).getThick());
+					pmdM.setLength(lpp.get(0).getLength());
+				}
+			}else {
+				pmdM.setWidth(lpp.get(0).getWidth());
+				pmdM.setThick(lpp.get(0).getThick());
+				pmdM.setLength(lpp.get(0).getLength());
+			}
+			pmdM.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pmdM.setDiameter_out(lpp.get(0).getDiameter_out());
+			pmdM.setSingle_weight(single_wgt);
+			pmdM.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdM.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdM.setOrd_flg("1");
+			pmdM.setCreate_man_name(userName);
+			pmdM.setCreate_time(new Date());
+			pmdM.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdM.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdM);
+		}
+
+		// 根据累加值,建立坯料设计订单组成表
+		long pdoiNo = 1;
+		List<PlnDsnOrderInfo> lpdoiq = this.getMapper(PlnDsnOrderInfoMapper.class).findWithCondition(null, "",
+				" serial_no desc", 0, 1);
+		if (lpdoiq != null && lpdoiq.size() > 0) {
+			pdoiNo = lpdoiq.get(0).getSerial_no() + 1;
+		}
+
+		// 建立虚拟子卷信息
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setSerial_no(PMDNo++);
+		pmdc.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo++));
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setStatus("0PDE10");
+		pmdc.setIs_finished("0");
+		pmdc.setPrev_dsn_process_code(processpoint.rolling_code);
+		pmdc.setPrev_process_code(processpoint.rolling_code);
+		pmdc.setIs_prev_dsn_finished("1");// 母卷:0
+		pmdc.setCreate_design_no(pldm.getRl_design_no());
+		pmdc.setCreate_process_code(processpoint.rolling_code);
+		pmdc.setIs_mat(0);// 母卷:1
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pmdc.setRl_design_no(pldm.getRl_design_no());
+		pmdc.setMat_object_no_vt(pmdM.getObject_no_vt());
+		pmdc.setIs_multi("0");
+		pmdc.setSteel_code(lpp.get(0).getSteel_code());
+		pmdc.setWidth(pldmc.getWidth());
+		pmdc.setThick(pldmc.getThick());
+		pmdc.setLength(pldmc.getLength());
+		pmdc.setDiameter_inn(pldmc.getDiameter_inn());
+		pmdc.setDiameter_out(pldmc.getDiameter_out());
+		pmdc.setSub_count(1);
+		// 母卷实重* 子卷计划宽度/母卷实宽
+		pmdc.setSingle_weight(single_wgt);
+		pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pmdc.setOrd_flg("1");
+		pmdc.setCreate_man_name(userName);
+		pmdc.setCreate_time(new Date());
+		pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		pmdc.setPk_ask_code(lpp.get(0).getPk_ask_code());
+		pmdc.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+		this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+		DesignInfo temp = new DesignInfo();
+		temp.setObject_no_vt(pmdc.getObject_no_vt());
+		temp.setSingle_wgt(pmdc.getSingle_weight());
+		result.add(temp);
+
+		// 订单组成信息
+		PlnDsnOrderInfo pdoi = new PlnDsnOrderInfo();
+		pdoi.setDesign_no(pldm.getRl_design_no());
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		pdoi.setWeight_in_one(single_wgt);
+		pdoi.setQuantity_in_one(1);
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		if (obv_flg) {
+			this.getMapper(PlnDsnOrderInfoMapper.class).doUpdate(pdoi);
+		} else {
+			pdoi.setSerial_no(pdoiNo++);
+			pdoi.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnDsnOrderInfoMapper.class).insert(pdoi);
+		}
+		return result;
+	}
+
+	/**
+	 * 平整设计信息
+	 * 
+	 * @param prod_order_no     生产订单号
+	 * @param object_no_vt      虚拟母卷号
+	 * @param prev_process_code 上道工序
+	 * @param next_process_code 下道工序
+	 * @param proc_times        生成主表设计信息、拼料信息、虚拟物料信息、订单组成信息
+	 * @return
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public List<DesignInfo> SrPlanDsn(String prod_order_no, String object_no_vt, String prev_process_code,
+			String next_process_code, Double single_wgt, String object_no, Integer proc_times) {
+		List<DesignInfo> result = new ArrayList<>();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		Double width = 0d;
+		boolean obv_flg = false;
+		// 获取虚拟母卷信息
+		List<PlnMaterielDetail> pmdel = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			pmdel = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		if (Utils.isNotEmpty(pmdel) && pmdel.get(0).getSr_design_no() != null) {
+			obv_flg = true;
+		}
+		// 获取订单信息
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(prod_order_no);
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		if (Utils.isNotEmpty(pmdel)) {
+			width = pmdel.get(0).getWidth();
+		} else {
+			width = lpp.get(0).getWidth();
+		}
+		// 获取平整子卷重量
+		ArrayList<Double> hts = howToSr(single_wgt, lpp.get(0).getEstimate_weight());
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnSkinrollingDsnMain pldm = new PlnSkinrollingDsnMain();
+		// 设计信息存在就修改设计主表
+		if (obv_flg) {
+			// 设计主表不变
+			// 删除原有拼料信息
+			pldm.setThick(lpp.get(0).getThick());
+			pldm.setWidth(width);
+			pldm.setLength(lpp.get(0).getLength());
+			pldm.setSr_design_no(pmdel.get(0).getSr_design_no());
+			this.getMapper(PlnSkinrollingDsnMultinfoMapper.class).doDelete(pmdel.get(0).getSr_design_no());
+		} else {
+			// 保存设计主表数据: 平整设计号:DSR+YYMMDD+6流水号
+			List<PlnSkinrollingDsnMain> lpdmNo = this.getMapper(PlnSkinrollingDsnMainMapper.class)
+					.findWithCondition(null, "", " serial_no desc ", 0, 1);
+			pldm.setSerial_no(1l);
+			pldm.setSr_design_no("DSR" + sDate + String.format("%06d", 1));
+			if (lpdmNo != null && lpdmNo.size() > 0) {
+				pldm.setSerial_no(lpdmNo.get(0).getSerial_no() + 1);
+				if (sDate.equals(lpdmNo.get(0).getSr_design_no().substring(3, 9))) {
+					pldm.setSr_design_no("DSR" + sDate + String.format("%06d",
+							Integer.parseInt(lpdmNo.get(0).getSr_design_no().substring(9, 15)) + 1));
+				}
+			}
+
+			// 订单信息
+			pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldm.setOrder_no(lpp.get(0).getOrder_no());
+			pldm.setPline_code(lpp.get(0).getPline_code());
+			pldm.setSteel_code(lpp.get(0).getSteel_code());
+			String isMulti = "0";// 是否拼料 根据订单数判断,多个订单填1,否则填0
+			pldm.setIs_multi(isMulti);
+			pldm.setThick(lpp.get(0).getThick());
+			pldm.setWidth(width);
+			pldm.setLength(lpp.get(0).getLength());
+			pldm.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pldm.setDiameter_out(lpp.get(0).getDiameter_out());
+			pldm.setSingle_weight(single_wgt);
+//				pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//				pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+			pldm.setDesign_quantity(1);
+			pldm.setDesign_weight(single_wgt); // 实物单重
+			pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pldm.setSub_count(hts.size());
+			pldm.setCreate_man_name(userName);
+			pldm.setCreate_time(new Date());
+			pldm.setIs_finished(0L);
+			pldm.setReserve_1(lpp.get(0).getProduce_no());
+			this.getMapper(PlnSkinrollingDsnMainMapper.class).insert(pldm);
+		}
+		// 倒叙取一条拼料信息
+		List<PlnSkinrollingDsnMultinfo> lpdmM = this.getMapper(PlnSkinrollingDsnMultinfoMapper.class)
+				.findWithCondition(null, "", " serial_no desc ", 0, 1);
+		long DsnNo = 1;
+		if (lpdmM != null && lpdmM.size() > 0) {
+			DsnNo = lpdmM.get(0).getSerial_no() + 1;
+		}
+		List<PlnSkinrollingDsnMultinfo> multinfo = new ArrayList<PlnSkinrollingDsnMultinfo>();
+		for (int i = 0; i < hts.size(); i++) {
+			// -----------------写拼料信息-----------------------------
+			PlnSkinrollingDsnMultinfo pldmc = new PlnSkinrollingDsnMultinfo();
+			pldmc.setSerial_no(DsnNo++);
+			pldmc.setSr_design_no(pldm.getSr_design_no());
+			pldmc.setSr_seq(Long.valueOf(i + 1));
+			pldmc.setSeg_seq(Long.valueOf(i + 1));
+			pldmc.setOrder_no(lpp.get(0).getOrder_no());
+			pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldmc.setThick(lpp.get(0).getThick());
+			pldmc.setWidth(width);
+			pldmc.setLength(lpp.get(0).getLength() == null ? null
+					: DoubleUtil.mul(DoubleUtil.div(hts.get(i), single_wgt), lpp.get(0).getLength()));
+			pldmc.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pldmc.setDiameter_out(lpp.get(0).getDiameter_out());
+			pldmc.setWeight(hts.get(i));
+//				pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//				pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldmc.setSub_seq(i + 1);
+			this.getMapper(PlnSkinrollingDsnMultinfoMapper.class).insert(pldmc);
+			multinfo.add(pldmc);
+		}
+
+		// 生成虚拟物料信息倒叙去一条
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		long PMDNo = 1;
+		if (lpmd != null && lpmd.size() > 0) {
+			PMDNo = lpmd.get(0).getSerial_no() + 1;
+		}
+		int objectnoVtNo = this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate) + 1;
+
+		List<PlnMaterielDetail> detail = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			detail = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		// 虚拟母卷计划内的才需要新增或者修改
+		PlnMaterielDetail pmdM = new PlnMaterielDetail();
+		if (Utils.isNotEmpty(detail)) {
+			pmdM = detail.get(0);
+			pmdM.setStatus("0PDD10");
+			if (Utils.isNotEmpty(object_no)) {
+				pmdM.setObject_no(object_no);
+			}
+			pmdM.setNext_dsn_process_code(processpoint.smooth_code);
+			pmdM.setNext_process_code(processpoint.smooth_code);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setSr_design_no(pldm.getSr_design_no());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			// 存在大批量脱单的时候,卷子虚拟物料信息的卷号信息没被清空,所以再次挂单的时候,选择直接更新订单号:
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdM);
+		} else {
+			pmdM.setSerial_no(PMDNo++);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setObject_no_vt(object_no_vt == null ? sDate + String.format("%06d", objectnoVtNo++) : object_no_vt);
+			pmdM.setObject_no(object_no);
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setPline_code(lpp.get(0).getPline_code());
+			pmdM.setStatus("0PDD10");
+			pmdM.setIs_finished("0");
+//					pmdM.setPrev_dsn_process_code(prev_process_code);
+//					pmdM.setPrev_process_code(prev_process_code);
+			pmdM.setNext_dsn_process_code(processpoint.smooth_code);
+			pmdM.setNext_process_code(processpoint.smooth_code);
+			pmdM.setIs_prev_dsn_finished("0");// 母卷:0
+			pmdM.setCreate_design_no(pldm.getSr_design_no());
+			pmdM.setCreate_process_code(processpoint.smooth_code);
+			pmdM.setIs_mat(1);// 母卷:1
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setSr_design_no(pldm.getSr_design_no());
+			pmdM.setIs_multi("0");
+			pmdM.setSteel_code(lpp.get(0).getSteel_code());
+			// 母卷厚度、宽度使用计划值
+			pmdM.setWidth(width);
+			pmdM.setThick(lpp.get(0).getThick());
+			pmdM.setLength(lpp.get(0).getLength());
+			pmdM.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pmdM.setDiameter_out(lpp.get(0).getDiameter_out());
+			pmdM.setSingle_weight(single_wgt);
+			pmdM.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdM.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdM.setOrd_flg("1");
+			pmdM.setCreate_man_name(userName);
+			pmdM.setCreate_time(new Date());
+			pmdM.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdM.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdM);
+		}
+
+		// 根据累加值,建立坯料设计订单组成表
+		long pdoiNo = 1;
+		List<PlnDsnOrderInfo> lpdoiq = this.getMapper(PlnDsnOrderInfoMapper.class).findWithCondition(null, "",
+				" serial_no desc", 0, 1);
+		if (lpdoiq != null && lpdoiq.size() > 0) {
+			pdoiNo = lpdoiq.get(0).getSerial_no() + 1;
+		}
+		for (PlnSkinrollingDsnMultinfo pm : multinfo) {
+			// 建立虚拟子卷信息
+			PlnMaterielDetail pmdc = new PlnMaterielDetail();
+			pmdc.setSerial_no(PMDNo++);
+			pmdc.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo++));
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setStatus("0PDD10");
+			pmdc.setIs_finished("0");
+			pmdc.setPrev_dsn_process_code(processpoint.smooth_code);
+			pmdc.setPrev_process_code(processpoint.smooth_code);
+			pmdc.setIs_prev_dsn_finished("1");// 母卷:0
+			pmdc.setCreate_design_no(pldm.getSr_design_no());
+			pmdc.setCreate_process_code(processpoint.smooth_code);
+			pmdc.setIs_mat(0);// 母卷:1
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdc.setSr_design_no(pm.getSr_design_no());
+			pmdc.setMat_object_no_vt(pmdM.getObject_no_vt());
+			pmdc.setIs_multi("0");
+			pmdc.setSteel_code(lpp.get(0).getSteel_code());
+			pmdc.setWidth(pm.getWidth());
+			pmdc.setThick(pm.getThick());
+			pmdc.setLength(pm.getLength());
+			pmdc.setDiameter_inn(pm.getDiameter_inn());
+			pmdc.setDiameter_out(pm.getDiameter_out());
+
+			// 母卷实重* 子卷计划宽度/母卷实宽
+			pmdc.setSingle_weight(pm.getWeight());
+			pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdc.setOrd_flg("1");
+			pmdc.setCreate_man_name(userName);
+			pmdc.setCreate_time(new Date());
+			pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdc.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdc.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+			DesignInfo temp = new DesignInfo();
+			temp.setObject_no_vt(pmdc.getObject_no_vt());
+			temp.setSingle_wgt(pmdc.getSingle_weight());
+			result.add(temp);
+		}
+
+		// 订单组成信息
+		PlnDsnOrderInfo pdoi = new PlnDsnOrderInfo();
+		pdoi.setDesign_no(pldm.getSr_design_no());
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		pdoi.setWeight_in_one(single_wgt);
+		pdoi.setQuantity_in_one(hts.size());
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		if (obv_flg) {
+			this.getMapper(PlnDsnOrderInfoMapper.class).doUpdate(pdoi);
+		} else {
+			pdoi.setSerial_no(pdoiNo++);
+			pdoi.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnDsnOrderInfoMapper.class).insert(pdoi);
+		}
+		return result;
+	}
+
+	/**
+	 * 罩退设计信息
+	 * 
+	 * @param prod_order_no     生产订单号
+	 * @param object_no_vt      虚拟母卷号
+	 * @param prev_process_code 上道工序
+	 * @param next_process_code 下道工序
+	 * @param proc_times        生成主表设计信息、拼料信息、虚拟物料信息、订单组成信息
+	 * @return
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public List<DesignInfo> AnnealPlanDsn(String prod_order_no, String object_no_vt, String prev_process_code,
+			String next_process_code, Double single_wgt, String object_no, Integer proc_times) {
+
+		List<DesignInfo> result = new ArrayList<>();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		Double width = 0d;
+
+		boolean obv_flg = false;
+		// 获取虚拟母卷信息
+		List<PlnMaterielDetail> pmdel = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			pmdel = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		if (Utils.isNotEmpty(pmdel) && pmdel.get(0).getAn_design_no() != null) {
+			obv_flg = true;
+		}
+		// 获取订单信息
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(prod_order_no);
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		if (Utils.isNotEmpty(pmdel)) {
+			width = pmdel.get(0).getWidth();
+		} else {
+			width = lpp.get(0).getWidth();
+		}
+		// 计算所需原料卷数量
+//		int db_cnt = (new BigDecimal(lpp.get(0).getEstimate_weight()).setScale(0, BigDecimal.ROUND_HALF_UP)).intValue() == 0 ? 1:(new BigDecimal(lpp.get(0).getEstimate_weight()).setScale(0, BigDecimal.ROUND_HALF_UP)).intValue();
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnAnnealDsnMain pldm = new PlnAnnealDsnMain();
+
+		// 设计信息存在就修改设计主表
+		if (obv_flg) {
+			// 设计主表不变
+			// 删除原有拼料信息
+			pldm.setThick(lpp.get(0).getThick());
+			pldm.setWidth(width);
+			pldm.setLength(lpp.get(0).getLength());
+			pldm.setAn_design_no(pmdel.get(0).getAn_design_no());
+			this.getMapper(PlnAnnealDsnMultinfoMapper.class).doDelete(pmdel.get(0).getAn_design_no());
+		} else {
+			// 保存设计主表数据: 罩退设计号:DAN+YYMMDD+6流水号
+			List<PlnAnnealDsnMain> lpdmNo = this.getMapper(PlnAnnealDsnMainMapper.class).findWithCondition(null, "",
+					" serial_no desc ", 0, 1);
+			pldm.setSerial_no(1l);
+			pldm.setAn_design_no("DAN" + sDate + String.format("%06d", 1));
+			if (lpdmNo != null && lpdmNo.size() > 0) {
+				pldm.setSerial_no(lpdmNo.get(0).getSerial_no() + 1);
+				if (sDate.equals(lpdmNo.get(0).getAn_design_no().substring(3, 9))) {
+					pldm.setAn_design_no("DAN" + sDate + String.format("%06d",
+							Integer.parseInt(lpdmNo.get(0).getAn_design_no().substring(9, 15)) + 1));
+				}
+			}
+
+			// 订单信息
+			pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldm.setOrder_no(lpp.get(0).getOrder_no());
+			pldm.setPline_code(lpp.get(0).getPline_code());
+			pldm.setSteel_code(lpp.get(0).getSteel_code());
+			String isMulti = "0";// 是否拼料 根据订单数判断,多个订单填1,否则填0
+			pldm.setIs_multi(isMulti);
+			pldm.setThick(lpp.get(0).getThick());
+			pldm.setWidth(width);
+			pldm.setLength(lpp.get(0).getLength());
+			pldm.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pldm.setDiameter_out(lpp.get(0).getDiameter_out());
+			pldm.setSingle_weight(single_wgt);
+//		pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//		pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+			pldm.setDesign_quantity(1);
+			pldm.setDesign_weight(single_wgt); // 实物单重
+			pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+
+			pldm.setCreate_man_name(userName);
+			pldm.setCreate_time(new Date());
+			pldm.setIs_finished(0L);
+			pldm.setReserve_1(lpp.get(0).getProduce_no());
+			this.getMapper(PlnAnnealDsnMainMapper.class).insert(pldm);
+		}
+
+		// 倒叙取一条拼料信息
+		List<PlnAnnealDsnMultinfo> lpdmM = this.getMapper(PlnAnnealDsnMultinfoMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		long DsnNo = 1;
+		if (lpdmM != null && lpdmM.size() > 0) {
+			DsnNo = lpdmM.get(0).getSerial_no() + 1;
+		}
+
+		// -----------------写拼料信息-----------------------------
+		PlnAnnealDsnMultinfo pldmc = new PlnAnnealDsnMultinfo();
+		pldmc.setSerial_no(DsnNo);
+		pldmc.setAn_design_no(pldm.getAn_design_no());
+//		pldmc.setAn_seq(1);
+//		pldmc.setSeg_seq(1);
+		pldmc.setOrder_no(lpp.get(0).getOrder_no());
+		pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pldmc.setThick(lpp.get(0).getThick());
+		pldmc.setWidth(width);
+		pldmc.setLength(lpp.get(0).getLength());
+		pldmc.setDiameter_inn(lpp.get(0).getDiameter_inn());
+		pldmc.setDiameter_out(lpp.get(0).getDiameter_out());
+		pldmc.setWeight(single_wgt);
+//		pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//		pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pldmc.setSub_seq(1);
+		this.getMapper(PlnAnnealDsnMultinfoMapper.class).insert(pldmc);
+
+		// 生成虚拟物料信息倒叙去一条
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		long PMDNo = 1;
+		if (lpmd != null && lpmd.size() > 0) {
+			PMDNo = lpmd.get(0).getSerial_no() + 1;
+		}
+		int objectnoVtNo = this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate) + 1;
+
+		List<PlnMaterielDetail> detail = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			detail = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		// 虚拟母卷计划内的才需要新增或者修改
+		PlnMaterielDetail pmdM = new PlnMaterielDetail();
+		if (Utils.isNotEmpty(detail)) {
+			pmdM = detail.get(0);
+			pmdM.setStatus("0PDC10");
+			if (Utils.isNotEmpty(object_no)) {
+				pmdM.setObject_no(object_no);
+			}
+			pmdM.setNext_dsn_process_code(processpoint.anneal_code);
+			pmdM.setNext_process_code(processpoint.anneal_code);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setAn_design_no(pldm.getAn_design_no());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			// 存在大批量脱单的时候,卷子虚拟物料信息的卷号信息没被清空,所以再次挂单的时候,选择直接更新订单号:
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdM);
+		} else {
+			pmdM.setSerial_no(PMDNo++);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setObject_no_vt(object_no_vt == null ? sDate + String.format("%06d", objectnoVtNo++) : object_no_vt);
+			pmdM.setObject_no(object_no);
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setPline_code(lpp.get(0).getPline_code());
+			pmdM.setStatus("0PDC10");
+			pmdM.setIs_finished("0");
+//			pmdM.setPrev_dsn_process_code(prev_process_code);
+//			pmdM.setPrev_process_code(prev_process_code);
+			pmdM.setNext_dsn_process_code(processpoint.anneal_code);
+			pmdM.setNext_process_code(processpoint.anneal_code);
+			pmdM.setIs_prev_dsn_finished("0");// 母卷:0
+			pmdM.setCreate_design_no(pldm.getAn_design_no());
+			pmdM.setCreate_process_code(processpoint.anneal_code);
+			pmdM.setIs_mat(1);// 母卷:1
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setAn_design_no(pldm.getAn_design_no());
+			pmdM.setIs_multi("0");
+			pmdM.setSteel_code(lpp.get(0).getSteel_code());
+			// 母卷厚度、宽度使用计划值
+			pmdM.setWidth(width);
+			pmdM.setThick(lpp.get(0).getThick());
+			pmdM.setLength(lpp.get(0).getLength());
+			pmdM.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pmdM.setDiameter_out(lpp.get(0).getDiameter_out());
+			pmdM.setSingle_weight(single_wgt);
+			pmdM.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdM.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdM.setOrd_flg("1");
+			pmdM.setCreate_man_name(userName);
+			pmdM.setCreate_time(new Date());
+			pmdM.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdM.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdM);
+		}
+
+		// 根据累加值,建立坯料设计订单组成表
+		long pdoiNo = 1;
+		List<PlnDsnOrderInfo> lpdoiq = this.getMapper(PlnDsnOrderInfoMapper.class).findWithCondition(null, "",
+				" serial_no desc", 0, 1);
+		if (lpdoiq != null && lpdoiq.size() > 0) {
+			pdoiNo = lpdoiq.get(0).getSerial_no() + 1;
+		}
+
+		// 建立虚拟子卷信息
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setSerial_no(PMDNo++);
+		pmdc.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo++));
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setStatus("0PDC10");
+		pmdc.setIs_finished("0");
+		pmdc.setPrev_dsn_process_code(processpoint.anneal_code);
+		pmdc.setPrev_process_code(processpoint.anneal_code);
+		pmdc.setIs_prev_dsn_finished("1");// 母卷:0
+		pmdc.setCreate_design_no(pldm.getAn_design_no());
+		pmdc.setCreate_process_code(processpoint.anneal_code);
+		pmdc.setIs_mat(0);// 母卷:1
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pmdc.setAn_design_no(pldm.getAn_design_no());
+		pmdc.setMat_object_no_vt(pmdM.getObject_no_vt());
+		pmdc.setIs_multi("0");
+		pmdc.setSteel_code(lpp.get(0).getSteel_code());
+		pmdc.setWidth(pldmc.getWidth());
+		pmdc.setThick(pldmc.getThick());
+		pmdc.setLength(pldmc.getLength());
+		pmdc.setDiameter_inn(pldmc.getDiameter_inn());
+		pmdc.setDiameter_out(pldmc.getDiameter_out());
+
+		// 母卷实重* 子卷计划宽度/母卷实宽
+		pmdc.setSingle_weight(single_wgt);
+		pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pmdc.setOrd_flg("1");
+		pmdc.setCreate_man_name(userName);
+		pmdc.setCreate_time(new Date());
+		pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		pmdc.setPk_ask_code(lpp.get(0).getPk_ask_code());
+		pmdc.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+		this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+		DesignInfo temp = new DesignInfo();
+		temp.setObject_no_vt(pmdc.getObject_no_vt());
+		temp.setSingle_wgt(pmdc.getSingle_weight());
+		result.add(temp);
+
+		// 订单组成信息
+		PlnDsnOrderInfo pdoi = new PlnDsnOrderInfo();
+		pdoi.setDesign_no(pldm.getAn_design_no());
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		pdoi.setWeight_in_one(single_wgt);
+		pdoi.setQuantity_in_one(1);
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		if (obv_flg) {
+			this.getMapper(PlnDsnOrderInfoMapper.class).doUpdate(pdoi);
+		} else {
+			pdoi.setSerial_no(pdoiNo++);
+			pdoi.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnDsnOrderInfoMapper.class).insert(pdoi);
+		}
+
+//		// 修改生产订单进程表[PLN_PRODORDER_STATISTIC] 
+//		PlnProdorderStatistic pps=new PlnProdorderStatistic();
+//		pps.setProd_order_no(lpp.get(0).getProd_order_no());
+//		if (proc_times ==1 ) {
+//			pps.setAn_dsn(single_wgt);
+//			pps.setAn_dsn_cnt(1);
+//			pps.setMat_an_dsn(single_wgt); // 实物重量
+//			pps.setMat_an_dsn_cnt(1); 
+//			pps.setAn_undsn(single_wgt==null?null:(-single_wgt)); //实物重量
+//		}else {
+//			pps.setAn_dsn2(single_wgt);
+//			pps.setAn_dsn_cnt2(1);
+//			pps.setMat_an_dsn2(single_wgt); // 实物重量
+//			pps.setMat_an_dsn_cnt2(1); 
+//			pps.setAn_undsn2(single_wgt==null?null:(-single_wgt)); //实物重量
+//		}
+//		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//		
+//		// 修改订单进程表[PLN_ORDER_STATISTIC]
+//		PlnOrderStatistic pos=new PlnOrderStatistic();
+//		pos.setOrder_no(lpp.get(0).getOrder_no());
+//		if (proc_times ==1 ) {
+//			pos.setAn_dsn(single_wgt);
+//			pos.setAn_dsn_cnt(1);
+//			pos.setMat_an_dsn(single_wgt); // 实物重量
+//			pos.setMat_an_dsn_cnt(1); 
+//			pos.setAn_undsn(single_wgt==null?null:(-single_wgt)); // 实物重量
+//		}else {
+//			pos.setAn_dsn2(single_wgt);
+//			pos.setAn_dsn_cnt2(1);
+//			pos.setMat_an_dsn2(single_wgt); // 实物重量
+//			pos.setMat_an_dsn_cnt2(1); 
+//			pos.setAn_undsn2(single_wgt==null?null:(-single_wgt)); // 实物重量
+//		}
+//		this.getMapper(PlnOrderStatisticMapper.class).doUpdateAnPlaned(pos);
+		return result;
+	}
+
+	/**
+	 * 酸洗设计信息
+	 * 
+	 * @param prod_order_no     生产订单号
+	 * @param object_no_vt      虚拟母卷号
+	 * @param prev_process_code 上道工序
+	 * @param next_process_code 下道工序
+	 * @param proc_times        生成主表设计信息、拼料信息、虚拟物料信息、订单组成信息
+	 * @return
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public List<DesignInfo> PicklePlanDsn(String prod_order_no, String object_no_vt, String prev_process_code,
+			String next_process_code, Double single_wgt, String object_no, Integer proc_times) {
+
+		List<DesignInfo> result = new ArrayList<>();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		Double width = 0d;
+
+		boolean obv_flg = false;
+		// 获取虚拟母卷信息
+		List<PlnMaterielDetail> pmdel = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			pmdel = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		if (Utils.isNotEmpty(pmdel) && pmdel.get(0).getPc_design_no() != null) {
+			obv_flg = true;
+		}
+		// 获取订单信息
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(prod_order_no);
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		if (Utils.isNotEmpty(pmdel)) {
+			width = pmdel.get(0).getWidth();
+		} else {
+			width = lpp.get(0).getWidth();
+		}
+		// 计算所需原料卷数量
+//		int db_cnt = (new BigDecimal(lpp.get(0).getEstimate_weight()).setScale(0, BigDecimal.ROUND_HALF_UP)).intValue() == 0 ? 1:(new BigDecimal(lpp.get(0).getEstimate_weight()).setScale(0, BigDecimal.ROUND_HALF_UP)).intValue();
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnPickleDsnMain pldm = new PlnPickleDsnMain();
+
+		// 设计信息存在就修改设计主表
+		if (obv_flg) {
+			// 设计主表不变
+			pldm.setThick(lpp.get(0).getThick());
+			pldm.setWidth(width);
+			pldm.setLength(lpp.get(0).getLength());
+			// 删除原有拼料信息
+			pldm.setPc_design_no(pmdel.get(0).getPc_design_no());
+			this.getMapper(PlnPickleDsnMultinfoMapper.class).doDelete(pmdel.get(0).getPc_design_no());
+		} else {
+			// 保存设计主表数据: 酸洗设计号:DPC+YYMMDD+6流水号
+			List<PlnPickleDsnMain> lpdmNo = this.getMapper(PlnPickleDsnMainMapper.class).findWithCondition(null, "",
+					" serial_no desc ", 0, 1);
+			pldm.setSerial_no(1l);
+			pldm.setPc_design_no("DPC" + sDate + String.format("%06d", 1));
+			if (lpdmNo != null && lpdmNo.size() > 0) {
+				pldm.setSerial_no(lpdmNo.get(0).getSerial_no() + 1);
+				if (sDate.equals(lpdmNo.get(0).getPc_design_no().substring(3, 9))) {
+					pldm.setPc_design_no("DPC" + sDate + String.format("%06d",
+							Integer.parseInt(lpdmNo.get(0).getPc_design_no().substring(9, 15)) + 1));
+				}
+			}
+
+			// 订单信息
+			pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldm.setOrder_no(lpp.get(0).getOrder_no());
+			pldm.setPline_code(lpp.get(0).getPline_code());
+			pldm.setSteel_code(lpp.get(0).getSteel_code());
+			String isMulti = "0";// 是否拼料 根据订单数判断,多个订单填1,否则填0
+			pldm.setIs_multi(isMulti);
+			pldm.setThick(lpp.get(0).getThick());
+			pldm.setWidth(width);
+			pldm.setLength(lpp.get(0).getLength());
+			pldm.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pldm.setDiameter_out(lpp.get(0).getDiameter_out());
+			pldm.setSingle_weight(single_wgt);
+//		pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//		pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+			pldm.setDesign_quantity(1);
+			pldm.setDesign_weight(single_wgt); // 实物单重
+			pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+//			pldm.setSub_count(1L);
+			pldm.setCreate_man_name(userName);
+			pldm.setCreate_time(new Date());
+			pldm.setIs_finished(0L);
+			pldm.setReserve_1(lpp.get(0).getProduce_no());
+			this.getMapper(PlnPickleDsnMainMapper.class).insert(pldm);
+		}
+
+		// 倒叙取一条拼料信息
+		List<PlnPickleDsnMultinfo> lpdmM = this.getMapper(PlnPickleDsnMultinfoMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		long DsnNo = 1;
+		if (lpdmM != null && lpdmM.size() > 0) {
+			DsnNo = lpdmM.get(0).getSerial_no() + 1;
+		}
+
+		// -----------------写拼料信息-----------------------------
+		PlnPickleDsnMultinfo pldmc = new PlnPickleDsnMultinfo();
+		pldmc.setSerial_no(DsnNo);
+		pldmc.setPc_design_no(pldm.getPc_design_no());
+		pldmc.setSub_seq(1);
+		pldmc.setOrder_no(lpp.get(0).getOrder_no());
+		pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pldmc.setThick(lpp.get(0).getThick());
+		pldmc.setWidth(width);
+		pldmc.setLength(lpp.get(0).getLength());
+		pldmc.setDiameter_inn(lpp.get(0).getDiameter_inn());
+		pldmc.setDiameter_out(lpp.get(0).getDiameter_out());
+		pldmc.setWeight(single_wgt);
+//		pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//		pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pldmc.setSub_seq(1);
+		this.getMapper(PlnPickleDsnMultinfoMapper.class).insert(pldmc);
+
+		// 生成虚拟物料信息倒叙去一条
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		long PMDNo = 1;
+		if (lpmd != null && lpmd.size() > 0) {
+			PMDNo = lpmd.get(0).getSerial_no() + 1;
+		}
+		int objectnoVtNo = this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate) + 1;
+
+		List<PlnMaterielDetail> detail = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			detail = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		// 虚拟母卷计划内的才需要新增或者修改
+		PlnMaterielDetail pmdM = new PlnMaterielDetail();
+		if (Utils.isNotEmpty(detail)) {
+			pmdM = detail.get(0);
+			pmdM.setStatus("0PDF10");
+			if (Utils.isNotEmpty(object_no)) {
+				pmdM.setObject_no(object_no);
+			}
+			pmdM.setNext_dsn_process_code(processpoint.pickle_code);
+			pmdM.setNext_process_code(processpoint.pickle_code);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setPc_design_no(pldm.getPc_design_no());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			// 存在大批量脱单的时候,卷子虚拟物料信息的卷号信息没被清空,所以再次挂单的时候,选择直接更新订单号:
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdM);
+		} else {
+			pmdM.setSerial_no(PMDNo++);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setObject_no_vt(object_no_vt == null ? sDate + String.format("%06d", objectnoVtNo++) : object_no_vt);
+			pmdM.setObject_no(object_no);
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setPline_code(lpp.get(0).getPline_code());
+			pmdM.setStatus("0PDF10");
+			pmdM.setIs_finished("0");
+//			pmdM.setPrev_dsn_process_code(prev_process_code);
+//			pmdM.setPrev_process_code(prev_process_code);
+			pmdM.setNext_dsn_process_code(processpoint.pickle_code);
+			pmdM.setNext_process_code(processpoint.pickle_code);
+			pmdM.setIs_prev_dsn_finished("0");// 母卷:0
+			pmdM.setCreate_design_no(pldm.getPc_design_no());
+			pmdM.setCreate_process_code(processpoint.pickle_code);
+			pmdM.setIs_mat(1);// 母卷:1
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setPc_design_no(pldm.getPc_design_no());
+			pmdM.setIs_multi("0");
+			pmdM.setSteel_code(lpp.get(0).getSteel_code());
+			// 母卷厚度、宽度使用计划值
+			pmdM.setWidth(width);
+			pmdM.setThick(lpp.get(0).getThick());
+			pmdM.setLength(lpp.get(0).getLength());
+			pmdM.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pmdM.setDiameter_out(lpp.get(0).getDiameter_out());
+			pmdM.setSingle_weight(single_wgt);
+			pmdM.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdM.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdM.setOrd_flg("1");
+			pmdM.setCreate_man_name(userName);
+			pmdM.setCreate_time(new Date());
+			pmdM.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdM.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdM);
+		}
+
+		// 根据累加值,建立坯料设计订单组成表
+		long pdoiNo = 1;
+		List<PlnDsnOrderInfo> lpdoiq = this.getMapper(PlnDsnOrderInfoMapper.class).findWithCondition(null, "",
+				" serial_no desc", 0, 1);
+		if (lpdoiq != null && lpdoiq.size() > 0) {
+			pdoiNo = lpdoiq.get(0).getSerial_no() + 1;
+		}
+
+		// 建立虚拟子卷信息
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setSerial_no(PMDNo++);
+		pmdc.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo++));
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setStatus("0PDF10");
+		pmdc.setIs_finished("0");
+		pmdc.setPrev_dsn_process_code(processpoint.pickle_code);
+		pmdc.setPrev_process_code(processpoint.pickle_code);
+		pmdc.setIs_prev_dsn_finished("1");// 母卷:0
+		pmdc.setCreate_design_no(pldm.getPc_design_no());
+		pmdc.setCreate_process_code(processpoint.pickle_code);
+		pmdc.setIs_mat(0);// 母卷:1
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pmdc.setPc_design_no(pldm.getPc_design_no());
+		pmdc.setMat_object_no_vt(pmdM.getObject_no_vt());
+		pmdc.setIs_multi("0");
+		pmdc.setSteel_code(lpp.get(0).getSteel_code());
+		pmdc.setWidth(pldmc.getWidth());
+		pmdc.setThick(pldmc.getThick());
+		pmdc.setLength(pldmc.getLength());
+		pmdc.setDiameter_inn(pldmc.getDiameter_inn());
+		pmdc.setDiameter_out(pldmc.getDiameter_out());
+		pmdc.setSub_count(1);
+		// 母卷实重* 子卷计划宽度/母卷实宽
+		pmdc.setSingle_weight(single_wgt);
+		pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pmdc.setOrd_flg("1");
+		pmdc.setCreate_man_name(userName);
+		pmdc.setCreate_time(new Date());
+		pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		pmdc.setPk_ask_code(lpp.get(0).getPk_ask_code());
+		pmdc.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+		this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+		DesignInfo temp = new DesignInfo();
+		temp.setObject_no_vt(pmdc.getObject_no_vt());
+		temp.setSingle_wgt(pmdc.getSingle_weight());
+		result.add(temp);
+
+		// 订单组成信息
+		PlnDsnOrderInfo pdoi = new PlnDsnOrderInfo();
+		pdoi.setDesign_no(pldm.getPc_design_no());
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		pdoi.setWeight_in_one(single_wgt);
+		pdoi.setQuantity_in_one(1);
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		if (obv_flg) {
+			this.getMapper(PlnDsnOrderInfoMapper.class).doUpdate(pdoi);
+		} else {
+			pdoi.setSerial_no(pdoiNo++);
+			pdoi.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnDsnOrderInfoMapper.class).insert(pdoi);
+		}
+		return result;
+	}
+
+	/**
+	 * 分条设计信息
+	 * 
+	 * @param prod_order_no     生产订单号
+	 * @param object_no_vt      虚拟母卷号
+	 * @param prev_process_code 上道工序
+	 * @param next_process_code 下道工序 生成主表设计信息、拼料信息、虚拟物料信息、订单组成信息
+	 *                          如果传入的虚拟物料信息存在设计号修改设计信息
+	 *                          根据订单的厚度规格默认纵剪机台
+	 *            3mm及以上默认大纵剪 else 小纵剪
+	 *                      
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public List<DesignInfo> LengthwisePlanDsn(String prod_order_no, String object_no_vt, String prev_process_code,
+			String next_process_code, Double single_wgt, String object_no, Integer proc_times) throws Exception {
+
+		List<DesignInfo> result = new ArrayList<>();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		// 订单信息
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(prod_order_no);
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+
+		// 根据传入的生产订单号,读取生产订单对应的生产加工表[PLN_PROCESS_PLAN]
+		PlnProcessPlan ppp = new PlnProcessPlan();
+		ppp.setOrder_no(lpp.get(0).getOrder_no());
+		ppp.setValid_flag("1");
+		List<PlnProcessPlan> lppp = this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, null,
+				" cut_order_no ", 0, 0);
+		if (lppp == null || lppp.size() == 0) {
+			throw new Exception("未找到生产订单[" + ppp.getOrder_no() + "]对应的生产加工信息");
+		}
+
+		boolean obv_flg = false;
+		// 母卷虚拟物料数据
+		List<PlnMaterielDetail> detail = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			detail = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		if (Utils.isNotEmpty(detail) && detail.get(0).getLw_design_no() != null) {
+			obv_flg = true;
+		}
+		double sWidth = 0;
+		int iCutCount = 0;
+		for (PlnProcessPlan pppc : lppp) {
+			sWidth += pppc.getWidth().doubleValue() * (pppc.getCut_num() == null ? 1 : pppc.getCut_num().intValue());
+			iCutCount += (pppc.getCut_num() == null ? 1 : pppc.getCut_num().intValue());
+		}
+		PlnLengthwiseDsnMain pldm = new PlnLengthwiseDsnMain();
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		// 设计信息存在就修改设计主表(加工计划相关的信息)
+		if (obv_flg) {
+			pldm.setLw_design_no(detail.get(0).getLw_design_no());
+			if (lppp.size() == 1) {
+				pldm.setThick(lppp.get(0).getThick());
+				pldm.setWidth(lppp.get(0).getWidth());
+				pldm.setLength(lppp.get(0).getLength());
+			}
+			pldm.setSingle_weight(single_wgt);
+			pldm.setDesign_weight(single_wgt);
+			pldm.setMat_single_weight(single_wgt);
+			pldm.setReserve_1(lppp.get(0).getProduce_no());
+			pldm.setProd_rate(sWidth / lppp.get(0).getMat_width().doubleValue());
+			pldm.setSub_count(iCutCount);
+			pldm.setMat_thick(lppp.get(0).getThick());
+			pldm.setMat_length(lppp.get(0).getLength());
+			pldm.setMachine_code(lpp.get(0).getThick()>=3?"M0002":"M0001");
+			if (!"1".equals(lpp.get(0).getOrder_nature()) && !"3".equals(lpp.get(0).getOrder_nature())
+					&& "2".equals(lppp.get(0).getCut_type())) {
+				pldm.setCut_style(lppp.get(0).getCut_style());
+			}
+			pldm.setCrosscut_style(lppp.get(0).getCrosscut_style());
+			this.getMapper(PlnLengthwiseDsnMainMapper.class).updateDesInfoByNo(pldm);
+			// 删除原有拼料信息
+			this.getMapper(PlnLengthwiseDsnMultinfoMapper.class).doDelete(detail.get(0).getLw_design_no());
+		} else {
+			// 保存设计主表数据: 纵剪设计号:DLW+YYMMDD+6流水号
+			List<PlnLengthwiseDsnMain> lpdmNo = this.getMapper(PlnLengthwiseDsnMainMapper.class).findWithCondition(null,
+					"", " serial_no desc ", 0, 1);
+			pldm.setSerial_no(1l);
+			pldm.setLw_design_no("DLW" + sDate + String.format("%06d", 1));
+			if (lpdmNo != null && lpdmNo.size() > 0) {
+				pldm.setSerial_no(lpdmNo.get(0).getSerial_no() + 1);
+				if (sDate.equals(lpdmNo.get(0).getLw_design_no().substring(3, 9))) {
+					pldm.setLw_design_no("DLW" + sDate + String.format("%06d",
+							Integer.parseInt(lpdmNo.get(0).getLw_design_no().substring(9, 15)) + 1));
+				}
+			}
+
+			pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldm.setOrder_no(lpp.get(0).getOrder_no());
+			pldm.setPline_code(lpp.get(0).getPline_code());
+			pldm.setSteel_code(lpp.get(0).getSteel_code());
+			
+			pldm.setMachine_code(lpp.get(0).getThick()>=3?"M0002":"M0001");
+			
+			String isMulti = "0";// 是否拼料 根据订单数判断,多个订单填1,否则填0
+			pldm.setIs_multi(isMulti);
+			pldm.setMat_diameter_inn(lpp.get(0).getDiameter_inn());
+			pldm.setMat_diameter_out(lpp.get(0).getDiameter_out());
+			pldm.setMat_single_weight(single_wgt);
+			pldm.setMat_width(lpp.get(0).getWidth());
+			pldm.setProd_rate(sWidth / lppp.get(0).getMat_width().doubleValue());
+			pldm.setSub_count(iCutCount);
+			pldm.setMat_thick(lppp.get(0).getThick());
+			pldm.setMat_length(lppp.get(0).getLength());
+			pldm.setSingle_weight(single_wgt);
+			if (lppp.size() == 1) {
+				pldm.setThick(lppp.get(0).getThick());
+				pldm.setWidth(lppp.get(0).getWidth());
+				pldm.setLength(lppp.get(0).getLength());
+				pldm.setDiameter_inn(lpp.get(0).getDiameter_inn());
+				pldm.setDiameter_out(lpp.get(0).getDiameter_out());
+			}
+			pldm.setSingle_weight(single_wgt);
+			if (!"1".equals(lpp.get(0).getOrder_nature()) && !"3".equals(lpp.get(0).getOrder_nature())
+					&& "2".equals(lppp.get(0).getCut_type())) {
+				pldm.setCut_style(lppp.get(0).getCut_style());
+			}
+
+			pldm.setCrosscut_style(lppp.get(0).getCrosscut_style());
+			pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+			pldm.setDesign_quantity(1);
+			pldm.setDesign_weight(single_wgt);
+
+			pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pldm.setCreate_man_name(userName);
+			pldm.setCreate_time(new Date());
+			pldm.setIs_finished(0);
+			pldm.setReserve_1(lppp.get(0).getProduce_no());
+			this.getMapper(PlnLengthwiseDsnMainMapper.class).insert(pldm);
+		}
+		// 倒叙取一条
+		List<PlnLengthwiseDsnMultinfo> lpdmM = this.getMapper(PlnLengthwiseDsnMultinfoMapper.class)
+				.findWithCondition(null, "", " serial_no desc ", 0, 1);
+		long DsnNo = 1;
+		if (lpdmM != null && lpdmM.size() > 0) {
+			DsnNo = lpdmM.get(0).getSerial_no() + 1;
+		}
+
+		int iCrosscut = 0;
+		if (Utils.isNotEmpty(lppp.get(0).getCrosscut_style()) && !"1".equals(lppp.get(0).getCrosscut_style())) {
+			iCrosscut = Integer.parseInt(lppp.get(0).getCrosscut_style());
+		} else {
+			iCrosscut = 1;
+		}
+
+		int isubSeq = 1;
+		for (int idx_hq = 1; idx_hq <= iCrosscut; idx_hq++) {
+			int V_分条序号 = 1;
+			for (PlnProcessPlan pppc : lppp) {
+				for (int idx_sub = 1; idx_sub <= (pppc.getCut_num() == null ? 1
+						: pppc.getCut_num().intValue()); idx_sub++) {
+					// 其中:LW_SEQ 分条序号=V_分条序号; SEG_SEQ 分段序号=idx_hq;
+					// -----------------写拼料信息-----------------------------
+					PlnLengthwiseDsnMultinfo pldmc = new PlnLengthwiseDsnMultinfo();
+					pldmc.setSerial_no(DsnNo++);
+					pldmc.setLw_design_no(pldm.getLw_design_no());
+					pldmc.setLw_seq(V_分条序号++);
+					pldmc.setSeg_seq(idx_hq);
+					pldmc.setOrder_no(lpp.get(0).getOrder_no());
+					pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+					pldmc.setThick(pppc.getThick());
+					pldmc.setWidth(pppc.getWidth());
+					pldmc.setLength(pppc.getLength());
+					pldmc.setDiameter_inn(pppc.getDiameter_inn());
+					pldmc.setDiameter_out(pppc.getDiameter_out());
+					pldmc.setWeight(pldm.getSingle_weight().doubleValue() * pppc.getWidth().doubleValue()
+							/ ((pppc.getWidth_total() == null ? pppc.getWidth().doubleValue()
+									: pppc.getWidth_total().doubleValue())
+									* Integer.parseInt(pldm.getCrosscut_style())));
+					pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+					pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+					pldmc.setSub_seq(isubSeq++);
+					pldmc.setPlan_no(pppc.getPlan_no());
+
+					if (pldmc.getSub_seq() >= 1000 || pldmc.getLw_seq() >= 1000) {
+						throw new Exception(
+								"子卷序号[" + pldmc.getSub_seq() + "]和分条序号[" + pldmc.getLw_seq() + "]不在设备限制范围内!");
+					}
+					this.getMapper(PlnLengthwiseDsnMultinfoMapper.class).insert(pldmc);
+				}
+			}
+		}
+
+		// 建立虚拟物料表信息
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null,
+				" serial_no desc ", 0, 1);
+		long PMDNo = lpmd == null ? 1 : (lpmd.size() == 0 ? 1 : (lpmd.get(0).getSerial_no() + 1));
+		int objectnoVtNo = this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate) + 1;
+
+		// 根据累加值,建立坯料设计订单组成表
+		long pdoiNo = 1;
+		List<PlnDsnOrderInfo> lpdoiq = this.getMapper(PlnDsnOrderInfoMapper.class).findWithCondition(null, "",
+				" serial_no desc", 0, 1);
+		if (lpdoiq != null && lpdoiq.size() > 0) {
+			pdoiNo = lpdoiq.get(0).getSerial_no() + 1;
+		}
+
+		PlnMaterielDetail pmdM = new PlnMaterielDetail();
+		if (Utils.isNotEmpty(detail)) {
+			pmdM = detail.get(0);
+			pmdM.setStatus("0PDA10");
+			pmdM.setProc_repeat_index(proc_times);
+			if (Utils.isNotEmpty(object_no)) {
+				pmdM.setObject_no(object_no);
+			}
+			pmdM.setNext_dsn_process_code(processpoint.slitting_code);
+			pmdM.setNext_process_code(processpoint.slitting_code);
+			pmdM.setLw_design_no(pldm.getLw_design_no());
+			pmdM.setMachine_code(lpp.get(0).getThick()>=3?"M0002":"M0001");
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			// 存在大批量脱单的时候,卷子虚拟物料信息的卷号信息没被清空,所以再次挂单的时候,选择直接更新订单号:
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdM);
+		} else {
+			pmdM.setMachine_code(lpp.get(0).getThick()>=3?"M0002":"M0001");
+			pmdM.setSerial_no(PMDNo++);
+			pmdM.setObject_no(object_no);
+			pmdM.setObject_no_vt(object_no_vt == null ? sDate + String.format("%06d", objectnoVtNo++) : object_no_vt);
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setPline_code(lpp.get(0).getPline_code());
+			pmdM.setStatus("0PDA10");
+			pmdM.setIs_finished("0");
+			pmdM.setProc_repeat_index(proc_times);
+			// pmdM.setPrev_dsn_process_code(prev_process_code);
+			// pmdM.setPrev_process_code(prev_process_code);
+			pmdM.setNext_dsn_process_code(processpoint.slitting_code);
+			pmdM.setNext_process_code(processpoint.slitting_code);
+			pmdM.setIs_prev_dsn_finished("0");// 母卷:0
+			pmdM.setCreate_design_no(pldm.getLw_design_no());
+			pmdM.setCreate_process_code(processpoint.slitting_code);
+			pmdM.setIs_mat(1);// 母卷:1
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setLw_design_no(pldm.getLw_design_no());
+			pmdM.setIs_multi("0");
+			pmdM.setSteel_code(lpp.get(0).getSteel_code());
+
+			// 母卷厚度、宽度使用计划值
+			pmdM.setWidth(lpp.get(0).getWidth());
+			pmdM.setThick(lpp.get(0).getThick());
+			pmdM.setLength(lpp.get(0).getLength());
+			pmdM.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pmdM.setDiameter_out(lpp.get(0).getDiameter_out());
+			pmdM.setSingle_weight(single_wgt);
+			pmdM.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdM.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdM.setOrd_flg("1");
+			pmdM.setCreate_man_name(userName);
+			pmdM.setCreate_time(new Date());
+			pmdM.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdM.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdM);
+		}
+
+		// 根据纵剪设计号,查找 纵剪拼料信息表[PLN_LENGTHWISE_DSN_MULTINFO],循环读取每一子卷序号【SUB_SEQ】
+		PlnLengthwiseDsnMultinfo multinfo = new PlnLengthwiseDsnMultinfo();
+		multinfo.setLw_design_no(pldm.getLw_design_no());
+		List<PlnLengthwiseDsnMultinfo> lpldm = this.getMapper(PlnLengthwiseDsnMultinfoMapper.class).find(multinfo, 0,
+				0);
+		double v_total_wgt = 0;
+		int v_total_num = 0;
+		// 2018-06-19 从加工计划取子卷宽度之和
+		PlnProcessPlan ppplan = new PlnProcessPlan();
+		double total_width = 0;
+		ppplan.setProduce_no(lpp.get(0).getProduce_no());
+		ppplan.setValid_flag("1");
+		List<PlnProcessPlan> pprocess = this.getMapper(PlnProcessPlanMapper.class).find(ppplan, 0, 0);
+		if (pprocess == null || pprocess.size() == 0) {
+			throw new Exception("查找订单[" + lpp.get(0).getOrder_no() + "]的加工计划失败!");
+		} else {
+			for (PlnProcessPlan plnprocessplan : pprocess) {
+				total_width += plnprocessplan.getWidth().doubleValue() * plnprocessplan.getCut_num();
+			}
+			if (total_width < 0.001) {
+				throw new Exception("订单[" + lpp.get(0).getOrder_no() + "]的加工计划子卷宽度之和有误,不能小于0!");
+			}
+		}
+		for (PlnLengthwiseDsnMultinfo pldmc : lpldm) {
+			// 建立虚拟子卷信息
+			PlnMaterielDetail pmdc = new PlnMaterielDetail();
+			pmdc.setSerial_no(PMDNo++);
+			pmdc.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo++));
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setStatus("0PDA10");
+			pmdc.setIs_finished("0");
+			pmdc.setPrev_dsn_process_code(processpoint.slitting_code);
+			pmdc.setPrev_process_code(processpoint.slitting_code);
+			pmdc.setCreate_design_no(pldm.getLw_design_no());
+			pmdc.setCreate_process_code(processpoint.slitting_code);
+			pmdc.setIs_mat(0);// 母卷:1
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdc.setLw_design_no(pldm.getLw_design_no());
+			pmdc.setMat_object_no_vt(pmdM.getObject_no_vt());
+			pmdc.setIs_multi("0");
+			pmdc.setSteel_code(lpp.get(0).getSteel_code());
+			pmdc.setWidth(pldmc.getWidth());
+			pmdc.setThick(pldmc.getThick());
+			pmdc.setLength(pldmc.getLength());
+			pmdc.setDiameter_inn(pldmc.getDiameter_inn());
+			pmdc.setDiameter_out(pldmc.getDiameter_out());
+
+			// 母卷实重* 子卷计划宽度/母卷实宽
+//			pmdc.setSingle_weight(pmdM.getSingle_weight().doubleValue()*pldmc.getWidth().doubleValue()/(total_width*Integer.parseInt(lppp.get(0).getCrosscut_style())));
+			pmdc.setSingle_weight(new BigDecimal(pmdM.getSingle_weight().doubleValue() * pldmc.getWidth().doubleValue()
+					/ (total_width * Integer.parseInt(lppp.get(0).getCrosscut_style())))
+							.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+			pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdc.setOrd_flg("1");
+			pmdc.setCreate_man_name(userName);
+			pmdc.setCreate_time(new Date());
+			pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdc.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdc.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			pmdc.setPlan_no(pldmc.getPlan_no());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+			DesignInfo temp = new DesignInfo();
+			// 累加虚拟子卷重量,虚拟子卷个数
+			v_total_wgt += pmdc.getSingle_weight().doubleValue();
+			v_total_num += 1;
+			temp.setObject_no_vt(pmdc.getObject_no_vt());
+			temp.setSingle_wgt(pmdc.getSingle_weight());
+			result.add(temp);
+		}
+
+		PlnDsnOrderInfo pdoi = new PlnDsnOrderInfo();
+		pdoi.setDesign_no(pldm.getLw_design_no());
+		pdoi.setWeight_in_one(v_total_wgt);
+		pdoi.setQuantity_in_one(v_total_num);
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		if (obv_flg) {
+			this.getMapper(PlnDsnOrderInfoMapper.class).doUpdate(pdoi);
+		} else {
+			pdoi.setSerial_no(pdoiNo++);
+			pdoi.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnDsnOrderInfoMapper.class).insert(pdoi);
+		}
+
+//		//修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+//		PlnProdorderStatistic pps=new PlnProdorderStatistic();
+//		pps.setProd_order_no(lpp.get(0).getProd_order_no());
+//		pps.setLw_dsn(v_total_wgt);
+//		pps.setLw_dsn_cnt(v_total_num);
+//		pps.setMat_lw_dsn(single_wgt); // 实物重量
+//		pps.setMat_lw_dsn_cnt(1);
+//		pps.setLw_undsn(single_wgt == null ? null : (-single_wgt)); // 实物重量
+//		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//		
+//		
+//		//修改订单进程表[PLN_ORDER_STATISTIC]
+//		PlnOrderStatistic pos=new PlnOrderStatistic();
+//		pos.setOrder_no(lpp.get(0).getOrder_no());
+//		pos.setLw_dsn(v_total_wgt);
+//		pos.setLw_dsn_cnt(v_total_num);
+//		pos.setMat_lw_dsn(single_wgt); // 实物重量
+//		pos.setMat_lw_dsn_cnt(1); 
+//		pos.setLw_undsn(single_wgt==null?null:(-single_wgt)); // 实物重量
+//		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+		return result;
+	}
+
+	/**
+	 * 开平设计信息
+	 * 
+	 * @param prod_order_no     生产订单号
+	 * @param object_no_vt      虚拟母卷号
+	 * @param prev_process_code 上道工序
+	 * @param next_process_code 下道工序 生成主表设计信息、拼料信息、虚拟物料信息、订单组成信息
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public List<DesignInfo> CuttolengthPlanDsn(String prod_order_no, String object_no_vt, String prev_process_code,
+			String next_process_code, Double single_wgt, String object_no, Integer proc_times) throws Exception {
+		List<DesignInfo> result = new ArrayList<>();
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(prod_order_no);
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).findWithCondition(pp, "",
+				" create_time desc ", 0, 1);
+
+		// 读取基础配置 产线机组限制表
+		ComDsnPltlmt cdp = new ComDsnPltlmt();
+		cdp.setPlt("Y1");// 工厂
+		cdp.setPlt_line("Y1");// 产线
+		List<ComDsnPltlmt> lc = this.getMapper(ComDsnPltlmtMapper.class).find(cdp, 0, 0);
+		if (lc == null || lc.size() == 0) {
+			throw new Exception("未找到产线");
+		}
+		// 获取所有的限制条件
+		ClRestrict MachineRestrict = new ClRestrict(lc);
+
+		// 根据加工计划号 读取生产订单对应的生产加工表[PLN_PROCESS_PLAN]
+		PlnProcessPlan ppp = new PlnProcessPlan();
+		ppp.setProduce_no(lpp.get(0).getProduce_no());
+		ppp.setValid_flag("1");
+		List<PlnProcessPlan> lppp = this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, null,
+				" cut_order_no ", 0, 0);
+		if (lppp == null || lppp.size() == 0) {
+			throw new Exception("未找到生产订单[" + ppp.getOrder_no() + "]对应的生产加工信息");
+		}
+
+		double sWidth = 0,
+				// 每个规格下总堆垛数
+				allboxCount = 0,
+				// 重量上限
+				weightupper = 0,
+				// 临时-重量
+				weighttemp = 0,
+				// 单堆垛重量
+				V_singleWeight = 0,
+				// 单堆垛块数
+				boxCount,
+				// 该规格最后一堆,块数
+				V_lastbox_Count = 0;
+		// 总堆垛数/子板总数
+		int iCutCount = 0, allsubcount = 0;
+		// 加工计划号:单堆垛块数
+		Map<String, Double> boxCounts = new HashMap<String, Double>();
+		// 加工计划号:子堆垛数
+		Map<String, Double> ZddCount = new HashMap<String, Double>();
+		// 加工计划号:最后一堆.堆垛块数
+		Map<String, Double> Last_Count = new HashMap<String, Double>();
+		String cut_style = "";
+		for (PlnProcessPlan pppc : lppp) {
+			if (pppc.getMono_stack_max_weight() == null || pppc.getMono_stack_max_weight() == 0) {
+				weightupper = 99999;
+			} else {
+				weightupper = pppc.getMono_stack_max_weight();
+			}
+			if (MachineRestrict.lim_max_box_wgt == 0) {
+				weighttemp = 99999;
+			} else {
+				weighttemp = MachineRestrict.lim_max_box_wgt;
+			}
+			weightupper = weightupper > weighttemp ? weighttemp : weightupper;
+			// 如果销售加工计划传入了计划块数
+			if (pppc.getCut_num() != null && pppc.getCut_num() > 1) {
+				// 总堆垛数
+				allboxCount = Math.ceil(1.0 * pppc.getCut_num() * pppc.getThick() / MachineRestrict.lim_max_box_height);
+				// 单堆垛块数
+				boxCount = new BigDecimal(pppc.getCut_num() / allboxCount).setScale(0, BigDecimal.ROUND_HALF_UP)
+						.doubleValue();
+				// 单堆垛重量
+				V_singleWeight = boxCount * GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength());
+				if (V_singleWeight > weightupper) {
+					boxCount = Math
+							.ceil(weightupper / GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength()));
+					allboxCount = Math.ceil(pppc.getCut_num() / boxCount);
+				}
+				V_lastbox_Count = pppc.getCut_num() - (allboxCount - 1) * boxCount;
+				Last_Count.put(pppc.getPlan_no(), V_lastbox_Count);
+			} else {
+				// 子板重量
+				double weigth = GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength());
+				// 根据加工计划计算 堆垛总数= 向上取整(估算重量/单垛重量上限);
+				allboxCount = Math.ceil(single_wgt / weightupper);
+				// 根据 堆垛数 反推 单堆垛块数 =(四舍五入) [估算重量/总堆垛数/(7.85*(10^-6)*厚*宽*长)];
+				boxCount = new BigDecimal(single_wgt / allboxCount / weigth).setScale(0, BigDecimal.ROUND_HALF_UP)
+						.doubleValue();
+				// 如果 单堆垛块数 * 厚度 > 设备限制高度,则重新计算:
+				if (boxCount * pppc.getThick().doubleValue() > MachineRestrict.lim_max_box_height) {
+					// 单堆垛块数_临时= [四舍五入](设备限制高度/厚度);
+					boxCount = new BigDecimal(MachineRestrict.lim_max_box_height / pppc.getThick())
+							.setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();
+					// 堆垛总数 = (向上取整)[估算重量/(7.85*(10^-6)*厚*宽*长)* 单堆垛块数_临时];
+					allboxCount = Math.ceil(single_wgt / (weigth * boxCount));
+					// 单堆垛块数 =(四舍五入) [估算重量/总堆垛数/(7.85*(10^-6)*厚*宽*长)];
+					boxCount = new BigDecimal(single_wgt / allboxCount / weigth).setScale(0, BigDecimal.ROUND_HALF_UP)
+							.doubleValue();
+				}
+			}
+			sWidth += pppc.getWidth().doubleValue() * allboxCount * boxCount;
+			allsubcount += allboxCount * boxCount;
+			iCutCount += allboxCount;
+			boxCounts.put(pppc.getPlan_no(), boxCount);
+			ZddCount.put(pppc.getPlan_no(), allboxCount);
+			cut_style += allboxCount + "*" + boxCount + "*";
+		}
+
+		boolean obv_flg = false;
+		// 母卷虚拟物料数据
+		List<PlnMaterielDetail> detail = null;
+		if (Utils.isNotEmpty(object_no_vt)) {
+			detail = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = 0", null, 0, 1);
+		}
+
+		if (Utils.isNotEmpty(detail) && detail.get(0).getCl_design_no() != null) {
+			obv_flg = true;
+		}
+
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnCuttolengthDsnMain pldm = new PlnCuttolengthDsnMain();
+
+		// 设计信息存在就修改设计主表(加工计划相关的信息)
+		if (obv_flg) {
+			pldm.setCl_design_no(detail.get(0).getCl_design_no());
+			if (lppp.size() == 1) {
+				pldm.setThick(lppp.get(0).getThick());
+				pldm.setWidth(lppp.get(0).getWidth());
+				pldm.setLength(lppp.get(0).getLength());
+			}
+			pldm.setSingle_weight(single_wgt);
+			pldm.setDesign_weight(single_wgt);
+			pldm.setMat_single_weight(single_wgt);
+			pldm.setReserve_1(lppp.get(0).getProduce_no());
+			pldm.setProd_rate(sWidth / lppp.get(0).getMat_width().doubleValue());
+			pldm.setSub_count(iCutCount);
+			pldm.setMat_thick(lppp.get(0).getThick());
+			pldm.setMat_length(lppp.get(0).getLength());
+			if (!"1".equals(lpp.get(0).getOrder_nature()) && !"3".equals(lpp.get(0).getOrder_nature())
+					&& "1".equals(lppp.get(0).getCut_type())) {
+				pldm.setCut_style(lppp.get(0).getCut_style());
+			}
+			pldm.setPlate_count(allsubcount);
+			this.getMapper(PlnCuttolengthDsnMainMapper.class).updateDesInfoByNo(pldm);
+			// 删除原有拼料信息
+			PlnCuttolengthDsnMultinfo pldmdd = new PlnCuttolengthDsnMultinfo();
+			pldmdd.setCl_design_no(detail.get(0).getCl_design_no());
+			this.getMapper(PlnCuttolengthDsnMultinfoMapper.class).doDelete(pldmdd);
+		} else {
+			// 保存设计主表数据: 横剪设计号:DCL+YYMMDD+6流水号
+			List<PlnCuttolengthDsnMain> lpdmNo = this.getMapper(PlnCuttolengthDsnMainMapper.class)
+					.findWithCondition(null, "", " to_number(serial_no) desc ", 0, 1);
+			pldm.setCl_design_no("DCL" + sDate + String.format("%06d", 1));
+			pldm.setSerial_no("1");
+			if (lpdmNo != null && lpdmNo.size() > 0) {
+				pldm.setSerial_no(String.valueOf(Integer.parseInt(lpdmNo.get(0).getSerial_no()) + 1));
+				if (sDate.equals(lpdmNo.get(0).getCl_design_no().substring(3, 9))) {
+					pldm.setCl_design_no("DCL" + sDate + String.format("%06d",
+							Integer.parseInt(lpdmNo.get(0).getCl_design_no().substring(9, 15)) + 1));
+				}
+			}
+
+			pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldm.setOrder_no(lpp.get(0).getOrder_no());
+			pldm.setPline_code(lpp.get(0).getPline_code());
+			pldm.setSteel_code(lpp.get(0).getSteel_code());
+
+			String isMulti = "0";// 是否拼料 根据订单数判断,多个订单填1,否则填0
+			pldm.setIs_multi(isMulti);
+			pldm.setMat_diameter_inn(lpp.get(0).getDiameter_inn());
+			pldm.setMat_diameter_out(lpp.get(0).getDiameter_out());
+			pldm.setMat_single_weight(single_wgt);
+			pldm.setMat_width(lpp.get(0).getWidth());
+			pldm.setProd_rate(sWidth / lppp.get(0).getMat_width().doubleValue());
+			// 堆垛总数
+			pldm.setSub_count(iCutCount);
+			// 钢板总数
+			pldm.setPlate_count(allsubcount);
+			pldm.setMat_thick(lpp.get(0).getThick());
+			pldm.setMat_length(lpp.get(0).getLength());
+			pldm.setSingle_weight(single_wgt);
+			if (lppp.size() == 1) {
+				pldm.setThick(lppp.get(0).getThick());
+				pldm.setWidth(lppp.get(0).getWidth());
+				pldm.setLength(lppp.get(0).getLength());
+				pldm.setDiameter_inn(lpp.get(0).getDiameter_inn());
+				pldm.setDiameter_out(lpp.get(0).getDiameter_out());
+				pldm.setSingle_weight(single_wgt);
+			}
+
+			// 需加工订单加工计划类型为开平
+			if (!"1".equals(lpp.get(0).getOrder_nature()) && !"3".equals(lpp.get(0).getOrder_nature())
+					&& "1".equals(lppp.get(0).getCut_type())) {
+				pldm.setCut_style(lppp.get(0).getCut_style());
+			}
+
+			pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+			pldm.setDesign_quantity(1);
+			pldm.setDesign_weight(single_wgt);
+
+			pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pldm.setCreate_man_name(userName);
+			pldm.setCreate_time(new Date());
+			pldm.setIs_finished(0l);
+			pldm.setReserve_1(lppp.get(0).getProduce_no());
+			this.getMapper(PlnCuttolengthDsnMainMapper.class).insert(pldm);
+		}
+		// 倒叙取一条
+		List<PlnCuttolengthDsnMultinfo> lpdmM = this.getMapper(PlnCuttolengthDsnMultinfoMapper.class)
+				.findWithCondition(null, "", " to_number (serial_no) desc ", 0, 1);
+		long DsnNo = 1;
+		int sub_seq = 1;
+		if (lpdmM != null && lpdmM.size() > 0) {
+			DsnNo = lpdmM.get(0).getSerial_no() + 1;
+		}
+		// -----------------写拼料(单个堆垛的信息)-------------------------
+
+		for (PlnProcessPlan pppc : lppp) {
+			for (int idx_sub = 1; idx_sub <= ZddCount.get(pppc.getPlan_no()).intValue(); idx_sub++) {
+				PlnCuttolengthDsnMultinfo pldmc = new PlnCuttolengthDsnMultinfo();
+				pldmc.setSerial_no(DsnNo++);
+				// 子堆垛序号
+				pldmc.setSub_seq(sub_seq++);
+				pldmc.setCl_design_no(pldm.getCl_design_no());
+				pldmc.setOrder_no(lpp.get(0).getOrder_no());
+				pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+				// 堆垛规格
+				pldmc.setThick(pppc.getThick() * boxCounts.get(pppc.getPlan_no()).intValue());
+				pldmc.setWidth(pppc.getWidth());
+				pldmc.setLength(pppc.getLength());
+				// 子板规格
+				pldmc.setSub_thick(pppc.getThick());
+				pldmc.setSub_length(pppc.getLength());
+				pldmc.setSub_width(pppc.getWidth());
+				// 关联加工计划取唯一加工计划
+				pldmc.setPlan_no(pppc.getPlan_no());
+				// 如果传入了规格总块数,按块数来算
+				if (pppc.getCut_num() != null && pppc.getCut_num() > 1
+						&& ZddCount.get(pppc.getPlan_no()).intValue() > 1) {
+					if (idx_sub == ZddCount.get(pppc.getPlan_no()).intValue()) {
+						// sub_count 最后一剁子板总数
+						pldmc.setSub_count(Last_Count.get(pppc.getPlan_no()).intValue());
+						// 总数*单重
+						pldmc.setWeight(
+								new BigDecimal(GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength())
+										* Last_Count.get(pppc.getPlan_no()).intValue())
+												.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
+					} else {
+						// sub_count 子板总数
+						pldmc.setSub_count(boxCounts.get(pppc.getPlan_no()).intValue());
+						// 总数*单重
+						pldmc.setWeight(
+								new BigDecimal(GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength())
+										* boxCounts.get(pppc.getPlan_no()).intValue())
+												.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
+
+					}
+				} else {
+					// sub_count 子板总数
+					pldmc.setSub_count(boxCounts.get(pppc.getPlan_no()).intValue());
+					// 总数*单重
+					pldmc.setWeight(new BigDecimal(GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength())
+							* boxCounts.get(pppc.getPlan_no()).intValue()).setScale(3, BigDecimal.ROUND_HALF_UP)
+									.doubleValue());
+				}
+				// 子板单重
+				pldmc.setSub_weight(new BigDecimal(GetWeightBySize(pppc.getThick(), pppc.getWidth(), pppc.getLength()))
+						.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
+				// 定尺方式/切边方式
+				pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+				pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+
+				if (pldmc.getSub_seq() >= 1000) {
+					throw new Exception("子板序号[" + pldmc.getSub_seq() + "]不在设备限制范围内!");
+				}
+				this.getMapper(PlnCuttolengthDsnMultinfoMapper.class).insert(pldmc);
+			}
+		}
+
+		// 建立虚拟物料表信息
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null,
+				" serial_no desc ", 0, 1);
+		long PMDNo = lpmd == null ? 1 : (lpmd.size() == 0 ? 1 : (lpmd.get(0).getSerial_no() + 1));
+		int objectnoVtNo = this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate) + 1;
+
+		// 根据累加值,建立坯料设计订单组成表
+		long pdoiNo = 1;
+		List<PlnDsnOrderInfo> lpdoiq = this.getMapper(PlnDsnOrderInfoMapper.class).findWithCondition(null, "",
+				" serial_no desc", 0, 1);
+		if (lpdoiq != null && lpdoiq.size() > 0) {
+			pdoiNo = lpdoiq.get(0).getSerial_no() + 1;
+		}
+
+		PlnMaterielDetail pmdM = new PlnMaterielDetail();
+		if (Utils.isNotEmpty(detail)) {
+			pmdM = detail.get(0);
+			pmdM.setStatus("0PDB10");
+			if (Utils.isNotEmpty(object_no)) {
+				pmdM.setObject_no(object_no);
+			}
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setNext_dsn_process_code(processpoint.cross_cutting_code);
+			pmdM.setNext_process_code(processpoint.cross_cutting_code);
+			pmdM.setCl_design_no(pldm.getCl_design_no());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			// 存在大批量脱单的时候,卷子虚拟物料信息的卷号信息没被清空,所以再次挂单的时候,选择直接更新订单号:
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdM);
+		} else {
+			pmdM.setSerial_no(PMDNo++);
+			pmdM.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo++));
+			pmdM.setObject_no(object_no);
+			pmdM.setProc_repeat_index(proc_times);
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setPline_code(lpp.get(0).getPline_code());
+			pmdM.setStatus("0PDB10");
+			pmdM.setIs_finished("1");// 母卷:1
+			// pmdM.setPrev_dsn_process_code(prev_process_code);
+			// pmdM.setPrev_process_code(prev_process_code);
+			pmdM.setNext_dsn_process_code(processpoint.cross_cutting_code);
+			pmdM.setNext_process_code(processpoint.cross_cutting_code);
+
+			pmdM.setCreate_design_no(pldm.getCl_design_no());
+			pmdM.setCreate_process_code(processpoint.cross_cutting_code);
+			pmdM.setIs_mat(1);// 母卷:1
+			pmdM.setOrder_no(lpp.get(0).getOrder_no());
+			pmdM.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdM.setCl_design_no(pldm.getCl_design_no());
+			pmdM.setIs_multi("0");
+			pmdM.setSteel_code(lpp.get(0).getSteel_code());
+			// 母卷填库存实际值
+			pmdM.setWidth(lpp.get(0).getWidth());
+			pmdM.setThick(lpp.get(0).getThick());
+			pmdM.setLength(lpp.get(0).getLength());
+			pmdM.setDiameter_inn(lpp.get(0).getDiameter_inn());
+			pmdM.setDiameter_out(lpp.get(0).getDiameter_out());
+			pmdM.setSingle_weight(single_wgt);
+			pmdM.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdM.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdM.setOrd_flg("1");
+			pmdM.setCreate_man_name(userName);
+			pmdM.setCreate_time(new Date());
+			pmdM.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdM.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdM.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdM.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdM);
+		}
+		// 根据横剪设计号,查找 横剪拼料信息表[PLN_Cuttolength_DSN_MULTINFO],循环读取每一子卷序号【SUB_SEQ】
+		PlnCuttolengthDsnMultinfo pldmm = new PlnCuttolengthDsnMultinfo();
+		pldmm.setCl_design_no(pldm.getCl_design_no());
+		List<PlnCuttolengthDsnMultinfo> lpldm = this.getMapper(PlnCuttolengthDsnMultinfoMapper.class).find(pldmm, 0, 0);
+		double v_total_wgt = 0;
+		int v_total_num = 0;
+
+		for (PlnCuttolengthDsnMultinfo pldmc : lpldm) {
+			// 建立虚拟子卷信息
+			PlnMaterielDetail pmdc = new PlnMaterielDetail();
+			pmdc.setSerial_no(PMDNo++);
+			pmdc.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo++));
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setPline_code(lpp.get(0).getPline_code());
+			pmdc.setStatus("0PDB10");
+			pmdc.setIs_finished("0");
+			pmdc.setPrev_dsn_process_code(processpoint.cross_cutting_code);
+			pmdc.setPrev_process_code(processpoint.cross_cutting_code);
+			pmdc.setIs_prev_dsn_finished("1");
+			pmdc.setCreate_design_no(pldm.getCl_design_no());
+			pmdc.setCreate_process_code(processpoint.cross_cutting_code);
+			pmdc.setIs_mat(0);// 母卷:1
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdc.setCl_design_no(pldm.getCl_design_no());
+			pmdc.setMat_object_no_vt(pmdM.getObject_no_vt());
+			pmdc.setIs_multi("0");
+			pmdc.setSteel_code(lpp.get(0).getSteel_code());
+			// 计划值
+			pmdc.setWidth(pldmc.getWidth());
+			// 母卷厚度
+			pmdc.setThick(pmdM.getThick());
+			pmdc.setLength(pldmc.getLength());
+			// 堆垛重量保留一位小数
+			pmdc.setSingle_weight(pldmc.getWeight());
+			// 预估堆垛的子板总数/单量
+			pmdc.setSub_count(pldmc.getSub_count());
+			pmdc.setSub_weight(pldmc.getSub_weight());
+			pmdc.setSingle_weight(pldmc.getSub_weight());
+			pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdc.setOrd_flg("1");
+			pmdc.setCreate_man_name(userName);
+			pmdc.setCreate_time(new Date());
+			pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pmdc.setPk_ask_code(lpp.get(0).getPk_ask_code());
+			pmdc.setPk_ask_desc(lpp.get(0).getPk_ask_desc());
+			pmdc.setPlan_no(pldmc.getPlan_no());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+
+			// 累加虚拟子堆垛重量,虚拟堆垛个数
+			v_total_wgt += pmdc.getSingle_weight().doubleValue();
+			v_total_num += 1;
+			DesignInfo temp = new DesignInfo();
+			temp.setObject_no_vt(pmdc.getObject_no_vt());
+			temp.setSingle_wgt(pmdc.getSingle_weight());
+			result.add(temp);
+		}
+
+		PlnDsnOrderInfo pdoi = new PlnDsnOrderInfo();
+		pdoi.setDesign_no(pldm.getCl_design_no());
+		pdoi.setProd_order_no(lpp.get(0).getProd_order_no());
+		pdoi.setWeight_in_one(v_total_wgt);
+		pdoi.setQuantity_in_one(v_total_num);
+		// 坯料设计订单组成表
+		if (obv_flg) {
+			this.getMapper(PlnDsnOrderInfoMapper.class).doUpdate(pdoi);
+		} else {
+			pdoi.setSerial_no(pdoiNo++);
+			pdoi.setOrder_no(lpp.get(0).getOrder_no());
+			this.getMapper(PlnDsnOrderInfoMapper.class).insert(pdoi);
+		}
+
+//		//修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+//		PlnProdorderStatistic pps=new PlnProdorderStatistic();
+//		pps.setProd_order_no(lpp.get(0).getProd_order_no());
+//		pps.setCl_dsn(v_total_wgt);
+//		pps.setCl_dsn_cnt(v_total_num);
+//		pps.setMat_cl_dsn(single_wgt);
+//		pps.setMat_cl_dsn_cnt(1);
+//		pps.setCl_undsn(single_wgt==null?null:(-single_wgt.doubleValue()));//实物重量
+//		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//		
+//		
+//		//修改订单进程表[PLN_ORDER_STATISTIC]
+//		PlnOrderStatistic pos=new PlnOrderStatistic();
+//		pos.setOrder_no(lpp.get(0).getOrder_no());
+//		pos.setCl_dsn(v_total_wgt);
+//		pos.setCl_dsn_cnt(v_total_num);
+//		pos.setMat_cl_dsn(single_wgt);
+//		pos.setMat_cl_dsn_cnt(1);
+//		pos.setCl_undsn(single_wgt==null?null:(-single_wgt));//实物重量
+//		this.getMapper(PlnOrderStatisticMapper.class).doUpdateClPlaned(pos);
+		return result;
+	}
+
+	/**
+	 * 返回子卷参数信息
+	 * 
+	 * @param result 虚拟物料号集合
+	 * @param info   当前操作参数对象
+	 * @return
+	 */
+	public List<DesignInfo> GetChildParam(List<DesignInfo> result, DesignInfo info) {
+		List<DesignInfo> infons = new ArrayList<DesignInfo>();
+		if (result.size() == 1) {
+			info.setObject_no_vt(result.get(0).getObject_no_vt());
+			info.setSingle_wgt(result.get(0).getSingle_wgt());
+			info.setObject_no(null);
+			infons.add(info);
+		} else {
+			for (DesignInfo str : result) {
+				DesignInfo di = new DesignInfo();
+				di.setCurrentProcIndex(info.getCurrentProcIndex());
+				di.setObject_no_vt(str.getObject_no_vt());
+				di.setSingle_wgt(str.getSingle_wgt());
+				di.setProcess(info.getProcess());
+				di.setProd_order_no(info.getProd_order_no());
+				infons.add(di);
+			}
+		}
+		return infons;
+	}
+
+	/**
+	 * 根据厚宽长获取重量
+	 * 
+	 * @param thick
+	 * @param width
+	 * @param length 注意单位都是毫米(传入)
+	 * @return
+	 */
+	public static double GetWeightBySize(double thick, double width, double length) {
+		return thick * width * length * 7.85 * Math.pow(10, -6);
+	}
+
+	/**
+	 * 修改订单进程信息
+	 * 
+	 * @param prod_order_no
+	 * @param order_no
+	 * @param path
+	 * @param single_wgt
+	 * @param flag          true 挂单 false 脱单
+	 */
+	public void updateOrderStatic(String prod_order_no, String order_no, String path, Double single_wgt, boolean flag) {
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		int i = -1;
+		Double wgt = -single_wgt;
+		if (flag) {
+			i = 1;
+			wgt = single_wgt;
+		}
+		// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(prod_order_no);
+		if (path.contains(processpoint.anneal_code)) {
+			String process_code = StringUtils.substringAfter(path, processpoint.anneal_code);
+			pps.setAn_dsn(wgt);
+			pps.setAn_dsn_cnt(i);
+			pps.setMat_an_dsn(wgt); // 实物重量
+			pps.setMat_an_dsn_cnt(i);
+			pps.setAn_undsn(wgt == null ? null : (-wgt)); // 实物重量
+
+			// 修改订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(order_no);
+			pos.setAn_dsn(wgt);
+			pos.setAn_dsn_cnt(i);
+			pos.setMat_an_dsn(wgt); // 实物重量
+			pos.setMat_an_dsn_cnt(i);
+			pos.setAn_undsn(wgt == null ? null : (-wgt)); // 实物重量
+
+			// 存在第二个罩退
+			if (process_code.contains(processpoint.anneal_code)) {
+				pps.setAn_dsn2(wgt);
+				pps.setAn_dsn_cnt2(i);
+				pps.setMat_an_dsn2(wgt); // 实物重量
+				pps.setMat_an_dsn_cnt2(i);
+				pps.setAn_undsn2(wgt == null ? null : (-wgt)); // 实物重量
+				// 修改订单进程表[PLN_ORDER_STATISTIC]
+				pos.setAn_dsn2(wgt);
+				pos.setAn_dsn_cnt2(i);
+				pos.setMat_an_dsn2(wgt); // 实物重量
+				pos.setMat_an_dsn_cnt2(i);
+				pos.setAn_undsn2(wgt == null ? null : (-wgt)); // 实物重量
+			}
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdateAnPlaned(pos);
+		}
+		if (path.contains(processpoint.slitting_code)) {
+			// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+			pps.setLw_dsn(wgt);
+//			pps.setLw_dsn_cnt(v_total_num);
+			pps.setMat_lw_dsn(wgt); // 实物重量
+			pps.setMat_lw_dsn_cnt(i);
+			pps.setLw_undsn(wgt == null ? null : (-wgt)); // 实物重量
+//			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+			// 修改订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(order_no);
+			pos.setLw_dsn(wgt);
+//			pos.setLw_dsn_cnt(v_total_num);
+			pos.setMat_lw_dsn(wgt); // 实物重量
+			pos.setMat_lw_dsn_cnt(i);
+			pos.setLw_undsn(wgt == null ? null : (-wgt)); // 实物重量
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+		}
+		if (path.contains(processpoint.cross_cutting_code)) {
+			// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+			pps.setCl_dsn(wgt);
+//			pps.setCl_dsn_cnt(v_total_num);
+			pps.setMat_cl_dsn(wgt);
+			pps.setMat_cl_dsn_cnt(i);
+			pps.setCl_undsn(wgt == null ? null : (-wgt.doubleValue()));// 实物重量
+//			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+			// 修改订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(order_no);
+			pos.setCl_dsn(wgt);
+//			pos.setCl_dsn_cnt(v_total_num);
+			pos.setMat_cl_dsn(wgt);
+			pos.setMat_cl_dsn_cnt(i);
+			pos.setCl_undsn(wgt == null ? null : (-wgt));// 实物重量
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdateClPlaned(pos);
+		}
+
+		if (path.contains(processpoint.smooth_code)) {
+			// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+			pps.setSr_dsn(wgt);
+//			pps.setSr_dsn_cnt(v_total_num);
+			pps.setMat_sr_dsn(wgt);
+			pps.setMat_sr_dsn_cnt(i);
+			pps.setSr_undsn(wgt == null ? null : (-wgt.doubleValue()));// 实物重量
+//			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+			// 修改订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(order_no);
+			pos.setSr_dsn(wgt);
+//			pos.setSr_dsn_cnt(v_total_num);
+			pos.setMat_sr_dsn(wgt);
+			pos.setMat_sr_dsn_cnt(i);
+			pos.setSr_undsn(wgt == null ? null : (-wgt));// 实物重量
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdateSrPlaned(pos);
+		}
+		if (path.contains(processpoint.rolling_code)) {
+			// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+			pps.setRl_dsn(wgt);
+//			pps.setSr_dsn_cnt(v_total_num);
+			pps.setMat_rl_dsn(wgt);
+			pps.setMat_rl_dsn_cnt(i);
+			pps.setRl_undsn(wgt == null ? null : (-wgt.doubleValue()));// 实物重量
+//			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+			// 修改订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(order_no);
+			pos.setRl_dsn(wgt);
+//			pos.setSr_dsn_cnt(v_total_num);
+			pos.setMat_rl_dsn(wgt);
+			pos.setMat_rl_dsn_cnt(i);
+			pos.setRl_undsn(wgt == null ? null : (-wgt));// 实物重量
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdateRlPlaned(pos);
+		}
+		if (path.contains(processpoint.pickle_code)) {
+			// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+			pps.setPc_dsn(wgt);
+//			pps.setSr_dsn_cnt(v_total_num);
+			pps.setMat_pc_dsn(wgt);
+			pps.setMat_pc_dsn_cnt(i);
+			pps.setPc_undsn(wgt == null ? null : (-wgt.doubleValue()));// 实物重量
+//			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+			// 修改订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(order_no);
+			pos.setPc_dsn(wgt);
+//			pos.setSr_dsn_cnt(v_total_num);
+			pos.setMat_pc_dsn(wgt);
+			pos.setMat_pc_dsn_cnt(i);
+			pos.setPc_undsn(wgt == null ? null : (-wgt));// 实物重量
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdatePcPlaned(pos);
+		}
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+	}
+
+	public void updatePlnStatic(String prod_order_no, String order_no, String process_code, Double single_wgt,
+			boolean flag) {
+
+		Double wgt = -single_wgt;
+		if (flag) {
+			wgt = single_wgt;
+		}
+
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+		// 获取虚拟母卷的下一工序代码,计算下一工序的 已设计量/数,欠设计量:欠设计量 +=(母卷单重 )
+		if (Utils.isNotEmpty(process_code)) {
+			if (processpoint.cross_cutting_code.equals(process_code)) {
+				// 修改生产订单进程表
+				PlnProdorderStatistic pps = new PlnProdorderStatistic();
+				pps.setProd_order_no(prod_order_no);
+				pps.setCl_undsn(wgt);
+				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+				// 修改订单进程表
+				PlnOrderStatistic pos = new PlnOrderStatistic();
+				pos.setOrder_no(order_no);
+				pos.setCl_undsn(wgt);
+				this.getMapper(PlnOrderStatisticMapper.class).doUpdateClPlaned(pos);
+			} else if (processpoint.slitting_code.equals(process_code)) {
+				// 修改生产订单进程表
+				PlnProdorderStatistic pps = new PlnProdorderStatistic();
+				pps.setProd_order_no(prod_order_no);
+				pps.setLw_undsn(wgt);
+				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+				// 修改订单进程表
+				PlnOrderStatistic pos = new PlnOrderStatistic();
+				pos.setOrder_no(order_no);
+				pos.setLw_undsn(wgt);
+				this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+			} else if (processpoint.anneal_code.equals(process_code)) {
+				// 修改生产订单进程表
+				PlnProdorderStatistic pps = new PlnProdorderStatistic();
+				pps.setProd_order_no(prod_order_no);
+				pps.setAn_undsn(wgt);
+				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+				// 修改订单进程表
+				PlnOrderStatistic pos = new PlnOrderStatistic();
+				pos.setOrder_no(order_no);
+				pos.setAn_undsn(wgt);
+				this.getMapper(PlnOrderStatisticMapper.class).doUpdateAnPlaned(pos);
+			} else if (processpoint.smooth_code.equals(process_code)) {
+				// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+				PlnProdorderStatistic pps = new PlnProdorderStatistic();
+				pps.setProd_order_no(prod_order_no);
+				pps.setSr_undsn(wgt); // 实物重量
+				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+				// 修改订单进程表[PLN_ORDER_STATISTIC]
+				PlnOrderStatistic pos = new PlnOrderStatistic();
+				pos.setOrder_no(order_no);
+				pos.setSr_undsn(wgt);// 实物重量
+				this.getMapper(PlnOrderStatisticMapper.class).doUpdateSrPlaned(pos);
+			} else if (processpoint.rolling_code.equals(process_code)) {
+				// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+				PlnProdorderStatistic pps = new PlnProdorderStatistic();
+				pps.setProd_order_no(prod_order_no);
+				pps.setRl_undsn(wgt); // 实物重量
+				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+				// 修改订单进程表[PLN_ORDER_STATISTIC]
+				PlnOrderStatistic pos = new PlnOrderStatistic();
+				pos.setOrder_no(order_no);
+				pos.setRl_undsn(wgt);// 实物重量
+				this.getMapper(PlnOrderStatisticMapper.class).doUpdateRlPlaned(pos);
+			} else if (processpoint.pickle_code.equals(process_code)) {
+				// 修改生产订单进程表[PLN_PRODORDER_STATISTIC]
+				PlnProdorderStatistic pps = new PlnProdorderStatistic();
+				pps.setProd_order_no(prod_order_no);
+				pps.setPc_undsn(wgt); // 实物重量
+				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+				// 修改订单进程表[PLN_ORDER_STATISTIC]
+				PlnOrderStatistic pos = new PlnOrderStatistic();
+				pos.setOrder_no(order_no);
+				pos.setPc_undsn(wgt);// 实物重量
+				this.getMapper(PlnOrderStatisticMapper.class).doUpdatePcPlaned(pos);
+			}
+		}
+	}
+
+	/**
+	 * 子卷置为无效
+	 * 
+	 * @param child 子卷
+	 */
+	public void deleteChild(List<PlnMaterielDetail> child) {
+		for (PlnMaterielDetail pln : child) {
+			List<PlnMaterielDetail> child_c = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"mat_object_no_vt = '" + pln.getObject_no_vt()
+							+ "' and nvl(invalid_flg,0) =0 and object_no is null",
+					"", 0, 0);
+			if (Utils.isNotEmpty(child_c)) {
+				deleteChild(child_c);
+			}
+			// 将子卷置为无效
+			this.getMapper(PlnMaterielDetailMapper.class).ChildToInvalid(pln);
+		}
+	}
+
+	public void recoveryChild(List<PlnMaterielDetail> child) {
+		for (PlnMaterielDetail pln : child) {
+			List<PlnMaterielDetail> child_c = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"mat_object_no_vt = '" + pln.getObject_no_vt() + "' and invalid_flg = '1'", "", 0, 0);
+			if (Utils.isNotEmpty(child_c)) {
+				recoveryChild(child_c);
+			}
+			// 将子卷置为有效
+			this.getMapper(PlnMaterielDetailMapper.class).ChildToValid(pln);
+		}
+	}
+
+	/**
+	 * 删除虚拟子卷
+	 * 
+	 * @param child
+	 * @throws Exception
+	 */
+	public void deleteChildTrue(List<PlnMaterielDetail> child) throws Exception {
+		for (PlnMaterielDetail pln : child) {
+			// 是否挂单
+			if (Utils.isNotEmpty(pln.getObject_no())) {
+				throw new Exception("虚拟子卷[" + pln.getObject_no_vt() + "]作为后一工序的原料,已经挂单,无法释放!");
+			}
+			// 是否有子卷
+			List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"mat_object_no_vt = '" + pln.getObject_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+			if (Utils.isNotEmpty(pmd)) {
+				deleteChildTrue(pmd);
+			}
+
+		}
+	}
+
+	/**
+	 * 判断下一个工序是否做了计划
+	 * 
+	 * @param pmd
+	 * @throws Exception
+	 */
+	public void JudgeIsOrNotPlan(PlnMaterielDetail pmd) throws Exception {
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		if (processpoint.slitting_code.equals(pmd.getNext_dsn_process_code())
+				&& Utils.isNotEmpty(pmd.getLw_plan_no())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]已做分条计划,无法删除!");
+		} else if (processpoint.cross_cutting_code.equals(pmd.getNext_dsn_process_code())
+				&& Utils.isNotEmpty(pmd.getCl_plan_no())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]已做开平计划,无法删除!");
+		} else if (processpoint.anneal_code.equals(pmd.getNext_dsn_process_code())
+				&& Utils.isNotEmpty(pmd.getAn_plan_no())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]已做罩退计划,无法删除!");
+		} else if (processpoint.smooth_code.equals(pmd.getNext_dsn_process_code())
+				&& Utils.isNotEmpty(pmd.getSr_plan_no())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]已做平整计划,无法删除!");
+		} else if (processpoint.rolling_code.equals(pmd.getNext_dsn_process_code())
+				&& Utils.isNotEmpty(pmd.getRl_plan_no())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]已做轧制计划,无法删除!");
+			// TODO
+		} else if (Utils.isNotEmpty(pmd.getRl_plan_no())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]已做酸洗计划,无法删除!");
+		}
+	}
+
+	/**
+	 * 获取当前工序的下下一个有效工序
+	 * 
+	 * @param code         当前工序代码 1 分条/2 开平/3 罩退/4 平整/5 轧制/6 酸洗
+	 * @param object_no_vt 虚拟母物料号
+	 * @return 如果下下一个工序不存在 则返回 ""
+	 * @throws Exception
+	 */
+	public String getNextProcessCode(String code, String object_no_vt) throws Exception {
+
+		String NextProcess = "", temp = "";
+		String[] path = null;
+		ArrayList<String> validpath = new ArrayList<>();
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		if (Utils.isEmpty(code)) {
+			throw new Exception("请传入当前工序代码![ 1 分条/ 2 开平/ 3 罩退/ 4 平整/ 5 轧制/ 6 酸洗]");
+		}
+		switch (code) {
+		case "1":
+			temp = processpoint.slitting_code;
+			break;
+		case "2":
+			temp = processpoint.cross_cutting_code;
+			break;
+		case "3":
+			temp = processpoint.anneal_code;
+			break;
+		case "4":
+			temp = processpoint.smooth_code;
+			break;
+		case "5":
+			temp = processpoint.rolling_code;
+			break;
+		case "6":
+			temp = processpoint.pickle_code;
+			break;
+		default:
+			break;
+		}
+		// 查询虚拟物料信息
+		List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				" object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if (Utils.isEmpty(pmd)) {
+			throw new Exception("虚拟物料[" + object_no_vt + "]信息不存在!");
+		}
+		// 不能再拿虚拟物料表中生产订单号去查:而应该改为库存表中的生产订单号去查;20221111 刘侣 start:
+		List<YdmProductDetail> ypdL = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, " object_no_vt = '" + object_no_vt + "'", null, 0, 1);
+		
+		// end;
+		
+		// 查询生产订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				" prod_order_no = '" + ypdL.get(0).getProdorderno() + "'", null, 0, 1);
+		if (Utils.isEmpty(ppo)) {
+			throw new Exception("虚拟物料[" + object_no_vt + "]对应的生产订单[" + ypdL.get(0).getProdorderno() + "]信息不存在!");
+		}
+		// 获取有效的工艺路径
+		if (pmd.get(0).getProc_repeat_index() == null) {
+			return "";
+		}
+		temp = getPath(ppo.get(0).getWhole_process_codes(), temp, pmd.get(0).getProc_repeat_index());
+		path = temp.split("-");
+		validpath = getProcessPath(path);
+		if (Utils.isNotEmpty(validpath)) {
+			NextProcess = validpath.get(0);
+		}
+		return NextProcess;
+	}
+
+	/**
+	 * 判断物料是否在库
+	 * 
+	 * @param object_no
+	 * @throws Exception
+	 */
+	public void JudgeIsOrNotZk(String object_no) throws Exception {
+		YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class).findById(object_no);
+		if (Utils.isEmpty(ypd) || !"0".equals(ypd.getState())) {
+			throw new Exception("物料:" + object_no + ",当前不是“在库”状态!请先入库!");
+		}
+	}
+
+	/**
+	 * 获取有效工序集合
+	 * 
+	 * @param str
+	 * @return
+	 */
+	public ArrayList<String> getProcessPath(String[] str) {
+		ArrayList<String> result = new ArrayList<String>();
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		for (String temp : str) {
+			if (processpoint.anneal_code.equals(temp)) {
+				result.add(temp);
+				continue;
+			} else if (processpoint.smooth_code.equals(temp)) {
+				result.add(temp);
+				continue;
+			} else if (processpoint.slitting_code.equals(temp)) {
+				result.add(temp);
+				continue;
+			} else if (processpoint.cross_cutting_code.equals(temp)) {
+				result.add(temp);
+				continue;
+			} else if (processpoint.rolling_code.equals(temp)) {
+				result.add(temp);
+				continue;
+			} else if (processpoint.pickle_code.equals(temp)) {
+				result.add(temp);
+				continue;
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 生成原料物料附加信息
+	 * 
+	 * @param ppo            生产订单信息
+	 * @param pmd            虚拟物料信息
+	 * @param actual_process 当前工序点 交工的时候在记录实绩作业路径
+	 * @throws Exception
+	 * 
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public void addMaterielExinfo(PlnProdorder ppo, PlnMaterielDetail pmd, String actual_process) throws Exception {
+		if (Utils.isEmpty(ppo) || Utils.isEmpty(pmd)) {
+			throw new Exception("请传入生产订单号和物料号[生成物料附加信息]");
+		}
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		String[] path = null;
+		String path_name = null, temp = null;
+		boolean flag = false;
+		long position = 0;
+		ArrayList<String> validpath = new ArrayList<String>();
+		// 获取有效工艺路径
+		path = ppo.getWhole_process_codes().split("-");
+		validpath = getProcessPath(path);
+		PrcMaterielExtinfo pme = this.getMapper(PrcMaterielExtinfoMapper.class).findById(pmd.getObject_no());
+		List<PlnMaterielDetail> pmdd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + pmd.getObject_no_vt() + "' and nvl(invalid_flg,0) = '0' ", null, 0, 1);
+		if (Utils.isEmpty(pme)) {
+			pme = new PrcMaterielExtinfo();
+			flag = true;
+		}
+		if (Utils.isNotEmpty(validpath)) {
+			path_name = getpath_name(validpath);
+		}
+		temp = StringUtils.join(validpath, "-");
+		try {
+			StringBuffer sb = new StringBuffer();
+			for (String str : validpath) {
+				sb.append(str);
+
+			}
+			position = getPosition(sb.toString(), actual_process, pmdd.get(0).getProc_repeat_index());
+			pme.setObject_no(pmd.getObject_no());
+			pme.setObject_no_vt(pmd.getObject_no_vt());
+			pme.setWhole_process_codes(ppo.getWhole_process_codes());
+			pme.setWhole_process_names(ppo.getWhole_process_names()); // 生产订单接收
+			pme.setPosition(position);
+			pme.setTask_process_codes(temp);
+			pme.setTask_process_names(path_name);
+			pme.setProd_order_no(ppo.getProd_order_no());
+			pme.setOrder_no(ppo.getOrder_no());
+			// 脱单之后再挂实际作业路径保留
+//			if (pme.getActual_process() == null) {
+//				pme.setActual_process(actual_process);
+//			} else {
+//				pme.setActual_process(pme.getActual_process() + "-" + actual_process);
+//			}
+			pme.setCreate_man(userName);
+			pme.setCreate_time(new Date());
+			if (!flag) {
+				this.getMapper(PrcMaterielExtinfoMapper.class).update(pme);
+			} else {
+				this.getMapper(PrcMaterielExtinfoMapper.class).insert(pme);
+			}
+		} catch (Exception ex) {
+			throw new Exception(ex.getStackTrace() + "生成物料附加信息失败!");
+		}
+	}
+
+	/**
+	 * 交工生成子卷物料附加信息
+	 * 
+	 * @param object_no
+	 * @param sub_object_no
+	 * @param actual_process
+	 * @param object_no_vt
+	 * @throws Exception 子卷根据母卷的作业路径继续往下走
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public void addChildMaterielExinfo(String object_no, String sub_object_no, String object_no_vt,
+			String actual_process) throws Exception {
+		boolean flag = false;
+		// 查询母卷物料附加信息
+		PrcMaterielExtinfo pme = this.getMapper(PrcMaterielExtinfoMapper.class).findById(object_no);
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		if (pme != null) {
+			// 子卷物料附加信息
+			PrcMaterielExtinfo child = this.getMapper(PrcMaterielExtinfoMapper.class).findById(sub_object_no);
+			if (Utils.isEmpty(child)) {
+				child = new PrcMaterielExtinfo();
+				flag = true;
+			}
+			BeanUtils.copyProperties(pme, child);
+			try {
+				child.setObject_no(sub_object_no);
+				child.setObject_no_vt(object_no_vt);
+				pme.setCreate_man(userName);
+				pme.setCreate_time(new Date());
+				if (child.getActual_process() == null) {
+					child.setActual_process(actual_process);
+				} else {
+					child.setActual_process(child.getActual_process() + "-" + actual_process);
+				}
+				if (!flag) {
+					child.setPosition((child.getPosition() == null ? 0 : child.getPosition()) + 1);
+					this.getMapper(PrcMaterielExtinfoMapper.class).update(child);
+				} else {
+					child.setPosition((pme.getPosition() == null ? 0 : pme.getPosition()) + 1);
+					this.getMapper(PrcMaterielExtinfoMapper.class).insert(child);
+				}
+			} catch (Exception e) {
+				throw new Exception("生成物料附加信息失败!");
+			}
+		}
+	}
+
+	/**
+	 * 交工修改母卷实际作业路径
+	 * 
+	 * @param object_no
+	 * @param actual_process
+	 * @param flag           true 交工 false 撤销
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public void updateMExInfo(String object_no, String actual_process, boolean flag) {
+		// 查询母卷物料附加信息
+		PrcMaterielExtinfo pme = this.getMapper(PrcMaterielExtinfoMapper.class).findById(object_no);
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		if (Utils.isNotEmpty(pme)) {
+			if (flag) {
+				// 母卷记录实际作业路径
+				if (pme.getActual_process() == null) {
+					pme.setActual_process(actual_process);
+				} else {
+					pme.setActual_process(pme.getActual_process() + "-" + actual_process);
+				}
+				pme.setPosition((pme.getPosition() == null ? 0 : pme.getPosition()));
+			} else {
+				if (Utils.isNotEmpty(pme.getActual_process())) {
+					String[] result = pme.getActual_process().split("-");
+					if (Utils.isNotEmpty(result)) {
+						if (result.length > 1) {
+							pme.setActual_process(StringUtils.substringBeforeLast(pme.getActual_process(),
+									"-" + result[result.length - 1]));
+						} else {
+							pme.setActual_process("");
+						}
+					}
+				}
+				pme.setPosition(pme.getPosition());
+			}
+			pme.setCreate_man(userName);
+			pme.setCreate_time(new Date());
+			this.getMapper(PrcMaterielExtinfoMapper.class).update(pme);
+		}
+	}
+
+	/**
+	 * 脱单清空物料附加信息
+	 * 
+	 * @param object_no
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public void updateMaterielExinfo(String object_no) {
+		PrcMaterielExtinfo pme = this.getMapper(PrcMaterielExtinfoMapper.class).findById(object_no);
+		if (pme != null) {
+			pme.setObject_no(object_no);
+			pme.setObject_no_vt("");
+			pme.setTask_process_codes("");
+			pme.setTask_process_names("");
+			pme.setWhole_process_codes("");
+			pme.setWhole_process_names("");
+			pme.setProd_order_no("");
+			pme.setOrder_no("");
+			pme.setPosition(pme.getPosition()); // 脱单的时候位置回退一格
+			// 实际作业路径不变
+//			if (Utils.isNotEmpty(pme.getActual_process())) {
+//				String [] result = pme.getActual_process().split("-");
+//				if (Utils.isNotEmpty(result)) {
+//					if (result.length>1) {
+//						pme.setActual_process(StringUtils.substringBeforeLast(pme.getActual_process(), "-"+result[result.length-1])); 
+//					}else {
+//						pme.setActual_process("");
+//					}
+//				}
+//			}
+			this.getMapper(PrcMaterielExtinfoMapper.class).update(pme);
+		}
+	}
+
+	/**
+	 * 获取工艺路径名称
+	 * 
+	 * @param validpath
+	 * @return
+	 * @throws Exception
+	 */
+	public String getpath_name(ArrayList<String> validpath) throws Exception {
+		String path_name = null;
+		List<String> temp = new ArrayList<String>();
+		if (validpath.size() == 0) {
+			path_name = this
+					.getMapper(ComBaseProcessRStationMapper.class).findWithCondition(null,
+							"process_code = '" + validpath.get(0) + "' and validflag = '1'", null, 0, 1)
+					.get(0).getProcess_desc();
+		} else {
+			for (String str : validpath) {
+				List<ComBaseProcessRStation> com = this.getMapper(ComBaseProcessRStationMapper.class)
+						.findWithCondition(null, "process_code = '" + str + "' and validflag = '1'", null, 0, 1);
+				temp.add(com.get(0).getProcess_desc());
+			}
+			path_name = StringUtils.join(temp, "-");
+		}
+		return path_name;
+	}
+	
+	/**
+	 * 循环获取一个卷虚拟物料内所有条数据
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public ResultModel queryAllpmd(String object_no) throws Exception {
+		ResultModel rm = new ResultModel("200", null);
+		
+		List<PlnMaterielDetail> allpmd = new ArrayList<>();
+		List<PlnMaterielDetail> lpmd = new ArrayList<>();
+		// 查询当前第一条数据:
+		lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no = '" + object_no + "'", "", 0, 1);
+		if (lpmd.size() > 0) {
+			allpmd.add(lpmd.get(0));
+			for (int i = 0; i < 20; i++) {
+				// 将上一条的object_no_vt作为查询下一条的 mat_object_no_vt:
+				lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt() + "'", "", 0, 1);
+				if (lpmd.size() == 0) {
+					// 如果没有下一条数据,跳出:
+					break;
+				}
+				allpmd.add(lpmd.get(0));
+			}
+			if (allpmd.size() < 2) {
+				rm.setState("500");
+				rm.setMsgInfo("该卷总工序少于2个,请联系管理员");
+			} else {
+				// 先注释掉:20230130刘侣
+				// 再次判断是否倒数第二条数据的next_process_code 为平整 C:
+//				if (!"C".equals(allpmd.get(allpmd.size() - 2).getNext_process_code())) {
+//					rm.setState("500");
+//					rm.setMsgInfo("该卷虚拟物料信息的最后一道工序不是平整,请联系管理员");
+//				} else {
+//					rm.setData(allpmd);
+//				}
+				// end
+				rm.setData(allpmd);
+			}
+		} else {
+			rm.setState("500");
+			rm.setMsgInfo("未查询到该卷的虚拟物料信息");
+		}
+		
+		// 返回所有查询的数据:
+		return rm;
+	}
+
+	/**
+	 * 更改作业路径
+	 * 
+	 * @param object_no    物料号
+	 * @param task_process 作业路径
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public ResultModel updateTask_process(String object_no, String task_process) throws Exception {
+		ResultModel rm = new ResultModel("200", null);
+		String opr_time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); //操作时间
+		String username=(String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		if (Utils.isEmpty(object_no) || Utils.isEmpty(task_process)) {
+			rm.setState("500");
+			rm.setMsgInfo("请传入正确的参数!");
+			return rm;
+		}
+
+		// 工序点信息
+		List<ComBaseInfo> infoI = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoI);
+
+		// 查询虚拟物料表【PLN_MATERIEL_DETAIL】---- where NVL(INVALID_FLG,0)=0 AND OBJECT_NO =
+		// 实物卷号
+		List<PlnMaterielDetail> pmdd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no = '" + object_no + "' and nvl(invalid_flg,0) = '0'", "", 0, 1);
+		// 获取物料附加信息
+		PrcMaterielExtinfo exinfo = this.getMapper(PrcMaterielExtinfoMapper.class).findById(object_no);
+		if (Utils.isEmpty(exinfo)) {
+			rm.setState("500");
+			rm.setMsgInfo("未找到物料附加[" + object_no + "]信息,请刷新页面再操作!");
+			return rm;
+		}
+		// 如果传入的作业路径与原作业路径一致
+		if (exinfo.getTask_process_codes().equals(task_process)) {
+			rm.setState("500");
+			rm.setMsgInfo("作业路径未发现改变,请刷新后重新操作!");
+			return rm;
+		}
+		// 防止多页面操作
+		if (Utils.isEmpty(pmdd)) {
+			rm.setState("500");
+			rm.setMsgInfo("未找到虚拟物料[" + object_no + "]信息,请刷新页面再操作!");
+			return rm;
+		} else if (Utils.isNotEmpty(pmdd.get(0).getNext_process_code())) {
+			if (pmdd.get(0).getNext_process_code().equals(processpoint.anneal_code)
+					&& (pmdd.get(0).getReplaced_times() != null && pmdd.get(0).getReplaced_times() != 2)
+					&& pmdd.get(0).getAn_plan_no() != null) {
+				throw new Exception("虚拟物料[" + object_no + "]已做罩退计划,无法修改作业路径!");
+			}
+			if (pmdd.get(0).getNext_process_code().equals(processpoint.slitting_code)
+					&& pmdd.get(0).getLw_plan_no() != null) {
+				throw new Exception("虚拟物料[" + object_no + "]已做分条计划,无法修改作业路径!");
+			}
+			if (pmdd.get(0).getNext_process_code().equals(processpoint.smooth_code)
+					&& pmdd.get(0).getSr_plan_no() != null) {
+				throw new Exception("虚拟物料[" + object_no + "]已做平整计划,无法修改作业路径!");
+			}
+			if (pmdd.get(0).getNext_process_code().equals(processpoint.cross_cutting_code)
+					&& pmdd.get(0).getCl_plan_no() != null) {
+				throw new Exception("虚拟物料[" + object_no + "]已做开平计划,无法修改作业路径!");
+			}
+			if (pmdd.get(0).getNext_process_code().equals(processpoint.pickle_code)
+					&& pmdd.get(0).getCl_plan_no() != null) {
+				throw new Exception("虚拟物料[" + object_no + "]已做酸洗计划,无法修改作业路径!");
+			}
+			if (pmdd.get(0).getNext_process_code().equals(processpoint.rolling_code)
+					&& pmdd.get(0).getCl_plan_no() != null) {
+				throw new Exception("虚拟物料[" + object_no + "]已做轧制计划,无法修改作业路径!");
+			}
+		}
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 脱单的时候会清空物料附加信息所以复制一个供后面流程使用
+		PrcMaterielExtinfo pme = new PrcMaterielExtinfo();
+		BeanUtils.copyProperties(exinfo, pme);
+
+		int idx = 0;
+		idx += exinfo.getPosition();
+		// 20220905 刘侣 start:恢复成之前的,还是注释掉吧
+		// 获取订单 变更作业路径 :防止误删除多了工序,前面工序删的时候可能会删掉后面所有子工序;
+//		ChangeProcess(pmdd, task_process, idx);
+		// end
+
+		String[] Apath = task_process.split("-");
+		ArrayList<String> Avalidpath = new ArrayList<String>(Arrays.asList(Apath));
+		// 查询虚拟物料表【PLN_MATERIEL_DETAIL】---- where NVL(INVALID_FLG,0)=0 AND OBJECT_NO =
+		// 实物卷号
+		List<PlnMaterielDetail> pmddd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no = '" + object_no + "' and nvl(invalid_flg,0) = '0'", "", 0, 1);
+		// 修改物料附加信息
+		// 写物料充当脱单履历表[MIL_MAT_REPLACE_LOG] MilMatReplaceLog
+		// 物料充当脱单履历
+		List<PlnMatReplaceLog> lmmrl = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		long iNo = 1;
+		if (lmmrl != null && lmmrl.size() > 0) {
+			iNo = lmmrl.get(0).getSerial_no() + 1;
+		}
+		PlnMatReplaceLog mmrl = new PlnMatReplaceLog();
+		BeanUtils.copyProperties(pmdd.get(0), mmrl);
+		mmrl.setSerial_no(iNo++);
+		// 写错了,应该历史不是 挂单(2),否则挂单管理的可上料重量会负得很多,正常最多负1.*:20220913刘侣
+		// 而从计算来看,如果置为0,那就不对了,订单量+脱单量-挂单量:80 + 59.02 - 81.07 
+		// 这个动作是先脱单再挂单,所以既不能只是脱单也不能只是挂单:将其置为新type:-1 先脱单后挂单适用于修改工艺路径中的删除最后一道平整工序
+		// 这个先脱单后挂单在挂单历史和脱单历史都查不到,没必要查到;
+//		mmrl.setOpt_type("2");
+		mmrl.setOpt_type("-1");
+		
+		mmrl.setCreate_man_name(userName);
+		mmrl.setCreate_time(new Date());
+		mmrl.setRemark("更改作业路径!");
+		this.getMapper(PlnMatReplaceLogMapper.class).insert(mmrl);
+		// 修改物料附加信息
+//		pme.setObject_no_vt(pmddd.get(0).getObject_no_vt());
+		pme.setTask_process_codes(task_process);
+		pme.setCreate_man(userName);
+		pme.setCreate_time(new Date());
+		pme.setTask_process_names(getpath_name(Avalidpath));
+		this.getMapper(PrcMaterielExtinfoMapper.class).update(pme);
+		// 作业路径发生修改,将原设计订单脱单,根据新的作业路径重新设计
+		/* if (!task_process.equals(pme.getTask_process_codes())) { */
+//			CommonPage<PlnMaterielDetail> oci = new CommonPage<PlnMaterielDetail>();
+//			List<PlnMaterielDetail> lpm = new ArrayList<PlnMaterielDetail>();
+//			PlnMaterielDetail pmd = new PlnMaterielDetail();
+//			pmd.setObject_no(object_no);
+//			pmd.setObject_no_vt(pme.getObject_no_vt());
+//			lpm.add(pmd);
+//			oci.setObjectList(lpm);
+
+		/*
+		 * // 获取物料库存信息 YdmProductDetail ypd =
+		 * this.getMapper(YdmProductDetailMapper.class).findById(object_no);
+		 * 
+		 * // 根据新的作业路径重新设计 // String process = task_process; String process = null; //
+		 * 传入的作业路径 - 已经生产的工序 if (task_process.contains("-")) { process =
+		 * StringUtils.substringAfter(task_process, pme.getActual_process() + "-"); }
+		 * else { process = StringUtils.substringAfter(task_process,
+		 * pme.getActual_process()); } // 删除虚拟物料信息
+		 * this.getBean(PlnMaterielDetailServiceImpl.class).doCancelChild(pmdd);
+		 * 
+		 * // 脱单 // ResultModel tuodan =
+		 * this.getBean(PlnMaterielDetailServiceImpl.class).doMaterialReplace(oci); //
+		 * if (!"200".equals(tuodan.getState())) { // throw new
+		 * Exception("作业路径更改失败!["+tuodan.getMsgInfo()+"]"); // } // for (int i = 1; i <
+		 * pme.getPosition().intValue(); i++) { // process =
+		 * StringUtils.substringAfter(task_process,"-"); // } String[] Apath =
+		 * task_process.split("-"); ArrayList<String> Avalidpath = new
+		 * ArrayList<String>(Arrays.asList(Apath)); // 作业路径!=已完成的工序路径 if
+		 * (Utils.isNotEmpty(process)) { String[] path = process.split("-");
+		 * ArrayList<String> validpath = new ArrayList<String>(Arrays.asList(path));
+		 * List<DesignInfo> infos = new ArrayList<DesignInfo>();
+		 * 
+		 * // 调用设计信息接口 DesignInfo info = new DesignInfo(); info.setCurrentProcIndex(0);
+		 * info.setObject_no(object_no); info.setProcess(validpath);
+		 * info.setProd_order_no(pme.getProd_order_no());
+		 * info.setSingle_wgt(ypd.getFactweight()); infos.add(info);
+		 * this.getBean(MesApiDesignInfoImpl.class).Design_Plan_Info(infos, null);
+		 * ResultModel design =
+		 * this.getBean(MesApiDesignInfoImpl.class).Design_Plan_Info(infos, null); if
+		 * (!"200".equals(design.getState())) { throw new
+		 * Exception(design.getMsgInfo()); }
+		 * 
+		 * // 修改生产订单进程表、订单进程表 //
+		 * this.getBean(MesApiDesignInfoImpl.class).updateOrderStatic(pme.
+		 * getProd_order_no(), pme.getOrder_no(), validpath.toString(),
+		 * ypd.getFactweight(),true);
+		 * 
+		 * // // 查询生产订单信息 // List<PlnProdorder> lpp =
+		 * this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+		 * "prod_order_no = '"+pme.getProd_order_no()+"'", null, 0, 0); // // //
+		 * //调用物流接口,关联实物和生产订单信息 // ypd.setCustomer_no(lpp.get(0).getCustomer_no()); //
+		 * ypd.setCustomer_nm(lpp.get(0).getCustomer_name()); //
+		 * ypd.setReceiv_nm(lpp.get(0).getReciver_unit_name()); //
+		 * ypd.setReceiv_no(lpp.get(0).getReciver_unit_no()); //
+		 * ypd.setProdorderno(lpp.get(0).getProd_order_no()); //
+		 * ypd.setOrderno(lpp.get(0).getOrder_no()); //
+		 * ypd.setObject_no_vt(pmdd.get(0).getObject_no_vt()); //
+		 * this.getBean(YdmProductDetailMapper.class).doFinshedProductActUpdate(ypd);
+		 * 
+		 * // 查询虚拟物料表【PLN_MATERIEL_DETAIL】---- where NVL(INVALID_FLG,0)=0 AND OBJECT_NO
+		 * = // 实物卷号 List<PlnMaterielDetail> pmddd =
+		 * this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+		 * "object_no = '" + object_no + "' and nvl(invalid_flg,0) = '0'", "", 0, 1);
+		 * 
+		 * // 写物料充当脱单履历表[MIL_MAT_REPLACE_LOG] MilMatReplaceLog // 物料充当脱单履历
+		 * List<PlnMatReplaceLog> lmmrl =
+		 * this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, "",
+		 * " serial_no desc ", 0, 1); long iNo = 1; if (lmmrl != null && lmmrl.size() >
+		 * 0) { iNo = lmmrl.get(0).getSerial_no() + 1; } PlnMatReplaceLog mmrl = new
+		 * PlnMatReplaceLog(); BeanUtils.copyProperties(pmdd.get(0), mmrl);
+		 * mmrl.setSerial_no(iNo++); mmrl.setOpt_type("2");
+		 * mmrl.setCreate_man_name(userName); mmrl.setCreate_time(new Date());
+		 * mmrl.setRemark("更改作业路径!");
+		 * this.getMapper(PlnMatReplaceLogMapper.class).insert(mmrl); // 修改物料附加信息
+		 * pme.setObject_no_vt(pmddd.get(0).getObject_no_vt());
+		 * pme.setTask_process_codes(task_process); // if (pme.getPosition() == null) {
+		 * // pme.setPosition(1l); // } // if (Utils.isNotEmpty(validpath)) { // if
+		 * (pme.getActual_process() == null) { //
+		 * pme.setActual_process(validpath.get(0)); // } else { //
+		 * pme.setActual_process(pme.getActual_process() + "-" + validpath.get(0)); // }
+		 * // } } pme.setCreate_man(userName); pme.setCreate_time(new Date());
+		 * pme.setTask_process_names(getpath_name(Avalidpath));
+		 * this.getMapper(PrcMaterielExtinfoMapper.class).update(pme); }
+		 */
+		YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class).doFind(object_no, null);
+		if (ypd!=null) {
+			// 待入库和入库都可以修改:20220827 刘侣
+			if (!"-1".equals(ypd.getState()) && !"0".equals(ypd.getState())) {
+				throw new Exception("卷号【"+object_no+"】不是待入库或者入库状态,无法更改作业路径");
+			}
+			// 只有当前工序是倒数第二道工序才转成品库:因为要去掉最后一道平整工序;
+			ResultModel rmQuery = this.queryAllpmd(ypd.getCoilno());
+			if ("500".equals(rmQuery.getState())) {
+				throw new Exception("卷号【"+object_no+"】" + rmQuery.getMsgInfo());
+			} else {
+				// 返回数据正常,可删除最后一到为平整的工序:改为删除最后的任意一道工序
+				//判断当前卷的工序是否是平整之前的倒数第二道工序:思路,如果是倒数第二道工序,那么返回的总的工序数为2条;
+				List<PlnMaterielDetail> allpmd = (List<PlnMaterielDetail>) rmQuery.getData();
+				String status = "5BRL03"; // 作业中
+				if (allpmd.size() == 2) {
+					status = "5BRL10"; // 作业完成
+					if ("500202".equals(ypd.getStorageattr())) {
+						ypd.setStorageattr("500203");//在制库转成品库
+						this.getMapper(YdmProductDetailMapper.class).update(ypd);
+						// 判断是否有入库记录:
+						List<YdmProductInlist> lypi = this.getMapper(YdmProductInlistMapper.class).findWithCondition(null, "STORAGEATTR = '500202' and COILNO = '" + object_no + "'", "", 0, 1);
+						if (lypi.size() != 0) {
+							// 说明有入库记录:修改入库记录的仓库为成品库:
+							YdmProductInlist ypi = lypi.get(0);
+							ypi.setStorageattr("500203");
+							this.getMapper(YdmProductInlistMapper.class).update(ypi);
+						}
+					}
+				}
+				//移除下道工序 
+				this.getMapper(PlnMaterielDetailMapper.class).doReMoveNextProcess(allpmd.get(allpmd.size() - 2).getObject_no_vt(), status);
+			}
+			
+			
+		}
+		
+		//日志
+		MesOprLog mol = new MesOprLog("生产管理", "修改作业路径", "删除最后一道工序", username, opr_time, ypd.getCoilno(), null, null, null, "原料卷号:"+ypd.getMaterailcoilno());
+		this.getMapper(MesOprLogMapper.class).insert(mol);
+		
+		rm.setMsgInfo("作业路径修改成功! ");
+		return rm;
+	}
+
+	/**
+	 * 订单变更申报
+	 * 
+	 * @param order_no 订单号
+	 * @param cTypes   变更类型组合 :“10,20” 用逗号分隔 变更类型 1B 新增退火工序; 1E 新增分条工序 1D 新增开平工序; 1C
+	 *                 新增平整工序; 1A 新增轧制工序 0B 减少退火工序; 0E 减少分条工序 0D 减少开平工序; 0C 减少平整工序;
+	 *                 0A 减少轧制工序 20 加工计划变更(单纯只变化分条或开平规格)
+	 * @return
+	 * @throws Exception
+	 */
+	public boolean canOrderChange(String order_no, String cTypes) throws Exception {
+		boolean flag = false;
+		int index = 0;
+		// 工序信息
+		List<ComBaseInfo> infoI = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoI);
+
+		// 获取生产订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"order_no = '" + order_no + "'", "", 0, 0);
+		if (Utils.isEmpty(ppo)) {
+			throw new Exception("未找到订单[" + order_no + "]信息!");
+		}
+		// 将老工艺路径,保存为 工序路径类_数组形式;
+		// 获取有效工艺路径
+		List<ProcessUtils> old_proc = new ArrayList<ProcessUtils>();
+		String[] path = ppo.get(0).getWhole_process_codes().split("-");
+		ArrayList<String> validpath = getProcessPath(path);
+		if (Utils.isNotEmpty(validpath)) {
+			for (String str : validpath) {
+				ProcessUtils pro = new ProcessUtils();
+				pro.setProc_code(str);
+				pro.setProc_index(index++);
+				pro.setProc_name(this.getMapper(ComBaseProcessRStationMapper.class)
+						.findWithCondition(null, "process_code = '" + str + "' and validflag = '1'", null, 0, 1).get(0)
+						.getProcess_desc());
+				pro.setRepeat_times(0);
+				pro.setStatus("0");
+				old_proc.add(pro);
+			}
+		}
+		String regex1 = "0[A-Z|a-z]"; // 匹配"0x"
+		String regex2 = "1[A-Z|a-z]"; // 匹配"1x"
+		boolean flag_is_o = false;
+		// 倒序循环
+		String[] c_arr = cTypes.split(",");
+		for (int i = c_arr.length - 1; i >= 0; i--) {
+			// 判断是否有工序变更?(包含 "1X"、"0X"变更类型的),如果有,则:
+			if (Pattern.matches(regex1, c_arr[i])) {
+				switch (c_arr[i]) {
+				// 将老工序数组中,从后往前,将状态为0的"X"工序状态标记为 减少:-1; 如果找不到“X”工序,则报错退出“找不到xx工序,无法减少!”;
+				case "0B":
+					for (int j = old_proc.size() - 1; j >= 0; j--) {
+						if (processpoint.anneal_code.equals(old_proc.get(j).getProc_code())
+								&& "0".equals(old_proc.get(j).getStatus())) {
+							old_proc.get(j).setStatus("-1");
+							flag = false;
+							break;
+						} else {
+							flag = true;
+						}
+					}
+					if (flag) {
+						throw new Exception("找不到退火工序,无法减少!");
+					}
+					break;
+				case "0E":
+					for (int j = old_proc.size() - 1; j >= 0; j--) {
+						if (processpoint.slitting_code.equals(old_proc.get(j).getProc_code())
+								&& "0".equals(old_proc.get(j).getStatus())) {
+							old_proc.get(j).setStatus("-1");
+							flag = false;
+							break;
+						} else {
+							flag = true;
+						}
+					}
+					if (flag) {
+						throw new Exception("找不到分条工序,无法减少!");
+					}
+					break;
+				case "0D":
+					for (int j = old_proc.size() - 1; j >= 0; j--) {
+						if (processpoint.cross_cutting_code.equals(old_proc.get(j).getProc_code())
+								&& "0".equals(old_proc.get(j).getStatus())) {
+							old_proc.get(j).setStatus("-1");
+							flag = false;
+							break;
+						} else {
+							flag = true;
+						}
+					}
+					if (flag) {
+						throw new Exception("找不到开平工序,无法减少!");
+					}
+					break;
+				case "0C":
+					for (int j = old_proc.size() - 1; j >= 0; j--) {
+						if (processpoint.smooth_code.equals(old_proc.get(j).getProc_code())
+								&& "0".equals(old_proc.get(j).getStatus())) {
+							old_proc.get(j).setStatus("-1");
+							flag = false;
+							break;
+						} else {
+							flag = true;
+						}
+					}
+					if (flag) {
+						throw new Exception("找不到平整工序,无法减少!");
+					}
+					break;
+				case "0A":
+					for (int j = old_proc.size() - 1; j >= 0; j--) {
+						if (processpoint.rolling_code.equals(old_proc.get(j).getProc_code())
+								&& "0".equals(old_proc.get(j).getStatus())) {
+							old_proc.get(j).setStatus("-1");
+							flag = false;
+							break;
+						} else {
+							flag = true;
+						}
+					}
+					if (flag) {
+						throw new Exception("找不到轧制工序,无法减少!");
+					}
+					break;
+				case "0P":
+					for (int j = old_proc.size() - 1; j >= 0; j--) {
+						if (processpoint.pickle_code.equals(old_proc.get(j).getProc_code())
+								&& "0".equals(old_proc.get(j).getStatus())) {
+							old_proc.get(j).setStatus("-1");
+							flag = false;
+							break;
+						} else {
+							flag = true;
+						}
+					}
+					if (flag) {
+						throw new Exception("找不到酸洗工序,无法减少!");
+					}
+					break;
+
+				default:
+					break;
+				}
+				flag_is_o = true;
+			}
+		}
+		if (flag_is_o) {
+			// 2 一般只有一条生产订单记录
+			for (PlnProdorder order : ppo) {
+				// 获取当前生产订单下的所有的 [第一工序虚拟卷数组](第一工序虚拟卷:虚拟母物料为空的虚拟卷。即对应第一个工序的虚拟卷)
+				List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+						"prod_order_no = '" + order.getProd_order_no()
+								+ "' and nvl(invalid_flg,0) != 1 and mat_object_no_vt is null",
+						"", 0, 0);
+				for (PlnMaterielDetail pln : pmd) {
+					List<PlnMaterielDetail> temp = new ArrayList<PlnMaterielDetail>();
+					int cnt_g = validpath.indexOf(pln.getNext_dsn_process_code());
+					if (cnt_g == -1) {
+						throw new Exception("工艺路径不存在 ["
+								+ this.getMapper(ComBaseProcessRStationMapper.class)
+										.findWithCondition(null,
+												"process_code = '" + pln.getNext_dsn_process_code()
+														+ "' and validflag = '1'",
+												null, 0, 1)
+										.get(0).getProcess_desc()
+								+ "]工序");
+					}
+					temp.add(pln);
+					// 调用 canDeleteProcess(第一工序虚拟卷信息, 老工艺路径数组,0) 因为可能涉及到挂的不同的工序所以按单个处理
+					CanDeleteProcess(temp, old_proc, cnt_g, false);
+				}
+			}
+		}
+
+		// 是否有加工计划变更
+		for (int i = 0; i < c_arr.length; i++) {
+			if ("20".equals(c_arr[i])) {
+				// 获取当前生产订单下的所有的 [第一工序虚拟卷数组](第一工序虚拟卷:虚拟母物料为空的虚拟卷。即对应第一个工序的虚拟卷)
+				// 2 一般只有一条生产订单记录
+				for (PlnProdorder pp : ppo) {
+					// 获取当前生产订单下的所有的 [第一工序虚拟卷数组](第一工序虚拟卷:虚拟母物料为空的虚拟卷。即对应第一个工序的虚拟卷)
+					List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+							"prod_order_no = '" + pp.getProd_order_no()
+									+ "' and nvl(invalid_flg,0) != 1 and mat_object_no_vt is null",
+							"", 0, 0);
+					for (PlnMaterielDetail pln : pmd) {
+						List<PlnMaterielDetail> te = new ArrayList<PlnMaterielDetail>();
+						int cnt_p = validpath.indexOf(pln.getNext_dsn_process_code());
+						if (cnt_p == -1) {
+							throw new Exception("工艺路径不存在 [" + this.getMapper(ComBaseProcessRStationMapper.class)
+									.findWithCondition(null,
+											"process_code = '" + pln.getNext_dsn_process_code()
+													+ "' and validflag = '1'",
+											null, 0, 1)
+									.get(0).getProcess_point_desc() + "]工序");
+						}
+						te.add(pln);
+						// 调用 CanChangeProcessPlan(第一工序虚拟卷信息, 老工艺路径数组,0) 因为可能涉及到挂的不同的工序所以按单个处理
+						CanChangeProcessPlan(te, old_proc, cnt_p);
+					}
+
+				}
+			}
+		}
+
+		// 循环各"1X"
+		// 将新工序 追加到数组最后,将状态为0的"X"工序状态标记为 新增;
+		for (int i = 0; i < c_arr.length; i++) {
+			if (Pattern.matches(regex2, c_arr[i])) {
+				ProcessUtils pu = new ProcessUtils();
+				switch (c_arr[i]) {
+				case "1B":
+					pu.setProc_code(processpoint.anneal_code);
+					pu.setProc_index(old_proc.size());
+					pu.setStatus("0");
+					old_proc.add(pu);
+					break;
+				case "1D":
+					pu.setProc_code(processpoint.cross_cutting_code);
+					pu.setProc_index(old_proc.size());
+					pu.setStatus("0");
+					old_proc.add(pu);
+					break;
+				case "1C":
+					pu.setProc_code(processpoint.smooth_code);
+					pu.setProc_index(old_proc.size());
+					pu.setStatus("0");
+					old_proc.add(pu);
+					break;
+				case "1E":
+					pu.setProc_code(processpoint.slitting_code);
+					pu.setProc_index(old_proc.size());
+					pu.setStatus("0");
+					old_proc.add(pu);
+					break;
+
+				default:
+					break;
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 判断能否删除工序
+	 * 
+	 * @param temp
+	 * @param old_proc
+	 * @param idx
+	 * @return 根据old_proc中状态判断是否需要删除
+	 * @throws Exception
+	 */
+	public boolean CanDeleteProcess(List<PlnMaterielDetail> temp, List<ProcessUtils> old_proc, int idx, boolean flag)
+			throws Exception {
+		if (old_proc.size() - 1 < idx) {
+			return true;
+		}
+		// 工序点信息
+		List<ComBaseInfo> infoI = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoI);
+		String process_code = "";
+		for (PlnMaterielDetail pln : temp) {
+			// 判断当前虚拟母物料的下一工序,是否对应 工艺路径数组[idx],如果不是,则报错退出“第 idx+1 个工序的虚拟母卷[xxx]对应的下一工序不是
+			// 工序路径数组[idx]”;
+			if (!pln.getNext_process_code().equals(old_proc.get(idx).getProc_code())) {
+				throw new Exception("第 " + idx + 1 + "个工序的虚拟母卷[" + pln.getObject_no_vt() + "]对应的下一工序不是["
+						+ old_proc.get(idx).getProc_name() + "]");
+			}
+//			if (pln.getPrev_process_code() != null && pln.getNext_process_code() != null) {
+//				process_code = get_Prc_Code(pln.getStatus());
+//			} else {
+//				process_code = pln.getPrev_process_code() == null ? pln.getNext_process_code()
+//						: pln.getPrev_process_code();
+//			}
+
+			process_code = old_proc.get(idx).getProc_code();
+			// 判断当前工序是否需要删除 status == -1
+			if ("-1".equals(old_proc.get(idx).getStatus()) || flag) {
+				if ("-1".equals(old_proc.get(idx).getStatus())) {
+					flag = true;
+				}
+				// 判断母卷是否正在生产
+				if (processpoint.slitting_code.equals(process_code)) {
+					if (pln.getLw_plan_no() != null && !"".equals(pln.getLw_plan_no())) {
+						PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+						plpd.setLw_plan_no(pln.getLw_plan_no());
+						plpd.setObject_no_vt(pln.getObject_no_vt());
+						List<PlnLengthwisePlanDetail> lplpd = this.getMapper(PlnLengthwisePlanDetailMapper.class)
+								.find(plpd, 0, 1);
+						if (lplpd != null && lplpd.size() > 0) {
+							if ("5BLW01".equals(lplpd.get(0).getStatus())) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许删除工序!");
+							} else if ("5BLW02".compareTo(lplpd.get(0).getStatus()) <= 0) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许删除工序!");
+							}
+						}
+					}
+				} else if (processpoint.cross_cutting_code.equals(process_code)) {
+
+					if (pln.getCl_plan_no() != null || !"".equals(pln.getCl_plan_no())) {
+						PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+						plpd.setCl_plan_no(pln.getCl_plan_no());
+						plpd.setObject_no_vt(pln.getObject_no_vt());
+						List<PlnCuttolengthPlanDetail> lplpd = this.getMapper(PlnCuttolengthPlanDetailMapper.class)
+								.find(plpd, 0, 1);
+
+						if (lplpd != null && lplpd.size() > 0) {
+							if ("5BCL01".equals(lplpd.get(0).getStatus())) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许删除工序!");
+							} else if ("5BCL02".compareTo(lplpd.get(0).getStatus()) >= 0) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许删除工序!");
+							}
+						}
+					}
+				} else if (processpoint.anneal_code.equals(process_code)) {
+					if (pln.getAn_plan_no() != null || !"".equals(pln.getAn_plan_no())) {
+						PlnAnnealPlanDetail plpd = new PlnAnnealPlanDetail();
+						plpd.setAn_plan_no(pln.getAn_plan_no());
+						plpd.setObject_no_vt(pln.getObject_no_vt());
+						List<PlnAnnealPlanDetail> lplpd = this.getMapper(PlnAnnealPlanDetailMapper.class).find(plpd, 0,
+								1);
+
+						if (lplpd != null && lplpd.size() > 0) {
+							if ("5BAN01".equals(lplpd.get(0).getStatus())) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许删除工序!");
+							} else if ("5BAN02".compareTo(lplpd.get(0).getStatus()) <= 0) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许删除工序!");
+							}
+						}
+					}
+				} else if (processpoint.smooth_code.equals(process_code)) {
+					if (Utils.isNotEmpty(pln.getSr_plan_no())) {
+						PlnSkinrollingPlanDetail plpd = new PlnSkinrollingPlanDetail();
+						plpd.setSr_plan_no(pln.getSr_plan_no());
+						plpd.setObject_no_vt(pln.getObject_no_vt());
+						List<PlnSkinrollingPlanDetail> lplpd = this.getMapper(PlnSkinrollingPlanDetailMapper.class)
+								.find(plpd, 0, 1);
+						if (lplpd != null && lplpd.size() > 0) {
+							if ("5BSR01".equals(lplpd.get(0).getStatus())) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许删除工序!");
+							} else if ("5BSR02".compareTo(lplpd.get(0).getStatus()) <= 0) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许删除工序!");
+							}
+						}
+					}
+
+				} else if (processpoint.rolling_code.equals(process_code)) {
+					if (Utils.isNotEmpty(pln.getRl_plan_no())) {
+						PlnRollingPlanDetail plpd = new PlnRollingPlanDetail();
+						plpd.setRl_plan_no(pln.getRl_plan_no());
+						plpd.setObject_no_vt(pln.getObject_no_vt());
+						List<PlnRollingPlanDetail> lplpd = this.getMapper(PlnRollingPlanDetailMapper.class).find(plpd,
+								0, 1);
+						if (lplpd != null && lplpd.size() > 0) {
+							if ("5BRL01".equals(lplpd.get(0).getStatus())) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许删除工序!");
+							} else if ("5BRL02".compareTo(lplpd.get(0).getStatus()) <= 0) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许删除工序!");
+							}
+						}
+					}
+
+				} else if (processpoint.pickle_code.equals(process_code)) {
+					if (Utils.isNotEmpty(pln.getPc_plan_no())) {
+						PlnPicklePlanDetail plpd = new PlnPicklePlanDetail();
+						plpd.setPc_plan_no(pln.getPc_plan_no());
+						plpd.setObject_no_vt(pln.getObject_no_vt());
+						List<PlnPicklePlanDetail> lplpd = this.getMapper(PlnPicklePlanDetailMapper.class).find(plpd, 0,
+								1);
+						if (lplpd != null && lplpd.size() > 0) {
+							if ("5BPC01".equals(lplpd.get(0).getStatus())) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许删除工序!");
+							} else if ("5BPC02".compareTo(lplpd.get(0).getStatus()) <= 0) {
+								throw new Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许删除工序!");
+							}
+						}
+					}
+				}
+			}
+			List<PlnMaterielDetail> Ary_Mats = new ArrayList<PlnMaterielDetail>();
+			// 获取虚拟子卷信息
+			List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"mat_object_no_vt = '" + pln.getObject_no_vt() + "' and nvl(invalid_flg,0) != 1", "", 0, 0);
+			if (Utils.isNotEmpty(pmd)) {
+				for (PlnMaterielDetail child : pmd) {
+					// 如果 虚拟子卷有实物绑定 AND 工序路径类数组[idx] 状态为 -1,则 报错退出“已经有实物[母卷号xxx]进行了xxx工序的加工,
+					// 不能删除工序xxx!”
+					if (child.getObject_no() != null && "-1".equals(old_proc.get(idx).getStatus())) {
+						throw new Exception(
+								"已经有实物[母卷号" + child.getObject_no() + "]进行了" + old_proc.get(idx).getProc_name()
+										+ "工序的加工, 不能删除工序" + old_proc.get(idx).getProc_name() + "!");
+					}
+					Ary_Mats.add(child);
+				}
+				// 用于判断直接挂子卷并且母卷没挂料情况
+				if (Utils.isNotEmpty(Ary_Mats)) {
+					CanDeleteProcess(Ary_Mats, old_proc, idx + 1, flag);
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 判断能否进行加工计划变更 (虚拟母物料数组, 老工序路径数组, 指针序号 idx)
+	 * 
+	 * @param temp
+	 * @param old_proc
+	 * @param idx
+	 * @return 母卷如果正在生产或者子卷已经挂单(母卷交工) 不允许更变(针对分条开平)
+	 * @throws Exception
+	 */
+	public boolean CanChangeProcessPlan(List<PlnMaterielDetail> temp, List<ProcessUtils> old_proc, int idx)
+			throws Exception {
+		if (old_proc.size() - 1 < idx) {
+			return true;
+		}
+
+		// 工序点信息
+		List<ComBaseInfo> infoI = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoI);
+		String process_code = "";
+		for (PlnMaterielDetail pln : temp) {
+			// 判断当前虚拟母物料的下一工序,是否对应 工艺路径数组[idx],如果不是,则报错退出“第 idx+1 个工序的虚拟母卷[xxx]对应的下一工序不是
+			// 工序路径数组[idx]”;
+			if (!pln.getNext_process_code().equals(old_proc.get(idx).getProc_code())) {
+				throw new Exception("第 " + idx + 1 + "个工序的虚拟母卷[" + pln.getObject_no_vt() + "]对应的下一工序不是["
+						+ old_proc.get(idx).getProc_name() + "]");
+			}
+			if (pln.getPrev_process_code() != null && pln.getNext_process_code() != null) {
+				process_code = get_Prc_Code(pln.getStatus());
+			} else {
+				process_code = pln.getPrev_process_code() == null ? pln.getNext_process_code()
+						: pln.getPrev_process_code();
+			}
+			// 如果母卷正在走的工序是分条或者开平判断是否正在生产
+			if (processpoint.slitting_code.equals(process_code)) {
+				if (pln.getLw_plan_no() != null && !"".equals(pln.getLw_plan_no())) {
+					PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+					plpd.setLw_plan_no(pln.getLw_plan_no());
+					plpd.setObject_no_vt(pln.getObject_no_vt());
+					List<PlnLengthwisePlanDetail> lplpd = this.getMapper(PlnLengthwisePlanDetailMapper.class).find(plpd,
+							0, 1);
+					if (lplpd != null && lplpd.size() > 0) {
+						if ("5BLW01".equals(lplpd.get(0).getStatus())) {
+							throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许变更加工计划!");
+						} else if ("5BLW02".compareTo(lplpd.get(0).getStatus()) <= 0) {
+							throw new Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许变更加工计划!");
+						}
+					}
+				}
+			} else if (processpoint.cross_cutting_code.equals(process_code)) {
+
+				if (pln.getAn_plan_no() != null || !"".equals(pln.getAn_plan_no())) {
+					PlnCuttolengthPlanDetail plpd = new PlnCuttolengthPlanDetail();
+					plpd.setCl_plan_no(pln.getCl_plan_no());
+					plpd.setObject_no_vt(pln.getObject_no_vt());
+					List<PlnCuttolengthPlanDetail> lplpd = this.getMapper(PlnCuttolengthPlanDetailMapper.class)
+							.find(plpd, 0, 1);
+
+					if (lplpd != null && lplpd.size() > 0) {
+						if ("5BCL01".equals(lplpd.get(0).getStatus())) {
+							throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许变更加工计划!");
+						} else if ("5BCL02".compareTo(lplpd.get(0).getStatus()) >= 0) {
+							throw new Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许变更加工计划!");
+						}
+					}
+				}
+			}
+			/*
+			 * else if (processpoint.anneal_code.equals(process_code)) { if
+			 * (pln.getAn_plan_no() != null || !"".equals(pln.getAn_plan_no())) {
+			 * PlnAnnealPlanDetail plpd = new PlnAnnealPlanDetail();
+			 * plpd.setAn_plan_no(pln.getAn_plan_no());
+			 * plpd.setObject_no_vt(pln.getObject_no_vt()); List<PlnAnnealPlanDetail> lplpd
+			 * = this.getMapper(PlnAnnealPlanDetailMapper.class).find(plpd, 0, 1);
+			 * 
+			 * if (lplpd != null && lplpd.size() > 0) { if
+			 * ("5BAN01".equals(lplpd.get(0).getStatus())) { throw new Exception("物料[" +
+			 * pln.getObject_no() + "]已经编制计划,不允许变更加工计划!"); } else if
+			 * ("5BAN02".compareTo(lplpd.get(0).getStatus()) <= 0) { throw new
+			 * Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许变更加工计划!"); } } } } else if
+			 * (processpoint.smooth_code.equals(process_code)) { if
+			 * (Utils.isNotEmpty(pln.getSr_plan_no())) { PlnSkinrollingPlanDetail plpd = new
+			 * PlnSkinrollingPlanDetail(); plpd.setSr_plan_no(pln.getSr_plan_no());
+			 * plpd.setObject_no_vt(pln.getObject_no_vt()); List<PlnSkinrollingPlanDetail>
+			 * lplpd = this.getMapper(PlnSkinrollingPlanDetailMapper.class) .find(plpd, 0,
+			 * 1); if (lplpd != null && lplpd.size() > 0) { if
+			 * ("5BSR01".equals(lplpd.get(0).getStatus())) { throw new Exception("物料[" +
+			 * pln.getObject_no() + "]已经编制计划,不允许变更加工计划!"); } else if
+			 * ("5BSR02".compareTo(lplpd.get(0).getStatus()) <= 0) { throw new
+			 * Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许变更加工计划!"); } } }
+			 * 
+			 * } else if (processpoint.rolling_code.equals(process_code)) { if
+			 * (Utils.isNotEmpty(pln.getRl_plan_no())) { PlnRollingPlanDetail plpd = new
+			 * PlnRollingPlanDetail(); plpd.setRl_plan_no(pln.getRl_plan_no());
+			 * plpd.setObject_no_vt(pln.getObject_no_vt()); List<PlnRollingPlanDetail> lplpd
+			 * = this.getMapper(PlnRollingPlanDetailMapper.class).find(plpd, 0, 1); if
+			 * (lplpd != null && lplpd.size() > 0) { if
+			 * ("5BRL01".equals(lplpd.get(0).getStatus())) { throw new Exception("物料[" +
+			 * pln.getObject_no() + "]已经编制计划,不允许删除工序!"); } else if
+			 * ("5BRL02".compareTo(lplpd.get(0).getStatus()) <= 0) { throw new
+			 * Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许删除工序!"); } } }
+			 * 
+			 * } else if (processpoint.pickle_code.equals(process_code)) { if
+			 * (Utils.isNotEmpty(pln.getPc_plan_no())) { PlnPicklePlanDetail plpd = new
+			 * PlnPicklePlanDetail(); plpd.setPc_plan_no(pln.getPc_plan_no());
+			 * plpd.setObject_no_vt(pln.getObject_no_vt()); List<PlnPicklePlanDetail> lplpd
+			 * = this.getMapper(PlnPicklePlanDetailMapper.class).find(plpd, 0, 1); if (lplpd
+			 * != null && lplpd.size() > 0) { if ("5BPC01".equals(lplpd.get(0).getStatus()))
+			 * { throw new Exception("物料[" + pln.getObject_no() + "]已经编制计划,不允许删除工序!"); }
+			 * else if ("5BPC02".compareTo(lplpd.get(0).getStatus()) <= 0) { throw new
+			 * Exception("物料[" + pln.getObject_no() + "]已经开始生产,不允许删除工序!"); } } }
+			 * 
+			 * }
+			 */
+			List<PlnMaterielDetail> Ary_Mats = new ArrayList<PlnMaterielDetail>();
+			// 获取虚拟子卷信息
+			List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"mat_object_no_vt = '" + pln.getObject_no_vt() + "' and nvl(invalid_flg,0) != 1", "", 0, 0);
+			if (Utils.isNotEmpty(pmd)) {
+				for (PlnMaterielDetail child : pmd) {
+					// 如果 虚拟子卷有实物绑定 AND 工序路径类数组[idx]为“开平”或“分条”,则 报错退出“实物卷[母卷号xxx]已经进行了xxx工序的加工,
+					// 不能修改加工计划!”
+					if (child.getObject_no() != null
+							&& (processpoint.slitting_code.equals(old_proc.get(idx).getProc_code())
+									|| processpoint.cross_cutting_code.equals(old_proc.get(idx).getProc_code()))) {
+						throw new Exception("已经有实物[母卷号" + child.getObject_no() + "]进行了"
+								+ old_proc.get(idx).getProc_name() + "工序的加工, 不能修改加工计划!");
+					}
+					Ary_Mats.add(child);
+				}
+				if (Utils.isNotEmpty(Ary_Mats) && !"-1".equals(old_proc.get(idx).getStatus())
+						&& idx + 1 > old_proc.size()) {
+					CanChangeProcessPlan(Ary_Mats, old_proc, idx + 1);
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 订单接收(变更之后的订单)
+	 * 
+	 * @param order_no
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public void OrderReceive(String order_no) throws Exception {
+
+		// 获取生产订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"order_no = '" + order_no + "'", "", 0, 0);
+		if (Utils.isEmpty(ppo)) {
+			throw new Exception("未找到生产订单信息!");
+		}
+		for (PlnProdorder pln : ppo) {
+			// 获取订单对应的虚拟母卷信息
+			List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"prod_order_no = '" + pln.getProd_order_no()
+							+ "' and nvl(invalid_flg,0) != 1 and mat_object_no_vt is null",
+					"", 0, 0);
+			if (Utils.isNotEmpty(pmd)) {
+				ChangeProcess(pmd, pln.getWhole_process_codes(), -1);
+			}
+		}
+	}
+
+	/**
+	 * 订单变更 工艺路径
+	 * 
+	 * @param pmd_list 虚拟母物料数组
+	 * @param process  工序路径
+	 * @param idx      第一次调用传入 -1
+	 * @throws Exception
+	 */
+	/*
+	 * @Transactional(value = "tm", rollbackFor = Exception.class) public void
+	 * ChangeProcess(List<PlnMaterielDetail> pmd_list, String process, int idx)
+	 * throws Exception {
+	 * 
+	 * // 获取工艺路径集合 String[] path = process.split("-"); ArrayList<String> validpath =
+	 * getProcessPath(path); for (PlnMaterielDetail pmd : pmd_list) {
+	 * 
+	 * // 根据虚拟母物料的 下一工序 和 工序次数,计算其 在新工序路径数组的位置idx, 如果找不到,则报错“新工艺路径不存在 xx工序” //
+	 * 获取下一个工序 // String temp = this.getBean(MesApiDesignInfoImpl.class) //
+	 * .getPath(lpp.get(0).getWhole_process_codes(),
+	 * processpoint.cross_cutting_code, pmdpp.get(0).getProc_repeat_index()); //
+	 * TODO 获取工序 以及 index if (idx == -1) { if
+	 * (Utils.isNotEmpty(pmd.getProc_repeat_index()) && pmd.getProc_repeat_index() >
+	 * 1) { idx = validpath.lastIndexOf(pmd.getNext_process_code()); } else { idx =
+	 * validpath.indexOf(pmd.getNext_process_code()); } if (idx == -1) { throw new
+	 * Exception( "工艺路径不存在 [" + this.getMapper(ComBaseProcessRStationMapper.class)
+	 * .findWithCondition(null, "process_code = '" + pmd.getNext_process_code() +
+	 * "' and validflag = '1'", null, 0, 1) .get(0).getProcess_point_desc() +
+	 * "]工序"); } }
+	 * 
+	 * // 获取虚拟子卷信息 List<PlnMaterielDetail> child =
+	 * this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+	 * "mat_object_no_vt = '" + pmd.getObject_no_vt() +
+	 * "' and nvl(invalid_flg,0) != 1 ", "", 0, 0); if (Utils.isNotEmpty(child)) {
+	 * boolean flag_cf = false; for (PlnMaterielDetail str_c : child) { if
+	 * (Utils.isNotEmpty(str_c.getObject_no())) { // 如果已完成工序包含工序路径视为已完成不参与变更。
+	 * PrcMaterielExtinfo pme = this.getMapper(PrcMaterielExtinfoMapper.class)
+	 * .findById(str_c.getObject_no()); // 未完成生产 if (Utils.isEmpty(pme) ||
+	 * !pme.getActual_process().equals(validpath.toString())) { flag_cf = true;
+	 * continue; } // 未挂单 } else { flag_cf = true; continue; } } if (!flag_cf) {
+	 * continue; } } // 如果虚拟母物料的OBJECT_NO is null,则删除其对应的所有虚拟子卷信息,以及当前虚拟母物料信息;
+	 * continue; if (pmd.getObject_no() == null) { if (Utils.isEmpty(child)) { //
+	 * 删除母卷 this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(pmd); } else {
+	 * // 删除母卷以及子卷 List<PlnMaterielDetail> pmdd = new
+	 * ArrayList<PlnMaterielDetail>(); pmdd.add(pmd);
+	 * this.getBean(PlnMaterielDetailServiceImpl.class).doCancelChild(pmdd); }
+	 * continue; // 如果母卷不为空 } else { List<PlnMaterielDetail> Ary_Mats_Matched = new
+	 * ArrayList<PlnMaterielDetail>(); List<PlnMaterielDetail> Ary_Mats_Null = new
+	 * ArrayList<PlnMaterielDetail>(); // 循环当前虚拟母卷 的 虚拟子物料: for (PlnMaterielDetail
+	 * str : child) { // 如果 虚拟子卷无实物绑定 ,则 Ary_Mats_Null.add{虚拟子物料} if
+	 * (str.getObject_no() == null) { Ary_Mats_Null.add(str); } else if
+	 * (!validpath.get(idx).equals(pmd.getNext_process_code())) { throw new
+	 * Exception("报错退出“实物[母卷:" + pmd.getObject_no_vt() + "]进行了[" +
+	 * this.getMapper(ComBaseProcessRStationMapper.class) .findWithCondition(null,
+	 * "process_code = '" + pmd.getNext_process_code() + "' and validflag = '1'",
+	 * null, 0, 1) .get(0).getProcess_point_desc() + "] 工序的加工, 不能匹配新工艺路径,计划工序为:[" +
+	 * this.getMapper(ComBaseProcessRStationMapper.class).findWithCondition(null,
+	 * "process_code = '" + validpath.get(idx) + "' and validflag = '1'", null, 0,
+	 * 1) .get(0).getProcess_point_desc() + "]!”"); } else if
+	 * (validpath.get(idx).equals(pmd.getNext_process_code())) {
+	 * Ary_Mats_Matched.add(str); } } if (Utils.isNotEmpty(Ary_Mats_Null)) { int
+	 * nul_eq = idx + 1; // 修改作业路径,直接删除后面工序 if (nul_eq >= validpath.size()) { for
+	 * (PlnMaterielDetail amn : Ary_Mats_Null) { List<PlnMaterielDetail> child_k =
+	 * this.getMapper(PlnMaterielDetailMapper.class) .findWithCondition(null,
+	 * "mat_object_no_vt = '" + amn.getObject_no_vt() +
+	 * "' and nvl(invalid_flg,0) != 1 ", "", 0, 0); if (Utils.isEmpty(child_k)) { //
+	 * 删除母卷 this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(amn); } else {
+	 * // 删除母卷以及子卷 List<PlnMaterielDetail> pmdd = new
+	 * ArrayList<PlnMaterielDetail>(); pmdd.add(amn);
+	 * this.getBean(PlnMaterielDetailServiceImpl.class).doCancelChild(pmdd); } //
+	 * 修改母卷修改库存信息 // 修改母卷设计号以及下一个设计工序 // 将虚拟母卷的 下道工序清空 if
+	 * (Utils.isNotEmpty(pmd.getNext_dsn_process_code())) {
+	 * pmd.setNext_dsn_process_code(""); pmd.setNext_process_code("");
+	 * this.getMapper(PlnMaterielDetailMapper.class).update(pmd); } // TODO
+	 * 修改库存状态成品库至在制成品库 YdmProductDetail ypd =
+	 * this.getMapper(YdmProductDetailMapper.class) .findById(pmd.getObject_no());
+	 * if ("500202".equals(ypd.getStorageattr())) { // ypd.setStorageattr("500203");
+	 * CommonPage<YdmProductDetail> cp = new CommonPage<YdmProductDetail>();
+	 * List<YdmProductDetail> ydm = new ArrayList<YdmProductDetail>(); ydm.add(ypd);
+	 * cp.setObjectList(ydm); cp.setMemo1("500203");
+	 * this.getBean(LmsApiServiceImpl.class).doChangeMaterialStorage(cp); } }
+	 * continue; } ChangeProcess(Ary_Mats_Null, process, nul_eq); } if
+	 * (Utils.isNotEmpty(Ary_Mats_Matched)) { int mth_eq = idx + 1; if (mth_eq >=
+	 * validpath.size()) { continue; } ChangeProcess(Ary_Mats_Matched, process,
+	 * mth_eq); for (PlnMaterielDetail match : Ary_Mats_Matched) { // 如果 obj_vt 无任何
+	 * 虚拟子物料,则根据工艺路径,新建后续虚拟物料信息: Design_Plan_Info(生产订单号,新工序路径数组,idx,obj_vt,单重)
+	 * List<PlnMaterielDetail> child_m =
+	 * this.getMapper(PlnMaterielDetailMapper.class) .findWithCondition(null,
+	 * "mat_object_no_vt = '" + match.getObject_no_vt() +
+	 * "' and nvl(invalid_flg,0) != 1 ", "", 0, 0); if (Utils.isEmpty(child_m)) { //
+	 * 删除工艺路径 if (idx + 1 > validpath.size()) { // 修改母卷设计号以及下一个设计工序 // 将虚拟母卷的 下道工序清空
+	 * pmd.setNext_dsn_process_code(""); pmd.setNext_process_code("");
+	 * this.getMapper(PlnMaterielDetailMapper.class).update(pmd); // 修改库存状态成品库至在制成品库
+	 * YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class)
+	 * .findById(match.getObject_no()); if ("500202".equals(ypd.getStorageattr())) {
+	 * // ypd.setStorageattr("500203"); CommonPage<YdmProductDetail> cp = new
+	 * CommonPage<YdmProductDetail>(); List<YdmProductDetail> ydm = new
+	 * ArrayList<YdmProductDetail>(); ydm.add(ypd); cp.setObjectList(ydm);
+	 * cp.setMemo1("500203");
+	 * this.getBean(LmsApiServiceImpl.class).doChangeMaterialStorage(cp); } } else {
+	 * // 修改库存状态(如果物料在成品库修改到在制成品库) YdmProductDetail ypd =
+	 * this.getMapper(YdmProductDetailMapper.class) .findById(match.getObject_no());
+	 * if ("500203".equals(ypd.getStorageattr())) { // ypd.setStorageattr("500202");
+	 * CommonPage<YdmProductDetail> cp = new CommonPage<YdmProductDetail>();
+	 * List<YdmProductDetail> ydm = new ArrayList<YdmProductDetail>(); ydm.add(ypd);
+	 * cp.setObjectList(ydm); cp.setMemo1("500202");
+	 * this.getBean(LmsApiServiceImpl.class).doChangeMaterialStorage(cp); } //
+	 * 调用设计信息接口 List<DesignInfo> infos = new ArrayList<DesignInfo>(); DesignInfo
+	 * info = new DesignInfo(); info.setCurrentProcIndex(idx + 1);
+	 * info.setObject_no(match.getObject_no());
+	 * info.setObject_no_vt(match.getObject_no_vt()); info.setProcess(validpath);
+	 * info.setProd_order_no(match.getProd_order_no());
+	 * info.setSingle_wgt(pmd.getSingle_weight()); infos.add(info); ResultModel
+	 * result = Design_Plan_Info(infos, null); if ("500".equals(result.getState()))
+	 * { throw new Exception(result.getMsgInfo()); } } } } } // 如果无子卷直接进入↓ else { //
+	 * 删除工艺路径 if (idx + 1 > validpath.size()) { // 修改母卷设计号以及下一个设计工序 // 将虚拟母卷的 下道工序清空
+	 * pmd.setNext_dsn_process_code(""); pmd.setNext_process_code("");
+	 * this.getMapper(PlnMaterielDetailMapper.class).update(pmd); // 修改库存状态在制成品库至成品库
+	 * YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class)
+	 * .findById(pmd.getObject_no()); if ("500202".equals(ypd.getStorageattr())) {
+	 * // ypd.setStorageattr("500203"); CommonPage<YdmProductDetail> cp = new
+	 * CommonPage<YdmProductDetail>(); List<YdmProductDetail> ydm = new
+	 * ArrayList<YdmProductDetail>(); ydm.add(ypd); cp.setObjectList(ydm);
+	 * cp.setMemo1("500203");
+	 * this.getBean(LmsApiServiceImpl.class).doChangeMaterialStorage(cp); } } else {
+	 * // 修改库存状态(如果物料在成品库修改到在制成品库) YdmProductDetail ypd =
+	 * this.getMapper(YdmProductDetailMapper.class) .findById(pmd.getObject_no());
+	 * if ("500203".equals(ypd.getStorageattr())) { // ypd.setStorageattr("500202");
+	 * CommonPage<YdmProductDetail> cp = new CommonPage<YdmProductDetail>();
+	 * List<YdmProductDetail> ydm = new ArrayList<YdmProductDetail>(); ydm.add(ypd);
+	 * cp.setObjectList(ydm); cp.setMemo1("500202");
+	 * this.getBean(LmsApiServiceImpl.class).doChangeMaterialStorage(cp); } //
+	 * 则根据工艺路径,新建后续虚拟物料信息: Design_Plan_Info(生产订单号,新工序路径数组, idx,当前虚拟母卷,单重) //
+	 * 调用设计信息接口 List<DesignInfo> infos = new ArrayList<DesignInfo>(); DesignInfo
+	 * info = new DesignInfo(); info.setCurrentProcIndex(idx);
+	 * info.setObject_no(pmd.getObject_no()); info.setProcess(validpath);
+	 * info.setObject_no_vt(pmd.getObject_no_vt());
+	 * info.setProd_order_no(pmd.getProd_order_no());
+	 * info.setSingle_wgt(pmd.getSingle_weight()); infos.add(info); ResultModel
+	 * result = Design_Plan_Info(infos, null); if ("500".equals(result.getState()))
+	 * { throw new Exception(result.getMsgInfo()); } } } } } }
+	 */
+
+	/**
+	 * 订单变更 工艺路径
+	 * 
+	 * @param pmd_list 虚拟母物料数组
+	 * @param process  工序路径
+	 * @param idx      第一次调用传入 -1
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public void ChangeProcess(List<PlnMaterielDetail> pmd_list, String process, int idx) throws Exception {
+
+		// 获取工艺路径集合
+		String[] path = process.split("-");
+		ArrayList<String> validpath = getProcessPath(path);
+		StringBuffer sb = new StringBuffer();
+		for (String str : validpath) {
+			sb.append(str);
+
+		}
+		for (PlnMaterielDetail pmd : pmd_list) {
+
+			// 根据虚拟母物料的 下一工序 和 工序次数,计算其 在新工序路径数组的位置idx, 如果找不到,则报错“新工艺路径不存在 xx工序”
+			if (idx == -1) {
+				idx = getPosition(sb.toString(), pmd.getNext_process_code(), pmd.getProc_repeat_index());
+				if (idx == -1) {
+					throw new Exception(
+							"工艺路径不存在 ["
+									+ this.getMapper(ComBaseProcessRStationMapper.class)
+											.findWithCondition(null,
+													"process_code = '" + pmd.getNext_process_code()
+															+ "' and validflag = '1'",
+													null, 0, 1)
+											.get(0).getProcess_point_desc()
+									+ "]工序");
+				}
+			}
+
+			// 获取虚拟子卷信息
+			List<PlnMaterielDetail> child = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"mat_object_no_vt = '" + pmd.getObject_no_vt() + "' and nvl(invalid_flg,0) != 1 ", "", 0, 0);
+
+			// 判断加入虚拟子卷信息都已经生产完成那么不参与变更直接跳过
+			if (Utils.isNotEmpty(child)) {
+				boolean flag_cf = false;
+				for (PlnMaterielDetail str_c : child) {
+					if (Utils.isNotEmpty(str_c.getObject_no())) {
+						// 如果已完成工序包含工序路径视为已完成不参与变更。
+						PrcMaterielExtinfo pme = this.getMapper(PrcMaterielExtinfoMapper.class)
+								.findById(str_c.getObject_no());
+						// 未完成生产
+						if (Utils.isEmpty(pme) || !pme.getActual_process().equals(validpath.toString())) {
+							flag_cf = true;
+							continue;
+						}
+						// 未挂单
+					} else {
+						flag_cf = true;
+						continue;
+					}
+				}
+				if (!flag_cf) {
+					continue;
+				}
+			}
+
+			// 删除未挂单的虚拟物料信息
+			List<PlnMaterielDetail> pmdd = new ArrayList<PlnMaterielDetail>();
+			pmdd.add(pmd);
+			deletePath(pmdd, validpath, idx);
+
+			// 生成虚拟物料信息
+			createPath(pmdd, validpath, idx);
+
+		}
+	}
+
+	/**
+	 * 创建后续虚拟物料信息
+	 * 
+	 * @param pmds      虚拟物料集合
+	 * @param idx
+	 * @param validpath
+	 * @throws Exception
+	 */
+	public void createPath(List<PlnMaterielDetail> pmds, ArrayList<String> validpath, int idx) throws Exception {
+
+		for (PlnMaterielDetail match : pmds) {
+			// 如果 obj_vt 无任何 虚拟子物料,则根据工艺路径,新建后续虚拟物料信息:
+			// Design_Plan_Info(生产订单号,新工序路径数组,idx,obj_vt,单重)
+			List<PlnMaterielDetail> child_m = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"mat_object_no_vt = '" + match.getObject_no_vt() + "' and nvl(invalid_flg,0) != 1 ", "", 0, 0);
+			if (Utils.isEmpty(child_m)) {
+				if (idx + 1 <= validpath.size()) {
+					// 调用设计信息接口
+					List<DesignInfo> infos = new ArrayList<DesignInfo>();
+					DesignInfo info = new DesignInfo();
+					info.setCurrentProcIndex(idx);
+					info.setObject_no(match.getObject_no());
+					info.setObject_no_vt(match.getObject_no_vt());
+					info.setProcess(validpath);
+					info.setProd_order_no(match.getProd_order_no());
+					info.setSingle_wgt(match.getSingle_weight());
+					infos.add(info);
+					ResultModel result = Design_Plan_Info(infos, null);
+					if ("500".equals(result.getState())) {
+						throw new Exception(result.getMsgInfo());
+					}
+					// 修改库存状态成品库至在制成品库
+					YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class).findById(match.getObject_no());
+					if ("500203".equals(ypd.getStorageattr())) {
+//						ypd.setStorageattr("500203");
+						CommonPage<YdmProductDetail> cp = new CommonPage<YdmProductDetail>();
+						List<YdmProductDetail> ydm = new ArrayList<YdmProductDetail>();
+						ydm.add(ypd);
+						ypd.setMemo("订单变更增加工序->移至在制库");
+						cp.setObjectList(ydm);
+						cp.setMemo1("500202");
+						cp.setMemo2("-1");
+						this.getBean(LmsApiServiceImpl.class).doChangeMaterialStorage(cp);
+					}
+
+				} else {
+					// 修改当前物料库存信息与虚拟物料信息
+					match.setNext_dsn_process_code("");
+					match.setNext_process_code("");
+					this.getMapper(PlnMaterielDetailMapper.class).update(match);
+
+					// 修改库存状态在制品库至成品库
+					YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class).findById(match.getObject_no());
+					if ("500202".equals(ypd.getStorageattr())) {
+//					ypd.setStorageattr("500203");
+						CommonPage<YdmProductDetail> cp = new CommonPage<YdmProductDetail>();
+						List<YdmProductDetail> ydm = new ArrayList<YdmProductDetail>();
+						ypd.setMemo("删除工序->移至成品库");
+						ydm.add(ypd);
+						cp.setObjectList(ydm);
+						cp.setMemo1("500203");
+						cp.setMemo2("0");
+						this.getBean(LmsApiServiceImpl.class).doChangeMaterialStorage(cp);
+					}
+				}
+				// 有子卷
+			} else {
+				createPath(child_m, validpath, idx + 1);
+			}
+		}
+	}
+
+	/**
+	 * 删除未挂单虚拟物料信息
+	 * 
+	 * @param pmds      虚拟物料集合
+	 * @param validpath
+	 * @param idx
+	 * @throws Exception
+	 */
+	public void deletePath(List<PlnMaterielDetail> pmds, ArrayList<String> validpath, int idx) throws Exception {
+
+		for (PlnMaterielDetail ppp : pmds) {
+
+			// 获取子卷信息
+			List<PlnMaterielDetail> child = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					"mat_object_no_vt = '" + ppp.getObject_no_vt() + "' and nvl(invalid_flg,0) != 1 ", "", 0, 0);
+			// 有子卷
+			if (Utils.isNotEmpty(child)) {
+				deletePath(child, validpath, idx + 1);
+			}
+			// 判断本身是否删除未挂单删除
+			if (ppp.getObject_no() == null) {
+				this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(ppp);
+			}
+		}
+	}
+
+	/**
+	 * 
+	 * 获取工艺路径类
+	 * 
+	 * @param process
+	 * @return
+	 */
+	public List<ProcessUtils> getprcUtls(String process) {
+		List<ProcessUtils> old_proc = new ArrayList<ProcessUtils>();
+		String[] path = process.split("-");
+		int index = 0;
+		ArrayList<String> validpath = getProcessPath(path);
+		if (Utils.isNotEmpty(validpath)) {
+			for (String str : validpath) {
+				ProcessUtils pro = new ProcessUtils();
+				pro.setProc_code(str);
+				pro.setProc_index(index++);
+				pro.setProc_name(this.getMapper(ComBaseProcessRStationMapper.class)
+						.findWithCondition(null, "process_code = '" + str + "' and validflag = '1'", null, 0, 1).get(0)
+						.getProcess_point_desc());
+				pro.setRepeat_times(0);
+				pro.setStatus("0");
+				old_proc.add(pro);
+			}
+		}
+		return old_proc;
+	}
+
+	/**
+	 * 修改生产订单状态
+	 * 
+	 * @param order_no 合同号+合同行序号+订单行序号
+	 * @throws Exception
+	 */
+	public void updateOrderStatus(String order_no) throws Exception {
+		// 获取生产订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"order_no = '" + order_no + "'", "", 0, 0);
+		if (Utils.isEmpty(ppo)) {
+			throw new Exception("未找到生产订单信息!");
+		}
+		// 锁定生产订单状态 2
+		this.getMapper(PlnProdorderMapper.class).updateOrderStatus(order_no);
+	}
+
+	/**
+	 * 生产订单是否锁定
+	 * 
+	 * @param prod_order_no
+	 * @return
+	 */
+	public boolean pOrdIsLocked(String prod_order_no) {
+		boolean flag = false;
+		// 查询生产订单是否是锁定状态
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"prod_order_no = '" + prod_order_no + "' and nvl(finished_status,0) = 2 ", "", 0, 1);
+		if (Utils.isNotEmpty(ppo)) {
+			flag = true;
+		}
+		return flag;
+	}
+
+	/**
+	 * 厂内合同与否
+	 * 
+	 * @param prod_order_no 生产订单号
+	 * @return
+	 * @throws Exception
+	 */
+	public boolean getContractType(String prod_order_no) throws Exception {
+		boolean flag = false;
+		// 获取订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"prod_order_no = '" + prod_order_no + "'", "", 0, 1);
+		if (Utils.isEmpty(ppo)) {
+			throw new Exception("未找到生产订单[" + prod_order_no + "]信息!");
+		}
+		if (Utils.isNotEmpty(ppo) && "101603".equals(ppo.get(0).getContract_type_no())) {
+			flag = true;
+		}
+		return flag;
+	}
+
+	/**
+	 * 来料加工合同与否
+	 * 
+	 * @param prod_order_no 生产订单号
+	 * @return
+	 * @throws Exception
+	 */
+	public boolean getCont_Type(String prod_order_no) throws Exception {
+		boolean flag = false;
+		// 获取订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"prod_order_no = '" + prod_order_no + "'", "", 0, 1);
+		if (Utils.isEmpty(ppo)) {
+			throw new Exception("未找到生产订单[" + prod_order_no + "]信息!");
+		}
+		if (Utils.isNotEmpty(ppo) && "101606".equals(ppo.get(0).getContract_type_no())) {
+			flag = true;
+		}
+		return flag;
+	}
+
+	/**
+	 * 物料是否生产完成
+	 * 
+	 * @param object_no
+	 * @return
+	 */
+	public boolean matIsFinish(String object_no) {
+		boolean flag = false;
+		// 获取物料附加信息
+		PrcMaterielExtinfo pme = this.getMapper(PrcMaterielExtinfoMapper.class).findById(object_no);
+		if (Utils.isNotEmpty(pme) && Utils.isNotEmpty(pme.getActual_process())
+				&& Utils.isNotEmpty(pme.getTask_process_codes())
+				&& pme.getActual_process().contains(pme.getTask_process_codes())) {
+			flag = true;
+		}
+		return flag;
+	}
+
+	/**
+	 * 物料充当脱单履历
+	 * 
+	 * @param pmd       虚拟物料信息
+	 * @param remark    备注
+	 * @param userName  操作人
+	 * @param process   工序
+	 * @param opt_type  操作类型
+	 * @param object_no 物料号
+	 */
+	public void createMatLog(PlnMaterielDetail pmd, String remark, String userName, String process, String opt_type,
+			String object_no) {
+		List<PlnMatReplaceLog> lmmrl = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		long iNo = 1;
+		if (lmmrl != null && lmmrl.size() > 0) {
+			iNo = lmmrl.get(0).getSerial_no() + 1;
+		}
+		// 物料充当脱单履历表
+		PlnMatReplaceLog mmrl = new PlnMatReplaceLog();
+		BeanUtils.copyProperties(pmd, mmrl);
+		mmrl.setSerial_no(iNo++);
+		mmrl.setObject_no(object_no);
+		mmrl.setOpt_type(opt_type);
+		mmrl.setCreate_man_name(userName);
+		mmrl.setCreate_time(new Date());
+		mmrl.setProcess(process);
+		mmrl.setRemark(remark);
+		this.getMapper(PlnMatReplaceLogMapper.class).insert(mmrl);
+	}
+
+	/**
+	 * 当前工序是否存在成分材质工序点
+	 * 
+	 * @param object_no_vt 虚拟物料号
+	 * @param process_code 当前工序代码 E/D/C
+	 * @return
+	 * @throws Exception
+	 */
+	public boolean iON_Contain_COC(String object_no_vt, String process_code) throws Exception {
+		boolean flag = false;
+		// 获取虚拟物料信息
+		List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,'0') = '0'", null, 0, 1);
+		if (Utils.isEmpty(lpmdc)) {
+			throw new Exception("未找到虚拟物料[" + object_no_vt + "]信息");
+		}
+		// 获取生产订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"prod_order_no = '" + lpmdc.get(0).getProd_order_no() + "'", "", 0, 1);
+		if (Utils.isEmpty(ppo)) {
+			throw new Exception("未找到虚拟物料[" + object_no_vt + "]对应的订单信息");
+		}
+		// 有结果说明有材质/成分类工序点
+		List<SlmOrdDesignMscPlSti> listSti = this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(null,
+				" design_key = '" + ppo.get(0).getDesign_key() + "'  AND MSC_PLINE = '" + ppo.get(0).getMsc_pline()
+						+ "' and process_code = '" + process_code + "' and PROCESS_POINT_TYPE in ('403201','403202')",
+				"  BACKLOG_SEQ, PROCESS_POINT_SEQ", 0, 0);
+		// 全制程工序点信息存在
+		if (listSti != null && listSti.size() > 0) {
+			flag = true;
+		}
+		return flag;
+	}
+
+	/**
+	 * 能否组检验批
+	 * 
+	 * @param object_no_vt1 虚拟物料号1
+	 * @param object_no_vt2 虚拟物料号2
+	 * @param process_code  当前工序
+	 * @return
+	 * @throws Exception
+	 */
+	public boolean iON_doGroup(String object_no_vt1, String object_no_vt2, String process_code) throws Exception {
+		boolean flag = true;
+		// 获取工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		// 获取虚拟物料信息
+		List<PlnMaterielDetail> pmd1 = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + object_no_vt1 + "' and nvl(invalid_flg,'0') = '0'", null, 0, 1);
+		List<PlnMaterielDetail> pmd2 = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + object_no_vt2 + "' and nvl(invalid_flg,'0') = '0'", null, 0, 1);
+		if (Utils.isEmpty(pmd1)) {
+			throw new Exception("未找到虚拟物料[" + object_no_vt1 + "]信息");
+		}
+		if (Utils.isEmpty(pmd2)) {
+			throw new Exception("未找到虚拟物料[" + object_no_vt2 + "]信息");
+		}
+		// 获取实物信息
+		YdmProductDetail ypd1 = this.getMapper(YdmProductDetailMapper.class).findById(pmd1.get(0).getObject_no());
+		YdmProductDetail ypd2 = this.getMapper(YdmProductDetailMapper.class).findById(pmd2.get(0).getObject_no());
+		if (Utils.isEmpty(ypd1)) {
+			throw new Exception("未找到虚拟物料[" + object_no_vt1 + "]所挂的实物[" + pmd1.get(0).getObject_no() + "]信息");
+		}
+		if (Utils.isEmpty(ypd2)) {
+			throw new Exception("未找到虚拟物料[" + object_no_vt2 + "]所挂的实物[" + pmd2.get(0).getObject_no() + "]信息");
+		}
+		// 获取检验批重量限制
+		List<ComBaseInfo> cba = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"base_code = '200901'  and validflag = '1'", "", 0, 1);
+		if (ypd1.getFactweight().doubleValue()
+				+ ypd2.getFactweight().doubleValue() > Double.parseDouble(cba.get(0).getMemo()) * 1000) {
+			return false;
+		}
+		// 当前工序的获取校验项目
+		List<ComBaseInfo> cbi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2009' and memo like '%" + process_code + "%' and validflag = '1'", "", 0, 0);
+		for (ComBaseInfo com : cbi) {
+
+			// 牌号一致性检验
+			if ("200902".equals(com.getBase_code())) {
+				if (!ypd1.getSteelcode().equals(ypd2.getSteelcode())) {
+					return false;
+				}
+			}
+			// 尺寸一致性校验(厚宽)
+			if ("200903".equals(com.getBase_code())) {
+				if (ypd1.getThick().doubleValue() != ypd2.getThick().doubleValue()
+						|| ypd1.getWidth().doubleValue() != ypd2.getWidth().doubleValue()) {
+					return false;
+				}
+			}
+			// 经过退火工序并且炉号一致
+			if ("200904".equals(com.getBase_code())) {
+				// 获取物料附加信息
+				PrcMaterielExtinfo pmex1 = this.getMapper(PrcMaterielExtinfoMapper.class)
+						.findById(pmd1.get(0).getObject_no());
+				PrcMaterielExtinfo pmex2 = this.getMapper(PrcMaterielExtinfoMapper.class)
+						.findById(pmd2.get(0).getObject_no());
+				if (Utils.isNotEmpty(pmex1) && Utils.isNotEmpty(pmex2) && Utils.isNotEmpty(pmex1.getActual_process())
+						&& Utils.isNotEmpty(pmex2.getActual_process())) {
+					if (pmex1.getActual_process().contains(processpoint.anneal_code)
+							&& pmex2.getActual_process().contains(processpoint.anneal_code) && ypd1.getHeatno() != null
+							&& ypd2.getHeatno() != null && ypd1.getHeatno().equals(ypd2.getHeatno())) {
+						return false;
+					}
+				}
+			}
+		}
+		return flag;
+	}
+
+	/**
+	 * 物料能否加入检验批
+	 * 
+	 * @param object_no_vt 虚拟物料号
+	 * @param plan_no      计划号
+	 * @param process_code 当前工序
+	 * @return
+	 * @throws Exception
+	 */
+	public boolean iON_MatInPlan(PlnMaterielDetail pln, String plan_no) throws Exception {
+		boolean flag = false;
+		// 获取待比较虚拟物料信息
+		List<PlnMaterielDetail> pmdd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + pln.getObject_no_vt() + "' and nvl(invalid_flg,0) <> 1", "", 0, 1);
+		double wgt = pmdd.get(0).getSingle_weight().doubleValue();
+		// 获取计划内所有的虚拟物料信息
+		String str = "nvl(invalid_flg,0) <> 1 and mat_object_no_vt is null ";
+		// 获取工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		if (processpoint.slitting_code.equals(pln.getNext_process_code())) {
+			str += "and lw_plan_no = '" + plan_no + "'";
+		} else if (processpoint.cross_cutting_code.equals(pln.getNext_process_code())) {
+			str += "and cl_plan_no = '" + plan_no + "'";
+		} else if (processpoint.smooth_code.equals(pln.getNext_process_code())) {
+			str += "and sr_plan_no = '" + plan_no + "'";
+		} else if (processpoint.anneal_code.equals(pln.getNext_process_code())) {
+			str += "and an_plan_no = '" + plan_no + "'";
+		} else if (processpoint.rolling_code.equals(pln.getNext_process_code())) {
+			str += "and rl_plan_no = '" + plan_no + "'";
+		} else if (processpoint.pickle_code.equals(pln.getNext_process_code())) {
+			str += "and pc_plan_no = '" + plan_no + "'";
+		}
+		List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, str, "", 0,
+				0);
+		// 当前工序的获取校验项目
+		List<ComBaseInfo> cbi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"base_code = '200901'  and validflag = '1'", "", 0, 1);
+		if (Utils.isNotEmpty(pmd)) {
+			for (PlnMaterielDetail pd : pmd) {
+				wgt += pd.getSingle_weight().doubleValue();
+				flag = iON_doGroup(pln.getObject_no_vt(), pd.getObject_no_vt(), pd.getNext_process_code());
+			}
+			if (wgt > Double.parseDouble(cbi.get(0).getMemo()) * 1000) {
+				return false;
+			}
+		}
+		return flag;
+
+	}
+
+	/**
+	 * 编制计划:分条
+	 * 
+	 * @param oci 虚拟物料号,下一个工序点 必传
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public ResultModel planing(CommonPage<PlnMaterielDetail> oci) throws Exception {
+		ResultModel rm = new ResultModel("200", "计划编制成功!");
+		List<PlnMaterielDetail> lpmd = oci.getObjectList();
+		String plan_no = "";
+		List<String> plan_g = new ArrayList<String>();
+		boolean first_f = false;
+		// 获取工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		String tgMsg = null;
+		// 循环比较虚拟物料信息
+		for (PlnMaterielDetail pln : lpmd) {
+			
+			// 直接在这里获取库存卷是否已经有综判:不存在则直接跳过,并记录哪个卷跳过了20231106刘侣
+			List<PlnMaterielDetail> lpmdq=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pln.getObject_no_vt()+"' and nvl(invalid_flg,0) =0", null, 0, 1);
+			YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class).findById(lpmdq.get(0).getObject_no());
+			if (StringUtils.isEmpty(ypd.getJudgeresult())) {
+				// throw new Exception("物料【"+ypd.getCoilno()+"】还未进行综合判定,不能编制计划");
+				tgMsg += (ypd.getCoilno() + "; ");
+				continue;
+			}
+			// end
+			
+			// 是否包含成分材质检验工序点
+			boolean flag = iON_Contain_COC(pln.getObject_no_vt(), pln.getNext_process_code());
+			if (flag) {
+				// 第一个虚拟物料直接生成计划
+				if (!first_f) {
+					first_f = true;
+					plan_no = createPlan(pln, oci.getMemo1(), oci.getMemo2(),oci.getMemo6());
+					plan_g.add(plan_no);
+				} else {
+					// 物料否加入检验批
+					boolean flag_ig = false;
+					for (String str : plan_g) {
+						boolean ionmatch = iON_MatInPlan(pln, str);
+						if (ionmatch) {
+							flag_ig = true;
+							if (processpoint.slitting_code.equals(pln.getNext_process_code())) {
+								pln.setLw_plan_no(plan_no);
+							} else if (processpoint.cross_cutting_code.equals(pln.getNext_process_code())) {
+								pln.setCl_plan_no(plan_no);
+							} else if (processpoint.smooth_code.equals(pln.getNext_process_code())) {
+								pln.setSr_plan_no(plan_no);
+							} else if (processpoint.anneal_code.equals(pln.getNext_process_code())) {
+								pln.setAn_plan_no(plan_no);
+							} else if (processpoint.rolling_code.equals(pln.getNext_process_code())) {
+								pln.setRl_plan_no(plan_no);
+							} else if (processpoint.pickle_code.equals(pln.getNext_process_code())) {
+								pln.setPc_plan_no(plan_no);
+							}
+							createPlan(pln, oci.getMemo1(), oci.getMemo2(),oci.getMemo6());
+							break;
+						}
+					}
+					// 不能组批则新建
+					if (!flag_ig) {
+						plan_g.add(createPlan(pln, oci.getMemo1(), oci.getMemo2(),oci.getMemo6()));
+					}
+				}
+			} else {
+				// 不包含成分材质,单独生成计划
+				createPlan(pln, oci.getMemo1(), oci.getMemo2(),oci.getMemo6());
+			}
+		}
+		
+		if (tgMsg != null) {
+			rm.setMsgInfo("卷: " + tgMsg + " 没综判未成功,其他计划编制成功"); 
+		}
+		
+		return rm;
+	}
+
+	/**
+	 * 生成计划
+	 * @param pln   虚拟物料信息
+	 * @param memo1 计划编制时间
+	 * @param memo2 机台代码 (平整和开平)
+	 * @return 返回计划号
+	 * @throws Exception
+	 */
+	@Transactional(value = "tm", rollbackFor = Exception.class)
+	public String createPlan(PlnMaterielDetail pln, String memo1, String memo2,String memo6) throws Exception {
+		Date now = new Date();
+		String opr_time = new SimpleDateFormat("yyyyMMddHHmmss").format(now); //操作时间
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		List<PlnMaterielDetail> lpmdq=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pln.getObject_no_vt()+"' and nvl(invalid_flg,0) =0", null, 0, 1);
+		if (Utils.isEmpty(lpmdq)) {
+			throw new Exception("未找到虚拟物料["+pln.getObject_no_vt()+"]信息!");
+		}
+		YdmProductDetail ypd = this.getMapper(YdmProductDetailMapper.class).findById(lpmdq.get(0).getObject_no());
+		if (StringUtils.isEmpty(ypd.getJudgeresult())) {
+			throw new Exception("物料【"+ypd.getCoilno()+"】还未进行综合判定,不能编制计划");
+		}	
+		
+		List<PlnProdorder> ppoL = this.getMapper(PlnProdorderMapper.class).findWithCondition(null, " ORDER_NO='"+ypd.getOrderno()+"'", null, 0, 0);
+		if (ppoL == null || ppoL.size() <= 0) {
+			throw new Exception("生产订单:" + ypd.getOrderno() + " 不存在");
+		}
+		// 验证生产订单状态是否为订单保留:
+		if ("0PAA60".equals(ppoL.get(0).getStatus())) {
+			throw new Exception("生产订单["+ppoL.get(0).getProd_order_no()+"]为 ‘订单保留’ 状态,不允许进行计划编制");
+		}
+		if ("0PAA70".equals(ppoL.get(0).getStatus())) {
+			throw new Exception("生产订单["+ppoL.get(0).getProd_order_no()+"]为 ‘订单作废’ 状态,不允许进行计划编制");
+		}
+		
+		// 获取工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' and validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		// 不包含成分材质,单独生成计划
+		ResultModel sg_rm = new ResultModel();
+		MesOprLog mol = null;
+		CommonPage<PlnMaterielDetail> cp = new CommonPage<PlnMaterielDetail>();
+		List<PlnMaterielDetail> sg_tmp = new ArrayList<PlnMaterielDetail>();
+		sg_tmp.add(pln);
+		cp.setObjectList(sg_tmp);
+		cp.setMemo1(memo1);
+		cp.setMemo2(memo2);
+		cp.setMemo6(memo6);//计划加工时间
+		if (processpoint.slitting_code.equals(pln.getNext_process_code())) {			//4mm 12mm
+			sg_rm = this.getBean(PlnLengthwisePlanServiceImpl.class).doCheckPlanAdd(cp); 
+			mol = new MesOprLog("生产管理", "分条计划编制", "编制计划", userName, opr_time, ypd.getCoilno(), null, null, null, null);
+		} else if (processpoint.cross_cutting_code.equals(pln.getNext_process_code())) {//3mm
+			sg_rm = this.getBean(PlnCuttolengthPlanServiceImpl.class).doCheckPlanAdd(cp);
+			mol = new MesOprLog("生产管理", "开平计划编制", "编制计划", userName, opr_time, ypd.getCoilno(), null, null, null, null);
+		} else if (processpoint.smooth_code.equals(pln.getNext_process_code())) {		//平整
+			sg_rm = this.getBean(PlnSkinrollingDsnMultinfoServiceImpl.class).doCheckPlanAdd(cp);
+			mol = new MesOprLog("生产管理", "平整计划编制", "编制计划", userName, opr_time, ypd.getCoilno(), null, null, null, null);
+		} else if (processpoint.anneal_code.equals(pln.getNext_process_code())) { 		//退火
+			sg_rm = this.getBean(PlnAnnealDsnMultinfoServiceImpl.class).doCheckPlanAdd(cp);
+			mol = new MesOprLog("生产管理", "退火计划编制", "编制计划", userName, opr_time, ypd.getCoilno(), null, null, null, null);
+		} else if (processpoint.rolling_code.equals(pln.getNext_process_code())) {		//轧机
+			sg_rm = this.getBean(PlnRollingDsnMultinfoServiceImpl.class).doCheckPlanAdd(cp);
+			mol = new MesOprLog("生产管理", "轧制计划编制", "编制计划", userName, opr_time, ypd.getCoilno(), null, null, null, null);
+		} else if (processpoint.pickle_code.equals(pln.getNext_process_code())) {		//酸洗
+			sg_rm = this.getBean(PlnPickleDsnMultinfoServiceImpl.class).doCheckPlanAdd(cp);
+			mol = new MesOprLog("生产管理", "酸洗计划编制", "编制计划", userName, opr_time, ypd.getCoilno(), null, null, null, null);
+		}
+		if (!"200".equals(sg_rm.getState())) {
+			throw new Exception(sg_rm.getMsgInfo());
+		}
+		//新增日志记录
+		this.getMapper(MesOprLogMapper.class).insert(mol);
+		return String.valueOf(sg_rm.getData());
+	}
+
+	/**
+	 * 获取平整子卷重量数组
+	 * 
+	 * @param mat_wgt   原料重量
+	 * @param plate_wgt 成品重量
+	 * @return
+	 */
+	public ArrayList<Double> howToSr(double mat_wgt, double plate_wgt) {
+		ArrayList<Double> result = new ArrayList<Double>();
+		// 原料重量/成品重量四舍五入取整
+		int c_num = (int) Math.round(DoubleUtil.div(mat_wgt, plate_wgt));
+		if (c_num == 1 || c_num < 1) {
+			result.add(mat_wgt);
+		} else if (c_num == 2) {
+			result.add(plate_wgt);
+			result.add(DoubleUtil.sub(mat_wgt, plate_wgt));
+		} else {
+			double tmp = 0;
+			for (int i = 0; i < c_num - 1; i++) {
+				result.add(plate_wgt);
+				tmp += plate_wgt;
+			}
+			result.add(DoubleUtil.sub(mat_wgt, tmp));
+		}
+		return result;
+	}
+
+	/**
+	 * 获取子卷的母卷集合 以及判定信息和工序信息
+	 * 
+	 * @param object_no
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Judge_Prc_Info> getMatList(String object_no) throws Exception {
+		if (Utils.isEmpty(object_no))
+			throw new Exception("请传入物料号!");
+		List<Judge_Prc_Info> result = this.getMapper(PrcMaterielProcessMapper.class).findMatInfo(object_no);
+		if (Utils.isNotEmpty(result)) {
+			for (Judge_Prc_Info ydm : result) {
+				// 获取物料对应质量设计信息的工序序号
+				SlmOrdDesignMscPlSti tmp = getPrc_Code_Of_Mat(ydm.getObject_no());
+				long backlog_seq = 0 ;
+				if(Utils.isNotEmpty(tmp)) {
+					backlog_seq = tmp.getBacklog_seq();
+				}else {
+					continue ;
+				}
+				// 通过design_key 和全程产险码获取质量设计信息
+				List<SlmOrdDesignMscPlSti> listSti = this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(
+						null,
+						" design_key = '" + ydm.getDesign_key() + "' and msc_pline = '" + ydm.getMsc_pline()
+								+ "' and process_code = '" + ydm.getProcess_code() + "' and BACKLOG_SEQ = '"
+								+ backlog_seq + "'",
+						" BACKLOG_SEQ ,process_point_seq ", 0, 0);
+				if (Utils.isEmpty(listSti)) {
+					return result;
+				} else { 
+					BeanUtils.copyProperties(listSti.get(0), ydm);
+					ydm.setListSti(listSti);
+				}
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 给计划模块的接口获取全程产线码以及对应的工艺路径
+	 * 
+	 * @param design_key
+	 * @return 2018-09-03 zhangjiao
+	 */
+	public ResultModel GetMscByDesignKey(String design_key) {
+		ResultModel rm = new ResultModel();
+		try {
+			if (design_key == null || "".equals(design_key)) {
+				rm.setState("500");
+				rm.setMsgInfo("参数不正确");
+				return rm;
+			}
+			SlmOrdDesignMscPl _pl = new SlmOrdDesignMscPl();
+			_pl.setDesign_key(design_key);
+			List<SlmOrdDesignMscPl> listPl = this.getMapper(SlmOrdDesignMscPlMapper.class).find(_pl, 0, 0);
+			if (listPl == null || listPl.size() < 1) {
+				rm.setState("500");
+				rm.setMsgInfo("未查询[" + design_key + "]到匹配的制程信息!");
+				return rm;
+			}
+			// and (process_code = 'B' OR process_code = 'D')
+			List<SlmOrdDesignMscPlSti> listSti = this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(
+					null, " design_key = '" + design_key + "'", " BACKLOG_SEQ,PROCESS_POINT_SEQ ", 0, 0);
+			if (listSti == null || listSti.size() < 1) {
+				rm.setState("500");
+				rm.setMsgInfo("未查询[" + design_key + "]匹配的制程信息!");
+				return rm;
+			}
+			for (SlmOrdDesignMscPl mscPl : listPl) {
+				StringBuilder sb = new StringBuilder("");
+				StringBuilder sb2 = new StringBuilder("");
+				StringBuilder sb3 = new StringBuilder("");
+				List<SlmOrdDesignMscPlSti> stition = new ArrayList<SlmOrdDesignMscPlSti>();
+				for (SlmOrdDesignMscPlSti slmOrdDesignMscPlSti : listSti) {
+					if (slmOrdDesignMscPlSti.getMsc_pline().equals(mscPl.getMsc_pline())) {
+						sb2.append("-" + slmOrdDesignMscPlSti.getProcess_point_code());
+						sb.append("-" + slmOrdDesignMscPlSti.getProcess_point_desc());
+						sb3.append("-" + slmOrdDesignMscPlSti.getBacklog_seq());
+						stition.add(slmOrdDesignMscPlSti);
+					}
+				}
+				mscPl.setStition(stition);
+				mscPl.setStations_code(stition.get(0).getWhole_backlog());
+				String[] str = stition.get(0).getWhole_backlog().split("-");
+				ArrayList<String> validpath = new ArrayList<String>(Arrays.asList(str));
+				mscPl.setStations_desc(getpath_name(validpath));
+				mscPl.setWarn_desc(sb3.toString().replaceFirst("-", ""));
+
+			}
+			rm.setData(listPl);
+			rm.setState("200");
+		} catch (Exception e) {
+			rm.setState("500");
+			rm.setMsgInfo("获取全程产线号失败");
+			rm.setErrorInfo(e.getMessage());
+		}
+		return rm;
+	}
+
+	/**
+	 * 获取物料当前执行工序/序号/全程产品码
+	 * 
+	 * @param object_no 物料号
+	 * @return
+	 */
+	public SlmOrdDesignMscPlSti getPrc_Code_Of_Mat(String object_no) throws Exception {
+		// 获取物料附加信息
+		// 原料卷不考虑
+		if(object_no.length() <=8) {
+			return null ;
+		}
+		String prc_code = "" , prod_order_no = "";
+		// 获取虚拟物料信息
+		if (Utils.isEmpty(object_no))
+			throw new Exception("请传入物料号!");
+		List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				" object_no = '" + object_no + "' and nvl(invalid_flg,0) <> 1 ", "", 0, 1);
+		if (Utils.isEmpty(pmd)) {
+			// 获取物料挂单信息
+			List<PlnMatReplaceLog> pmr = this.getMapper(PlnMatReplaceLogMapper.class)
+					.findWithCondition(null, "object_no = '"+object_no+"' and opt_type in('1','2')", " create_time desc ", 0, 1);
+			if(Utils.isNotEmpty(pmr)) {
+				prod_order_no = pmr.get(0).getProd_order_no();
+			}else {
+				return null;
+			}
+			// 获取物料附加信息 
+			PrcMaterielExtinfo pme = this.getMapper(PrcMaterielExtinfoMapper.class).findById(object_no);
+			if(Utils.isNotEmpty(pme)) {
+				if(pme.getActual_process().contains("-")) {
+					prc_code = StringUtils.substringAfterLast(pme.getActual_process(), "-");
+				} else {
+					prc_code = pme.getActual_process() ;
+				}
+			}
+		}else {
+			prod_order_no = pmd.get(0).getProd_order_no();
+			prc_code = pmd.get(0).getPrev_process_code() == null ? pmd.get(0).getNext_process_code()
+					: pmd.get(0).getPrev_process_code();
+		}
+		SlmOrdDesignMscPlSti result = new SlmOrdDesignMscPlSti();
+		result.setProcess_code(prc_code);
+		// 获取订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"prod_order_no = '" + prod_order_no + "'", "", 0, 1);
+		if (Utils.isEmpty(ppo))
+			return null;
+		// 整卷发运
+		if("1".equals(ppo.get(0).getWhole_coil())) {
+			result.setWhole_coil(ppo.get(0).getWhole_coil());
+			return result ;
+		}
+		// 如果没获取到当前的工序信息
+		if(prc_code == "")
+			return null;
+		result.setMsc_pline(ppo.get(0).getMsc_pline());
+		// 通过design_key 和全程产险码以及工序点代码获取工序序号
+		SlmOrdDesignMscPlSti sti = new SlmOrdDesignMscPlSti();
+		sti.setDesign_key(ppo.get(0).getDesign_key());
+		sti.setMsc_pline(ppo.get(0).getMsc_pline());
+		sti.setProcess_code(prc_code);
+		List<SlmOrdDesignMscPlSti> listSti = this.getMapper(PlnProdorderExtinfoMapper.class).getQcmPrcInfo(sti);
+		if (Utils.isEmpty(listSti))
+			return null;
+		result = listSti.get(0);
+		if (Utils.isEmpty(pmd.get(0).getProc_repeat_index())) {
+			// 获取母卷虚拟物料信息
+			List<PlnMaterielDetail> pmd_M = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + pmd.get(0).getMat_object_no_vt() + "' and nvl(invalid_flg,0) <> 1 ", "", 0,
+					1);
+			if (Utils.isEmpty(pmd_M) || listSti.size() < pmd_M.get(0).getProc_repeat_index()) {
+				return null;
+			} else if (listSti.size() >= pmd_M.get(0).getProc_repeat_index()) {
+				result = listSti.get(pmd_M.get(0).getProc_repeat_index() - 1);
+			}
+		} else if (listSti.size() >= pmd.get(0).getProc_repeat_index() && pmd.get(0).getProc_repeat_index() > 1) {
+			result = listSti.get(pmd.get(0).getProc_repeat_index() - 1);
+		}
+		return result;
+	}
+
+	/**
+	 * 获取虚拟物料的工序信息
+	 * 
+	 * @param object_no_vt
+	 * @return
+	 * @throws Exception
+	 */
+	public SlmOrdDesignMscPlSti getPrc_Info_Of_Obvt(String object_no_vt) throws Exception {
+
+		SlmOrdDesignMscPlSti rst = new SlmOrdDesignMscPlSti();
+		// 获取虚拟物料信息
+		List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				" object_no_vt = '" + object_no_vt + "'", null, 0, 1);
+		if (Utils.isEmpty(pmd))
+			return null;
+		// 工序信息
+		String prc_code;
+		if (pmd.get(0).getPrev_process_code() != null && pmd.get(0).getNext_process_code() != null) {
+			prc_code = get_Prc_Code(pmd.get(0).getStatus());
+		} else {
+			prc_code = pmd.get(0).getPrev_process_code() == null ? pmd.get(0).getNext_process_code()
+					: pmd.get(0).getPrev_process_code();
+		}
+		// 获取订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"prod_order_no = '" + pmd.get(0).getProd_order_no() + "'", "", 0, 1);
+		if (Utils.isEmpty(ppo))
+			return null;
+		// 通过design_key 和全程产险码以及工序代码获取工序序号
+		SlmOrdDesignMscPlSti sti = new SlmOrdDesignMscPlSti();
+		sti.setDesign_key(ppo.get(0).getDesign_key());
+		sti.setMsc_pline(ppo.get(0).getMsc_pline());
+		sti.setProcess_code(prc_code);
+		List<SlmOrdDesignMscPlSti> listSti = this.getMapper(PlnProdorderExtinfoMapper.class).getQcmPrcInfo(sti);
+		if (Utils.isEmpty(listSti))
+			return null;
+		rst = listSti.get(0);
+		if (Utils.isEmpty(pmd.get(0).getProc_repeat_index())) {
+			// 获取母卷虚拟物料信息
+			List<PlnMaterielDetail> pmd_M = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + pmd.get(0).getMat_object_no_vt() + "' and nvl(invalid_flg,0) <> 1 ", "", 0,
+					1);
+			if (Utils.isEmpty(pmd_M) || listSti.size() < pmd_M.get(0).getProc_repeat_index()) {
+				return null;
+			} else if (listSti.size() >= pmd_M.get(0).getProc_repeat_index()) {
+				rst = listSti.get(pmd_M.get(0).getProc_repeat_index() - 1);
+			}
+		} else if (listSti.size() >= pmd.get(0).getProc_repeat_index() && pmd.get(0).getProc_repeat_index() > 1) {
+			rst = listSti.get(pmd.get(0).getProc_repeat_index() - 1);
+		}
+		return rst;
+
+	}
+
+	/**
+	 * 比较工艺标准
+	 * 
+	 * 入口厚度可能只有上限或者下限所以赋了初值
+	 * 
+	 * @param tics
+	 */
+	public void comp_Proc_Std(List<SlmOrdDesignMscTic> tics) throws Exception {
+		double ithk_min_f = 0, ithk_max_f = 99, ithk_min_n = 0, ithk_max_n = 99, othk_min_f = 0, othk_max_f = 99,
+				othk_min_n = 0, othk_max_n = 99;
+		CommonPage<SlmOrdDesignMscTic> com = new CommonPage<SlmOrdDesignMscTic>();
+		// 第一道次轧制
+		com.setObject(tics.get(0));
+		ResultModel tic_f = this.getBean(QmsApiServiceImpl.class).getGongYi(com);
+		if ("500".equals(tic_f.getState())) {
+			throw new Exception("获取[" + tics.get(0).getProcess_point_desc() + "]工艺标准失败!" + tic_f.getMsgInfo());
+		}
+		List<SlmOrdDesignMscTicItem> item_f = (List<SlmOrdDesignMscTicItem>) tic_f.getData();
+		// 获取轧制入口厚度出口厚度的代码
+		List<PbModelDb> code = getBase_Name("201001");
+		for (SlmOrdDesignMscTicItem slmO : item_f) {
+			// 入口厚度
+			if (slmO.getCraft_param_code().equals(code.get(0).getText())) {
+				if (slmO.getMin_value() == null && slmO.getMax_value() == null) {
+					throw new Exception("未获取到工艺参数入口厚度,请重新质量设计!");
+				}
+				ithk_min_f = Double.valueOf(slmO.getMin_value() == null ? "0" : slmO.getMin_value());
+				if (Utils.isNotEmpty(slmO.getMax_value())) {
+					ithk_max_f = Double.valueOf(slmO.getMax_value());
+				}
+				continue;
+			}
+			// 出口厚度
+			if (slmO.getCraft_param_code().equals(code.get(1).getText())) {
+				if (slmO.getMin_value() == null && slmO.getMax_value() == null) {
+					throw new Exception("未获取到工艺参数出口厚度,请重新质量设计!");
+				}
+				othk_min_f = Double.valueOf(slmO.getMin_value() == null ? "0" : slmO.getMin_value());
+				if (Utils.isNotEmpty(slmO.getMax_value())) {
+					othk_max_f = Double.valueOf(slmO.getMax_value());
+				}
+				continue;
+			}
+		}
+
+		for (int i = 1; i < tics.size(); i++) {
+			CommonPage<SlmOrdDesignMscTic> com_n = new CommonPage<SlmOrdDesignMscTic>();
+			com_n.setObject(tics.get(i));
+			ResultModel tic_n = this.getBean(QmsApiServiceImpl.class).getGongYi(com_n);
+			if ("500".equals(tic_n.getState())) {
+				throw new Exception("获取[" + tics.get(i).getProcess_point_desc() + "]工艺标准失败!" + tic_n.getMsgInfo());
+			}
+			List<SlmOrdDesignMscTicItem> item_n = (List<SlmOrdDesignMscTicItem>) tic_f.getData();
+			for (SlmOrdDesignMscTicItem slm : item_n) {
+				// 入口厚度
+				if (slm.getCraft_param_code().equals(code.get(0).getText())) {
+					if (slm.getMin_value() == null && slm.getMax_value() == null) {
+						throw new Exception("未获取到工艺参数入口厚度,请重新质量设计!");
+					}
+					ithk_min_n = Double.valueOf(slm.getMin_value() == null ? "0" : slm.getMin_value());
+					ithk_max_n = Double.valueOf(slm.getMax_value());
+					continue;
+				}
+				// 出口厚度
+				if (slm.getCraft_param_code().equals(code.get(1).getText())) {
+					if (slm.getMin_value() == null && slm.getMax_value() == null) {
+						throw new Exception("未获取到工艺参数出口厚度,请重新质量设计!");
+					}
+					othk_min_n = Double.valueOf(slm.getMin_value() == null ? "0" : slm.getMin_value());
+					othk_max_n = Double.valueOf(slm.getMax_value());
+					continue;
+				}
+			}
+			// 比较两个区间是否有公共区间
+			if (Utils.getInterval_min(othk_min_f, othk_max_f, ithk_min_n, ithk_max_n) == -1.0) {
+				throw new Exception("第" + i + "次[" + tics.get(i).getProcess_point_desc() + "]的出口厚度[" + othk_min_f + ","
+						+ othk_max_f + "]和第" + i + 1 + "次[" + tics.get(i).getProcess_point_desc() + "]的入口厚度["
+						+ ithk_min_n + "," + ithk_max_n + "]不匹配!");
+			}
+			othk_min_f = othk_min_n;
+			othk_max_f = othk_max_n;
+		}
+	}
+
+	/**
+	 * 校验第一个道次的入口厚度是否大于订单厚度
+	 * 
+	 * @param tics
+	 * @param thick 订单要求厚度
+	 * @throws Exception
+	 */
+	public void checkFirstProc(List<SlmOrdDesignMscTic> tics, double thick) throws Exception {
+
+		double ithk_min_f = 0, ithk_max_f = 99;
+		CommonPage<SlmOrdDesignMscTic> com = new CommonPage<SlmOrdDesignMscTic>();
+		// 第一道次轧制
+		com.setObject(tics.get(0));
+		ResultModel tic_f = this.getBean(QmsApiServiceImpl.class).getGongYi(com);
+		if ("500".equals(tic_f.getState())) {
+			throw new Exception("获取[" + tics.get(0).getProcess_point_desc() + "]工艺标准失败!" + tic_f.getMsgInfo());
+		}
+		if (Utils.isNotEmpty(tic_f)) {
+			List<SlmOrdDesignMscTicItem> item_f = (List<SlmOrdDesignMscTicItem>) tic_f.getData();
+			// 获取轧制入口厚度出口厚度的代码
+			List<PbModelDb> code = getBase_Name("201001");
+			for (SlmOrdDesignMscTicItem slmO : item_f) {
+				// 入口厚度
+				if (slmO.getCraft_param_code().equals(code.get(0).getText())) {
+					if (slmO.getMin_value() == null && slmO.getMax_value() == null) {
+						throw new Exception("未获取到工艺参数入口厚度,请重新质量设计!");
+					}
+					ithk_min_f = Double.valueOf(slmO.getMin_value() == null ? "0" : slmO.getMin_value());
+					if (Utils.isNotEmpty(slmO.getMax_value())) {
+						ithk_max_f = Double.valueOf(slmO.getMax_value());
+					}
+					break;
+				}
+			}
+
+			if (ithk_max_f < thick) {
+				throw new Exception(
+						"第一道次轧制入口厚度范围[" + ithk_min_f + "," + ithk_max_f + "]不包含订单要求厚度[" + thick + "],请重新质量设计!");
+			}
+		}
+	}
+
+	/**
+	 * 检验最后一个道次的出口厚度信息
+	 * 
+	 * @param tics
+	 * @param thick
+	 * @throws Exception
+	 */
+	public void checkLastProc(List<SlmOrdDesignMscTic> tics, double thick) throws Exception {
+
+		double ithk_min_f = 0, ithk_max_f = 99;
+		CommonPage<SlmOrdDesignMscTic> com = new CommonPage<SlmOrdDesignMscTic>();
+		// 最后一个道次轧制
+		com.setObject(tics.get(tics.size() - 1));
+		ResultModel tic_f = this.getBean(QmsApiServiceImpl.class).getGongYi(com);
+		if ("500".equals(tic_f.getState())) {
+			throw new Exception("获取[" + tics.get(0).getProcess_point_desc() + "]工艺标准失败!" + tic_f.getMsgInfo());
+		}
+		List<SlmOrdDesignMscTicItem> item_f = (List<SlmOrdDesignMscTicItem>) tic_f.getData();
+		if (Utils.isNotEmpty(tic_f)) {
+			// 获取轧制入口厚度出口厚度的代码
+			List<PbModelDb> code = getBase_Name("201001");
+			for (SlmOrdDesignMscTicItem slmO : item_f) {
+				// 入口厚度
+				if (slmO.getCraft_param_code().equals(code.get(0).getText())) {
+					if (slmO.getMin_value() == null && slmO.getMax_value() == null) {
+						throw new Exception("未获取到工艺参数入口厚度,请重新质量设计!");
+					}
+					ithk_min_f = Double.valueOf(slmO.getMin_value() == null ? "0" : slmO.getMin_value());
+					if (Utils.isNotEmpty(slmO.getMax_value())) {
+						ithk_max_f = Double.valueOf(slmO.getMax_value());
+					}
+					break;
+				}
+			}
+
+			if (ithk_max_f < thick || ithk_min_f > thick) {
+				throw new Exception(
+						"最后一道次轧制入口厚度[" + ithk_min_f + "," + ithk_max_f + "]不包含订单要求厚度[" + thick + "],请重新质量设计!");
+			}
+		}
+	}
+
+	/**
+	 * 获取工艺参数
+	 * 
+	 * @param object_no_vt       虚拟物料号
+	 * @param process_point_code 工序点代码 暂可不传
+	 * @return
+	 * @throws Exception
+	 */
+	public List<SlmOrdDesignMscTicItem> getPrc_Parms(String object_no_vt, String process_point_code) throws Exception {
+
+		// 获取虚拟物料对应工序信息
+		SlmOrdDesignMscPlSti sti = getPrc_Info_Of_Obvt(object_no_vt);
+		if (Utils.isEmpty(sti)) {
+			return null;
+		}
+		SlmOrdDesignMscTic tic = new SlmOrdDesignMscTic();
+		BeanUtils.copyProperties(sti, tic);
+		tic.setPline_code("C016");
+		tic.setMachine_code("M0008");
+		// 获取工艺参数
+		CommonPage<SlmOrdDesignMscTic> com = new CommonPage<SlmOrdDesignMscTic>();
+		com.setObject(tic);
+		ResultModel tic_f = this.getBean(QmsApiServiceImpl.class).getGongYi(com);
+		if ("500".equals(tic_f.getState())) {
+			//20191001 不知道原因暂时被注释掉:
+//			throw new Exception("获取[" + sti.getProcess_point_desc() + "]工艺标准失败!" + tic_f.getMsgInfo());
+		}
+		List<SlmOrdDesignMscTicItem> item = (List<SlmOrdDesignMscTicItem>) tic_f.getData();
+		return item;
+
+	}
+
+	/**
+	 * 获取质量设计信息(工序点最小单位)
+	 * 
+	 * @param sti
+	 * @return
+	 */
+	public List<SlmOrdDesignMscPlSti> getQcmDesignInfo(SlmOrdDesignMscPlSti sti) {
+		// 通过design_key 和全程产险码以及工序点代码获取工序序号
+		List<SlmOrdDesignMscPlSti> listSti = this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(sti, "",
+				" BACKLOG_SEQ ,PROCESS_POINT_SEQ", 0, 0);
+		return listSti;
+	}
+
+
+	/**
+	 * 获取基础数据
+	 * 
+	 * @param sort_code 父类编码 (201001 获取轧制工序工艺标准)
+	 * @return
+	 * @throws Exception
+	 */
+	public List<PbModelDb> getBase_Name(String sort_code) throws Exception {
+		List<PbModelDb> lpm = new ArrayList<PbModelDb>();
+		try {
+			lpm = this.getMapper(PbModelDbMapper.class).findComBaseInfoCmdDb(sort_code);
+		} catch (Exception ex) {
+			throw new Exception("服务端异常,获取数据失败!");
+		}
+		return lpm;
+
+	}
+	
+	
+	/**
+	 * 获取订单状态基础数据
+	 * 
+	 * @return
+	 * @throws Exception
+	 */
+	public List<PbModelDb> getProd_Status() throws Exception {
+		List<PbModelDb> lpm = new ArrayList<PbModelDb>();
+		try {
+			lpm = this.getMapper(PbModelDbMapper.class).getProd_Status();
+		} catch (Exception ex) {
+			throw new Exception("服务端异常,获取数据失败!");
+		}
+		return lpm;
+		
+	}
+
+	/**
+	 * 根据物料状态获取物料正在执行的工序 蠢方法暂时没想出更好的
+	 * 
+	 * @param status
+	 * @return
+	 */
+	public String get_Prc_Code(String status) {
+		String prc_code = "";
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		// 分条
+		if (status.contains("LW")) {
+			prc_code = processpoint.slitting_code;
+			// 开平
+		} else if (status.contains("CL")) {
+			prc_code = processpoint.cross_cutting_code;
+			// 罩退
+		} else if (status.contains("AN")) {
+			prc_code = processpoint.anneal_code;
+			// 平整
+		} else if (status.contains("SR")) {
+			prc_code = processpoint.smooth_code;
+			// 轧制
+		} else if (status.contains("RL")) {
+			prc_code = processpoint.rolling_code;
+			// 酸洗
+		} else if (status.contains("PC")) {
+			prc_code = processpoint.pickle_code;
+		}
+		return prc_code;
+	}
+
+	/**
+	 * 获取工序路径
+	 * 
+	 * @param Whole_process_codes 工艺路径
+	 * @param prc_code            当前工序
+	 * @param repeat_index
+	 * @return
+	 */
+	public String getPath(String Whole_process_codes, String prc_code, int repeat_index) {
+		String temp = null;
+		for (int i = 0; i < repeat_index; i++) {
+			Whole_process_codes = StringUtils.substringAfter(Whole_process_codes, prc_code);
+			//temp = StringUtils.substringAfter(Whole_process_codes, prc_code);
+			temp = Whole_process_codes;
+		}
+		return temp;
+	}
+
+	/**
+	 * 获取position
+	 * 
+	 * @param Whole_process_codes 工艺路径
+	 * @param prc_code            当前工序
+	 * @param repeat_index        重复次数
+	 * @return
+	 */
+	public static int getPosition(String Whole_process_codes, String prc_code, int repeat_index) {
+		int position = 0;
+		for (int i = 0; i < repeat_index - 1; i++) {
+			Whole_process_codes = Whole_process_codes.replaceFirst(prc_code, ",");
+		}
+		position = Whole_process_codes.indexOf(prc_code);
+		return position;
+	}
+
+//	public static void main(String[] args) {
+//		System.out.println(getPosition("EBEBE", "E", 3));
+//	}
+
+	/**
+	 * 是否需要生成检验委托
+	 * 
+	 * @param object_no_vt 虚拟物料号
+	 * @param process_code 当前工序代码 A/B/C/D/E
+	 * @return res_int -1 不需要生成
+	 * @throws Exception
+	 */
+	public int Judge_Contain_Qcm(String object_no_vt, String process_code) throws Exception {
+		int res_int = -1;
+		// 获取虚拟物料信息
+		List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + object_no_vt + "' and nvl(invalid_flg,'0') = '0'", null, 0, 1);
+		if (Utils.isEmpty(lpmdc)) {
+			throw new Exception("未找到虚拟物料[" + object_no_vt + "]信息");
+		}
+		// 获取生产订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"prod_order_no = '" + lpmdc.get(0).getProd_order_no() + "'", "", 0, 1);
+		if (Utils.isEmpty(ppo)) {
+			throw new Exception("未找到虚拟物料[" + object_no_vt + "]对应的订单信息");
+		}
+		// 通过design_key 和全程产险码以及工序点代码获取工序序号
+		SlmOrdDesignMscPlSti sti = new SlmOrdDesignMscPlSti();
+		sti.setDesign_key(ppo.get(0).getDesign_key());
+		sti.setMsc_pline(ppo.get(0).getMsc_pline());
+		sti.setProcess_code(process_code);
+		List<SlmOrdDesignMscPlSti> listSti = this.getMapper(PlnProdorderExtinfoMapper.class).getQcmPrcInfo(sti);
+		if (Utils.isEmpty(listSti))
+			return res_int;
+		SlmOrdDesignMscPlSti tmp = listSti.get(0);
+		if (Utils.isEmpty(lpmdc.get(0).getProc_repeat_index())) {
+			// 获取母卷虚拟物料信息
+			List<PlnMaterielDetail> pmd_M = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+					" object_no_vt = '" + lpmdc.get(0).getMat_object_no_vt() + "' and nvl(invalid_flg,0) <> 1 ", "", 0,
+					1);
+			if (Utils.isEmpty(pmd_M) || listSti.size() < pmd_M.get(0).getProc_repeat_index()) {
+				return res_int;
+			} else if (listSti.size() >= pmd_M.get(0).getProc_repeat_index()) {
+				tmp = listSti.get(pmd_M.get(0).getProc_repeat_index() - 1);
+			}
+		} else if (listSti.size() >= lpmdc.get(0).getProc_repeat_index() && lpmdc.get(0).getProc_repeat_index() > 1) {
+			tmp = listSti.get(lpmdc.get(0).getProc_repeat_index() - 1);
+		}
+		// 有结果说明有材质/成分类工序点
+		List<SlmOrdDesignMscPlSti> list = this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(null,
+				" design_key = '" + ppo.get(0).getDesign_key() + "'  AND MSC_PLINE = '" + ppo.get(0).getMsc_pline()
+						+ "' and process_code = '" + process_code + "' and backlog_seq = '" + tmp.getBacklog_seq()
+						+ "' and PROCESS_POINT_TYPE in ('403201','403202')",
+				"  BACKLOG_SEQ, PROCESS_POINT_SEQ", 0, 0);
+		if (Utils.isNotEmpty(list)) {
+			res_int = tmp.getBacklog_seq().intValue();
+		}
+		return res_int;
+	}
+
+	/**
+	 * 销售订单能否拆分
+	 * 
+	 * @param order_no 销售订单主键
+	 * @param wgt      拆分重量 默认0拆分整个订单, >0 判断对应量能否拆分
+	 * @return flag ture
+	 */
+	public boolean cib_Split(String order_no, double wgt) {
+		return true;
+	}
+
+//	public boolean cib_Split(String order_no, double wgt) {
+//		// 工序信息
+//		List<ComBaseInfo> infoI = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+//				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+//		ProcessPoint processpoint = new ProcessPoint(infoI);
+//		double dsn = 0;
+//		boolean flag = false;
+//		// 判断生产订单是否已完全挂单
+//		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+//				" ord_pk = '" + order_no + "'", null, 0, 1);
+//		// 获取生产订单进程信息
+//		List<PlnProdorderStatistic> pps = this.getMapper(PlnProdorderStatisticMapper.class).findWithCondition(null,
+//				" prod_order_no = '" + ppo.get(0).getProd_order_no() + "'", null, 0, 1);
+//		if (ppo.get(0).getWhole_process_codes().contains(processpoint.slitting_code)) {
+//			dsn = pps.get(0).getLw_dsn();
+//		} else if (ppo.get(0).getWhole_process_codes().contains(processpoint.cross_cutting_code)) {
+//			dsn = pps.get(0).getCl_dsn();
+//		} else if (ppo.get(0).getWhole_process_codes().contains(processpoint.anneal_code)) {
+//			dsn = pps.get(0).getAn_dsn();
+//		} else if (ppo.get(0).getWhole_process_codes().contains(processpoint.smooth_code)) {
+//			dsn = pps.get(0).getSr_dsn();
+//		} else if (ppo.get(0).getWhole_process_codes().contains(processpoint.rolling_code)) {
+//			dsn = pps.get(0).getRl_dsn();
+//		} else if (ppo.get(0).getWhole_process_codes().contains(processpoint.pickle_code)) {
+//			dsn = pps.get(0).getPc_dsn();
+//		}
+//		if (wgt == 0) {
+//			if (ppo.get(0).getDelivery_error_min() < dsn) {
+//				// 判断是不是都已经生产完成
+//				List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+//						"order_no = '" + ppo.get(0).getOrder_no()
+//								+ "' and next_process_code is null and object_no is null",
+//						null, 0, 0);
+//				if (Utils.isEmpty(pmd)) {
+//					flag = true;
+//				}
+//			}
+//		} else if (wgt > 0) {
+//			if (dsn >= wgt*1000) {
+//				double finish_db = 0;
+//				// 判断完成的量是否 > wgt
+//				List<PlnMaterielDetail> pmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+//						"order_no = '" + ppo.get(0).getOrder_no()
+//								+ "' and next_process_code is null and object_no is not null",
+//						null, 0, 0);
+//				for (PlnMaterielDetail pln : pmd) {
+//					finish_db += pln.getSingle_weight();
+//				}
+//				if (finish_db >= wgt*1000) {
+//					flag = true;
+//				}
+//			}
+//		}
+//		return flag;
+//	}
+
+	/**
+	 * 获取计划状态
+	 * 
+	 * @param prefix 分条LW/开平CL/罩退AN/平整SR/轧制RL/酸洗PC
+	 * @return
+	 */
+	public List<PbModelDb> getPlanStatus(String prefix) {
+		List<PbModelDb> rst = new ArrayList<PbModelDb>();
+		PbModelDb pb = new PbModelDb();
+		pb.setId("0");
+		pb.setText("全部");
+		rst.add(pb);
+		PbModelDb pb0 = new PbModelDb();
+		pb0.setId("5B" + prefix + "01");
+		pb0.setText("已编制计划");
+		rst.add(pb0);
+		PbModelDb pb1 = new PbModelDb();
+		pb1.setId("5B" + prefix + "02");
+		pb1.setText("计划已下发");
+		rst.add(pb1);
+		PbModelDb pb2 = new PbModelDb();
+		pb2.setId("5B" + prefix + "03");
+		pb2.setText("开始作业");
+		rst.add(pb2);
+		PbModelDb pb3 = new PbModelDb();
+		if("AN".equals(prefix)) {
+			pb3.setId("5B" + prefix + "80");
+		}else {
+			pb3.setId("5B" + prefix + "10");
+		}
+		pb3.setText("已完成计划");
+		rst.add(pb3);
+		return rst;
+	}
+	
+	
+	
+	/**
+	 * 获取工艺参数
+	 * 
+	 * @param object_no_vt       虚拟物料号
+	 * @param machine_code       机台代码 暂可不传
+	 * @return
+	 * @throws Exception
+	 */
+	public List<SlmOrdDesignMscTicItem> getPrc_Params(String object_no_vt, String machine_code) throws Exception {
+
+		// 获取虚拟物料对应工序信息
+		SlmOrdDesignMscPlSti sti = getPrc_Info_Of_Obvt(object_no_vt);
+		if (Utils.isEmpty(sti)) {
+			return null;
+		}
+		SlmOrdDesignMscTic tic = new SlmOrdDesignMscTic();
+		SlmOrdDesignMscPlGxPrl prl = new SlmOrdDesignMscPlGxPrl();
+		BeanUtils.copyProperties(sti, prl);
+		BeanUtils.copyProperties(sti, tic);
+		// 获取产线
+		List<SlmOrdDesignMscPlGxPrl> listPrl =this.getMapper(SlmOrdDesignMscPlGxPrlMapper.class).find(prl, 0, 0);
+		if(Utils.isNotEmpty(listPrl)) {
+			tic.setPline_code(listPrl.get(0).getPline_code());
+		}
+//		tic.setMachine_code(machine_code);
+		// 获取工艺参数
+		CommonPage<SlmOrdDesignMscTic> com = new CommonPage<SlmOrdDesignMscTic>();
+		com.setObject(tic);
+		ResultModel tic_f = this.getBean(QmsApiServiceImpl.class).getGongYi(com);
+		if ("500".equals(tic_f.getState())) {
+			// 20191001 不知道原因暂时注释掉:
+//			throw new Exception("获取[" + sti.getProcess_point_desc() + "]工艺标准失败!" + tic_f.getMsgInfo());
+		}
+		List<SlmOrdDesignMscTicItem> item = (List<SlmOrdDesignMscTicItem>) tic_f.getData();
+		return item;
+
+	}
+
+}

+ 1302 - 0
src/main/java/market/Api/Mes/impl/MesApiPicklePlanServiceImpl.java

@@ -0,0 +1,1302 @@
+package market.Api.Mes.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import market.Api.Mes.service.MesApiPicklePlanService;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.vo.ComBaseInfo;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielInvalidMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielInvalid;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.MaterielTrack.mapper.PrcMaterielExtinfoMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielRelationMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielVtProcessMapper;
+import market.Mes.MaterielTrack.vo.PrcMaterielProcess;
+import market.Mes.MaterielTrack.vo.PrcMaterielRelation;
+import market.Mes.MaterielTrack.vo.PrcMaterielVtProcess;
+import market.Mes.OrderManager.Plan.mapper.PlnOrderStatisticMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderStatisticMapper;
+import market.Mes.OrderManager.Plan.vo.PlnOrderStatistic;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.OrderManager.Plan.vo.PlnProdorderStatistic;
+import market.Mes.Pickle.Design.mapper.PlnPcPlanStatisticMapper;
+import market.Mes.Pickle.Design.mapper.PlnPickleDsnMainMapper;
+import market.Mes.Pickle.Design.mapper.PlnPickleDsnMultinfoMapper;
+import market.Mes.Pickle.Design.vo.PlnPcPlanStatistic;
+import market.Mes.Pickle.Design.vo.PlnPickleDsnMain;
+import market.Mes.Pickle.Design.vo.PlnPickleDsnMultinfo;
+import market.Mes.Pickle.Performance.mapper.MesPlmMMapper;
+import market.Mes.Pickle.Performance.vo.MesPlmM;
+import market.Mes.Pickle.Plan.mapper.PlnPicklePlanDetailMapper;
+import market.Mes.Pickle.Plan.mapper.PlnPicklePlanMapper;
+import market.Mes.Pickle.Plan.vo.PlnPicklePlan;
+import market.Mes.Pickle.Plan.vo.PlnPicklePlanDetail;
+
+import org.springframework.beans.BeanUtils;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path = "MesApiPicklePlanService")
+public class MesApiPicklePlanServiceImpl extends BaseServiceImpl implements MesApiPicklePlanService {
+
+	// --------------------------------酸洗上料、下PDI Start----------------------------------------------------
+
+	/**
+	 * 酸洗上料接口 下PDI 验证
+	 * 
+	 * @throws Exception 其实都是单条操作
+	 */
+	public void MesPlmMAddValid(List<MesPlmM> oci) throws Exception {
+		// 循环 根据(酸洗计划号数组,虚拟物料号数组) 读取 酸洗计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for (MesPlmM mcsm : oci) {
+			PlnPicklePlanDetail plpd = new PlnPicklePlanDetail();
+			plpd.setPc_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“酸洗计划[xxxxx][xx]信息不存在!”
+			List<PlnPicklePlanDetail> lppd = this.getMapper(PlnPicklePlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnPicklePlanDetail ppdc : lppd) {
+				// 判断酸洗计划明细的状态【STATUS】
+				if (ppdc.getStatus().compareTo("5BPC02") > 0) {
+					throw new Exception(
+							"酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]已上料,不能再次操作!");
+				}
+			}
+		}
+	}
+
+	/**
+	 * 酸洗上料接口 下PDI
+	 * 
+	 * @throws Exception 其实都是单条操作
+	 */
+	public void MesPlmMAdd(List<MesPlmM> oci) throws Exception {
+
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 循环 根据(酸洗计划号数组,虚拟物料号数组) 读取 酸洗计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for (MesPlmM mcsm : oci) {
+			PlnPicklePlanDetail plpd = new PlnPicklePlanDetail();
+			plpd.setPc_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“酸洗计划[xxxxx][xx]信息不存在!”
+			List<PlnPicklePlanDetail> lppd = this.getMapper(PlnPicklePlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnPicklePlanDetail ppdc : lppd) {
+				// 判断酸洗计划明细的状态【STATUS】
+				if (ppdc.getStatus().compareTo("5BPC02") > 0) {
+					throw new Exception(
+							"酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]已上料,不能再次操作!");
+				}
+				PrcMaterielProcess pmp = new PrcMaterielProcess();
+				pmp.setPrc_code("5BPC03");// 新增的状态
+
+				// 这里的格式要和字符串日期的格式匹配,不然会抛出转换异常
+				SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+				if (mcsm.getMemo() != null && !"".equals(mcsm.getMemo())) {
+					Date createdate = dateFormat.parse(mcsm.getMemo());
+					pmp.setCreate_time(createdate);
+				} else {
+					pmp.setCreate_time(new Date());
+				}
+
+				pmp.setObject_no(M1.getObject_no());
+				pmp.setCreate_man_name(userName);
+				pmp.setRemark(mcsm.getMemo());
+				// 新增物料跟踪:
+				this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+
+				// 修改酸洗计划明细表
+				PlnPicklePlanDetail plpdu = new PlnPicklePlanDetail();
+				plpdu.setStatus("5BPC03");
+				plpdu.setSerial_no(ppdc.getSerial_no());
+				this.getMapper(PlnPicklePlanDetailMapper.class).update(plpdu);
+			}
+
+			// 根据母卷号,查询对应的所有子卷信息
+			PlnMaterielDetail pmdq = new PlnMaterielDetail();
+			pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq,
+					"  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+			for (PlnMaterielDetail ppdc : lpmdc) {
+				// 修改各子卷的 状态 STATUS= 0PPC03;
+				PlnMaterielDetail pmdu = new PlnMaterielDetail();
+				pmdu.setSerial_no(ppdc.getSerial_no());
+				pmdu.setStatus("0PPC03");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+				// 增加子卷的 虚拟物料履历表
+				this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(), "0PPC03", userName,
+						new Date());
+			}
+
+			// 修改酸洗计划主表
+			doUpdatePlnPicklePlan(mcsm.getSchedule_no());
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			// 修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PPC03");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			// 写虚拟物料履历,状态填: 0PPC03 母卷
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PPC03", userName,
+					new Date());
+		}
+	}
+
+	/**
+	 * 撤销酸洗上料接口 下PDI 验证
+	 * 
+	 * @param 虚拟子卷号
+	 * @throws Exception 其实都是单条操作
+	 */
+	public void MesPlmMCancelValid(List<MesPlmM> oci) throws Exception {
+		// 循环 根据(酸洗计划号数组,虚拟物料号数组) 读取 酸洗计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for (MesPlmM mcsm : oci) {
+			PlnPicklePlanDetail plpd = new PlnPicklePlanDetail();
+			plpd.setPc_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“酸洗计划[xxxxx][xx]信息不存在!”
+			List<PlnPicklePlanDetail> lppd = this.getMapper(PlnPicklePlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnPicklePlanDetail ppdc : lppd) {
+				// 判断酸洗计划明细的状态【STATUS】
+				if (!"5BPC03".equals(ppdc.getStatus())) {
+					throw new Exception(
+							"酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]上料后,经过其他操作,不允许撤销!");
+				}
+			}
+		}
+	}
+
+	/**
+	 * 撤销酸洗上料接口 下PDI
+	 * 
+	 * @param 虚拟子卷号
+	 * @throws Exception 其实都是单条操作
+	 */
+	public void MesPlmMCancel(List<MesPlmM> oci) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 循环 根据(酸洗计划号数组,虚拟物料号数组) 读取 酸洗计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for (MesPlmM mcsm : oci) {
+			PlnPicklePlanDetail plpd = new PlnPicklePlanDetail();
+			plpd.setPc_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“酸洗计划[xxxxx][xx]信息不存在!”
+			List<PlnPicklePlanDetail> lppd = this.getMapper(PlnPicklePlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnPicklePlanDetail ppdc : lppd) {
+				// 判断酸洗计划明细的状态【STATUS】
+				if (!"5BPC03".equals(ppdc.getStatus())) {
+					throw new Exception(
+							"酸洗计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]上料后,经过其他操作,不允许撤销!");
+				}
+				PrcMaterielProcess pmp = new PrcMaterielProcess();
+				pmp.setObject_no(M1.getObject_no());
+				pmp.setPrc_code("5BPC03");
+				pmp.setRemark("回退上料");
+				pmp.setKeep_sametime_status(0);
+				ResultModel al = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+				
+				// 正常流程是不会点击上料按钮的,所以不管是否已上料:20220728 treals
+				// ===start===
+				// 撤销实物物料状态跟踪
+//				if (!"0".equals(al.getState())) {
+//					throw new Exception("物料状态不是已上料状态,不允许撤销!");
+//				}
+				// === end===
+				
+				// 修改酸洗计划明细表
+				PlnPicklePlanDetail plpdu = new PlnPicklePlanDetail();
+				// V_最后状态
+				
+				// 恢复计划,将状态固定恢复到 已下发(5BPC02): 20220728 treals
+				// === start===
+				// 之前的代码
+//				plpdu.setStatus(((PrcMaterielProcess) al.getData()).getPrc_code());// "5BPC02"
+				plpdu.setStatus("5BPC02");// "5BPC02"
+				// ===end===
+				
+				plpdu.setSerial_no(ppdc.getSerial_no());
+				this.getMapper(PlnPicklePlanDetailMapper.class).update(plpdu);
+			}
+
+			// 根据母卷号,查询对应的所有子卷信息
+			PlnMaterielDetail pmdq = new PlnMaterielDetail();
+			pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq,
+					"  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+			for (PlnMaterielDetail ppdc : lpmdc) {
+				// 修改各子卷的 状态 STATUS= 0PPC02;
+				PlnMaterielDetail pmdu = new PlnMaterielDetail();
+				pmdu.setSerial_no(ppdc.getSerial_no());
+				pmdu.setStatus("0PPC02");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+				// 增加子卷的 虚拟物料履历表
+				this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(), "0PPC02", userName,
+						new Date());
+			}
+			// 修改酸洗计划主表
+			doUpdatePlnPicklePlan(mcsm.getSchedule_no());
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			// 修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PPC02");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			// 写虚拟物料履历,状态填: 0PPC02 母卷
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PPC02", userName,
+					new Date());
+		}
+	}
+	// --------------------------------酸洗上料、下PDI End----------------------------------------------------
+
+	// --------------------------------酸洗完成  Start----------------------------------------------------
+	/**
+	 * 酸洗完成 实物 生成接口 产生实物,未挂上单时调用
+	 * 
+	 * @param OBJECT_NO     实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @param RELATION_TYPE 关系类型 1:改号(原-现号码对应);2:酸洗(板坯-钢板对应);3:剪切/切割(母-子对应)
+	 * @throws Exception
+	 */
+	public void PickleFinsh_PrcMatRelAdd(PrcMaterielRelation pmr) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+		// 调用 新增实物物料状态跟踪: 传入(实物子卷号,5BPC10,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmr.getSub_object_no());
+		pmp.setPrc_code("5BPC10");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+
+		// 调用公共函数2 建立物料母子对应关系
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRelation_type(2);
+		pmr.setPrc_code("5BPC10");
+		pmr.setRemark("");
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+
+		// 新增物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmr.getObject_no(), pmr.getSub_object_no(),
+				null, processpoint.pickle_code);
+	}
+
+	/**
+	 * 撤销酸洗 实物 撤销生成接口 产生实物,未挂上单时调用
+	 * 
+	 * @param OBJECT_NO     实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @throws Exception
+	 */
+	public void PickleFinsh_PrcMatRelRemove(PrcMaterielRelation pmr) throws Exception {
+
+		// 回退子卷物料跟踪:
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmr.getSub_object_no());
+		pmp.setPrc_code("5BPC10");
+		pmp.setKeep_sametime_status(0);
+		pmp.setRemark("撤销酸洗实物生成");
+		ResultModel al = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		// 撤销实物物料状态跟踪
+		if (!"0".equals(al.getState())) {
+			throw new Exception("实物[" + pmp.getObject_no() + "]状态已发生改变,不能撤销!");
+		}
+
+		// 调用公共函数3 断开物料母子对应关系
+		PrcMaterielRelation pmrd = new PrcMaterielRelation();
+		pmrd.setObject_no(pmr.getObject_no());
+		pmr.setSub_object_no(pmr.getSub_object_no());
+		this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+
+		// 删除物料附加信息
+		this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmr.getSub_object_no());
+	}
+
+	/**
+	 * 酸洗完成 虚拟子卷 挂料接口
+	 * 
+	 * @param material_no   实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @param object_no_vt  虚拟子卷号
+	 * @param create_time   操作时间 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+	 * @throws Exception
+	 */
+	public void PickleFinsh_Relation(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		// 新增物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(),
+				pmd.getObject_no_vt(), processpoint.pickle_code);
+
+		// 调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(pmd.getSub_object_no());
+		List<YdmProductDetail> lypd = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if (lypd == null || lypd.size() == 0) {
+			throw new Exception("库存中无[" + pmd.getObject_no() + "]实物卷!");
+		}
+
+		// 酸洗工序代码processpoint.pickle_code 2018-06-13
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + pmd.getObject_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		if (!lypd.get(0).getSteelcode().equals(lpmd.get(0).getSteel_code())) {
+			//throw new Exception("实物卷[" + pmd.getObject_no() + "]和虚拟卷[" + pmd.getObject_no_vt() + "]的牌号不匹配,不能绑定");
+		}
+		// 2018-08-27 生产完成后厚度按实际情况取值,很有可能和计划不一致,故去此验证.
+//			if(lypd.get(0).getThick().doubleValue()!=lpmd.get(0).getThick().doubleValue()){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的厚不匹配,不能绑定");
+//			}
+		// ------------------------2018-03-16------------------------------
+		// 100-100>5 考虑偏差
+//			if((lypd.get(0).getWidth().doubleValue()-lpmd.get(0).getWidth().doubleValue()>dUpper)
+//					||(lypd.get(0).getWidth().doubleValue()-lpmd.get(0).getWidth().doubleValue()<dLower)){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的宽不匹配,不能绑定");
+//			}
+//			//----------------------------------------------------------------
+//			if(lpmd.get(0).getObject_no()!=null&&!"".equals(lpmd.get(0).getObject_no())){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]已绑定其他计划, 不能再次绑定!");
+//			}
+//			
+
+		// 修改虚拟物料表
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		pmdq.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdq.setObject_no(pmd.getSub_object_no());
+		pmdq.setStatus("0PPC10");
+		pmdq.setIs_finished("1");
+//			pmdq.setPrev_process_code(processpoint.pickle_code);
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdq);
+		// 新增虚拟子物料履历
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PPC10", userName,
+				createTime);
+
+		// 调用 新增实物物料状态跟踪: 传入(实物子卷号,5BPC10,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getSub_object_no());
+		pmp.setPrc_code("5BPC10");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+
+		// 2018-06-19 去掉 判断下一工序==null条件(判断虚拟子物料是否是其他子料的原料)
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpmd.get(0).getOrder_no());
+		pos.setPc(lpmd.get(0).getSingle_weight());
+		pos.setPc_cnt(1l);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePcPlaned(pos);
+
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+		pps.setPc(lpmd.get(0).getSingle_weight());
+		pps.setPc_cnt(1l);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+		// 修改虚拟物料对应的 酸洗计划进程表
+		PlnPcPlanStatistic plps = new PlnPcPlanStatistic();
+		plps.setPc_plan_no(lpmd.get(0).getPc_plan_no());
+		plps.setPc(lpmd.get(0).getSingle_weight());
+		plps.setPc_cnt(1l);
+		this.getMapper(PlnPcPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 调用公共函数2 建立物料母子对应关系
+		PrcMaterielRelation pmr = new PrcMaterielRelation();
+		pmr.setObject_no(pmd.getMaterial_no());
+		pmr.setSub_object_no(pmd.getSub_object_no());
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRemark("");
+		pmr.setRelation_type(2);
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+	}
+
+	/**
+	 * 酸洗完成 不符合计划 实物生成, 新增虚拟子卷挂料
+	 * 
+	 * @param sub_object_no 实物子卷号
+	 * @param object_no     实物母卷号
+	 * @param create_time   操作时间 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+	 * @throws Exception 2018-06-19
+	 */
+	public ResultModel PickleFinsh_No_Plan(PlnMaterielDetail pmd) throws Exception {
+		ResultModel rm = new ResultModel("200", "");
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+		// 调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(pmd.getSub_object_no());
+		List<YdmProductDetail> lypd = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if (lypd == null || lypd.size() == 0) {
+			throw new Exception("库存中无[" + pmd.getSub_object_no() + "]实物卷!");
+		}
+		// 获取母卷虚拟物料信息
+		PlnMaterielDetail pmdcm = new PlnMaterielDetail();
+		pmdcm.setObject_no(pmd.getObject_no());
+		List<PlnMaterielDetail> pmdpp = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdcm,
+				" nvl(invalid_flg,0) = 0 ", "", 0, 1);
+		if (pmdpp == null || pmdpp.size() == 0) {
+			rm.setState("500");
+			rm.setMsgInfo("实物[" + pmd.getObject_no() + "]的虚拟物料信息不存在!");
+			return rm;
+		}
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(pmdpp.get(0).getProd_order_no());
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		if (lpp == null || lpp.size() == 0) {
+			rm.setState("500");
+			rm.setMsgInfo("生产订单[" + pp.getProd_order_no() + "]不存在!");
+			return rm;
+		}
+
+		// 获取下一个工序
+		String temp = this.getBean(MesApiDesignInfoImpl.class)
+				.getPath(lpp.get(0).getWhole_process_codes(), processpoint.pickle_code, pmdpp.get(0).getProc_repeat_index());
+		String[] path =  temp.split("-");
+		ArrayList<String> validpath = this.getBean(MesApiDesignInfoImpl.class).getProcessPath(path);
+
+		// 新建虚拟物料表【PLN_MATERIEL_DETAIL】虚拟子卷信息
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		// 获取序列号
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null,
+				" serial_no desc ", 0, 1);
+		long PMDNo = lpmd == null ? 1 : (lpmd.size() == 0 ? 1 : (lpmd.get(0).getSerial_no() + 1));
+		// 6位日期
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		// 6位流水号
+		int objectnoVtNo = this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate) + 1;
+		pmdc.setSerial_no(PMDNo);
+		// 年月日(6位)+6位流水
+		pmdc.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo));
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setObject_no(pmd.getSub_object_no());
+		pmdc.setPline_code(lpp.get(0).getPline_code());
+		pmdc.setStatus("0PPC10");
+		pmdc.setIs_finished("1");
+		pmdc.setPrev_dsn_process_code(processpoint.pickle_code);
+		pmdc.setPrev_process_code(processpoint.pickle_code);
+		pmdc.setIs_prev_dsn_finished("1");// 母卷:0
+		pmdc.setCreate_design_no(pmdpp.get(0).getPc_design_no());
+		pmdc.setCreate_process_code(processpoint.pickle_code);
+		if (Utils.isNotEmpty(validpath)) {
+			pmdc.setNext_dsn_process_code(validpath.get(0));
+			pmdc.setNext_process_code(validpath.get(0));
+		}
+		pmdc.setIs_mat(0);// 母卷:1
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pmdc.setPline_code(lpp.get(0).getPline_code());
+		pmdc.setLw_design_no(pmdpp.get(0).getLw_design_no());
+		pmdc.setRl_design_no(pmdpp.get(0).getRl_design_no());
+		pmdc.setCl_plan_no(pmdpp.get(0).getCl_plan_no());
+		pmdc.setRl_plan_no(pmdpp.get(0).getRl_plan_no());
+		pmdc.setPc_design_no(pmdpp.get(0).getPc_design_no());
+		pmdc.setPc_plan_no(pmdpp.get(0).getPc_plan_no());
+		pmdc.setMat_object_no_vt(pmdpp.get(0).getObject_no_vt());
+		pmdc.setIs_multi("0");
+		pmdc.setSteel_code(lpp.get(0).getSteel_code());
+		pmdc.setWidth(lypd.get(0).getWidth());
+		pmdc.setThick(lypd.get(0).getThick());
+		pmdc.setLength(lypd.get(0).getLength());
+		pmdc.setDiameter_inn(lypd.get(0).getDiameter_inn());
+		pmdc.setDiameter_out(lypd.get(0).getDiameter_out());
+		pmdc.setSingle_weight(lypd.get(0).getFactweight());
+		pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pmdc.setOrd_flg("2");
+		pmdc.setCreate_man_name(userName);
+		pmdc.setCreate_time(createTime);
+		pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+
+		// 子卷存在下一个工序
+		if (Utils.isNotEmpty(validpath)) {
+			// 调用设计信息接口
+			List<DesignInfo> infos = new ArrayList<>();
+			DesignInfo infor = new DesignInfo();
+			infor.setCurrentProcIndex(0);
+			infor.setObject_no(pmd.getSub_object_no());
+			infor.setObject_no_vt(pmdc.getObject_no_vt());
+			infor.setProcess(validpath);
+			infor.setProd_order_no(pmdpp.get(0).getProd_order_no());
+			infor.setSingle_wgt(lypd.get(0).getFactweight());
+			infos.add(infor);
+			ResultModel result = this.getBean(MesApiDesignInfoImpl.class).Design_Plan_Info(infos, null);
+			if (!"200".equals(result.getState())) {
+				throw new Exception("生产设计信息失败" + result.getMsgInfo());
+			}
+		}
+
+		// 反写实绩的虚拟物料号 2018-09-20
+		MesPlmM mcd = new MesPlmM();
+		mcd.setMaterial_no(pmd.getSub_object_no());
+		mcd.setMaterial_no_vt(pmdc.getObject_no_vt());
+		this.getMapper(MesPlmMMapper.class).updatebymaterial_no(mcd);
+
+		// 反写实物虚拟卷号 2018-11-08
+		ypd.setObject_no_vt(pmdc.getObject_no_vt());
+		this.getMapper(YdmProductDetailMapper.class).update(ypd);
+				
+		// 调用 新增实物物料状态跟踪: 传入(实物子卷号,5BPC10,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getSub_object_no());
+		pmp.setPrc_code("5BPC10");
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+
+		// 新增虚拟子物料履历
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(pmdc.getObject_no_vt(), "0PPC10", userName, createTime);
+
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpp.get(0).getOrder_no());
+		pos.setPc(pmdc.getSingle_weight());
+		pos.setPc_cnt(1l);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePcPlaned(pos);
+
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(pmdc.getProd_order_no());
+		pps.setPc(pmdc.getSingle_weight());
+		pps.setPc_cnt(1l);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+		// 修改虚拟物料对应的 酸洗计划进程表
+		PlnMaterielDetail pmdmq = new PlnMaterielDetail();
+		pmdmq.setObject_no_vt(pmdc.getMat_object_no_vt());
+		List<PlnMaterielDetail> lpmdm = this.getMapper(PlnMaterielDetailMapper.class).find(pmdmq, 0, 1);
+		PlnPcPlanStatistic plps = new PlnPcPlanStatistic();
+		plps.setPc_plan_no(lpmdm.get(0).getPc_plan_no());
+		plps.setPc(pmdc.getSingle_weight());
+		plps.setPc_cnt(1l);
+		this.getMapper(PlnPcPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 调用公共函数2 建立物料母子对应关系
+		PrcMaterielRelation pmr = new PrcMaterielRelation();
+		pmr.setObject_no(pmd.getObject_no());
+		pmr.setSub_object_no(pmd.getSub_object_no());
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRemark("");
+		pmr.setRelation_type(2);
+		this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+		return rm;
+	}
+
+	/**
+	 * 撤销酸洗 虚拟子卷 挂料接口
+	 * 
+	 * @param OBJECT_NO    实物子卷号
+	 * @param object_no_vt 虚拟子卷号
+	 * @throws Exception
+	 */
+	public void PickleFinsh_RelationCancel(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(pmd.getObject_no());
+		List<YdmProductDetail> lypd = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if (lypd == null || lypd.size() == 0) {
+			throw new Exception("库存中无[" + pmd.getObject_no() + "]实物卷!");
+		}
+
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + pmd.getObject_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷的母卷信息
+		List<PlnMaterielDetail> lpmdm = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + lpmd.get(0).getMat_object_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if (lpmdm == null || lpmdm.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		if (lpmdm.get(0).getObject_no() == null || "".equals(lpmdm.get(0).getObject_no())) {
+			throw new Exception("实物卷[" + pmd.getObject_no() + "]尚未绑定该计划,不能回退!");
+		}
+
+		// 下一个工序做了计划就不能回退
+		if (Utils.isNotEmpty(pmd.getNext_dsn_process_code())) {
+			this.getBean(MesApiDesignInfoImpl.class).JudgeIsOrNotPlan(lpmd.get(0));
+		}
+		// 回退子卷物料跟踪:
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setPrc_code("5BPC10");
+		pmp.setKeep_sametime_status(0);
+		pmp.setRemark("撤销子卷挂料");
+		ResultModel al = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		// 撤销实物物料状态跟踪
+		if (!"0".equals(al.getState())) {
+			throw new Exception("酸洗完成后,实物[" + pmp.getObject_no() + "]状态已发生改变,不能撤销!");
+		}
+
+		// 物料充当脱单履历
+//			this.getBean(MesApiDesignInfoImpl.class).createMatLog(lpmd.get(0), "厂内合同取消交工",userName, lpmd.get(0).getPrev_process_code() , "-1", pmd.getObject_no());
+
+		// 修改虚拟物料表
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setObject_no_vt(pmd.getObject_no_vt());
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setStatus("0PPC03");
+		pmdu.setIs_finished("0");
+//			pmdu.setPrev_process_code(processpoint.pickle_code);
+		this.getMapper(PlnMaterielDetailMapper.class).doUpdateCancelRelation(pmdu);
+		// 新增虚拟子物料履历
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PPC03", userName,
+				new Date());
+		// 判断虚拟子物料是否有其他子料的原料
+//			if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpmd.get(0).getOrder_no());
+		pos.setPc(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+		pos.setPc_cnt(-1l);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePcPlaned(pos);
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+		pps.setPc(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+		pps.setPc_cnt(-1l);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//			}
+
+		// 修改虚拟物料对应的 酸洗计划进程表
+		PlnPcPlanStatistic plps = new PlnPcPlanStatistic();
+		plps.setPc_plan_no(lpmd.get(0).getPc_plan_no());
+		plps.setPc(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+		plps.setPc_cnt(-1l);
+		this.getMapper(PlnPcPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 调用公共函数3 断开物料母子对应关系
+		PrcMaterielRelation pmr = new PrcMaterielRelation();
+		pmr.setObject_no(lpmdm.get(0).getObject_no());
+		pmr.setSub_object_no(lpmd.get(0).getObject_no());
+		this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+
+		// 厂内合同子卷生产完成时,清空库存信息订单信息
+//			boolean flag_Ct = this.getBean(MesApiDesignInfoImpl.class).getContractType(lpmd.get(0).getProd_order_no());
+//			boolean flag_Mf = this.getBean(MesApiDesignInfoImpl.class).matIsFinish(pmd.getObject_no());
+//			if (flag_Mf && flag_Ct) {
+//				YdmProductDetail ydm = new YdmProductDetail();
+//				ydm.setCoilno(pmd.getObject_no());
+//				ydm.setProdorderno(lpmd.get(0).getProd_order_no());
+//				ydm.setOrderno(lpmd.get(0).getOrder_no());
+//				ydm.setObject_no_vt(pmd.getObject_no_vt());
+//				this.getMapper(YdmProductDetailMapper.class).update(ydm);;
+//			}
+		// 删除物料附加信息
+		this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmd.getObject_no());
+
+		// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果是,则需释放虚拟子堆垛,调用接口:纵剪——虚拟子堆垛 释放接口
+		if ("2".equals(lpmd.get(0).getOrd_flg())) {
+			PickleFinsh_Release(pmd);
+		}
+	}
+
+	/**
+	 * 酸洗完成 虚拟子卷 释放接口
+	 * 
+	 * @param object_no_vt 虚拟子卷号
+	 * @throws Exception
+	 */
+	public void PickleFinsh_Release(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		// ------------------------2018-06-19-------------------------
+		// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果不成立, 则报错退出,“虚拟物料[xxx]不是额外成品,不能释放!”
+		if (!"2".equals(lpmd.get(0).getOrd_flg())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]不是额外成品,不能释放!");
+		}
+		// 判断虚拟子卷是否是酸洗的虚拟成品
+		if (!processpoint.pickle_code.equals(lpmd.get(0).getPrev_dsn_process_code())) {
+			throw new Exception("虚拟子卷[" + pmd.getObject_no_vt() + "]不是酸洗设计成品,无法释放!");
+		}
+//			PlnMaterielDetail pmdqd=new PlnMaterielDetail();
+//			pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+//			int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+//			if (count>0) {
+//				throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+//			}
+		PlnMaterielDetail pmdqd = new PlnMaterielDetail();
+		pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> child = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"mat_object_no_vt = '" + pmd.getObject_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+//			int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+		if (Utils.isNotEmpty(child)) {
+			// 删除子卷
+			this.getBean(MesApiDesignInfoImpl.class).deleteChildTrue(child);
+//				throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+		}
+		// ------------------------------------------------------------
+
+		// 判断虚拟子卷是否是其他物料母卷: IF(NEXT_DSN_PROCESS_CODE == NULL)
+		// if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+
+		// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录,状态标记为“0PPCXX”
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PPCXX", userName,
+				new Date());
+
+		// 将虚拟物料信息 从虚拟物料表【PLN_MATERIEL_DETAIL】移动到 无效虚拟物料表【PLN_MATERIEL_INVALID】.
+		// (两个表结构一样,移动后,保持serial_no不变,删除原表记录)
+		List<PlnMaterielInvalid> pmin = this.getMapper(PlnMaterielInvalidMapper.class).findWithCondition(null, " serial_no = '"+lpmd.get(0).getSerial_no()+"' or object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"'", "", 0, 0);
+		if (pmin !=null && pmin.size()>0) {
+			this.getMapper(PlnMaterielInvalidMapper.class).delete(lpmd.get(0).getSerial_no());
+		}
+		PlnMaterielInvalid pmi = new PlnMaterielInvalid();
+		BeanUtils.copyProperties(lpmd.get(0), pmi);
+		this.getMapper(PlnMaterielInvalidMapper.class).insert(pmi);
+		this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(lpmd.get(0));
+
+	}
+
+	/**
+	 * 酸洗完成 虚拟母卷统计
+	 * 
+	 * @param object_no_vt 虚拟母卷号
+	 * @param object_no    实物母卷号
+	 * @throws Exception
+	 */
+	public void PickleFinsh_Sum(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		String plan_no = "";
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		// 修改物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.pickle_code, true);
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq,
+				"nvl(invalid_flg , 0) <> 1", null, 0, 1);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+		if (lpmd.get(0).getObject_no() == null || "".equals(lpmd.get(0).getObject_no())) {
+			throw new Exception("计划母卷[" + pmd.getObject_no_vt() + "]未上料, 不能酸洗!");
+		}
+		plan_no = lpmd.get(0).getPc_plan_no();
+		// 新增母卷物料跟踪:调用 新增实物物料状态跟踪
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setPrc_code("5BPC10");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+		// 判断虚拟母卷对应的虚拟子卷是否 挂料完成
+		List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+		int isum = 0;
+		if (lpmdc != null && lpmdc.size() > 0) {
+			for (PlnMaterielDetail pmdcc : lpmdc) {
+				PlnMaterielDetail pmdcu = new PlnMaterielDetail();
+				pmdcu.setSerial_no(pmdcc.getSerial_no());
+				pmdcu.setIs_finished("1");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdcu);
+				if (pmdcc.getObject_no() == null || "".equals(pmdcc.getObject_no())) {
+					// 统计 (OBJECT_NO=NULL的子卷数量)、虚拟子卷总数量
+					isum += 1;
+				}
+			}
+			// 如果(OBJECT_NO为NULL的数量==子卷总数
+			if (isum == lpmdc.size()) {
+				// 读取物料关系表【PRC_MATERIEL_RELATION】(where OBJECT_NO=实物母卷号 AND RELATION_TYPE=3)的记录
+				PrcMaterielRelation pmr = new PrcMaterielRelation();
+				pmr.setObject_no(lpmd.get(0).getObject_no());
+				pmr.setRelation_type(2);
+				List<PrcMaterielRelation> lpmr = this.getMapper(PrcMaterielRelationMapper.class).find(pmr, 0, 0);
+				if (lpmr == null || lpmr.size() == 0) {
+					// 如果 关系表记录为空(说明实物卷未切割,计划未执行),直接报错退出“母卷xxxx尚未进行切割操作!”;
+					throw new Exception("母卷[" + pmr.getObject_no() + "]尚未进行切割操作!");
+				} else {
+					// 修改虚拟物料表的母卷记录:OBJECT_NO=NULL; NEED_EXTOPT=1; AN_PLAN_NO=NULL
+					PlnMaterielDetail pmdu = new PlnMaterielDetail();
+					pmdu.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+					pmdu.setNeed_extopt("1");
+					this.getMapper(PlnMaterielDetailMapper.class).doUpdatePickleFinshSum(pmdu);
+				}
+			} else {
+				// 挂单的时候一起修改了
+//					this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), true);
+			}
+		}
+
+		// 修改虚拟物料表OPT_TIMES+=1; STATUS= 0PPC10;
+		// IS_NEXT_FINISHED=1(2018-06-19)(同步修改S1的[OPT_TIMES]、[STATUS]
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setIs_next_finished("1");
+		pmdu.setOpt_times((lpmd.get(0).getOpt_times() == null ? 0 : lpmd.get(0).getOpt_times()) + 1);
+		pmdu.setStatus("0PPC10");
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+		// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+		// -------------2018-03-21-------这个地方的an_plan_no有点特殊的地方,所以没有直接调用InsertMatVtProc接口------------
+		PlnMaterielDetail pmdcq = new PlnMaterielDetail();
+		pmdcq.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdq = this.getMapper(PlnMaterielDetailMapper.class).find(pmdcq, 0, 0);
+		// 写虚拟物料履历,状态填: 子卷
+		PrcMaterielVtProcess pmvpc = new PrcMaterielVtProcess();
+		
+		// 20191001
+		long serial_no = 0l;
+		List<PrcMaterielVtProcess> pmpQ = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(null, "", "serial_no desc", 0, 1);
+		if (Utils.isNotEmpty(pmpQ)) {
+			serial_no = pmpQ.get(0).getSerial_no()+1;
+		}
+		pmvpc.setSerial_no(serial_no);
+		// end
+		
+		pmvpc.setObject_no_vt(lpmdq.get(0).getObject_no_vt());
+		pmvpc.setObject_no(lpmdq.get(0).getObject_no());
+		pmvpc.setObject_type(lpmdq.get(0).getObject_type());
+		pmvpc.setPline_code(lpmdq.get(0).getPline_code());
+		pmvpc.setStatus("0PPC10");
+		pmvpc.setOrder_no(lpmdq.get(0).getOrder_no());
+		pmvpc.setProd_order_no(lpmdq.get(0).getProd_order_no());
+		pmvpc.setLw_design_no(lpmdq.get(0).getLw_design_no());
+		pmvpc.setCl_design_no(lpmdq.get(0).getCl_design_no());
+		pmvpc.setRl_design_no(lpmdq.get(0).getRl_design_no());
+		pmvpc.setAn_design_no(lpmdq.get(0).getAn_design_no());
+		pmvpc.setSr_design_no(lpmdq.get(0).getSr_design_no());
+		pmvpc.setPc_design_no(lpmdq.get(0).getPc_design_no());
+		pmvpc.setPc_plan_no(lpmdq.get(0).getPc_plan_no());
+		pmvpc.setLw_plan_no(lpmdq.get(0).getLw_plan_no());
+		pmvpc.setCl_plan_no(lpmdq.get(0).getCl_plan_no());
+		pmvpc.setRl_plan_no(lpmdq.get(0).getRl_plan_no());
+		pmvpc.setSr_plan_no(lpmdq.get(0).getSr_plan_no());
+		pmvpc.setBatch_no(lpmdq.get(0).getBatch_no());
+		pmvpc.setCreate_man_name(userName);
+		pmvpc.setCreate_time(createTime);
+		this.getMapper(PrcMaterielVtProcessMapper.class).doAdd(pmvpc);
+		// ----------------------------------------------------------------------
+
+		// 修改虚拟物料对应的 酸洗计划进程表
+		// MesCrSlittingD
+		// mcsd=this.getMapper(MesCrSlittingDMapper.class).findById(lpmd.get(0).getObject_no());
+		PlnPcPlanStatistic plps = new PlnPcPlanStatistic();
+		plps.setMat_pc(lpmd.get(0).getSingle_weight());// mcsd.getCoil_act_wgt());
+		plps.setMat_pc_cnt(1l);
+		plps.setPc_plan_no(plan_no);
+		this.getMapper(PlnPcPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 酸洗计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BPC10
+		PlnPicklePlanDetail plpd = new PlnPicklePlanDetail();
+		plpd.setPc_plan_no(plan_no);
+		plpd.setStatus("5BPC10");
+		plpd.setObject_no_vt(pmd.getObject_no_vt());
+		this.getMapper(PlnPicklePlanDetailMapper.class).doUpdate(plpd);
+
+		// 酸洗计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(酸洗计划号);
+		doUpdatePlnPicklePlan(plan_no);
+
+		// 将未挂单的子卷 置为无效
+//			List<PlnMaterielDetail> child = this.getMapper(
+//					PlnMaterielDetailMapper.class).findWithCondition(
+//					null,
+//					"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//							+ "' and nvl(invalid_flg,0) =0 and object_no is null",
+//					"", 0, 0);
+//			if (Utils.isNotEmpty(child)) {
+//				this.getBean(MesApiDesignInfoImpl.class).deleteChild(child);
+//			}
+	}
+
+	/**
+	 * 撤销酸洗 撤销虚拟母卷统计
+	 * 
+	 * @param object_no_vt 虚拟母卷号
+	 * @param object_no    实物母卷号
+	 * @throws Exception
+	 */
+	public void PickleFinsh_SumCancel(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + pmd.getObject_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		// 修改物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.pickle_code, false);
+
+		// 将无效的虚拟物料子卷恢复
+//			List<PlnMaterielDetail> child = this.getMapper(
+//					PlnMaterielDetailMapper.class).findWithCondition(
+//					null,
+//					"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//							+ "' and invalid_flg = '1'", "", 0, 0);
+//			if (Utils.isNotEmpty(child)) {
+//				this.getBean(MesApiDesignInfoImpl.class).recoveryChild(child);
+//			}
+
+		// 读取虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】,获取虚拟母卷最后一条
+		PrcMaterielVtProcess pmvp = new PrcMaterielVtProcess();
+		pmvp.setStatus("0PPC10");
+		pmvp.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PrcMaterielVtProcess> lpmvp = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(pmvp, "",
+				" create_time desc ", 0, 1);
+
+		// 循环 (MAT_OBJECT_NO_VT=虚拟母卷号) 的所有虚拟子卷记录
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).find(pmdc, 0, 0);
+		for (PlnMaterielDetail pmdcc : lpmdc) {
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			pmdu.setSerial_no(pmdcc.getSerial_no());
+			pmdu.setIs_finished("0");
+			// 修改虚拟物料表【PLN_MATERIEL_DETAIL】:IS_FINISHED=0;
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+		}
+
+		// 修改虚拟物料表_母卷信息
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setNeed_extopt("0");
+		pmdu.setIs_next_finished("0");
+		pmdu.setPc_plan_no(lpmvp.get(0).getPc_plan_no());
+		pmdu.setStatus_desc("0PPC03");
+
+		if (lpmd.get(0).getObject_no() == null || "".equals(lpmd.get(0).getObject_no())) {
+			pmdu.setObject_no(lpmvp.get(0).getObject_no());
+		}
+		// 2018-06-23 opt_Times 之前一直没减,判断条件不对
+		if (lpmd.get(0).getOpt_times() != null) {
+			pmdu.setOpt_times(lpmd.get(0).getOpt_times() - 1);
+		}
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+		// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+		this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PPC03", userName,
+				new Date());
+
+		// 修改虚拟物料对应的 酸洗计划进程表
+		PlnPcPlanStatistic plps = new PlnPcPlanStatistic();
+		plps.setMat_pc(-lpmd.get(0).getSingle_weight());
+		plps.setMat_pc_cnt(-1l);
+		plps.setPc_plan_no(lpmd.get(0).getPc_plan_no());
+		this.getMapper(PlnPcPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 回退实物母卷的物料跟踪
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(lpmd.get(0).getObject_no());
+		pmp.setPrc_code("5BPC10");
+		pmp.setRemark("撤销母卷酸洗");
+		pmp.setKeep_sametime_status(0);
+
+		ResultModel rm = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+		if (!"0".equals(rm.getState())) {
+//			throw new Exception("酸洗完成后,母卷状态已发生改变,不能撤销!");
+		}
+
+		// 酸洗计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BPC03
+		PlnPicklePlanDetail plpd = new PlnPicklePlanDetail();
+		plpd.setPc_plan_no(lpmd.get(0).getPc_plan_no());
+		plpd.setStatus("5BPC03");
+		plpd.setObject_no_vt(pmd.getObject_no_vt());
+		this.getMapper(PlnPicklePlanDetailMapper.class).doUpdate(plpd);
+
+		// 酸洗计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(酸洗计划号);
+		doUpdatePlnPicklePlan(lpmd.get(0).getPc_plan_no());
+		// ----------------------------2018-06-19-------------------------------
+		// ---------------2018-10-16 挂单的时候一起修改
+//			this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), false);
+	}
+
+	/**
+	 * 函数_通过加工计划产生设计
+	 * 
+	 * @param pro_order_no 生产订单号
+	 * @throws Exception
+	 */
+	public PlnPickleDsnMain ProcessingPlanDsn(String pro_order_no) throws Exception {
+		PlnPickleDsnMain san_design_no = null;
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(pro_order_no);
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		// 根据加工计划号 读取生产订单对应的生产加工表[PLN_PROCESS_PLAN]
+		PlnProcessPlan ppp = new PlnProcessPlan();
+		ppp.setProduce_no(lpp.get(0).getProduce_no());
+		ppp.setValid_flag("1");
+		List<PlnProcessPlan> lppp = this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, null,
+				" cut_order_no ", 0, 0);
+		if (lppp == null || lppp.size() == 0) {
+			throw new Exception("未找到生产订单[" + ppp.getOrder_no() + "]对应的生产加工信息");
+		}
+
+		// 保存设计主表数据: 酸洗设计号:DAN+YYMMDD+6流水号
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnPickleDsnMain pldm = new PlnPickleDsnMain();
+		List<PlnPickleDsnMain> lpdmNo = this.getMapper(PlnPickleDsnMainMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		pldm.setPc_design_no("DAN" + sDate + String.format("%06d", 1));
+		if (lpdmNo != null && lpdmNo.size() > 0) {
+			pldm.setSerial_no(lpdmNo.get(0).getSerial_no() + 1);
+			if (sDate.equals(lpdmNo.get(0).getPc_design_no().substring(3, 9))) {
+				pldm.setPc_design_no("DAN" + sDate + String.format("%06d",
+						Integer.parseInt(lpdmNo.get(0).getPc_design_no().substring(9, 15)) + 1));
+			}
+		}
+
+		// 订单信息
+		pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+		pldm.setOrder_no(lpp.get(0).getOrder_no());
+		pldm.setPline_code(lpp.get(0).getPline_code());
+		pldm.setSteel_code(lpp.get(0).getSteel_code());
+
+		String isMulti = "0";// 是否拼料 根据订单数判断,多个订单填1,否则填0
+		pldm.setIs_multi(isMulti);
+
+		// 只有一条加工计划记录情况下
+		if (lppp.size() == 1) {
+			pldm.setThick(lppp.get(0).getThick());
+			pldm.setWidth(lppp.get(0).getWidth());
+			pldm.setLength(lppp.get(0).getLength());
+			pldm.setDiameter_inn(lppp.get(0).getDiameter_inn());
+			pldm.setDiameter_out(lppp.get(0).getDiameter_out());
+			pldm.setSingle_weight(lppp.get(0).getEstimate_weight());
+		}
+
+		// 加工计划分切方式
+//			pldm.setCut_style(lppp.get(0).getCut_style());
+//			
+//			pldm.setCrosscut_style(lppp.get(0).getCrosscut_style());
+//			pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//			pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+
+		pldm.setDesign_quantity(1);
+//			pldm.setDesign_weight(ypd.getFactweight());
+
+		pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		pldm.setCreate_man_name(userName);
+		pldm.setCreate_time(new Date());
+		pldm.setIs_finished(0L);
+		pldm.setReserve_1(lppp.get(0).getProduce_no());
+		this.getMapper(PlnPickleDsnMainMapper.class).insert(pldm);
+		san_design_no = pldm;
+
+		// 倒叙取一条拼料信息
+		List<PlnPickleDsnMultinfo> lpdmM = this.getMapper(PlnPickleDsnMultinfoMapper.class).findWithCondition(null,
+				"", " serial_no desc ", 0, 1);
+		long DsnNo = 1;
+		if (lpdmM != null && lpdmM.size() > 0) {
+			DsnNo = lpdmM.get(0).getSerial_no() + 1;
+		}
+
+		// -----------------写拼料-----------------------------
+		PlnPickleDsnMultinfo pldmc = new PlnPickleDsnMultinfo();
+		pldmc.setSerial_no(DsnNo++);
+		pldmc.setPc_design_no(pldm.getPc_design_no());
+//						pldmc.setPc_seq(1);
+//						pldmc.setSeg_seq(1);
+		pldmc.setOrder_no(lpp.get(0).getOrder_no());
+		pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pldmc.setThick(lpp.get(0).getThick());
+		pldmc.setWidth(lpp.get(0).getWidth());
+		pldmc.setLength(lpp.get(0).getLength());
+		pldmc.setDiameter_inn(lpp.get(0).getDiameter_inn());
+		pldmc.setDiameter_out(lpp.get(0).getDiameter_out());
+		pldmc.setWeight(pldm.getSingle_weight());
+//						pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//						pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pldmc.setSub_seq(1);
+		this.getMapper(PlnPickleDsnMultinfoMapper.class).insert(pldmc);
+
+		return san_design_no;
+	}
+
+	/**
+	 * 公共函数1 修改酸洗计划主表状态
+	 * 
+	 * @param 酸洗计划号
+	 * @throws Exception
+	 */
+	public void doUpdatePlnPicklePlan(String anPlanNo) throws Exception {
+		PlnPicklePlan plp = new PlnPicklePlan();
+		plp.setPc_plan_no(anPlanNo);
+		String MIN_STATUS = "";
+		boolean flag = false;
+		PlnPicklePlanDetail plpd = new PlnPicklePlanDetail();
+		plpd.setPc_plan_no(anPlanNo);
+		List<PlnPicklePlanDetail> lplpd = this.getMapper(PlnPicklePlanDetailMapper.class).findWithCondition(plpd,
+				"status <> '0PPCXX'", "status asc", 0, 0);
+		if (lplpd == null || lplpd.size() == 0) {
+			throw new Exception("未找到酸洗计划明细数据!");
+		}
+		MIN_STATUS = lplpd.get(0).getStatus();
+
+		// 计划状态 // 实物状态
+		// 0PPC01酸洗计划已编制 // 5BPC01酸洗计划已编制
+		// 0PPC02酸洗计划已下发 // 5BPC02酸洗计划已下发
+		// 0PPC03开始酸洗作业 // 5BPC03开始酸洗作业
+		// 0PPC79酸洗剪废 // 5BPC05正在酸洗作业
+		// 0PPC10酸洗作业完成 // 5BPC79酸洗剪废
+		// 0PPCXX酸洗计划已失效 // 5BPC10酸洗作业完成
+		// 5BPC83等待酸洗判定
+		// 5BPC90酸洗判定完成
+
+		// 如果明细记录中有卷开始作业,主表状态改为开始作业
+		for (PlnPicklePlanDetail plnL : lplpd) {
+			if ("5BPC03".equals(plnL.getStatus())) {
+				flag = true;
+				break;
+			}
+		}
+		if (flag) {
+			plp.setStatus("0PPC03");
+		} else if ("5BPC01".equals(MIN_STATUS)) {
+			plp.setStatus("0PPC01");
+		} else if (MIN_STATUS.compareTo("5BPC02") <= 0) {
+			plp.setStatus("0PPC02");
+		} else if (MIN_STATUS.compareTo("5BPC03") <= 0) {
+			plp.setStatus("0PPC03");
+		} else if (MIN_STATUS.compareTo("5BPC10") <= 0) {
+			plp.setStatus("0PPC10");
+		}
+		this.getMapper(PlnPicklePlanMapper.class).doUpdate(plp);
+	}
+}

+ 194 - 0
src/main/java/market/Api/Mes/impl/MesApiPlmPdiPdoImpl.java

@@ -0,0 +1,194 @@
+/***文档注释***********************************************
+ * 作者               :                   宋燕辉
+ * 创建日期      :                   2018.08.13
+ * 描述               :                  罩退  pdipdo
+ * 注意事项      :                   无
+ * 遗留BUG :                   无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+ ***********************************************************/
+package market.Api.Mes.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import market.Api.Mes.service.MesApiPlmPdiPdoService;
+import market.Com.pb.PropertiesUtils;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingDMapper;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingD;
+import market.Mes.Lengthwise.Plan.mapper.MesCrCrossCuttingDMapper;
+import market.Mes.Lengthwise.Plan.vo.MesCrCrossCuttingD;
+import market.Mes.Pickle.Performance.mapper.MesPlmMMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3PdiMapper;
+import market.Mes.util.DateUtil;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+
+@RemoteService(path = "MesApiPlmPdiPdoService")
+public class MesApiPlmPdiPdoImpl extends BaseServiceImpl implements MesApiPlmPdiPdoService{
+ 
+	public static String PLMPDI = PropertiesUtils.getPdioProperties().getProperty("PLMPDI");
+	public static String PLMORDER = PropertiesUtils.getPdioProperties().getProperty("PLMORDER");
+	public static String PLMDEL = PropertiesUtils.getPdioProperties().getProperty("PLMDEL");
+    	
+	//获取需要进行状态跟踪的钢卷信息
+	public List<String> getPlmTrcCoils(){
+		List<String> list=new ArrayList<>();		
+		list=this.getMapper(MesPlmMMapper.class).doQueryWebMaterialno("M0010");
+		return list;
+	}		
+	
+	public void mesToLmsWrkDate(String start,String end) throws Exception{
+		List<MesCrSlittingD> mescm = this.getMapper(MesCrSlittingDMapper.class).findWithCondition(null, "wrk_date>='"+start+"' and wrk_date<='"+end+"'", "", 0, 0);
+		for(MesCrSlittingD mcm:mescm){
+			List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+mcm.getCoil_no()+"'", "", 0, 0);
+			if(listypd!=null && listypd.size()>0){
+				YdmProductDetail ypd=new YdmProductDetail();
+				ypd.setCoilno(listypd.get(0).getCoilno());
+				try{
+					if(mcm.getWrk_date()!=null){
+						ypd.setProducedate(DateUtil.formatString(mcm.getWrk_date(), "yyyy-MM-dd"));
+						this.getMapper(YdmProductDetailMapper.class).update(ypd);
+					}
+				}catch(Exception ex){
+					ex.printStackTrace();
+				}
+			}
+		}
+		List<MesCrCrossCuttingD> mescmxx = this.getMapper(MesCrCrossCuttingDMapper.class).findWithCondition(null, "wrk_date>='"+start+"' and wrk_date<='"+end+"'", "", 0, 0);
+		for(MesCrCrossCuttingD mcm:mescmxx){
+			List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+mcm.getPacking_no()+"'", "", 0, 0);
+			if(listypd!=null && listypd.size()>0){
+				YdmProductDetail ypd=new YdmProductDetail();
+				ypd.setCoilno(listypd.get(0).getCoilno());
+				try{
+					if(mcm.getWrk_date()!=null){
+						ypd.setProducedate(DateUtil.formatString(mcm.getWrk_date(), "yyyy-MM-dd"));
+						this.getMapper(YdmProductDetailMapper.class).update(ypd);
+					}
+				}catch(Exception ex){
+					ex.printStackTrace();
+				}
+			}
+		}
+		
+//		List<MesCrAnnealM> mescmxx1 = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null, "discharge_date>='"+start+"' and discharge_date<='"+end+"'", "", 0, 0);
+//		for(MesCrAnnealM mcm:mescmxx1){
+//			List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+mcm.getCoil_no()+"'", "", 0, 0);
+//			if(listypd!=null && listypd.size()>0){
+//				YdmProductDetail ypd=new YdmProductDetail();
+//				ypd.setCoilno(listypd.get(0).getCoilno());
+//				ypd.setProducedate(DateUtil.formatString(mcm.getDischarge_date(), "yyyy-MM-dd"));
+//				try{
+//					if(mcm.getDischarge_date()!=null){
+//						ypd.setProducedate(DateUtil.formatString(mcm.getDischarge_date(), "yyyy-MM-dd"));
+//						this.getMapper(YdmProductDetailMapper.class).update(ypd);
+//					}
+//					this.getMapper(YdmProductDetailMapper.class).update(ypd);
+//				}catch(Exception ex){
+//					ex.printStackTrace();
+//				}
+//			}
+//		}
+//		
+//		
+//		List<MesTpmD> mescm12 = this.getMapper(MesTpmDMapper.class).findWithCondition(null, "wrk_date>='"+start+"' and wrk_date<='"+end+"'", "", 0, 0);
+//		for(MesTpmD mcm:mescm12){
+//			List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+mcm.getCoil_no()+"'", "", 0, 0);
+//			if(listypd!=null && listypd.size()>0){
+//				YdmProductDetail ypd=new YdmProductDetail();
+//				ypd.setCoilno(listypd.get(0).getCoilno());
+//				try{
+//					if(mcm.getWrk_date()!=null){
+//						ypd.setProducedate(DateUtil.formatString(mcm.getWrk_date(), "yyyy-MM-dd"));
+//						this.getMapper(YdmProductDetailMapper.class).update(ypd);
+//					}
+//				}catch(Exception ex){
+//					ex.printStackTrace();
+//				}
+//			}
+//		}
+//		
+//		
+//		List<MesRcmD> mescm125 = this.getMapper(MesRcmDMapper.class).findWithCondition(null, "wrk_date>='"+start+"' and wrk_date<='"+end+"'", "", 0, 0);
+//		for(MesRcmD mcm:mescm125){
+//			List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+mcm.getCoil_no()+"'", "", 0, 0);
+//			if(listypd!=null && listypd.size()>0){
+//				YdmProductDetail ypd=new YdmProductDetail();
+//				ypd.setCoilno(listypd.get(0).getCoilno());
+//				try{
+//					if(mcm.getWrk_date()!=null){
+//						ypd.setProducedate(DateUtil.formatString(mcm.getWrk_date(), "yyyy-MM-dd"));
+//						this.getMapper(YdmProductDetailMapper.class).update(ypd);
+//					}
+//				}catch(Exception ex){
+//					ex.printStackTrace();
+//				}
+//			}
+//		}
+		
+	}
+	
+	
+	
+	
+//	public static void main(String[] args){
+//		IfPlm01L2Par v_rec_pdo_param=new IfPlm01L2Par();
+//		v_rec_pdo_param.setBl_ds("Blsdfd");
+//		v_rec_pdo_param.setFid("fidfid");
+//		v_rec_pdo_param.setTen3("teens33");
+//		v_rec_pdo_param.setCoil_no("YYYYYYsdfsdf");
+//		MesPlmDPar mcae=new MesPlmDPar();
+//		BeanUtils.copyProperties(v_rec_pdo_param, mcae);
+//		System.out.println(mcae);
+//	}
+	
+	
+	
+	// 补零
+	public static String lpad(String str, int num, String pad) {
+		String n_str = str;
+		if (str == null && "".equals(str))
+			n_str = " ";
+		for (int i = str.length(); i < num; i++) {
+			n_str = pad + n_str;
+		}
+		return n_str;
+	}	
+	
+	/**
+	 * 酸洗作业指示查询
+	 * memo1:传机台代码   startTime:开始时间 endTime:结束时间
+	 * @param oci
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryPlmWeb(CommonPage<YdmProductDetail> oci){
+		ResultModel rm=new ResultModel();
+		if(oci.getMemo1()==null || "".equals(oci.getMemo1())){
+			rm.setState("500");
+			rm.setMsgInfo("请输入机台代码");
+			return rm;
+		}
+		try{
+			List<HashMap> lpav=this.getMapper(IfTpm01L3PdiMapper.class).doQueryPlmWeb(oci.getObject(),oci.getMemo1(),oci.getMemo2(),oci.getStartTime(),oci.getEndTime(),oci.getMemo3());
+			rm.setData(lpav);
+			rm.setState("200");
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+	
+
+
+}

+ 5618 - 0
src/main/java/market/Api/Mes/impl/MesApiRollPdiPdoImpl.java

@@ -0,0 +1,5618 @@
+ /***文档注释***********************************************
+ * 作者               :                   宋燕辉
+ * 创建日期      :                   2019.6.11
+ * 描述               :                  轧机  pdipdo
+ * 注意事项      :                   无
+ * 遗留BUG :                   无
+ * 修改日期      :                   
+ * 修改人员      :                    
+ * 修改内容      :                   
+ ***********************************************************/
+package market.Api.Mes.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import market.Api.Lms.impl.LmsApiServiceImpl;
+import market.Api.Mes.service.MesApiRollPdiPdoService;
+import market.Api.Qms.impl.QmsApiServiceImpl;
+import market.Com.mapper.ComBaseMachineMapper;
+import market.Com.mapper.ComBaseSteelMapper;
+import market.Com.pb.PropertiesUtils;
+import market.Com.vo.ComBaseMachine;
+import market.Com.vo.ComBaseSteel;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.mapper.YdmProductOutlistMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Lms.Warehouse.vo.YdmProductOutlist;
+import market.Mes.Dev.impl.DevRollerPairMServiceImpl;
+import market.Mes.Dev.mapper.DevRollerInfoMapper;
+import market.Mes.Dev.mapper.DevRollerPairDMapper;
+import market.Mes.Dev.mapper.DevRollerPairMMapper;
+import market.Mes.Dev.vo.DevRollerInfo;
+import market.Mes.Dev.vo.DevRollerPairD;
+import market.Mes.Dev.vo.DevRollerPairM;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.Rolling.Performance.impl.MesRcmDServiceImpl;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2AnswerRevokeMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2AskOrdMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2AskPdiMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2EnergyMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2PdoDfcMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2PdoMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2PdoPassMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2PrdEndMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2PrdStrMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2RejectMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2RevokeMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2RllLoadDMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2RllLoadMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2RllRmvDMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2RllRmvMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L2StopMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3AnswerPdoMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3AnswerRejectMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3AnswerRevokeMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3NoneOrdMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3NonePdiMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3OrdCoilMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3OrdMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3PdiMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3RevokeMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01L3RollerMapper;
+import market.Mes.Rolling.Performance.mapper.IfRoll01LogMapper;
+import market.Mes.Rolling.Performance.mapper.MesRcmDMapper;
+import market.Mes.Rolling.Performance.mapper.MesRcmDPassMapper;
+import market.Mes.Rolling.Performance.mapper.MesRcmEnergyMapper;
+import market.Mes.Rolling.Performance.mapper.MesRcmMMapper;
+import market.Mes.Rolling.Performance.mapper.MesRcmStopMapper;
+import market.Mes.Rolling.Performance.mapper.MesRcmTrcMapper;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2AnswerRevoke;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2AskOrd;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2AskPdi;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2Energy;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2Pdo;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2PdoDfc;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2PdoPass;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2PrdEnd;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2PrdStr;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2Reject;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2Revoke;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2RllLoad;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2RllLoadD;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2RllRmv;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2RllRmvD;
+import market.Mes.Rolling.Performance.vo.IfRoll01L2Stop;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3AnswerPdo;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3AnswerReject;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3AnswerRevoke;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3NoneOrd;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3NonePdi;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3Ord;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3OrdCoil;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3Pdi;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3Revoke;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3Roller;
+import market.Mes.Rolling.Performance.vo.IfRoll01L3RollerD;
+import market.Mes.Rolling.Performance.vo.IfRollOrderView;
+import market.Mes.Rolling.Performance.vo.IfRollRollerView;
+import market.Mes.Rolling.Performance.vo.MesRcmD;
+import market.Mes.Rolling.Performance.vo.MesRcmDPass;
+import market.Mes.Rolling.Performance.vo.MesRcmEnergy;
+import market.Mes.Rolling.Performance.vo.MesRcmM;
+import market.Mes.Rolling.Performance.vo.MesRcmStop;
+import market.Mes.Rolling.Performance.vo.MesRcmTrc;
+import market.Mes.Rolling.Performance.vo.Roll0lL3NoView;
+import market.Mes.Rolling.Plan.mapper.PlnRollingPlanDetailMapper;
+import market.Mes.Rolling.Plan.mapper.PlnRollingPlanMapper;
+import market.Mes.Rolling.Plan.vo.PlnRollingPlan;
+import market.Mes.Rolling.Plan.vo.PlnRollingPlanDetail;
+import market.Mes.Shift.mapper.MesShiftMMapper;
+import market.Mes.Shift.vo.MesShiftM;
+import market.Mes.anneal.mapper.MesCrAnnealMMapper;
+import market.Mes.anneal.vo.MesCrAnnealM;
+import market.Mes.anneal.vo.MesJihuaZhi;
+import market.Mes.util.DateUtil;
+import market.Qms.qcm.vo.QcmJhyElements;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+import org.apache.log4j.Logger;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path = "MesApiRollPdiPdoService")
+public class MesApiRollPdiPdoImpl extends BaseServiceImpl implements MesApiRollPdiPdoService {
+
+	
+	public static String ROLLPDI_ORDER = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_ORDER");
+	public static String ROLLPDI_PDI = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_PDI");
+	public static String ROLLPDI_ORDERDELE = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_ORDERDELE");
+	public static String ROLLPDI_NOORDER = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_NOORDER");
+	public static String ROLLPDI_NOPDI = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_NOPDI");
+	public static String ROLLPDI_L2ORDERDELE = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_L2ORDERDELE");
+	public static String ROLLPDI_HUITUI = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_HUITUI");
+	public static String ROLLPDI_MES = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_MES");
+	public static String ROLLPDI_ROLLING = PropertiesUtils.getPdioProperties().getProperty("ROLLPDI_ROLLING");
+	
+	
+	
+	//获取日志记录器Logger,名字为本类类名
+    private static Logger log = Logger.getLogger(MesApiRollPdiPdoImpl.class);
+    
+    
+    
+    /**
+   	 * 轧机作业指示
+   	 * @param oci
+   	 * object:
+	 * material_no:投料卷号
+	 * materailcoilno:原始卷号
+	 * steel_name:牌号
+	 * order_no:订单号
+	 * reciver_unit_name:客户名称
+   	 * memo1:传机台代码
+   	 * startTime:开始时间
+   	 * endTime:结束时间
+   	 * @return
+   	 */
+   	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryRollWeb(CommonPage<MesJihuaZhi> oci){
+   		ResultModel rm=new ResultModel();
+   		if(oci.getMemo1()==null || "".equals(oci.getMemo1())){
+   			rm.setState("500");
+   			rm.setMsgInfo("请输入机台代码");
+   			return rm;
+   		}
+   		try{
+   			List<HashMap> lpav=this.getMapper(IfRoll01L3PdiMapper.class).doQueryWeb(oci.getObject(),oci.getMemo1(),oci.getMemo2(),oci.getStartTime(),oci.getEndTime(),oci.getMemo3());
+   			rm.setData(lpav);
+   			rm.setState("200");
+   		}catch(Exception ex){
+   			ex.printStackTrace();
+   			rm.setState("500");
+   			rm.setMsgInfo("查询失败!"+ex.getMessage());
+   		}
+   		return rm;
+   	}
+   	
+   	/**
+   	 * 轧机二次切头尾情况
+   	 * @param oci
+   	 * object:
+	 * material_no:投料卷号
+	 * materailcoilno:原始卷号
+	 * steel_name:牌号
+	 * order_no:订单号
+	 * reciver_unit_name:客户名称
+   	 * memo1:传机台代码
+   	 * startTime:开始时间
+   	 * endTime:结束时间
+   	 * @return
+   	 */
+//   	@SuppressWarnings("rawtypes")
+//	public ResultModel doQueryRollWebErQie(CommonPage<MesJihuaZhi> oci){
+//   		ResultModel rm=new ResultModel();
+//   		if(oci.getMemo1()==null || "".equals(oci.getMemo1())){
+//   			rm.setState("500");
+//   			rm.setMsgInfo("请输入机台代码");
+//   			return rm;
+//   		}
+//   		try{
+//   			List<HashMap> lpav=this.getMapper(IfRoll01L3PdiMapper.class).doQueryWebErQie(oci.getObject(),oci.getMemo1(),oci.getMemo2(),oci.getStartTime(),oci.getEndTime(),oci.getMemo3());
+//   			rm.setData(lpav);
+//   			rm.setState("200");
+//   		}catch(Exception ex){
+//   			ex.printStackTrace();
+//   			rm.setState("500");
+//   			rm.setMsgInfo("查询失败!"+ex.getMessage());
+//   		}
+//   		return rm;
+//   	}
+    
+    
+    
+    
+	/**
+	 *  1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2指示顺序请求电文时调用;																																							
+		2)、	此接口参数为“L2指示顺序请求电文JSON对象”(电文编号:DR3E01);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L3AswOrder(IfRoll01L2AskOrd json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_ask_ord 代替描述
+		IfRoll01L2AskOrd v_rec_l2_ask_ord=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_指示顺序请求为空";
+			//v_message="500";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_ask_ord.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_ask_ord.setMsg_time(new Date());
+		}
+		//  --(1、2)、将对象,插入L2指示顺序请求表(单独的事务)
+		try{
+			this.getMapper(IfRoll01L2AskOrdMapper.class).insert(v_rec_l2_ask_ord);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用应答L2指示顺序请求函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3AswOrder_d(v_mch_code,v_rec_l2_ask_ord.getCoil_no(),
+					strToLong(v_rec_l2_ask_ord.getNum_coil()),
+					v_message);
+			//this.getSqlSession("sqlSessionFactory").getConnection().
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_ask_ord.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param="L2请求时间 MSG_TIME {"+mes_time+"} L2上次请求的最后一卷的卷号 COIL_NO {"+v_rec_l2_ask_ord.getCoil_no()+"}"
+					+ "请求卷数 NUM_COIL {"+v_rec_l2_ask_ord.getNum_coil()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L3AswOrder",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 Roll01L3AswOrder 调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(L2上次请求的最后一卷的卷号)、V_NUM_COIL(请求卷数)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param coil_no
+	 * @param num_coil
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L3AswOrder_d(String v_mch_code, String v_entry_coil_no,
+			Long v_num_coil, String v_message) throws Exception{
+		
+		Integer v_cnt=null;
+		Long v_count_pln=null;
+		Long v_count_act=null;
+		Long v_plan_seq=null;
+		Long v_sr_seq=null;
+		Integer v_success=null;
+		List<HashMap> v_coil_no=new ArrayList<>();
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//  --(1.3)、参数:请求卷数																																							
+			//  --(1.3.1)、如果为空,或者 ≤ 0,则默认20																																							
+			//  --(1.3.2)、如果 > 200,则默认200																																							
+			//  --(1.3.3)、否则直接使用																																							
+			if(v_num_coil==null || v_num_coil<=0){
+				v_count_pln=20l;
+			}else if(v_num_coil>200){
+				v_count_pln=200l;
+			}else{
+				v_count_pln=v_num_coil;
+			}
+			v_plan_seq=-1l;
+			v_sr_seq=-1l;
+			//  --(1.4)、参数:L2上次请求的最后一卷的卷号																																							
+			//  --(1.4.1)、先获取此卷的 计划顺序号、计划内序号																																							
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount1(v_mch_code,v_entry_coil_no);
+			if(v_cnt==1){
+				//    --(1.4.2)、找到唯一的记录,则获取此卷的 计划顺序号、计划内序号
+				PlnRollingPlan psp=this.getMapper(PlnRollingPlanMapper.class).doQuery1(v_mch_code,v_entry_coil_no);
+				v_plan_seq=psp.getPlan_seq();
+				v_sr_seq=psp.getRl_seq();
+			}
+			//  --(1.4.3)、未指定卷号,或指定卷号信息不存在,则找到已给L2指示顺序的最大 计划顺序号、计划内序号																																							
+			if(v_plan_seq==-1 && v_sr_seq==-1){
+				v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount2(v_mch_code,"");
+				if(v_cnt>0){
+					//  --(1.4.4)、先找到已给L2指示顺序的最大 计划顺序号																																							
+					v_plan_seq=this.getMapper(PlnRollingPlanMapper.class).doCount3(v_mch_code,"");
+					//  --(1.4.5)、再找此 计划顺序号下的最大 计划内序号																																							
+					v_sr_seq=this.getMapper(PlnRollingPlanMapper.class).doCount4(v_mch_code,v_plan_seq);
+				}
+			}
+			v_count_act=0l;// --实际卷数计数清零
+			//  --(1.4.6)、循环 ≥ v_plan_seq 的计划主表,按 plan_seq 排序																																							
+			List<PlnRollingPlan> cur_01_list=this.getMapper(PlnRollingPlanMapper.class).doQuery2(v_mch_code, v_plan_seq);
+			for(PlnRollingPlan cur_01:cur_01_list){
+				if(v_count_act>=v_count_pln){
+					//continue;//--实际卷数,超出计划卷数,跳出循环
+					break;//--实际卷数,超出计划卷数,跳出循环
+				}
+				//    --(1.4.7)、循环对应计划明细表,按 sr_seq 排序
+				List<PlnRollingPlanDetail> cur_02_list=this.getMapper(PlnRollingPlanDetailMapper.class).findWithCondition(null, "rl_plan_no='"+cur_01.getRl_plan_no()+"'", "rl_seq", 0, 0);
+				for(PlnRollingPlanDetail cur_02:cur_02_list){
+					//      --(1.4.8)、从指定的钢卷往后开始找
+					if((cur_01.getPlan_seq()==v_plan_seq && cur_02.getRl_seq()>v_sr_seq) ||
+							cur_01.getPlan_seq()>v_plan_seq){
+						if(v_count_act>=v_count_pln){
+							//continue;//--实际卷数,超出计划卷数,跳出循环
+							break;//--实际卷数,超出计划卷数,跳出循环
+						}
+						
+						//  --(2.4)、验证当前还未生产交工
+						MesRcmM mCross = new MesRcmM();
+						mCross.setSchedule_no(cur_02.getRl_plan_no());
+						mCross.setMaterial_no(cur_02.getObject_no());
+						v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+						if(v_cnt>0){
+							List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+						    MesRcmM v_rec_Roll_m =lmcam.get(0);
+						    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+//						    	v_message="机台代码{"+v_mch_code+"} 入口卷号{"+cur_02.getObject_no()+"} 已生产交工";
+//						    	return v_message;
+						    	continue;
+						    }
+						}
+						
+						//--缓存钢卷号到集合队列中最后位置
+						HashMap<String,String> hash=new HashMap();
+						hash.put("entry_coil_no", cur_02.getObject_no());
+						v_coil_no.add(hash);
+						
+ 						//--计数器加1
+						v_count_act=v_count_act+1;
+					}
+				}
+			
+			}
+			//  --(2)、根据获取的可发送指示顺序的钢卷数,确定调用接口																																							
+			//  --(2.1)、有可用的指示顺序																																							
+			if(v_count_act>0){
+				//--(2.1.1)、调用指示顺序接口
+				try{
+					v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3Order(v_coil_no,v_success,v_message);
+				}catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+				}
+				if(v_message==null){
+					v_message="";
+				}
+				String v_success_str="";
+				if(v_message.contains("_success:")){
+					v_success_str=v_message.substring(v_message.length()-1);
+					v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+				}
+				if("1".equals(v_success_str)){
+					v_message="L2指示顺序请求应答成功!"+v_message;
+				}else if("2".equals(v_success_str)){
+					v_message="L2指示顺序请求应答部分成功!"+v_message;
+				}else{
+					v_message="L2指示顺序请求应答失败!"+v_message;
+				}
+			}else{
+			   //  --(2.2)、无可用的指示顺序																																							
+			   // --(2.2.1)、获取已下发指示顺序的钢卷数	
+			   //select count(1) from pln_skinrolling_plan t1, pln_skinrolling_plan_detail t2 where t1.machine_code = 'M0008' and t1.sr_plan_no = t2.sr_plan_no and t2.send_flag is not null and t2.send_flag in ('1', '3') 	
+			   v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount5(v_mch_code,"");
+			   if(v_cnt>9999){
+				   v_cnt=9999;//--电文字段长度所限
+			   }
+			   // --(2.2.2)、调用无指示顺序接口   --注意返回值
+			   try{
+					v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3NoOrder(v_entry_coil_no,v_cnt,v_success,v_message);
+				}catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+			   }
+			   if(v_message==null){
+					v_message="";
+			   }
+			   String v_success_str="";
+				if(v_message.contains("_success:")){
+					v_success_str=v_message.substring(v_message.length()-1);
+					v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+				}
+				if("1".equals(v_success_str)){
+					v_message="L2无指示顺序请求应答成功!"+v_message;
+				}else if("2".equals(v_success_str)){
+					v_message="L2无指示顺序请求应答部分成功!"+v_message;
+				}else{
+					v_message="L2无指示顺序请求应答失败!"+v_message;
+				}
+			}
+			
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L3AswOrder_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L3AswOrder_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	
+
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L3AswOrder_d 方法调用;																																							
+		2)、	接口参数 IN:V_COIL_NO(卷号集合)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_coil_no
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value = "tm", rollbackFor = Exception.class)
+	public String Roll01L3Order(List<HashMap>  v_coil_no, Integer v_success,
+			String v_message) throws Exception{
+		v_success=0;
+		Integer v_num_coil;
+		Integer v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0
+		try{
+			//  --(2)、验证传入参数:																																							
+			//  --(2.1)、未指定卷号集合																																							
+			if(v_coil_no ==null || v_coil_no.size()<=0){
+				v_message = "Roll01L3Order 未指定钢卷号!"+"_success:"+v_success;
+				return v_message;
+			}
+			v_num_coil=v_coil_no.size();
+			Integer youxiao_numcoil=v_coil_no.size();
+			Integer ii=0;
+			Integer jj=200-v_num_coil.intValue();
+			for(ii=0;ii<jj;ii++){
+				HashMap<String,String> hash=new HashMap();
+				hash.put("entry_coil_no", new String());
+				v_coil_no.add(hash);
+			}
+			
+			//  --(3)、调用公司接口,将“指示顺序”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)
+			IfRollOrderView tlnov=new IfRollOrderView();
+			tlnov.setNum_coil((v_num_coil==null?"":v_num_coil.longValue()+""));
+			tlnov.setCoils(v_coil_no);
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(tlnov,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_ORDER);
+				String url = ROLLPDI_ORDER;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="指示顺序电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发指示顺序电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发指示顺序电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发指示顺序电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			//  --(2.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Roll01L3Order 指示顺序电文发送失败!"+v_message+"_success:"+v_success;
+				return v_message;
+			}
+			
+			//  --(4)、插入接口记录表相关信息																																							
+			//  --(4.1)、创建记录号																																							
+			Long v_serial_no=this.getMapper(IfRoll01L3OrdMapper.class).doCount1();
+			v_num_coil=v_coil_no.size();
+			//  --(4.2)、开始事物:																																							
+			for(int i=0;i<youxiao_numcoil;i++){
+				if(v_coil_no!=null && v_coil_no.get(i)!=null && 
+						v_coil_no.get(i).get("entry_coil_no")!=null && !"".equals(v_coil_no.get(i).get("entry_coil_no"))){
+				//  --(4.3)、插入 IF_Roll01_L3_ORD_COIL 指示顺序钢卷记录			
+					IfRoll01L3OrdCoil itloc=new IfRoll01L3OrdCoil();
+					itloc.setSerial_no(v_serial_no);
+					itloc.setSeq_no(longToString(Long.parseLong(i+"")));
+					itloc.setEntry_coil_no(v_coil_no.get(i).get("entry_coil_no")+"");
+					this.getMapper(IfRoll01L3OrdCoilMapper.class).insert(itloc);
+					//   --(4.4)、更新 PLN_SKINROLLING_PLAN_DETAIL 指示顺序下发状态
+					this.getMapper(PlnRollingPlanDetailMapper.class).doUpdate1(v_coil_no.get(i).get("entry_coil_no")+"","");
+				}
+				
+			}
+			//  --(4.5)、插入 IF_Roll01_L3_ORD 指示顺序主记录
+			IfRoll01L3Ord itlo=new IfRoll01L3Ord();
+			itlo.setSerial_no(v_serial_no);
+			itlo.setSend_time(new Date());
+			itlo.setSend_opr("L2Ask");
+			itlo.setNum_coil(longToString(Long.parseLong(v_num_coil+"")));
+			this.getMapper(IfRoll01L3OrdMapper.class).insert(itlo);
+			//  --(5)、提交事务
+			//  --唯一标示操作成功的地方																																							
+			v_success = 1;																																							
+			v_message = "Roll01L3Order 指示顺序电文发送成功!记录号{"+v_serial_no+"} 钢卷数{"+v_num_coil+"}"+"_success:"+v_success;
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3Order 指示顺序电文发送成功!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Roll01L3Order 指示顺序电文发送成功!"+e.getMessage()+"_success:"+v_success;
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3Order 指示顺序电文发送失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Roll01L3Order 指示顺序电文发送失败!"+e.getMessage()+"_success:"+v_success;
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+	    1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L3AswOrder_d 方法调用;																																							
+		2)、	接口参数 IN:V_ENTRY_COIL_NO(已传送给L2的最后一个钢卷号)、V_NUM_COIL(已下发钢卷数)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_entry_coil_no
+	 * @param v_cnt
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value = "tm", rollbackFor = Exception.class)
+	public String Roll01L3NoOrder(String v_entry_coil_no, Integer v_num_coil,
+			Integer v_success, String v_message) throws Exception{
+		//  --(1)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		Integer v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0
+		String v_coil_no;
+		Integer v_count;//--已下发钢卷数
+		try{
+			//  --(2)、参数处理
+			if(v_entry_coil_no ==null || "".equals(v_entry_coil_no)){
+				v_coil_no = "00000000000000000000"; //--PS:20个0
+			}else{
+				v_coil_no=v_entry_coil_no;
+			}
+			if(v_num_coil==null || v_num_coil<0){
+				v_count=0;
+			}else if(v_num_coil>9999){
+			    v_count = 9999;
+			}else{
+				 v_count = v_num_coil;
+			}
+			Roll0lL3NoView tlnov=new Roll0lL3NoView();
+			tlnov.setEntry_coil_no(v_coil_no);
+			tlnov.setNum_coils(v_count);
+			//  --(3)、调用公司接口,将“无指示顺序”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)																																							
+			//  --(3.1)、电文参数,使用处理后的变量 v_coil_no,v_count																																							
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(tlnov,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_NOORDER);
+				String url = ROLLPDI_NOORDER;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="无指示顺序电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发无指示顺序电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发无指示顺序电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发无指示顺序电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			//  --(3.2)、电文发送失败(失败状态,根据接口提供定义确定)																																							
+			if(v_flag == 0){																																							
+			    v_message = "Roll01L3NoOrder 无指示顺序电文发送失败!"+v_message+"_success:"+v_success;																																			
+			    return v_message;																																							
+			}																																						
+			//  --(4)、插入接口记录表相关信息		
+			IfRoll01L3NoneOrd itlno=new IfRoll01L3NoneOrd();
+			itlno.setSend_time(new Date());
+			itlno.setSend_opr("L2Ask");
+			itlno.setEntry_coil_no(v_coil_no);
+			itlno.setNum_coils(longToString(Long.parseLong(v_count+"")));
+			this.getMapper(IfRoll01L3NoneOrdMapper.class).insert(itlno);
+			//  --(5)、提交事务
+			//  --唯一标示操作成功的地方																																							
+			v_success = 1;																																							
+			v_message = "Roll01L3NoOrder 无指示顺序电文发送成功!ENTRY_COIL_NO {"+v_coil_no+"} NUM_COILS {"+v_count+"}"+"_success:"+v_success;		
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3NoOrder 无指示顺序电文发送成功!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Roll01L3NoOrder 无指示顺序电文发送成功!"+e.getMessage()+"_success:"+v_success;
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3NoOrder 无指示顺序电文发送失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Roll01L3NoOrder 无指示顺序电文发送失败!"+e.getMessage()+"_success:"+v_success;
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2 PDI数据请求电文时调用;																																							
+		2)、	此接口参数为“L2 PDI数据请求电文JSON对象”(电文编号:DR3E02);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L3AswPdi(IfRoll01L2AskPdi json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//  --(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_ask_pdi 代替描述
+		IfRoll01L2AskPdi v_rec_l2_ask_pdi=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_PDI数据请求为空";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_ask_pdi.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_ask_pdi.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入L2 PDI数据请求表(单独的事务)
+		try{
+			this.getMapper(IfRoll01L2AskPdiMapper.class).insert(v_rec_l2_ask_pdi);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用应答L2 PDI数据请求函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3AswPdi_d(v_mch_code,v_rec_l2_ask_pdi.getEntry_coil_no(),
+					v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_ask_pdi.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param="L2请求时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO {"+v_rec_l2_ask_pdi.getEntry_coil_no()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L3AswPdi",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	
+	/**
+	 *	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L3AswPdi 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param entry_coil_no
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L3AswPdi_d(String v_mch_code, String v_entry_coil_no,
+			String v_message) throws Exception{
+		
+		Integer v_cnt=null;
+		String v_msg="";
+		String v_entry_location=null;
+		String v_steel=null;
+		Integer v_success=null;
+		PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		YdmProductDetail v_rec_ydm_d=new YdmProductDetail();
+		IfRoll01L3Pdi  v_rec_pdi=new IfRoll01L3Pdi();
+		try{
+			//  --(1.1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			Integer v_flag=1;//--变量默认为1,认为有PDI数据
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_msg="入口卷号{"+v_entry_coil_no+"} 未指定入口卷号!";
+				v_flag=0;//--无PDI数据
+			}
+			//  --(2)、验证入口卷对应的作业计划信息存在
+			if(v_flag==1){
+				v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount1(v_mch_code,v_entry_coil_no);
+				if(v_cnt<=0){
+					v_msg="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+					v_flag=0;//--无PDI数据    
+				}else if(v_cnt>1){
+					v_msg="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+					v_flag=0;//--无PDI数据    
+				}else{
+					List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+					v_rec_pln_d=v_rec_pln_d_list.get(0);
+				}
+			}
+			// --(3)、验证入口卷对应的库存明细存在
+			List<YdmProductDetail> v_rec_ydm_d_list=new ArrayList<>();
+			if(v_flag==1){
+				v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_entry_coil_no+"'", null, 0, 0);
+				if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+					v_msg="入口卷号{"+v_entry_coil_no+"}库存明细记录不存在!";
+					v_flag=0;//--无PDI数据    
+				}
+				//2019-03-07
+				v_rec_ydm_d=v_rec_ydm_d_list.get(0);
+			}
+			
+			//  --(2.4)、验证当前还未生产交工
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_rec_pln_d.getRl_plan_no());
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+			    MesRcmM v_rec_Roll_m =lmcam.get(0);
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_msg="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工,不能重复下发PDI!";
+			    	//return v_message;
+			    	v_flag=0;//--无PDI数据    
+			    }
+			}
+			
+			List<PlnMaterielDetail> v_rec_mtr_in_list=null;
+			//  --(4)、验证入口卷对应的虚拟物料信息存在	
+			if(v_flag==1){
+				v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+						"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"' and object_no='"+v_rec_pln_d.getObject_no()+"'", null, 0, 0);
+				if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+					v_msg="入口卷号{"+v_entry_coil_no+"} 虚拟物料信息不存在!";
+					v_flag=0;//--无PDI数据    
+				}
+			}	
+			
+			//出口目标
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_entry_coil_no+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_out=v_rec_mtr_out_list.get(0);
+			
+			
+			//  --(5)、获取其它相关信息,注意忽略错误
+			if(v_flag==1){
+				//    --(5.1)、获取牌号/钢种名称
+				List<ComBaseSteel> lcbs = this.getMapper(ComBaseSteelMapper.class).findWithCondition(null, "steel_code='"+v_rec_ydm_d.getSteelcode()+"'", null, 0, 0);
+				if(lcbs==null || lcbs.size()<=0){
+					v_steel=v_rec_ydm_d.getSteelcode();
+				}else{
+					if(lcbs.get(0).getSteel_name()==null){
+						v_steel=lcbs.get(0).getSteel_code();
+					}else{
+						v_steel=lcbs.get(0).getSteel_name();
+					}
+				}
+				//    --(5.2)、获取入口卷库位
+				v_entry_location=this.getMapper(MesCrAnnealMMapper.class).doQueryLocation(v_entry_coil_no);
+				if(v_entry_location==null){
+					v_entry_location="";
+				}
+			}
+			//  --(6)、根据 v_flag 标志,确定调用接口																																							
+			//  --(6.1)、v_flag = 1,有可用的PDI数据																																							
+			if(v_flag==1){
+				//    --(6.1.0)、PDI数据属性赋值(注意:记录号、下发时间、下发人,到调用接函数内才赋值)
+			    v_rec_pdi.setEntry_coil_no        ( v_entry_coil_no);// --入口卷号																																							
+			    v_rec_pdi.setExit_coil_no         ( v_entry_coil_no);// --出口卷号																																							
+			    v_rec_pdi.setEntry_coil_source    ( "1");// --入口卷来源(0:自产、1:外购)																																							
+			    v_rec_pdi.setPlan_no              ( v_rec_pln_d.getRl_plan_no());// --计划号	
+			    if(v_rec_mtr_in_list!=null &&v_rec_mtr_in_list.size()>0){
+			    	 //List<PlnProdorder> v_rec_prod = this.getMapper(PlnProdorderMapper.class).findWithCondition(null, "prod_order_no='"+v_rec_mtr_in_list.get(0).getProd_order_no()+"'", null, 0, 0);
+			    	 //v_rec_pdi.setCustomer(v_rec_prod.get(0).getCustomer_name());
+			    	 //v_rec_pdi.setCustomer("下游客户");
+			    }
+				v_rec_pdi.setSupplier(null);//原料供应商
+				if(v_rec_ydm_d.getLength()!=null){
+					  Double len=v_rec_ydm_d.getLength()/1000;
+					  v_rec_pdi.setEntry_length(longToString(len.longValue()));//来料长度
+				  }
+				v_rec_pdi.setEntry_crown(null);//来料凸度
+			    
+			    
+			    if(v_rec_ydm_d.getThick()!=null){
+			    	Double thick_um=v_rec_ydm_d.getThick()*1000;
+			    	v_rec_pdi.setEntry_thichness(longToString(thick_um.longValue()));// --入口热卷厚度(um)	//	1mm(毫米)=1000um(微米) 
+			    }
+			    //出口厚度
+			    v_rec_pdi.setExit_thickness(v_rec_mtr_out.getThick()==null?"":(v_rec_mtr_out.getThick()+""));
+			    
+			    if(v_rec_ydm_d.getWidth()!=null){
+			    	Double width_um=v_rec_ydm_d.getWidth();
+			    	v_rec_pdi.setEntry_width(longToString(width_um.longValue()));// --入口热卷宽度(mm)	//1mm(毫米)=1000um(微米)
+			    }
+			    if(v_rec_ydm_d.getFactweight()!=null){
+			    	v_rec_pdi.setEntry_weight(longToString(v_rec_ydm_d.getFactweight().longValue()));// --入口热卷重量(kg)  ??
+			    }
+			    if(v_rec_ydm_d.getDiameter_inn()!=null){
+			    	v_rec_pdi.setInner_diameter(longToString(v_rec_ydm_d.getDiameter_inn().longValue()));// --入口热卷内径(mm)
+			    }
+			    if(v_rec_ydm_d.getDiameter_out()!=null){
+			    	v_rec_pdi.setOuter_diameter(longToString(v_rec_ydm_d.getDiameter_out().longValue()));// --入口热卷外径(mm)		
+			    }
+			    v_rec_pdi.setHarderness_annealing ( null);// --退火后硬度																																							
+			    v_rec_pdi.setTemp_annealing       ( null);// --退火温度(℃)																																							
+			    v_rec_pdi.setSpm_mode             ( "1");// --平整模式(0:平整、1:轧制),需要生产或质量提供接口																																							
+			    v_rec_pdi.setSpm_elong            ( null);// --平整伸长率(0.01%,e.g. 255 => 2.55 %  ,平整模式),需要生产或质量提供接口																																							
+			    v_rec_pdi.setReduce               ( null);// --压下率(%),需要生产或质量提供接口																																							
+			    v_rec_pdi.setSleeve               ("0");// --套筒(0:无、1:有),需要生产或质量提供接口																																							
+			    v_rec_pdi.setOuter_dia_sleeve     ( null);// --出口套筒外径(520~600),需要生产或质量提供接口																																							
+			    v_rec_pdi.setWeight_sleeve        ( null);// --套筒重量(10^-2kg),需要生产或质量提供接口	
+			    
+			    v_rec_pdi.setGb_steel_grade       ( v_steel);// --国标钢种																																							
+			    v_rec_pdi.setSteel_grade          ( v_steel);// --钢种																																							
+			    v_rec_pdi.setPreced_process_code  ( "");// --上道工序代码																																							
+			    v_rec_pdi.setNext_process_code    ( "");// --后道工序代码																																							
+			    v_rec_pdi.setComment              ( "");// --备注信息																																							
+			    //v_rec_pdi.setExit_yard_location   ( "test_loc");// --出口库位																																							
+			    //v_rec_pdi.setEntry_yard_location  ( v_entry_location);// --入口库位																																							
+			    v_rec_pdi.setReserve1              ( v_rec_ydm_d.getMaterailcoilno());// --预留	
+			    
+			    try{
+				  ResultModel getElementsInfo = this.getBean(QmsApiServiceImpl.class).GetElementsInfo(v_rec_ydm_d.getMaterailcoilno());
+				  if(getElementsInfo!=null && getElementsInfo.getData()!=null){
+					  List<QcmJhyElements> qje=(List)getElementsInfo.getData();
+					  if(qje!=null && qje.size()>0){
+						  for(QcmJhyElements qjed:qje){
+							  //v_rec_pdi.setAlloy_components_avai(alloy_components_avai);
+							  if("Als".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_als(qjed.getChem_value());
+							  }else if("Alt".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_alt(qjed.getChem_value());
+							  }else if("As".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_as(qjed.getChem_value());
+							  }else if("B".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_b(qjed.getChem_value());
+							  }else if("Bi".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_bi(qjed.getChem_value());
+							  }else if("C".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_c(qjed.getChem_value());
+							  }else if("Ca".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_ca(qjed.getChem_value());
+							  }else if("Cd".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_cd(qjed.getChem_value());
+							  }else if("Cr".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_cr(qjed.getChem_value());
+							  }else if("Cu".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_cu(qjed.getChem_value());
+							  }else if("Fe".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_fe(qjed.getChem_value());
+							  }else if("La".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_la(qjed.getChem_value());
+							  }else if("Mn".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_mn(qjed.getChem_value());
+							  }else if("Mo".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_mo(qjed.getChem_value());
+							  }else if("N".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_n(qjed.getChem_value());
+							  }else if("Nb".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_nb(qjed.getChem_value());
+							  }else if("Ni".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_ni(qjed.getChem_value());
+							  }else if("P".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_p(qjed.getChem_value());
+							  }else if("Pb".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_pb(qjed.getChem_value());
+							  }else if("S".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_s(qjed.getChem_value());
+							  }else if("Sb".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_sb(qjed.getChem_value());
+							  }else if("Se".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_se(qjed.getChem_value());
+							  }else if("Si".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_si(qjed.getChem_value());
+							  }else if("Sn".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_sn(qjed.getChem_value());
+							  }else if("Ti".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_ti(qjed.getChem_value());
+							  }else if("V".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_v(qjed.getChem_value());
+							  }else if("W".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_w(qjed.getChem_value());
+							  }else if("Zn".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_zn(qjed.getChem_value());
+							  }else if("Zr".equals(qjed.getChem_name())){
+								  v_rec_pdi.setCa_zr(qjed.getChem_value());
+							  }
+							  
+						  }
+					  }
+				  }
+				  }catch(Exception e){
+					  e.printStackTrace();
+				  }
+			    
+			    
+			    //测试内容:
+//			    v_rec_pdi.setCa_c("0.45601");
+//			    v_rec_pdi.setCa_mn("0.002");
+			    
+			    
+			    // --(6.1.1)、调用PDI数据接口
+			    try{
+			    	String vOprName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+					if(vOprName==null){
+						vOprName="L2Ask";
+					}
+					v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3Pdi(v_rec_pdi,vOprName,v_success,
+							v_message);
+				}catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+				}
+				if(v_message==null){
+					v_message="";
+				}
+				String v_success_str="";
+				if(v_message.contains("_success:")){
+					v_success_str=v_message.substring(v_message.length()-1);
+					v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+				}
+				if("1".equals(v_success_str)){
+					//v_message="L2 PDI数据请求应答成功!"+v_message;
+				}else if("2".equals(v_success_str)){
+					v_message="L2 PDI数据请求应答部分成功!"+v_message;
+				}else{
+					//v_message="L2 PDI数据请求应答失败!"+v_message;
+				}
+			}else{
+				//--(6.2)、调用无PDI数据接口
+				try{
+					v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3NoPdi(v_entry_coil_no,"L2Ask",v_success,
+							v_message);
+				}catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+				}
+				if(v_message==null){
+					v_message="";
+				}
+				String v_success_str="";
+				if(v_message.contains("_success:")){
+					v_success_str=v_message.substring(v_message.length()-1);
+					v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+				}
+				if("1".equals(v_success_str)){
+					v_message="L2  无PDI数据请求应答成功!"+v_msg+v_message;
+				}else if("2".equals(v_success_str)){
+					v_message="L2  无PDI数据请求应答部分成功!"+v_msg+v_message;
+				}else{
+					v_message="L2  无PDI数据请求应答失败!"+v_msg+v_message;
+				}
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L3AswPdi_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L3AswPdi_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+		1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L3AswPdi_d 或 Roll01L3SendPdi_d 方法调用;																																							
+		2)、	接口参数 IN:V_REC_PDI(PDI数据对象)、V_OPR_NAME(操作人)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdi
+	 * @param string
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L3Pdi(IfRoll01L3Pdi v_rec_pdi, String v_opr_name,
+			Integer v_success, String v_message) throws Exception{
+		v_success=0;
+		Integer v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0  
+		
+		try{
+			//  --(2)、调用公司接口,将“PDI数据”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_pdi,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_PDI);
+				String url = ROLLPDI_PDI;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="PDI下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发PDI给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发PDI给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发PDI给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			//  --(2.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Roll01L3Pdi PDI数据电文发送失败!"+v_message+"_success:"+v_success;
+				return v_message;
+			}
+			//  --(3)、插入接口记录表相关信息																																							
+			//  --(3.1)、创建记录号																																							
+			Long v_serial_no=this.getMapper(IfRoll01L3PdiMapper.class).doCount1();
+			
+			//  --(3.2)、开始事物:																																							
+			//  --(3.2.1)、插入 IF_Roll01_L3_PDI PDI数据记录																																							
+			v_rec_pdi.setSerial_no(v_serial_no);
+			v_rec_pdi.setSend_time(new Date());
+			v_rec_pdi.setSend_opr(v_opr_name);
+			this.getMapper(IfRoll01L3PdiMapper.class).insert(v_rec_pdi);
+			//  --(3.2.2)、更新 PLN_SKINROLLING_PLAN_DETAIL PDI数据下发状态
+			if(v_opr_name==null){
+				v_opr_name="";
+			}
+			this.getMapper(PlnRollingPlanDetailMapper.class).doUpdate2(v_opr_name,v_rec_pdi.getPlan_no(), v_rec_pdi.getEntry_coil_no());
+			//  --(4)、提交事务
+			//  --唯一标示操作成功的地方																																							
+			v_success = 1;																																							
+			v_message = "Roll01L3Pdi PDI数据电文发送成功!记录号{"+v_serial_no+"} 计划号{"+v_rec_pdi.getPlan_no()+"} 入口卷号{"+v_rec_pdi.getEntry_coil_no()+"}"+"_success:"+v_success;
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3Pdi PDI数据电文发送成功!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Roll01L3Pdi PDI数据电文发送成功!"+e.getMessage()+"_success:"+v_success;
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3Pdi PDI数据电文发送失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Roll01L3Pdi PDI数据电文发送失败!"+e.getMessage()+"_success:"+v_success;
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+	 1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L3AswPdi_d 方法调用;																																							
+	 2)、	接口参数 IN:V_ENTRY_COIL_NO(L2请求的钢卷号)、V_OPR_NAME(操作人)																																							
+	 3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_entry_coil_no
+	 * @param string
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L3NoPdi(String v_entry_coil_no, String v_opr_name,
+			Integer v_success, String v_message) throws Exception{
+		//  --(1)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		Integer v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0
+		String v_coil_no;
+		try{
+			//  --(2)、参数处理
+			if(v_entry_coil_no ==null || "".equals(v_entry_coil_no)){
+				v_coil_no = "00000000000000000000"; //--PS:20个0
+			}else{
+				v_coil_no=v_entry_coil_no;
+			}
+			Roll0lL3NoView ilnv=new Roll0lL3NoView();
+			ilnv.setEntry_coil_no(v_coil_no);
+			//ilnv.setNum_coil(v_num_coil);
+			//  --(3)、调用公司接口,将“无PDI数据”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)																																							
+			//  --(3.1)、电文参数,使用处理后的变量 v_coil_no																																							
+			//  --......																																							
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(ilnv,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_NOPDI);
+				String url = ROLLPDI_NOPDI;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="无PDI下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发无PDI给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发无PDI给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发无PDI给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			//  --(3.2)、电文发送失败(失败状态,根据接口提供定义确定)																																							
+			if(v_flag == 0){																																							
+			    v_message = "Roll01L3NoPdi 无PDI数据电文发送失败!"+v_message+"_success:"+v_success;																																			
+			    return v_message;																																							
+			}																																						
+			// --(4)、插入接口记录表相关信息		
+			IfRoll01L3NonePdi itlno=new IfRoll01L3NonePdi();
+			itlno.setSend_time(new Date());
+			itlno.setSend_opr(v_opr_name);
+			itlno.setEntry_coil_no(v_coil_no);
+			this.getMapper(IfRoll01L3NonePdiMapper.class).insert(itlno);
+			//  --(5)、提交事务
+			//  --唯一标示操作成功的地方																																							
+			v_success = 1;																																							
+			v_message = "Roll01L3NoPdi 无PDI数据电文发送成功!ENTRY_COIL_NO {"+v_coil_no+"}"+"_success:"+v_success;		
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3NoPdi 无PDI数据电文发送成功!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Roll01L3NoPdi 无PDI数据电文发送成功!"+e.getMessage()+"_success:"+v_success;
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3NoPdi 无PDI数据电文发送失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Roll01L3NoPdi 无PDI数据电文发送失败!"+e.getMessage()+"_success:"+v_success;
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2指示删除电文时调用;																																							
+		2)、	此接口参数为“L2指示删除电文JSON对象”(电文编号:DR3E03);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2Revoke(IfRoll01L2Revoke json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//  --(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_rvk 代替描述
+		IfRoll01L2Revoke v_rec_l2_rvk=json;
+		if(json==null){
+			v_message="二级接口-轧机_L2_指示删除为空";
+			return v_message;
+		}
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_rvk.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_rvk.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入L2指示删除表(单独的事务)
+		try{
+			this.getMapper(IfRoll01L2RevokeMapper.class).insert(v_rec_l2_rvk);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2指示删除处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Revoke_d(v_mch_code,v_rec_l2_rvk.getEntry_coil_no(),
+					v_rec_l2_rvk.getOperator(),v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_rvk.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param="消息时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO {"+v_rec_l2_rvk.getEntry_coil_no()+"} "
+			  		+ "删除责任者 OPERATOR {"+v_rec_l2_rvk.getOperator()+"} 删除原因代码 REASON_CODE {"+v_rec_l2_rvk.getReason_code()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2Revoke",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+
+	
+	/**
+	 *	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L3AswPdi 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param entry_coil_no
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Revoke_d(String v_mch_code, String v_entry_coil_no,
+			String v_operator, String v_message) throws Exception{
+		
+		IfRoll01L3AnswerRevoke v_rec_l3_asw_rvk=new IfRoll01L3AnswerRevoke();
+		Integer v_success=null;
+		try{
+			//  --(1)、调用 L2指示删除 处理函数
+			try{
+				v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Revoke_d_d(v_mch_code,v_entry_coil_no,
+						v_operator,v_success,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message=e.getMessage();
+			}
+			//  --(1.1)、构造 L3应答L2指示数据删除 电文																																							
+			//  --(1.1.1)、L3处理L2指示删除电文成功(1:成功)																																							
+			if(v_message==null){
+				v_message="";
+			}
+			String v_success_str="";
+			//对v_message和v_success进行处理
+			if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				//v_success= Integer.parseInt(v_success_str);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			}
+			if("1".equals(v_success_str)){
+			    v_rec_l3_asw_rvk.setResult("0");// --处理结果(0:成功、1:错误)
+			}else{
+				v_rec_l3_asw_rvk.setResult("1");//--处理标志(0:成功、1:不成功)
+			}
+			v_rec_l3_asw_rvk.setEntry_coil_no(v_entry_coil_no);//--入口钢卷号
+			v_rec_l3_asw_rvk.setSend_time(new Date());
+			v_rec_l3_asw_rvk.setSend_opr("L3");//--下发人
+			//  --(2)、调用 L3应答L2指示数据删除 处理函数
+			String v_message2="";
+			try{
+				v_message2=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3AswRevoke(v_rec_l3_asw_rvk,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message2=e.getMessage();
+			}
+			String send_time=DateUtil.formatDate(v_rec_l3_asw_rvk.getSend_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(4)、拼接返回字符串
+			String v_param= "下发时间 SEND_TIME {"+send_time+"} 下发人 SEND_OPR {"+v_rec_l3_asw_rvk.getSend_opr()+"} "
+					+ "入口卷号 ENTRY_COIL_NO {"+v_rec_l3_asw_rvk.getEntry_coil_no()+"} 处理结果(0:成功、1:错误) RESULT {"+v_rec_l3_asw_rvk.getResult()+"}";
+			//  --(5)、写接口日志:与业务处理分开,单独的事务
+			try{
+				this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L3AswRevoke",v_param,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2Revoke_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2Revoke_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+	 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Revoke_d 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)、V_OPERATOR(删除操作人)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_entry_coil_no
+	 * @param v_operator
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Revoke_d_d(String v_mch_code, String v_entry_coil_no,
+			String v_operator, Integer v_success, String v_message) throws Exception{
+		//  --(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		Integer v_cnt=null;
+		PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message+"_success:"+v_success;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message+"_success:"+v_success;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_message="入口卷号{"+v_entry_coil_no+"} 未指定入口卷号!";
+				return v_message+"_success:"+v_success;
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.1)、验证入口卷对应的作业计划信息存在																																							
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount1(v_mch_code,v_entry_coil_no);
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+				return v_message+"_success:"+v_success;
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+				return v_message+"_success:"+v_success;
+			}else{
+				List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、验证已下发过PDI
+//			if(v_rec_pln_d.getSend_flag()==null || "0".equals(v_rec_pln_d.getSend_flag())){
+//				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 还未下发指示顺序或PDI数据!";
+//				return v_message+"_success:"+1;
+//			}
+			//  --(2.3)、验证当前还未生产交工
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_rec_pln_d.getRl_plan_no());
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+			    MesRcmM v_rec_Roll_m =lmcam.get(0);
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工!";
+			    	return v_message+"_success:"+v_success;
+			    }
+			}
+			//  --(3)、开始事物:																																							
+			//  --(3.1)、修改指示状态																																							
+			this.getMapper(PlnRollingPlanDetailMapper.class).doUpdate3(v_operator, v_rec_pln_d.getRl_plan_no(), v_entry_coil_no);
+			//  --(4)、提交事务
+			//唯一标示操作成功的地方
+			v_success=1;
+			v_message="Roll01L2Revoke L2指示删除电文处理成功!"+"_success:"+v_success;
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2Revoke L2指示删除电文处理失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+			}else{
+				v_message="Roll01L2Revoke L2指示删除电文处理失败!"+e.getMessage()+"_success:"+v_success;
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+	  	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Revoke_d 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)、V_OPERATOR(删除操作人)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_l3_asw_rvk
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L3AswRevoke(IfRoll01L3AnswerRevoke v_rec_l3_asw_rvk,
+			String v_message) throws Exception{
+		Integer v_flag=null;// --电文发送成功标志
+		try{
+			//  --(1)、无接口调试时,设置1,直接跳过,否则设置为0
+			v_flag=0;// --1:成功、0:失败
+			//  --(1)、调用公司接口,将“L3应答L2指示数据删除电文” v_rec_l3_asw_rvk 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_l3_asw_rvk,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_L2ORDERDELE);
+				String url = ROLLPDI_L2ORDERDELE;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3应答L2指示数据删除电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发L3应答L2指示数据删除电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发L3应答L2指示数据删除电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发L3应答L2指示数据删除电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			
+			//  --(1.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Roll01L3AswRevoke L3应答L2指示数据删除电文发送失败!"+v_message;
+				return v_message;
+			}
+			//  --(1.2)、电文发送成功(成功状态,根据接口提供定义确定),插入 L3应答L2指示数据删除 记录																																			
+			this.getMapper(IfRoll01L3AnswerRevokeMapper.class).insert(v_rec_l3_asw_rvk);
+			// --(1.2.1)、提交事务
+			v_message="Roll01L3AswRevoke L3应答L2指示数据删除电文发送成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(1.2.2)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(1.2.2.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3AswRevoke L3应答L2指示数据删除电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3AswRevoke L3应答L2指示数据删除电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3AswRevoke L3应答L2指示数据删除电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3AswRevoke L3应答L2指示数据删除电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2开始生产电文时调用;																																							
+		2)、	此接口参数为“L2开始生产电文JSON对象”(电文编号:DR3E05);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2ProduceStart(IfRoll01L2PrdStr json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//  --(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_prd_str 代替描述
+		IfRoll01L2PrdStr v_rec_l2_prd_str=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_开始生产为空";
+			return v_message;
+		}
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_prd_str.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_prd_str.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入L2开始生产表(单独的事务)
+		try{
+			this.getMapper(IfRoll01L2PrdStrMapper.class).insert(v_rec_l2_prd_str);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2开始生产处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2ProduceStart_d(v_mch_code,v_rec_l2_prd_str,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_prd_str.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO {"+v_rec_l2_prd_str.getEntry_coil_no()+"} 时间 TC_TIME {"+v_rec_l2_prd_str.getTc_time()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2ProduceStart",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2ProduceStart 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_PRD_STR(L2开始生产记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_prd_str
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2ProduceStart_d(String v_mch_code,
+			IfRoll01L2PrdStr v_rec_l2_prd_str, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.2.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_mch_code);
+			if(cbm.getMachine_mark()==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+				return v_message;
+			}
+			
+			//  --(1.3)、验证入口卷号不为空
+			if(v_rec_l2_prd_str.getEntry_coil_no()==null || "".equals(v_rec_l2_prd_str.getEntry_coil_no())){
+				v_message="入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} 未指定入口卷号!";
+				return v_message;
+			}
+			if(v_rec_l2_prd_str.getEntry_coil_no().substring(0, 1).equals("L")){
+				List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "materailcoilno='"+v_rec_l2_prd_str.getEntry_coil_no()+"'", "", 0, 0);
+				if(listypd!=null && listypd.size()==1){
+					v_rec_l2_prd_str.setEntry_coil_no(listypd.get(0).getCoilno());
+				}
+			}
+			
+			
+			
+			//--(1.4)、验证电文中“开始生产时间”
+			Date v_str_time=null;
+			if(v_rec_l2_prd_str.getTc_time()==null || "".equals(v_rec_l2_prd_str.getTc_time())){
+				v_str_time=new Date();//--如果“开始生产”事件时刻为空,则赋值为当前时刻
+			}else{
+				//    --将生产开始时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+				try {
+					List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_prd_str.getTc_time());
+					v_str_time=li.get(0).getCreate_time();
+				} catch (Exception e) {
+					e.printStackTrace();
+					v_message="电文中“生产开始”事件时刻{"+v_rec_l2_prd_str.getTc_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+					return v_message;
+				}
+			}
+			String rmDb=DateUtil.formatDate(v_str_time, "yyyy-MM-dd HH:mm:ss");
+			String v_date=null,v_ord=null;
+			String dbTime=rmDb.substring(11);
+			v_date=rmDb.substring(0,10);
+			// --(1.1.1)、如果 v_charge_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_charge_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				v_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				v_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				v_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(v_date);
+				} catch (Exception e) {
+					return "获取数据库时间失败,请稍后重试";
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+		        v_date=formatYmd.format(c.getTime());
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.0)、根据计算的日期班次,获取交接班记录的班组																																							
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(v_date);
+			msm.setWrk_ord(v_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_grp=null;
+			if(v_cnt<=0){
+				v_grp="";// --无交接班记录,则赋空值(交工时,会提示用户完善信息)
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_grp=lmsm.get(0).getWrk_grp();
+			}
+			//  --(2.1)、验证入口卷对应的作业计划信息存在  
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount1(v_mch_code,v_rec_l2_prd_str.getEntry_coil_no());
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} 找不到作业计划信息!";
+				return v_message;  
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"}存在2条或以上的作业计划信息!";
+				return v_message; 
+			}else{
+				List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_rec_l2_prd_str.getEntry_coil_no());
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此电文事件)
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_rec_pln_d.getRl_plan_no());
+			mCross.setMaterial_no(v_rec_l2_prd_str.getEntry_coil_no());
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			MesRcmM v_rec_Roll_m=new MesRcmM();
+			boolean flag=false;//
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+			    v_rec_Roll_m =lmcam.get(0);
+			    flag=true;
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_message = "机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} "
+			    			+ "入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} 已生产交工,忽略此电文事件!'";
+					return v_message;
+			    }
+			}
+			//  --(2.3)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";																																							
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			//  --(2.4)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_l2_prd_str.getEntry_coil_no()+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} 原料卷库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=  v_rec_ydm_d_list.get(0);
+			//  --(2.5)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BRL02".equals(v_rec_pln_d.getStatus()) || "5BRL03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}	
+			
+			//  --(2.7)、在 v_rec_Roll_m 对象基础上,构建平整主实绩,并插入记录																																							
+			//  --(2.7.1):v_rec_Roll_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+			//  --(2.7.2):v_rec_Roll_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)						
+			ComBaseMachine machine2 = new ComBaseMachine();
+			machine2.setMachine_code(v_mch_code);
+			List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class)
+					.find(machine2, 0, 0);
+			String v_mch_mark=lcbm.get(0).getMachine_mark();
+			if (v_mch_mark == null) {
+				return "机台代码:" +v_mch_code+ "\n设备编号未配置,无法处理!";
+			}
+			String v_process_no="";
+			if(!flag){//如果 v_rec_plm_m 对象为空(即之前无生产实绩)
+				SimpleDateFormat formatY3 = new SimpleDateFormat("yyMMdd");
+				v_process_no = "Z" + formatY3.format(new Date())+lpad(v_mch_mark, 2, "0");
+				v_cnt = this.getMapper(MesRcmMMapper.class).doquery(v_process_no);
+				if (v_cnt == null) {
+					v_cnt = 1;
+				}
+				v_process_no = v_process_no + lpad(v_cnt.toString(), 3, "0");
+				v_rec_Roll_m.setProcess_no(v_process_no);
+			}
+			
+			  v_rec_Roll_m.setMachine_code    ( v_mch_code);// --机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			  v_rec_Roll_m.setSchedule_no     ( v_rec_pln_d.getRl_plan_no());// --作业计划号																																							
+			  v_rec_Roll_m.setInner_seq       ( v_rec_pln_d.getRl_seq());// --计划内序号																																							
+			  v_rec_Roll_m.setMaterial_no_vt  ( v_rec_pln_d.getObject_no_vt());// --虚拟原料卷号																																							
+			  v_rec_Roll_m.setPln_steel_code  ( v_rec_mtr_in.getSteel_code());// --计划原料卷牌号																																							
+			  v_rec_Roll_m.setPln_mtr_thk     ( v_rec_mtr_in.getThick());// --计划原料卷厚度																																							
+			  v_rec_Roll_m.setPln_mtr_wdt     ( v_rec_mtr_in.getWidth());// --计划原料卷宽度																																							
+			  v_rec_Roll_m.setPln_mtr_len     ( v_rec_mtr_in.getLength());// --计划原料卷长度																																							
+			  v_rec_Roll_m.setPln_mtr_inn_dia ( v_rec_mtr_in.getDiameter_inn());// --计划原料卷内径																																							
+			  v_rec_Roll_m.setPln_mtr_out_dia ( v_rec_mtr_in.getDiameter_out());// --计划原料卷外径																																							
+			  v_rec_Roll_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.getSingle_weight());// --计划原料卷理重																																							
+			  v_rec_Roll_m.setMaterial_no     ( v_rec_l2_prd_str.getEntry_coil_no());// --原料卷号																																							
+			  v_rec_Roll_m.setMaterial_no_src ( v_rec_ydm_d.getMaterailcoilno());// --原始卷号																																							
+			  v_rec_Roll_m.setMtr_thk         ( v_rec_ydm_d.getThick());// --原料卷厚度																																							
+			  v_rec_Roll_m.setMtr_wdt         ( v_rec_ydm_d.getWidth());// --原料卷宽度																																							
+			  v_rec_Roll_m.setMtr_len         ( v_rec_ydm_d.getLength());// --原料卷长度																																							
+			  v_rec_Roll_m.setMtr_inn_dia     ( v_rec_ydm_d.getDiameter_inn());// --原料卷内径																																							
+			  v_rec_Roll_m.setMtr_out_dia     ( v_rec_ydm_d.getDiameter_out());// --原料卷外径																																							
+			  if(v_rec_ydm_d.getTheoryweight()!=null){
+				  v_rec_Roll_m.setMtr_thr_wgt     ( v_rec_ydm_d.getTheoryweight());// --原料卷理重	
+			  }else{
+				  v_rec_Roll_m.setMtr_thr_wgt     (v_rec_ydm_d.getFactweight());// --原料卷理重	
+			  }
+			  v_rec_Roll_m.setMtr_act_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷实重																																							
+			  v_rec_Roll_m.setSteel_code      ( v_rec_ydm_d.getSteelcode());// --原料卷牌号
+			  
+//			  if(!flag){//如果 v_rec_Roll_m 对象为空(即之前无生产实绩),则覆盖 作业日期、班次、班组(与生产开始不同,请注意)
+//				  v_rec_Roll_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)																																							
+//				  v_rec_Roll_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)																																							
+//				  v_rec_Roll_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)																																							
+//				  v_rec_Roll_m.setFeeding_time ( v_str_time); //--上料时间		
+//				  
+//			  }
+			  if(v_rec_Roll_m.getWrk_date()==null){
+				  v_rec_Roll_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)									
+			  }
+			  if(v_rec_Roll_m.getWrk_grp()==null){
+				  v_rec_Roll_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)			
+			  }
+			  if(v_rec_Roll_m.getWrk_ord()==null){
+				  v_rec_Roll_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)				
+			  }
+			  if(v_rec_Roll_m.getFeeding_time()==null){
+				  v_rec_Roll_m.setFeeding_time ( v_str_time); //--上料时间	
+			  }
+			  
+			  v_rec_Roll_m.setTp_str_time(v_str_time); //--生产开始时间
+			  v_rec_Roll_m.setMemo             ( null);// --备注																																							
+			  v_rec_Roll_m.setHand_over_status ( "0");// --交工状态																																							
+			  v_rec_Roll_m.setHand_over_time   ( null);// --交工时间																																							
+			  v_rec_Roll_m.setHand_over_opr    ( null);// --交工人																																							
+
+			  if(!flag){
+				  //  --如果 v_rec_Roll_m 对象为空(即之前无生产实绩),则:
+				  v_rec_Roll_m.setCreate_opr( "L2_DR3E05");// --操作人																																							
+				  v_rec_Roll_m.setCreate_time( new Date());// --操作时间																																							
+			  }else{
+				  //  --如果 v_rec_Roll_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				  v_rec_Roll_m.setUpdate_opr("L2_DR3E05");// --修改人																																							
+				  v_rec_Roll_m.setUpdate_time(new Date()) ;//--修改时间																																							
+			  }
+			  
+			  //--(3)、开始事物:																																							
+			  //--(3.0)、更新生产跟踪表	??	
+			  try{
+				  int count = this.getMapper(MesRcmTrcMapper.class).countWithCondition(null,"machine_code='"+v_mch_code+"'"); 
+				  if(count<=0){
+					  	MesRcmTrc mcst=new MesRcmTrc();
+					  	mcst.setMachine_code(v_mch_code);
+					  	mcst.setCur_coil_no(v_rec_l2_prd_str.getEntry_coil_no());
+					  	mcst.setCur_str_time(v_str_time);
+					  	mcst.setUpdate_program("Roll01L2ProduceStart");
+					  	mcst.setUpdate_time(new Date());
+						this.getMapper(MesRcmTrcMapper.class).insert(mcst);
+				  }else{
+					  MesRcmTrc v_rec_Roll_trc = this.getMapper(MesRcmTrcMapper.class).findById(v_mch_code);
+					  //    --(3.0.1)、如果生产结束入口卷号 <> 生产跟踪表的当前钢卷号
+					  if(!v_rec_l2_prd_str.getEntry_coil_no().equals(v_rec_Roll_trc.getCur_coil_no())){
+						    MesRcmTrc mcst=new MesRcmTrc();
+						  	mcst.setMachine_code(v_mch_code);
+						  	mcst.setLst_coil_no(v_rec_Roll_trc.getCur_coil_no());
+						  	mcst.setLst_str_time(v_rec_Roll_trc.getCur_str_time());
+						  	mcst.setLst_end_time(null);
+						  	mcst.setCur_coil_no(v_rec_l2_prd_str.getEntry_coil_no());
+						  	mcst.setCur_str_time(v_str_time);
+						  	mcst.setUpdate_program("Roll01L2ProduceStart");
+						  	mcst.setUpdate_time(new Date());
+							this.getMapper(MesRcmTrcMapper.class).update(mcst);
+					  }else{
+						  MesRcmTrc mcstcc=new MesRcmTrc();
+						  mcstcc.setMachine_code(v_mch_code);
+						  mcstcc.setCur_str_time(v_str_time);
+						  mcstcc.setUpdate_program("Roll01L2ProduceStart");
+						  mcstcc.setUpdate_time(new Date());
+						  this.getMapper(MesRcmTrcMapper.class).update(mcstcc);
+					  }
+				  }
+			  }catch(Exception e){
+				  e.printStackTrace();
+			  }
+			  
+			  //  --(3.1)、删除可能存在的平整作业实绩记录
+			  this.getMapper(MesRcmMMapper.class).doDelete1(v_rec_pln_d.getRl_plan_no(),v_rec_l2_prd_str.getEntry_coil_no());
+			  //  --(3.2)、插入平整作业实绩记录
+			  this.getMapper(MesRcmMMapper.class).insert(v_rec_Roll_m);
+			  
+			  //--(3.3)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			  //--(3.3.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接 口的操作,要求能正常处理,不能影响上述操作																																							
+																																										
+			  //--(3.4)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			  //--(3.4.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+				MesRcmM  mcsm=new MesRcmM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.getRl_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_l2_prd_str.getEntry_coil_no());//投料卷号
+				mcsm.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟卷号 
+				List<MesRcmM> lmcsm=new ArrayList<MesRcmM>();
+				//时间
+				SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+			    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+			    mcsm.setMemo(date);
+			    lmcsm.add(mcsm);
+			   //调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag2=true;
+				try{
+					this.getBean(MesApiRollingPlanImpl.class).MesRcmMAddValid(lmcsm);
+				}catch(Exception e){
+					flag2=false;
+					e.printStackTrace();
+				}
+				if(flag2){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiRollingPlanImpl.class).MesRcmMAdd(lmcsm);
+				}
+				
+				//调用物流模块(仓库管理)接口,对原料卷进行生产投料出库操作(接口由物流模块提供);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_l2_prd_str.getEntry_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_l2_prd_str.getEntry_coil_no());//注意
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(date);
+					cp2.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+				}
+			v_message = "Roll01L2ProduceStart L2开始生产电文处理成功!";  
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2ProduceStart L2开始生产电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2ProduceStart L2开始生产电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2钢卷回退实绩电文时调用;																																							
+		2)、	此接口参数为“L2钢卷回退实绩电文JSON对象”(电文编号:DR3E07);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2Reject(IfRoll01L2Reject json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//  --(1)、先将参数转换为Java实体类,此处以 v_rec_l2_reject 代替描述
+		IfRoll01L2Reject v_rec_l2_reject=json;
+		if(json==null){
+			v_message="参数错误:二级接口-轧机_L2_钢卷回退实绩为空";
+			return v_message;
+		}
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_reject.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_reject.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入L2钢卷回退实绩表(单独的事务)
+		try{
+			this.getMapper(IfRoll01L2RejectMapper.class).insert(v_rec_l2_reject);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2钢卷回退实绩处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Reject_d(v_mch_code,v_rec_l2_reject,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_reject.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param = "消息时间 MSG_TIME {"+mes_time+"} 回退钢卷号 REJECT_COIL_NO {"+v_rec_l2_reject.getReject_coil_no()+"} "
+					+ "入口钢卷号 ENTRY_COIL_NO {"+v_rec_l2_reject.getEntry_coil_no()+"} 材料标志 COIL_FLAG {"+v_rec_l2_reject.getCoil_flag()+"} "
+							+ "回退方式 REJECT_MODE {"+v_rec_l2_reject.getReject_mode()+"} 回退卷长 REJECT_COIL_LENGTH {"+v_rec_l2_reject.getReject_coil_length()+"} "
+									+ "回退卷重 REJECT_COIL_WEIGHT {"+v_rec_l2_reject.getReject_coil_weight()+"} 回退卷外径 REJECT_OUTER_DIAMETER {"+																																						
+			             v_rec_l2_reject.getReject_outer_diameter() +"} 回退原因代码 REJECT_REASON_CODE {"+v_rec_l2_reject.getReject_reason_code() +"} "
+			             		+ "封闭代码 WITHHOLDING_FLAG {"+v_rec_l2_reject.getWithholding_flag()	+"} 封闭原因代码 WITHHOLDING_REASON {"+
+			             v_rec_l2_reject.getWithholding_reason() +"} 封闭责任者代码 USER_ID {"+																																						
+			             v_rec_l2_reject.getUser_id() +"} 回退时间 REJECT_TIME {"+																																							
+			             v_rec_l2_reject.getReject_time()+ "} 班次 SHIFT {"+																																							
+			             v_rec_l2_reject.getShift() +"} 班别 CREW {"+ v_rec_l2_reject.getCrew()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2Reject",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Reject 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_REJECT(L2钢卷回退实绩对象)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_reject
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Reject_d(String v_mch_code,
+			IfRoll01L2Reject v_rec_l2_reject, String v_message) throws Exception{
+		
+		IfRoll01L3AnswerReject v_rec_l3_asw_reject=new IfRoll01L3AnswerReject();
+		Integer v_success=null;
+		try{
+			//  --(1)、调用 L2钢卷回退实绩 处理函数
+			try{
+				v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Reject_d_d(v_mch_code,v_rec_l2_reject,
+						v_success,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message=e.getMessage();
+			}
+			//  --(1.1)、构造 L3应答L2钢卷回退实绩 电文																																							
+			//  --(1.1.1)、L3处理L2钢卷回退实绩电文成功(1:成功)																																							
+			if(v_message==null){
+				v_message="";
+			}
+			String v_success_str="";
+			//对v_message和v_success进行处理
+			if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			}
+			if("1".equals(v_success_str)){
+				v_rec_l3_asw_reject.setResult("0");// --处理结果(0:成功、1:错误)
+			}else{
+				v_rec_l3_asw_reject.setResult("1");//--处理标志(0:成功、1:不成功)
+			}
+			v_rec_l3_asw_reject.setReject_coil_no(v_rec_l2_reject.getReject_coil_no());//--回退卷号
+			v_rec_l3_asw_reject.setSend_time(new Date());
+			v_rec_l3_asw_reject.setSend_opr("L3");//--下发人
+			//  --(2)、调用 L3应答L2钢卷回退实绩 处理函数
+			String v_message2="";
+			try{
+				v_message2=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3AswReject(v_rec_l3_asw_reject,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message2=e.getMessage();
+			}
+			String send_time=DateUtil.formatDate(v_rec_l3_asw_reject.getSend_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(4)、拼接返回字符串
+			String  v_param = "下发时间 SEND_TIME {"+send_time+"} 下发人 SEND_OPR {"+v_rec_l3_asw_reject.getSend_opr()+"} "
+			  		+ "回退卷号 REJECT_COIL_NO {"+v_rec_l3_asw_reject.getReject_coil_no()+"} 处理结果(0:成功、1:错误) RESULT {"+v_rec_l3_asw_reject.getResult()+"} "
+			  				+ "预留 RESERVE {"+v_rec_l3_asw_reject.getReserve()+"}";																																							
+			//  --(5)、写接口日志:与业务处理分开,单独的事务
+			try{
+				this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L3AswReject",v_param,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2Reject_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2Reject_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Reject_d 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_REJECT(L2钢卷回退实绩对象)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_reject
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Reject_d_d(String v_mch_code,
+			IfRoll01L2Reject v_rec_l2_reject, Integer v_success, String v_message) throws Exception{
+		Integer v_cnt=null;
+		// --(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.2.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_mch_code);
+			if(cbm.getMachine_mark()==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+				return v_message;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_rec_l2_reject.getEntry_coil_no()==null || "".equals(v_rec_l2_reject.getEntry_coil_no())){
+				v_message="入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} 未指定入口卷号!";
+				return v_message;
+			}
+			if(v_rec_l2_reject.getEntry_coil_no().substring(0, 1).equals("L")){
+				List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "materailcoilno='"+v_rec_l2_reject.getEntry_coil_no()+"'", "", 0, 0);
+				if(listypd!=null && listypd.size()==1){
+					v_rec_l2_reject.setEntry_coil_no(listypd.get(0).getCoilno());
+				}
+			}
+			
+			
+			//  --(1.4)、验证回退方式(1: 整卷回退、2:半卷回退)
+			if(v_rec_l2_reject.getReject_mode()==null || "".equals(v_rec_l2_reject.getReject_mode())){
+				v_message="回退方式{"+v_rec_l2_reject.getReject_mode()+"} 未指定,系统无法处理!";
+				return v_message;
+			}else if(strToLong(v_rec_l2_reject.getReject_mode()).longValue()!=1 && strToLong(v_rec_l2_reject.getReject_mode()).longValue()!=2){
+				v_message="回退方式{"+v_rec_l2_reject.getReject_mode()+"} 代码无法识别!";
+				return v_message;
+			}
+			if(strToLong(v_rec_l2_reject.getReject_mode()).longValue()==1){
+				v_message="整卷回退 的情况,系统不做处理,由人工到MES系统取消实绩,恢复为计划";
+				return v_message;
+			}
+			
+			Date v_time=null;
+			//  --(2)、只处理“半卷回退”的情况(整卷回退 的情况,系统不做处理,由人工到MES系统取消实绩,恢复为计划)
+			if("2".equals(v_rec_l2_reject.getReject_mode())){
+				//    --(2.1)、验证电文中“回退时间(YYYYMMDDHHMMSS)”
+				if(v_rec_l2_reject.getReject_time()==null || "".equals(v_rec_l2_reject.getReject_time())){
+					v_time=new Date();//--如果回退时间为空,则赋值为当前时刻
+				}else{
+					//    --(2.1.1)、将回退时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+					try {
+						List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_reject.getReject_time());
+						v_time=li.get(0).getCreate_time();
+					} catch (Exception e) {
+						e.printStackTrace();
+						v_message="电文中“回退时间”{"+v_rec_l2_reject.getReject_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+						return v_message;
+					}
+				}
+			}
+			
+			String rmDb=DateUtil.formatDate(v_time, "yyyy-MM-dd HH:mm:ss");
+			String v_date=null,v_ord=null;
+			String dbTime=rmDb.substring(11);
+			v_date=rmDb.substring(0,10);
+			// --(1.1.1)、如果 v_charge_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_charge_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				v_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				v_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				v_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(v_date);
+				} catch (Exception e) {
+					return "获取数据库时间失败,请稍后重试";
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+		        v_date=formatYmd.format(c.getTime());
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//    --(2.3)、根据计算的日期班次,获取交接班记录的班组																																						
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(v_date);
+			msm.setWrk_ord(v_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_grp=null;
+			if(v_cnt<=0){
+				  //      --(2.3.1)、电文中 班别(A:甲、B:乙、C:丙、D:丁),对应MES系统(1:甲、2:乙、3:丙、4:丁)
+				  String l2_grp=v_rec_l2_reject.getCrew(); //--无交接班记录,是使用电文中的生产班别
+				  if("A".equals(l2_grp)){
+					  v_grp = "1"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("B".equals(l2_grp)){
+					  v_grp = "2"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("C".equals(l2_grp)){
+					  v_grp = "3"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("D".equals(l2_grp)){
+					  v_grp = "4"; //--无交接班记录,是使用电文中的生产班别
+				  }
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_grp=lmsm.get(0).getWrk_grp();
+			}
+			// --(2.4)、验证入口卷对应的作业计划信息存在
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount1(v_mch_code,v_rec_l2_reject.getEntry_coil_no());
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} 找不到作业计划信息!";
+				return v_message;  
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"}存在2条或以上的作业计划信息!";
+				return v_message; 
+			}else{
+				List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_rec_l2_reject.getEntry_coil_no());
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//    --(2.5)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此电文事件)
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_rec_pln_d.getRl_plan_no());
+			mCross.setMaterial_no(v_rec_l2_reject.getEntry_coil_no());
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			MesRcmM v_rec_Roll_m=new MesRcmM();
+			boolean flag=false;//
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+			    v_rec_Roll_m =lmcam.get(0);
+			    flag=true;
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_message = "机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} "
+			    			+ "入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} 已生产交工,忽略此电文事件!'";
+					return v_message;
+			    }
+			}
+			//    --(2.6)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";																																							
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			//    --(2.7)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_l2_reject.getEntry_coil_no()+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} 原料卷库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=  v_rec_ydm_d_list.get(0);
+			//    --(2.8)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BRL02".equals(v_rec_pln_d.getStatus()) || "5BRL03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			//    --(2.10)、计算吊销卷号
+			String v_reject_coil_no=null;
+			for(int idx=1;idx<=9;idx++){
+				//      --(2.10.1)、吊销卷号编码规则:原料卷号(8位最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)+ 'R' + 1位流水(1 - 9)
+				v_reject_coil_no=v_rec_l2_reject.getEntry_coil_no().substring(0, 8) + "P"+lpad(cbm.getMachine_mark(), 2, "0")+"R"+idx;
+				String schedule_no=null;
+				String material_no=null;
+				if(v_rec_Roll_m==null){
+					schedule_no="NULL";
+					material_no="NULL";
+				}else{
+					schedule_no=v_rec_Roll_m.getSchedule_no()==null?"NULL":v_rec_Roll_m.getSchedule_no();
+					material_no=v_rec_Roll_m.getMaterial_no()==null?"NULL":v_rec_Roll_m.getMaterial_no();
+				}
+				v_cnt=this.getMapper(MesRcmMMapper.class).doCount2(v_reject_coil_no,schedule_no,material_no);
+				//  --(2.10.2)、--吊销卷号未占用
+				if(v_cnt==0){
+					break;
+				}
+			}
+			//    --(2.10.3)、--吊销卷号无法生成(1-9序号全部被使用)
+			if(v_cnt>0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"吊销卷号生成失败,序号已全部占用!";																																							
+				return v_message;
+			}
+		    // --(2.11)、在 v_rec_Roll_m 对象基础上,构建平整主实绩,并插入记录																																							
+		    // --(2.11.1):v_rec_Roll_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+		    // --(2.11.2):v_rec_Roll_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)	
+			ComBaseMachine machine2 = new ComBaseMachine();
+			machine2.setMachine_code(v_mch_code);
+			List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class)
+					.find(machine2, 0, 0);
+			String v_mch_mark=lcbm.get(0).getMachine_mark();
+			if (v_mch_mark == null) {
+				return "机台代码:" +v_mch_code+ "\n设备编号未配置,无法处理!";
+			}
+			String v_process_no="";
+			if(!flag){//如果 v_rec_plm_m 对象为空(即之前无生产实绩)
+				SimpleDateFormat formatY3 = new SimpleDateFormat("yyMMdd");
+				v_process_no = "Z" + formatY3.format(new Date())+lpad(v_mch_mark, 2, "0");
+				v_cnt = this.getMapper(MesRcmMMapper.class).doquery(v_process_no);
+				if (v_cnt == null) {
+					v_cnt = 1;
+				}
+				v_process_no = v_process_no + lpad(v_cnt.toString(), 3, "0");
+				v_rec_Roll_m.setProcess_no(v_process_no);
+			}
+			
+			
+			
+			  v_rec_Roll_m.setMachine_code    ( v_mch_code);// --机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			  v_rec_Roll_m.setSchedule_no     ( v_rec_pln_d.getRl_plan_no());// --作业计划号																																							
+			  v_rec_Roll_m.setInner_seq       ( v_rec_pln_d.getRl_seq());// --计划内序号																																							
+			  v_rec_Roll_m.setMaterial_no_vt  ( v_rec_pln_d.getObject_no_vt());// --虚拟原料卷号																																							
+			  v_rec_Roll_m.setPln_steel_code  ( v_rec_mtr_in.getSteel_code());// --计划原料卷牌号																																							
+			  v_rec_Roll_m.setPln_mtr_thk     ( v_rec_mtr_in.getThick());// --计划原料卷厚度																																							
+			  v_rec_Roll_m.setPln_mtr_wdt     ( v_rec_mtr_in.getWidth());// --计划原料卷宽度																																							
+			  v_rec_Roll_m.setPln_mtr_len     ( v_rec_mtr_in.getLength());// --计划原料卷长度																																							
+			  v_rec_Roll_m.setPln_mtr_inn_dia ( v_rec_mtr_in.getDiameter_inn());// --计划原料卷内径																																							
+			  v_rec_Roll_m.setPln_mtr_out_dia ( v_rec_mtr_in.getDiameter_out());// --计划原料卷外径																																							
+			  v_rec_Roll_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.getSingle_weight());// --计划原料卷理重																																							
+			  v_rec_Roll_m.setMaterial_no     ( v_rec_l2_reject.getEntry_coil_no());// --原料卷号																																							
+			  v_rec_Roll_m.setMaterial_no_src ( v_rec_ydm_d.getMaterailcoilno());// --原始卷号																																							
+			  v_rec_Roll_m.setMtr_thk         ( v_rec_ydm_d.getThick());// --原料卷厚度																																							
+			  v_rec_Roll_m.setMtr_wdt         ( v_rec_ydm_d.getWidth());// --原料卷宽度																																							
+			  v_rec_Roll_m.setMtr_len         ( v_rec_ydm_d.getLength());// --原料卷长度																																							
+			  v_rec_Roll_m.setMtr_inn_dia     ( v_rec_ydm_d.getDiameter_inn());// --原料卷内径																																							
+			  v_rec_Roll_m.setMtr_out_dia     ( v_rec_ydm_d.getDiameter_out());// --原料卷外径																																							
+			  if(v_rec_ydm_d.getTheoryweight()!=null){
+				  v_rec_Roll_m.setMtr_thr_wgt     ( v_rec_ydm_d.getTheoryweight());// --原料卷理重	
+			  }else{
+				  v_rec_Roll_m.setMtr_thr_wgt     (v_rec_ydm_d.getFactweight());// --原料卷理重	
+			  }																																						
+			  v_rec_Roll_m.setMtr_act_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷实重																																							
+			  v_rec_Roll_m.setSteel_code      ( v_rec_ydm_d.getSteelcode());// --原料卷牌号
+			  
+			  if(!flag){//如果 v_rec_Roll_m 对象为空(即之前无生产实绩),则覆盖 作业日期、班次、班组(与生产开始不同,请注意)
+				  v_rec_Roll_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)																																							
+				  v_rec_Roll_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)																																							
+				  v_rec_Roll_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)																																							
+				  v_rec_Roll_m.setFeeding_time ( v_time); //--上料时间		
+			  }
+			  //    --半卷回退(即:部分卷吊销)信息设置
+			  v_rec_Roll_m.setPartial_rejected("1");//--部分原料卷吊销(1是、0否)
+			  v_rec_Roll_m.setRejected_coil_no(v_reject_coil_no);// --吊销卷号																																							
+			  v_rec_Roll_m.setRejected_coil_thr_wgt ( v_rec_l2_reject.getReject_coil_weight()==null?null:strToLong(v_rec_l2_reject.getReject_coil_weight()).doubleValue()); //--吊销卷理重																																							
+			  v_rec_Roll_m.setRejected_coil_act_wgt ( v_rec_l2_reject.getReject_coil_weight()==null?null:strToLong(v_rec_l2_reject.getReject_coil_weight()).doubleValue()); //--吊销卷实重																																							
+			  v_rec_Roll_m.setRejected_coil_len     ( v_rec_l2_reject.getReject_coil_length()==null?null:strToLong(v_rec_l2_reject.getReject_coil_length()).doubleValue());// --吊销卷长度(m)																																							
+			  v_rec_Roll_m.setRejected_coil_out_dia ( v_rec_l2_reject.getReject_outer_diameter()==null?null:strToLong(v_rec_l2_reject.getReject_outer_diameter()).doubleValue());// --吊销卷外径																																							
+			  v_rec_Roll_m.setMemo             ( null);// --备注																																							
+			  v_rec_Roll_m.setHand_over_status ( "0");// --交工状态																																							
+			  v_rec_Roll_m.setHand_over_time   ( null);// --交工时间																																							
+			  v_rec_Roll_m.setHand_over_opr    ( null);// --交工人																																							
+
+			  if(!flag){
+				  //  --如果 v_rec_Roll_m 对象为空(即之前无生产实绩),则:
+				  v_rec_Roll_m.setCreate_opr( "L2_DR3E07");// --操作人																																							
+				  v_rec_Roll_m.setCreate_time( new Date());// --操作时间																																							
+			  }else{
+				  //  --如果 v_rec_Roll_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				  v_rec_Roll_m.setUpdate_opr("L2_DR3E07");// --修改人																																							
+				  v_rec_Roll_m.setUpdate_time(new Date()) ;//--修改时间																																							
+			  }
+			  //    --(2.12)、开始事物																																						
+			  //    --(2.12.0)、删除可能存在的平整作业实绩记录
+			  this.getMapper(MesRcmMMapper.class).doDelete1(v_rec_pln_d.getRl_plan_no(),v_rec_l2_reject.getEntry_coil_no());
+			  //    --(2.12.1)、插入平整作业实绩记录
+			  this.getMapper(MesRcmMMapper.class).insert(v_rec_Roll_m);
+			  
+			  //  --(2.12.2)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			  //  --(2.12.2.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+			  																																							
+			  //  --(2.12.3)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			  //  --(2.12.3.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+																																					
+				MesRcmM  mcsm=new MesRcmM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.getRl_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_l2_reject.getEntry_coil_no());//投料卷号
+				mcsm.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟卷号 
+				List<MesRcmM> lmcsm=new ArrayList<MesRcmM>();
+				//时间
+				SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+			    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+			    mcsm.setMemo(date);
+			    lmcsm.add(mcsm);
+			   //调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag2=true;
+				try{
+					this.getBean(MesApiRollingPlanImpl.class).MesRcmMAddValid(lmcsm);
+				}catch(Exception e){
+					flag2=false;
+					e.printStackTrace();
+				}
+				if(flag2){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiRollingPlanImpl.class).MesRcmMAdd(lmcsm);
+				}
+				
+				//调用物流模块(仓库管理)接口,对原料卷进行生产投料出库操作(接口由物流模块提供);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_l2_reject.getEntry_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_l2_reject.getEntry_coil_no());//注意
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(date);
+					cp2.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+				}
+		    v_success=1;//--唯一置为成功的地方
+			v_message = "Roll01L2Reject L2钢卷回退实绩电文处理成功!";  
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2Reject L2钢卷回退实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2Reject L2钢卷回退实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+		
+	}
+
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Reject_d 方法调用;																																							
+		2)、	接口参数 IN:V_REC_L3_ASW_REJECT(L3应答L2钢卷回退实绩对象)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_l3_asw_reject
+	 * @param v_message2
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L3AswReject(IfRoll01L3AnswerReject v_rec_l3_asw_reject,
+			String v_message) throws Exception{
+		Integer v_flag=null;// --电文发送成功标志
+		try{
+			//  --(1)、无接口调试时,设置1,直接跳过,否则设置为0
+			v_flag=0;// --1:成功、0:失败
+			//  --(1)、调用公司接口,将“L3应答L2钢卷回退实绩电文” v_rec_l3_asw_reject 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_l3_asw_reject,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_HUITUI);
+				String url = ROLLPDI_HUITUI;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3应答L2钢卷回退实绩电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发L3应答L2钢卷回退实绩电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发L3应答L2钢卷回退实绩电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发L3应答L2钢卷回退实绩电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			// --(1.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Roll01L3AswReject L3应答L2钢卷回退实绩电文发送失败!"+v_message;
+				return v_message;
+			}
+			//  --(1.2)、电文发送成功(成功状态,根据接口提供定义确定),插入 L3应答L2钢卷回退实绩 记录																																		
+			this.getMapper(IfRoll01L3AnswerRejectMapper.class).insert(v_rec_l3_asw_reject);
+			// --(1.2.1)、提交事务
+			v_message="Roll01L3AswReject L3应答L2钢卷回退实绩电文发送成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(1.2.2)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(1.2.2.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3AswReject L3应答L2钢卷回退实绩电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3AswReject L3应答L2钢卷回退实绩电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3AswReject L3应答L2钢卷回退实绩电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3AswReject L3应答L2钢卷回退实绩电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2钢卷生产实绩电文时调用;																																							
+		2)、	此接口参数为“L2钢卷生产实绩电文JSON对象”(电文编号:DR3E08);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2Pdo(IfRoll01L2Pdo json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//  --(1)、先将参数转换为Java实体类,此处以 v_rec_l2_pdo 代替描述
+		IfRoll01L2Pdo v_rec_l2_pdo=json;
+		if(json==null){
+			v_message="二级接口-轧机_L2_PDO为空";
+			return v_message;
+		}
+//		if(v_rec_l2_pdo.getSpm_mode()==null || v_rec_l2_pdo.getSpm_mode().longValue()==0){//平整  延伸率
+//			v_rec_l2_pdo.setElongation(v_rec_l2_pdo.getElongation_reduction());
+//		}else if(v_rec_l2_pdo.getSpm_mode().longValue()==1){//轧制 压下率
+//			v_rec_l2_pdo.setReduction(v_rec_l2_pdo.getElongation_reduction());
+//		}
+		
+		//  --(1.0)、创建L2钢卷生产实绩表记录号
+		Long max_serial_no=this.getMapper(IfRoll01L2PdoMapper.class).doCount();
+		v_rec_l2_pdo.setSerial_no(max_serial_no);
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_pdo.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_pdo.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入 L2钢卷生产实绩表 以及 L2_PDO_缺陷信息表(单独的事务)																																							
+		//  --(1.2.1)、此电文需要拆分为 主从表(1:N),其中缺陷信息为字表(编码时注意处理)																																							
+		try{
+			this.getMapper(IfRoll01L2PdoMapper.class).insert(v_rec_l2_pdo);
+		}catch(Exception ex){
+			ex.printStackTrace();
+		}
+			//--(1.2.2)、缺陷子记录数,根据电文实际情况确认(电文ID:DR3E08) ??
+//			for(int i=1;i<=20;i++){
+//				IfRoll01L2PdoDfc itpd=new IfRoll01L2PdoDfc();
+//				//itpd.setSerial_no(serial_no);//记录号(由业务接口创建,唯一标识消息)  ??
+//				itpd.setStart_pos(null);//起始位置(m,Calculate from tail, like weldseam position)
+//				itpd.setEnd_pos(null);//终止位置(m)
+//				Long defect_no=(long)i;
+//				itpd.setDefect_no(defect_no);//序号(由业务创建,1 - 99)
+//				itpd.setDefect_type("");//缺陷类型代码
+//				itpd.setDefect_intensity("1");//缺陷级别(1:slight,、2:medium、3:heavy)
+//				//this.getMapper(IfRoll01L2PdoDfcMapper.class).insert(itpd);
+//			}
+		try{
+			if(v_rec_l2_pdo!=null && v_rec_l2_pdo.getDefects().size()>0){
+				int i=1;
+				for(IfRoll01L2PdoDfc defe:v_rec_l2_pdo.getDefects()){
+					IfRoll01L2PdoDfc itpd=new IfRoll01L2PdoDfc();
+					//itpd.setSerial_no(serial_no);//记录号(由业务接口创建,唯一标识消息)  ??
+					itpd.setStart_pos(defe.getStart_pos());//起始位置(m,Calculate from tail, like weldseam position)
+					itpd.setEnd_pos(defe.getEnd_pos());//终止位置(m)
+					Long defect_no=(long)i;
+					itpd.setDefect_no(defect_no);//序号(由业务创建,1 - 99)
+					itpd.setDefect_type(defe.getDefect_type());//缺陷类型代码
+					itpd.setDefect_intensity(defe.getDefect_intensity());//缺陷级别(1:slight,、2:medium、3:heavy)
+					this.getMapper(IfRoll01L2PdoDfcMapper.class).insert(itpd);
+					i++;
+				}
+			}
+		}catch(Exception ex){
+			ex.printStackTrace();
+		}
+			
+		//道次信息处理
+		//道次信息处理
+	  try{
+		  List<IfRoll01L2PdoPass> rcm_data = v_rec_l2_pdo.getRcm_data();
+		  for(IfRoll01L2PdoPass pdo_pass:rcm_data){
+			  if(pdo_pass.getCurr_pass_no()==null || "".equals(pdo_pass.getCurr_pass_no().trim())){
+				  continue;
+			  }
+			  pdo_pass.setSerial_no(max_serial_no);
+			  pdo_pass.setExit_coil_no(v_rec_l2_pdo.getExit_coil_no());
+			  this.getMapper(IfRoll01L2PdoPassMapper.class).insert(pdo_pass);
+		  }
+	  }catch(Exception e){
+		  
+	  }
+			
+		//  --(2)、调用L2钢卷生产实绩处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Pdo_d(v_mch_code,v_rec_l2_pdo,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_pdo.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param="消息时间 MSG_TIME {"+mes_time+"} 记录号 SERIAL_NO {"+v_rec_l2_pdo.getSerial_no()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2Pdo",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Pdo 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_PDO(L2钢卷生产实绩电文对象)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_pdo
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Pdo_d(String v_mch_code, IfRoll01L2Pdo v_rec_l2_pdo,
+			String v_message) throws Exception{
+		IfRoll01L3AnswerPdo v_rec_l3_asw_pdo=new IfRoll01L3AnswerPdo();
+		Integer v_success=null;
+		try{
+			//  --(1)、调用 L2钢卷生产实绩 处理函数
+			try{
+				v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Pdo_d_d(v_mch_code,v_rec_l2_pdo,
+						v_success,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message=e.getMessage();
+			}
+			//  --(1.1)、构造 L3应答L2钢卷生产实绩 电文																																							
+			//  --(1.1.1)、L3处理L2钢卷生产实绩电文成功(1:成功)																																							
+			if(v_message==null){
+				v_message="";
+			}
+			String v_success_str="";
+			if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			}
+			if("1".equals(v_success_str)){
+				v_rec_l3_asw_pdo.setResult("0");// --处理结果(0:成功、1:错误)
+			}else{
+				v_rec_l3_asw_pdo.setResult("1");//--处理标志(0:成功、1:不成功)
+			}
+			v_rec_l3_asw_pdo.setExit_coil_no(v_rec_l2_pdo.getExit_coil_no());//--入口钢卷号
+			v_rec_l3_asw_pdo.setSend_time(new Date());
+			v_rec_l3_asw_pdo.setSend_opr("L3");//--下发人
+			//  --(2)、调用 L3应答L2钢卷生产实绩 处理函数
+			String v_message2="";
+			try{
+				v_message2=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3AswPdo(v_rec_l3_asw_pdo,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message2=e.getMessage();
+			}
+			//  --(4)、拼接返回字符串
+			String v_param = "下发时间 SEND_TIME {"+v_rec_l3_asw_pdo.getSend_time()+"} 下发人 SEND_OPR {"+ v_rec_l3_asw_pdo.getSend_opr()	+																																						
+			             "} 出口卷号 EXIT_COIL_NO {"+v_rec_l3_asw_pdo.getExit_coil_no()+"} 处理结果(0:成功、1:错误) RESULT {"+
+					v_rec_l3_asw_pdo.getResult()+"} 预留 RESERVE {"+v_rec_l3_asw_pdo.getReserve()+"}";																																							
+			//  --(5)、写接口日志:与业务处理分开,单独的事务
+			try{
+				this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L3AswPdo",v_param,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2Pdo_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2Pdo_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+		
+	}
+	
+
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Pdo_d 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_PDO(L2钢卷生产实绩电文对象)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_pdo
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Pdo_d_d(String v_mch_code, IfRoll01L2Pdo v_rec_l2_pdo,
+			Integer v_success, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		//--(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.2.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_mch_code);
+			if(cbm.getMachine_mark()==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+				return v_message;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_rec_l2_pdo.getEntry_coil_no()==null || "".equals(v_rec_l2_pdo.getEntry_coil_no())){
+				v_message="入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} 未指定入口卷号!";
+				return v_message;
+			}
+			if(v_rec_l2_pdo.getEntry_coil_no().substring(0, 1).equals("L")){
+				List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "materailcoilno='"+v_rec_l2_pdo.getEntry_coil_no()+"'", "", 0, 0);
+				if(listypd!=null && listypd.size()==1){
+					v_rec_l2_pdo.setEntry_coil_no(listypd.get(0).getCoilno());
+					if(v_rec_l2_pdo.getExit_coil_no()!=null){
+						int ia=v_rec_l2_pdo.getExit_coil_no().length()-v_rec_l2_pdo.getEntry_coil_no().length();
+						if(ia==1){
+							String weihao = v_rec_l2_pdo.getExit_coil_no().substring(v_rec_l2_pdo.getExit_coil_no().length()-1, v_rec_l2_pdo.getExit_coil_no().length());
+							v_rec_l2_pdo.setExit_coil_no(v_rec_l2_pdo.getEntry_coil_no()+weihao);
+						}
+					}
+				}
+			}
+			
+			
+			
+			//  --(2)、业务处理:																																							
+			//  --(2.1)、验证电文中“开始生产时刻(YYYYMMDDHHMMSS)”																																							
+			Date v_str_time=null;
+			if(v_rec_l2_pdo.getStart_time()==null || "".equals(v_rec_l2_pdo.getStart_time())){
+				v_str_time=new Date();//--如果开始生产时间为空,则赋值为当前时刻
+			}else{
+				//    --(2.1.1)、将开始生产时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+				try {
+					List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_pdo.getStart_time());
+					v_str_time=li.get(0).getCreate_time();
+				} catch (Exception e) {
+					e.printStackTrace();
+					v_message="电文中“开始生产时间”{"+v_rec_l2_pdo.getStart_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+					return v_message;
+				}
+			}
+			// --(2.1')、验证电文中“结束生产时刻(YYYYMMDDHHMMSS)”
+			Date v_end_time=null;
+			if(v_rec_l2_pdo.getEnd_time()==null || "".equals(v_rec_l2_pdo.getEnd_time())){
+				v_end_time=new Date();//--如果开始结束时间为空,则赋值为当前时刻
+			}else{
+				//  --(2.1.1)、将结束生产时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+				try {
+					List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_pdo.getEnd_time());
+					v_end_time=li.get(0).getCreate_time();
+				} catch (Exception e) {
+					e.printStackTrace();
+					//v_message="电文中“开始生产时间”{"+v_rec_l2_pdo.getEnd_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+					//return v_message;
+					//--(2.1.2')、转化失败(非约定的标准格式:YYYYMMDDHHmmss):则赋值为当前时刻
+					v_end_time=new Date();
+				}
+			}
+			String rmDb=DateUtil.formatDate(v_str_time, "yyyy-MM-dd HH:mm:ss");
+			String v_date=null,v_ord=null;
+			String dbTime=rmDb.substring(11);
+			v_date=rmDb.substring(0,10);
+			// --(1.1.1)、如果 v_charge_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_charge_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				v_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				v_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				v_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(v_date);
+				} catch (Exception e) {
+					return "获取数据库时间失败,请稍后重试";
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+		        v_date=formatYmd.format(c.getTime());
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.3)、根据计算的日期班次,获取交接班记录的班组																																				
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(v_date);
+			msm.setWrk_ord(v_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_grp=null;
+			if(v_cnt<=0){
+				v_grp="";// --无交接班记录,则赋空值(交工时,会提示用户完善信息)
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_grp=lmsm.get(0).getWrk_grp();
+			}
+			//  --(2.4)、验证入口卷对应的作业计划信息存在  
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount1(v_mch_code,v_rec_l2_pdo.getEntry_coil_no());
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} 找不到作业计划信息!";
+				return v_message;  
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"}存在2条或以上的作业计划信息!";
+				return v_message; 
+			}else{
+				List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_rec_l2_pdo.getEntry_coil_no());
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.5)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此电文事件)
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_rec_pln_d.getRl_plan_no());
+			mCross.setMaterial_no(v_rec_l2_pdo.getEntry_coil_no());
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			MesRcmM v_rec_Roll_m=new MesRcmM();
+			boolean flag=false;//
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+			    v_rec_Roll_m =lmcam.get(0);
+			    flag=true;
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_message = "机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} "
+			    			+ "入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} 已生产交工,忽略此电文事件!'";
+					return v_message;
+			    }
+			}
+			//  --(2.6)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";																																							
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			//  --(2.7)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_l2_pdo.getEntry_coil_no()+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} 原料卷库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=  v_rec_ydm_d_list.get(0);
+			//  --(2.8)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BRL02".equals(v_rec_pln_d.getStatus()) || "5BRL03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			/*
+			 * 2019-03-08断带情况、正常分卷的处理
+			 * */
+			if(v_rec_l2_pdo.getExit_coil_no()!=null && v_rec_l2_pdo.getExit_coil_no().length()>3 &&
+					!"1".equals(v_rec_l2_pdo.getExit_coil_no().substring(v_rec_l2_pdo.getExit_coil_no().length()-1, 
+							v_rec_l2_pdo.getExit_coil_no().length()))){
+				int i=v_rec_l2_pdo.getExit_coil_no().length()-v_rec_l2_pdo.getEntry_coil_no().length();
+				String subtri = v_rec_l2_pdo.getExit_coil_no().substring(v_rec_l2_pdo.getExit_coil_no().length()-1, 
+						v_rec_l2_pdo.getExit_coil_no().length());
+				long abc2=0;
+				try{
+					abc2 = Long.valueOf(subtri);
+				}catch(Exception e){
+					
+				}
+				if(i==1 && abc2>1){
+				//  --(1)、出现断带情况,调用 L2钢卷出口卷2,3,4,xx
+					try{
+						v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Pdo_d_d_234(v_mch_code,v_rec_l2_pdo,v_rec_Roll_m,
+								v_success,v_message);
+					}catch(Exception e){
+						e.printStackTrace();
+						v_message=e.getMessage();
+					}
+					return v_message;
+				}
+			    
+			}
+			
+			
+			//  --(2.9.2)、出口卷编码规则:出口卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)																																					
+			//v_coil_no=v_coil_no+lpad(v_cnt+"",2,"0");
+			//  --(2.11)、在 v_rec_Roll_m 对象基础上,构建平整主实绩,并插入记录																																							
+			//  --(2.11.1):v_rec_Roll_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+			//  --(2.11.2):v_rec_Roll_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)				
+			ComBaseMachine machine2 = new ComBaseMachine();
+			machine2.setMachine_code(v_mch_code);
+			List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class)
+					.find(machine2, 0, 0);
+			String v_mch_mark=lcbm.get(0).getMachine_mark();
+			if (v_mch_mark == null) {
+				return "机台代码:" +v_mch_code+ "\n设备编号未配置,无法处理!";
+			}
+			String v_process_no="";
+			if(!flag){//如果 v_rec_plm_m 对象为空(即之前无生产实绩)
+				SimpleDateFormat formatY3 = new SimpleDateFormat("yyMMdd");
+				v_process_no = "Z" + formatY3.format(new Date())+lpad(v_mch_mark, 2, "0");
+				v_cnt = this.getMapper(MesRcmMMapper.class).doquery(v_process_no);
+				if (v_cnt == null) {
+					v_cnt = 1;
+				}
+				v_process_no = v_process_no + lpad(v_cnt.toString(), 3, "0");
+				v_rec_Roll_m.setProcess_no(v_process_no);
+			}
+			
+			
+			
+			  v_rec_Roll_m.setMachine_code    ( v_mch_code);// --机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			  v_rec_Roll_m.setSchedule_no     ( v_rec_pln_d.getRl_plan_no());// --作业计划号																																							
+			  v_rec_Roll_m.setInner_seq       ( v_rec_pln_d.getRl_seq());// --计划内序号																																							
+			  v_rec_Roll_m.setMaterial_no_vt  ( v_rec_pln_d.getObject_no_vt());// --虚拟原料卷号																																							
+			  v_rec_Roll_m.setPln_steel_code  ( v_rec_mtr_in.getSteel_code());// --计划原料卷牌号																																							
+			  v_rec_Roll_m.setPln_mtr_thk     ( v_rec_mtr_in.getThick());// --计划原料卷厚度																																							
+			  v_rec_Roll_m.setPln_mtr_wdt     ( v_rec_mtr_in.getWidth());// --计划原料卷宽度																																							
+			  v_rec_Roll_m.setPln_mtr_len     ( v_rec_mtr_in.getLength());// --计划原料卷长度																																							
+			  v_rec_Roll_m.setPln_mtr_inn_dia ( v_rec_mtr_in.getDiameter_inn());// --计划原料卷内径																																							
+			  v_rec_Roll_m.setPln_mtr_out_dia ( v_rec_mtr_in.getDiameter_out());// --计划原料卷外径																																							
+			  v_rec_Roll_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.getSingle_weight());// --计划原料卷理重																																							
+			  v_rec_Roll_m.setMaterial_no     ( v_rec_l2_pdo.getEntry_coil_no());// --原料卷号																																							
+			  v_rec_Roll_m.setMaterial_no_src ( v_rec_ydm_d.getMaterailcoilno());// --原始卷号																																							
+			  v_rec_Roll_m.setMtr_thk         ( v_rec_ydm_d.getThick());// --原料卷厚度																																							
+			  v_rec_Roll_m.setMtr_wdt         ( v_rec_ydm_d.getWidth());// --原料卷宽度																																							
+			  v_rec_Roll_m.setMtr_len         ( v_rec_ydm_d.getLength());// --原料卷长度																																							
+			  v_rec_Roll_m.setMtr_inn_dia     ( v_rec_ydm_d.getDiameter_inn());// --原料卷内径																																							
+			  v_rec_Roll_m.setMtr_out_dia     ( v_rec_ydm_d.getDiameter_out());// --原料卷外径																																							
+			  if(v_rec_ydm_d.getTheoryweight()!=null){
+				  v_rec_Roll_m.setMtr_thr_wgt     ( v_rec_ydm_d.getTheoryweight());// --原料卷理重	
+			  }else{
+				  v_rec_Roll_m.setMtr_thr_wgt     (v_rec_ydm_d.getFactweight());// --原料卷理重	
+			  }																																					
+			  v_rec_Roll_m.setMtr_act_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷实重																																							
+			  v_rec_Roll_m.setSteel_code      ( v_rec_ydm_d.getSteelcode());// --原料卷牌号
+			  
+			  if(!flag){//如果 v_rec_Roll_m 对象为空(即之前无生产实绩),则覆盖 作业日期、班次、班组(与生产开始不同,请注意)
+				  v_rec_Roll_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)																																							
+				  v_rec_Roll_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)																																							
+				  v_rec_Roll_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)																																							
+				  v_rec_Roll_m.setFeeding_time ( v_str_time); //--上料时间		
+			  }
+			  if(v_rec_l2_pdo.getStrip_break()!=null){
+				  v_rec_Roll_m.setStrip_break(v_rec_l2_pdo.getStrip_break()+""); //--是否断带(1:断带、0:正常)
+			  }
+			  
+			  v_rec_Roll_m.setTp_str_time(v_str_time); //--生产开始时间
+			  v_rec_Roll_m.setTp_end_time(v_end_time); 
+			  //--生产时间(min)
+			  if(v_rec_l2_pdo.getDuration()==null || "".equals(v_rec_l2_pdo.getDuration())){
+				  v_rec_Roll_m.setTp_duration(null);
+			  }else{
+				  try{
+					  v_rec_Roll_m.setTp_duration(Long.parseLong(v_rec_l2_pdo.getDuration()));
+				  }catch(Exception e){
+					  //v_rec_Roll_m.setTp_duration(null);
+				  }
+			  }
+			  try{
+				  v_rec_Roll_m.setExit_thickness_set  ( strToLong(v_rec_l2_pdo.getExit_thickness_setp()));// --1#机架出口卷厚度设定值(um)																																							
+				  v_rec_Roll_m.setExit_thickness_avg  ( strToLong(v_rec_l2_pdo.getExit_thickness_avg()));// --1#机架出口卷厚度平均值(um)																																							
+				  v_rec_Roll_m.setExit_thickness_max  ( strToLong(v_rec_l2_pdo.getExit_thickness_max()));// --1#机架出口卷厚度最大值(um)																																							
+				  v_rec_Roll_m.setExit_thickness_min  ( strToLong(v_rec_l2_pdo.getExit_thickness_min()));// --1#机架出口卷厚度最小值(um)																																							
+				  v_rec_Roll_m.setExit_thickness_deta ( strToLong(v_rec_l2_pdo.getExit_thickness_delta()));// --1#机架出口卷厚度方差(um)																																							
+				  v_rec_Roll_m.setThickness_class_1   ( strToLong(v_rec_l2_pdo.getThickness_class_1()));// --<±1%公差(10^-2%)																																							
+				  v_rec_Roll_m.setThickness_class_2   ( strToLong(v_rec_l2_pdo.getThickness_class_2()));// --<±2%公差(10^-2%)																																							
+				  v_rec_Roll_m.setThickness_class_3   ( strToLong(v_rec_l2_pdo.getThickness_class_3()));// --<±4%公差(10^-2%)																																							
+				  v_rec_Roll_m.setThickness_class_4   ( strToLong(v_rec_l2_pdo.getThickness_class_4()));// --<±6%公差(10^-2%)																																							
+				  v_rec_Roll_m.setThickness_class_5   ( strToLong(v_rec_l2_pdo.getThickness_class_5()));// --<±10%公差(10^-2%)																																							
+				  v_rec_Roll_m.setThickness_class_6   ( strToLong(v_rec_l2_pdo.getThickness_class_6()));// -->±10%公差(10^-2%)
+				  
+				  v_rec_Roll_m.setNum_defects         ( strToLong(v_rec_l2_pdo.getNum_defects()));// --缺陷个数
+			  }catch(Exception e){
+				  e.printStackTrace();
+			  }
+			  			
+			  
+			  //v_rec_Roll_m.setFeeding_wgt         ( v_rec_l2_pdo.getEntry_weight()==null?null:v_rec_l2_pdo.getEntry_weight().doubleValue());// --入口重量(kg)
+			  v_rec_Roll_m.setFeeding_wgt         ( v_rec_ydm_d.getFactweight());// --入口重量(kg)
+//			  if(v_rec_l2_pdo.getSpm_mode()!=null){
+//				  v_rec_Roll_m.setSpm_mode            ( v_rec_l2_pdo.getSpm_mode()+"");// --平整模式	
+//			  }
+			  //v_rec_Roll_m.setMemo             ( null);// --备注																																							
+			  v_rec_Roll_m.setHand_over_status ( "0");// --交工状态																																							
+			  v_rec_Roll_m.setHand_over_time   ( null);// --交工时间																																							
+			  v_rec_Roll_m.setHand_over_opr    ( null);// --交工人																																							
+
+			  if(!flag){
+				  //  --如果 v_rec_Roll_m 对象为空(即之前无生产实绩),则:
+				  v_rec_Roll_m.setCreate_opr( "L2_DR3E08");// --操作人																																							
+				  v_rec_Roll_m.setCreate_time( new Date());// --操作时间																																							
+			  }else{
+				  //  --如果 v_rec_Roll_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				  v_rec_Roll_m.setUpdate_opr("L2_DR3E08");// --修改人																																							
+				  v_rec_Roll_m.setUpdate_time(new Date()) ;//--修改时间																																							
+			  }
+			  
+			  //--(2.12)、开始事物																																					
+			  //--(2.12.0)、删除可能存在的平整作业实绩记录
+			  this.getMapper(MesRcmMMapper.class).doDelete1(v_rec_pln_d.getRl_plan_no(),v_rec_l2_pdo.getEntry_coil_no());
+			  //  --(3.2)、插入平整作业实绩记录
+			  this.getMapper(MesRcmMMapper.class).insert(v_rec_Roll_m);
+			  
+			  
+			  MesRcmD mtd=new MesRcmD();
+			  mtd.setProcess_no(v_rec_Roll_m.getProcess_no());
+		      List<MesRcmD> list = this.getMapper(MesRcmDMapper.class).find(mtd, 0, 0);
+			  if(list==null || list.size()<=0){
+				  ResultModel doAddsWebRm=new ResultModel();
+				  try{
+					  doAddsWebRm = this.getBean(MesRcmDServiceImpl.class).doAddsWeb_PDO(v_rec_pln_d.getRl_plan_no(), v_rec_pln_d.getObject_no_vt(),v_rec_pln_d.getObject_no(),"M0008","Roll01L2Pdo_d");
+					  if("200".equals(doAddsWebRm.getState())){//子卷新增成功
+						  List<MesRcmD> list_mtd = this.getMapper(MesRcmDMapper.class).findWithCondition(mtd, "", "coil_no", 0, 0);
+						  if(list_mtd!=null && list_mtd.size()>0){
+							  MesRcmD mtd0=list_mtd.get(0);
+							  MesRcmD mtd0_new=new MesRcmD();
+							  mtd0_new.setCoil_no(mtd0.getCoil_no());
+							  mtd0_new.setAct_thk      ( v_rec_l2_pdo.getExit_thick()==null?null:strToLong(v_rec_l2_pdo.getExit_thick()).doubleValue()/1000);// --产出卷厚度um	
+							  mtd0_new.setAct_len      ( v_rec_l2_pdo.getExit_length()==null?null:strToLong(v_rec_l2_pdo.getExit_length()).doubleValue()*1000);// --产出卷长度(m)																																							
+							  mtd0_new.setAct_inn_dia  ( v_rec_l2_pdo.getInner_diameter()==null?null:strToLong(v_rec_l2_pdo.getInner_diameter()).doubleValue());// --产出卷内径																																							
+							  mtd0_new.setAct_out_dia  ( v_rec_l2_pdo.getOuter_diameter()==null?null:strToLong(v_rec_l2_pdo.getOuter_diameter()).doubleValue());// --产出卷外径																																							
+							  //mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_calc_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_calc_weight()).doubleValue());// --产出卷理重	
+							  mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_weight()).doubleValue());// --产出卷理重	
+							  mtd0_new.setCoil_act_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_weight()).doubleValue());// --产出卷实量	
+							  mtd0_new.setCoil_wgt_time(new Date());//出口卷称重时间
+							  if(v_rec_l2_pdo.getExit_width()!=null){
+								  mtd0_new.setAct_wdt(
+										  v_rec_l2_pdo.getExit_width()==null?null:strToDouble(v_rec_l2_pdo.getExit_width()).doubleValue());
+							  }
+							  this.getMapper(MesRcmDMapper.class).update(mtd0_new);
+							  
+							//道次信息处理
+							  try{
+								  List<IfRoll01L2PdoPass> rcm_data = v_rec_l2_pdo.getRcm_data();
+								  this.getMapper(MesRcmDPassMapper.class).doDelete(v_rec_Roll_m.getProcess_no(),mtd0.getCoil_no());
+								  for(IfRoll01L2PdoPass pdo_pass:rcm_data){
+									  if(pdo_pass.getCurr_pass_no()==null || "".equals(pdo_pass.getCurr_pass_no().trim())){
+										  continue;
+									  }
+									  MesRcmDPass mrdp=new MesRcmDPass();
+									  Date v_time=null;
+									  try {
+											List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(pdo_pass.getPass_start_time());
+											v_time=li.get(0).getCreate_time();
+											mrdp.setPass_start_time(v_time);
+											List<MesCrAnnealM> li2 =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(pdo_pass.getPass_end_time());
+											v_time=li2.get(0).getCreate_time();
+											mrdp.setPass_end_time(v_time);
+											mrdp.setCoil_no(mtd0.getCoil_no());
+											mrdp.setCurr_pass_no(pdo_pass.getCurr_pass_no());
+											mrdp.setEntry_tension_avg(strToDouble(pdo_pass.getEntry_tension_avg())==null?"":(strToDouble(pdo_pass.getEntry_tension_avg())+""));
+											mrdp.setEntry_tension_max(strToDouble(pdo_pass.getEntry_tension_max())==null?"":(strToDouble(pdo_pass.getEntry_tension_max())+""));
+											mrdp.setEntry_tension_min(strToDouble(pdo_pass.getEntry_tension_min())==null?"":(strToDouble(pdo_pass.getEntry_tension_min())+""));
+											mrdp.setExit_tension_avg(strToDouble(pdo_pass.getExit_tension_avg())==null?"":(strToDouble(pdo_pass.getExit_tension_avg())+""));
+											mrdp.setExit_tension_max(strToDouble(pdo_pass.getExit_tension_max())==null?"":(strToDouble(pdo_pass.getExit_tension_max())+""));
+											mrdp.setExit_tension_min(strToDouble(pdo_pass.getExit_tension_min())==null?"":(strToDouble(pdo_pass.getExit_tension_min())+""));
+											mrdp.setImr_bending_force(strToDouble(pdo_pass.getImr_bending_force())==null?"":(strToDouble(pdo_pass.getImr_bending_force())+""));
+											mrdp.setMill_force(strToDouble(pdo_pass.getMill_force())==null?"":(strToDouble(pdo_pass.getMill_force())+""));
+											mrdp.setMill_force_deta(strToDouble(pdo_pass.getMill_force_deta())==null?"":(strToDouble(pdo_pass.getMill_force_deta())+""));
+											mrdp.setMill_speed(strToDouble(pdo_pass.getMill_speed())==null?"":(strToDouble(pdo_pass.getMill_speed())+""));
+											mrdp.setMsg_time(new Date());
+											mrdp.setPass_duration(strToDouble(pdo_pass.getPass_duration())==null?"":(strToDouble(pdo_pass.getPass_duration())+""));
+											mrdp.setPass_entry_thick(strToDouble(pdo_pass.getPass_entry_thick())==null?"":(strToDouble(pdo_pass.getPass_entry_thick())+""));
+											mrdp.setPass_exit_thick(strToDouble(pdo_pass.getPass_exit_thick())==null?"":(strToDouble(pdo_pass.getPass_exit_thick())+""));
+											mrdp.setProcess_no(v_rec_Roll_m.getProcess_no());
+											mrdp.setReduction(strToDouble(pdo_pass.getReduction())==null?"":(strToDouble(pdo_pass.getReduction())+""));
+											mrdp.setShift_pos(strToDouble(pdo_pass.getShift_pos())==null?"":(strToDouble(pdo_pass.getShift_pos())+""));
+											mrdp.setSpindle_torque(strToDouble(pdo_pass.getSpindle_torque())==null?"":(strToDouble(pdo_pass.getSpindle_torque())+""));
+											mrdp.setWkr_bending_force(strToDouble(pdo_pass.getWkr_bending_force())==null?"":(strToDouble(pdo_pass.getWkr_bending_force())+""));
+											this.getMapper(MesRcmDPassMapper.class).insert(mrdp);
+										} catch (Exception e) {
+											e.printStackTrace();
+										}
+								  }
+							  }catch(Exception e){
+								  e.printStackTrace();
+							  }
+							  
+						  }
+					  }else{
+						  throw new Exception("生产实绩调用批量新增子卷接口报错");
+					  }
+				  }catch(Exception e){
+					  e.printStackTrace();
+					  v_message=e.getMessage();
+					  throw new Exception("生产实绩调用批量新增子卷接口报错"+v_message);
+				  }
+					  
+			  }else{//之前就存在子卷实绩
+				  List<MesRcmD> list_mtd = this.getMapper(MesRcmDMapper.class).findWithCondition(mtd, "substr(coil_no, -1) <> 'B'", "coil_no", 0, 0);
+				  if(list_mtd!=null && list_mtd.size()>0){
+					  MesRcmD mtd0=list_mtd.get(0);
+					  MesRcmD mtd0_new=new MesRcmD();
+					  mtd0_new.setCoil_no(mtd0.getCoil_no());
+					  mtd0_new.setAct_thk      ( v_rec_l2_pdo.getExit_thick()==null?null:strToLong(v_rec_l2_pdo.getExit_thick()).doubleValue()/1000);// --产出卷厚度um	
+					  mtd0_new.setAct_len      ( v_rec_l2_pdo.getExit_length()==null?null:strToLong(v_rec_l2_pdo.getExit_length()).doubleValue()*1000);// --产出卷长度(m)																																							
+					  mtd0_new.setAct_inn_dia  ( v_rec_l2_pdo.getInner_diameter()==null?null:strToLong(v_rec_l2_pdo.getInner_diameter()).doubleValue());// --产出卷内径																																							
+					  mtd0_new.setAct_out_dia  ( v_rec_l2_pdo.getOuter_diameter()==null?null:strToLong(v_rec_l2_pdo.getOuter_diameter()).doubleValue());// --产出卷外径																																							
+					  //mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_calc_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_calc_weight()).doubleValue());// --产出卷理重
+					  mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_weight()).doubleValue());// --产出卷理重
+					  mtd0_new.setCoil_act_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_weight()).doubleValue());// --产出卷实量	
+					  mtd0_new.setCoil_wgt_time(new Date());//出口卷称重时间
+					  if(v_rec_l2_pdo.getExit_width()!=null){
+						  mtd0_new.setAct_wdt(
+								  v_rec_l2_pdo.getExit_width()==null?null:strToDouble(v_rec_l2_pdo.getExit_width()).doubleValue());
+					  }
+					  this.getMapper(MesRcmDMapper.class).update(mtd0_new);
+					  
+					//道次信息处理
+					  try{
+						  List<IfRoll01L2PdoPass> rcm_data = v_rec_l2_pdo.getRcm_data();
+						  this.getMapper(MesRcmDPassMapper.class).doDelete(v_rec_Roll_m.getProcess_no(),mtd0.getCoil_no());
+						  for(IfRoll01L2PdoPass pdo_pass:rcm_data){
+							  if(pdo_pass.getCurr_pass_no()==null || "".equals(pdo_pass.getCurr_pass_no().trim())){
+								  continue;
+							  }
+							  MesRcmDPass mrdp=new MesRcmDPass();
+							  Date v_time=null;
+							  try {
+									List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(pdo_pass.getPass_start_time());
+									v_time=li.get(0).getCreate_time();
+									mrdp.setPass_start_time(v_time);
+									List<MesCrAnnealM> li2 =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(pdo_pass.getPass_end_time());
+									v_time=li2.get(0).getCreate_time();
+									mrdp.setPass_end_time(v_time);
+									mrdp.setCoil_no(mtd0.getCoil_no());
+									mrdp.setCurr_pass_no(pdo_pass.getCurr_pass_no());
+									mrdp.setEntry_tension_avg(strToDouble(pdo_pass.getEntry_tension_avg())==null?"":(strToDouble(pdo_pass.getEntry_tension_avg())+""));
+									mrdp.setEntry_tension_max(strToDouble(pdo_pass.getEntry_tension_max())==null?"":(strToDouble(pdo_pass.getEntry_tension_max())+""));
+									mrdp.setEntry_tension_min(strToDouble(pdo_pass.getEntry_tension_min())==null?"":(strToDouble(pdo_pass.getEntry_tension_min())+""));
+									mrdp.setExit_tension_avg(strToDouble(pdo_pass.getExit_tension_avg())==null?"":(strToDouble(pdo_pass.getExit_tension_avg())+""));
+									mrdp.setExit_tension_max(strToDouble(pdo_pass.getExit_tension_max())==null?"":(strToDouble(pdo_pass.getExit_tension_max())+""));
+									mrdp.setExit_tension_min(strToDouble(pdo_pass.getExit_tension_min())==null?"":(strToDouble(pdo_pass.getExit_tension_min())+""));
+									mrdp.setImr_bending_force(strToDouble(pdo_pass.getImr_bending_force())==null?"":(strToDouble(pdo_pass.getImr_bending_force())+""));
+									mrdp.setMill_force(strToDouble(pdo_pass.getMill_force())==null?"":(strToDouble(pdo_pass.getMill_force())+""));
+									mrdp.setMill_force_deta(strToDouble(pdo_pass.getMill_force_deta())==null?"":(strToDouble(pdo_pass.getMill_force_deta())+""));
+									mrdp.setMill_speed(strToDouble(pdo_pass.getMill_speed())==null?"":(strToDouble(pdo_pass.getMill_speed())+""));
+									mrdp.setMsg_time(new Date());
+									mrdp.setPass_duration(strToDouble(pdo_pass.getPass_duration())==null?"":(strToDouble(pdo_pass.getPass_duration())+""));
+									mrdp.setPass_entry_thick(strToDouble(pdo_pass.getPass_entry_thick())==null?"":(strToDouble(pdo_pass.getPass_entry_thick())+""));
+									mrdp.setPass_exit_thick(strToDouble(pdo_pass.getPass_exit_thick())==null?"":(strToDouble(pdo_pass.getPass_exit_thick())+""));
+									mrdp.setProcess_no(v_rec_Roll_m.getProcess_no());
+									mrdp.setReduction(strToDouble(pdo_pass.getReduction())==null?"":(strToDouble(pdo_pass.getReduction())+""));
+									mrdp.setShift_pos(strToDouble(pdo_pass.getShift_pos())==null?"":(strToDouble(pdo_pass.getShift_pos())+""));
+									mrdp.setSpindle_torque(strToDouble(pdo_pass.getSpindle_torque())==null?"":(strToDouble(pdo_pass.getSpindle_torque())+""));
+									mrdp.setWkr_bending_force(strToDouble(pdo_pass.getWkr_bending_force())==null?"":(strToDouble(pdo_pass.getWkr_bending_force())+""));
+									this.getMapper(MesRcmDPassMapper.class).insert(mrdp);
+								} catch (Exception e) {
+									e.printStackTrace();
+								}
+						  }
+					  }catch(Exception e){
+						  e.printStackTrace();
+					  }
+					  
+				  }
+			  }
+			  
+			  
+			  
+			  
+			  //--(3.3)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			  //--(3.3.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+																																										
+			  //--(3.4)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			  //--(3.4.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+				MesRcmM  mcsm=new MesRcmM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.getRl_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_l2_pdo.getEntry_coil_no());//投料卷号
+				mcsm.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟卷号 
+				List<MesRcmM> lmcsm=new ArrayList<MesRcmM>();
+				//时间
+				SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+			    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+			    mcsm.setMemo(date);
+			    lmcsm.add(mcsm);
+			   //调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag2=true;
+				try{
+					this.getBean(MesApiRollingPlanImpl.class).MesRcmMAddValid(lmcsm);
+				}catch(Exception e){
+					flag2=false;
+					e.printStackTrace();
+				}
+				if(flag2){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiRollingPlanImpl.class).MesRcmMAdd(lmcsm);
+				}
+				
+				//调用物流模块(仓库管理)接口,对原料卷进行生产投料出库操作(接口由物流模块提供);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_l2_pdo.getEntry_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_l2_pdo.getEntry_coil_no());//注意
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(date);
+					cp2.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+				}
+			//--唯一置为成功的地方	
+			v_success=1;	
+			v_message = "Roll01L2Pdo L2钢卷生产实绩电文处理成功!"+"_success:"+v_success;  
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2Pdo L2钢卷生产实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2Pdo L2钢卷生产实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	//断带的情况、正常分卷的情况
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Pdo_d_d_234(String v_mch_code, IfRoll01L2Pdo v_rec_l2_pdo,
+			MesRcmM v_rec_Roll_m, Integer v_success, String v_message) throws Exception{
+		String seqcount="";
+		try{
+			seqcount = v_rec_l2_pdo.getExit_coil_no().substring(v_rec_l2_pdo.getExit_coil_no().length()-1, 
+					v_rec_l2_pdo.getExit_coil_no().length());
+			
+			if(v_rec_Roll_m==null || v_rec_Roll_m.getMaterial_no()==null || v_rec_Roll_m.getSchedule_no()==null){
+				v_message="此电文处理产出卷{"+seqcount+"},"+"还未存在实绩信息";
+				return v_message;
+			}
+			MesRcmM mtm=new MesRcmM();
+			mtm.setMaterial_no(v_rec_Roll_m.getMaterial_no());
+			mtm.setSchedule_no(v_rec_Roll_m.getSchedule_no());
+			List<MesRcmM> list = this.getMapper(MesRcmMMapper.class).find(mtm, 0, 0);
+			if(list==null || list.size()<=0){
+				v_message="此电文处理产出卷{"+seqcount+"},"+"还未存在实绩信息";
+				return v_message;
+			}
+			MesRcmM MesRcmM = list.get(0);
+			
+			
+			MesRcmD mtd=new MesRcmD();
+			mtd.setProcess_no(MesRcmM.getProcess_no());
+			List<MesRcmD> list_mtd = this.getMapper(MesRcmDMapper.class).findWithCondition(mtd, "substr(coil_no, -1) <> 'B'", "coil_no", 0, 0);
+			if(list_mtd==null || list_mtd.size()<=0){
+				  	v_message="此电文处理产出卷{"+seqcount+"},"+"还未存在第一个出口卷";
+					return v_message;  
+			}else{//之前就存在子卷实绩
+				  if(list_mtd.size()>=Integer.parseInt(seqcount)){
+					  MesRcmD mtd0=list_mtd.get(Integer.parseInt(seqcount)-1);
+					  MesRcmD mtd0_new=new MesRcmD();
+					  mtd0_new.setCoil_no(mtd0.getCoil_no());
+					  mtd0_new.setAct_thk      ( v_rec_l2_pdo.getExit_thick()==null?null:strToLong(v_rec_l2_pdo.getExit_thick()).doubleValue()/1000);// --产出卷厚度um	
+					  mtd0_new.setAct_len      ( v_rec_l2_pdo.getExit_length()==null?null:strToLong(v_rec_l2_pdo.getExit_length()).doubleValue()*1000);// --产出卷长度(m)																																							
+					  mtd0_new.setAct_inn_dia  ( v_rec_l2_pdo.getInner_diameter()==null?null:strToLong(v_rec_l2_pdo.getInner_diameter()).doubleValue());// --产出卷内径																																							
+					  mtd0_new.setAct_out_dia  ( v_rec_l2_pdo.getOuter_diameter()==null?null:strToLong(v_rec_l2_pdo.getOuter_diameter()).doubleValue());// --产出卷外径																																							
+					  //mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_calc_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_calc_weight()).doubleValue());// --产出卷理重	
+					  mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_weight()).doubleValue());// --产出卷理重	
+					  mtd0_new.setCoil_act_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_weight()).doubleValue());// --产出卷实量	
+					  mtd0_new.setCoil_wgt_time(new Date());//出口卷称重时间
+					  if(v_rec_l2_pdo.getExit_width()!=null){
+						  mtd0_new.setAct_wdt(
+								  v_rec_l2_pdo.getExit_width()==null?null:strToDouble(v_rec_l2_pdo.getExit_width()).doubleValue());
+					  }
+					  this.getMapper(MesRcmDMapper.class).update(mtd0_new);
+					  
+					//道次信息处理
+					  try{
+						  List<IfRoll01L2PdoPass> rcm_data = v_rec_l2_pdo.getRcm_data();
+						  this.getMapper(MesRcmDPassMapper.class).doDelete(v_rec_Roll_m.getProcess_no(),mtd0.getCoil_no());
+						  for(IfRoll01L2PdoPass pdo_pass:rcm_data){
+							  if(pdo_pass.getCurr_pass_no()==null || "".equals(pdo_pass.getCurr_pass_no().trim())){
+								  continue;
+							  }
+							  MesRcmDPass mrdp=new MesRcmDPass();
+							  Date v_time=null;
+							  try {
+									List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(pdo_pass.getPass_start_time());
+									v_time=li.get(0).getCreate_time();
+									mrdp.setPass_start_time(v_time);
+									List<MesCrAnnealM> li2 =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(pdo_pass.getPass_end_time());
+									v_time=li2.get(0).getCreate_time();
+									mrdp.setPass_end_time(v_time);
+									mrdp.setCoil_no(mtd0.getCoil_no());
+									mrdp.setCurr_pass_no(pdo_pass.getCurr_pass_no());
+									mrdp.setEntry_tension_avg(strToDouble(pdo_pass.getEntry_tension_avg())==null?"":(strToDouble(pdo_pass.getEntry_tension_avg())+""));
+									mrdp.setEntry_tension_max(strToDouble(pdo_pass.getEntry_tension_max())==null?"":(strToDouble(pdo_pass.getEntry_tension_max())+""));
+									mrdp.setEntry_tension_min(strToDouble(pdo_pass.getEntry_tension_min())==null?"":(strToDouble(pdo_pass.getEntry_tension_min())+""));
+									mrdp.setExit_tension_avg(strToDouble(pdo_pass.getExit_tension_avg())==null?"":(strToDouble(pdo_pass.getExit_tension_avg())+""));
+									mrdp.setExit_tension_max(strToDouble(pdo_pass.getExit_tension_max())==null?"":(strToDouble(pdo_pass.getExit_tension_max())+""));
+									mrdp.setExit_tension_min(strToDouble(pdo_pass.getExit_tension_min())==null?"":(strToDouble(pdo_pass.getExit_tension_min())+""));
+									mrdp.setImr_bending_force(strToDouble(pdo_pass.getImr_bending_force())==null?"":(strToDouble(pdo_pass.getImr_bending_force())+""));
+									mrdp.setMill_force(strToDouble(pdo_pass.getMill_force())==null?"":(strToDouble(pdo_pass.getMill_force())+""));
+									mrdp.setMill_force_deta(strToDouble(pdo_pass.getMill_force_deta())==null?"":(strToDouble(pdo_pass.getMill_force_deta())+""));
+									mrdp.setMill_speed(strToDouble(pdo_pass.getMill_speed())==null?"":(strToDouble(pdo_pass.getMill_speed())+""));
+									mrdp.setMsg_time(new Date());
+									mrdp.setPass_duration(strToDouble(pdo_pass.getPass_duration())==null?"":(strToDouble(pdo_pass.getPass_duration())+""));
+									mrdp.setPass_entry_thick(strToDouble(pdo_pass.getPass_entry_thick())==null?"":(strToDouble(pdo_pass.getPass_entry_thick())+""));
+									mrdp.setPass_exit_thick(strToDouble(pdo_pass.getPass_exit_thick())==null?"":(strToDouble(pdo_pass.getPass_exit_thick())+""));
+									mrdp.setProcess_no(v_rec_Roll_m.getProcess_no());
+									mrdp.setReduction(strToDouble(pdo_pass.getReduction())==null?"":(strToDouble(pdo_pass.getReduction())+""));
+									mrdp.setShift_pos(strToDouble(pdo_pass.getShift_pos())==null?"":(strToDouble(pdo_pass.getShift_pos())+""));
+									mrdp.setSpindle_torque(strToDouble(pdo_pass.getSpindle_torque())==null?"":(strToDouble(pdo_pass.getSpindle_torque())+""));
+									mrdp.setWkr_bending_force(strToDouble(pdo_pass.getWkr_bending_force())==null?"":(strToDouble(pdo_pass.getWkr_bending_force())+""));
+									this.getMapper(MesRcmDPassMapper.class).insert(mrdp);
+								} catch (Exception e) {
+									e.printStackTrace();
+								}
+						  }
+					  }catch(Exception e){
+						  e.printStackTrace();
+					  }					  					  
+				  }else{
+					  MesRcmD mtd0_new=new MesRcmD();
+					  mtd0_new.setAct_thk      ( v_rec_l2_pdo.getExit_thick()==null?null:strToLong(v_rec_l2_pdo.getExit_thick()).doubleValue()/1000);// --产出卷厚度um	
+					  mtd0_new.setAct_len      ( v_rec_l2_pdo.getExit_length()==null?null:strToLong(v_rec_l2_pdo.getExit_length()).doubleValue()*1000);// --产出卷长度(m)																																							
+					  mtd0_new.setAct_inn_dia  ( v_rec_l2_pdo.getInner_diameter()==null?null:strToLong(v_rec_l2_pdo.getInner_diameter()).doubleValue());// --产出卷内径																																							
+					  mtd0_new.setAct_out_dia  ( v_rec_l2_pdo.getOuter_diameter()==null?null:strToLong(v_rec_l2_pdo.getOuter_diameter()).doubleValue());// --产出卷外径																																							
+					  //mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_calc_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_calc_weight()).doubleValue());// --产出卷理重																																							
+					  mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_weight()).doubleValue());// --产出卷理重																																							
+					  mtd0_new.setCoil_act_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:strToLong(v_rec_l2_pdo.getExit_weight()).doubleValue());// --产出卷实量	
+					  ResultModel doAddmaterielWeb_PDO = new ResultModel();
+					  //doAddmaterielWeb_PDO = this.getBean(MesRcmDServiceImpl.class).doAddmaterielWeb_PDO(MesRcmM.getSchedule_no(),
+							 // MesRcmM.getMaterial_no_vt(),MesRcmM.getMaterial_no(),"M0008",mtd0_new);
+					  
+					  //道次信息处理
+					  if(doAddmaterielWeb_PDO.getData()!=null){
+						  
+						  try{
+							  List<IfRoll01L2PdoPass> rcm_data = v_rec_l2_pdo.getRcm_data();
+							  //this.getMapper(MesRcmDPassMapper.class).doDelete(v_rec_Roll_m.getProcess_no(),mtd0.getCoil_no());
+							  for(IfRoll01L2PdoPass pdo_pass:rcm_data){
+								  if(pdo_pass.getCurr_pass_no()==null || "".equals(pdo_pass.getCurr_pass_no().trim())){
+									  continue;
+								  }
+								  MesRcmDPass mrdp=new MesRcmDPass();
+								  Date v_time=null;
+								  try {
+										List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(pdo_pass.getPass_start_time());
+										v_time=li.get(0).getCreate_time();
+										mrdp.setPass_start_time(v_time);
+										List<MesCrAnnealM> li2 =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(pdo_pass.getPass_end_time());
+										v_time=li2.get(0).getCreate_time();
+										mrdp.setPass_end_time(v_time);
+										mrdp.setCoil_no(doAddmaterielWeb_PDO.getData()+"");
+										mrdp.setCurr_pass_no(pdo_pass.getCurr_pass_no());
+										mrdp.setEntry_tension_avg(strToDouble(pdo_pass.getEntry_tension_avg())==null?"":(strToDouble(pdo_pass.getEntry_tension_avg())+""));
+										mrdp.setEntry_tension_max(strToDouble(pdo_pass.getEntry_tension_max())==null?"":(strToDouble(pdo_pass.getEntry_tension_max())+""));
+										mrdp.setEntry_tension_min(strToDouble(pdo_pass.getEntry_tension_min())==null?"":(strToDouble(pdo_pass.getEntry_tension_min())+""));
+										mrdp.setExit_tension_avg(strToDouble(pdo_pass.getExit_tension_avg())==null?"":(strToDouble(pdo_pass.getExit_tension_avg())+""));
+										mrdp.setExit_tension_max(strToDouble(pdo_pass.getExit_tension_max())==null?"":(strToDouble(pdo_pass.getExit_tension_max())+""));
+										mrdp.setExit_tension_min(strToDouble(pdo_pass.getExit_tension_min())==null?"":(strToDouble(pdo_pass.getExit_tension_min())+""));
+										mrdp.setImr_bending_force(strToDouble(pdo_pass.getImr_bending_force())==null?"":(strToDouble(pdo_pass.getImr_bending_force())+""));
+										mrdp.setMill_force(strToDouble(pdo_pass.getMill_force())==null?"":(strToDouble(pdo_pass.getMill_force())+""));
+										mrdp.setMill_force_deta(strToDouble(pdo_pass.getMill_force_deta())==null?"":(strToDouble(pdo_pass.getMill_force_deta())+""));
+										mrdp.setMill_speed(strToDouble(pdo_pass.getMill_speed())==null?"":(strToDouble(pdo_pass.getMill_speed())+""));
+										mrdp.setMsg_time(new Date());
+										mrdp.setPass_duration(strToDouble(pdo_pass.getPass_duration())==null?"":(strToDouble(pdo_pass.getPass_duration())+""));
+										mrdp.setPass_entry_thick(strToDouble(pdo_pass.getPass_entry_thick())==null?"":(strToDouble(pdo_pass.getPass_entry_thick())+""));
+										mrdp.setPass_exit_thick(strToDouble(pdo_pass.getPass_exit_thick())==null?"":(strToDouble(pdo_pass.getPass_exit_thick())+""));
+										mrdp.setProcess_no(v_rec_Roll_m.getProcess_no());
+										mrdp.setReduction(strToDouble(pdo_pass.getReduction())==null?"":(strToDouble(pdo_pass.getReduction())+""));
+										mrdp.setShift_pos(strToDouble(pdo_pass.getShift_pos())==null?"":(strToDouble(pdo_pass.getShift_pos())+""));
+										mrdp.setSpindle_torque(strToDouble(pdo_pass.getSpindle_torque())==null?"":(strToDouble(pdo_pass.getSpindle_torque())+""));
+										mrdp.setWkr_bending_force(strToDouble(pdo_pass.getWkr_bending_force())==null?"":(strToDouble(pdo_pass.getWkr_bending_force())+""));
+										this.getMapper(MesRcmDPassMapper.class).insert(mrdp);
+									} catch (Exception e) {
+										e.printStackTrace();
+									}
+							  }
+						  }catch(Exception e){
+							  e.printStackTrace();
+						  }
+						  
+					  }
+					  
+					  
+				  }
+				  
+			  }
+			
+		}catch(Exception e){
+			throw new Exception("此电文处理产出卷{"+seqcount+"}出错");
+		}
+		v_success=1;	
+		v_message="Roll01L2Pdo【断带、分卷】L2钢卷生产实绩电文处理产出卷{"+seqcount+"},处理成功!"+"_success:"+v_success;
+		
+		return v_message;
+	}
+	
+	
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Pdo_d 方法调用;																																							
+	    2)、	接口参数 IN:V_REC_L3_ASW_PDO(L3应答L2钢卷生产实绩对象)																																							
+	    3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_l3_asw_pdo
+	 * @param v_message2
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Roll01L3AswPdo(IfRoll01L3AnswerPdo v_rec_l3_asw_pdo,
+			String v_message) throws Exception{
+		Integer v_flag=null;// --电文发送成功标志
+		try{
+			//  --(1)、无接口调试时,设置1,直接跳过,否则设置为0
+			v_flag=0;// --1:成功、0:失败
+			//--(1)、调用公司接口,将“L3应答L2钢卷生产实绩电文” v_rec_l3_asw_pdo 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_l3_asw_pdo,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_MES);
+				String url = ROLLPDI_MES;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3应答L2钢卷生产实绩电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发L3应答L2钢卷生产实绩电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发L3应答L2钢卷生产实绩电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发无PDI给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			
+			// --(1.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Roll01L3AswPdo L3应答L2钢卷生产实绩电文发送失败!"+v_message;
+				return v_message;
+			}
+			//--(1.2)、电文发送成功(成功状态,根据接口提供定义确定),插入 L3应答L2钢卷生产实绩 记录																																	
+			this.getMapper(IfRoll01L3AnswerPdoMapper.class).insert(v_rec_l3_asw_pdo);
+			// --(1.2.1)、提交事务
+			v_message="Roll01L3AswPdo L3应答L2钢卷生产实绩电文发送成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(1.2.2)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(1.2.2.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3AswPdo L3应答L2钢卷生产实绩电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3AswPdo L3应答L2钢卷生产实绩电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3AswPdo L3应答L2钢卷生产实绩电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3AswPdo L3应答L2钢卷生产实绩电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2生产结束电文时调用;																																							
+		2)、	此接口参数为“L2生产结束电文JSON对象”(电文编号:DR3E09);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2ProduceEnd(IfRoll01L2PrdEnd json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_prd_end 代替描述
+		IfRoll01L2PrdEnd v_rec_l2_prd_end=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_生产结束为空";
+			return v_message;
+		}
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_prd_end.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_prd_end.setMsg_time(new Date());
+		}
+		//--(1.2)、将对象,插入L2生产结束表(单独的事务)
+		try{
+			this.getMapper(IfRoll01L2PrdEndMapper.class).insert(v_rec_l2_prd_end);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用L2生产结束处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2ProduceEnd_d(v_mch_code,v_rec_l2_prd_end,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_prd_end.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param = "消息时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO "
+					+ "{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 出口卷号 EXIT_COIL_NO {"+v_rec_l2_prd_end.getExit_coil_no()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2ProduceEnd",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2ProduceEnd 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_PRD_END(L2生产结束记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_prd_str
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2ProduceEnd_d(String v_mch_code,
+			IfRoll01L2PrdEnd v_rec_l2_prd_end, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.2.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_mch_code);
+			if(cbm.getMachine_mark()==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+				return v_message;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_rec_l2_prd_end.getEntry_coil_no()==null || "".equals(v_rec_l2_prd_end.getEntry_coil_no())){
+				v_message="入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 未指定入口卷号!";
+				return v_message;
+			}
+			if(v_rec_l2_prd_end.getEntry_coil_no().substring(0, 1).equals("L")){
+				List<YdmProductDetail> listypd = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "materailcoilno='"+v_rec_l2_prd_end.getEntry_coil_no()+"'", "", 0, 0);
+				if(listypd!=null && listypd.size()==1){
+					v_rec_l2_prd_end.setEntry_coil_no(listypd.get(0).getCoilno());
+					if(v_rec_l2_prd_end.getExit_coil_no()!=null){
+						int ia=v_rec_l2_prd_end.getExit_coil_no().length()-v_rec_l2_prd_end.getEntry_coil_no().length();
+						if(ia==1){
+							String weihao = v_rec_l2_prd_end.getExit_coil_no().substring(v_rec_l2_prd_end.getExit_coil_no().length()-1, v_rec_l2_prd_end.getExit_coil_no().length());
+							v_rec_l2_prd_end.setExit_coil_no(v_rec_l2_prd_end.getEntry_coil_no()+weihao);
+						}
+					}
+				}
+			}
+			
+			
+			//  --(1.4)、“生产结束时间”赋值未当前时刻
+			Date v_end_time=new Date();
+			String rmDb=DateUtil.formatDate(v_end_time, "yyyy-MM-dd HH:mm:ss");
+			String v_date=null,v_ord=null;
+			String dbTime=rmDb.substring(11);
+			v_date=rmDb.substring(0,10);
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				v_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				v_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				v_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(v_date);
+				} catch (Exception e) {
+					return "获取数据库时间失败,请稍后重试";
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+		        v_date=formatYmd.format(c.getTime());
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.0)、根据计算的日期班次,获取交接班记录的班组																																							
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(v_date);
+			msm.setWrk_ord(v_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_grp=null;
+			if(v_cnt<=0){
+				v_grp="";// --暂无交接班记录,置空(由操作人员在页面上选取保存)
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_grp=lmsm.get(0).getWrk_grp();
+			}
+			//  --(2.1)、验证入口卷对应的作业计划信息存在  
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount1(v_mch_code,v_rec_l2_prd_end.getEntry_coil_no());
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 找不到作业计划信息!";
+				return v_message;  
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"}存在2条或以上的作业计划信息!";
+				return v_message; 
+			}else{
+				List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_rec_l2_prd_end.getEntry_coil_no());
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此电文事件)
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_rec_pln_d.getRl_plan_no());
+			mCross.setMaterial_no(v_rec_l2_prd_end.getEntry_coil_no());
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			MesRcmM v_rec_Roll_m=new MesRcmM();
+			boolean flag=false;//
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+			    v_rec_Roll_m =lmcam.get(0);
+			    flag=true;
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_message = "机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} "
+			    			+ "入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 已生产交工,忽略此电文事件!'";
+					return v_message;
+			    }
+			}
+			//  --(2.3)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";																																							
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			//  --(2.4)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_l2_prd_end.getEntry_coil_no()+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} "
+						+ "入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 原料卷库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=  v_rec_ydm_d_list.get(0);
+			//  --(2.5)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BRL02".equals(v_rec_pln_d.getStatus()) || "5BRL03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+
+			//  --(2.7)、在 v_rec_Roll_m 对象基础上,构建平整主实绩,并插入记录																																							
+			//  --(2.7.1):v_rec_Roll_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+			//  --(2.7.2):v_rec_Roll_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)						
+			ComBaseMachine machine2 = new ComBaseMachine();
+			machine2.setMachine_code(v_mch_code);
+			List<ComBaseMachine> lcbm = this.getMapper(ComBaseMachineMapper.class)
+					.find(machine2, 0, 0);
+			String v_mch_mark=lcbm.get(0).getMachine_mark();
+			if (v_mch_mark == null) {
+				return "机台代码:" +v_mch_code+ "\n设备编号未配置,无法处理!";
+			}
+			String v_process_no="";
+			if(!flag){//如果 v_rec_plm_m 对象为空(即之前无生产实绩)
+				SimpleDateFormat formatY3 = new SimpleDateFormat("yyMMdd");
+				v_process_no = "Z" + formatY3.format(new Date())+lpad(v_mch_mark, 2, "0");
+				v_cnt = this.getMapper(MesRcmMMapper.class).doquery(v_process_no);
+				if (v_cnt == null) {
+					v_cnt = 1;
+				}
+				v_process_no = v_process_no + lpad(v_cnt.toString(), 3, "0");
+				v_rec_Roll_m.setProcess_no(v_process_no);
+			}
+			
+			
+			  v_rec_Roll_m.setMachine_code    ( v_mch_code);// --机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			  v_rec_Roll_m.setSchedule_no     ( v_rec_pln_d.getRl_plan_no());// --作业计划号																																							
+			  v_rec_Roll_m.setInner_seq       ( v_rec_pln_d.getRl_seq());// --计划内序号																																							
+			  v_rec_Roll_m.setMaterial_no_vt  ( v_rec_pln_d.getObject_no_vt());// --虚拟原料卷号																																							
+			  v_rec_Roll_m.setPln_steel_code  ( v_rec_mtr_in.getSteel_code());// --计划原料卷牌号																																							
+			  v_rec_Roll_m.setPln_mtr_thk     ( v_rec_mtr_in.getThick());// --计划原料卷厚度																																							
+			  v_rec_Roll_m.setPln_mtr_wdt     ( v_rec_mtr_in.getWidth());// --计划原料卷宽度																																							
+			  v_rec_Roll_m.setPln_mtr_len     ( v_rec_mtr_in.getLength());// --计划原料卷长度																																							
+			  v_rec_Roll_m.setPln_mtr_inn_dia ( v_rec_mtr_in.getDiameter_inn());// --计划原料卷内径																																							
+			  v_rec_Roll_m.setPln_mtr_out_dia ( v_rec_mtr_in.getDiameter_out());// --计划原料卷外径																																							
+			  v_rec_Roll_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.getSingle_weight());// --计划原料卷理重																																							
+			  v_rec_Roll_m.setMaterial_no     ( v_rec_l2_prd_end.getEntry_coil_no());// --原料卷号																																							
+			  v_rec_Roll_m.setMaterial_no_src ( v_rec_ydm_d.getMaterailcoilno());// --原始卷号																																							
+			  v_rec_Roll_m.setMtr_thk         ( v_rec_ydm_d.getThick());// --原料卷厚度																																							
+			  v_rec_Roll_m.setMtr_wdt         ( v_rec_ydm_d.getWidth());// --原料卷宽度																																							
+			  v_rec_Roll_m.setMtr_len         ( v_rec_ydm_d.getLength());// --原料卷长度																																							
+			  v_rec_Roll_m.setMtr_inn_dia     ( v_rec_ydm_d.getDiameter_inn());// --原料卷内径																																							
+			  v_rec_Roll_m.setMtr_out_dia     ( v_rec_ydm_d.getDiameter_out());// --原料卷外径																																							
+			  if(v_rec_ydm_d.getTheoryweight()!=null){
+				  v_rec_Roll_m.setMtr_thr_wgt     ( v_rec_ydm_d.getTheoryweight());// --原料卷理重	
+			  }else{
+				  v_rec_Roll_m.setMtr_thr_wgt     (v_rec_ydm_d.getFactweight());// --原料卷理重	
+			  }
+			  v_rec_Roll_m.setMtr_act_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷实重																																							
+			  v_rec_Roll_m.setSteel_code      ( v_rec_ydm_d.getSteelcode());// --原料卷牌号
+			  
+			  if(!flag){//如果 v_rec_Roll_m 对象为空(即之前无生产实绩),则覆盖 作业日期、班次、班组(与生产开始不同,请注意)
+				  v_rec_Roll_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)																																							
+				  v_rec_Roll_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)																																							
+				  v_rec_Roll_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)																																							
+				  v_rec_Roll_m.setFeeding_time ( v_end_time); //--上料时间		
+				  v_rec_Roll_m.setTp_str_time  (v_end_time); //--生产开始时间
+				  
+			  }
+			  v_rec_Roll_m.setMemo             ( null);// --备注																																							
+			  v_rec_Roll_m.setHand_over_status ( "0");// --交工状态																																							
+			  v_rec_Roll_m.setHand_over_time   ( null);// --交工时间																																							
+			  v_rec_Roll_m.setHand_over_opr    ( null);// --交工人																																							
+	
+			  if(!flag){
+				  //  --如果 v_rec_Roll_m 对象为空(即之前无生产实绩),则:
+				  v_rec_Roll_m.setCreate_opr( "L2_DR3E09");// --操作人																																							
+				  v_rec_Roll_m.setCreate_time( new Date());// --操作时间																																							
+			  }else{
+				  //  --如果 v_rec_Roll_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				  v_rec_Roll_m.setUpdate_opr("L2_DR3E09");// --修改人																																							
+				  v_rec_Roll_m.setUpdate_time(new Date()) ;//--修改时间																																							
+			  }
+			  
+			  //--(3)、开始事物:																																							
+			  //--(3.0)、更新生产跟踪表	??	
+			  try{
+				  int count = this.getMapper(MesRcmTrcMapper.class).countWithCondition(null,"machine_code='"+v_mch_code+"'"); 
+				  if(count<=0){
+					  	MesRcmTrc mcst=new MesRcmTrc();
+					  	mcst.setMachine_code(v_mch_code);
+					  	mcst.setLst_coil_no(v_rec_l2_prd_end.getEntry_coil_no());
+					  	mcst.setLst_end_time(v_end_time);
+					  	mcst.setUpdate_program("Roll01L2ProduceEnd");
+					  	mcst.setUpdate_time(new Date());
+						this.getMapper(MesRcmTrcMapper.class).insert(mcst);
+				  }else{
+					  MesRcmTrc v_rec_Roll_trc = this.getMapper(MesRcmTrcMapper.class).findById(v_mch_code);
+					  // --(3.0.2)、如果生产结束入口卷号 = 生产跟踪表的当前钢卷号
+					  if(v_rec_l2_prd_end.getEntry_coil_no().equals(v_rec_Roll_trc.getCur_coil_no())){
+						    MesRcmTrc mcst=new MesRcmTrc();
+						  	mcst.setMachine_code(v_mch_code);
+						  	mcst.setLst_coil_no(v_rec_Roll_trc.getCur_coil_no());
+						  	mcst.setLst_str_time(v_rec_Roll_trc.getCur_str_time());
+						  	mcst.setLst_end_time(v_end_time);
+						  	mcst.setCur_coil_no(null);
+						  	mcst.setCur_str_time(null);
+						  	mcst.setUpdate_program("Roll01L2ProduceEnd");
+						  	mcst.setUpdate_time(new Date());
+							this.getMapper(MesRcmTrcMapper.class).update(mcst);
+					  }else if(v_rec_l2_prd_end.getEntry_coil_no().equals(v_rec_Roll_trc.getLst_coil_no())){//--(3.0.3)、如果生产结束入口卷号 = 生产跟踪表的上一钢卷号
+						  MesRcmTrc mcstcc=new MesRcmTrc();
+						  mcstcc.setMachine_code(v_mch_code);
+						  mcstcc.setLst_end_time(v_end_time);
+						  mcstcc.setUpdate_program("Roll01L2ProduceEnd");
+						  mcstcc.setUpdate_time(new Date());
+						  this.getMapper(MesRcmTrcMapper.class).update(mcstcc);
+					  }
+				  }
+			  }catch(Exception e){
+				  e.printStackTrace();
+			  }
+			  
+			  //  --(3.1)、删除可能存在的平整作业实绩记录
+			  this.getMapper(MesRcmMMapper.class).doDelete1(v_rec_pln_d.getRl_plan_no(),v_rec_l2_prd_end.getEntry_coil_no());
+			  //  --(3.2)、插入平整作业实绩记录
+			  this.getMapper(MesRcmMMapper.class).insert(v_rec_Roll_m);
+			  
+			  //--(3.3)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			  //--(3.3.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+																																										
+			  //--(3.4)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			  //--(3.4.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+				MesRcmM  mcsm=new MesRcmM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.getRl_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_l2_prd_end.getEntry_coil_no());//投料卷号
+				mcsm.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟卷号 
+				List<MesRcmM> lmcsm=new ArrayList<MesRcmM>();
+				//时间
+				SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+			    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+			    mcsm.setMemo(date);
+			    lmcsm.add(mcsm);
+			   //调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag2=true;
+				try{
+					this.getBean(MesApiRollingPlanImpl.class).MesRcmMAddValid(lmcsm);
+				}catch(Exception e){
+					flag2=false;
+					e.printStackTrace();
+				}
+				if(flag2){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiRollingPlanImpl.class).MesRcmMAdd(lmcsm);
+				}
+				
+				//调用物流模块(仓库管理)接口,对原料卷进行生产投料出库操作(接口由物流模块提供);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_l2_prd_end.getEntry_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_l2_prd_end.getEntry_coil_no());//注意
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(date);
+					cp2.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+				}
+			v_message = "Roll01L2ProduceEnd L2生产结束电文处理成功!";  
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2ProduceEnd L2生产结束电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2ProduceEnd L2生产结束电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2机组停机检测实绩电文时调用;																																							
+		2)、	此接口参数为“L2机组停机检测实绩电文JSON对象”(电文编号:DR3E10);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2Stop(IfRoll01L2Stop json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_stop 代替描述
+		IfRoll01L2Stop v_rec_l2_stop=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_机组停机检测为空";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_stop.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_stop.setMsg_time(new Date());
+		}
+		//--(1.2)、将对象,插入L2机组停机检测表(单独的事务)
+		try{
+			if (!"0".equals(v_rec_l2_stop.getFlag()) || !"00000000000000".equals(v_rec_l2_stop.getTime())) {			
+				this.getMapper(IfRoll01L2StopMapper.class).insert(v_rec_l2_stop);
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用L2机组停机检测处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Stop_d(v_mch_code,v_rec_l2_stop,
+					v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_stop.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 停机标识 FLAG {"+v_rec_l2_stop.getFlag()+"} "
+					+ "停机时间 TIME {"+v_rec_l2_stop.getTime()+"} 原因代码 REASON_CODE {"+v_rec_l2_stop.getReason_code()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2Stop",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Stop 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_STOP(L2机组停机检测记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_stop
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Stop_d(String v_mch_code,
+			IfRoll01L2Stop v_rec_l2_stop, String v_message) throws Exception{
+		Integer v_cnt=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//  --(2)、开始事物																																							
+			//  --(2.1)、插入平整停开机记录																																							
+			MesRcmStop mts=new MesRcmStop();
+			mts.setMachine_code(v_mch_code);
+			if(v_rec_l2_stop.getFlag()!=null){
+				mts.setStop_flag(v_rec_l2_stop.getFlag()+"");
+			}
+			//??to_date(v_rec_l2_stop.time, 'yyyymmddhh24miss')?
+			Date stop_time = null;
+			try {
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_stop.getTime());
+				stop_time=li.get(0).getCreate_time();
+			} catch (Exception e) {
+				
+			}
+			mts.setStop_time(stop_time);
+			mts.setStop_reason(v_rec_l2_stop.getReason_code());
+			mts.setCreate_opr("L2_DR3E10");
+			mts.setCreate_time(new Date());
+			this.getMapper(MesRcmStopMapper.class).insert(mts);
+			//--(3)、提交事务
+			v_message="Roll01L2Stop L2机组停机检测电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2Stop L2机组停机检测电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2Stop L2机组停机检测电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2能耗实绩电文时调用;																																							
+		2)、	此接口参数为“L2能耗实绩电文JSON对象”(电文编号:DR3E11);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2Energy(IfRoll01L2Energy json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_energy 代替描述
+		IfRoll01L2Energy v_rec_l2_energy=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_能耗实绩为空";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_energy.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_energy.setMsg_time(new Date());
+		}
+		//--(1.2)、将对象,插入L2能耗实绩表(单独的事务)
+		try{
+			this.getMapper(IfRoll01L2EnergyMapper.class).insert(v_rec_l2_energy);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2能耗实绩处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2Energy_d(v_mch_code,v_rec_l2_energy,
+					v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_energy.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param = "消息时间 MSG_TIME {"+mes_time+"} 日期 TC_TIME {"+v_rec_l2_energy.getTc_time()+"} 班次 SHIFT {"+v_rec_l2_energy.getShift()+"} 班别 CREW {"+v_rec_l2_energy.getCrew()+"} 电 ELECTRICITY {"+v_rec_l2_energy.getElectricity()+
+					  "} 净化水 PURIFY_WATER {"+v_rec_l2_energy.getPurify_water()+"} 循环水 CIRCULATING_WATER {"+v_rec_l2_energy.getCirculating_water()+"} 预留 RESERVER1 {"+v_rec_l2_energy.getReserver1()+"}";																																							
+			
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2Energy",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2Energy 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_ENERGY(L2能耗实绩记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_energy
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2Energy_d(String v_mch_code,IfRoll01L2Energy v_rec_l2_energy, 
+			String v_message) throws Exception{
+		Integer v_cnt=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证日期
+			if(v_rec_l2_energy.getTc_time()==null || "".equals(v_rec_l2_energy.getTc_time())){
+				v_message="日期{"+v_rec_l2_energy.getTc_time()+"} 不能为空!";
+				return v_message;
+			}
+			//--(1.3.1)、验证日期格式
+			String v_wrk_date=null;
+			try {
+				v_wrk_date=this.getMapper(MesRcmMMapper.class).doQueryDate(v_rec_l2_energy.getTc_time());
+			} catch (Exception e) {
+				e.printStackTrace();
+				v_message="日期{"+v_rec_l2_energy.getTc_time()+"} 格式无法识别!约定的标准格式【yyyymmdd】";
+				return v_message;
+			}
+			//  --(1.4)、验证班次(1:晚、2:白、3:中)
+			if(v_rec_l2_energy.getShift()==null){
+				v_message="班次不能为空";
+				return v_message;
+			}else if(!"1".equals(v_rec_l2_energy.getShift()) && !"2".equals(v_rec_l2_energy.getShift())  
+					&& !"3".equals(v_rec_l2_energy.getShift())) {
+				v_message="班次{"+v_rec_l2_energy.getShift()+"}代码无法识别!";
+				return v_message;
+			}
+			String v_wrk_ord=v_rec_l2_energy.getShift();
+			
+			//  --(2)、开始事物																																							
+			//--(2.1)、验证平整能耗实绩是否存在			
+			MesRcmEnergy mte=new MesRcmEnergy();
+			mte.setMachine_code(v_mch_code);
+			mte.setWrk_date(v_wrk_date);
+			mte.setWrk_ord(v_wrk_ord);
+		    v_cnt = this.getMapper(MesRcmEnergyMapper.class).count(mte);
+		    if(v_cnt>0){
+		    	//--(2.2)、存在则更新记录
+		    	MesRcmEnergy m=new MesRcmEnergy();
+		    	m.setMachine_code(v_mch_code);
+		    	m.setWrk_date(v_wrk_date);
+		    	m.setWrk_ord(v_wrk_ord);
+		    	m.setCsm_elec(v_rec_l2_energy.getElectricity()==null?null:strToLong(v_rec_l2_energy.getElectricity()).doubleValue());
+		    	m.setCsm_prf_water(v_rec_l2_energy.getPurify_water()==null?null:strToLong(v_rec_l2_energy.getPurify_water()).doubleValue()/100);
+		    	m.setCsm_ccl_water(v_rec_l2_energy.getCirculating_water()==null?null:strToLong(v_rec_l2_energy.getCirculating_water()).doubleValue()/100);
+		    	m.setUpdate_opr("L2_DR3E11");
+		    	m.setUpdate_time(new Date());
+		    	this.getMapper(MesRcmEnergyMapper.class).update(m);
+		    }else{
+		    	// --(2.3)、不存在则插入记录
+		    	MesRcmEnergy m=new MesRcmEnergy();
+		    	m.setMachine_code(v_mch_code);
+		    	m.setWrk_date(v_wrk_date);
+		    	m.setWrk_ord(v_wrk_ord);
+		    	m.setCsm_elec(v_rec_l2_energy.getElectricity()==null?null:strToLong(v_rec_l2_energy.getElectricity()).doubleValue());
+		    	m.setCsm_prf_water(v_rec_l2_energy.getPurify_water()==null?null:strToLong(v_rec_l2_energy.getPurify_water()).doubleValue()/100);
+		    	m.setCsm_ccl_water(v_rec_l2_energy.getCirculating_water()==null?null:strToLong(v_rec_l2_energy.getCirculating_water()).doubleValue()/100);
+		    	m.setCreate_opr("L2_DR3E11");
+		    	m.setCreate_time(new Date());
+		    	this.getMapper(MesRcmEnergyMapper.class).insert(m);
+		    }
+			//--(3)、提交事务
+			v_message="Roll01L2Energy L2能耗实绩电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2Energy L2能耗实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2Energy L2能耗实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+		
+	}
+
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2应答L3指示删除电文时调用;																																							
+		2)、	此接口参数为“L2应答L3指示删除电文JSON对象”(电文编号:DR3E12);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2AswRevoke(IfRoll01L2AnswerRevoke json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_asw_rvk 代替描述
+		IfRoll01L2AnswerRevoke v_rec_l2_asw_rvk=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_应答L3指示删除为空";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_asw_rvk.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_asw_rvk.setMsg_time(new Date());
+		}
+		//--(1.2)、将对象,插入L2应答L3指示删除表(单独的事务)
+		try{
+			this.getMapper(IfRoll01L2AnswerRevokeMapper.class).insert(v_rec_l2_asw_rvk);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用应答L2应答L3指示删除处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2AswRevoke_d(v_mch_code,v_rec_l2_asw_rvk.getEntry_coil_no(),
+					strToLong(v_rec_l2_asw_rvk.getResult()),v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_asw_rvk.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO {"+v_rec_l2_asw_rvk.getEntry_coil_no()+"} 结果 RESULT {"+v_rec_l2_asw_rvk.getResult()+"}";																																							
+			
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2AswRevoke",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	    1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2AswRevoke 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)、V_RESULT(操作结果(1:成功、0:失败))																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param entry_coil_no
+	 * @param result
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2AswRevoke_d(String v_mch_code, String v_entry_coil_no,
+			Long v_result, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证入口卷号不为空
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_message="入口卷号{"+v_entry_coil_no+"} 未指定入口卷号!";
+				return v_message;
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.1)、验证入口卷对应的作业计划信息存在																																							
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount1(v_mch_code,v_entry_coil_no);
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+				return v_message;
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+				return v_message;
+			}else{
+				List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、验证已下发过PDI
+//			if(v_rec_pln_d.getSend_flag()==null || "0".equals(v_rec_pln_d.getSend_flag())){
+//				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 还未下发指示顺序或PDI数据!";
+//				return v_message;
+//			}
+			//  --(2.3)、验证当前还未生产交工
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_rec_pln_d.getRl_plan_no());
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+			    MesRcmM v_rec_Roll_m =lmcam.get(0);
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工!";
+			    	return v_message;
+			    }
+			}
+			//  --(3)、开始事物:																																							
+			//  --(3.1)、如果应答电文中,RESULT = 0 即L2指示删除操作成功时,才修改L3对应指示状态																																							
+			if(v_result==0){
+				this.getMapper(PlnRollingPlanDetailMapper.class).doUpdate4("L2Asw", v_rec_pln_d.getRl_plan_no(), v_entry_coil_no);
+			}
+			//--(4)、提交事务
+			v_message="Roll01L2AswRevoke L2应答L3指示删除电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2AswRevoke L2应答L3指示删除电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2AswRevoke L2应答L3指示删除电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2装辊实绩电文时调用;																																							
+		2)、	此接口参数为“L2装辊实绩电文JSON对象”(电文编号:DR3E13);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2RllLoad(IfRoll01L2RllLoad json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_rll_load 代替描述
+		IfRoll01L2RllLoad v_rec_l2_rll_load=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_装辊实绩为空";
+			return v_message;
+		}
+		//--(1.0)、创建L2装辊实绩表记录号
+		Long v_serial_no=this.getMapper(IfRoll01L2RllLoadMapper.class).doQuery1();
+		//--(1.0.0)、赋值
+		v_rec_l2_rll_load.setSerial_no(v_serial_no);
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_rll_load.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_rll_load.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入 L2装辊实绩表 以及 L2装辊实绩表-上下辊表(单独的事务)																																							
+		//  --(1.2.1)、此电文需要拆分为 主从表(1:2),其中上下辊为子表(编码时注意处理)	??	  																																					
+		try{
+			this.getMapper(IfRoll01L2RllLoadMapper.class).insert(v_rec_l2_rll_load);
+			//轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊)
+			if(v_rec_l2_rll_load.getRoll_type()!=null){
+				//W:工作辊、B:支承辊、I:中间辊)
+				if(v_rec_l2_rll_load.getRoll_type().equals("WKR")){
+					v_rec_l2_rll_load.setRoll_type("W");
+				}else if(v_rec_l2_rll_load.getRoll_type().equals("BUR")){
+					v_rec_l2_rll_load.setRoll_type("B");
+				}else if(v_rec_l2_rll_load.getRoll_type().equals("IMR")){
+					v_rec_l2_rll_load.setRoll_type("I");
+				}
+			}
+			
+			List<IfRoll01L2RllLoadD> litlrd = v_rec_l2_rll_load.getMount_roll();
+			if(litlrd!=null && litlrd.size()>1){
+				//this.getMapper(IfRoll01L2RllLoadDMapper.class).insert(v_rec_l2_rll_load_t);
+				//this.getMapper(IfRoll01L2RllLoadDMapper.class).insert(v_rec_l2_rll_load_b);
+				IfRoll01L2RllLoadD ilrld1=new IfRoll01L2RllLoadD();
+				ilrld1.setSerial_no(v_serial_no);//记录号(由业务接口创建,唯一标识消息)
+				ilrld1.setRoll_id(litlrd.get(0).getRoll_id());//轧辊号 ??
+				//ilrld1.setRoll_pos(litlrd.get(0).getReserve());//轧辊位置(T:上辊、B:下辊) ??
+				ilrld1.setRoll_pos("T");//轧辊位置(T:上辊、B:下辊) ??
+				ilrld1.setReserve(litlrd.get(0).getReserve());//预留
+				this.getMapper(IfRoll01L2RllLoadDMapper.class).insert(ilrld1);
+				IfRoll01L2RllLoadD ilrld2=new IfRoll01L2RllLoadD();
+				ilrld2.setSerial_no(v_serial_no);//记录号(由业务接口创建,唯一标识消息)
+				ilrld2.setRoll_id(litlrd.get(1).getRoll_id());//轧辊号 ??
+				//ilrld2.setRoll_pos(litlrd.get(1).getReserve());//轧辊位置(T:上辊、B:下辊) ??
+				ilrld2.setRoll_pos("B");//轧辊位置(T:上辊、B:下辊) ??
+				ilrld2.setReserve(litlrd.get(1).getReserve());//预留
+				this.getMapper(IfRoll01L2RllLoadDMapper.class).insert(ilrld2);
+			}
+			
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用L2装辊实绩处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2RllLoad_d(v_mch_code,v_rec_l2_rll_load,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_rll_load.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 记录号 SERIAL_NO {"+v_rec_l2_rll_load.getSerial_no()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2RllLoad",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	  	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2RllLoad 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_RLL_LOAD(L2装辊实绩记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_rll_load
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2RllLoad_d(String v_mch_code,
+			IfRoll01L2RllLoad v_rec_l2_rll_load, String v_message) throws Exception{
+		Integer v_cnt=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--此电文需要轧辊管理功能完成后,再具体实现,先搭起此代码框架  ??
+			//执行上机操作
+			
+			/**
+			 * 动作处理_上机按钮
+			 * object:
+			 * mount_time:上机时间    比如:2018-11-27 09:11:43
+			 * mount_reason_code:上机原因代码(390203%)
+			 * mount_reason_desc:上机原因描述
+			 * stand_id:机架号
+			 * mount_memo:上机备注
+			 * 
+			 * memo1:配辊记录号
+			 * */
+			CommonPage<DevRollerPairM> sum=new CommonPage<>();
+		    sum.setObject(new DevRollerPairM());
+			
+			try {
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_rll_load.getMount_time());
+				sum.getObject().setMount_time(li.get(0).getCreate_time());
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			if(sum.getObject().getMount_time()==null){
+				sum.getObject().setMount_time(new Date());
+			}
+			sum.getObject().setMount_reason_code(v_rec_l2_rll_load.getReason_code());
+			sum.getObject().setMount_ord(v_rec_l2_rll_load.getShift());
+			sum.getObject().setMount_grp(v_rec_l2_rll_load.getCrew());
+			sum.getObject().setRoller_type(v_rec_l2_rll_load.getRoll_type());
+			if(v_rec_l2_rll_load.getStand_id()!=null){
+				sum.getObject().setStand_id(v_rec_l2_rll_load.getStand_id()+"");
+			}
+			sum.getObject().setMount_memo("收集L2装辊实绩信息");
+			List<IfRoll01L2RllLoadD> litlrd = v_rec_l2_rll_load.getMount_roll();
+			if(litlrd!=null && litlrd.size()>1){
+				DevRollerPairM drpm=new DevRollerPairM();
+				DevRollerInfo dri0 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(0).getRoll_id());
+				DevRollerInfo dri1 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(1).getRoll_id());
+				if(litlrd.get(0).getRoll_id()!=null && !"".equals(litlrd.get(0).getRoll_id()) &&
+						litlrd.get(1).getRoll_id()!=null && !"".equals(litlrd.get(1).getRoll_id()) &&	
+					dri0!=null && dri1!=null && dri0.getRoller_no()!=null && dri1.getRoller_no()!=null){
+					DevRollerInfo dri0T=new DevRollerInfo();
+					dri0T.setRoller_no(litlrd.get(0).getRoll_id());
+					dri0T.setRoller_position("T");
+					this.getMapper(DevRollerInfoMapper.class).update(dri0T);
+					DevRollerInfo dri1B=new DevRollerInfo();
+					dri1B.setRoller_no(litlrd.get(1).getRoll_id());
+					dri1B.setRoller_position("B");
+					this.getMapper(DevRollerInfoMapper.class).update(dri1B);
+					
+					if("T".equals(dri0.getRoller_position())){
+						drpm.setT_roller_no(dri0.getRoller_no());
+					}else if("B".equals(dri0.getRoller_position())){
+						drpm.setB_roller_no(dri0.getRoller_no());
+					}
+					if("T".equals(dri1.getRoller_position())){
+						drpm.setT_roller_no(dri1.getRoller_no());
+					}else if("B".equals(dri1.getRoller_position())){
+						drpm.setB_roller_no(dri1.getRoller_no());
+					}
+					if(drpm.getT_roller_no()!=null && drpm.getB_roller_no()!=null){
+						drpm.setStatus("1");//配对状态,进行上机操作
+						drpm.setMachine_code("M0008");
+						List<DevRollerPairM> ldrpm = this.getMapper(DevRollerPairMMapper.class).find(drpm, 0, 0);
+//						if(ldrpm==null || ldrpm.size()<=0){
+//							try{
+//								CommonPage<DevRollerInfo> sumxx=new CommonPage<DevRollerInfo>();
+//								sumxx.setMemo2("1");//机架号
+//								sumxx.setMemo3(dri0.getRoller_no());//上辊编号
+//								sumxx.setMemo4(dri1.getRoller_no());//下辊编号
+//								this.getBean(DevRollerPairDServiceImpl.class).doRollerPairWeb(sumxx);
+//							}catch(Exception e){
+//								e.printStackTrace();
+//							}
+//						}
+						if(ldrpm!=null && ldrpm.size()>0){
+							sum.setMemo1(ldrpm.get(0).getSerial_no());
+							this.getBean(DevRollerPairMServiceImpl.class).doRollerPairUpWeb(sum);
+						}
+					}
+					
+				}
+				
+			}
+			
+			//--(4)、提交事务
+			v_message="Roll01L2RllLoad L2装辊实绩电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2RllLoad L2装辊实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2RllLoad L2装辊实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2换辊实绩电文时调用;																																							
+		2)、	此接口参数为“L2换辊实绩电文JSON对象”(电文编号:DR3E14);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Roll01L2RllRmv(IfRoll01L2RllRmv json){
+		String v_message="";
+		String v_mch_code="M0008";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_rll_rmv 代替描述
+		IfRoll01L2RllRmv v_rec_l2_rll_rmv=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-轧机_L2_换辊实绩为空";
+			return v_message;
+		}
+		//--(1.0)、创建L2装辊实绩表记录号
+		Long v_serial_no=this.getMapper(IfRoll01L2RllRmvMapper.class).doQuery1();
+		//--(1.0.0)、赋值
+		v_rec_l2_rll_rmv.setSerial_no(v_serial_no);
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_rll_rmv.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_rll_rmv.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入 L2换辊实绩表 以及 L2换辊实绩表-上下辊表(单独的事务)																																							
+		//  --(1.2.1)、此电文需要拆分为 主从表(1:2),其中上下辊为子表(编码时注意处理)																																							
+		try{
+			this.getMapper(IfRoll01L2RllRmvMapper.class).insert(v_rec_l2_rll_rmv);
+			//轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊)
+			if(v_rec_l2_rll_rmv.getRoll_type()!=null){
+				//W:工作辊、B:支承辊、I:中间辊)
+				if(v_rec_l2_rll_rmv.getRoll_type().equals("WKR")){
+					v_rec_l2_rll_rmv.setRoll_type("W");
+				}else if(v_rec_l2_rll_rmv.getRoll_type().equals("BUR")){
+					v_rec_l2_rll_rmv.setRoll_type("B");
+				}else if(v_rec_l2_rll_rmv.getRoll_type().equals("IMR")){
+					v_rec_l2_rll_rmv.setRoll_type("I");
+				}
+			}
+			
+			
+			
+			List<IfRoll01L2RllRmvD> litlrd = v_rec_l2_rll_rmv.getDismount_roll();
+			if(litlrd!=null && litlrd.size()>1){
+				IfRoll01L2RllRmvD ilrld1=new IfRoll01L2RllRmvD();
+				ilrld1.setSerial_no(v_serial_no);//记录号(由业务接口创建,唯一标识消息)
+				ilrld1.setRoll_id(litlrd.get(0).getRoll_id());//轧辊号 ??
+				DevRollerInfo dri0 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(0).getRoll_id());
+				ilrld1.setRoll_pos(dri0==null?"":"T");//轧辊位置(T:上辊、B:下辊) ??
+				ilrld1.setRolled_length(litlrd.get(0).getRolled_length());//轧制公里数(km)??
+				ilrld1.setRolled_weight(litlrd.get(0).getRolled_weight());//轧制量(t)
+				ilrld1.setRolled_time(litlrd.get(0).getRolled_time());//生产时间(hours)
+			    ilrld1.setReserve(litlrd.get(0).getReserve());//预留
+				this.getMapper(IfRoll01L2RllRmvDMapper.class).insert(ilrld1);
+				
+				IfRoll01L2RllRmvD ilrld2=new IfRoll01L2RllRmvD();
+				ilrld2.setSerial_no(v_serial_no);//记录号(由业务接口创建,唯一标识消息)
+				ilrld2.setRoll_id(litlrd.get(1).getRoll_id());//轧辊号 ??
+				DevRollerInfo dri1 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(1).getRoll_id());
+				ilrld2.setRoll_pos(dri1==null?"":"B");//轧辊位置(T:上辊、B:下辊) ??
+				ilrld2.setRolled_length(litlrd.get(1).getRolled_length());//轧制公里数(km)??
+				ilrld2.setRolled_weight(litlrd.get(1).getRolled_weight());//轧制量(t)
+				ilrld2.setRolled_time(litlrd.get(1).getRolled_time());//生产时间(hours)
+			    ilrld2.setReserve(litlrd.get(1).getReserve());//预留
+				this.getMapper(IfRoll01L2RllRmvDMapper.class).insert(ilrld2);
+			}
+			
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用L2换辊实绩处理函数
+		try{
+			v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L2RllRmv_d(v_mch_code,v_rec_l2_rll_rmv,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_rll_rmv.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 记录号 SERIAL_NO {"+v_rec_l2_rll_rmv.getSerial_no()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfRoll01LogMapper.class).doInsert(null,"Roll01L2RllRmv",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Roll01L2RllRmv 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_RLL_RMV(L2换辊实绩记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_rll_rmv
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L2RllRmv_d(String v_mch_code,
+			IfRoll01L2RllRmv v_rec_l2_rll_rmv, String v_message) throws Exception{
+		Integer v_cnt=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--此电文需要轧辊管理功能完成后,再具体实现,先搭起此代码框架  ??
+			//下机操作
+			/**
+			 * 动作处理_下机按钮
+			 * object:
+			 * dismount_time:下机时间    比如:2018-11-27 09:11:43
+			 * dismount_reason_code:下机原因代码(390203%)
+			 * dismount_reason_desc:下机原因描述
+			 * rll_num:轧制卷数
+			 * rll_len:轧制里程数(km)
+			 * rll_wgt:轧制吨数(吨)
+			 * dismount_memo:下机备注
+			 * 
+			 * memo1:配辊记录号
+			 * */
+			
+			CommonPage<DevRollerPairM> sum=new CommonPage<>();
+		    sum.setObject(new DevRollerPairM());
+			
+			try {
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_rll_rmv.getDismount_time());
+				sum.getObject().setDismount_time(li.get(0).getCreate_time());
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			if(sum.getObject().getDismount_time()==null){
+				sum.getObject().setDismount_time(new Date());
+			}
+			sum.getObject().setDismount_reason_code(v_rec_l2_rll_rmv.getReason_code());
+			sum.getObject().setDismount_ord(v_rec_l2_rll_rmv.getShift());
+			sum.getObject().setDismount_grp(v_rec_l2_rll_rmv.getCrew());
+			sum.getObject().setRoller_type(v_rec_l2_rll_rmv.getRoll_type());
+			if(v_rec_l2_rll_rmv.getStand_id()!=null){
+				sum.getObject().setStand_id(v_rec_l2_rll_rmv.getStand_id()+"");
+			}
+			sum.getObject().setDismount_memo("收集L2换辊实绩信息");
+			
+			List<IfRoll01L2RllRmvD> litlrd = v_rec_l2_rll_rmv.getDismount_roll();
+			if(litlrd!=null && litlrd.size()>1){
+				sum.getObject().setRll_len(litlrd.get(0).getRolled_length()==null?null:strToLong(litlrd.get(0).getRolled_length()).doubleValue());
+				//sum.getObject().setRll_num(litlrd.get(0).get);// ??轧制卷数
+				sum.getObject().setRll_wgt(litlrd.get(0).getRolled_weight()==null?null:strToLong(litlrd.get(0).getRolled_weight()).doubleValue());
+				DevRollerPairM drpm=new DevRollerPairM();
+				DevRollerInfo dri0 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(0).getRoll_id());
+				DevRollerInfo dri1 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(1).getRoll_id());
+				if(litlrd.get(0).getRoll_id()!=null && !"".equals(litlrd.get(0).getRoll_id()) &&
+						litlrd.get(1).getRoll_id()!=null && !"".equals(litlrd.get(1).getRoll_id()) &&	
+						dri0!=null && dri1!=null && dri0.getRoller_no()!=null && dri1.getRoller_no()!=null){
+					DevRollerInfo dri0T=new DevRollerInfo();
+					dri0T.setRoller_no(litlrd.get(0).getRoll_id());
+					dri0T.setRoller_position("T");
+					this.getMapper(DevRollerInfoMapper.class).update(dri0T);
+					DevRollerInfo dri1B=new DevRollerInfo();
+					dri1B.setRoller_no(litlrd.get(1).getRoll_id());
+					dri1B.setRoller_position("B");
+					this.getMapper(DevRollerInfoMapper.class).update(dri1B);
+					
+					
+					if("T".equals(dri0.getRoller_position())){
+						drpm.setT_roller_no(dri0.getRoller_no());
+					}else if("B".equals(dri0.getRoller_position())){
+						drpm.setB_roller_no(dri0.getRoller_no());
+					}
+					if("T".equals(dri1.getRoller_position())){
+						drpm.setT_roller_no(dri1.getRoller_no());
+					}else if("B".equals(dri1.getRoller_position())){
+						drpm.setB_roller_no(dri1.getRoller_no());
+					}
+					if(drpm.getT_roller_no()!=null && drpm.getB_roller_no()!=null){
+						drpm.setStatus("2");//上机状态,进行下机操作
+						drpm.setMachine_code("M0008");
+						List<DevRollerPairM> ldrpm = this.getMapper(DevRollerPairMMapper.class).find(drpm, 0, 0);
+						if(ldrpm!=null && ldrpm.size()>0){
+							sum.setMemo1(ldrpm.get(0).getSerial_no());
+							this.getBean(DevRollerPairMServiceImpl.class).doRollerPairDownWeb(sum);
+						}
+					}
+					
+				}
+				
+			}
+			
+			//--(4)、提交事务
+			v_message="Roll01L2RllRmv L2换辊实绩电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L2RllRmv L2换辊实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L2RllRmv L2换辊实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由“轧机作业管理-【下发PDI按钮】”方法 Roll01L3SendPdi 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_PLAN_NO(作业计划号)、V_ENTRY_COIL_NO(入口卷号)、V_OPR_NAME(操作人)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param memo1
+	 * @param schedule_no
+	 * @param material_no
+	 * @param userName
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L3SendPdi_d(String v_mch_code, String v_plan_no,
+			String v_entry_coil_no, String v_opr_name, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		try{
+			//  --(1.1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证作业计划号不为空
+			if(v_plan_no==null || "".equals(v_plan_no)){
+				v_message="未指定作业计划号!";
+				return v_message;
+			}
+			//--(1.4)、验证入口卷号不为空
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_message="未指定入口卷号!";
+				return v_message;
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.1)、验证入口卷对应的作业计划信息存在  																																							
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount6(v_mch_code, v_plan_no,v_entry_coil_no);
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+				return v_message;
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+				return v_message;
+			}else{
+				List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//--(2.2)、验证入口卷对应的库存明细存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_entry_coil_no+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="入口卷号{"+v_entry_coil_no+"}库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=v_rec_ydm_d_list.get(0);
+			//--(2.3)、验证入口卷对应的虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+						"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"' and object_no='"+v_rec_pln_d.getObject_no()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="入口卷号{"+v_entry_coil_no+"} 虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//出口目标
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getRl_plan_no()+"} 入口卷号{"+v_entry_coil_no+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_out=v_rec_mtr_out_list.get(0);
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BRL02".equals(v_rec_pln_d.getStatus()) || "5BRL03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			//  --(2.4)、验证当前还未生产交工
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_plan_no);
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+				MesRcmM v_rec_Roll_m  =lmcam.get(0);
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_plan_no+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工,不能重复下发PDI!";
+			    	return v_message;
+			    }
+			}
+			//  --(3)、获取其它相关信息,注意忽略错误  																																							
+			//  --(3.1)、获取牌号/钢种名称	
+			String v_steel=null;
+			List<ComBaseSteel> lcbs = this.getMapper(ComBaseSteelMapper.class).findWithCondition(null, "steel_code='"+v_rec_ydm_d.getSteelcode()+"'", null, 0, 0);
+			if(lcbs==null || lcbs.size()<=0){
+				v_steel=v_rec_ydm_d.getSteelcode();
+			}else{
+				if(lcbs.get(0).getSteel_name()==null){
+					v_steel=lcbs.get(0).getSteel_code();
+				}else{
+					v_steel=lcbs.get(0).getSteel_name();
+				}
+			}
+			//退火后进行轧制的,下发PDI,牌号需要加"-T"
+			if (v_entry_coil_no.contains("T")) {
+				v_steel = v_steel + "-T"; 
+			}
+			
+			//--(3.2)、获取入口卷库位
+			String v_entry_location=this.getMapper(MesCrAnnealMMapper.class).doQueryLocation(v_entry_coil_no);
+			if(v_entry_location==null){
+				v_entry_location="";
+			}
+			IfRoll01L3Pdi v_rec_pdi=new IfRoll01L3Pdi();
+			//  --(4)、调用PDI数据下发函数																																							
+			//  --(4.1)、PDI数据属性赋值(注意:记录号、下发时间、下发人,到调用接函数内才赋值)																																							
+			  v_rec_pdi.setEntry_coil_no        ( v_entry_coil_no);// --入口卷号																																							
+			  v_rec_pdi.setExit_coil_no         ( v_entry_coil_no);// --出口卷号																																							
+			  v_rec_pdi.setEntry_coil_source    ( "1");// --入口卷来源(0:自产、1:外购)																																							
+			  v_rec_pdi.setPlan_no              ( v_rec_pln_d.getRl_plan_no());// --计划号	
+			  //List<PlnProdorder> v_rec_prod = this.getMapper(PlnProdorderMapper.class).findWithCondition(null, "prod_order_no='"+v_rec_mtr_in.getProd_order_no()+"'", null, 0, 0);
+			  //v_rec_pdi.setCustomer(v_rec_prod.get(0).getCustomer_name());
+			  //v_rec_pdi.setCustomer("下游客户");
+			  v_rec_pdi.setSupplier(null);//原料供应商
+			  if(v_rec_ydm_d.getLength()!=null){
+				  Double len=v_rec_ydm_d.getLength()/1000;
+				  v_rec_pdi.setEntry_length(longToString(len.longValue()));//来料长度
+			  }
+			  v_rec_pdi.setEntry_crown(null);//来料凸度
+			  
+			  
+			  
+			  if(v_rec_ydm_d.getThick()!=null){
+				  Double thick=v_rec_ydm_d.getThick()*1000;
+				  v_rec_pdi.setEntry_thichness( longToString(v_rec_ydm_d.getThick()==null?null:thick.longValue()));// --入口热卷厚度(um)
+			  }
+			  //出口厚度 
+			  if (v_rec_pln_d.getThick()==null) {
+				  v_rec_pdi.setExit_thickness(v_rec_mtr_out.getThick()+"");
+			  }else {
+				  v_rec_pdi.setExit_thickness(v_rec_pln_d.getThick()+"");
+			  }
+			  //v_rec_pdi.setExit_thickness(v_rec_mtr_out.getThick()==null?"":(v_rec_mtr_out.getThick()+""));
+			  
+			  v_rec_pdi.setEntry_width          ( longToString(v_rec_ydm_d.getWidth()==null?null:v_rec_ydm_d.getWidth().longValue()));// --入口热卷宽度(mm)																																							
+			  v_rec_pdi.setEntry_weight         ( longToString(v_rec_ydm_d.getFactweight()==null?null:v_rec_ydm_d.getFactweight().longValue()));// --入口热卷重量(kg)																																							
+			  v_rec_pdi.setInner_diameter       ( longToString(v_rec_ydm_d.getDiameter_inn()==null?null:v_rec_ydm_d.getDiameter_inn().longValue()));// --入口热卷内径(mm)																																							
+			  v_rec_pdi.setOuter_diameter       ( longToString(v_rec_ydm_d.getDiameter_out()==null?null:v_rec_ydm_d.getDiameter_out().longValue()));// --入口热卷外径(mm)																																							
+			  v_rec_pdi.setHarderness_annealing ( null);// --退火后硬度																																							
+			  v_rec_pdi.setTemp_annealing       ( null);// --退火温度(℃)																																							
+			  v_rec_pdi.setSpm_mode             ( "1");// --平整模式(0:平整、1:轧制),需要生产或质量提供接口																																							
+			  v_rec_pdi.setSpm_elong            ( null);// --平整伸长率(0.01%,e.g. 255 => 2.55 %  ,平整模式),需要生产或质量提供接口																																							
+			  v_rec_pdi.setReduce               ( null);// --压下率(%),需要生产或质量提供接口																																							
+			  v_rec_pdi.setSleeve               ( "0");// --套筒(0:无、1:有),需要生产或质量提供接口																																							
+			  v_rec_pdi.setOuter_dia_sleeve     ( null);// --出口套筒外径(520~600),需要生产或质量提供接口																																							
+			  v_rec_pdi.setWeight_sleeve        ( null);// --套筒重量(kg),需要生产或质量提供接口																																							
+			  v_rec_pdi.setGb_steel_grade       ( v_steel);// --国标钢种																																							
+			  v_rec_pdi.setSteel_grade          ( v_steel);// --钢种																																							
+			  v_rec_pdi.setPreced_process_code  ( "");// --上道工序代码																																							
+			  v_rec_pdi.setNext_process_code    ( "");// --后道工序代码																																							
+			  v_rec_pdi.setComment              ( "");// --备注信息																																							
+			  //v_rec_pdi.setExit_yard_location   ( "test_loc");// --出口库位																																							
+			  //v_rec_pdi.setEntry_yard_location  ( v_entry_location);// --入口库位																																							
+			  v_rec_pdi.setReserve1              ( v_rec_ydm_d.getMaterailcoilno());// --预留	
+			  try{
+			  ResultModel getElementsInfo = this.getBean(QmsApiServiceImpl.class).GetElementsInfo(v_rec_ydm_d.getMaterailcoilno());
+			  if(getElementsInfo!=null && getElementsInfo.getData()!=null){
+				  List<QcmJhyElements> qje=(List)getElementsInfo.getData();
+				  if(qje!=null && qje.size()>0){
+					  for(QcmJhyElements qjed:qje){
+						  //v_rec_pdi.setAlloy_components_avai(alloy_components_avai);
+						  if("Als".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_als(qjed.getChem_value());
+						  }else if("Alt".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_alt(qjed.getChem_value());
+						  }else if("As".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_as(qjed.getChem_value());
+						  }else if("B".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_b(qjed.getChem_value());
+						  }else if("Bi".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_bi(qjed.getChem_value());
+						  }else if("C".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_c(qjed.getChem_value());
+						  }else if("Ca".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_ca(qjed.getChem_value());
+						  }else if("Cd".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_cd(qjed.getChem_value());
+						  }else if("Cr".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_cr(qjed.getChem_value());
+						  }else if("Cu".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_cu(qjed.getChem_value());
+						  }else if("Fe".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_fe(qjed.getChem_value());
+						  }else if("La".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_la(qjed.getChem_value());
+						  }else if("Mn".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_mn(qjed.getChem_value());
+						  }else if("Mo".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_mo(qjed.getChem_value());
+						  }else if("N".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_n(qjed.getChem_value());
+						  }else if("Nb".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_nb(qjed.getChem_value());
+						  }else if("Ni".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_ni(qjed.getChem_value());
+						  }else if("P".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_p(qjed.getChem_value());
+						  }else if("Pb".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_pb(qjed.getChem_value());
+						  }else if("S".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_s(qjed.getChem_value());
+						  }else if("Sb".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_sb(qjed.getChem_value());
+						  }else if("Se".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_se(qjed.getChem_value());
+						  }else if("Si".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_si(qjed.getChem_value());
+						  }else if("Sn".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_sn(qjed.getChem_value());
+						  }else if("Ti".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_ti(qjed.getChem_value());
+						  }else if("V".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_v(qjed.getChem_value());
+						  }else if("W".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_w(qjed.getChem_value());
+						  }else if("Zn".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_zn(qjed.getChem_value());
+						  }else if("Zr".equals(qjed.getChem_name())){
+							  v_rec_pdi.setCa_zr(qjed.getChem_value());
+						  }
+						  
+					  }
+				  }
+			  }
+			  }catch(Exception e){
+				  e.printStackTrace();
+			  }
+			  
+			  
+			  //测试内容:
+//			   v_rec_pdi.setCa_c("0.45601");
+//			   v_rec_pdi.setCa_mn("0.002");
+			  try{
+				  Integer v_success=null;
+				  v_message=this.getBean(MesApiRollPdiPdoImpl.class).Roll01L3Pdi(v_rec_pdi,v_opr_name,v_success,v_message);
+			  }catch(Exception e){
+				  e.printStackTrace();
+				  v_message=e.getMessage();
+			  }
+			  if(v_message==null){
+					v_message="";
+			  }
+			 String v_success_str="";
+			 if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			 }
+			 if("1".equals(v_success_str)){
+				 //v_message="PDI数据下发成功!"+v_message;
+			 }else if("2".equals(v_success_str)){
+				 v_message="PDI数据下发部分成功!"+v_message;
+			 }else{
+				 //v_message="PDI数据下发失败!"+v_message;
+			 }
+			
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Roll01L3SendPdi_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Roll01L3SendPdi_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由“轧机作业管理-【撤销PDI按钮】”方法 Roll01L3Revoke 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_PLAN_NO(作业计划号)、V_ENTRY_COIL_NO(入口卷号)、V_OPR_NAME(操作人)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param memo1
+	 * @param schedule_no
+	 * @param material_no
+	 * @param userName
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L3Revoke_d(String v_mch_code, String v_plan_no,
+			String v_entry_coil_no, String v_opr_name, Integer v_success,
+			String v_message) throws Exception{
+		//--(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		Integer v_cnt=null;
+		Integer v_flag=null;
+		//PlnRollingPlanDetail v_rec_pln_d=new PlnRollingPlanDetail();
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证作业计划号不为空
+			if(v_plan_no ==null || "".equals(v_plan_no)){
+				v_message="未指定作业计划号!";
+				return v_message;
+			}
+			//  --(1.4)、验证入口卷号不为空
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_message="未指定入口卷号!";
+				return v_message;
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.1)、验证入口卷对应的作业计划信息存在																																							
+			v_cnt=this.getMapper(PlnRollingPlanMapper.class).doCount6(v_mch_code,v_plan_no,v_entry_coil_no);
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+				return v_message;
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+				return v_message;
+			}else{
+				//List<PlnRollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnRollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+				//v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、验证已下发过PDI   切记???
+//			if(v_rec_pln_d.getSend_flag()==null || "0".equals(v_rec_pln_d.getSend_flag())){
+//				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_plan_no+"} 入口卷号{"+v_entry_coil_no+"} 还未下发指示顺序或PDI数据!";
+//				return v_message;
+//			}
+			//  --(2.3)、验证当前还未生产交工
+			MesRcmM mCross = new MesRcmM();
+			mCross.setSchedule_no(v_plan_no);
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesRcmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesRcmM> lmcam = this.getMapper(MesRcmMMapper.class).find(mCross, 0, 0);
+			    MesRcmM v_rec_Roll_m =lmcam.get(0);
+			    if("1".equals(v_rec_Roll_m.getHand_over_status())){
+			    	v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_plan_no+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工,不能撤销PDI!";
+			    	return v_message;
+			    }
+			}
+			
+			//撤销PDI实体类
+			IfRoll01L3Revoke itl=new IfRoll01L3Revoke();
+			itl.setSend_time(new Date());
+			itl.setSend_opr(v_opr_name);//注意L2是否扛得住?
+			itl.setEntry_coil_no(v_entry_coil_no);
+			
+			v_flag=0;//--无接口调试时,设置1,直接跳过,否则设置为0
+			//--(3)、调用公司接口,将“L3指示删除”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(itl,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_ORDERDELE);
+				String url = ROLLPDI_ORDERDELE;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3指示删除电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发L3指示删除电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发L3指示删除电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发L3指示删除电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			// --(3.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Roll01L3Revoke L3指示删除电文发送失败!"+v_message;
+				return v_message;
+			}
+			//  --(4)、开始事物:																																							
+			//  --(4.1)、插入接口记录表相关信息																																							
+			this.getMapper(IfRoll01L3RevokeMapper.class).insert(itl);
+			
+			// 撤销pdi的时候将send_flag值改回 0:20240701
+			this.getMapper(PlnRollingPlanDetailMapper.class).doUpDelPdiStatus(v_plan_no, v_entry_coil_no);
+			
+			//--(5)、提交事务
+			//唯一标示操作成功的地方
+			v_success=1;
+			v_message="Roll01L3Revoke L3指示删除电文发送成功!入口卷号{"+v_entry_coil_no+"}";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3Revoke L3指示删除电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3Revoke L3指示删除电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3Revoke L3指示删除电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3Revoke L3指示删除电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+	    1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由“轧辊配辊管理-【发送配辊信息至L2】(待设计开发)”方法 Roll01L3Roller 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_PAIR_NO(配辊编号)、V_ROLL_TYPE(轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊))、V_OPR_NAME(操作人)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param memo1
+	 * @param schedule_no
+	 * @param material_no
+	 * @param userName
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Roll01L3Roller_d(String v_mch_code, String v_pair_no,
+			String v_roll_type, String v_opr_name,String v_message) throws Exception{
+		Integer v_cnt=null;
+		Integer v_flag=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证配辊编号不为空
+			if(v_pair_no ==null || "".equals(v_pair_no)){
+				v_message="未指定配辊编号!";
+				return v_message;
+			}
+			//--轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊)
+			if(v_roll_type==null || "".equals(v_roll_type)){
+				v_message="未指定轧辊类型!";
+				return v_message;
+			}
+			
+			List<DevRollerPairM> ldbgg = this.getMapper(DevRollerPairMMapper.class).findWithCondition(null, "serial_no='"+v_pair_no+"'", null, 0, 0);
+			DevRollerPairM v_rec_grd = ldbgg.get(0);
+			DevRollerPairD t_drpd=new DevRollerPairD();
+			t_drpd.setSerial_no(v_rec_grd.getSerial_no());
+			//轧辊位置(T:上辊、B:下辊)
+			t_drpd.setRoller_position("T");
+			List<DevRollerPairD> t_drpd_list = this.getMapper(DevRollerPairDMapper.class).find(t_drpd,0,0);
+			
+			DevRollerPairD b_drpd=new DevRollerPairD();
+			b_drpd.setSerial_no(v_rec_grd.getSerial_no());
+			//轧辊位置(T:上辊、B:下辊)
+			b_drpd.setRoller_position("B");
+			List<DevRollerPairD> b_drpd_list = this.getMapper(DevRollerPairDMapper.class).find(b_drpd,0,0);
+			
+			IfRollRollerView itrv=new IfRollRollerView();
+			IfRoll01L3Roller v_rec_roller=new IfRoll01L3Roller();
+			IfRoll01L3RollerD v_rec_roller_t=new IfRoll01L3RollerD();
+			IfRoll01L3RollerD v_rec_roller_b=new IfRoll01L3RollerD();
+			//2019-03-01
+			Long max_serial_no=this.getMapper(IfRoll01L3RollerMapper.class).doQuery1();
+			v_rec_roller.setSerial_no(max_serial_no);
+				
+			
+			
+			//--(4)、轧辊数据属性赋值
+			v_rec_roller.setArea_id("1");//--轧辊区域(1:冷轧钢、2:平整)
+			v_rec_roller.setStand_id(longToString(Long.parseLong(v_rec_grd.getStand_id())));
+			v_rec_roller.setRoll_type(v_rec_grd.getRoller_type());
+			itrv.setArea_id("1");//--轧辊区域(1:冷轧钢、2:平整)
+			itrv.setStand_id(longToString(Long.parseLong(v_rec_grd.getStand_id())));
+			//轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊)
+			if(v_rec_grd.getRoller_type()!=null){
+				//W:工作辊、B:支承辊、L:中间辊)
+				if(v_rec_grd.getRoller_type().equals("W")){
+					itrv.setRoll_type("WKR");
+				}else if(v_rec_grd.getRoller_type().equals("B")){
+					itrv.setRoll_type("BUR");
+				}else if(v_rec_grd.getRoller_type().equals("L")){
+					itrv.setRoll_type("IMR");
+				}
+			}
+			
+			
+			//v_rec_roller_t.setSerial_no(Long.parseLong(t_drpd_list.get(0).getSerial_no().substring(1)));
+			v_rec_roller_t.setSerial_no(max_serial_no);
+			v_rec_roller_t.setRoll_pos(t_drpd_list.get(0).getRoller_position());
+			v_rec_roller_t.setRoll_id(t_drpd_list.get(0).getRoller_no());
+			if(t_drpd_list.get(0).getDia_current()!=null){
+				Double dia_current=t_drpd_list.get(0).getDia_current()*1000;
+				v_rec_roller_t.setDiameter(longToString(dia_current.longValue()));  //直径(10^-3 mm)
+			}
+			if(t_drpd_list.get(0).getConvexity()!=null){
+				Double convexity=t_drpd_list.get(0).getConvexity()*1000;
+				v_rec_roller_t.setCrown(longToString(convexity.longValue()));//微米
+			}
+			if(t_drpd_list.get(0).getCone_len()!=null){
+				v_rec_roller_t.setL_cone(longToString(t_drpd_list.get(0).getCone_len().longValue()));
+			}
+			if(t_drpd_list.get(0).getCone_hgt()!=null){
+				Double cone_hgt=t_drpd_list.get(0).getCone_hgt()*1000;
+				v_rec_roller_t.setH_cone(longToString(cone_hgt.longValue()));
+			}
+			if(t_drpd_list.get(0).getRoughness()!=null){
+				Double roughness=t_drpd_list.get(0).getRoughness();
+				v_rec_roller_t.setRoughness(longToString(roughness.longValue()));
+			}
+			//v_rec_roller_t.setProperty_class(t_drpd_list.get(0).getMaterial_code());//PROPERTY_CLASS材质代码(0:光棍、1:毛辊)
+			
+			//v_rec_roller_b.setSerial_no(Long.parseLong(b_drpd_list.get(0).getSerial_no().substring(1)));
+			v_rec_roller_b.setSerial_no(max_serial_no);
+			v_rec_roller_b.setRoll_pos(b_drpd_list.get(0).getRoller_position());
+			v_rec_roller_b.setRoll_id(b_drpd_list.get(0).getRoller_no());
+			if(b_drpd_list.get(0).getDia_current()!=null){
+				Double dia_current=b_drpd_list.get(0).getDia_current()*1000;
+				v_rec_roller_b.setDiameter(longToString(dia_current.longValue()));  //直径(10^-3 mm)
+			}
+			if(b_drpd_list.get(0).getConvexity()!=null){
+				Double convexity=b_drpd_list.get(0).getConvexity()*1000;
+				v_rec_roller_b.setCrown(longToString(convexity.longValue()));//微米
+			}
+			if(b_drpd_list.get(0).getCone_len()!=null){
+				v_rec_roller_b.setL_cone(longToString(b_drpd_list.get(0).getCone_len().longValue()));
+			}
+			if(b_drpd_list.get(0).getCone_hgt()!=null){
+				Double cone_hgt=b_drpd_list.get(0).getCone_hgt()*1000;
+				v_rec_roller_b.setH_cone(longToString(cone_hgt.longValue()));
+			}
+			if(b_drpd_list.get(0).getRoughness()!=null){
+				Double roughness=b_drpd_list.get(0).getRoughness();
+				v_rec_roller_b.setRoughness(longToString(roughness.longValue()));
+			}
+			//v_rec_roller_b.setProperty_class(b_drpd_list.get(0).getMaterial_code());//PROPERTY_CLASS材质代码(0:光棍、1:毛辊)
+			
+			itrv.getRoll_data().add(v_rec_roller_t);
+			itrv.getRoll_data().add(v_rec_roller_b);
+			
+			
+//			//340.092  直径
+//			//340.08 
+//			IfRollRollerView itrv=new IfRollRollerView();
+//			List<IfRoll01L3RollerD> roll_data=new ArrayList<>();
+//			IfRoll01L3RollerD ifroll1=new IfRoll01L3RollerD();
+//			ifroll1.setRoll_id("234R134");
+//			ifroll1.setDiameter("340.092");
+//			IfRoll01L3RollerD ifroll2=new IfRoll01L3RollerD();
+//			ifroll2.setRoll_id("222R134");
+//			ifroll2.setDiameter("340.08");
+//			roll_data.add(ifroll1);
+//			roll_data.add(ifroll2);
+//			itrv.setArea_id("1");
+//			itrv.setRoll_data(roll_data);
+//			itrv.setStand_id("2");
+//			itrv.setRoll_type("WKR");
+			
+			//--(4.1)、置输出参数:操作成功标志为0:失败
+			v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0
+			//--(4.2)、调用公司接口,将“轧辊数据”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(itrv,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+ROLLPDI_ROLLING);
+				String url = ROLLPDI_ROLLING;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="轧辊数据电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发轧辊数据电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发轧辊数据电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发轧辊数据电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			
+			
+			// --(4.2.1)、电文发送失败(失败状态,根据接口提供定义确定)
+//			if(v_flag==0){
+//				v_message="Roll01L3Roller 轧辊数据电文发送失败!";
+//				return v_message;
+//			}
+//			//  --(5)、插入接口记录表相关信息																																							
+//			//  --(5.1)、开始事物:					
+//			try{
+//			//  --(5.1.1)、插入 IF_Roll01_L3_ROLLER 记录																																							
+//				this.getMapper(IfRoll01L3RollerMapper.class).insert(v_rec_roller);	
+//				//--(5.1.2)、插入 IF_Roll01_L3_ROLLER_D 上辊记录
+//				this.getMapper(IfRoll01L3RollerDMapper.class).insert(v_rec_roller_t);
+//				//--(5.1.3)、插入 IF_Roll01_L3_ROLLER_D 下辊记录
+//				this.getMapper(IfRoll01L3RollerDMapper.class).insert(v_rec_roller_b);
+//			}catch(Exception e){
+//				e.printStackTrace();
+//			}
+//			
+//			//--(5.1.4)、修改配辊记录表中,下发L2状态
+//			//状态(1:配对、2:上机、3:下机、0:拆卸)
+//			DevRollerPairM drpm=new DevRollerPairM();
+//			drpm.setSerial_no(v_rec_grd.getSerial_no());
+//			drpm.setSend_l2("1");
+//			drpm.setUpdate_opr(v_opr_name);
+//			drpm.setUpdate_time(new Date());
+//			this.getMapper(DevRollerPairMMapper.class).update(drpm);
+//			// --(6)、提交事务
+//			v_message="Roll01L3Roller 轧辊数据电文发送成功!记录号{"+v_rec_grd.getSerial_no()+"}";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(7)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(7.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3Roller 轧辊数据电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3Roller 轧辊数据电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Roll01L3Roller 轧辊数据电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Roll01L3Roller 轧辊数据电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	public String Roll01L2Pdileotest(IfRoll01L3Pdi json){
+		
+		return "测试内容76与66";
+	}
+	
+	
+	public void testgetObjectJson(){
+		IfRollRollerView itrv=new IfRollRollerView();
+//		itrv.setArea_id(111l);
+//		itrv.setStand_id(3l);
+//		itrv.setRoll_type("wtr");
+//		IfRoll01L3RollerD  d1=new IfRoll01L3RollerD();
+//		d1.setCrown(367l);
+//		d1.setL_cone(903l);
+//		d1.setRoll_pos("T");
+//		d1.setRoll_id("roid2018");
+//		IfRoll01L3RollerD  d2=new IfRoll01L3RollerD();
+//		d2.setCrown(367l);
+//		d2.setL_cone(903l);
+//		d2.setRoll_pos("B");
+//		d2.setRoll_id("roid2020");
+//		itrv.getRoll_data().add(d1);
+//		itrv.getRoll_data().add(d2);
+		
+		JsonConfig jsonConfig=new JsonConfig();
+		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+		jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+		JSONObject jsonObject=JSONObject.fromObject(itrv,jsonConfig);
+		System.out.println(jsonObject.toString());
+		/*
+		 {"roll_type":"wtr","stand_id":3,"area_id":111,"litlrd":[{"roll_pos":"T","l_cone":903,"diameter":"","roughness":"","reserve":"","roll_id":"roid2018","h_cone":"","property_class":"","serial_no":"","crown":367},{"roll_pos":"B","l_cone":903,"diameter":"","roughness":"","reserve":"","roll_id":"roid2020","h_cone":"","property_class":"","serial_no":"","crown":367}]}
+		 */
+	}
+	
+	public Long strToLong(String str){
+		if(str==null || "".equals(str.trim())){
+			return null;
+		}
+		return Long.parseLong(str);
+	}
+	
+	public String longToString(Long str){
+		if(str==null){
+			return null;
+		}
+		return str+"";
+	}
+	
+	public Double strToDouble(String str){
+		if(str==null || "".equals(str.trim())){
+			return null;
+		}
+		Double leo=null;
+		try{
+			leo=Double.parseDouble(str);
+		}catch(Exception ex){
+			return null;
+		}
+		return leo;
+	}
+	
+	public static void main(String[] args){
+		MesApiRollPdiPdoImpl marp=new MesApiRollPdiPdoImpl();
+		System.out.println(marp.strToLong("345"));//345
+		System.out.println(marp.strToDouble("00044.0000"));//44.0
+		System.out.println(marp.strToDouble("00032.1761"));//32.1761
+		System.out.println(marp.strToDouble("00000.0000"));//0.0
+		System.out.println(marp.strToDouble("750.00"));//750.0
+		System.out.println(marp.strToLong("000750"));//750
+		System.out.println(marp.strToDouble("000750"));//750.0
+		System.out.println(marp.strToLong("000750").doubleValue()/1000);//0.75
+		System.out.println(marp.strToDouble("750"));//750.0
+		System.out.println(marp.strToDouble("001225.0").doubleValue());//1225.0
+	}
+	
+	// 补零
+	public static String lpad(String str, int num, String pad) {
+		String n_str = str;
+		if (str == null && "".equals(str))
+			n_str = " ";
+		for (int i = str.length(); i < num; i++) {
+			n_str = pad + n_str;
+		}
+		return n_str;
+	}
+
+}

+ 1264 - 0
src/main/java/market/Api/Mes/impl/MesApiRollingPlanImpl.java

@@ -0,0 +1,1264 @@
+package market.Api.Mes.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import market.Api.Mes.service.MesApiRollingPlanService;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.vo.ComBaseInfo;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielInvalidMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielInvalid;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.MaterielTrack.mapper.PrcMaterielExtinfoMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielRelationMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielVtProcessMapper;
+import market.Mes.MaterielTrack.vo.PrcMaterielProcess;
+import market.Mes.MaterielTrack.vo.PrcMaterielRelation;
+import market.Mes.MaterielTrack.vo.PrcMaterielVtProcess;
+import market.Mes.OrderManager.Plan.mapper.PlnOrderStatisticMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderStatisticMapper;
+import market.Mes.OrderManager.Plan.vo.PlnOrderStatistic;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.OrderManager.Plan.vo.PlnProdorderStatistic;
+import market.Mes.Rolling.Design.mapper.PlnRlPlanStatisticMapper;
+import market.Mes.Rolling.Design.mapper.PlnRollingDsnMainMapper;
+import market.Mes.Rolling.Design.mapper.PlnRollingDsnMultinfoMapper;
+import market.Mes.Rolling.Design.vo.PlnRlPlanStatistic;
+import market.Mes.Rolling.Design.vo.PlnRollingDsnMain;
+import market.Mes.Rolling.Design.vo.PlnRollingDsnMultinfo;
+import market.Mes.Rolling.Performance.mapper.MesRcmMMapper;
+import market.Mes.Rolling.Performance.vo.MesRcmM;
+import market.Mes.Rolling.Plan.mapper.PlnRollingPlanDetailMapper;
+import market.Mes.Rolling.Plan.mapper.PlnRollingPlanMapper;
+import market.Mes.Rolling.Plan.vo.PlnRollingPlan;
+import market.Mes.Rolling.Plan.vo.PlnRollingPlanDetail;
+
+import org.springframework.beans.BeanUtils;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path = "MesApiRollingPlanService")
+public class MesApiRollingPlanImpl extends BaseServiceImpl implements MesApiRollingPlanService{
+
+	//--------------------------------轧制上料、下PDI Start----------------------------------------------------
+	
+		/**
+		 * 轧制上料接口 下PDI 验证
+		 * @throws Exception 
+		 * 其实都是单条操作
+		 */
+		public void MesRcmMAddValid(List<MesRcmM> oci) throws Exception{
+			//循环 根据(轧制计划号数组,虚拟物料号数组) 读取 轧制计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+			for(MesRcmM mcsm:oci){
+				PlnRollingPlanDetail plpd=new PlnRollingPlanDetail();
+				plpd.setRl_plan_no(mcsm.getSchedule_no());
+				plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+				//如果不存在,则报错退出“轧制计划[xxxxx][xx]信息不存在!”
+				List<PlnRollingPlanDetail> lppd=this.getMapper(PlnRollingPlanDetailMapper.class).find(plpd, 0, 0);
+				if(lppd==null||lppd.size()==0){
+					throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				PlnMaterielDetail M1=new PlnMaterielDetail();
+				//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+				M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+				List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+				if(lpmd==null||lpmd.size()==0){
+					throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+				M1=lpmd.get(0);
+				if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+					throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+				}
+				
+				//实际上只有一条
+				for(PlnRollingPlanDetail ppdc:lppd){
+					//判断轧制计划明细的状态【STATUS】
+					if(ppdc.getStatus().compareTo("5BRL02")>0){
+						throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]已上料,不能再次操作!");
+					}
+				}
+			}
+		}
+		/**
+		 * 轧制上料接口 下PDI
+		 * @throws Exception 
+		 * 其实都是单条操作
+		 */
+		public void MesRcmMAdd(List<MesRcmM> oci) throws Exception{
+			
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			
+			//循环 根据(轧制计划号数组,虚拟物料号数组) 读取 轧制计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+			for(MesRcmM mcsm:oci){
+				PlnRollingPlanDetail plpd=new PlnRollingPlanDetail();
+				plpd.setRl_plan_no(mcsm.getSchedule_no());
+				plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+				//如果不存在,则报错退出“轧制计划[xxxxx][xx]信息不存在!”
+				List<PlnRollingPlanDetail> lppd=this.getMapper(PlnRollingPlanDetailMapper.class).find(plpd, 0, 0);
+				if(lppd==null||lppd.size()==0){
+					throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				PlnMaterielDetail M1=new PlnMaterielDetail();
+				//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+				M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+				List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+				if(lpmd==null||lpmd.size()==0){
+					throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+				M1=lpmd.get(0);
+				if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+					throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+				}
+				
+				//实际上只有一条
+				for(PlnRollingPlanDetail ppdc:lppd){
+					//判断轧制计划明细的状态【STATUS】
+					if(ppdc.getStatus().compareTo("5BRL02")>0){
+						throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]已上料,不能再次操作!");
+					}
+					PrcMaterielProcess pmp=new PrcMaterielProcess();
+					pmp.setPrc_code("5BRL03");//新增的状态
+					
+					//这里的格式要和字符串日期的格式匹配,不然会抛出转换异常   
+					SimpleDateFormat  dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+					if (mcsm.getMemo() != null && !"".equals(mcsm.getMemo())) {
+						Date createdate = dateFormat.parse(mcsm.getMemo());
+						pmp.setCreate_time(createdate);
+					}else {
+						pmp.setCreate_time(new Date());
+					}
+					
+					
+					pmp.setObject_no(M1.getObject_no());
+					pmp.setCreate_man_name(userName);
+					pmp.setRemark(mcsm.getMemo());
+					//新增物料跟踪:
+					this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+					
+					//修改轧制计划明细表
+					PlnRollingPlanDetail plpdu=new PlnRollingPlanDetail();
+					plpdu.setStatus("5BRL03");
+					plpdu.setSerial_no(ppdc.getSerial_no());
+					this.getMapper(PlnRollingPlanDetailMapper.class).update(plpdu);
+				}
+				
+				//根据母卷号,查询对应的所有子卷信息
+				PlnMaterielDetail pmdq=new PlnMaterielDetail();
+				pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+				List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+				for(PlnMaterielDetail ppdc:lpmdc){
+					//修改各子卷的 状态 STATUS= 0PRL03; 
+					PlnMaterielDetail pmdu=new PlnMaterielDetail();
+					pmdu.setSerial_no(ppdc.getSerial_no());
+					pmdu.setStatus("0PRL03");
+					this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+					
+					//增加子卷的 虚拟物料履历表
+					this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(),"0PRL03",userName,new Date());
+				}
+				
+				//修改轧制计划主表
+				doUpdatePlnRollingPlan(mcsm.getSchedule_no()); 
+				PlnMaterielDetail pmdu=new PlnMaterielDetail();
+				//修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+				pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+				pmdu.setStatus("0PRL03");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+				//写虚拟物料履历,状态填:	0PRL03	母卷																			
+				this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PRL03",userName,new Date());
+			}
+		}
+		
+		/**
+		 * 撤销轧制上料接口 下PDI 验证
+		 * @param 虚拟子卷号
+		 * @throws Exception 
+		 * 其实都是单条操作
+		 */
+		public void MesRcmMCancelValid(List<MesRcmM> oci) throws Exception{
+			//循环 根据(轧制计划号数组,虚拟物料号数组) 读取 轧制计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+			for(MesRcmM mcsm:oci){
+				PlnRollingPlanDetail plpd=new PlnRollingPlanDetail();
+				plpd.setRl_plan_no(mcsm.getSchedule_no());
+				plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+				//如果不存在,则报错退出“轧制计划[xxxxx][xx]信息不存在!”
+				List<PlnRollingPlanDetail> lppd=this.getMapper(PlnRollingPlanDetailMapper.class).find(plpd, 0, 0);
+				if(lppd==null||lppd.size()==0){
+					throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				PlnMaterielDetail M1=new PlnMaterielDetail();
+				//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+				M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+				List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+				if(lpmd==null||lpmd.size()==0){
+					throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+				M1=lpmd.get(0);
+				if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+					throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+				}
+				
+				//实际上只有一条
+				for(PlnRollingPlanDetail ppdc:lppd){
+					//判断轧制计划明细的状态【STATUS】
+					if(!"5BRL03".equals(ppdc.getStatus())){
+						throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]上料后,经过其他操作,不允许撤销!");
+					}
+				}
+			}
+		}
+		
+		/**
+		 * 撤销轧制上料接口 下PDI
+		 * @param 虚拟子卷号
+		 * @throws Exception 
+		 * 其实都是单条操作
+		 */
+		public void MesRcmMCancel(List<MesRcmM> oci) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			
+			//循环 根据(轧制计划号数组,虚拟物料号数组) 读取 轧制计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+			for(MesRcmM mcsm:oci){
+				PlnRollingPlanDetail plpd=new PlnRollingPlanDetail();
+				plpd.setRl_plan_no(mcsm.getSchedule_no());
+				plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+				//如果不存在,则报错退出“轧制计划[xxxxx][xx]信息不存在!”
+				List<PlnRollingPlanDetail> lppd=this.getMapper(PlnRollingPlanDetailMapper.class).find(plpd, 0, 0);
+				if(lppd==null||lppd.size()==0){
+					throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				PlnMaterielDetail M1=new PlnMaterielDetail();
+				//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+				M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+				List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+				if(lpmd==null||lpmd.size()==0){
+					throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+				M1=lpmd.get(0);
+				if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+					throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+				}
+				
+				//实际上只有一条
+				for(PlnRollingPlanDetail ppdc:lppd){
+					//判断轧制计划明细的状态【STATUS】
+					if(!"5BRL03".equals(ppdc.getStatus())){
+						throw new Exception("轧制计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]上料后,经过其他操作,不允许撤销!");
+					}
+					PrcMaterielProcess pmp=new PrcMaterielProcess();
+					pmp.setObject_no(M1.getObject_no());
+					pmp.setPrc_code("5BRL03");
+					pmp.setRemark("回退上料");
+					pmp.setKeep_sametime_status(0);
+					ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+					//撤销实物物料状态跟踪
+					if(!"0".equals(al.getState())){
+						throw new Exception("物料状态不是已上料状态,不允许撤销!");
+					}
+					//修改轧制计划明细表
+					PlnRollingPlanDetail plpdu=new PlnRollingPlanDetail();
+					// V_最后状态
+					plpdu.setStatus(((PrcMaterielProcess)al.getData()).getPrc_code());// "5BRL02"
+					plpdu.setSerial_no(ppdc.getSerial_no());
+					this.getMapper(PlnRollingPlanDetailMapper.class).update(plpdu);
+				}
+				
+				//根据母卷号,查询对应的所有子卷信息
+				PlnMaterielDetail pmdq=new PlnMaterielDetail();
+				pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+				List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+				for(PlnMaterielDetail ppdc:lpmdc){
+					//修改各子卷的 状态 STATUS= 0PRL02; 
+					PlnMaterielDetail pmdu=new PlnMaterielDetail();
+					pmdu.setSerial_no(ppdc.getSerial_no());
+					pmdu.setStatus("0PRL02");
+					this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+					//增加子卷的 虚拟物料履历表
+					this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(),"0PRL02",userName,new Date());
+				}
+				//修改轧制计划主表
+				doUpdatePlnRollingPlan(mcsm.getSchedule_no()); 
+				PlnMaterielDetail pmdu=new PlnMaterielDetail();
+				//修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+				pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+				pmdu.setStatus("0PRL02");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+				//写虚拟物料履历,状态填:	0PRL02	母卷																			
+				this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PRL02",userName,new Date());
+			}
+		}
+		//--------------------------------轧制上料、下PDI End----------------------------------------------------
+		
+		//--------------------------------轧制完成 Start----------------------------------------------------
+		/**
+		 * 轧制完成
+		 * 实物 生成接口  产生实物,未挂上单时调用
+		 * @param OBJECT_NO 实物母卷号
+		 * @param SUB_OBJECT_NO 实物子卷号
+		 * @param RELATION_TYPE 关系类型     1:改号(原-现号码对应);2:轧制(板坯-钢板对应);3:剪切/切割(母-子对应)
+		 * @throws Exception 
+		 */
+		public void RollingFinsh_PrcMatRelAdd(PrcMaterielRelation pmr) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			Date createTime = new Date();
+			// 工序点信息
+			List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class)
+					.findWithCondition(null, "sort_code = '2002' AND validflag = '1'",
+							null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(infoi);
+			//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BRL10,操作时间,操作人,"")
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmr.getSub_object_no());
+			pmp.setPrc_code("5BRL10");//新增的状态
+			pmp.setCreate_time(createTime);
+			pmp.setCreate_man_name(userName);
+			pmp.setRemark("");
+			//新增物料跟踪:
+			this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+			
+			//调用公共函数2  建立物料母子对应关系 
+			pmr.setCreate_man_name(userName);
+			pmr.setCreate_time(createTime);
+			pmr.setRelation_type(2);
+			pmr.setPrc_code("5BRL10");
+			pmr.setRemark("");
+			this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+			
+			// 新增物料附加信息
+			this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmr.getObject_no(), pmr.getSub_object_no(), null, processpoint.rolling_code);
+		}
+		
+		/**
+		 * 撤销轧制
+		 * 实物 撤销生成接口  产生实物,未挂上单时调用
+		 * @param OBJECT_NO 实物母卷号
+		 * @param SUB_OBJECT_NO 实物子卷号
+		 * @throws Exception 
+		 */
+		public void RollingFinsh_PrcMatRelRemove(PrcMaterielRelation pmr) throws Exception{
+					
+			//回退子卷物料跟踪:
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmr.getSub_object_no());
+			pmp.setPrc_code("5BRL10");
+			pmp.setKeep_sametime_status(0);
+			pmp.setRemark("撤销轧制实物生成");
+			ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+			//撤销实物物料状态跟踪
+			if(!"0".equals(al.getState())){
+				throw new Exception("实物["+pmp.getObject_no()+"]状态已发生改变,不能撤销!");
+			}
+			
+			//调用公共函数3  断开物料母子对应关系 
+			PrcMaterielRelation pmrd=new PrcMaterielRelation();
+			pmrd.setObject_no(pmr.getObject_no());
+			pmr.setSub_object_no(pmr.getSub_object_no());
+			this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+			
+			// 删除物料附加信息
+			this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmr.getSub_object_no());
+		}
+		
+		
+		/**
+		 * 轧制完成 虚拟子卷 挂料接口
+		 * 
+		 * @param material_no   实物母卷号
+		 * @param SUB_OBJECT_NO 实物子卷号
+		 * @param object_no_vt  虚拟子卷号
+		 * @param create_time   操作时间 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+		 * @throws Exception
+		 */
+		public void RollingFinsh_Relation(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			Date createTime = new Date();
+			
+			// 工序点信息
+			List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+					"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(infoi);
+
+			// 新增物料附加信息
+			this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(),
+					pmd.getObject_no_vt(), processpoint.rolling_code);
+					
+			//调用物流接口,获取实物子卷信息。
+			YdmProductDetail ypd=new YdmProductDetail();
+			ypd.setCoilno(pmd.getSub_object_no());
+			List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+			if(lypd==null||lypd.size()==0){
+				throw new Exception("库存中无["+pmd.getObject_no()+"]实物卷!");
+			}
+			
+			//轧制工序代码processpoint.rolling_code 2018-06-13
+			//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			
+			if(!lypd.get(0).getSteelcode().equals(lpmd.get(0).getSteel_code())){
+				//throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的牌号不匹配,不能绑定");
+			}
+			// 2018-08-27 生产完成后厚度按实际情况取值,很有可能和计划不一致,故去此验证.
+//			if(lypd.get(0).getThick().doubleValue()!=lpmd.get(0).getThick().doubleValue()){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的厚不匹配,不能绑定");
+//			}
+			//------------------------2018-03-16------------------------------
+			//100-100>5 考虑偏差
+//			if((lypd.get(0).getWidth().doubleValue()-lpmd.get(0).getWidth().doubleValue()>dUpper)
+//					||(lypd.get(0).getWidth().doubleValue()-lpmd.get(0).getWidth().doubleValue()<dLower)){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的宽不匹配,不能绑定");
+//			}
+//			//----------------------------------------------------------------
+//			if(lpmd.get(0).getObject_no()!=null&&!"".equals(lpmd.get(0).getObject_no())){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]已绑定其他计划, 不能再次绑定!");
+//			}
+//			
+			
+			// 修改虚拟物料表
+			PlnMaterielDetail pmdq=new PlnMaterielDetail();
+			pmdq.setObject_no_vt(pmd.getObject_no_vt());
+			pmdq.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdq.setObject_no(pmd.getSub_object_no());
+			pmdq.setStatus("0PRL10");
+			pmdq.setIs_finished("1");
+//			pmdq.setPrev_process_code(processpoint.rolling_code);
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdq);
+			// 新增虚拟子物料履历:这里的serialno改成手动生成原来是 nextval();20230925刘侣																			
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PRL10",userName,createTime);
+			
+			//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BRL10,操作时间,操作人,"")
+			PrcMaterielProcess pmp = new PrcMaterielProcess();
+			pmp.setObject_no(pmd.getSub_object_no());
+			pmp.setPrc_code("5BRL10");// 新增的状态
+			pmp.setCreate_time(createTime);
+			pmp.setCreate_man_name(userName);
+			pmp.setRemark("");
+			// 新增物料跟踪:
+			this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+					
+			// 2018-06-19 去掉 判断下一工序==null条件(判断虚拟子物料是否是其他子料的原料)
+			// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(lpmd.get(0).getOrder_no());
+			pos.setRl(lpmd.get(0).getSingle_weight());
+			pos.setRl_cnt(1l);
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdateRlPlaned(pos);
+
+			// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+			PlnProdorderStatistic pps = new PlnProdorderStatistic();
+			pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+			pps.setRl(lpmd.get(0).getSingle_weight());
+			pps.setRl_cnt(1l);
+			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+			
+			//修改虚拟物料对应的 轧制计划进程表
+			PlnRlPlanStatistic plps=new PlnRlPlanStatistic();
+			plps.setRl_plan_no(lpmd.get(0).getRl_plan_no());
+			plps.setRl(lpmd.get(0).getSingle_weight());
+			plps.setRl_cnt(1l);
+			this.getMapper(PlnRlPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//调用公共函数2  建立物料母子对应关系 
+			PrcMaterielRelation pmr=new PrcMaterielRelation();
+			pmr.setObject_no(pmd.getMaterial_no());
+			pmr.setSub_object_no(pmd.getSub_object_no());
+			pmr.setCreate_man_name(userName);
+			pmr.setCreate_time(createTime);
+			pmr.setRemark("");
+			pmr.setRelation_type(2);
+			this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);	
+		}
+		
+		/**
+		 * 轧制完成 不符合计划
+		 * 实物生成, 新增虚拟子卷挂料
+		 * @param sub_object_no 实物子卷号
+		 * @param object_no 实物母卷号
+		 * @param create_time 操作时间
+		 * 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+		 * @throws Exception 
+		 * 2018-06-19
+		 */
+		public ResultModel RollingFinsh_No_Plan(PlnMaterielDetail pmd) throws Exception {
+			ResultModel rm = new ResultModel("200", "");
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			Date createTime = new Date();
+			// 工序点信息
+			List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class)
+					.findWithCondition(null, "sort_code = '2002' AND validflag = '1'",
+							null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(info);
+			//调用物流接口,获取实物子卷信息。
+			YdmProductDetail ypd=new YdmProductDetail();
+			ypd.setCoilno(pmd.getSub_object_no());
+			List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+			if(lypd==null||lypd.size()==0){
+				throw new Exception("库存中无["+pmd.getSub_object_no()+"]实物卷!");
+			}
+			// 获取母卷虚拟物料信息
+			PlnMaterielDetail pmdcm=new PlnMaterielDetail();
+			pmdcm.setObject_no(pmd.getObject_no());
+			List<PlnMaterielDetail> pmdpp = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdcm, " nvl(invalid_flg,0) = 0 ", "", 0, 1);
+			if (pmdpp == null || pmdpp.size()==0) {
+				rm.setState("500");
+				rm.setMsgInfo("实物["+pmd.getObject_no()+"]的虚拟物料信息不存在!");
+				return rm;
+			}
+			PlnProdorder pp=new PlnProdorder();
+			pp.setProd_order_no(pmdpp.get(0).getProd_order_no());
+			List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+			if(lpp==null||lpp.size()==0){
+				rm.setState("500");
+				rm.setMsgInfo("生产订单["+pp.getProd_order_no()+"]不存在!");
+				return rm;
+			}
+			
+			// 获取下一个工序
+			String temp = this.getBean(MesApiDesignInfoImpl.class)
+					.getPath(lpp.get(0).getWhole_process_codes(), processpoint.rolling_code, pmdpp.get(0).getProc_repeat_index());
+			String[] path =  temp.split("-");
+			ArrayList<String> validpath = this.getBean(MesApiDesignInfoImpl.class).getProcessPath(path);
+			
+			// 新建虚拟物料表【PLN_MATERIEL_DETAIL】虚拟子卷信息
+			PlnMaterielDetail pmdc=new PlnMaterielDetail();
+			// 获取序列号
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null, " serial_no desc ", 0, 1);
+			long PMDNo=lpmd==null?1:(lpmd.size()==0?1:(lpmd.get(0).getSerial_no()+1));
+			// 6位日期
+			String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+			// 6位流水号
+			int objectnoVtNo=this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate)+1;
+			pmdc.setSerial_no(PMDNo);
+			// 年月日(6位)+6位流水
+			pmdc.setObject_no_vt(sDate+String.format("%06d", objectnoVtNo));
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setObject_no(pmd.getSub_object_no());
+			pmdc.setPline_code(lpp.get(0).getPline_code());
+			pmdc.setStatus("0PRL10");
+			pmdc.setIs_finished("1");
+			pmdc.setPrev_dsn_process_code(processpoint.rolling_code);
+			pmdc.setPrev_process_code(processpoint.rolling_code);
+			pmdc.setIs_prev_dsn_finished("1");//母卷:0
+			pmdc.setCreate_design_no(pmdpp.get(0).getRl_design_no());
+			pmdc.setCreate_process_code(processpoint.rolling_code);
+			if (Utils.isNotEmpty(validpath)) {
+				pmdc.setNext_dsn_process_code(validpath.get(0));
+				pmdc.setNext_process_code(validpath.get(0));
+			}
+			pmdc.setIs_mat(0);//母卷:1
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdc.setPline_code(lpp.get(0).getPline_code());
+			pmdc.setLw_design_no(pmdpp.get(0).getLw_design_no());
+			pmdc.setRl_design_no(pmdpp.get(0).getRl_design_no());
+			pmdc.setCl_plan_no(pmdpp.get(0).getCl_plan_no());
+			pmdc.setRl_plan_no(pmdpp.get(0).getRl_plan_no());
+			pmdc.setMat_object_no_vt(pmdpp.get(0).getObject_no_vt());
+			pmdc.setIs_multi("0");
+			pmdc.setSteel_code(lpp.get(0).getSteel_code());
+			pmdc.setWidth(lpp.get(0).getWidth());// 这里的虚拟物料信息的厚宽取订单的厚宽 lypd.get(0)
+			pmdc.setThick(lpp.get(0).getThick());// 不再取断带卷的库存信息中厚宽:20241119刘侣
+			pmdc.setLength(lypd.get(0).getLength());
+			pmdc.setDiameter_inn(lypd.get(0).getDiameter_inn());
+			pmdc.setDiameter_out(lypd.get(0).getDiameter_out());
+			pmdc.setSingle_weight(lypd.get(0).getFactweight());
+			pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdc.setOrd_flg("2");
+			pmdc.setCreate_man_name(userName);
+			pmdc.setCreate_time(createTime);
+			pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+			
+			// 子卷存在下一个工序
+			if (Utils.isNotEmpty(validpath)) {
+				// 调用设计信息接口
+				List<DesignInfo> infos = new ArrayList<>();
+				DesignInfo infor = new DesignInfo();
+				infor.setCurrentProcIndex(0);
+				infor.setObject_no(pmd.getSub_object_no());
+				infor.setObject_no_vt(pmdc.getObject_no_vt());
+				infor.setProcess(validpath);
+				infor.setProd_order_no(pmdpp.get(0).getProd_order_no());
+				infor.setSingle_wgt(lypd.get(0).getFactweight());
+				infos.add(infor);
+				ResultModel result = this.getBean(MesApiDesignInfoImpl.class).Design_Plan_Info(infos,null);
+				if (!"200".equals(result.getState())) {
+					throw new Exception("生产设计信息失败" + result.getMsgInfo());
+				}
+			}
+			
+			// 反写实绩的虚拟物料号 2018-09-20
+			MesRcmM mcd = new MesRcmM();
+			mcd.setMaterial_no(pmd.getSub_object_no());
+			mcd.setMaterial_no_vt(pmdc.getObject_no_vt());
+			this.getMapper(MesRcmMMapper.class).updatebymaterial_no(mcd);
+			
+			// 反写实物虚拟卷号 2018-11-08
+			ypd.setObject_no_vt(pmdc.getObject_no_vt());
+			this.getMapper(YdmProductDetailMapper.class).update(ypd);
+			
+			// 轧机断带卷不确定是否需要进入非计划,所以需要新增该卷的物料附加信息:20221215刘侣
+			// 新增物料附加信息
+			this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(),
+					pmdc.getObject_no_vt(), processpoint.rolling_code);
+			// end
+			
+			//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BRL10,操作时间,操作人,"")
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmd.getSub_object_no());
+			pmp.setPrc_code("5BRL10");
+			pmp.setCreate_time(createTime);
+			pmp.setCreate_man_name(userName);
+			pmp.setRemark("");
+			// 新增物料跟踪:
+			this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+			
+			// 新增虚拟子物料履历																			
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(pmdc.getObject_no_vt(),"0PRL10",userName,createTime);
+			
+			// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(lpp.get(0).getOrder_no());
+			pos.setRl(pmdc.getSingle_weight());
+			pos.setRl_cnt(1l);
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdateRlPlaned(pos);
+
+			// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+			PlnProdorderStatistic pps = new PlnProdorderStatistic();
+			pps.setProd_order_no(pmdc.getProd_order_no());
+			pps.setRl(pmdc.getSingle_weight());
+			pps.setRl_cnt(1l);
+			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+			
+			//修改虚拟物料对应的 轧制计划进程表
+			PlnMaterielDetail pmdmq=new PlnMaterielDetail();
+			pmdmq.setObject_no_vt(pmdc.getMat_object_no_vt());
+			List<PlnMaterielDetail> lpmdm=this.getMapper(PlnMaterielDetailMapper.class).find(pmdmq, 0, 1);
+			PlnRlPlanStatistic plps=new PlnRlPlanStatistic();
+			plps.setRl_plan_no(lpmdm.get(0).getRl_plan_no());
+			plps.setRl(pmdc.getSingle_weight());
+			plps.setRl_cnt(1l);
+			this.getMapper(PlnRlPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//调用公共函数2  建立物料母子对应关系 
+			PrcMaterielRelation pmr=new PrcMaterielRelation();
+			pmr.setObject_no(pmd.getObject_no());
+			pmr.setSub_object_no(pmd.getSub_object_no());
+			pmr.setCreate_man_name(userName);
+			pmr.setCreate_time(createTime);
+			pmr.setRemark("");
+			pmr.setRelation_type(2);
+			this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+			return rm;
+		}
+		
+		/**
+		 * 撤销轧制
+		 * 虚拟子卷 挂料接口
+		 * @param OBJECT_NO 实物子卷号
+		 * @param object_no_vt 虚拟子卷号
+		 * @throws Exception 
+		 */
+		public void RollingFinsh_RelationCancel(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+					
+			// 调用物流接口,获取实物子卷信息。
+			YdmProductDetail ypd=new YdmProductDetail();
+			ypd.setCoilno(pmd.getObject_no());
+			List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+			if(lypd==null||lypd.size()==0){
+				throw new Exception("库存中无["+pmd.getObject_no()+"]实物卷!");
+			}
+			 
+			// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			
+			// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷的母卷信息
+			List<PlnMaterielDetail> lpmdm=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+lpmd.get(0).getMat_object_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+			if(lpmdm==null||lpmdm.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			
+			if(lpmdm.get(0).getObject_no()==null||"".equals(lpmdm.get(0).getObject_no())){
+				throw new Exception("实物卷["+pmd.getObject_no()+"]尚未绑定该计划,不能回退!");
+			}
+			
+			// 下一个工序做了计划就不能回退
+			if (Utils.isNotEmpty(pmd.getNext_dsn_process_code())) {
+			this.getBean(MesApiDesignInfoImpl.class).JudgeIsOrNotPlan(lpmd.get(0));
+			}
+			//回退子卷物料跟踪:
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmd.getObject_no());
+			pmp.setPrc_code("5BRL10");
+			pmp.setKeep_sametime_status(0);
+			pmp.setRemark("撤销子卷挂料");
+			ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+			//撤销实物物料状态跟踪
+			if(!"0".equals(al.getState())){
+				throw new Exception("轧制完成后,实物["+pmp.getObject_no()+"]状态已发生改变,不能撤销!");
+			}
+			
+			// 物料充当脱单履历
+//			this.getBean(MesApiDesignInfoImpl.class).createMatLog(lpmd.get(0), "厂内合同取消交工",userName, lpmd.get(0).getPrev_process_code() , "-1", pmd.getObject_no());
+			
+			//修改虚拟物料表
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			pmdu.setObject_no_vt(pmd.getObject_no_vt());
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PRL03");
+			pmdu.setIs_finished("0");
+//			pmdu.setPrev_process_code(processpoint.rolling_code);
+			this.getMapper(PlnMaterielDetailMapper.class).doUpdateCancelRelation(pmdu);
+			//新增虚拟子物料履历																			
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PRL03",userName,new Date());
+			//判断虚拟子物料是否有其他子料的原料
+//			if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+				//修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+				PlnOrderStatistic pos=new PlnOrderStatistic();
+				pos.setOrder_no(lpmd.get(0).getOrder_no());
+				pos.setRl(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+				pos.setRl_cnt(-1l);
+				this.getMapper(PlnOrderStatisticMapper.class).doUpdateRlPlaned(pos);
+				//生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+				PlnProdorderStatistic pps=new PlnProdorderStatistic();
+				pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+				pps.setRl(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+				pps.setRl_cnt(-1l);
+				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//			}
+			
+			//修改虚拟物料对应的 轧制计划进程表
+			PlnRlPlanStatistic plps=new PlnRlPlanStatistic();
+			plps.setRl_plan_no(lpmd.get(0).getRl_plan_no());
+			plps.setRl(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+			plps.setRl_cnt(-1l);
+			this.getMapper(PlnRlPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//调用公共函数3  断开物料母子对应关系 
+			PrcMaterielRelation pmr=new PrcMaterielRelation();
+			pmr.setObject_no(lpmdm.get(0).getObject_no());
+			pmr.setSub_object_no(lpmd.get(0).getObject_no());
+			this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+			
+			// 厂内合同子卷生产完成时,清空库存信息订单信息
+//			boolean flag_Ct = this.getBean(MesApiDesignInfoImpl.class).getContractType(lpmd.get(0).getProd_order_no());
+//			boolean flag_Mf = this.getBean(MesApiDesignInfoImpl.class).matIsFinish(pmd.getObject_no());
+//			if (flag_Mf && flag_Ct) {
+//				YdmProductDetail ydm = new YdmProductDetail();
+//				ydm.setCoilno(pmd.getObject_no());
+//				ydm.setProdorderno(lpmd.get(0).getProd_order_no());
+//				ydm.setOrderno(lpmd.get(0).getOrder_no());
+//				ydm.setObject_no_vt(pmd.getObject_no_vt());
+//				this.getMapper(YdmProductDetailMapper.class).update(ydm);;
+//			}
+			// 删除物料附加信息
+			this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmd.getObject_no());
+			
+			// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果是,则需释放虚拟子堆垛,调用接口:纵剪——虚拟子堆垛 释放接口
+			if ("2".equals(lpmd.get(0).getOrd_flg())) {
+				RollingFinsh_Release(pmd);
+			}
+		}
+		
+		/**
+		 * 轧制完成
+		 * 虚拟子卷 释放接口
+		 * @param object_no_vt 虚拟子卷号
+		 * @throws Exception 
+		 */
+		public void RollingFinsh_Release(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			// 工序点信息
+			List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(info);
+			//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+			PlnMaterielDetail pmdq=new PlnMaterielDetail();
+			pmdq.setObject_no_vt(pmd.getObject_no_vt());
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			
+			// ------------------------2018-06-19-------------------------
+			// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果不成立, 则报错退出,“虚拟物料[xxx]不是额外成品,不能释放!”
+			if (!"2".equals(lpmd.get(0).getOrd_flg())) {
+				throw new Exception("虚拟物料["+pmd.getObject_no_vt()+"]不是额外成品,不能释放!");
+			}
+			// 判断虚拟子卷是否是轧制的虚拟成品
+			if(!processpoint.rolling_code.equals(lpmd.get(0).getPrev_dsn_process_code())){
+				throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]不是轧制设计成品,无法释放!");
+			}
+//			PlnMaterielDetail pmdqd=new PlnMaterielDetail();
+//			pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+//			int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+//			if (count>0) {
+//				throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+//			}
+			PlnMaterielDetail pmdqd=new PlnMaterielDetail();
+			pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+			List<PlnMaterielDetail> child = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+//			int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+			if (Utils.isNotEmpty(child)) {
+				// 删除子卷
+				this.getBean(MesApiDesignInfoImpl.class).deleteChildTrue(child);
+//				throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+			}
+			//------------------------------------------------------------
+			
+			// 判断虚拟子卷是否是其他物料母卷: IF(NEXT_DSN_PROCESS_CODE == NULL)
+			// if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+			
+				//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录,状态标记为“0PRLXX”
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PRLXX",userName,new Date());
+				
+				//将虚拟物料信息 从虚拟物料表【PLN_MATERIEL_DETAIL】移动到 无效虚拟物料表【PLN_MATERIEL_INVALID】.
+				//(两个表结构一样,移动后,保持serial_no不变,删除原表记录)
+				List<PlnMaterielInvalid> pmin = this.getMapper(PlnMaterielInvalidMapper.class).findWithCondition(null, " serial_no = '"+lpmd.get(0).getSerial_no()+"' or object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"'", "", 0, 0);
+				if (pmin !=null && pmin.size()>0) {
+					this.getMapper(PlnMaterielInvalidMapper.class).delete(lpmd.get(0).getSerial_no());
+				}
+				PlnMaterielInvalid pmi=new PlnMaterielInvalid();
+				BeanUtils.copyProperties(lpmd.get(0), pmi);
+				this.getMapper(PlnMaterielInvalidMapper.class).insert(pmi);
+				this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(lpmd.get(0));
+				
+		}
+		
+		/**
+		 * 轧制完成
+		 * 虚拟母卷统计
+		 * @param object_no_vt 虚拟母卷号
+		 * @param object_no 实物母卷号
+		 * @throws Exception 
+		 */
+		public void RollingFinsh_Sum(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			Date createTime = new Date();
+			String plan_no = "";
+			// 工序点信息
+					List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+							"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+					ProcessPoint processpoint = new ProcessPoint(infoi);
+					
+			// 修改物料附加信息
+			this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.rolling_code,true);
+			// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+			PlnMaterielDetail pmdq=new PlnMaterielDetail();
+			pmdq.setObject_no_vt(pmd.getObject_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "nvl(invalid_flg , 0) <> 1", null, 0, 1);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			if(lpmd.get(0).getObject_no()==null||"".equals(lpmd.get(0).getObject_no())){
+				throw new Exception("计划母卷["+pmd.getObject_no_vt()+"]未上料, 不能轧制!");
+			}
+			plan_no = lpmd.get(0).getRl_plan_no();
+			// 新增母卷物料跟踪:调用 新增实物物料状态跟踪
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setPrc_code("5BRL10");//新增的状态
+			pmp.setCreate_time(createTime);
+			pmp.setObject_no(pmd.getObject_no());
+			pmp.setCreate_man_name(userName);
+			pmp.setRemark("");
+			// 新增物料跟踪:
+			this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+			// 判断虚拟母卷对应的虚拟子卷是否 挂料完成
+			List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+			int isum=0;
+			if (lpmdc != null && lpmdc.size() > 0) {
+				for (PlnMaterielDetail pmdcc : lpmdc) {
+					PlnMaterielDetail pmdcu = new PlnMaterielDetail();
+					pmdcu.setSerial_no(pmdcc.getSerial_no());
+					pmdcu.setIs_finished("1");
+					this.getMapper(PlnMaterielDetailMapper.class).update(pmdcu);
+					if (pmdcc.getObject_no() == null || "".equals(pmdcc.getObject_no())) {
+						// 统计 (OBJECT_NO=NULL的子卷数量)、虚拟子卷总数量
+						isum += 1;
+					}
+				}
+				//如果(OBJECT_NO为NULL的数量==子卷总数
+				if(isum==lpmdc.size()){
+					//读取物料关系表【PRC_MATERIEL_RELATION】(where OBJECT_NO=实物母卷号 AND RELATION_TYPE=3)的记录
+					PrcMaterielRelation pmr=new PrcMaterielRelation();
+					pmr.setObject_no(lpmd.get(0).getObject_no());
+					pmr.setRelation_type(2);
+					List<PrcMaterielRelation> lpmr=this.getMapper(PrcMaterielRelationMapper.class).find(pmr, 0, 0);
+					if(lpmr==null||lpmr.size()==0){
+						//如果 关系表记录为空(说明实物卷未切割,计划未执行),直接报错退出“母卷xxxx尚未进行切割操作!”;
+						throw new Exception("母卷["+pmr.getObject_no()+"]尚未进行切割操作!");
+					}else{
+						//修改虚拟物料表的母卷记录:OBJECT_NO=NULL;  NEED_EXTOPT=1;  AN_PLAN_NO=NULL
+						PlnMaterielDetail pmdu=new PlnMaterielDetail();
+						pmdu.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+						pmdu.setNeed_extopt("1");
+						this.getMapper(PlnMaterielDetailMapper.class).doUpdateRollingFinshSum(pmdu);
+					}
+				}else {
+					// 挂单的时候一起修改了
+//					this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), true);
+				}
+			}
+			
+			//修改虚拟物料表OPT_TIMES+=1; STATUS= 0PRL10; IS_NEXT_FINISHED=1(2018-06-19)(同步修改S1的[OPT_TIMES]、[STATUS]
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setIs_next_finished("1");
+			pmdu.setOpt_times((lpmd.get(0).getOpt_times()==null?0:lpmd.get(0).getOpt_times())+1);
+			pmdu.setStatus("0PRL10");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			
+			//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+			//-------------2018-03-21-------这个地方的an_plan_no有点特殊的地方,所以没有直接调用InsertMatVtProc接口------------
+			PlnMaterielDetail pmdcq=new PlnMaterielDetail();
+			pmdcq.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdq = this.getMapper(PlnMaterielDetailMapper.class).find(pmdcq, 0, 0);
+			//写虚拟物料履历,状态填:		子卷																			
+			PrcMaterielVtProcess pmvpc=new PrcMaterielVtProcess();
+			
+			// 20191001
+			long serial_no = 0l;
+			List<PrcMaterielVtProcess> pmpQ = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(null, "", "serial_no desc", 0, 1);
+			if (Utils.isNotEmpty(pmpQ)) {
+				serial_no = pmpQ.get(0).getSerial_no()+1;
+			}
+			pmvpc.setSerial_no(serial_no);
+			// end
+			
+			pmvpc.setObject_no_vt(lpmdq.get(0).getObject_no_vt());
+			pmvpc.setObject_no(lpmdq.get(0).getObject_no());
+			pmvpc.setObject_type(lpmdq.get(0).getObject_type());
+			pmvpc.setPline_code(lpmdq.get(0).getPline_code());
+			pmvpc.setStatus("0PRL10");
+			pmvpc.setOrder_no(lpmdq.get(0).getOrder_no());
+			pmvpc.setProd_order_no(lpmdq.get(0).getProd_order_no());
+			pmvpc.setLw_design_no(lpmdq.get(0).getLw_design_no());
+			pmvpc.setCl_design_no(lpmdq.get(0).getCl_design_no());
+			pmvpc.setRl_design_no(lpmdq.get(0).getRl_design_no());
+			pmvpc.setAn_design_no(lpmdq.get(0).getAn_design_no());
+			pmvpc.setSr_design_no(lpmdq.get(0).getSr_design_no());
+			pmvpc.setLw_plan_no(lpmdq.get(0).getLw_plan_no());
+			pmvpc.setCl_plan_no(lpmdq.get(0).getCl_plan_no());
+			pmvpc.setRl_plan_no(lpmdq.get(0).getRl_plan_no());
+			pmvpc.setSr_plan_no(lpmdq.get(0).getSr_plan_no());
+			pmvpc.setBatch_no(lpmdq.get(0).getBatch_no());
+			pmvpc.setCreate_man_name(userName);
+			pmvpc.setCreate_time(createTime);
+			this.getMapper(PrcMaterielVtProcessMapper.class).doAdd(pmvpc);
+			//----------------------------------------------------------------------
+			
+			//修改虚拟物料对应的 轧制计划进程表
+			//MesCrSlittingD mcsd=this.getMapper(MesCrSlittingDMapper.class).findById(lpmd.get(0).getObject_no());
+			PlnRlPlanStatistic plps=new PlnRlPlanStatistic();
+			plps.setMat_rl(lpmd.get(0).getSingle_weight());//mcsd.getCoil_act_wgt());
+			plps.setMat_rl_cnt(1l);
+			plps.setRl_plan_no(plan_no);
+			this.getMapper(PlnRlPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//轧制计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BRL10
+			PlnRollingPlanDetail plpd=new PlnRollingPlanDetail();
+			plpd.setRl_plan_no(plan_no);
+			plpd.setStatus("5BRL10");
+			plpd.setObject_no_vt(pmd.getObject_no_vt());		
+			this.getMapper(PlnRollingPlanDetailMapper.class).doUpdate(plpd);
+			
+			//轧制计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(轧制计划号);
+			doUpdatePlnRollingPlan(plan_no);
+			
+			// 将未挂单的子卷 置为无效
+//			List<PlnMaterielDetail> child = this.getMapper(
+//					PlnMaterielDetailMapper.class).findWithCondition(
+//					null,
+//					"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//							+ "' and nvl(invalid_flg,0) =0 and object_no is null",
+//					"", 0, 0);
+//			if (Utils.isNotEmpty(child)) {
+//				this.getBean(MesApiDesignInfoImpl.class).deleteChild(child);
+//			}
+		}
+		
+		/**
+		 * 撤销轧制
+		 * 撤销虚拟母卷统计
+		 * @param object_no_vt 虚拟母卷号
+		 * @param object_no 实物母卷号
+		 * @throws Exception 
+		 */
+		public void RollingFinsh_SumCancel(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+		
+			// 工序点信息
+			List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+					"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(infoi);
+			
+			// 修改物料附加信息
+			this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.rolling_code,false);
+
+			// 将无效的虚拟物料子卷恢复
+//			List<PlnMaterielDetail> child = this.getMapper(
+//					PlnMaterielDetailMapper.class).findWithCondition(
+//					null,
+//					"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//							+ "' and invalid_flg = '1'", "", 0, 0);
+//			if (Utils.isNotEmpty(child)) {
+//				this.getBean(MesApiDesignInfoImpl.class).recoveryChild(child);
+//			}
+			
+			//读取虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】,获取虚拟母卷最后一条
+			PrcMaterielVtProcess pmvp=new PrcMaterielVtProcess();
+			pmvp.setStatus("0PRL10");
+			pmvp.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PrcMaterielVtProcess> lpmvp=this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(pmvp, "", " create_time desc ", 0, 1);
+			
+			//循环 (MAT_OBJECT_NO_VT=虚拟母卷号) 的所有虚拟子卷记录
+			PlnMaterielDetail pmdc=new PlnMaterielDetail();
+			pmdc.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).find(pmdc, 0, 0);
+			for(PlnMaterielDetail pmdcc:lpmdc){
+				PlnMaterielDetail pmdu=new PlnMaterielDetail();
+				pmdu.setSerial_no(pmdcc.getSerial_no());
+				pmdu.setIs_finished("0");
+				//修改虚拟物料表【PLN_MATERIEL_DETAIL】:IS_FINISHED=0;
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			}
+			
+			//修改虚拟物料表_母卷信息
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setNeed_extopt("0");
+			pmdu.setIs_next_finished("0");
+			pmdu.setRl_plan_no(lpmvp.get(0).getRl_plan_no());
+			pmdu.setStatus_desc("0PRL03");
+			
+			if(lpmd.get(0).getObject_no()==null||"".equals(lpmd.get(0).getObject_no())){
+				pmdu.setObject_no(lpmvp.get(0).getObject_no());
+			}
+			// 2018-06-23 opt_Times 之前一直没减,判断条件不对
+			if(lpmd.get(0).getOpt_times()!=null){
+				pmdu.setOpt_times(lpmd.get(0).getOpt_times()-1);
+			}
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			
+			//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PRL03",userName,new Date());
+			
+			//修改虚拟物料对应的 轧制计划进程表
+			PlnRlPlanStatistic plps=new PlnRlPlanStatistic();
+			plps.setMat_rl(-lpmd.get(0).getSingle_weight());
+			plps.setMat_rl_cnt(-1l);
+			plps.setRl_plan_no(lpmd.get(0).getRl_plan_no());
+			this.getMapper(PlnRlPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//回退实物母卷的物料跟踪 
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(lpmd.get(0).getObject_no());
+			pmp.setPrc_code("5BRL10");
+			pmp.setRemark("撤销母卷轧制");
+			pmp.setKeep_sametime_status(0);
+			
+			ResultModel rm = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+			if(!"0".equals(rm.getState())){
+				throw new Exception("轧制完成后,母卷状态已发生改变,不能撤销!");
+			}
+			
+			//轧制计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BRL03
+			PlnRollingPlanDetail plpd=new PlnRollingPlanDetail();
+			plpd.setRl_plan_no(lpmd.get(0).getRl_plan_no());
+			plpd.setStatus("5BRL03");
+			plpd.setObject_no_vt(pmd.getObject_no_vt());		
+			this.getMapper(PlnRollingPlanDetailMapper.class).doUpdate(plpd);
+			
+			//轧制计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(轧制计划号);
+			doUpdatePlnRollingPlan(lpmd.get(0).getRl_plan_no());
+			// ----------------------------2018-06-19-------------------------------
+			// ---------------2018-10-16 挂单的时候一起修改
+//			this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), false);
+		}
+		
+		/**
+		 * 函数_通过加工计划产生设计
+		 * @param pro_order_no 生产订单号
+		 * @throws Exception 
+		 * */
+		public PlnRollingDsnMain ProcessingPlanDsn(String pro_order_no) throws Exception{
+			PlnRollingDsnMain san_design_no=null;
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			PlnProdorder pp=new PlnProdorder();
+			pp.setProd_order_no(pro_order_no);
+			List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+			//根据加工计划号  读取生产订单对应的生产加工表[PLN_PROCESS_PLAN]
+			PlnProcessPlan ppp=new PlnProcessPlan();
+			ppp.setProduce_no(lpp.get(0).getProduce_no());
+			ppp.setValid_flag("1");
+			List<PlnProcessPlan> lppp=this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, null, " cut_order_no ", 0, 0);
+			if(lppp==null||lppp.size()==0){
+				throw new Exception("未找到生产订单["+ppp.getOrder_no()+"]对应的生产加工信息");
+			}
+			
+			//保存设计主表数据:  轧制设计号:DAN+YYMMDD+6流水号
+			String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+			PlnRollingDsnMain pldm=new PlnRollingDsnMain();
+			List<PlnRollingDsnMain> lpdmNo=this.getMapper(PlnRollingDsnMainMapper.class).findWithCondition(null, "", " serial_no desc ", 0, 1);
+			pldm.setRl_design_no("DAN"+sDate+String.format("%06d", 1));
+			if(lpdmNo!=null&&lpdmNo.size()>0){
+				pldm.setSerial_no(lpdmNo.get(0).getSerial_no()+1);
+				if(sDate.equals(lpdmNo.get(0).getRl_design_no().substring(3,9))){
+					pldm.setRl_design_no("DAN"+sDate+String.format("%06d", Integer.parseInt(lpdmNo.get(0).getRl_design_no().substring(9,15))+1 ));
+				}
+			}
+			
+			// 订单信息
+			pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldm.setOrder_no(lpp.get(0).getOrder_no());
+			pldm.setPline_code(lpp.get(0).getPline_code());
+			pldm.setSteel_code(lpp.get(0).getSteel_code());
+			
+			String isMulti="0";//是否拼料 根据订单数判断,多个订单填1,否则填0
+			pldm.setIs_multi(isMulti);
+			
+			// 只有一条加工计划记录情况下
+			if(lppp.size()==1){
+				pldm.setThick(lppp.get(0).getThick());
+				pldm.setWidth(lppp.get(0).getWidth());
+				pldm.setLength(lppp.get(0).getLength());
+				pldm.setDiameter_inn(lppp.get(0).getDiameter_inn());
+				pldm.setDiameter_out(lppp.get(0).getDiameter_out());
+				pldm.setSingle_weight(lppp.get(0).getEstimate_weight());
+			}
+			
+			// 加工计划分切方式
+//			pldm.setCut_style(lppp.get(0).getCut_style());
+//			
+//			pldm.setCrosscut_style(lppp.get(0).getCrosscut_style());
+//			pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//			pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+			
+			pldm.setDesign_quantity(1);
+//			pldm.setDesign_weight(ypd.getFactweight());
+			
+			pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pldm.setCreate_man_name(userName);
+			pldm.setCreate_time(new Date());
+			pldm.setIs_finished(0L);
+			pldm.setReserve_1(lppp.get(0).getProduce_no());
+			this.getMapper(PlnRollingDsnMainMapper.class).insert(pldm);
+			san_design_no=pldm;
+			
+			//倒叙取一条拼料信息
+			List<PlnRollingDsnMultinfo> lpdmM=this.getMapper(PlnRollingDsnMultinfoMapper.class).findWithCondition(null, "", " serial_no desc ", 0,1);
+			long DsnNo=1;
+			if(lpdmM!=null&&lpdmM.size()>0){
+				DsnNo=lpdmM.get(0).getSerial_no()+1;
+			}
+			
+						//-----------------写拼料-----------------------------
+						PlnRollingDsnMultinfo pldmc=new PlnRollingDsnMultinfo();
+						pldmc.setSerial_no(DsnNo++);
+						pldmc.setRl_design_no(pldm.getRl_design_no());
+//						pldmc.setRl_seq(1);
+//						pldmc.setSeg_seq(1);
+						pldmc.setOrder_no(lpp.get(0).getOrder_no());
+						pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+						pldmc.setThick(lpp.get(0).getThick());
+						pldmc.setWidth(lpp.get(0).getWidth());
+						pldmc.setLength(lpp.get(0).getLength());
+						pldmc.setDiameter_inn(lpp.get(0).getDiameter_inn());
+						pldmc.setDiameter_out(lpp.get(0).getDiameter_out());
+						pldmc.setWeight(pldm.getSingle_weight());
+//						pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//						pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+						pldmc.setSub_seq(1);
+						this.getMapper(PlnRollingDsnMultinfoMapper.class).insert(pldmc);
+			
+			return san_design_no;
+		}
+		
+		
+		/**
+		 * 公共函数1 修改轧制计划主表状态
+		 * @param 轧制计划号
+		 * @throws Exception
+		 */
+		public void doUpdatePlnRollingPlan(String anPlanNo) throws Exception {
+			PlnRollingPlan plp = new PlnRollingPlan();
+			plp.setRl_plan_no(anPlanNo);
+			String MIN_STATUS = "";
+			boolean flag = false;
+			PlnRollingPlanDetail plpd = new PlnRollingPlanDetail();
+			plpd.setRl_plan_no(anPlanNo);
+			List<PlnRollingPlanDetail> lplpd = this.getMapper(PlnRollingPlanDetailMapper.class)
+					.findWithCondition(plpd, "status <> '0PRLXX'", "status asc", 0, 0);
+			if (lplpd == null || lplpd.size() == 0) {
+				throw new Exception("未找到轧制计划明细数据!");
+			}
+			MIN_STATUS = lplpd.get(0).getStatus();
+
+			// 计划状态						// 实物状态		
+			// 0PRL01轧制计划已编制			// 5BRL01轧制计划已编制		
+			// 0PRL02轧制计划已下发			// 5BRL02轧制计划已下发		
+			// 0PRL03开始轧制作业				// 5BRL03开始轧制作业		
+			// 0PRL79轧制剪废				// 5BRL05正在轧制作业		
+			// 0PRL10轧制作业完成				// 5BRL79轧制剪废		
+			// 0PRLXX轧制计划已失效			// 5BRL10轧制作业完成		
+											// 5BRL83等待轧制判定		
+											// 5BRL90轧制判定完成		
+			
+			// 如果明细记录中有卷开始作业,主表状态改为开始作业
+			for (PlnRollingPlanDetail plnL : lplpd) {
+				if ("5BRL03".equals(plnL.getStatus())) {
+					flag = true;
+					break;
+				}
+			}
+			if (flag) {
+				plp.setStatus("0PRL03");
+			} else if ("5BRL01".equals(MIN_STATUS)) {
+				plp.setStatus("0PRL01");
+			} else if (MIN_STATUS.compareTo("5BRL02") <= 0) {
+				plp.setStatus("0PRL02");
+			} else if (MIN_STATUS.compareTo("5BRL03") <= 0) {
+				plp.setStatus("0PRL03");
+			} else if (MIN_STATUS.compareTo("5BRL10") <= 0) {
+				plp.setStatus("0PRL10");
+			}
+			this.getMapper(PlnRollingPlanMapper.class).doUpdate(plp);
+		}
+}

+ 3601 - 0
src/main/java/market/Api/Mes/impl/MesApiServiceImpl.java

@@ -0,0 +1,3601 @@
+/***文档注释***********************************************
+ * 作者               :                   易鑫
+ * 创建日期      :                   2017.11.22
+ * 描述               :                   Mes提供其他系统调用的公共接口
+ * 注意事项      :                   无
+ * 遗留BUG :                   无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+***********************************************************/
+
+package market.Api.Mes.impl;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import market.Api.Lms.impl.LmsApiServiceImpl;
+import market.Api.Mes.service.MesApiService;
+import market.Api.Qms.impl.QmsApiServiceImpl;
+import market.Api.Qms.vo.JudgeResult;
+import market.Com.impl.PbModelDbServiceImpl;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.mapper.ComDsnCutstdMapper;
+import market.Com.mapper.ComDsnPltlmtMapper;
+import market.Com.vo.ComBaseInfo;
+import market.Com.vo.ComDsnCutstd;
+import market.Com.vo.ComDsnPltlmt;
+import market.Com.vo.CommonPage;
+import market.Com.vo.PbModelDb;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Mes.Lengthwise.Design.mapper.PlnLengthwiseDsnMainMapper;
+import market.Mes.Lengthwise.Design.mapper.PlnLengthwiseDsnMultinfoMapper;
+import market.Mes.Lengthwise.Design.vo.PlnLengthwiseDsnMain;
+import market.Mes.Lengthwise.Design.vo.PlnLengthwiseDsnMultinfo;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingDMapper;
+import market.Mes.Lengthwise.Performance.mapper.MesCrSlittingMMapper;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingD;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingDSum;
+import market.Mes.Lengthwise.Performance.vo.MesCrSlittingM;
+import market.Mes.Lengthwise.Performance.vo.MesQmsView;
+import market.Mes.Lengthwise.Plan.mapper.MesCrCrossCuttingDMapper;
+import market.Mes.Lengthwise.Plan.mapper.MesCrCrossCuttingMMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnLengthwisePlanDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnLengthwisePlanMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnLwPlanStatisticMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielInvalidMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.MesCrCrossCuttingD;
+import market.Mes.Lengthwise.Plan.vo.MesCrCrossCuttingM;
+import market.Mes.Lengthwise.Plan.vo.PlnLengthwisePlan;
+import market.Mes.Lengthwise.Plan.vo.PlnLengthwisePlanDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnLwPlanStatistic;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielInvalid;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.MaterielTrack.mapper.PrcMaterielExtinfoMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielProcessMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielRelationMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielVtProcessMapper;
+import market.Mes.MaterielTrack.mapper.PrcMatprocBlacklistMapper;
+import market.Mes.MaterielTrack.mapper.PrcMatprocWhitelistMapper;
+import market.Mes.MaterielTrack.vo.PrcMaterielProcess;
+import market.Mes.MaterielTrack.vo.PrcMaterielRelation;
+import market.Mes.MaterielTrack.vo.PrcMaterielVtProcess;
+import market.Mes.MaterielTrack.vo.PrcMatprocBlacklist;
+import market.Mes.MaterielTrack.vo.PrcMatprocWhitelist;
+import market.Mes.OrderManager.Plan.mapper.PlnOrderStatisticMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderStatisticMapper;
+import market.Mes.OrderManager.Plan.vo.PlnOrderStatistic;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.OrderManager.Plan.vo.PlnProdorderStatistic;
+import market.Mes.Pickle.Performance.mapper.MesPlmMMapper;
+import market.Mes.Pickle.Performance.vo.MesPlmD;
+import market.Mes.Pickle.Performance.vo.MesPlmM;
+import market.Mes.Rolling.Performance.mapper.MesRcmMMapper;
+import market.Mes.Rolling.Performance.vo.MesRcmD;
+import market.Mes.Rolling.Performance.vo.MesRcmM;
+import market.Mes.Tpm.mapper.MesTpmMMapper;
+import market.Mes.Tpm.vo.MesTpmD;
+import market.Mes.Tpm.vo.MesTpmM;
+import market.Mes.anneal.mapper.MesCrAnnealMMapper;
+import market.Mes.anneal.vo.MesCrAnnealM;
+import market.Qms.qcm.mapper.QcmJudgeSurfaceFlawMapper;
+import market.Qms.qcm.mapper.QcmJudgeSurfaceMapper;
+import market.Qms.qcm.vo.QcmJudgeSurface;
+import market.Qms.qcm.vo.QcmJudgeSurfaceFlaw;
+import market.Qms.slmord.mapper.SlmOrdDesignMscPlStiMapper;
+import market.Qms.slmord.vo.SlmOrdDesignMscPlSti;
+import market.Slm.FundManagement.impl.SlmFundFirstDetailServiceImpl;
+import market.Slm.OrderManagement.mapper.SlmOrderInfoMapper;
+import market.Slm.OrderManagement.vo.SlmOrderInfo;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.service.support.PageModel;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+//@SuppressWarnings("rawtypes")
+@RemoteService(path = "MesApiService")
+public class MesApiServiceImpl extends BaseServiceImpl implements MesApiService {
+
+	// --------------------------------分条上料、下PDI
+	// Start----------------------------------------------------
+	/**
+	 * 分条上料接口 下PDI 验证 分条计划号、虚拟物料号
+	 * 
+	 * @throws Exception 其实都是单条操作
+	 */
+	public void MesCrSlittingMAddValid(List<MesCrSlittingM> oci) throws Exception {
+		// 循环 根据(分条计划号数组,虚拟物料号数组) 读取 分条计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for (MesCrSlittingM mcsm : oci) {
+			PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+			plpd.setLw_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“分条计划[xxxxx][xx]信息不存在!”
+			List<PlnLengthwisePlanDetail> lppd = this.getMapper(PlnLengthwisePlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+			// 实际上只有一条
+			for (PlnLengthwisePlanDetail ppdc : lppd) {
+				// 判断分条计划明细的状态【STATUS】
+				if (ppdc.getStatus().compareTo("5BLW02") > 0) {
+					throw new Exception(
+							"分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]已上料,不能再次操作!");
+				}
+			}
+		}
+	}
+
+	/**
+	 * 分条上料接口 下PDI
+	 * 
+	 * @throws Exception 其实都是单条操作
+	 */
+	public void MesCrSlittingMAdd(List<MesCrSlittingM> oci) throws Exception {
+
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 循环 根据(分条计划号数组,虚拟物料号数组) 读取 分条计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for (MesCrSlittingM mcsm : oci) {
+			PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+			plpd.setLw_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“分条计划[xxxxx][xx]信息不存在!”
+			List<PlnLengthwisePlanDetail> lppd = this.getMapper(PlnLengthwisePlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnLengthwisePlanDetail ppdc : lppd) {
+				// 判断分条计划明细的状态【STATUS】
+				if (ppdc.getStatus().compareTo("5BLW02") > 0) {
+					throw new Exception(
+							"分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]已上料,不能再次操作!");
+				}
+				PrcMaterielProcess pmp = new PrcMaterielProcess();
+				pmp.setPrc_code("5BLW03");// 新增的状态
+
+				// 这里的格式要和字符串日期的格式匹配,不然会抛出转换异常
+				SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+				if (mcsm.getMemo() != null && !"".equals(mcsm.getMemo())) {
+					Date createdate = dateFormat.parse(mcsm.getMemo());
+					pmp.setCreate_time(createdate);
+				} else {
+					pmp.setCreate_time(new Date());
+				}
+
+				pmp.setObject_no(M1.getObject_no());
+				pmp.setCreate_man_name(userName);
+				pmp.setRemark(mcsm.getMemo());
+				// 新增物料跟踪:
+				INSERT_OBJ_PROCESS(pmp);
+
+				// 修改分条计划明细表
+				PlnLengthwisePlanDetail plpdu = new PlnLengthwisePlanDetail();
+				plpdu.setStatus("5BLW03");
+				plpdu.setSerial_no(ppdc.getSerial_no());
+				this.getMapper(PlnLengthwisePlanDetailMapper.class).update(plpdu);
+			}
+
+			// 根据母卷号,查询对应的所有子卷信息
+			PlnMaterielDetail pmdq = new PlnMaterielDetail();
+			pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq,
+					"  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+			for (PlnMaterielDetail ppdc : lpmdc) {
+				// 修改各子卷的 状态 STATUS= 0PLW03;
+				PlnMaterielDetail pmdu = new PlnMaterielDetail();
+				pmdu.setSerial_no(ppdc.getSerial_no());
+				pmdu.setStatus("0PLW03");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+				// 增加子卷的 虚拟物料履历表
+				InsertMatVtProc(ppdc.getObject_no_vt(), "0PLW03", userName, new Date());
+			}
+
+			// 修改分条计划主表
+			doUpdatePlnLengthwisePlan(mcsm.getSchedule_no());
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			// 修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PLW03");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			// 写虚拟物料履历,状态填: 0PLW03 母卷
+			InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PLW03", userName, new Date());
+		}
+	}
+
+	/**
+	 * 撤销分条上料接口 下PDI 验证1
+	 * 
+	 * @param 虚拟子卷号
+	 * @throws Exception 其实都是单条操作
+	 */
+	public void MesCrSlittingMCancelValid(List<MesCrSlittingM> oci) throws Exception {
+		// 循环 根据(分条计划号数组,虚拟物料号数组) 读取 分条计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for (MesCrSlittingM mcsm : oci) {
+			PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+			plpd.setLw_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“分条计划[xxxxx][xx]信息不存在!”
+			List<PlnLengthwisePlanDetail> lppd = this.getMapper(PlnLengthwisePlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnLengthwisePlanDetail ppdc : lppd) {
+				// 判断分条计划明细的状态【STATUS】
+				if (!"5BLW03".equals(ppdc.getStatus())) {
+					throw new Exception(
+							"分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]上料后,经过其他操作,不允许撤销!");
+				}
+			}
+		}
+	}
+
+	/**
+	 * 撤销分条上料接口 下PDI
+	 * 
+	 * @param 虚拟子卷号
+	 * @throws Exception 其实都是单条操作
+	 */
+	public void MesCrSlittingMCancel(List<MesCrSlittingM> oci) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 循环 根据(分条计划号数组,虚拟物料号数组) 读取 分条计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+		for (MesCrSlittingM mcsm : oci) {
+			PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+			plpd.setLw_plan_no(mcsm.getSchedule_no());
+			plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+			// 如果不存在,则报错退出“分条计划[xxxxx][xx]信息不存在!”
+			List<PlnLengthwisePlanDetail> lppd = this.getMapper(PlnLengthwisePlanDetailMapper.class).find(plpd, 0, 0);
+			if (lppd == null || lppd.size() == 0) {
+				throw new Exception("分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			PlnMaterielDetail M1 = new PlnMaterielDetail();
+			// 读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+			M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+			List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+			if (lpmd == null || lpmd.size() == 0) {
+				throw new Exception("虚拟物料[" + mcsm.getMaterial_no_vt() + "]信息不存在!");
+			}
+
+			// 判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+			M1 = lpmd.get(0);
+			if (M1.getObject_no() == null || "".equals(M1.getObject_no())) {
+				throw new Exception("分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]尚未挂料!");
+			}
+
+			// 实际上只有一条
+			for (PlnLengthwisePlanDetail ppdc : lppd) {
+				// 判断分条计划明细的状态【STATUS】
+				if (!"5BLW03".equals(ppdc.getStatus())) {
+					throw new Exception(
+							"分条计划[" + mcsm.getSchedule_no() + "][" + mcsm.getMaterial_no_vt() + "]上料后,经过其他操作,不允许撤销!");
+				}
+				PrcMaterielProcess pmp = new PrcMaterielProcess();
+				pmp.setObject_no(M1.getObject_no());
+				pmp.setPrc_code("5BLW03");
+				pmp.setRemark("回退上料");
+				pmp.setKeep_sametime_status(0);
+				ResultModel al = ARRAYLIST(pmp);
+				// 撤销实物物料状态跟踪
+				if (!"0".equals(al.getState())) {
+					throw new Exception("物料状态不是已上料状态,不允许撤销!");
+				}
+				// 修改分条计划明细表
+				PlnLengthwisePlanDetail plpdu = new PlnLengthwisePlanDetail();
+				// V_最后状态
+				plpdu.setStatus(((PrcMaterielProcess) al.getData()).getPrc_code());// "5BLW02"
+				plpdu.setSerial_no(ppdc.getSerial_no());
+				this.getMapper(PlnLengthwisePlanDetailMapper.class).update(plpdu);
+			}
+
+			// 根据母卷号,查询对应的所有子卷信息
+			PlnMaterielDetail pmdq = new PlnMaterielDetail();
+			pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq,
+					"  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+			for (PlnMaterielDetail ppdc : lpmdc) {
+				// 修改各子卷的 状态 STATUS= 0PLW02;
+				PlnMaterielDetail pmdu = new PlnMaterielDetail();
+				pmdu.setSerial_no(ppdc.getSerial_no());
+				pmdu.setStatus("0PLW02");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+				// 增加子卷的 虚拟物料履历表
+				InsertMatVtProc(ppdc.getObject_no_vt(), "0PLW02", userName, new Date());
+			}
+			// 修改分条计划主表
+			doUpdatePlnLengthwisePlan(mcsm.getSchedule_no());
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			// 修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PLW02");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			// 写虚拟物料履历,状态填: 0PLW02 母卷
+			InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PLW02", userName, new Date());
+		}
+	}
+	// --------------------------------分条上料、下PDI
+	// End----------------------------------------------------
+
+	// --------------------------------分条完成
+	// Start----------------------------------------------------
+	/**
+	 * 完成 实物 生成接口 产生实物,未挂上单时调用
+	 * 
+	 * @param OBJECT_NO     实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @param RELATION_TYPE 关系类型 1:改号(原-现号码对应);2:轧制(板坯-钢板对应);3:剪切/切割(母-子对应)
+	 * @throws Exception
+	 */
+	public void LengthwiseFinsh_PrcMatRelAdd(PrcMaterielRelation pmr) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		// 调用 新增实物物料状态跟踪: 传入(实物子卷号,5BLW10,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmr.getSub_object_no());
+		pmp.setPrc_code("5BLW10");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		INSERT_OBJ_PROCESS(pmp);
+
+		// 调用公共函数2 建立物料母子对应关系
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRelation_type(3);
+		pmr.setPrc_code("5BLW10");
+		pmr.setRemark("");
+		doBuildRelation(pmr);
+	}
+
+	/**
+	 * 撤销分条 实物 撤销生成接口 产生实物,未挂上单时调用
+	 * 
+	 * @param OBJECT_NO     实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @throws Exception
+	 */
+	public void LengthwiseFinsh_PrcMatRelRemove(PrcMaterielRelation pmr) throws Exception {
+		// 回退子卷物料跟踪:
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmr.getSub_object_no());
+		pmp.setPrc_code("5BLW10");
+		pmp.setKeep_sametime_status(0);
+		pmp.setRemark("撤销分条实物生成");
+		ResultModel al = ARRAYLIST(pmp);
+		// 撤销实物物料状态跟踪
+		if (!"0".equals(al.getState())) {
+			throw new Exception("实物[" + pmp.getObject_no() + "]状态已发生改变,不能撤销!");
+		}
+
+		// 调用公共函数3 断开物料母子对应关系
+		PrcMaterielRelation pmrd = new PrcMaterielRelation();
+		pmrd.setObject_no(pmr.getObject_no());
+		pmr.setSub_object_no(pmr.getSub_object_no());
+		doBuildRelationRemove(pmr);
+	}
+
+	/**
+	 * 分条完成 虚拟子卷 挂料接口
+	 * 
+	 * @param dLower       上限
+	 * @param dUpper       下限
+	 * @param material_no  母卷号
+	 * @param OBJECT_NO    实物子卷号
+	 * @param object_no_vt 虚拟子卷号
+	 * @param create_time  操作时间 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+	 * @throws Exception
+	 */
+	public void LengthwiseFinsh_Relation(PlnMaterielDetail pmd, double dUpper, double dLower) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		// 新增物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getMaterial_no(), pmd.getObject_no(),
+				pmd.getObject_no_vt(), processpoint.slitting_code);
+
+		// 调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(pmd.getObject_no());
+		List<YdmProductDetail> lypd = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if (lypd == null || lypd.size() == 0) {
+			throw new Exception("库存中无[" + pmd.getObject_no() + "]实物卷!");
+		}
+
+		// 分条工序代码processpoint.slitting_code 2018-06-13
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		if (!lypd.get(0).getSteelcode().equals(lpmd.get(0).getSteel_code())) {
+//			throw new Exception("实物卷[" + pmd.getObject_no() + "]和虚拟卷[" + pmd.getObject_no_vt() + "]的牌号不匹配,不能绑定");
+		}
+		// 2018-08-27 生产完成后厚度按实际情况取值,很有可能和计划不一致,故去此验证.
+//		if(lypd.get(0).getThick().doubleValue()!=lpmd.get(0).getThick().doubleValue()){
+//			throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的厚不匹配,不能绑定");
+//		}
+		// ------------------------2018-03-16------------------------------
+		// 100-100>5 考虑偏差
+		if ((lypd.get(0).getWidth().doubleValue() - lpmd.get(0).getWidth().doubleValue() > dUpper)
+				|| (lypd.get(0).getWidth().doubleValue() - lpmd.get(0).getWidth().doubleValue() < dLower)) {
+			throw new Exception("实物卷[" + pmd.getObject_no() + "]和虚拟卷[" + pmd.getObject_no_vt() + "]的宽不匹配,不能绑定");
+		}
+		// ----------------------------------------------------------------
+		if (lpmd.get(0).getObject_no() != null && !"".equals(lpmd.get(0).getObject_no())) {
+			// throw new Exception("实物卷[" + pmd.getObject_no() + "]已绑定其他计划, 不能再次绑定!");
+		}
+
+		// 调用 新增实物物料状态跟踪: 传入(实物子卷号,5BLW10,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setPrc_code("5BLW10");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		INSERT_OBJ_PROCESS(pmp);
+
+		// 修改虚拟物料表
+		pmdq.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdq.setObject_no(pmd.getObject_no());
+		pmdq.setStatus("0PLW10");
+		pmdq.setIs_finished("1");
+		pmdq.setPrev_process_code(processpoint.slitting_code);
+		// 获取下个工序代码暂时方法,将来从质量取值
+//		String process_code = this.getBean(MesApiCrCrossCuttingMServiceImpl.class).getNext_process("2", pmd.getObject_no_vt());
+//		if (process_code != null && !"".equals(process_code)) {
+//			pmdq.setNext_process_code(process_code);
+//		}
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdq);
+		// 新增虚拟子物料履历
+		InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PLW10", userName, createTime);
+
+		// 2018-06-19 去掉 判断下一工序==null条件(判断虚拟子物料是否是其他子料的原料)
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpmd.get(0).getOrder_no());
+		pos.setLw(lpmd.get(0).getSingle_weight());
+		pos.setLw_cnt(1);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+		pps.setLw(lpmd.get(0).getSingle_weight());
+		pps.setLw_cnt(1);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+		// 修改虚拟物料对应的 分条计划进程表
+		PlnMaterielDetail pmdmq = new PlnMaterielDetail();
+		pmdmq.setObject_no_vt(lpmd.get(0).getMat_object_no_vt());
+		List<PlnMaterielDetail> lpmdm = this.getMapper(PlnMaterielDetailMapper.class).find(pmdmq, 0, 1);
+		PlnLwPlanStatistic plps = new PlnLwPlanStatistic();
+		plps.setLw_plan_no(lpmdm.get(0).getLw_plan_no());
+		plps.setLw(lpmd.get(0).getSingle_weight());
+		plps.setLw_cnt(1);
+		this.getMapper(PlnLwPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 调用公共函数2 建立物料母子对应关系
+		PrcMaterielRelation pmr = new PrcMaterielRelation();
+		pmr.setObject_no(pmd.getMaterial_no());
+		pmr.setSub_object_no(pmd.getSub_object_no());
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRemark("");
+		pmr.setRelation_type(3);
+		doBuildRelation(pmr);
+	}
+
+	/**
+	 * 分条完成 不符合计划 实物生成, 新增虚拟子卷挂料
+	 * 
+	 * @param sub_object_no 实物子卷号
+	 * @param material_no   实物母卷号
+	 * @param create_time   操作时间 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+	 * @throws Exception 2018-06-19
+	 */
+	public ResultModel LengthwiseFinsh_No_Plan(PlnMaterielDetail pmd) throws Exception {
+		ResultModel rm = new ResultModel("200", "");
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		Date createTime = new Date();
+		// 调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(pmd.getSub_object_no());
+		List<YdmProductDetail> lypd = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if (lypd == null || lypd.size() == 0) {
+			throw new Exception("库存中无[" + pmd.getSub_object_no() + "]实物卷!");
+		}
+		// 获取母卷虚拟物料信息
+		PlnMaterielDetail pmdcm = new PlnMaterielDetail();
+		pmdcm.setObject_no(pmd.getObject_no());
+		List<PlnMaterielDetail> pmdpp = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdcm,
+				" nvl(invalid_flg,0) = 0 ", "", 0, 1);
+		if (pmdpp == null || pmdpp.size() == 0) {
+			rm.setState("500");
+			rm.setMsgInfo("实物[" + pmd.getObject_no() + "]的虚拟物料信息不存在!");
+			return rm;
+		}
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(pmdpp.get(0).getProd_order_no());
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		if (lpp == null || lpp.size() == 0) {
+			rm.setState("500");
+			rm.setMsgInfo("生产订单[" + pp.getProd_order_no() + "]不存在!");
+			return rm;
+		}
+
+		// 获取下一个工序
+		String temp = this.getBean(MesApiDesignInfoImpl.class)
+				.getPath(lpp.get(0).getWhole_process_codes(), processpoint.slitting_code, pmdpp.get(0).getProc_repeat_index());
+		String[] path =  temp.split("-");
+		ArrayList<String> validpath = this.getBean(MesApiDesignInfoImpl.class).getProcessPath(path);
+
+		// 新建虚拟物料表【PLN_MATERIEL_DETAIL】虚拟子卷信息
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		// 获取序列号
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null,
+				" serial_no desc ", 0, 1);
+		long PMDNo = lpmd == null ? 1 : (lpmd.size() == 0 ? 1 : (lpmd.get(0).getSerial_no() + 1));
+		// 6位日期
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		// 6位流水号
+		int objectnoVtNo = this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate) + 1;
+		pmdc.setSerial_no(PMDNo);
+		// 年月日(6位)+6位流水
+		pmdc.setObject_no_vt(sDate + String.format("%06d", objectnoVtNo));
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setObject_no(pmd.getSub_object_no());
+		pmdc.setPline_code(lpp.get(0).getPline_code());
+		pmdc.setStatus("0PLW10");
+		pmdc.setIs_finished("1");
+		pmdc.setPrev_dsn_process_code(processpoint.slitting_code);
+		pmdc.setPrev_process_code(processpoint.slitting_code);
+		// 获取下个工序代码暂时方法,将来从质量取值
+//		List<PlnProcessPlan> ppp = this.getMapper(PlnProcessPlanMapper.class).findWithCondition(null, " produce_no = '"+lpp.get(0).getProduce_no()+"' and valid_flag = 1 and cut_order_no = 1", "", 0, 0);
+//		if (ppp != null && ppp.size()>0) {
+//			if (ppp.get(0).getCut_type() != null && "3".equals(ppp.get(0).getCut_type())) {
+//				 pmdc.setNext_process_code(processpoint.cross_cutting_code);
+//				 pmdc.setNext_dsn_process_code(processpoint.cross_cutting_code);
+//			}
+//		}
+		if (Utils.isNotEmpty(validpath)) {
+			pmdc.setNext_dsn_process_code(validpath.get(0));
+			pmdc.setNext_process_code(validpath.get(0));
+		}
+		pmdc.setIs_prev_dsn_finished("1");// 母卷:0
+		pmdc.setCreate_design_no(pmdpp.get(0).getLw_design_no());
+		pmdc.setCreate_process_code(processpoint.slitting_code);
+		pmdc.setIs_mat(0);// 母卷:1
+		pmdc.setOrder_no(lpp.get(0).getOrder_no());
+		pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+		pmdc.setPline_code(lpp.get(0).getPline_code());
+		pmdc.setLw_design_no(pmdpp.get(0).getLw_design_no());
+		pmdc.setCl_plan_no(pmdpp.get(0).getCl_plan_no());
+		pmdc.setMat_object_no_vt(pmdpp.get(0).getObject_no_vt());
+		pmdc.setIs_multi("0");
+		pmdc.setSteel_code(lpp.get(0).getSteel_code());
+		pmdc.setWidth(lypd.get(0).getWidth());
+		pmdc.setThick(lypd.get(0).getThick());
+		pmdc.setLength(lypd.get(0).getLength());
+		pmdc.setDiameter_inn(lypd.get(0).getDiameter_inn());
+		pmdc.setDiameter_out(lypd.get(0).getDiameter_out());
+		pmdc.setSingle_weight(lypd.get(0).getFactweight());
+		pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pmdc.setOrd_flg("2");
+		pmdc.setCreate_man_name(userName);
+		pmdc.setCreate_time(createTime);
+		pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+
+		// 新增物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(),
+				pmdc.getObject_no_vt(), processpoint.slitting_code);
+
+		// 子卷存在下一个工序
+		if (Utils.isNotEmpty(validpath)) {
+			// 调用设计信息接口
+			List<DesignInfo> infos = new ArrayList<>();
+			DesignInfo infor = new DesignInfo();
+			infor.setCurrentProcIndex(0);
+			infor.setObject_no(pmd.getSub_object_no());
+			infor.setObject_no_vt(pmdc.getObject_no_vt());
+			infor.setProcess(validpath);
+			infor.setProd_order_no(pmdpp.get(0).getProd_order_no());
+			infor.setSingle_wgt(lypd.get(0).getFactweight());
+			infos.add(infor);
+			ResultModel result = this.getBean(MesApiDesignInfoImpl.class).Design_Plan_Info(infos, null);
+			if (!"200".equals(result.getState())) {
+				throw new Exception("生产设计信息失败" + result.getMsgInfo());
+			}
+		}
+
+		// 反写子卷实绩的虚拟物料号 2018-09-20
+		MesCrSlittingD mcd = new MesCrSlittingD();
+		mcd.setCoil_no(pmd.getSub_object_no());
+		mcd.setCoil_no_vt(pmdc.getObject_no_vt());
+		this.getMapper(MesCrSlittingDMapper.class).update(mcd);
+
+		// 反写实物虚拟物料号
+		ypd.setObject_no_vt(pmdc.getObject_no_vt());
+		this.getMapper(YdmProductDetailMapper.class).update(ypd);
+
+		// 调用 新增实物物料状态跟踪: 传入(实物子卷号,5BLW10,操作时间,操作人,"")
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getSub_object_no());
+		pmp.setPrc_code("5BLW10");
+		pmp.setCreate_time(createTime);
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		INSERT_OBJ_PROCESS(pmp);
+
+		// 新增虚拟子物料履历
+		InsertMatVtProc(pmdc.getObject_no_vt(), "0PLW10", userName, createTime);
+
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpp.get(0).getOrder_no());
+		pos.setLw(pmdc.getSingle_weight());
+		pos.setLw_cnt(1);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(pmdc.getProd_order_no());
+		pps.setLw(pmdc.getSingle_weight());
+		pps.setLw_cnt(1);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+
+		// 修改虚拟物料对应的 分条计划进程表
+		PlnMaterielDetail pmdmq = new PlnMaterielDetail();
+		pmdmq.setObject_no_vt(pmdc.getMat_object_no_vt());
+		List<PlnMaterielDetail> lpmdm = this.getMapper(PlnMaterielDetailMapper.class).find(pmdmq, 0, 1);
+		PlnLwPlanStatistic plps = new PlnLwPlanStatistic();
+		plps.setLw_plan_no(lpmdm.get(0).getLw_plan_no());
+		plps.setLw(pmdc.getSingle_weight());
+		plps.setLw_cnt(1);
+		this.getMapper(PlnLwPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 调用公共函数2 建立物料母子对应关系
+		PrcMaterielRelation pmr = new PrcMaterielRelation();
+		pmr.setObject_no(pmd.getMaterial_no());
+		pmr.setSub_object_no(pmd.getSub_object_no());
+		pmr.setCreate_man_name(userName);
+		pmr.setCreate_time(createTime);
+		pmr.setRemark("");
+		pmr.setRelation_type(3);
+		doBuildRelation(pmr);
+		return rm;
+	}
+
+	/**
+	 * 撤销分条 虚拟子卷 挂料接口
+	 * 
+	 * @param OBJECT_NO    实物子卷号
+	 * @param object_no_vt 虚拟子卷号
+	 * @throws Exception
+	 */
+	public void LengthwiseFinsh_RelationCancel(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		// 调用物流接口,获取实物子卷信息。
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(pmd.getObject_no());
+		List<YdmProductDetail> lypd = this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+		if (lypd == null || lypd.size() == 0) {
+			throw new Exception("库存中无[" + pmd.getObject_no() + "]实物卷!");
+		}
+
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + pmd.getObject_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷的母卷信息
+		List<PlnMaterielDetail> lpmdm = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"object_no_vt = '" + lpmd.get(0).getMat_object_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+		if (lpmdm == null || lpmdm.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		if (lpmdm.get(0).getObject_no() == null || "".equals(lpmdm.get(0).getObject_no())) {
+			throw new Exception("实物卷[" + pmd.getObject_no() + "]尚未绑定该计划,不能回退!");
+		}
+
+		// 下一个工序做了计划就不能回退
+		if (Utils.isNotEmpty(pmd.getNext_dsn_process_code())) {
+			this.getBean(MesApiDesignInfoImpl.class).JudgeIsOrNotPlan(lpmd.get(0));
+		}
+
+		// 物料充当脱单履历
+//		this.getBean(MesApiDesignInfoImpl.class).createMatLog(lpmd.get(0), "厂内合同取消交工",userName, lpmd.get(0).getPrev_process_code() , "-1", pmd.getObject_no());
+		
+		// 回退子卷物料跟踪:
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setPrc_code("5BLW10");
+		pmp.setKeep_sametime_status(0);
+		pmp.setRemark("撤销子卷挂料");
+		ResultModel al = ARRAYLIST(pmp);
+		// 撤销实物物料状态跟踪
+		if (!"0".equals(al.getState())) {
+			throw new Exception("分条完成后,实物[" + pmp.getObject_no() + "]状态已发生改变,不能撤销!");
+		}
+
+		// 修改虚拟物料表
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setObject_no_vt(pmd.getObject_no_vt());
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setStatus("0PLW03");
+		pmdu.setIs_finished("0");
+		pmdu.setPrev_process_code(processpoint.slitting_code);
+		// 获取下个工序代码暂时方法,将来从质量取值
+//		String process_code = this.getBean(MesApiCrCrossCuttingMServiceImpl.class).getNext_process("2",
+//				pmd.getObject_no_vt());
+//		if (process_code != null && !"".equals(process_code)) {
+//			pmdu.setNext_process_code(process_code);
+//		}
+		this.getMapper(PlnMaterielDetailMapper.class).doUpdateCancelRelation(pmdu);
+		// 新增虚拟子物料履历
+		InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PLW03", userName, new Date());
+		// 判断虚拟子物料是否有其他子料的原料 2018-10-16 去掉测验证和交工保持一致
+//		if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+		// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpmd.get(0).getOrder_no());
+		pos.setLw(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+		pos.setLw_cnt(-1);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+		// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+		pps.setLw(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+		pps.setLw_cnt(-1);
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//		}
+
+		// 修改虚拟物料对应的 分条计划进程表
+		PlnLwPlanStatistic plps = new PlnLwPlanStatistic();
+		plps.setLw_plan_no(lpmdm.get(0).getLw_plan_no());
+		plps.setLw(lpmd.get(0).getSingle_weight() == null ? null : (-lpmd.get(0).getSingle_weight()));
+		plps.setLw_cnt(-1);
+		this.getMapper(PlnLwPlanStatisticMapper.class).doUpdatePlaned(plps);
+		// 调用公共函数3 断开物料母子对应关系
+		PrcMaterielRelation pmr = new PrcMaterielRelation();
+		pmr.setObject_no(lpmdm.get(0).getObject_no());
+		pmr.setSub_object_no(lpmd.get(0).getObject_no());
+		doBuildRelationRemove(pmr);
+
+		// 厂内合同子卷生产完成时,清空库存信息订单信息
+//		boolean flag_Ct = this.getBean(MesApiDesignInfoImpl.class).getContractType(lpmd.get(0).getProd_order_no());
+//		boolean flag_Mf = this.getBean(MesApiDesignInfoImpl.class).matIsFinish(pmd.getObject_no());
+//		if (flag_Mf && flag_Ct) {
+//			YdmProductDetail ydm = new YdmProductDetail();
+//			ydm.setCoilno(pmd.getObject_no());
+//			ydm.setProdorderno(lpmd.get(0).getProd_order_no());
+//			ydm.setOrderno(lpmd.get(0).getOrder_no());
+//			ydm.setObject_no_vt(pmd.getObject_no_vt());
+//			this.getMapper(YdmProductDetailMapper.class).update(ydm);
+//			;
+//		}
+		// 删除物料附加信息
+		this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmd.getObject_no());
+
+		// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果是,则需释放虚拟子堆垛,调用接口:纵剪——虚拟子堆垛 释放接口
+		if ("2".equals(lpmd.get(0).getOrd_flg())) {
+			LengthwiseFinsh_Release(pmd);
+		}
+	}
+
+	/**
+	 * 分条完成 虚拟子卷 释放接口
+	 * 
+	 * @param object_no_vt 虚拟子卷号
+	 * @throws Exception
+	 */
+	public void LengthwiseFinsh_Release(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		// 工序点信息
+		List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(info);
+
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		// ------------------------2018-06-19-------------------------
+		// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果不成立, 则报错退出,“虚拟物料[xxx]不是额外成品,不能释放!”
+		if (!"2".equals(lpmd.get(0).getOrd_flg())) {
+			throw new Exception("虚拟物料[" + pmd.getObject_no_vt() + "]不是额外成品,不能释放!");
+		}
+		// 判断虚拟子卷是否是分条的虚拟成品
+		if (!processpoint.slitting_code.equals(lpmd.get(0).getPrev_dsn_process_code())) {
+			throw new Exception("虚拟子卷[" + pmd.getObject_no_vt() + "]不是分条设计成品,无法释放!");
+		}
+		PlnMaterielDetail pmdqd = new PlnMaterielDetail();
+		pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> child = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"mat_object_no_vt = '" + pmd.getObject_no_vt() + "' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+//		int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+		if (Utils.isNotEmpty(child)) {
+			// 删除子卷
+			this.getBean(MesApiDesignInfoImpl.class).deleteChildTrue(child);
+//			throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+		}
+		// ------------------------------------------------------------
+
+		// 判断虚拟子卷是否是其他物料母卷: IF(NEXT_DSN_PROCESS_CODE == NULL)
+		// if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+
+		// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录,状态标记为“0PLWXX”
+		InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PLWXX", userName, new Date());
+
+		// 将虚拟物料信息 从虚拟物料表【PLN_MATERIEL_DETAIL】移动到 无效虚拟物料表【PLN_MATERIEL_INVALID】.
+		// (两个表结构一样,移动后,保持serial_no不变,删除原表记录)
+		List<PlnMaterielInvalid> pmin = this.getMapper(PlnMaterielInvalidMapper.class).findWithCondition(null, " serial_no = '"+lpmd.get(0).getSerial_no()+"' or object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"'", "", 0, 0);
+		if (pmin !=null && pmin.size()>0) {
+			this.getMapper(PlnMaterielInvalidMapper.class).delete(lpmd.get(0).getSerial_no());
+		}
+		PlnMaterielInvalid pmi=new PlnMaterielInvalid();
+		BeanUtils.copyProperties(lpmd.get(0), pmi);
+		this.getMapper(PlnMaterielInvalidMapper.class).insert(pmi);
+		this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(lpmd.get(0));
+
+//			//MesCrSlittingD mcsd=this.getMapper(MesCrSlittingDMapper.class).findById(lpmd.get(0).getObject_no());
+//			//修改 虚拟子卷 对应的分条计划进程表【PLN_LW_PLAN_STATISTIC】,PLANED 总成品量-=子卷重量;PLANED_CNT 总成品数-=1
+//			PlnLwPlanStatistic plps=new PlnLwPlanStatistic();
+//			plps.setLw_plan_no(pmi.getLw_plan_no());
+//			plps.setPlaned(pmi.getSingle_weight()==null?null:(-pmi.getSingle_weight()));//-mcsd.getCoil_act_wgt()
+//			plps.setPlaned_cnt(-1);
+//			this.getMapper(PlnLwPlanStatisticMapper.class).doUpdatePlaned(plps);
+//			
+//			PlnProdorderStatistic pps=new PlnProdorderStatistic();
+//			Double db=lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight());
+//			pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+//			pps.setUnscheduled(lpmd.get(0).getSingle_weight());
+//			pps.setUnscheduled_cnt(1);
+//			pps.setLw_dsn(db);
+//			pps.setLw_dsn_cnt(-1);
+//			pps.setLw_undsn(lpmd.get(0).getSingle_weight());
+//			pps.setLw_undsn_cnt(1);
+//			pps.setLw_planed(db);
+//			pps.setLw_planed_cnt(-1);
+//			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//		}else{
+//			//断开此子卷和其母卷的关联
+//			//一期不会出现此情况,可暂时不写
+//			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+//			pmdu.setPrev_process_code(processpoint.slitting_code);
+//			pmdu.setObject_no_vt(pmd.getObject_no_vt());
+//			//pmdu.setNext_process_code("(后期需要根据 工艺路径 填写)");
+//			this.getMapper(PlnMaterielDetailMapper.class).doUpdateRelease(pmdu);
+//		
+//			//根据 虚拟子卷信息中的【CREATE_DESIGN_NO 生成时的设计号】
+//			//读取 坯料设计订单组成表【PLN_DSN_ORDER_INFO】的相关联的所有生产订单统计信息
+//			//并修改对应的生产订单进程表【PLN_PRODORDER_STATISTIC】数据:
+//			PlnDsnOrderInfo pdoi=new PlnDsnOrderInfo();
+//			pdoi.setDesign_no(lpmd.get(0).getCreate_design_no());
+//			List<PlnDsnOrderInfo> lpdoi=this.getBean(PlnDsnOrderInfoMapper.class).find(pdoi, 0, 0);
+//			//PlnDsnOrderInfo唯一键是Design_no+prod_order_no
+//			for(PlnDsnOrderInfo pdoic:lpdoi){
+//				PlnProdorderStatistic pps=new PlnProdorderStatistic();
+//				pps.setLw_dsn(-pdoic.getWeight_in_one());
+//				pps.setLw_dsn_cnt(-pdoic.getQuantity_in_one());
+//				pps.setLw_undsn(pdoic.getWeight_in_one());
+//				pps.setLw_undsn_cnt(1);//(非空时计算)
+//				pps.setLw_planed(-pdoic.getWeight_in_one());
+//				pps.setLw_planed_cnt(-1);
+//				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//			}
+//			
+//			//修改 虚拟子卷 对应的订单进程表【PLN_PRODORDER_STATISTIC】
+//			PlnOrderStatistic pos=new PlnOrderStatistic();
+//			pos.setOrder_no(lpmd.get(0).getOrder_no());
+//			Double db=lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight());
+//			pos.setOrder_no(lpmd.get(0).getOrder_no());
+//			pos.setUnscheduled(lpmd.get(0).getSingle_weight());
+//			pos.setUnscheduled_cnt(1);
+//			pos.setLw_dsn(db);
+//			pos.setLw_dsn_cnt(-1);
+//			pos.setLw_undsn(lpmd.get(0).getSingle_weight());
+//			pos.setLw_undsn_cnt(1);//(非空时计算)
+//			pos.setLw_planed(db);
+//			pos.setLw_planed_cnt(-1);
+//			this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+//			
+//		}
+	}
+
+	/**
+	 * 分条完成 虚拟母卷统计
+	 * 
+	 * @param object_no_vt 虚拟母卷号
+	 * @param object_no    实物母卷号 2018-09-28 修改 未挂单子卷标记为无效 方便撤销的时候恢复 2018-12-12
+	 *                     取消未挂单子卷标记为无效 步骤
+	 * @throws Exception
+	 */
+	public void LengthwiseFinsh_Sum(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		Date createTime = new Date();
+		String plan_no = null ;
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		// 修改物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.slitting_code, true);
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "nvl(invalid_flg , 0) <> 1", null, 0, 1);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+		if (lpmd.get(0).getObject_no() == null || "".equals(lpmd.get(0).getObject_no())) {
+			throw new Exception("计划母卷[" + pmd.getObject_no_vt() + "]未上料, 不能分条!");
+		}
+		plan_no = lpmd.get(0).getLw_plan_no();
+		// 新增母卷物料跟踪:调用 新增实物物料状态跟踪
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setPrc_code("5BLW10");// 新增的状态
+		pmp.setCreate_time(createTime);
+		pmp.setObject_no(pmd.getObject_no());
+		pmp.setCreate_man_name(userName);
+		pmp.setRemark("");
+		// 新增物料跟踪:
+		INSERT_OBJ_PROCESS(pmp);
+		// 判断虚拟母卷对应的虚拟子卷是否 挂料完成
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null,
+				"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt() + "' and nvl(invalid_flg,0) =0", "", 0, 0);
+		int isum = 0;
+		if (lpmdc != null && lpmdc.size() > 0) {
+			for (PlnMaterielDetail pmdcc : lpmdc) {
+				PlnMaterielDetail pmdcu = new PlnMaterielDetail();
+				pmdcu.setSerial_no(pmdcc.getSerial_no());
+				pmdcu.setIs_finished("1");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdcu);
+				if (pmdcc.getObject_no() == null || "".equals(pmdcc.getObject_no())) {
+					// 统计 (OBJECT_NO=NULL的子卷数量)、虚拟子卷总数量
+					isum += 1;
+				}
+			}
+			// 如果(OBJECT_NO为NULL的数量==子卷总数
+			if (isum == lpmdc.size()) {
+				// 读取物料关系表【PRC_MATERIEL_RELATION】(where OBJECT_NO=实物母卷号 AND RELATION_TYPE=3)的记录
+				PrcMaterielRelation pmr = new PrcMaterielRelation();
+				pmr.setObject_no(lpmd.get(0).getObject_no());
+				pmr.setRelation_type(3);
+				List<PrcMaterielRelation> lpmr = this.getMapper(PrcMaterielRelationMapper.class).find(pmr, 0, 0);
+				if (lpmr == null || lpmr.size() == 0) {
+					// 如果 关系表记录为空(说明实物卷未切割,计划未执行),直接报错退出“母卷xxxx尚未进行切割操作!”;
+					throw new Exception("母卷[" + pmr.getObject_no() + "]尚未进行切割操作!");
+				} else {
+					// 修改虚拟物料表的母卷记录:OBJECT_NO=NULL; NEED_EXTOPT=1; LW_PLAN_NO=NULL
+					PlnMaterielDetail pmdu = new PlnMaterielDetail();
+					pmdu.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+					pmdu.setNeed_extopt("1");
+					this.getMapper(PlnMaterielDetailMapper.class).doUpdateLengthwiseFinshSum(pmdu);
+				}
+			} else {
+				// 获取虚拟母卷的下一工序代码,计算下一工序的 已设计量/数,欠设计量:欠设计量 +=(母卷单重 )
+				// 获取下个工序代码暂时方法,将来从质量取值
+//				String process_code = this.getBean(MesApiCrCrossCuttingMServiceImpl.class).getNext_process("2",
+//						pmd.getObject_no_vt());
+//				// 横剪,将来加上12mm
+//				if (process_code != null && processpoint.cross_cutting_code.equals(process_code)) {
+//					// 修改生产订单进程表
+//					PlnProdorderStatistic pps = new PlnProdorderStatistic();
+//					pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+//					pps.setCl_undsn(lpmd.get(0).getSingle_weight());
+//					this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//					// 修改订单进程表
+//					PlnOrderStatistic pos = new PlnOrderStatistic();
+//					pos.setOrder_no(lpmd.get(0).getOrder_no());
+//					pos.setCl_undsn(lpmd.get(0).getSingle_weight());
+//					this.getMapper(PlnOrderStatisticMapper.class).doUpdateClPlaned(pos);
+//				}
+//				this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), true);
+			}
+		}
+
+		// 修改虚拟物料表OPT_TIMES+=1; STATUS= 0PLW10;
+		// IS_NEXT_FINISHED=1(2018-06-19)(同步修改S1的[OPT_TIMES]、[STATUS]
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setIs_next_finished("1");
+		pmdu.setOpt_times((lpmd.get(0).getOpt_times() == null ? 0 : lpmd.get(0).getOpt_times()) + 1);
+		pmdu.setStatus("0PLW10");
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+		// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+		// -------------2018-03-21-------这个地方的lw_plan_no有点特殊的地方,所以没有直接调用InsertMatVtProc接口------------
+		PlnMaterielDetail pmdcq = new PlnMaterielDetail();
+		pmdcq.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdq = this.getMapper(PlnMaterielDetailMapper.class).find(pmdcq, 0, 0);
+		// 写虚拟物料履历,状态填: 子卷
+		PrcMaterielVtProcess pmvpc = new PrcMaterielVtProcess();
+		
+		// 20191001
+		long serial_no = 0l;
+		List<PrcMaterielVtProcess> pmpQ = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(null, "", "serial_no desc", 0, 1);
+		if (Utils.isNotEmpty(pmpQ)) {
+			serial_no = pmpQ.get(0).getSerial_no()+1;
+		}
+		pmvpc.setSerial_no(serial_no);
+		// end
+		
+		pmvpc.setObject_no_vt(lpmdq.get(0).getObject_no_vt());
+		pmvpc.setObject_no(lpmdq.get(0).getObject_no());
+		pmvpc.setObject_type(lpmdq.get(0).getObject_type());
+		pmvpc.setPline_code(lpmdq.get(0).getPline_code());
+		pmvpc.setStatus("0PLW10");
+		pmvpc.setOrder_no(lpmdq.get(0).getOrder_no());
+		pmvpc.setProd_order_no(lpmdq.get(0).getProd_order_no());
+		pmvpc.setLw_design_no(lpmdq.get(0).getLw_design_no());
+		pmvpc.setCl_design_no(lpmdq.get(0).getCl_design_no());
+		pmvpc.setRl_design_no(lpmdq.get(0).getRl_design_no());
+		pmvpc.setLw_plan_no(plan_no);
+		pmvpc.setCl_plan_no(lpmdq.get(0).getCl_plan_no());
+		pmvpc.setRl_plan_no(lpmdq.get(0).getRl_plan_no());
+		pmvpc.setSr_plan_no(lpmd.get(0).getSr_plan_no());
+		pmvpc.setSr_design_no(lpmd.get(0).getSr_design_no());
+		pmvpc.setAn_plan_no(lpmd.get(0).getAn_plan_no());
+		pmvpc.setAn_design_no(lpmd.get(0).getAn_design_no());
+		pmvpc.setBatch_no(lpmdq.get(0).getBatch_no());
+		pmvpc.setCreate_man_name(userName);
+		pmvpc.setCreate_time(createTime);
+		this.getMapper(PrcMaterielVtProcessMapper.class).doAdd(pmvpc);
+		// ----------------------------------------------------------------------
+
+		// 修改虚拟物料对应的 分条计划进程表
+		// MesCrSlittingD
+		// mcsd=this.getMapper(MesCrSlittingDMapper.class).findById(lpmd.get(0).getObject_no());
+		PlnLwPlanStatistic plps = new PlnLwPlanStatistic();
+		plps.setMat_lw(lpmd.get(0).getSingle_weight());// mcsd.getCoil_act_wgt());
+		plps.setMat_lw_cnt(1);
+		plps.setLw_plan_no(plan_no);
+		this.getMapper(PlnLwPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 分条计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BLW10
+		PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+		plpd.setLw_plan_no(plan_no);
+		// 分条计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BLW10
+		plpd.setStatus("5BLW10");
+		plpd.setObject_no_vt(pmd.getObject_no_vt());
+		this.getMapper(PlnLengthwisePlanDetailMapper.class).doUpdate(plpd);
+
+		// 分条计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(分条计划号);
+		doUpdatePlnLengthwisePlan(plan_no);
+
+		// 将未挂单的子卷 置为无效
+//		List<PlnMaterielDetail> child=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"' and nvl(invalid_flg,0) =0 and object_no is null", "", 0, 0);
+//		if (Utils.isNotEmpty(child)) {
+//			this.getBean(MesApiDesignInfoImpl.class).deleteChild(child);
+//		}
+	}
+
+	/**
+	 * 撤销分条 撤销虚拟母卷统计
+	 * 
+	 * @param object_no_vt 虚拟母卷号
+	 * @param object_no    实物母卷号
+	 * @throws Exception
+	 */
+	public void LengthwiseFinsh_SumCancel(PlnMaterielDetail pmd) throws Exception {
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+		// 工序点信息
+		List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+				"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+		ProcessPoint processpoint = new ProcessPoint(infoi);
+
+		// 修改物料附加信息
+		this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.slitting_code, false);
+
+		// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+		PlnMaterielDetail pmdq = new PlnMaterielDetail();
+		pmdq.setObject_no_vt(pmd.getObject_no_vt());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+		if (lpmd == null || lpmd.size() == 0) {
+			throw new Exception("虚拟物料无[" + pmd.getObject_no_vt() + "]卷!");
+		}
+
+		// 将无效的虚拟物料子卷恢复
+//		List<PlnMaterielDetail> child = this.getMapper(
+//				PlnMaterielDetailMapper.class).findWithCondition(
+//				null,
+//				"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//						+ "' and invalid_flg = '1'",
+//				"", 0, 0);
+//		if (Utils.isNotEmpty(child)) {
+//			this.getBean(MesApiDesignInfoImpl.class).recoveryChild(child);
+//		}
+		// 读取虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】,获取虚拟母卷最后一条
+		PrcMaterielVtProcess pmvp = new PrcMaterielVtProcess();
+		pmvp.setStatus("0PLW10");
+		pmvp.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PrcMaterielVtProcess> lpmvp = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(pmvp, "",
+				" create_time desc ", 0, 1);
+
+		// 循环 (MAT_OBJECT_NO_VT=虚拟母卷号) 的所有虚拟子卷记录
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+		List<PlnMaterielDetail> lpmdc = this.getMapper(PlnMaterielDetailMapper.class).find(pmdc, 0, 0);
+		for (PlnMaterielDetail pmdcc : lpmdc) {
+			PlnMaterielDetail pmdu = new PlnMaterielDetail();
+			pmdu.setSerial_no(pmdcc.getSerial_no());
+			pmdu.setIs_finished("0");
+			// 修改虚拟物料表【PLN_MATERIEL_DETAIL】:IS_FINISHED=0;
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+		}
+
+		// 修改虚拟物料表_母卷信息
+		PlnMaterielDetail pmdu = new PlnMaterielDetail();
+		pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+		pmdu.setNeed_extopt("0");
+		pmdu.setIs_next_finished("0");
+		pmdu.setLw_plan_no(lpmvp.get(0).getLw_plan_no());
+		pmdu.setStatus_desc("0PLW03");
+
+		if (lpmd.get(0).getObject_no() == null || "".equals(lpmd.get(0).getObject_no())) {
+			pmdu.setObject_no(lpmvp.get(0).getObject_no());
+		}
+		// 2018-06-23 opt_Times 之前一直没减,判断条件不对
+		if (lpmd.get(0).getOpt_times() != null) {
+			pmdu.setOpt_times(lpmd.get(0).getOpt_times() - 1);
+		}
+		this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+
+		// 新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+		InsertMatVtProc(lpmd.get(0).getObject_no_vt(), "0PLW03", userName, new Date());
+
+		// 修改虚拟物料对应的 分条计划进程表
+		PlnLwPlanStatistic plps = new PlnLwPlanStatistic();
+		plps.setMat_lw(-lpmd.get(0).getSingle_weight());
+		plps.setMat_lw_cnt(-1);
+		plps.setLw_plan_no(lpmd.get(0).getLw_plan_no());
+		this.getMapper(PlnLwPlanStatisticMapper.class).doUpdatePlaned(plps);
+
+		// 回退实物母卷的物料跟踪
+		PrcMaterielProcess pmp = new PrcMaterielProcess();
+		pmp.setObject_no(lpmd.get(0).getObject_no());
+		pmp.setPrc_code("5BLW10");
+		pmp.setRemark("撤销母卷分条");
+		pmp.setKeep_sametime_status(0);
+
+		ResultModel rm = ARRAYLIST(pmp);
+		if (!"0".equals(rm.getState())) {
+			throw new Exception("分条完成后,母卷状态已发生改变,不能撤销!");
+		}
+
+		// 分条计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BLW03
+		PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+		plpd.setLw_plan_no(lpmd.get(0).getLw_plan_no());
+		plpd.setStatus("5BLW03");
+		plpd.setObject_no_vt(pmd.getObject_no_vt());
+		this.getMapper(PlnLengthwisePlanDetailMapper.class).doUpdate(plpd);
+
+		// 分条计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(分条计划号);
+		doUpdatePlnLengthwisePlan(lpmd.get(0).getLw_plan_no());
+		// ----------------------------2018-06-19-------------------------------
+		// 获取虚拟母卷的下一工序代码,计算下一工序的 已设计量/数,欠设计量:欠设计量 +=(母卷单重 )
+		// --------------2018-10-16 修改,欠设计量在挂单的时候就一起减了
+		// 获取下个工序代码暂时方法,将来从质量取值
+//		String process_code = this.getBean(MesApiCrCrossCuttingMServiceImpl.class).getNext_process("2",pmd.getObject_no_vt());
+//		// 横剪,将来加上12mm
+//		if (process_code != null && processpoint.cross_cutting_code.equals(process_code)) {
+//			// 修改生产订单进程表
+//			PlnProdorderStatistic pps = new PlnProdorderStatistic();
+//			pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+//			pps.setCl_undsn(lpmd.get(0).getSingle_weight());
+//			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//			// 修改订单进程表
+//			PlnOrderStatistic pos = new PlnOrderStatistic();
+//			pos.setOrder_no(lpmd.get(0).getOrder_no());
+//			pos.setCl_undsn(lpmd.get(0).getSingle_weight());
+//			this.getMapper(PlnOrderStatisticMapper.class).doUpdateClPlaned(pos);
+//		}
+//		this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), false);
+	}
+	// --------------------------------分条完成
+	// End-----------------------------------------------------
+
+	// --------------------------------公共函数Start----------------------------------------------------
+	/**
+	 * 公共函数1 修改分条计划主表状态
+	 * 
+	 * @param 分条计划号
+	 * @throws Exception
+	 */
+	public void doUpdatePlnLengthwisePlan(String lwPlanNo) throws Exception {
+		PlnLengthwisePlan plp = new PlnLengthwisePlan();
+		plp.setLw_plan_no(lwPlanNo);
+		boolean flag = false;
+		String MIN_STATUS = "";
+		PlnLengthwisePlanDetail plpd = new PlnLengthwisePlanDetail();
+		plpd.setLw_plan_no(lwPlanNo);
+		List<PlnLengthwisePlanDetail> lplpd = this.getMapper(PlnLengthwisePlanDetailMapper.class)
+				.findWithCondition(plpd, "status <> '0PLWXX'", " status asc ", 0, 0);
+		if (lplpd == null || lplpd.size() == 0) {
+			throw new Exception("未找到分条计划明细数据!");
+		}
+		MIN_STATUS = lplpd.get(0).getStatus();
+
+		// 2018-06-11修改
+		// 如果明细记录中有卷开始作业,主表状态改为开始作业
+		for (PlnLengthwisePlanDetail plnL : lplpd) {
+			if ("5BLW03".equals(plnL.getStatus())) {
+				flag = true;
+				break;
+			}
+		}
+		if (flag) {
+			plp.setStatus("0PLW03");
+		} else if ("5BLW01".equals(MIN_STATUS)) {
+			plp.setStatus("0PLW01");
+		} else if (MIN_STATUS.compareTo("5BLW02") <= 0) {
+			plp.setStatus("0PLW02");
+		} else if (MIN_STATUS.compareTo("5BLW03") <= 0) {
+			plp.setStatus("0PLW03");
+		} else if (MIN_STATUS.compareTo("5BLW10") <= 0) {
+			plp.setStatus("0PLW10");
+		}
+		this.getMapper(PlnLengthwisePlanMapper.class).doUpdate(plp);
+	}
+
+	/**
+	 * 公共函数2 建立物料母子对应关系:
+	 * 
+	 * @param OBJECT_NO     实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @param RELATION_TYPE 关系类型 1:改号(原-现号码对应);2:轧制(板坯-钢板对应);3:剪切/切割(母-子对应)
+	 * @param REMARK        备注
+	 * @throws Exception
+	 */
+	public void doBuildRelation(PrcMaterielRelation pmr) throws Exception {
+
+		Date createTime = new Date();
+		// 判断物料关系表【PRC_MATERIEL_RELATION】中,是否存在对应关系 (OBJECT_NO=实物母卷号 AND
+		// SUB_OBJECT_NO=实物子卷号)
+		PrcMaterielRelation pmrQ = new PrcMaterielRelation();
+		pmrQ.setObject_no(pmr.getObject_no());
+		pmrQ.setSub_object_no(pmr.getSub_object_no());
+		// 如果有实际上只有一条
+		List<PrcMaterielRelation> lpmrQ = this.getMapper(PrcMaterielRelationMapper.class).find(pmrQ, 0, 0);
+		if (lpmrQ != null && lpmrQ.size() > 0) {
+			// 存在则 UPDATE RELATION_TYPE=关系类型 where OBJECT_NO=实物母卷号 AND SUB_OBJECT_NO=实物子卷号;
+			for (PrcMaterielRelation pmrc : lpmrQ) {
+				PrcMaterielRelation pmrU = new PrcMaterielRelation();
+				pmrU.setRelation_type(pmr.getRelation_type());
+				pmrU.setSerial_no(pmrc.getSerial_no());
+				this.getMapper(PrcMaterielRelationMapper.class).update(pmrU);
+			}
+		} else {
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+
+			// 不存在则,插入对应关系:
+			PrcMaterielRelation pmrI = new PrcMaterielRelation();
+			pmrI.setObject_no(pmr.getObject_no());
+			pmrI.setSub_object_no(pmr.getSub_object_no());
+			pmrI.setRelation_type(pmr.getRelation_type());
+			pmrI.setPrc_code(pmr.getPrc_code());// 产生工序
+			pmrI.setCreate_man_name(userName);
+			pmrI.setCreate_time(createTime);
+			pmrI.setRemark(pmr.getRemark());
+			this.getMapper(PrcMaterielRelationMapper.class).doAdd(pmrI);
+		}
+
+	}
+
+	/**
+	 * 公共函数3 断开物料母子对应关系:
+	 * 
+	 * @param OBJECT_NO     实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @throws Exception
+	 */
+	public void doBuildRelationRemove(PrcMaterielRelation pmr) throws Exception {
+		// 判断物料关系表【PRC_MATERIEL_RELATION】中,是否存在对应关系 (OBJECT_NO=实物母卷号 AND
+		// SUB_OBJECT_NO=实物子卷号)
+		PrcMaterielRelation pmrQ = new PrcMaterielRelation();
+		pmrQ.setObject_no(pmr.getObject_no());
+		pmrQ.setSub_object_no(pmr.getSub_object_no());
+		// 如果有实际上只有一条
+		List<PrcMaterielRelation> lpmrQ = this.getMapper(PrcMaterielRelationMapper.class).find(pmrQ, 0, 0);
+		if (lpmrQ != null && lpmrQ.size() > 0) {
+			// 存在则删除
+			for (PrcMaterielRelation pmrc : lpmrQ) {
+				this.getMapper(PrcMaterielRelationMapper.class).delete(pmrc.getSerial_no());
+			}
+		}
+	}
+
+	// --------------------------------公共函数End----------------------------------------------------
+
+	// --------------------------------插入实物进程表函数Start----------------------------------------------------
+	/**
+	 * 插入实物进程表函数
+	 * 
+	 * @param pmp object_no 实物物料号 prc_code status 新增的状态 create_time 操作时间 remark 备注
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public int INSERT_OBJ_PROCESS(PrcMaterielProcess pmp) throws Exception {
+		boolean IS_OK = true;
+		ArrayList<String> BEFORE_PROCS = new ArrayList<String>();
+		String B_STATUS = "";
+
+		if (pmp.getPrc_code() == null || "".equals(pmp.getPrc_code())) {
+			return 0;
+		}
+
+		// 循环查询集合
+		List<PrcMaterielProcess> lpmp = this.getMapper(PrcMaterielProcessMapper.class).doQuery(pmp);
+		int i = 0;
+		boolean ycjs = false;
+		for (PrcMaterielProcess pmpc : lpmp) {
+			if (pmpc.getRemark() != null && pmpc.getRemark().contains("一次结算")) {
+				ycjs = true;
+			}
+			BEFORE_PROCS.add(pmpc.getPrc_code());
+			// 第一次循环(物料最后一个状态数据),保存 操作时间和状态
+			if (i == 0) {
+				B_STATUS = pmpc.getPrc_code();
+			}
+			i++;
+		}
+		if (BEFORE_PROCS.contains(pmp.getPrc_code()) && !ycjs) {
+			return 0; // 如果最后状态中,存在传入状态。则直接退出,不新增。
+		}
+
+		// 进程转移白名单 (暂时实现“必须唯一的转移”功能。即有限制时,前后进程状态必须满足此条件)
+		IS_OK = true;
+		PrcMatprocWhitelist pmw = new PrcMatprocWhitelist();
+		pmw.setPrc_code(pmp.getPrc_code());
+		pmw.setAllow_type(1);
+		String creatTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(pmp.getCreate_time());
+		String sWhere = " begin_time<= to_date('" + creatTime
+				+ "', 'yyyy-mm-dd hh24:mi:ss') - 1/24/60/60	and end_time>= to_date('" + creatTime
+				+ "', 'yyyy-mm-dd hh24:mi:ss') + 1/24/60/60 ";
+		List<PrcMatprocWhitelist> lpmw = this.getMapper(PrcMatprocWhitelistMapper.class).findWithCondition(pmw, sWhere,
+				"", 0, 0);
+		for (PrcMatprocWhitelist pmwc : lpmw) {
+			IS_OK = false;
+			if ("*".equals(pmwc.getPrc_code_bf()) || BEFORE_PROCS.indexOf(pmwc.getPrc_code()) > -1) {
+				IS_OK = true;
+				break;
+			}
+		}
+		if (!IS_OK) {
+			throw new Exception("不满足进程转移条件![白名单]");
+		}
+
+		// 进程转移黑名单 (暂时实现“必须唯一的转移”功能。即有限制时,前后进程状态必须满足此条件)
+		IS_OK = true;
+		PrcMatprocBlacklist pmb = new PrcMatprocBlacklist();
+		pmb.setPrc_code(pmp.getPrc_code());
+		pmb.setAllow_type(1);
+		List<PrcMatprocBlacklist> lpmb = this.getMapper(PrcMatprocBlacklistMapper.class).findWithCondition(pmb, sWhere,
+				"", 0, 0);
+		if (lpmb != null && lpmb.size() > 0) {
+			for (PrcMatprocBlacklist pmwb : lpmb) {
+				if (BEFORE_PROCS.indexOf(pmwb.getPrc_code()) > -1) {
+					IS_OK = false;
+					break;
+				}
+			}
+		}
+		if (!IS_OK) {
+			throw new Exception("不满足进程转移条件![黑名单]");
+		}
+
+		PlnMaterielDetail pmd = new PlnMaterielDetail();
+		// pmd.setInvalid_flg(1);
+		pmd.setObject_no(pmp.getObject_no());
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmd,
+				" nvl (invalid_flg, '0') <> 1 ", "", 0, 1);
+		if (lpmd != null && lpmd.size() > 0) {
+			pmp.setObject_type(lpmd.get(0).getObject_type());
+			pmp.setPline_code(lpmd.get(0).getPline_code());
+			pmp.setOrder_no(lpmd.get(0).getOrder_no());
+			pmp.setProd_order_no(lpmd.get(0).getProd_order_no());
+			pmp.setLw_design_no(lpmd.get(0).getLw_design_no());
+			pmp.setLw_plan_no(lpmd.get(0).getLw_plan_no());
+			pmp.setCl_design_no(lpmd.get(0).getCl_design_no());
+			pmp.setCl_plan_no(lpmd.get(0).getCl_plan_no());
+			pmp.setRl_design_no(lpmd.get(0).getRl_design_no());
+			pmp.setRl_plan_no(lpmd.get(0).getRl_plan_no());
+			pmp.setBatch_no(lpmd.get(0).getBatch_no());
+		}
+		pmp.setPrc_code_bf(B_STATUS);
+
+		List<PrcMaterielProcess> lpmpNo = this.getMapper(PrcMaterielProcessMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		if (lpmpNo == null || lpmpNo.size() == 0) {
+			pmp.setSerial_no(1);
+		} else {
+			pmp.setSerial_no(lpmpNo.get(0).getSerial_no() + 1);
+		}
+
+		// 增加进程跟踪记录
+		this.getMapper(PrcMaterielProcessMapper.class).insert(pmp);
+		
+		// 增加物料进程记录抛送到tbdipdo:202301013刘侣
+		ResultModel prm = this.getBean(SlmFundFirstDetailServiceImpl.class).doProsIns(pmp);
+		if ("500".equals(prm.getState())) {
+			throw new Exception(prm.getMsgInfo());
+		}
+		// end
+		
+		
+		return 1;
+	}
+
+	/**
+	 * 撤销实物物料状态跟踪函数
+	 * 
+	 * @param pmp object_no 实物物料号 prc_code status 要删除的最后状态,可传空 keep_sametime_status
+	 *            是否保留同时间点的其他状态 remark 备注
+	 * @return 将要回退的状态
+	 */
+	public ResultModel ARRAYLIST(PrcMaterielProcess pmp) throws Exception {
+		ResultModel rm = new ResultModel();
+
+		int num;
+		int V_GO_NEXT = 0;
+		List<PrcMaterielProcess> lpmp = this.getMapper(PrcMaterielProcessMapper.class).doQueryAry1(pmp);
+		PrcMaterielProcess pmpr = null;
+		if (pmp.getPrc_code() != null) {
+			pmpr = null;
+			// 查找传入状态值是否是最后状态
+			num = 1;// 这里>0表示未找到数据
+			if (lpmp != null && lpmp.size() > 0) {
+				for (PrcMaterielProcess pmpc : lpmp) {
+					if (pmpc.getRn() == 1) {
+						if (num == 1) {
+							pmpr = pmpc;
+						}
+						// 如果保留同时间点的其他状态,则传入状态必须是最后一条记录, 否则退出
+						if (num == 1 && pmp.getKeep_sametime_status() != 0
+								&& !pmpc.getPrc_code().equals(pmp.getPrc_code())) {
+							break;
+						}
+						// 找到数据,传入的要删除的状态是 最后状态
+						if (pmpc.getPrc_code().equals(pmp.getPrc_code())) {
+							num = 0;
+							break;
+						}
+						num++;
+					}
+				}
+			}
+			// --不是最后状态,返回最后状态值。
+			if (num > 0) {
+				rm.setState("-2");
+				rm.setData(pmpr);
+				return rm;
+			}
+		}
+
+		if (lpmp != null && lpmp.size() > 0) {
+			for (PrcMaterielProcess pmpc : lpmp) {
+				if (pmpc.getRn() == 2 || V_GO_NEXT == 1) {
+					pmpr = pmpc;
+					break;
+				}
+
+				PrcMaterielProcess pmpu = new PrcMaterielProcess();
+				pmpu.setSerial_no(pmpc.getSerial_no());
+				pmpu.setInvalid_flg(1);
+
+				// ‘传入状态’为空(无论参数4如何设置), 或 对‘传入状态’不为空,参数4设为0(不保留)的 最后时间的所有状态 置为无效
+				if (pmpc.getRn() == 1 && (pmp.getKeep_sametime_status() == 0
+						|| (pmp.getPrc_code() == null || "".equals(pmp.getPline_code())))) {
+					if (pmp.getRemark() != null && !"".equals(pmp.getRemark())) {
+						pmpu.setRemark(pmpc.getRemark() + ";" + pmp.getRemark());
+					} else {
+						pmpu.setRemark(pmpc.getRemark());
+					}
+					this.getMapper(PrcMaterielProcessMapper.class).update(pmpu);
+					
+					// 增加物料进程记录抛送到tbdipdo:202301013刘侣
+					ResultModel prm = this.getBean(SlmFundFirstDetailServiceImpl.class).doProsUpd(pmpu);
+					if ("500".equals(prm.getState())) {
+						throw new Exception(prm.getMsgInfo());
+					}
+					// end
+				}
+				// ‘传入状态’不为空,参数4的值为1(保留),将最后时间的指定状态 置为无效
+				else if (pmp.getKeep_sametime_status() != 0
+						&& (pmp.getPrc_code() == null || "".equals(pmp.getPline_code()))) {
+					if (pmp.getRemark() != null && !"".equals(pmp.getRemark())) {
+						pmpu.setRemark(pmpc.getRemark() + ";" + pmp.getRemark());
+					} else {
+						pmpu.setRemark(pmpc.getRemark());
+					}
+					this.getMapper(PrcMaterielProcessMapper.class).update(pmpu);
+					
+					// 增加物料进程记录抛送到tbdipdo:202301013刘侣
+					ResultModel prm = this.getBean(SlmFundFirstDetailServiceImpl.class).doProsUpd(pmpu);
+					if ("500".equals(prm.getState())) {
+						throw new Exception(prm.getMsgInfo());
+					}
+					// end
+
+					V_GO_NEXT = 1;
+				} else {
+					pmpr = pmpc;
+					break;
+				}
+			}
+		}
+		rm.setState("0");
+		rm.setData(pmpr);
+		return rm;
+	}
+	// --------------------------------插入实物进程表函数End----------------------------------------------------
+
+	/**
+	 * 新增虚拟物料履历表数据
+	 * 
+	 * @param ObjectNoVt
+	 * @param status
+	 * @param createUserName
+	 * @param createTime
+	 */
+	public void InsertMatVtProc(String ObjectNoVt, String status, String createUserName, Date createTime) {
+		PlnMaterielDetail pmdc = new PlnMaterielDetail();
+		pmdc.setObject_no_vt(ObjectNoVt);
+		List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(pmdc, 0, 0);
+		long serial_no = 0l;
+		List<PrcMaterielVtProcess> pmp = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(null, "", "serial_no desc", 0, 1);
+		if (Utils.isNotEmpty(pmp)) {
+			serial_no = pmp.get(0).getSerial_no()+1;
+		}
+		// 写虚拟物料履历,状态填: 子卷
+		PrcMaterielVtProcess pmvpc = new PrcMaterielVtProcess();
+		pmvpc.setSerial_no(serial_no);
+		pmvpc.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+		pmvpc.setObject_no(lpmd.get(0).getObject_no());
+		pmvpc.setObject_type(lpmd.get(0).getObject_type());
+		pmvpc.setPline_code(lpmd.get(0).getPline_code());
+		pmvpc.setStatus(status);
+		pmvpc.setOrder_no(lpmd.get(0).getOrder_no());
+		pmvpc.setProd_order_no(lpmd.get(0).getProd_order_no());
+		pmvpc.setLw_design_no(lpmd.get(0).getLw_design_no());
+		pmvpc.setCl_design_no(lpmd.get(0).getCl_design_no());
+		pmvpc.setRl_design_no(lpmd.get(0).getRl_design_no());
+		pmvpc.setSr_plan_no(lpmd.get(0).getSr_plan_no());
+		pmvpc.setSr_design_no(lpmd.get(0).getSr_design_no());
+		pmvpc.setAn_plan_no(lpmd.get(0).getAn_plan_no());
+		pmvpc.setAn_design_no(lpmd.get(0).getAn_design_no());
+		pmvpc.setLw_plan_no(lpmd.get(0).getLw_plan_no());
+		pmvpc.setCl_plan_no(lpmd.get(0).getCl_plan_no());
+		pmvpc.setRl_plan_no(lpmd.get(0).getRl_plan_no());
+		pmvpc.setBatch_no(lpmd.get(0).getBatch_no());
+		pmvpc.setCreate_man_name(createUserName);
+		pmvpc.setCreate_time(createTime);
+		this.getMapper(PrcMaterielVtProcessMapper.class).doAdd(pmvpc);
+	}
+
+	/**
+	 * 函数_通过加工计划产生设计
+	 * 
+	 * @param pro_order_no    生产订单号
+	 * @param design_quantity 设计原料卷总数
+	 * @param ypd             物料信息
+	 * @param machine_code    机台代码 M0001/M0002
+	 * @throws Exception
+	 */
+	public PlnLengthwiseDsnMain ProcessingPlanDsn(String pro_order_no, Integer design_quantity, YdmProductDetail ypd,
+			String pd, String machine_code) throws Exception {
+		PlnLengthwiseDsnMain slw_design_no = null;
+		String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+		PlnProdorder pp = new PlnProdorder();
+		pp.setProd_order_no(pro_order_no);
+		List<PlnProdorder> lpp = this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+		// 根据传入的生产订单号,读取生产订单对应的生产加工表[PLN_PROCESS_PLAN]
+		PlnProcessPlan ppp = new PlnProcessPlan();
+		ppp.setOrder_no(lpp.get(0).getOrder_no());
+		ppp.setValid_flag("1");
+		List<PlnProcessPlan> lppp = this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, null,
+				" cut_order_no ", 0, 0);
+		if (lppp == null || lppp.size() == 0) {
+			throw new Exception("未找到生产订单[" + ppp.getOrder_no() + "]对应的生产加工信息");
+		}
+		double sWidth = 0;
+		int iCutCount = 0;
+		for (PlnProcessPlan pppc : lppp) {
+			sWidth += pppc.getWidth().doubleValue() * pppc.getCut_num().intValue();
+			iCutCount += pppc.getCut_num().intValue();
+		}
+
+		// 保存设计主表数据: 纵剪设计号:DLW+YYMMDD+6流水号
+		String sDate = new SimpleDateFormat("yyMMdd").format(new Date());
+		PlnLengthwiseDsnMain pldm = new PlnLengthwiseDsnMain();
+		List<PlnLengthwiseDsnMain> lpdmNo = this.getMapper(PlnLengthwiseDsnMainMapper.class).findWithCondition(null, "",
+				" serial_no desc ", 0, 1);
+		// long No=this.getMapper(PlnLengthwiseDsnMainMapper.class).doQueryMaxNo();
+		pldm.setLw_design_no("DLW" + sDate + String.format("%06d", 1));
+		if (lpdmNo != null && lpdmNo.size() > 0) {
+			pldm.setSerial_no(lpdmNo.get(0).getSerial_no() + 1);
+			if (sDate.equals(lpdmNo.get(0).getLw_design_no().substring(3, 9))) {
+				pldm.setLw_design_no("DLW" + sDate + String.format("%06d",
+						Integer.parseInt(lpdmNo.get(0).getLw_design_no().substring(9, 15)) + 1));
+			}
+		}
+
+		pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+		pldm.setOrder_no(lpp.get(0).getOrder_no());
+		pldm.setPline_code(lpp.get(0).getPline_code());
+		pldm.setSteel_code(lpp.get(0).getSteel_code());
+
+		String isMulti = "0";// 是否拼料 根据订单数判断,多个订单填1,否则填0
+		pldm.setIs_multi(isMulti);
+		pldm.setMat_diameter_inn(ypd.getDiameter_inn());
+		pldm.setMat_diameter_out(ypd.getDiameter_out());
+		pldm.setMat_single_weight(ypd.getFactweight());
+		pldm.setMat_width(ypd.getWidth());
+		pldm.setProd_rate(sWidth / lppp.get(0).getMat_width().doubleValue());
+		pldm.setSub_count(iCutCount);
+		pldm.setMat_thick(lppp.get(0).getThick());
+		pldm.setMat_length(lppp.get(0).getLength());
+		pldm.setSingle_weight(ypd.getFactweight());
+		if (lppp.size() == 1) {
+			pldm.setThick(lppp.get(0).getThick());
+			pldm.setWidth(lppp.get(0).getWidth());
+			pldm.setLength(lppp.get(0).getLength());
+			pldm.setDiameter_inn(lppp.get(0).getDiameter_inn());
+			pldm.setDiameter_out(lppp.get(0).getDiameter_out());
+			pldm.setSingle_weight(lppp.get(0).getEstimate_weight());
+		}
+
+		if (!"1".equals(lpp.get(0).getOrder_nature()) && !"3".equals(lpp.get(0).getOrder_nature())) {
+			pldm.setCut_style(lppp.get(0).getCut_style());
+		}
+
+		pldm.setCrosscut_style(lppp.get(0).getCrosscut_style());
+		pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+		pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+		pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+		pldm.setDesign_quantity(design_quantity);
+		pldm.setDesign_weight(ypd.getFactweight());
+
+		pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+		pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+		pldm.setCreate_man_name(userName);
+		pldm.setCreate_time(new Date());
+		pldm.setIs_finished(0);
+		pldm.setReserve_1(lppp.get(0).getProduce_no());
+		this.getMapper(PlnLengthwiseDsnMainMapper.class).insert(pldm);
+		slw_design_no = pldm;
+
+		// 倒叙取一条
+		List<PlnLengthwiseDsnMultinfo> lpdmM = this.getMapper(PlnLengthwiseDsnMultinfoMapper.class)
+				.findWithCondition(null, "", " serial_no desc ", 0, 1);
+		long DsnNo = 1;
+		if (lpdmM != null && lpdmM.size() > 0) {
+			DsnNo = lpdmM.get(0).getSerial_no() + 1;
+		}
+
+		int iCrosscut = 0;
+		if ("2".equals(lppp.get(0).getCrosscut_style()) || "3".equals(lppp.get(0).getCrosscut_style())) {
+			iCrosscut = Integer.parseInt(lppp.get(0).getCrosscut_style());
+		} else {
+			iCrosscut = 1;
+		}
+
+		int isubSeq = 1;
+		for (int idx_hq = 1; idx_hq <= iCrosscut; idx_hq++) {
+			int V_分条序号 = 1;
+			for (PlnProcessPlan pppc : lppp) {
+				for (int idx_sub = 1; idx_sub <= pppc.getCut_num().intValue(); idx_sub++) {
+					// 其中:LW_SEQ 分条序号=V_分条序号; SEG_SEQ 分段序号=idx_hq;
+					// -----------------写拼料-----------------------------
+					PlnLengthwiseDsnMultinfo pldmc = new PlnLengthwiseDsnMultinfo();
+					pldmc.setSerial_no(DsnNo++);
+					pldmc.setLw_design_no(pldm.getLw_design_no());
+					pldmc.setLw_seq(V_分条序号++);
+					pldmc.setSeg_seq(idx_hq);
+					pldmc.setOrder_no(lpp.get(0).getOrder_no());
+					pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+					pldmc.setThick(pppc.getThick());
+					pldmc.setWidth(pppc.getWidth());
+					pldmc.setLength(pppc.getLength());
+					pldmc.setDiameter_inn(pppc.getDiameter_inn());
+					pldmc.setDiameter_out(pppc.getDiameter_out());
+					pldmc.setWeight(pldm.getSingle_weight().doubleValue() * pppc.getWidth().doubleValue()
+							/ (pldm.getMat_width().doubleValue() * Integer.parseInt(pldm.getCrosscut_style())));
+					pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+					pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+					pldmc.setSub_seq(isubSeq++);
+
+					if (pldmc.getSub_seq() >= 1000 || pldmc.getLw_seq() >= 1000) {
+						throw new Exception(
+								"子卷序号[" + pldmc.getSub_seq() + "]和分条序号[" + pldmc.getLw_seq() + "]不在设备限制范围内!");
+					}
+					this.getMapper(PlnLengthwiseDsnMultinfoMapper.class).insert(pldmc);
+				}
+			}
+		}
+
+		return slw_design_no;
+	}
+
+	/**
+	 * 根据产线获取产线的规格参数
+	 * 
+	 * @param thick 厚度度
+	 * @throws Exception
+	 */
+	public List<ComDsnPltlmt> getMachineRestrictDb(Double thick, String machine_code) throws Exception {
+		ComDsnPltlmt cdp = new ComDsnPltlmt();
+		cdp.setPlt("Y1");// 工厂
+		cdp.setPlt_line(machine_code);// 产线
+		List<ComDsnPltlmt> lcdp = this.getMapper(ComDsnPltlmtMapper.class).find(cdp, 0, 0);
+		if (lcdp == null || lcdp.size() == 0) {
+			throw new Exception("未找到产线");
+		}
+		// 最大分条数
+		List<ComDsnCutstd> lcdc = this.getMapper(ComDsnCutstdMapper.class).findWithCondition(null,
+				"APPLY_ITEM = '20001'  AND PLT_line = '" + machine_code + "' and limit1_min<=" + thick
+						+ " and limit1_max>=" + thick,
+				"", 0, 0);
+		if (lcdc == null || lcdc.size() == 0) {
+			throw new Exception("厚度[" + thick + "]未找到最大分条数");
+		}
+		cdp.setApply_item("lim_max_split");
+		cdp.setMin(lcdc.get(0).getValue1());
+		lcdp.add(cdp);
+
+		return lcdp;
+	}
+
+	/**
+	 * 获取基础数据比较厚度值
+	 * 
+	 * @param a 订单值
+	 * @param b 实绩值
+	 */
+	public ResultModel CompareValues(double a, double b) {
+		ResultModel rm = this.getBean(PbModelDbServiceImpl.class).findPlnThickRangeCmbDb();
+		if (!"200".equals(rm.getState())) {
+			rm.setMsgInfo("获取厚度公差范围失败!");
+			return rm;
+		}
+		List<PbModelDb> lpmd = (List<PbModelDb>) rm.getData();
+		if (lpmd == null || lpmd.size() == 0) {
+			rm.setState("500");
+			rm.setMsgInfo("请先配置厚度公差范围!");
+			return rm;
+		}
+		int i = 0;
+		try {
+			for (PbModelDb pmd : lpmd) {
+				if (pmd.getId().equals("200101")) {// 范围
+					if (b - a > (Double.parseDouble(pmd.getRegionkey()))) {
+						rm.setState("500");
+						rm.setMsgInfo("厚度差额 [实际值-订单值 : "
+								+ new BigDecimal(b - a).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue()
+								+ "] 超出最大公差[" + Double.parseDouble(pmd.getRegionkey()) + "],不能挂单!");
+						return rm;
+					}
+					i++;
+				}
+
+				if (pmd.getId().equals("200102")) {
+					if (b - a < (Double.parseDouble(pmd.getRegionkey()))) {
+						rm.setState("500");
+						rm.setMsgInfo("厚度差额[实际值-订单值 :"
+								+ new BigDecimal(b - a).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue() + "]小于最小公差["
+								+ Double.parseDouble(pmd.getRegionkey()) + "],不能挂单!");
+						return rm;
+					}
+					i++;
+				}
+			}
+			if (i != 2) {
+				rm.setState("500");
+				rm.setMsgInfo("厚度公差配置错误!");
+				return rm;
+			}
+			rm.setState("200");
+		} catch (Exception ex) {
+			rm.setState("500");
+			rm.setMsgInfo("厚度公差配置错误!");
+			return rm;
+		}
+		return rm;
+	}
+
+	/**
+	 * 给物流的接口 订单统计信息 新增入库量、回退入库量
+	 * 
+	 * @param prod_order_no 生产订单号
+	 * @param coilNo        实物卷号
+	 * @param optionType    操作类型 1为新增入库量 2为回退入库量
+	 * @throws Exception
+	 */
+	public ResultModel YdmUpdateOrderStatisticsInfo(String prod_order_no, String coilNo, String optionType)
+			throws Exception {
+		ResultModel rm = new ResultModel();
+
+		PlnProdorderStatistic pps = new PlnProdorderStatistic();
+		pps.setProd_order_no(prod_order_no);
+		List<PlnProdorderStatistic> lpps = this.getMapper(PlnProdorderStatisticMapper.class).find(pps, 0, 1);
+		if (lpps == null || lpps.size() == 0) {
+			rm.setState("500");
+			rm.setMsgInfo("未找到生产订单进程数据!");
+			return rm;
+		}
+		PlnOrderStatistic pos = new PlnOrderStatistic();
+		pos.setOrder_no(lpps.get(0).getOrder_no());
+		List<PlnOrderStatistic> lpos = this.getMapper(PlnOrderStatisticMapper.class).find(pos, 0, 1);
+		if (lpos == null || lpos.size() == 0) {
+			rm.setState("500");
+			rm.setMsgInfo("未找到订单进程数据");
+			return rm;
+		}
+
+		CommonPage<YdmProductDetail> cp = new CommonPage<YdmProductDetail>();
+		// 判断实物,和订单原料卷的厚、牌号、交货状态是否匹配
+		YdmProductDetail ypd = new YdmProductDetail();
+		ypd.setCoilno(coilNo);
+		cp.setObject(ypd);
+		ResultModel rmValid = this.getBean(LmsApiServiceImpl.class).doFindCoilno(cp);
+		if (!"200".equals(rmValid.getState())) {
+			return rmValid;
+		}
+		List<YdmProductDetail> lypd = (List<YdmProductDetail>) rmValid.getData();
+		double weights = (lypd.get(0).getFactweight() == null ? 0 : lypd.get(0).getFactweight().doubleValue());
+
+		if (optionType.equals("1")) {
+			pps.setStocked(weights);
+			pps.setStocked_cnt(1);
+			pos.setStocked(weights);
+			pos.setStocked_cnt(1);
+		} else {
+			pps.setStocked(-weights);
+			pps.setStocked_cnt(-1);
+			pos.setStocked(-weights);
+			pos.setStocked_cnt(-1);
+		}
+
+		this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+		this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+		rm.setState("200");
+		return rm;
+	}
+
+	/**
+	 * 给物流的接口 通过订单号,找 采购合同号
+	 * 
+	 * @param order_no 订单号
+	 * @throws Exception
+	 */
+	public ResultModel getPurchaseContractNoInfo(String order_no) throws Exception {
+		ResultModel rm = new ResultModel();
+		try {
+//			PlnProcessPlan ppp=new PlnProcessPlan();
+//			ppp.setOrder_no(order_no);
+//			List<PlnProcessPlan> lppp = this.getMapper(PlnProcessPlanMapper.class).find(ppp, 0, 0);
+
+			PlnProdorder p = new PlnProdorder();
+			p.setOrder_no(order_no);
+			List<PlnProdorder> lppq = this.getMapper(PlnProdorderMapper.class).find(p, 0, 0);
+			if (lppq != null && lppq.size() > 0) {
+				rm.setState("200");
+				rm.setData(lppq.get(0).getPurchase_contract_no());
+			} else {
+				rm.setState("400");
+				rm.setErrorInfo("未找到数据");
+			}
+		} catch (Exception ex) {
+			rm.setState("500");
+			rm.setErrorInfo("未找到数据:" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	/**
+	 * 根据订单号查询生产订单信息
+	 * 
+	 * @param order_no
+	 * @return order_no销售订单号, prod_order_no生产订单号, customer_no客户编号,
+	 *         customer_name客户名称, reciver_unit_no收货单位编号, reciver_unit_name收货单位名称
+	 */
+	public ResultModel YdmCoilNoForPlnProdorder(String order_no) {
+		ResultModel rm = new ResultModel();
+		try {
+			List<PlnProdorder> lppp = this.getMapper(PlnProdorderMapper.class).YdmCoilNoForPlnProdorder(order_no);
+			if (lppp != null && lppp.size() > 0) {
+				for (PlnProdorder ppp : lppp) {
+					SlmOrderInfo soi = new SlmOrderInfo();
+					soi.setContract_no(ppp.getContract_no());
+					soi.setContract_line_no(ppp.getContract_line_no());
+					soi.setOrder_seq(ppp.getOrder_seq());
+					List<SlmOrderInfo> lsoi = this.getMapper(SlmOrderInfoMapper.class).find(soi, 0, 1);
+					if (lsoi != null && lsoi.size() != 0) {
+						ppp.setOrder_no(lsoi.get(0).getOrder_no());
+					}
+				}
+				rm.setState("200");
+				rm.setData(lppp);
+			} else {
+				rm.setState("400");
+				rm.setErrorInfo("未找到数据");
+			}
+		} catch (Exception ex) {
+			rm.setState("500");
+			rm.setErrorInfo("未找到数据:" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	/**
+	 * 3mm [ { "object": { "order_no": "", "heatno": "", "batchno": "",
+	 * "surface_rst": "" "machine_code":"" }, "memo1": "", "startTime":
+	 * "2018-08-15", "endTime": "2018-09-14", "pageIndex": 4, "pageSize": 25 } ]
+	 * 调用生产计划模块提供的接口获取,未进行综合判定的物料信息 分页查询 startTime 开始时间 endTime 结束时间 memo2:投料卷号
+	 * memo1 上表、下表或者边部检验页面(U、D、E) memo1="U" -----为上表
+	 */
+	public ResultModel doQueryMesCrWeb_3mm(CommonPage<MesCrCrossCuttingD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesCrCrossCuttingD y = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = "";
+		if (y.getOrder_no() != null && y.getOrder_no().equals("")) {
+			swhere += " and ydm.ORDERNO like '%" + y.getOrder_no() + "%'";
+		}
+		if (y.getHeatno() != null && y.getHeatno().equals("")) {
+			swhere += " and ydm.HEATNO like '%" + y.getHeatno() + "%'";
+		}
+		if (y.getBatchno() != null && y.getBatchno().equals("")) {
+			swhere += " and ydm.BATCHNO like '%" + y.getBatchno() + "%'";
+		}
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {
+			swhere += " and ydm.materailcoilno like '%" + cp.getMemo4() + "%'";
+		}
+		List<HashMap> list = new ArrayList<>();
+
+		try {
+			// 增加页面"检查结果"查询临时方法,将来可修改。
+			if ("B".equals(cp.getMemo1().trim())) {
+				swhere = " and ydm.SURFACERESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesCrCrossCuttingDMapper.class).doQueryMesCrWeb1((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+			else {
+				swhere = " and ydm.MEASURE_RESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesCrCrossCuttingDMapper.class).doQueryMesCrWeb2((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+
+			for (HashMap hashMap : list) {
+				if (hashMap.get("COIL_NO") != null) {
+					QcmJudgeSurface qjs = new QcmJudgeSurface();
+					qjs.setMaterial_no((String) hashMap.get("COIL_NO"));
+
+					List<QcmJudgeSurface> lqjsq = this.getMapper(QcmJudgeSurfaceMapper.class).find(qjs, 0, 0);
+					if (lqjsq != null && lqjsq.size() > 0) {
+						for (QcmJudgeSurface q : lqjsq) {
+							if (q.getSurface_id().contains("U")) {
+								qjs.setSf_type("U");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_U", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_U", list2.get(0).getFlaw_desc());
+								}
+
+							} else if (q.getSurface_id().contains("D")) {
+								qjs.setSf_type("D");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_D", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_D", list2.get(0).getFlaw_desc());
+								}
+							} else if (q.getSurface_id().contains("E")) {
+								qjs.setSf_type("E");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_E", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_E", list2.get(0).getFlaw_desc());
+								}
+							}
+
+						}
+					}
+					
+				}
+			}
+
+			pm.setRows(list);
+			pm.setTotal(this.getMapper(MesCrCrossCuttingDMapper.class).doQueryMesCrWebCount1(cp.getObject(),
+					cp.getStartTime(), cp.getEndTime(), cp.getMemo2(), swhere));
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	
+	/**
+	 *轧机 调用生产计划模块提供的接口获取,未进行综合判定的物料信息 分页查询 startTime 开始时间 endTime 结束时间
+	 * memo2:投料卷号 memo1 上表、下表或者边部检验页面(U、D、E) memo1="U" -----为上表
+	 */
+	public ResultModel doQueryMesCrWeb_rcm(CommonPage<MesRcmD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesRcmD y = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = "";
+		if (y.getOrder_no() != null && !y.getOrder_no().equals("")) {
+			swhere += " and ydm.ORDERNO like '%" + y.getOrder_no() + "%'";
+		}
+		if (y.getHeatno() != null && !y.getHeatno().equals("")) {
+			swhere += " and ydm.HEATNO like '%" + y.getHeatno() + "%'";
+		}
+		if (y.getBatchno() != null && !y.getBatchno().equals("")) {
+			swhere += " and ydm.BATCHNO like '%" + y.getBatchno() + "%'";
+		}
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {
+			swhere += " and ydm.materailcoilno like '%" + cp.getMemo4() + "%'";
+		}
+		List<HashMap> list = new ArrayList<>();
+
+		try {
+			// 增加页面"检查结果"查询临时方法,将来可修改。
+			if ("B".equals(cp.getMemo1().trim())) {
+				swhere = " and ydm.SURFACERESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesRcmMMapper.class).doQueryMesCrWeb1((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+			else {
+				swhere = " and ydm.MEASURE_RESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesRcmMMapper.class).doQueryMesCrWeb2((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+
+			for (HashMap hashMap : list) {
+				if (hashMap.get("COIL_NO") != null) {
+					QcmJudgeSurface qjs = new QcmJudgeSurface();
+					qjs.setMaterial_no((String) hashMap.get("COIL_NO"));
+
+					List<QcmJudgeSurface> lqjsq = this.getMapper(QcmJudgeSurfaceMapper.class).find(qjs, 0, 0);
+					if (lqjsq != null && lqjsq.size() > 0) {
+						for (QcmJudgeSurface q : lqjsq) {
+							if (q.getSurface_id().contains("U")) {
+								qjs.setSf_type("U");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_U", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_U", list2.get(0).getFlaw_desc());
+								}
+
+							} else if (q.getSurface_id().contains("D")) {
+								qjs.setSf_type("D");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_D", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_D", list2.get(0).getFlaw_desc());
+								}
+							} else if (q.getSurface_id().contains("E")) {
+								qjs.setSf_type("E");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_E", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_E", list2.get(0).getFlaw_desc());
+								}
+							}
+
+						}
+					}
+					
+				}
+			}
+
+			pm.setRows(list);
+			pm.setTotal(this.getMapper(MesRcmMMapper.class).doQueryMesCrWebCount1(cp.getObject(),
+					cp.getStartTime(), cp.getEndTime(), cp.getMemo2(), swhere));
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	
+	/**
+	 *酸洗 调用生产计划模块提供的接口获取,未进行综合判定的物料信息 分页查询 startTime 开始时间 endTime 结束时间
+	 * memo2:投料卷号 memo1 上表、下表或者边部检验页面(U、D、E) memo1="U" -----为上表
+	 */
+	public ResultModel doQueryMesCrWeb_plm(CommonPage<MesPlmD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesPlmD y = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = "";
+		if (y.getOrder_no() != null && !y.getOrder_no().equals("")) {
+			swhere += " and ydm.ORDERNO like '%" + y.getOrder_no() + "%'";
+		}
+		if (y.getHeatno() != null && !y.getHeatno().equals("")) {
+			swhere += " and ydm.HEATNO like '%" + y.getHeatno() + "%'";
+		}
+		if (y.getBatchno() != null && !y.getBatchno().equals("")) {
+			swhere += " and ydm.BATCHNO like '%" + y.getBatchno() + "%'";
+		}
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {
+			swhere += " and ydm.materailcoilno like '%" + cp.getMemo4() + "%'";
+		}
+		List<HashMap> list = new ArrayList<>();
+
+		try {
+			// 增加页面"检查结果"查询临时方法,将来可修改。
+			if ("B".equals(cp.getMemo1().trim())) {
+				swhere = " and ydm.SURFACERESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesPlmMMapper.class).doQueryMesCrWeb1((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			} else {
+				swhere = " and ydm.MEASURE_RESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesPlmMMapper.class).doQueryMesCrWeb2((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+
+			for (HashMap hashMap : list) {
+				if (hashMap.get("COIL_NO") != null) {
+					QcmJudgeSurface qjs = new QcmJudgeSurface();
+					qjs.setMaterial_no((String) hashMap.get("COIL_NO"));
+
+					List<QcmJudgeSurface> lqjsq = this.getMapper(QcmJudgeSurfaceMapper.class).find(qjs, 0, 0);
+					if (lqjsq != null && lqjsq.size() > 0) {
+						for (QcmJudgeSurface q : lqjsq) {
+							if (q.getSurface_id().contains("U")) {
+								qjs.setSf_type("U");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_U", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_U", list2.get(0).getFlaw_desc());
+								}
+
+							} else if (q.getSurface_id().contains("D")) {
+								qjs.setSf_type("D");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_D", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_D", list2.get(0).getFlaw_desc());
+								}
+							} else if (q.getSurface_id().contains("E")) {
+								qjs.setSf_type("E");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_E", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_E", list2.get(0).getFlaw_desc());
+								}
+							}
+
+						}
+					}
+					YdmProductDetail ydd = this.getMapper(YdmProductDetailMapper.class).findById((String) hashMap.get("COIL_NO"));
+					if(ydd==null || ydd.getCoilno()==null){
+//						rm.setState("500");
+//						rm.setMsgInfo("暂无出口卷库存信息!");
+//						return rm;
+					}else{
+						if ("40740302".equals(ydd.getMeasure_result())) {
+							hashMap.put("BASE_NAME", "不合格");	
+						}else {
+							hashMap.put("BASE_NAME", "合格");
+						}
+						hashMap.put("up_result", ydd.getUp_surface_result());
+						hashMap.put("ud_result", ydd.getUd_surface_result());
+						hashMap.put("ue_result", ydd.getMarginal_result());
+						if ("40740601".equals(ydd.getUp_surface_result()) && "40740601".equals(ydd.getUd_surface_result())
+								&& "40740601".equals(ydd.getMarginal_result())) {
+							hashMap.put("SF_RESULT_DESC", "合格");
+						} else if ("40740603".equals(ydd.getUp_surface_result())
+								|| "40740603".equals(ydd.getUd_surface_result())
+								|| "40740603".equals(ydd.getMarginal_result())) {
+							hashMap.put("SF_RESULT_DESC", "待判");
+							// 把库存表状态改为质量锁定
+						} else if ("40740604".equals(ydd.getUp_surface_result())
+								|| "40740604".equals(ydd.getUd_surface_result())
+								|| "40740604".equals(ydd.getMarginal_result())) {
+							hashMap.put("SF_RESULT_DESC", "判废");
+							// 把库存表状态改为质量锁定
+						} else {
+							hashMap.put("SF_RESULT_DESC", "不合格");
+						}
+					}
+					
+				}
+			}
+
+			pm.setRows(list);
+			pm.setTotal(this.getMapper(MesPlmMMapper.class).doQueryMesCrWebCount1(cp.getObject(),
+					cp.getStartTime(), cp.getEndTime(), cp.getMemo2(), swhere));
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	
+	/**
+	 * 平整机 调用生产计划模块提供的接口获取,未进行综合判定的物料信息 分页查询 startTime 开始时间 endTime 结束时间
+	 * memo2:投料卷号 memo1 上表、下表或者边部检验页面(U、D、E) memo1="U" -----为上表
+	 */
+	public ResultModel doQueryMesCrWeb_tpm(CommonPage<MesTpmD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesTpmD y = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = "";
+		if (y.getOrder_no() != null && !y.getOrder_no().equals("")) {
+			swhere += " and ydm.ORDERNO like '%" + y.getOrder_no() + "%'";
+		}
+		if (y.getHeatno() != null && !y.getHeatno().equals("")) {
+			swhere += " and ydm.HEATNO like '%" + y.getHeatno() + "%'";
+		}
+		if (y.getBatchno() != null && !y.getBatchno().equals("")) {
+			swhere += " and ydm.BATCHNO like '%" + y.getBatchno() + "%'";
+		}
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {
+			swhere += " and ydm.materailcoilno like '%" + cp.getMemo4() + "%'";
+		}
+		List<HashMap> list = new ArrayList<>();
+
+		try {
+			// 增加页面"检查结果"查询临时方法,将来可修改。
+			if ("B".equals(cp.getMemo1().trim())) {
+				swhere = " and ydm.SURFACERESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesTpmMMapper.class).doQueryMesCrWeb1((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			} else {
+				swhere = " and ydm.MEASURE_RESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesTpmMMapper.class).doQueryMesCrWeb2((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+
+			for (HashMap hashMap : list) {
+				if (hashMap.get("COIL_NO") != null) {
+					QcmJudgeSurface qjs = new QcmJudgeSurface();
+					qjs.setMaterial_no((String) hashMap.get("COIL_NO"));
+
+					List<QcmJudgeSurface> lqjsq = this.getMapper(QcmJudgeSurfaceMapper.class).find(qjs, 0, 0);
+					if (lqjsq != null && lqjsq.size() > 0) {
+						for (QcmJudgeSurface q : lqjsq) {
+							if (q.getSurface_id().contains("U")) {
+								qjs.setSf_type("U");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_U", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_U", list2.get(0).getFlaw_desc());
+								}
+
+							} else if (q.getSurface_id().contains("D")) {
+								qjs.setSf_type("D");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_D", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_D", list2.get(0).getFlaw_desc());
+								}
+							} else if (q.getSurface_id().contains("E")) {
+								qjs.setSf_type("E");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_E", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_E", list2.get(0).getFlaw_desc());
+								}
+							}
+
+						}
+					}
+				}
+			}
+
+			pm.setRows(list);
+			pm.setTotal(this.getMapper(MesTpmMMapper.class).doQueryMesCrWebCount1(cp.getObject(),
+					cp.getStartTime(), cp.getEndTime(), cp.getMemo2(), swhere));
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 * 外观检测管理,公差检测管理,综合判定管理
+	 * 4mm,12mm
+	 * @param cp
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryMaterialWeb(CommonPage<MesCrSlittingD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesCrSlittingD mcd = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = " and substr(d.coil_no,-1,1) not in ('B','H')";		
+		
+		if (StringUtils.isNotEmpty(cp.getMemo2())) {				//投料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo2().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo2().trim() + "%')";
+		}		
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {	//原料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo4().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo4().trim() + "%')";
+		}
+		if (StringUtils.isNotEmpty(mcd.getMachine_code())) {		//机组
+			swhere += " and m.machine_code = '"+mcd.getMachine_code()+"'";
+		}
+		if (StringUtils.isNotEmpty(cp.getStartTime())) {			//开始时间
+			swhere += " and m.create_time >= to_date('"+cp.getStartTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getEndTime())) {				//结束时间
+			swhere += " and m.create_time <= to_date('"+cp.getEndTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		
+		if (StringUtils.isNotEmpty(cp.getMemo5())) {
+			if ("0".equals(cp.getMemo5())) { 		// 0:查询未判
+				if ("B".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjs.material_no from qcm_judge_surface qjs where qjs.material_no = d.coil_no)";
+				}else if ("M".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjm.material_no from qcm_judge_measure qjm where qjm.material_no = d.coil_no)";
+				}else if ("Z".equals(cp.getMemo1())){
+					swhere += " and exists (select ypd.coilno from ydm_product_detail ypd where ypd.coilno = d.coil_no and ypd.judgeresult is null)";
+				}				
+			}
+		}
+				
+		try {
+			List<HashMap> list = this.getMapper(MesCrSlittingDMapper.class).doQueryMesCrWeb1_mat((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, swhere);			
+			pm.setRows(list);
+			if (list != null && list.size() > 0) {
+				pm.setTotal(list.size());
+			} else {
+				pm.setTotal(0);
+			}
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 * 外观检测管理,公差检测管理,综合判定管理
+	 * 3mm横剪机组
+	 * @param cp
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryMaterialWeb_3mm(CommonPage<MesCrCrossCuttingD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesCrCrossCuttingD mccd = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = " and substr(d.packing_no,-1,1) not in ('B','H')";		
+		
+		if (StringUtils.isNotEmpty(cp.getMemo2())) {				//投料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo2().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo2().trim() + "%')";
+		}		
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {	//原料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo4().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo4().trim() + "%')";
+		}
+		if (StringUtils.isNotEmpty(mccd.getMachine_code())) {		//机组
+			swhere += " and m.machine_code = '"+mccd.getMachine_code()+"'";
+		}
+		if (StringUtils.isNotEmpty(cp.getStartTime())) {			//开始时间
+			swhere += " and m.create_time >= to_date('"+cp.getStartTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getEndTime())) {				//结束时间
+			swhere += " and m.create_time <= to_date('"+cp.getEndTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		
+		if (StringUtils.isNotEmpty(cp.getMemo5())) {
+			if ("0".equals(cp.getMemo5())) { 		// 0:查询未判
+				if ("B".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjs.material_no from qcm_judge_surface qjs where qjs.material_no = d.packing_no)";
+				}else if ("M".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjm.material_no from qcm_judge_measure qjm where qjm.material_no = d.packing_no)";
+				}else if ("Z".equals(cp.getMemo1())){
+					swhere += " and exists (select ypd.coilno from ydm_product_detail ypd where ypd.coilno = d.packing_no and ypd.judgeresult is null)";
+				}				
+			}
+		}
+		
+		try {
+			List<HashMap> list = this.getMapper(MesCrCrossCuttingDMapper.class).doQueryMesCrWeb1_mat((pageIndex - 1) * pageSize,
+					(pageIndex - 1) * pageSize + pageSize, swhere);
+			pm.setRows(list);
+			if (list != null && list.size() > 0) {
+				pm.setTotal(list.size());
+			} else {
+				pm.setTotal(0);
+			}
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 * 外观检测管理,公差检测管理,综合判定管理
+	 * 平整机组
+	 * @param cp
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryMaterialWeb_tpm(CommonPage<MesTpmD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesTpmD mtd = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = " and substr(d.coil_no,-1,1) not in ('B','H')";		
+		
+		if (StringUtils.isNotEmpty(cp.getMemo2())) {				//投料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo2().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo2().trim() + "%')";
+		}		
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {	//原料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo4().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo4().trim() + "%')";
+		}
+		if (StringUtils.isNotEmpty(mtd.getMachine_code())) {		//机组
+			swhere += " and m.machine_code = '"+mtd.getMachine_code()+"'";
+		}
+		if (StringUtils.isNotEmpty(cp.getStartTime())) {			//开始时间
+			swhere += " and m.create_time >= to_date('"+cp.getStartTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getEndTime())) {				//结束时间
+			swhere += " and m.create_time <= to_date('"+cp.getEndTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getMemo5())) {
+			if ("0".equals(cp.getMemo5())) { 		// 0:查询未判
+				if ("B".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjs.material_no from qcm_judge_surface qjs where qjs.material_no = d.coil_no)";
+				}else if ("M".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjm.material_no from qcm_judge_measure qjm where qjm.material_no = d.coil_no)";
+				}else if ("Z".equals(cp.getMemo1())){
+					swhere += " and exists (select ypd.coilno from ydm_product_detail ypd where ypd.coilno = d.coil_no and ypd.judgeresult is null)";
+				}				
+			}
+		}
+
+		try {
+			List<HashMap> list = this.getMapper(MesTpmMMapper.class).doQueryMesCrWeb1_mat((pageIndex - 1) * pageSize,
+					(pageIndex - 1) * pageSize + pageSize, swhere);
+			pm.setRows(list);
+			if (list != null && list.size() > 0) {
+				pm.setTotal(list.size());
+			} else {
+				pm.setTotal(0);
+			}
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 * 外观检测管理,公差检测管理,综合判定管理
+	 * 轧机机组
+	 * @param cp
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryMaterialWeb_rcm(CommonPage<MesRcmD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesRcmD mrd = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = " and substr(d.coil_no,-1,1) not in ('B','H')";		
+		
+		if (StringUtils.isNotEmpty(cp.getMemo2())) {				//投料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo2().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo2().trim() + "%')";
+		}		
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {	//原料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo4().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo4().trim() + "%')";
+		}
+		if (StringUtils.isNotEmpty(mrd.getMachine_code())) {		//机组
+			swhere += " and m.machine_code = '"+mrd.getMachine_code()+"'";
+		}
+		if (StringUtils.isNotEmpty(cp.getStartTime())) {			//开始时间
+			swhere += " and m.create_time >= to_date('"+cp.getStartTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getEndTime())) {				//结束时间
+			swhere += " and m.create_time <= to_date('"+cp.getEndTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getMemo5())) {
+			if ("0".equals(cp.getMemo5())) { 		// 0:查询未判
+				if ("B".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjs.material_no from qcm_judge_surface qjs where qjs.material_no = d.coil_no)";
+				}else if ("M".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjm.material_no from qcm_judge_measure qjm where qjm.material_no = d.coil_no)";
+				}else if ("Z".equals(cp.getMemo1())){
+					swhere += " and exists (select ypd.coilno from ydm_product_detail ypd where ypd.coilno = d.coil_no and ypd.judgeresult is null)";
+				}				
+			}
+		}
+
+		try {
+			List<HashMap> list = this.getMapper(MesRcmMMapper.class).doQueryMesCrWeb1_mat((pageIndex - 1) * pageSize,
+					(pageIndex - 1) * pageSize + pageSize,  swhere);			 
+			pm.setRows(list);
+			if (list != null && list.size() > 0) {
+				pm.setTotal(list.size());
+			} else {
+				pm.setTotal(0);
+			}
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 * 外观检测管理,公差检测管理,综合判定管理
+	 * 酸洗机组
+	 * @param cp
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryMaterialWeb_plm(CommonPage<MesPlmD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesPlmD mpd = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = " and substr(d.coil_no,-1,1) not in ('B','H')";		
+		
+		if (StringUtils.isNotEmpty(cp.getMemo2())) {				//投料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo2().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo2().trim() + "%')";
+		}		
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {	//原料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo4().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo4().trim() + "%')";
+		}
+		if (StringUtils.isNotEmpty(mpd.getMachine_code())) {		//机组
+			swhere += " and m.machine_code = '"+mpd.getMachine_code()+"'";
+		}
+		if (StringUtils.isNotEmpty(cp.getStartTime())) {			//开始时间
+			swhere += " and m.create_time >= to_date('"+cp.getStartTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getEndTime())) {				//结束时间
+			swhere += " and m.create_time <= to_date('"+cp.getEndTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getMemo5())) {
+			if ("0".equals(cp.getMemo5())) { 		// 0:查询未判
+				if ("B".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjs.material_no from qcm_judge_surface qjs where qjs.material_no = d.coil_no)";
+				}else if ("M".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjm.material_no from qcm_judge_measure qjm where qjm.material_no = d.coil_no)";
+				}else if ("Z".equals(cp.getMemo1())){
+					swhere += " and exists (select ypd.coilno from ydm_product_detail ypd where ypd.coilno = d.coil_no and ypd.judgeresult is null)";
+				}else {
+					//酸洗的公差外观检测管理
+					swhere += " and (not exists (select qjm.material_no from qcm_judge_measure qjm where qjm.material_no = d.coil_no)"
+							+ " or"
+							+ " not exists (select qjm.material_no from qcm_judge_measure qjm where qjm.material_no = d.coil_no))";
+				}			
+			}
+		}
+
+		try {
+			List<HashMap> list = this.getMapper(MesPlmMMapper.class).doQueryMesCrWeb1_mat((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, swhere);			 
+			pm.setRows(list);
+			if (list != null && list.size() > 0) {
+				pm.setTotal(list.size());
+			} else {
+				pm.setTotal(0);
+			}
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 * 外观检测管理,公差检测管理,综合判定管理
+	 * 退火机组
+	 * @param cp
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public ResultModel doQueryMaterialWeb_anneal(CommonPage<MesCrAnnealM> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesCrAnnealM mcam = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = " and substr(m.coil_no, -1, 1) not in ('B', 'H') and m.hand_over_status ='1'";		
+		
+		if (StringUtils.isNotEmpty(cp.getMemo2())) {				//投料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo2().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo2().trim() + "%')";
+		}		
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {	//原料卷号
+			swhere += " and (m.material_no like '%"+cp.getMemo4().trim()+"%' or mypd.materailcoilno like '%" + cp.getMemo4().trim() + "%')";
+		}
+		if (StringUtils.isNotEmpty(mcam.getMachine_code())) {		//机组
+			//swhere += " and m.machine_code = '"+mcam.getMachine_code()+"'";
+		}
+		if (StringUtils.isNotEmpty(cp.getStartTime())) {			//开始时间
+			swhere += " and m.create_time >= to_date('"+cp.getStartTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getEndTime())) {				//结束时间
+			swhere += " and m.create_time <= to_date('"+cp.getEndTime()+"', 'yyyy-MM-dd hh24:mi:ss')";
+		}
+		if (StringUtils.isNotEmpty(cp.getMemo5())) {
+			if ("0".equals(cp.getMemo5())) { 		// 0:查询未判
+				if ("B".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjs.material_no from qcm_judge_surface qjs where qjs.material_no = m.coil_no)";
+				}else if ("M".equals(cp.getMemo1())) {
+					swhere += " and not exists (select qjm.material_no from qcm_judge_measure qjm where qjm.material_no = m.coil_no)";
+				}else if ("Z".equals(cp.getMemo1())){
+					swhere += " and exists (select ypd.coilno from ydm_product_detail ypd where ypd.coilno = m.coil_no and ypd.judgeresult is null)";
+				}				
+			}
+		}
+
+		try {		 
+			List<HashMap> list = this.getMapper(MesCrAnnealMMapper.class).doQueryMesCrWeb1_mat((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize,  swhere);			 
+			pm.setRows(list);
+			if (list != null && list.size() > 0) {
+				pm.setTotal(list.size());
+			} else {
+				pm.setTotal(0);
+			}
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 * 退火炉 调用生产计划模块提供的接口获取,未进行综合判定的物料信息 分页查询 startTime 开始时间 endTime 结束时间
+	 * memo2:投料卷号 memo1 上表、下表或者边部检验页面(U、D、E) memo1="U" -----为上表
+	 */
+	public ResultModel doQueryMesCrWeb_anneal(CommonPage<MesCrAnnealM> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesCrAnnealM y = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = "";
+		if (y.getOrder_no() != null && !y.getOrder_no().equals("")) {
+			swhere += " and ydm.ORDERNO like '%" + y.getOrder_no() + "%'";
+		}
+		if (y.getHeatno() != null && !y.getHeatno().equals("")) {
+			swhere += " and ydm.HEATNO like '%" + y.getHeatno() + "%'";
+		}
+		if (y.getBatchno() != null && !y.getBatchno().equals("")) {
+			swhere += " and ydm.BATCHNO like '%" + y.getBatchno() + "%'";
+		}
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {
+			swhere += " and ydm.materailcoilno like '%" + cp.getMemo4() + "%'";
+		}
+		List<HashMap> list = new ArrayList<>();
+
+		try {
+			// 增加页面"检查结果"查询临时方法,将来可修改。
+			if ("B".equals(cp.getMemo1().trim())) {
+				swhere = " and ydm.SURFACERESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesCrAnnealMMapper.class).doQueryMesCrWeb1((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+			else {
+				swhere = " and ydm.MEASURE_RESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesCrAnnealMMapper.class).doQueryMesCrWeb2((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+
+			for (HashMap hashMap : list) {
+				if (hashMap.get("COIL_NO") != null) {
+					QcmJudgeSurface qjs = new QcmJudgeSurface();
+					qjs.setMaterial_no((String) hashMap.get("COIL_NO"));
+
+					List<QcmJudgeSurface> lqjsq = this.getMapper(QcmJudgeSurfaceMapper.class).find(qjs, 0, 0);
+					if (lqjsq != null && lqjsq.size() > 0) {
+						for (QcmJudgeSurface q : lqjsq) {
+							if (q.getSurface_id().contains("U")) {
+								qjs.setSf_type("U");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_U", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_U", list2.get(0).getFlaw_desc());
+								}
+
+							} else if (q.getSurface_id().contains("D")) {
+								qjs.setSf_type("D");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_D", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_D", list2.get(0).getFlaw_desc());
+								}
+							} else if (q.getSurface_id().contains("E")) {
+								qjs.setSf_type("E");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_E", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_E", list2.get(0).getFlaw_desc());
+								}
+							}
+
+						}
+					}
+					
+				}
+			}
+
+			pm.setRows(list);
+			pm.setTotal(this.getMapper(MesCrAnnealMMapper.class).doQueryMesCrWebCount1(cp.getObject(),
+					cp.getStartTime(), cp.getEndTime(), cp.getMemo2(), swhere));
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+			
+	/**
+	 * 4mm,12mm 调用生产计划模块提供的接口获取,未进行综合判定的物料信息 分页查询 startTime 开始时间 endTime 结束时间
+	 * memo2:投料卷号 memo1 上表、下表或者边部检验页面(U、D、E) memo1="U" -----为上表
+	 */
+	public ResultModel doQueryMesCrWeb(CommonPage<MesCrSlittingD> cp) {
+		ResultModel rm = new ResultModel();
+		int pageSize = cp.getPageSize();
+		int pageIndex = cp.getPageIndex();
+		MesCrSlittingD y = cp.getObject();
+		PageModel<HashMap> pm = new PageModel<HashMap>(pageIndex, pageSize);
+		String swhere = "";
+		if (y.getOrderno() != null && !y.getOrderno().equals("")) {
+			swhere += " and ydm.orderno like '%" + y.getOrderno() + "%'";
+		}
+		if (y.getHeatno() != null && !y.getHeatno().equals("")) {
+			swhere += " and ydm.heatno like '%" + y.getHeatno() + "%'";
+		}
+		if (y.getBatchno() != null && !y.getBatchno().equals("")) {
+			swhere += " and ydm.batchno like '%" + y.getBatchno() + "%'";
+		}
+		if (cp.getMemo4() != null && !"".equals(cp.getMemo4())) {
+			swhere += " and ydm.materailcoilno like '%" + cp.getMemo4() + "%'";
+		}
+		List<HashMap> list = new ArrayList<>();
+
+		try {
+			// 增加页面"检查结果"查询临时方法,将来可修改。
+			if ("B".equals(cp.getMemo1().trim())) {
+				swhere = " and ydm.SURFACERESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesCrSlittingDMapper.class).doQueryMesCrWeb1((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+			else {
+				swhere = " and ydm.MEASURE_RESULT = " + cp.getObject().getSurface_rst() + "";
+				list = this.getMapper(MesCrSlittingDMapper.class).doQueryMesCrWeb2((pageIndex - 1) * pageSize,
+						(pageIndex - 1) * pageSize + pageSize, cp.getObject(), cp.getStartTime(), cp.getEndTime(),
+						swhere, cp.getMemo2());
+			}
+
+			for (HashMap hashMap : list) {
+				if (hashMap.get("COIL_NO") != null) {
+					QcmJudgeSurface qjs = new QcmJudgeSurface();
+					qjs.setMaterial_no((String) hashMap.get("COIL_NO"));
+
+					List<QcmJudgeSurface> lqjsq = this.getMapper(QcmJudgeSurfaceMapper.class).find(qjs, 0, 0);
+					if (lqjsq != null && lqjsq.size() > 0) {
+						for (QcmJudgeSurface q : lqjsq) {
+							if (q.getSurface_id().contains("U")) {
+								qjs.setSf_type("U");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_U", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_U", list2.get(0).getFlaw_desc());
+								}
+
+							} else if (q.getSurface_id().contains("D")) {
+								qjs.setSf_type("D");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_D", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_D", list2.get(0).getFlaw_desc());
+								}
+							} else if (q.getSurface_id().contains("E")) {
+								qjs.setSf_type("E");
+								QcmJudgeSurface qq = this.getMapper(QcmJudgeSurfaceMapper.class).findMaxS(qjs);
+
+								QcmJudgeSurfaceFlaw qjsf = new QcmJudgeSurfaceFlaw();
+								qjsf.setSurface_id(qq.getSurface_id());
+								qjsf.setPrimary_flag("1");
+								List<QcmJudgeSurfaceFlaw> list2 = this.getMapper(QcmJudgeSurfaceFlawMapper.class)
+										.findWithCondition(qjsf, null, null, 0, 0);
+								if (list2 != null && list2.size() > 0) {
+									hashMap.put("FLAW_CODE_E", list2.get(0).getFlaw_code());
+									hashMap.put("FLAW_DESC_E", list2.get(0).getFlaw_desc());
+								}
+							}
+
+						}
+					}					
+					
+				}
+			}
+
+			pm.setRows(list);
+			pm.setTotal(this.getMapper(MesCrSlittingDMapper.class).doQueryMesCrWebCount1(cp.getObject(),
+					cp.getStartTime(), cp.getEndTime(), cp.getMemo2(), swhere));
+			rm.setState("200");
+			rm.setData(pm);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	public ResultModel doQueryMesLWeb(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm = new ResultModel();
+		if (cp == null || cp.getObject() == null || cp.getObject().getBatchno() == null) {
+			rm.setState("500");
+			rm.setMsgInfo("请输入参数!");
+			return rm;
+		}
+		try {
+			List<String> list = new ArrayList<>();
+			list = this.getMapper(MesCrSlittingMMapper.class).findMat(cp.getObject().getBatchno());
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	public ResultModel doQueryMesL2Web(CommonPage<MesCrSlittingM> cp) {
+		ResultModel rm = new ResultModel();
+		if (cp == null || cp.getObject() == null || cp.getObject().getMaterial_no() == null) {
+			rm.setState("500");
+			rm.setMsgInfo("请输入参数!");
+			return rm;
+		}
+		try {
+			List<String> list = new ArrayList<>();
+			list = this.getMapper(MesCrSlittingMMapper.class).doFind(cp.getObject().getMaterial_no());
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	/**
+	 * object: material_no:检验号
+	 * 
+	 * @param cp
+	 * @return
+	 */
+	public ResultModel doQueryMesL3Web(CommonPage<MesCrSlittingM> cp) {
+		ResultModel rm = new ResultModel();
+		if (cp == null || cp.getObject() == null || cp.getObject().getMaterial_no() == null) {
+			rm.setState("500");
+			rm.setMsgInfo("请输入参数!");
+			return rm;
+		}
+		try {
+			List<MesCrSlittingDSum> list = new ArrayList<>();
+			list = this.getMapper(MesCrSlittingMMapper.class).doFindD(cp.getObject().getMaterial_no());
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	/**
+	 * 给质量的接口 查询生产订单信息
+	 * 
+	 * @param order_no 订单号
+	 * @return 2018-06-13
+	 */
+	public PlnProdorder getPlnOrderByOrderNo(String order_no) {
+		PlnProdorder ppo = new PlnProdorder();
+		ppo.setOrder_no(order_no);
+		List<PlnProdorder> plpo = this.getMapper(PlnProdorderMapper.class).findWithCondition(ppo, null,
+				" create_time desc", 0, 1);
+		return plpo.get(0);
+	}
+	
+	
+	/**
+	 * 获取实物计划规格
+	 * 
+	 * @param   object_no  实物卷号 
+	 * @return  thick width length 
+	 */
+	public PlnMaterielDetail getDsnSizeOfMat(String object_no) {
+		PlnMaterielDetail  rst = null;
+		// 获取虚拟物料信息
+		List<PlnMaterielDetail> pmds = this.getMapper(PlnMaterielDetailMapper.class)
+				.findWithCondition(null, " object_no = '"+object_no+"' and nvl(invalid_flg,0) = 0 ", "", 0, 1);
+		if(Utils.isNotEmpty(pmds)) {
+			rst =  pmds.get(0);
+		}
+		return rst;
+		
+	}
+
+	/**
+	 * 称重保存-自动计算边丝重量
+	 * 
+	 * @param msm 母卷实绩
+	 * @return 子卷实重和
+	 * @throws Exception
+	 */
+	public double ClcOffcutWeight(MesCrSlittingM msm) throws Exception {
+		double y = 0d;
+		MesCrSlittingD mcsd = new MesCrSlittingD();
+		mcsd.setProcess_no(msm.getProcess_no());
+		// 查询所有子卷实绩
+		List<MesCrSlittingD> lmcsdq = this.getMapper(MesCrSlittingDMapper.class).findWithCondition(mcsd,
+				" coil_no not like '%B' ", null, 0, 0);
+		if (lmcsdq == null || lmcsdq.size() == 0) {
+			throw new Exception("母卷[" + msm.getMaterial_no_vt() + "]的子卷实绩信息不存在!无法找到子卷信息!");
+		}
+		for (MesCrSlittingD mescr : lmcsdq) {
+			y += mescr.getCoil_act_wgt() == null ? 0 : mescr.getCoil_act_wgt();
+		}
+		return y;
+	}
+
+	/**
+	 * 判断订单的计重方式
+	 * 
+	 * @param prod_order_no
+	 * @return
+	 * @throws Exception
+	 */
+	public boolean judgeOrderWeightType(String prod_order_no) throws Exception {
+		boolean flag = false;
+		if (prod_order_no == null || "".equals(prod_order_no)) {
+			throw new Exception("请传入生产订单号!");
+		}
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class).findWithCondition(null,
+				"prod_order_no = '" + prod_order_no + "'", "", 0, 1);
+		if (ppo == null) {
+			throw new Exception("未找到生产订单[" + prod_order_no + "]信息!");
+		} else if (ppo.get(0).getWeight_type_no() != null && "102301".equals(ppo.get(0).getWeight_type_no())) {
+			flag = true;
+		}
+		return flag;
+	}
+
+	// 查询4mm正在生产的数据
+	public ResultModel doQueryMes4mmWeb(CommonPage<MesCrSlittingM> cp) {
+		ResultModel rm = new ResultModel();
+		try {
+			List<MesCrSlittingM> list = new ArrayList<>();
+			String machine_code = "M0001";
+			list = this.getMapper(MesCrSlittingMMapper.class).findWithCondition(null,
+					"machine_code='" + machine_code + "' and nvl(hand_over_status,'0') = '0' ", null, 0, 0);
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	// 查询12mm正在生产的数据
+	public ResultModel doQueryMes12mmWeb(CommonPage<MesCrSlittingM> cp) {
+		ResultModel rm = new ResultModel();
+		try {
+			List<MesCrSlittingM> list = new ArrayList<>();
+			String machine_code = "M0002";
+			list = this.getMapper(MesCrSlittingMMapper.class).findWithCondition(null,
+					"machine_code='" + machine_code + "' and nvl(hand_over_status,'0') = '0' ", null, 0, 0);
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	// 查询3mm正在生产的数据
+	public ResultModel doQueryMes3mmWeb(CommonPage<MesCrCrossCuttingM> cp) {
+		ResultModel rm = new ResultModel();
+		try {
+			List<MesCrCrossCuttingM> list = new ArrayList<>();
+			String machine_code = "M0003";
+			list = this.getMapper(MesCrCrossCuttingMMapper.class).findWithCondition(null,
+					"machine_code='" + machine_code + "' and nvl(hand_over_status,'0') = '0' ", null, 0, 0);
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	// 查询退火炉正在生产的数据
+	public ResultModel doQueryMesAnnealWeb(CommonPage<MesCrAnnealM> cp) {
+		ResultModel rm = new ResultModel();
+		try {
+			List<MesCrAnnealM> list = new ArrayList<>();
+			// String machine_code="M0003";
+			list = this.getMapper(MesCrAnnealMMapper.class).findWithCondition(null, "nvl(hand_over_status,'0') = '0' ",
+					null, 0, 0);
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+
+	// 查询平整机正在生产的数据
+	public ResultModel doQueryMesTpmWeb(CommonPage<MesTpmM> cp) {
+		ResultModel rm = new ResultModel();
+		try {
+			List<MesTpmM> list = new ArrayList<>();
+			list = this.getMapper(MesTpmMMapper.class).findWithCondition(null, "nvl(hand_over_status,'0') = '0' ", null,
+					0, 0);
+			rm.setState("200");
+			rm.setData(list);
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	// 传入参数就是成品物料号,返回原料卷号就可以了
+	public ResultModel doQueryMesYdmWeb(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm = new ResultModel();
+		try {
+			List<YdmProductDetail> list = new ArrayList<>();
+			list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+cp.getMemo1()+"'", null,
+					0, 0);
+			if(list!=null && list.size()>0){
+				rm.setData(list.get(0));
+			}
+			rm.setState("200");
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	
+	/**memo1:产线代码
+	 * memo2:批次号
+	 * @param cp
+	 * @return
+	 */
+	public ResultModel doQueryBatchNoWeb(CommonPage<YdmProductDetail> cp) {
+		ResultModel rm = new ResultModel();
+		try {
+			List<MesQmsView> list = new ArrayList<>();
+			if("C001".equals(cp.getMemo1())){
+				if(cp.getMemo2()==null){
+					cp.setMemo2("");
+				}
+				list=this.getMapper(MesCrSlittingDMapper.class).doQuery3(cp.getMemo2());
+			}else if("C002".equals(cp.getMemo1())){
+				if(cp.getMemo2()==null){
+					cp.setMemo2("");
+				}
+				list=this.getMapper(MesCrSlittingDMapper.class).doQuery3(cp.getMemo2());
+			}else if("C011".equals(cp.getMemo1())){
+				if(cp.getMemo2()==null){
+					cp.setMemo2("");
+				}
+				list=this.getMapper(MesCrSlittingDMapper.class).doQuery3tpm(cp.getMemo2());
+			}else if("C012".equals(cp.getMemo1())){
+				if(cp.getMemo2()==null){
+					cp.setMemo2("");
+				}
+				list=this.getMapper(MesCrSlittingDMapper.class).doQuery33mm(cp.getMemo2());
+			}else if("C013".equals(cp.getMemo1()) || "C014".equals(cp.getMemo1())
+					|| "C015".equals(cp.getMemo1()) || "C017".equals(cp.getMemo1())){
+				if(cp.getMemo2()==null){
+					cp.setMemo2("");
+				}
+				list=this.getMapper(MesCrSlittingDMapper.class).doQuery3Anneal(cp.getMemo2());
+			}
+			rm.setData(list);
+			rm.setState("200");
+		} catch (Exception ex) {
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!" + ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 startTime:开始时间
+	 endTime:结束时间
+	* @param oci
+	* @return
+	*/
+	public ResultModel doQueryWeb_gejizu(CommonPage<MesTpmM> oci){
+		ResultModel rm=new ResultModel();
+		try{
+			rm.setData(this.getMapper(MesTpmMMapper.class).doQuerygejizuWeb(oci.getStartTime(),oci.getEndTime(),oci.getMemo1(),oci.getMemo2()));
+			rm.setState("200");
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+	
+	/**
+	 * 只处理作业完成的吨位
+	 startTime:开始时间
+	 endTime:结束时间
+	* @param oci
+	* @return
+	*/
+	public ResultModel doQueryWeb_gejizu2(CommonPage<MesTpmM> oci){
+		ResultModel rm=new ResultModel();
+		try{
+			rm.setData(this.getMapper(MesTpmMMapper.class).doQueryWeb_gejizu2(oci.getStartTime(),oci.getEndTime(),oci.getMemo1(),oci.getMemo2()));
+			rm.setState("200");
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+	
+	
+	
+	
+	public void Match_Rl_Thk(String prod_order_no , double mat_thk) {
+		// 获取订单信息
+		// 获取质量设计信息
+	}
+	
+	//查询退火炉三级二级数据--质量
+	public ResultModel doQueryWeb_tuihuo(CommonPage<MesCrAnnealM> oci){
+		ResultModel rm=new ResultModel();
+		MesCrAnnealM mes=oci.getObject();
+		try{			
+			List<HashMap> list = this.getMapper(MesCrAnnealMMapper.class).doQueryWeb_zhiliang(mes,oci.getStartTime(),oci.getEndTime(),oci.getMemo1(),oci.getMemo2());
+			rm.setState("200");
+			rm.setData(list);
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	} 
+	
+	//查询平整三级二级数据--质量
+	public ResultModel doQueryWeb_pingzheng(CommonPage<MesTpmM> oci){
+		ResultModel rm=new ResultModel();
+		MesTpmM mes=oci.getObject();
+		try{
+			List<HashMap> list = this.getMapper(MesTpmMMapper.class).doQueryWeb_zhiliang(mes,oci.getStartTime(),oci.getEndTime(),oci.getMemo1(),oci.getMemo2());
+			rm.setState("200");
+			rm.setData(list);
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+	
+	//查询轧机三级二级数据--质量
+	public ResultModel doQueryWeb_zhaji(CommonPage<MesRcmM> oci){
+		ResultModel rm=new ResultModel();
+		MesRcmM mes=oci.getObject();
+		try{
+			List<HashMap> list = this.getMapper(MesRcmMMapper.class).doQueryWeb_zhiliang(mes,oci.getStartTime(),oci.getEndTime(),oci.getMemo1(),oci.getMemo2());
+			rm.setState("200");
+			rm.setData(list);
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+	//查询小纵剪实绩数据--质量
+	public ResultModel doQueryWeb_Slitting(CommonPage<MesCrSlittingM> oci){
+		ResultModel rm=new ResultModel();
+		MesCrSlittingM mes=oci.getObject();
+		try{
+			List<HashMap> list = this.getMapper(MesCrSlittingMMapper.class).doQueryWeb_zhiliang(mes,oci.getStartTime(),oci.getEndTime(),oci.getMemo1(),oci.getMemo2());
+			rm.setState("200");
+			rm.setData(list);
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+	
+	//查询横剪三级二级数据--质量
+	public ResultModel doQueryWeb_Cutting(CommonPage<MesCrCrossCuttingM> oci){
+		ResultModel rm=new ResultModel();
+		MesCrCrossCuttingM mes=oci.getObject();
+		try{
+			List<HashMap> list = this.getMapper(MesCrCrossCuttingMMapper.class).doQueryWeb_zhiliang(mes,oci.getStartTime(),oci.getEndTime(),oci.getMemo1(),oci.getMemo2());
+			rm.setState("200");
+			rm.setData(list);
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+	//查询酸洗三级二级数据--质量
+	public ResultModel doQueryWeb_Pickle(CommonPage<MesPlmM> oci){
+		ResultModel rm=new ResultModel();
+		MesPlmM mes=oci.getObject();
+		try{
+			List<HashMap> list = this.getMapper(MesPlmMMapper.class).doQueryWeb_zhiliang(mes,oci.getStartTime(),oci.getEndTime(),oci.getMemo1(),oci.getMemo2());
+			rm.setState("200");
+			rm.setData(list);
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+	
+	
+	
+	/**
+	 * 生产交工前调用检验判定接口
+	 * 
+	 * @param object_no       实物号
+	 * @param prod_order_no   生产订单号
+	 * @param prc_code        工序代码
+	 * @return
+	 * @throws Exception 
+	 */
+	public ResultModel hasJudegeResult(String object_no , String prod_order_no , String prc_code) throws Exception {
+		ResultModel rm =  new ResultModel("200", "");
+		String lastChar = object_no.substring(object_no.length()-1);
+		// 边丝和头尾卷不存与检验
+		if ("B".equals(lastChar) || "H".equals(lastChar)) {
+			return rm ; 
+		}
+		if(Utils.isEmpty(prod_order_no) || Utils.isEmpty(prc_code)) {
+			return rm ;
+		}
+		boolean blnIsJug = false ;
+		StringBuilder strRst = new StringBuilder("物料["+object_no+"]还未完成检验,不能交工!");
+		// 获取判定结果
+		ResultModel tmp_rst = this.getBean(QmsApiServiceImpl.class).doQueryJudegeResult(object_no);
+		if(!"200".equals(tmp_rst.getState())) {
+			throw new Exception("获取物料["+object_no+"]检验信息失败!"+tmp_rst.getMsgInfo());
+		}
+		// 获取订单信息
+		List<PlnProdorder> ppo = this.getMapper(PlnProdorderMapper.class)
+				.findWithCondition(null, " prod_order_no = '"+prod_order_no+"'", "", 0, 1);
+		if(Utils.isEmpty(ppo)) {
+			return rm ; 
+		}
+		// 获取制程信息( 403203 公差类 403210 表检类)
+		SlmOrdDesignMscPlSti sti = new SlmOrdDesignMscPlSti();
+		sti.setDesign_key(ppo.get(0).getDesign_key());
+		sti.setMsc_pline(ppo.get(0).getMsc_pline());
+		sti.setProcess_code(prc_code);
+		sti.setProcess_point_type("403203");
+		List<SlmOrdDesignMscPlSti> measure_sti = this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(sti, null, "", 0, 0);
+		sti.setProcess_point_type("403210");
+		List<SlmOrdDesignMscPlSti> surface_sti = this.getMapper(SlmOrdDesignMscPlStiMapper.class).findWithCondition(sti, null, "", 0, 0);
+		JudgeResult jr = (JudgeResult) tmp_rst.getData();
+		if(Utils.isEmpty(jr)) {
+			throw new Exception("未找到物料["+object_no+"]的检验判定信息!");
+		} 
+		if(Utils.isNotEmpty(surface_sti)) {
+//			if(Utils.isEmpty(jr.getUd_surface_result())) {
+//				blnIsJug = true ;
+//				strRst.append("下表面未检验!");
+//			} 
+			if(Utils.isEmpty(jr.getUp_surface_result())) {
+				blnIsJug = true ;
+				strRst.append("表面未检验!");
+			} 
+			
+//			if(Utils.isEmpty(jr.getMarginal_result())) {
+//				blnIsJug = true ;
+//				strRst.append("边部未检验!");
+//			}
+		}
+		if(Utils.isEmpty(jr.getMeasure_result()) && Utils.isNotEmpty(measure_sti)) {
+			blnIsJug = true ;
+			strRst.append("公差未检验!");
+		} 
+		if(blnIsJug) {
+			rm.setData(strRst);
+			rm.setState("500");
+		}
+		return rm;
+	}
+
+	
+}

+ 1280 - 0
src/main/java/market/Api/Mes/impl/MesApiSkinrollingPlanImpl.java

@@ -0,0 +1,1280 @@
+package market.Api.Mes.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import market.Api.Mes.service.MesApiSkinrollingPlanService;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.vo.ComBaseInfo;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Mes.Lengthwise.Plan.mapper.PlnMatReplaceLogMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielInvalidMapper;
+import market.Mes.Lengthwise.Plan.mapper.PlnProcessPlanMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnMatReplaceLog;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielInvalid;
+import market.Mes.Lengthwise.Plan.vo.PlnProcessPlan;
+import market.Mes.MaterielTrack.mapper.PrcMaterielExtinfoMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielRelationMapper;
+import market.Mes.MaterielTrack.mapper.PrcMaterielVtProcessMapper;
+import market.Mes.MaterielTrack.vo.PrcMaterielProcess;
+import market.Mes.MaterielTrack.vo.PrcMaterielRelation;
+import market.Mes.MaterielTrack.vo.PrcMaterielVtProcess;
+import market.Mes.OrderManager.Plan.mapper.PlnOrderStatisticMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderMapper;
+import market.Mes.OrderManager.Plan.mapper.PlnProdorderStatisticMapper;
+import market.Mes.OrderManager.Plan.vo.PlnOrderStatistic;
+import market.Mes.OrderManager.Plan.vo.PlnProdorder;
+import market.Mes.OrderManager.Plan.vo.PlnProdorderStatistic;
+import market.Mes.Tpm.Design.mapper.PlnSkinrollingDsnMainMapper;
+import market.Mes.Tpm.Design.mapper.PlnSkinrollingDsnMultinfoMapper;
+import market.Mes.Tpm.Design.mapper.PlnSrPlanStatisticMapper;
+import market.Mes.Tpm.Design.vo.PlnSkinrollingDsnMain;
+import market.Mes.Tpm.Design.vo.PlnSkinrollingDsnMultinfo;
+import market.Mes.Tpm.Design.vo.PlnSrPlanStatistic;
+import market.Mes.Tpm.mapper.MesTpmDMapper;
+import market.Mes.Tpm.mapper.PlnSkinrollingPlanDetailMapper;
+import market.Mes.Tpm.mapper.PlnSkinrollingPlanMapper;
+import market.Mes.Tpm.vo.MesTpmD;
+import market.Mes.Tpm.vo.MesTpmM;
+import market.Mes.Tpm.vo.PlnSkinrollingPlan;
+import market.Mes.Tpm.vo.PlnSkinrollingPlanDetail;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path="MesApiSkinrollingPlanService")
+public class MesApiSkinrollingPlanImpl extends BaseServiceImpl implements MesApiSkinrollingPlanService{
+
+
+	//--------------------------------平整上料、下PDI Start----------------------------------------------------
+	
+		/**
+		 * 平整上料接口 下PDI 验证
+		 * @throws Exception 
+		 * 其实都是单条操作
+		 */
+		public void MesTpmMAddValid(List<MesTpmM> oci) throws Exception{
+			
+			//循环 根据(平整计划号数组,虚拟物料号数组) 读取 平整计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+			for(MesTpmM mcsm:oci){
+				PlnSkinrollingPlanDetail plpd=new PlnSkinrollingPlanDetail();
+				plpd.setSr_plan_no(mcsm.getSchedule_no());
+				plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+				//如果不存在,则报错退出“平整计划[xxxxx][xx]信息不存在!”
+				List<PlnSkinrollingPlanDetail> lppd=this.getMapper(PlnSkinrollingPlanDetailMapper.class).find(plpd, 0, 0);
+				if(lppd==null||lppd.size()==0){
+					throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				PlnMaterielDetail M1=new PlnMaterielDetail();
+				//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+				List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, " object_no_vt = '"+mcsm.getMaterial_no_vt()+"' AND NVL(invalid_flg,0) = '0'", null, 0, 1);
+				if(lpmd==null||lpmd.size()==0){
+					throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+				M1=lpmd.get(0);
+				if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+					throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+				}
+				
+				//实际上只有一条
+				for(PlnSkinrollingPlanDetail ppdc:lppd){
+					//判断平整计划明细的状态【STATUS】
+					if(ppdc.getStatus().compareTo("5BSR02")>0){
+						throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]已上料,不能再次操作!");
+					}
+				}
+			}
+		}
+		
+		/**
+		 * 平整上料接口 下PDI
+		 * @throws Exception 
+		 * 其实都是单条操作
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void MesTpmMAdd(List<MesTpmM> oci) throws Exception{
+			
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			
+			//循环 根据(平整计划号数组,虚拟物料号数组) 读取 平整计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+			for(MesTpmM mcsm:oci){
+				PlnSkinrollingPlanDetail plpd=new PlnSkinrollingPlanDetail();
+				plpd.setSr_plan_no(mcsm.getSchedule_no());
+				plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+				//如果不存在,则报错退出“平整计划[xxxxx][xx]信息不存在!”
+				List<PlnSkinrollingPlanDetail> lppd=this.getMapper(PlnSkinrollingPlanDetailMapper.class).find(plpd, 0, 0);
+				if(lppd==null||lppd.size()==0){
+					throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				PlnMaterielDetail M1=new PlnMaterielDetail();
+				//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+				List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, " object_no_vt = '"+mcsm.getMaterial_no_vt()+"' AND NVL(invalid_flg,0) = '0'", null, 0, 1);
+				if(lpmd==null||lpmd.size()==0){
+					throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+				M1=lpmd.get(0);
+				if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+					throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+				}
+				
+				//实际上只有一条
+				for(PlnSkinrollingPlanDetail ppdc:lppd){
+					//判断平整计划明细的状态【STATUS】
+					if(ppdc.getStatus().compareTo("5BSR02")>0){
+						throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]已上料,不能再次操作!");
+					}
+					PrcMaterielProcess pmp=new PrcMaterielProcess();
+					pmp.setPrc_code("5BSR03");//新增的状态
+					
+					//这里的格式要和字符串日期的格式匹配,不然会抛出转换异常   
+					SimpleDateFormat  dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+					if (mcsm.getMemo() != null && !"".equals(mcsm.getMemo())) {
+						Date createdate = dateFormat.parse(mcsm.getMemo());
+						pmp.setCreate_time(createdate);
+					}else {
+						pmp.setCreate_time(new Date());
+					}
+					
+					
+					pmp.setObject_no(M1.getObject_no());
+					pmp.setCreate_man_name(userName);
+					pmp.setRemark(mcsm.getMemo());
+					//新增物料跟踪:
+					this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+					
+					//修改平整计划明细表
+					PlnSkinrollingPlanDetail plpdu=new PlnSkinrollingPlanDetail();
+					plpdu.setStatus("5BSR03");
+					plpdu.setSerial_no(ppdc.getSerial_no());
+					this.getMapper(PlnSkinrollingPlanDetailMapper.class).update(plpdu);
+				}
+				
+				//根据母卷号,查询对应的所有子卷信息
+				PlnMaterielDetail pmdq=new PlnMaterielDetail();
+				pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+				List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+				for(PlnMaterielDetail ppdc:lpmdc){
+					//修改各子卷的 状态 STATUS= 0PSR03; 
+					PlnMaterielDetail pmdu=new PlnMaterielDetail();
+					pmdu.setSerial_no(ppdc.getSerial_no());
+					pmdu.setStatus("0PSR03");
+					this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+					
+					//增加子卷的 虚拟物料履历表
+					this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(),"0PSR03",userName,new Date());
+				}
+				
+				//修改平整计划主表
+				doUpdatePlnSkinrollingPlan(mcsm.getSchedule_no()); 
+				PlnMaterielDetail pmdu=new PlnMaterielDetail();
+				//修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+				pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+				pmdu.setStatus("0PSR03");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+				//写虚拟物料履历,状态填:	0PSR03	母卷																			
+				this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PSR03",userName,new Date());
+			}
+		}
+		
+		/**
+		 * 撤销平整上料接口 下PDI 验证
+		 * @param 虚拟子卷号
+		 * @throws Exception 
+		 * 其实都是单条操作
+		 */
+		public void MesTpmMCancelValid(List<MesTpmM> oci) throws Exception{
+			//循环 根据(平整计划号数组,虚拟物料号数组) 读取 平整计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+			for(MesTpmM mcsm:oci){
+				PlnSkinrollingPlanDetail plpd=new PlnSkinrollingPlanDetail();
+				plpd.setSr_plan_no(mcsm.getSchedule_no());
+				plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+				//如果不存在,则报错退出“平整计划[xxxxx][xx]信息不存在!”
+				List<PlnSkinrollingPlanDetail> lppd=this.getMapper(PlnSkinrollingPlanDetailMapper.class).find(plpd, 0, 0);
+				if(lppd==null||lppd.size()==0){
+					throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				PlnMaterielDetail M1=new PlnMaterielDetail();
+				//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+				M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+				List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+				if(lpmd==null||lpmd.size()==0){
+					throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+				M1=lpmd.get(0);
+				if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+					throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+				}
+				
+				//实际上只有一条
+				for(PlnSkinrollingPlanDetail ppdc:lppd){
+					//判断平整计划明细的状态【STATUS】
+					if(!"5BSR03".equals(ppdc.getStatus())){
+						throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]上料后,经过其他操作,不允许撤销!");
+					}
+				}
+			}
+		}
+		
+		/**
+		 * 撤销平整上料接口 下PDI
+		 * @param 虚拟子卷号
+		 * @throws Exception 
+		 * 其实都是单条操作
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void MesTpmMCancel(List<MesTpmM> oci) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			
+			//循环 根据(平整计划号数组,虚拟物料号数组) 读取 平整计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】
+			for(MesTpmM mcsm:oci){
+				PlnSkinrollingPlanDetail plpd=new PlnSkinrollingPlanDetail();
+				plpd.setSr_plan_no(mcsm.getSchedule_no());
+				plpd.setObject_no_vt(mcsm.getMaterial_no_vt());
+				//如果不存在,则报错退出“平整计划[xxxxx][xx]信息不存在!”
+				List<PlnSkinrollingPlanDetail> lppd=this.getMapper(PlnSkinrollingPlanDetailMapper.class).find(plpd, 0, 0);
+				if(lppd==null||lppd.size()==0){
+					throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				PlnMaterielDetail M1=new PlnMaterielDetail();
+				//读取 根据计划明细表中的虚拟物料号(母卷号),查找虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息 M1
+				M1.setObject_no_vt(mcsm.getMaterial_no_vt());
+				List<PlnMaterielDetail> lpmd = this.getMapper(PlnMaterielDetailMapper.class).find(M1, 0, 0);
+				if(lpmd==null||lpmd.size()==0){
+					throw new Exception("虚拟物料["+mcsm.getMaterial_no_vt()+"]信息不存在!");
+				}
+				
+				//判断虚拟母卷信息里的 物料号【OBJECT_NO】,如果为空,则报错退出
+				M1=lpmd.get(0);
+				if(M1.getObject_no()==null||"".equals(M1.getObject_no())){
+					throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]尚未挂料!");
+				}
+				
+				//实际上只有一条
+				for(PlnSkinrollingPlanDetail ppdc:lppd){
+					//判断平整计划明细的状态【STATUS】
+					if(!"5BSR03".equals(ppdc.getStatus())){
+						throw new Exception("平整计划["+mcsm.getSchedule_no()+"]["+mcsm.getMaterial_no_vt()+"]上料后,经过其他操作,不允许撤销!");
+					}
+					PrcMaterielProcess pmp=new PrcMaterielProcess();
+					pmp.setObject_no(M1.getObject_no());
+					pmp.setPrc_code("5BSR03");
+					pmp.setRemark("回退上料");
+					pmp.setKeep_sametime_status(0);
+					ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+					//撤销实物物料状态跟踪
+					if(!"0".equals(al.getState())){
+						throw new Exception("物料状态不是已上料状态,不允许撤销!");
+					}
+					//修改平整计划明细表
+					PlnSkinrollingPlanDetail plpdu=new PlnSkinrollingPlanDetail();
+					// V_最后状态
+					plpdu.setStatus(((PrcMaterielProcess)al.getData()).getPrc_code());// "5BSR02"
+					plpdu.setSerial_no(ppdc.getSerial_no());
+					this.getMapper(PlnSkinrollingPlanDetailMapper.class).update(plpdu);
+				}
+				
+				//根据母卷号,查询对应的所有子卷信息
+				PlnMaterielDetail pmdq=new PlnMaterielDetail();
+				pmdq.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+				List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "  nvl (invalid_flg, '0') <> 1 ", "", 0, 0);
+				for(PlnMaterielDetail ppdc:lpmdc){
+					//修改各子卷的 状态 STATUS= 0PSR02; 
+					PlnMaterielDetail pmdu=new PlnMaterielDetail();
+					pmdu.setSerial_no(ppdc.getSerial_no());
+					pmdu.setStatus("0PSR02");
+					this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+					//增加子卷的 虚拟物料履历表
+					this.getBean(MesApiServiceImpl.class).InsertMatVtProc(ppdc.getObject_no_vt(),"0PSR02",userName,new Date());
+				}
+				//修改平整计划主表
+				doUpdatePlnSkinrollingPlan(mcsm.getSchedule_no()); 
+				PlnMaterielDetail pmdu=new PlnMaterielDetail();
+				//修改(母卷)虚拟物料表【PLN_MATERIEL_DETAIL】
+				pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+				pmdu.setStatus("0PSR02");
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+				//写虚拟物料履历,状态填:	0PSR02	母卷																			
+				this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PSR02",userName,new Date());
+			}
+		}
+		//--------------------------------平整上料、下PDI End----------------------------------------------------
+		
+		//--------------------------------平整完成 Start----------------------------------------------------
+		/**
+		 * 平整完成
+		 * 实物 生成接口  产生实物,未挂上单时调用
+		 * @param OBJECT_NO 实物母卷号
+		 * @param SUB_OBJECT_NO 实物子卷号
+		 * @param RELATION_TYPE 关系类型     1:改号(原-现号码对应);2:轧制(板坯-钢板对应);3:剪切/切割(母-子对应)
+		 * @throws Exception 
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void SkinrollingFinsh_PrcMatRelAdd(PrcMaterielRelation pmr) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			Date createTime = new Date();
+			//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BSR10,操作时间,操作人,"")
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmr.getSub_object_no());
+			pmp.setPrc_code("5BSR10");//新增的状态
+			pmp.setCreate_time(createTime);
+			pmp.setCreate_man_name(userName);
+			pmp.setRemark("");
+			//新增物料跟踪:
+			this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+			
+			//调用公共函数2  建立物料母子对应关系 
+			pmr.setCreate_man_name(userName);
+			pmr.setCreate_time(createTime);
+			pmr.setRelation_type(2);
+			pmr.setPrc_code("5BSR10");
+			pmr.setRemark("");
+			this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+		}
+		
+		/**
+		 * 撤销平整
+		 * 实物 撤销生成接口  产生实物,未挂上单时调用
+		 * @param OBJECT_NO 实物母卷号
+		 * @param SUB_OBJECT_NO 实物子卷号
+		 * @throws Exception 
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void SkinrollingFinsh_PrcMatRelRemove(PrcMaterielRelation pmr) throws Exception{
+			//回退子卷物料跟踪:
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmr.getSub_object_no());
+			pmp.setPrc_code("5BSR10");
+			pmp.setKeep_sametime_status(0);
+			pmp.setRemark("撤销平整实物生成");
+			ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+			//撤销实物物料状态跟踪
+			if(!"0".equals(al.getState())){
+				throw new Exception("实物["+pmp.getObject_no()+"]状态已发生改变,不能撤销!");
+			}
+			
+			//调用公共函数3  断开物料母子对应关系 
+			PrcMaterielRelation pmrd=new PrcMaterielRelation();
+			pmrd.setObject_no(pmr.getObject_no());
+			pmr.setSub_object_no(pmr.getSub_object_no());
+			this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+		}
+		
+		
+	/**
+	 * 平整完成 虚拟子卷 挂料接口
+	 * 
+	 * @param material_no   实物母卷号
+	 * @param SUB_OBJECT_NO 实物子卷号
+	 * @param object_no_vt  虚拟子卷号
+	 * @param create_time   操作时间 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+	 * 						厂内合同交工时,如果子卷工序完成把子卷库存信息的订单信息删除(2019-02-20)(此更改已屏蔽)
+	 * @throws Exception
+	 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void SkinrollingFinsh_Relation(PlnMaterielDetail pmd) throws Exception{
+			
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			Date createTime = new Date();
+			// 工序点信息
+			List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(info);
+			
+			// 新增物料附加信息
+			this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(), pmd.getObject_no_vt(), processpoint.smooth_code);
+			// 调用物流接口,获取实物子卷信息。
+			YdmProductDetail ypd=new YdmProductDetail();
+			ypd.setCoilno(pmd.getSub_object_no());
+			List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+			if(lypd==null||lypd.size()==0){
+				throw new Exception("库存中无["+pmd.getObject_no()+"]实物卷!");
+			}
+			
+			// 平整工序代码processpoint.Skinrolling_code 2018-06-13
+			// 读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			if(Utils.isEmpty(lypd.get(0).getSteelcode()) || (!lypd.get(0).getSteelcode().equals(lpmd.get(0).getSteel_code()))){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的牌号不匹配,不能绑定");
+			}
+			// 2018-08-27 生产完成后厚度按实际情况取值,很有可能和计划不一致,故去此验证.
+//			if(lypd.get(0).getThick().doubleValue()!=lpmd.get(0).getThick().doubleValue()){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的厚不匹配,不能绑定");
+//			}
+			//------------------------2018-03-16------------------------------
+			//100-100>5 考虑偏差
+//			if((lypd.get(0).getWidth().doubleValue()-lpmd.get(0).getWidth().doubleValue()>dUpper)
+//					||(lypd.get(0).getWidth().doubleValue()-lpmd.get(0).getWidth().doubleValue()<dLower)){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]和虚拟卷["+pmd.getObject_no_vt()+"]的宽不匹配,不能绑定");
+//			}
+//			//----------------------------------------------------------------
+//			if(lpmd.get(0).getObject_no()!=null&&!"".equals(lpmd.get(0).getObject_no())){
+//				throw new Exception("实物卷["+pmd.getObject_no()+"]已绑定其他计划, 不能再次绑定!");
+//			}
+//			
+			// 修改虚拟物料表
+			PlnMaterielDetail pmdq=new PlnMaterielDetail();
+			pmdq.setObject_no_vt(pmd.getObject_no_vt());
+			pmdq.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdq.setObject_no(pmd.getSub_object_no());
+			pmdq.setStatus("0PSR10");
+			pmdq.setIs_finished("1");
+//			pmdq.setPrev_process_code(processpoint.Skinrolling_code);
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdq);
+			// 新增虚拟子物料履历																			
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PSR10",userName,createTime);
+			
+			//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BSR10,操作时间,操作人,"")
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmd.getSub_object_no());
+			pmp.setPrc_code("5BSR10");//新增的状态
+			pmp.setCreate_time(createTime);
+			pmp.setCreate_man_name(userName);
+			pmp.setRemark("");
+			// 新增物料跟踪:
+			this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+			
+			// 2018-06-19 去掉 判断下一工序==null条件(判断虚拟子物料是否是其他子料的原料)
+			// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(lpmd.get(0).getOrder_no());
+			pos.setSr(lpmd.get(0).getSingle_weight());
+			pos.setSr_cnt(1l);
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+
+			// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+			PlnProdorderStatistic pps = new PlnProdorderStatistic();
+			pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+			pps.setSr(lpmd.get(0).getSingle_weight());
+			pps.setSr_cnt(1l);
+			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+			
+			//修改虚拟物料对应的 平整计划进程表
+			PlnSrPlanStatistic plps=new PlnSrPlanStatistic();
+			plps.setSr_plan_no(lpmd.get(0).getSr_plan_no());
+			plps.setSr(lpmd.get(0).getSingle_weight());
+			plps.setSr_cnt(1l);
+			this.getMapper(PlnSrPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//调用公共函数2  建立物料母子对应关系 
+			PrcMaterielRelation pmr=new PrcMaterielRelation();
+			pmr.setObject_no(pmd.getMaterial_no());
+			pmr.setSub_object_no(pmd.getSub_object_no());
+			pmr.setCreate_man_name(userName);
+			pmr.setCreate_time(createTime);
+			pmr.setRemark("");
+			pmr.setRelation_type(2);
+			this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+		}
+		
+		/**
+		 * 平整完成 不符合计划
+		 * 实物生成, 新增虚拟子卷挂料
+		 * @param sub_object_no 实物子卷号
+		 * @param object_no 实物母卷号
+		 * @param create_time 操作时间
+		 * 注意 传入操作时间 新增履历表和实物进程表的创建时间,使用传入的操作时间
+		 * 增加初始设计号 03-25
+		 * @throws Exception 
+		 * 2018-06-19
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public ResultModel SkinrollingFinsh_No_Plan(PlnMaterielDetail pmd) throws Exception {
+			ResultModel rm = new ResultModel("200", "");
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			Date createTime = new Date();
+			// 工序点信息
+			List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class)
+					.findWithCondition(null, "sort_code = '2002' AND validflag = '1'",
+							null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(info);
+			//调用物流接口,获取实物子卷信息。
+			YdmProductDetail ypd=new YdmProductDetail();
+			ypd.setCoilno(pmd.getSub_object_no());
+			List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+			if(lypd==null||lypd.size()==0){
+				throw new Exception("库存中无["+pmd.getSub_object_no()+"]实物卷!");
+			}
+			// 获取母卷虚拟物料信息
+			PlnMaterielDetail pmdcm=new PlnMaterielDetail();
+			pmdcm.setObject_no(pmd.getObject_no());
+			List<PlnMaterielDetail> pmdpp = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdcm, " nvl(invalid_flg,0) = 0 ", "", 0, 1);
+			if (pmdpp == null || pmdpp.size()==0) {
+				rm.setState("500");
+				rm.setMsgInfo("实物["+pmd.getObject_no()+"]的虚拟物料信息不存在!");
+				return rm;
+			}
+			PlnProdorder pp=new PlnProdorder();
+			pp.setProd_order_no(pmdpp.get(0).getProd_order_no());
+			List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+			if(lpp==null||lpp.size()==0){
+				rm.setState("500");
+				rm.setMsgInfo("生产订单["+pp.getProd_order_no()+"]不存在!");
+				return rm;
+			}
+			
+			// 获取下一个工序
+			String temp = this.getBean(MesApiDesignInfoImpl.class)
+					.getPath(lpp.get(0).getWhole_process_codes(), processpoint.smooth_code, pmdpp.get(0).getProc_repeat_index());
+			String[] path =  temp.split("-");
+			ArrayList<String> validpath = this.getBean(MesApiDesignInfoImpl.class).getProcessPath(path);
+			
+			// 新建虚拟物料表【PLN_MATERIEL_DETAIL】虚拟子卷信息
+			PlnMaterielDetail pmdc=new PlnMaterielDetail();
+			BeanUtils.copyProperties(pmdpp.get(0), pmdc);
+			// 获取序列号
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, null, " serial_no desc ", 0, 1);
+			long PMDNo=lpmd==null?1:(lpmd.size()==0?1:(lpmd.get(0).getSerial_no()+1));
+			// 6位日期
+			String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+			// 6位流水号
+			int objectnoVtNo=this.getMapper(PlnMaterielDetailMapper.class).getObjectVtMaxNoForDate(sDate)+1;
+			pmdc.setSerial_no(PMDNo);
+			// 年月日(6位)+6位流水
+			pmdc.setObject_no_vt(sDate+String.format("%06d", objectnoVtNo));
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setObject_no(pmd.getSub_object_no());
+			pmdc.setPline_code(lpp.get(0).getPline_code());
+			pmdc.setStatus("0PSR10");
+			pmdc.setIs_finished("1");
+			pmdc.setPrev_dsn_process_code(processpoint.smooth_code);
+			pmdc.setPrev_process_code(processpoint.smooth_code);
+			pmdc.setIs_prev_dsn_finished("1");//母卷:0
+			pmdc.setCreate_process_code(processpoint.smooth_code);
+			if (Utils.isNotEmpty(validpath)) {
+				pmdc.setNext_dsn_process_code(validpath.get(0));
+				pmdc.setNext_process_code(validpath.get(0));
+			}else {
+				pmdc.setNext_dsn_process_code(null);
+				pmdc.setNext_process_code(null);
+			}
+			pmdc.setIs_mat(0);//母卷:1
+			pmdc.setOrder_no(lpp.get(0).getOrder_no());
+			pmdc.setProd_order_no(lpp.get(0).getProd_order_no());
+			pmdc.setPline_code(lpp.get(0).getPline_code());
+//			pmdc.setLw_design_no(pmdpp.get(0).getLw_design_no());
+//			pmdc.setAn_design_no(pmdpp.get(0).getAn_design_no());
+//			pmdc.setCl_plan_no(pmdpp.get(0).getCl_plan_no());
+//			pmdc.setSr_plan_no(pmdpp.get(0).getSr_plan_no());
+			pmdc.setMat_object_no_vt(pmdpp.get(0).getObject_no_vt());
+			pmdc.setIs_multi("0");
+			pmdc.setSteel_code(lpp.get(0).getSteel_code());
+			pmdc.setWidth(lypd.get(0).getWidth());
+			pmdc.setThick(lypd.get(0).getThick());
+			pmdc.setLength(lypd.get(0).getLength());
+			pmdc.setDiameter_inn(lypd.get(0).getDiameter_inn());
+			pmdc.setDiameter_out(lypd.get(0).getDiameter_out());
+			pmdc.setSingle_weight(lypd.get(0).getFactweight());
+			pmdc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+			pmdc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pmdc.setOrd_flg("2");
+			pmdc.setCreate_man_name(userName);
+			pmdc.setCreate_time(createTime);
+			pmdc.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pmdc.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+//			pmdc.setCreate_design_no(pmdpp.get(0).getSr_design_no());
+//			pmdc.setSr_design_no(pmdpp.get(0).getSr_design_no());
+			this.getMapper(PlnMaterielDetailMapper.class).insert(pmdc);
+			
+
+			// 新增物料附加信息
+			this.getBean(MesApiDesignInfoImpl.class).addChildMaterielExinfo(pmd.getObject_no(), pmd.getSub_object_no(), pmdc.getObject_no_vt(), processpoint.smooth_code);
+			// 子卷存在下一个工序
+			if (Utils.isNotEmpty(validpath)) {
+				// 调用设计信息接口
+				List<DesignInfo> infos = new ArrayList<>();
+				DesignInfo infor = new DesignInfo();
+				infor.setCurrentProcIndex(0);
+				infor.setObject_no(pmd.getSub_object_no());
+				infor.setObject_no_vt(pmdc.getObject_no_vt());
+				infor.setProcess(validpath);
+				infor.setProd_order_no(pmdpp.get(0).getProd_order_no());
+				infor.setSingle_wgt(lypd.get(0).getFactweight());
+				infos.add(infor);
+				ResultModel result = this.getBean(MesApiDesignInfoImpl.class).Design_Plan_Info(infos,null);
+				if (!"200".equals(result.getState())) {
+					throw new Exception("生产设计信息失败" + result.getMsgInfo());
+				}
+			}
+			
+			// 反写实绩的虚拟物料号 2018-09-20
+			MesTpmD mcd = new MesTpmD();
+			mcd.setCoil_no(pmd.getSub_object_no());
+			mcd.setCoil_no_vt(pmdc.getObject_no_vt());
+			this.getMapper(MesTpmDMapper.class).update(mcd);
+			
+			// 反写实物虚拟卷号 2018-11-08
+			ypd.setObject_no_vt(pmdc.getObject_no_vt());
+			this.getMapper(YdmProductDetailMapper.class).update(ypd);
+			
+			//调用 新增实物物料状态跟踪:  传入(实物子卷号,5BSR10,操作时间,操作人,"")
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmd.getSub_object_no());
+			pmp.setPrc_code("5BSR10");
+			pmp.setCreate_time(createTime);
+			pmp.setCreate_man_name(userName);
+			pmp.setRemark("");
+			// 新增物料跟踪:
+			this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+			
+			// 新增虚拟子物料履历																			
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(pmdc.getObject_no_vt(),"0PSR10",userName,createTime);
+			
+			// 修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+			PlnOrderStatistic pos = new PlnOrderStatistic();
+			pos.setOrder_no(lpp.get(0).getOrder_no());
+			pos.setSr(pmdc.getSingle_weight());
+			pos.setSr_cnt(1l);
+			this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+
+			// 生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+			PlnProdorderStatistic pps = new PlnProdorderStatistic();
+			pps.setProd_order_no(pmdc.getProd_order_no());
+			pps.setSr(pmdc.getSingle_weight());
+			pps.setSr_cnt(1l);
+			this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+			
+			//修改虚拟物料对应的 平整计划进程表
+			PlnMaterielDetail pmdmq=new PlnMaterielDetail();
+			pmdmq.setObject_no_vt(pmdc.getMat_object_no_vt());
+			List<PlnMaterielDetail> lpmdm=this.getMapper(PlnMaterielDetailMapper.class).find(pmdmq, 0, 1);
+			PlnSrPlanStatistic plps=new PlnSrPlanStatistic();
+			plps.setSr_plan_no(lpmdm.get(0).getSr_plan_no());
+			plps.setSr(pmdc.getSingle_weight());
+			plps.setSr_cnt(1l);
+			this.getMapper(PlnSrPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//调用公共函数2  建立物料母子对应关系 
+			PrcMaterielRelation pmr=new PrcMaterielRelation();
+			pmr.setObject_no(pmd.getObject_no());
+			pmr.setSub_object_no(pmd.getSub_object_no());
+			pmr.setCreate_man_name(userName);
+			pmr.setCreate_time(createTime);
+			pmr.setRemark("");
+			pmr.setRelation_type(2);
+			this.getBean(MesApiServiceImpl.class).doBuildRelation(pmr);
+			return rm;
+		}
+		
+		/**
+		 * 撤销平整
+		 * 虚拟子卷 挂料接口
+		 * @param OBJECT_NO 实物子卷号
+		 * @param object_no_vt 虚拟子卷号
+		 * @throws Exception 
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void SkinrollingFinsh_RelationCancel(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			
+			//调用物流接口,获取实物子卷信息。
+			YdmProductDetail ypd=new YdmProductDetail();
+			ypd.setCoilno(pmd.getObject_no());
+			List<YdmProductDetail> lypd=this.getMapper(YdmProductDetailMapper.class).find(ypd, 0, 0);
+			if(lypd==null||lypd.size()==0){
+				throw new Exception("库存中无["+pmd.getObject_no()+"]实物卷!");
+			}
+			 
+			//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			
+			//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷的母卷信息
+			List<PlnMaterielDetail> lpmdm=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+lpmd.get(0).getMat_object_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+			if(lpmdm==null||lpmdm.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			
+			if(lpmdm.get(0).getObject_no()==null||"".equals(lpmdm.get(0).getObject_no())){
+				throw new Exception("实物卷["+pmd.getObject_no()+"]尚未绑定该计划,不能回退!");
+			}
+			
+			// 下一个工序做了计划就不能回退
+			if (Utils.isNotEmpty(pmd.getNext_dsn_process_code())) {
+			this.getBean(MesApiDesignInfoImpl.class).JudgeIsOrNotPlan(lpmd.get(0));
+			}
+			
+			// 物料充当脱单履历
+//			this.getBean(MesApiDesignInfoImpl.class).createMatLog(lpmd.get(0), "厂内合同取消交工",userName, lpmd.get(0).getPrev_process_code() , "-1", pmd.getObject_no());
+			
+			//回退子卷物料跟踪:
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(pmd.getObject_no());
+			pmp.setPrc_code("5BSR10");
+			pmp.setKeep_sametime_status(0);
+			pmp.setRemark("撤销子卷挂料");
+			ResultModel al=this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+			//撤销实物物料状态跟踪
+			if(!"0".equals(al.getState())){
+				throw new Exception("平整完成后,实物["+pmp.getObject_no()+"]状态已发生改变,不能撤销!");
+			}
+			
+			//修改虚拟物料表
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			pmdu.setObject_no_vt(pmd.getObject_no_vt());
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setStatus("0PSR03");
+			pmdu.setIs_finished("0");
+//			pmdu.setPrev_process_code(processpoint.Skinrolling_code);
+			this.getMapper(PlnMaterielDetailMapper.class).doUpdateCancelRelation(pmdu);
+			//新增虚拟子物料履历																			
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PSR03",userName,new Date());
+			//判断虚拟子物料是否有其他子料的原料
+//			if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+				//修改改虚拟子物料对应的 订单进程表[PLN_ORDER_STATISTIC]
+				PlnOrderStatistic pos=new PlnOrderStatistic();
+				pos.setOrder_no(lpmd.get(0).getOrder_no());
+				pos.setAn(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+				pos.setAn_cnt(-1l);
+				this.getMapper(PlnOrderStatisticMapper.class).doUpdatePlaned(pos);
+				//生产订单进程表[PLN_PRODORDER_STATISTIC]信息
+				PlnProdorderStatistic pps=new PlnProdorderStatistic();
+				pps.setProd_order_no(lpmd.get(0).getProd_order_no());
+				pps.setAn(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+				pps.setAn_cnt(-1l);
+				this.getMapper(PlnProdorderStatisticMapper.class).doUpdatePlaned(pps);
+//			}
+			
+			//修改虚拟物料对应的 平整计划进程表
+			PlnSrPlanStatistic plps=new PlnSrPlanStatistic();
+			plps.setSr_plan_no(lpmd.get(0).getSr_plan_no());
+			plps.setSr(lpmd.get(0).getSingle_weight()==null?null:(-lpmd.get(0).getSingle_weight()));
+			plps.setSr_cnt(-1l);
+			this.getMapper(PlnSrPlanStatisticMapper.class).doUpdatePlaned(plps);
+			//调用公共函数3  断开物料母子对应关系 
+			PrcMaterielRelation pmr=new PrcMaterielRelation();
+			pmr.setObject_no(lpmdm.get(0).getObject_no());
+			pmr.setSub_object_no(lpmd.get(0).getObject_no());
+			this.getBean(MesApiServiceImpl.class).doBuildRelationRemove(pmr);
+			
+			// 厂内合同子卷生产完成时,清空库存信息订单信息
+//			boolean flag_Ct = this.getBean(MesApiDesignInfoImpl.class).getContractType(lpmd.get(0).getProd_order_no());
+//			boolean flag_Mf = this.getBean(MesApiDesignInfoImpl.class).matIsFinish(pmd.getObject_no());
+//			if (flag_Mf && flag_Ct) {
+//				YdmProductDetail ydm = new YdmProductDetail();
+//				ydm.setCoilno(pmd.getObject_no());
+//				ydm.setProdorderno(lpmd.get(0).getProd_order_no());
+//				ydm.setOrderno(lpmd.get(0).getOrder_no());
+//				ydm.setObject_no_vt(pmd.getObject_no_vt());
+//				this.getMapper(YdmProductDetailMapper.class).update(ydm);;
+//			}
+			// 删除物料附加信息
+			this.getMapper(PrcMaterielExtinfoMapper.class).delete(pmd.getObject_no());
+			
+			// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果是,则需释放虚拟子堆垛,调用接口:纵剪——虚拟子堆垛 释放接口
+			if ("2".equals(lpmd.get(0).getOrd_flg())) {
+				SkinrollingFinsh_Release(pmd);
+			}
+			
+		}
+		
+		/**
+		 * 平整完成
+		 * 虚拟子卷 释放接口
+		 * @param object_no_vt 虚拟子卷号
+		 * @throws Exception 
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void SkinrollingFinsh_Release(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			// 工序点信息
+			List<ComBaseInfo> info = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null, "sort_code = '2002' AND validflag = '1'", null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(info);
+			//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟子卷信息
+			PlnMaterielDetail pmdq=new PlnMaterielDetail();
+			pmdq.setObject_no_vt(pmd.getObject_no_vt());
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).find(pmdq, 0, 0);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			
+			// ------------------------2018-06-19-------------------------
+			// 判断虚拟子卷信息,是否是额外的成品(ORD_FLG = 2), 如果不成立, 则报错退出,“虚拟物料[xxx]不是额外成品,不能释放!”
+			if (!"2".equals(lpmd.get(0).getOrd_flg())) {
+				throw new Exception("虚拟物料["+pmd.getObject_no_vt()+"]不是额外成品,不能释放!");
+			}
+			// 判断虚拟子卷是否是平整的虚拟成品
+			if(!processpoint.smooth_code.equals(lpmd.get(0).getPrev_dsn_process_code())){
+				throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]不是平整设计成品,无法释放!");
+			}
+//			PlnMaterielDetail pmdqd=new PlnMaterielDetail();
+//			pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+//			int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+//			if (count>0) {
+//				throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+//			}
+			PlnMaterielDetail pmdqd=new PlnMaterielDetail();
+			pmdqd.setMat_object_no_vt(pmd.getObject_no_vt());
+			List<PlnMaterielDetail> child = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 0);
+//			int count = this.getMapper(PlnMaterielDetailMapper.class).count(pmdqd);
+			if (Utils.isNotEmpty(child)) {
+				// 删除子卷
+				this.getBean(MesApiDesignInfoImpl.class).deleteChildTrue(child);
+//				throw new Exception("虚拟子卷["+pmd.getObject_no_vt()+"]作为后一工序的原料,已经挂单,无法释放!");
+			}
+			//------------------------------------------------------------
+			
+			// 判断虚拟子卷是否是其他物料母卷: IF(NEXT_DSN_PROCESS_CODE == NULL)
+			// if(lpmd.get(0).getNext_dsn_process_code()==null||"".equals(lpmd.get(0).getNext_dsn_process_code())){
+			
+				//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录,状态标记为“0PSRXX”
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PSRXX",userName,new Date());
+				
+				//将虚拟物料信息 从虚拟物料表【PLN_MATERIEL_DETAIL】移动到 无效虚拟物料表【PLN_MATERIEL_INVALID】.
+				//(两个表结构一样,移动后,保持serial_no不变,删除原表记录)
+				PlnMaterielInvalid pmi=new PlnMaterielInvalid();
+				List<PlnMaterielInvalid> pmin = this.getMapper(PlnMaterielInvalidMapper.class).findWithCondition(null, " serial_no = '"+lpmd.get(0).getSerial_no()+"' or object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"'", "", 0, 0);
+				if (pmin !=null && pmin.size()>0) {
+					this.getMapper(PlnMaterielInvalidMapper.class).delete(lpmd.get(0).getSerial_no());
+				}
+				BeanUtils.copyProperties(lpmd.get(0), pmi);
+				this.getMapper(PlnMaterielInvalidMapper.class).insert(pmi);
+				this.getMapper(PlnMaterielDetailMapper.class).doDeleteId(lpmd.get(0));
+				
+		}
+		
+		/**
+		 * 平整完成
+		 * 虚拟母卷统计
+		 * @param object_no_vt 虚拟母卷号
+		 * @param object_no 实物母卷号
+		 * @throws Exception 
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void SkinrollingFinsh_Sum(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			Date createTime = new Date();
+			String plan_no = "";
+			// 工序点信息
+			List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+					"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+			ProcessPoint processpoint = new ProcessPoint(infoi);
+			
+			// 修改物料附加信息
+			this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.smooth_code,true);
+			
+			//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+			PlnMaterielDetail pmdq=new PlnMaterielDetail();
+			pmdq.setObject_no_vt(pmd.getObject_no_vt());
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(pmdq, "nvl(invalid_flg,0) <> 1", null, 0, 1);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+			if(lpmd.get(0).getObject_no()==null||"".equals(lpmd.get(0).getObject_no())){
+				throw new Exception("计划母卷["+pmd.getObject_no_vt()+"]未上料, 不能平整!");
+			}
+			plan_no = lpmd.get(0).getSr_plan_no();
+			// 新增母卷物料跟踪:调用 新增实物物料状态跟踪
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setPrc_code("5BSR10");//新增的状态
+			pmp.setCreate_time(createTime);
+			pmp.setObject_no(pmd.getObject_no());
+			pmp.setCreate_man_name(userName);
+			pmp.setRemark("");
+			// 新增物料跟踪:
+			this.getBean(MesApiServiceImpl.class).INSERT_OBJ_PROCESS(pmp);
+			// 判断虚拟母卷对应的虚拟子卷是否 挂料完成
+			List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "mat_object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0,0);
+			int isum=0;
+			if (lpmdc != null && lpmdc.size() > 0) {
+				for (PlnMaterielDetail pmdcc : lpmdc) {
+					PlnMaterielDetail pmdcu = new PlnMaterielDetail();
+					pmdcu.setSerial_no(pmdcc.getSerial_no());
+					pmdcu.setIs_finished("1");
+					this.getMapper(PlnMaterielDetailMapper.class).update(pmdcu);
+					if (pmdcc.getObject_no() == null || "".equals(pmdcc.getObject_no())) {
+						// 统计 (OBJECT_NO=NULL的子卷数量)、虚拟子卷总数量
+						isum += 1;
+					}
+				}
+				//如果(OBJECT_NO为NULL的数量==子卷总数
+				if(isum==lpmdc.size()){
+					//读取物料关系表【PRC_MATERIEL_RELATION】(where OBJECT_NO=实物母卷号 AND RELATION_TYPE=3)的记录
+					PrcMaterielRelation pmr=new PrcMaterielRelation();
+					pmr.setObject_no(lpmd.get(0).getObject_no());
+					pmr.setRelation_type(2);
+					List<PrcMaterielRelation> lpmr=this.getMapper(PrcMaterielRelationMapper.class).find(pmr, 0, 0);
+					if(lpmr==null||lpmr.size()==0){
+						//如果 关系表记录为空(说明实物卷未切割,计划未执行),直接报错退出“母卷xxxx尚未进行切割操作!”;
+						throw new Exception("母卷["+pmr.getObject_no()+"]尚未进行切割操作!");
+					}else{
+						//修改虚拟物料表的母卷记录:OBJECT_NO=NULL;  NEED_EXTOPT=1;  Sr_plan_no=NULL
+						PlnMaterielDetail pmdu=new PlnMaterielDetail();
+						pmdu.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+						pmdu.setNeed_extopt("1");
+						this.getMapper(PlnMaterielDetailMapper.class).doUpdateSkinrollingFinshSum(pmdu);
+					}
+				}else {
+					// 挂单的时候一起修改了
+//					this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), true);
+				}
+			}
+			
+			//修改虚拟物料表OPT_TIMES+=1; STATUS= 0PSR10; IS_NEXT_FINISHED=1(2018-06-19)(同步修改S1的[OPT_TIMES]、[STATUS]
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setIs_next_finished("1");
+			pmdu.setOpt_times((lpmd.get(0).getOpt_times()==null?0:lpmd.get(0).getOpt_times())+1);
+			pmdu.setStatus("0PSR10");
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			
+			//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+			//-------------2018-03-21-------这个地方的Sr_plan_no有点特殊的地方,所以没有直接调用InsertMatVtProc接口------------
+			PlnMaterielDetail pmdcq=new PlnMaterielDetail();
+			pmdcq.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdq = this.getMapper(PlnMaterielDetailMapper.class).find(pmdcq, 0, 0);
+			//写虚拟物料履历,状态填:		子卷																			
+			PrcMaterielVtProcess pmvpc=new PrcMaterielVtProcess();
+			
+			// 20191001
+			long serial_no = 0l;
+			List<PrcMaterielVtProcess> pmpQ = this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(null, "", "serial_no desc", 0, 1);
+			if (Utils.isNotEmpty(pmpQ)) {
+				serial_no = pmpQ.get(0).getSerial_no()+1;
+			}
+			pmvpc.setSerial_no(serial_no);
+			// end
+			
+			pmvpc.setObject_no_vt(lpmdq.get(0).getObject_no_vt());
+			pmvpc.setObject_no(lpmdq.get(0).getObject_no());
+			pmvpc.setObject_type(lpmdq.get(0).getObject_type());
+			pmvpc.setPline_code(lpmdq.get(0).getPline_code());
+			pmvpc.setStatus("0PSR10");
+			pmvpc.setOrder_no(lpmdq.get(0).getOrder_no());
+			pmvpc.setProd_order_no(lpmdq.get(0).getProd_order_no());
+			pmvpc.setLw_design_no(lpmdq.get(0).getLw_design_no());
+			pmvpc.setCl_design_no(lpmdq.get(0).getCl_design_no());
+			pmvpc.setRl_design_no(lpmdq.get(0).getRl_design_no());
+			pmvpc.setAn_design_no(lpmdq.get(0).getAn_design_no());
+			pmvpc.setLw_plan_no(lpmdq.get(0).getLw_plan_no());
+			pmvpc.setCl_plan_no(lpmdq.get(0).getCl_plan_no());
+			pmvpc.setRl_plan_no(lpmdq.get(0).getRl_plan_no());
+			pmvpc.setSr_plan_no(lpmdq.get(0).getSr_plan_no());
+			pmvpc.setBatch_no(lpmdq.get(0).getBatch_no());
+			pmvpc.setCreate_man_name(userName);
+			pmvpc.setCreate_time(createTime);
+			this.getMapper(PrcMaterielVtProcessMapper.class).doAdd(pmvpc);
+			//----------------------------------------------------------------------
+			
+			//修改虚拟物料对应的 平整计划进程表
+			//MesCrSlittingD mcsd=this.getMapper(MesCrSlittingDMapper.class).findById(lpmd.get(0).getObject_no());
+			PlnSrPlanStatistic plps=new PlnSrPlanStatistic();
+			plps.setMat_sr(lpmd.get(0).getSingle_weight());//mcsd.getCoil_act_wgt());
+			plps.setMat_sr_cnt(1l);
+			plps.setSr_plan_no(plan_no);
+			this.getMapper(PlnSrPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//平整计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BSR10
+			PlnSkinrollingPlanDetail plpd=new PlnSkinrollingPlanDetail();
+			plpd.setSr_plan_no(plan_no);
+			plpd.setStatus("5BSR10");
+			plpd.setObject_no_vt(pmd.getObject_no_vt());		
+			this.getMapper(PlnSkinrollingPlanDetailMapper.class).doUpdateWSum(plpd);
+			
+			//平整计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(平整计划号);
+			doUpdatePlnSkinrollingPlan(plan_no);
+			
+			// 将未挂单的子卷 置为无效
+//			List<PlnMaterielDetail> child = this.getMapper(
+//					PlnMaterielDetailMapper.class).findWithCondition(
+//					null,
+//					"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//							+ "' and nvl(invalid_flg,0) =0 and object_no is null",
+//					"", 0, 0);
+//			if (Utils.isNotEmpty(child)) {
+//				this.getBean(MesApiDesignInfoImpl.class).deleteChild(child);
+//			}
+		}
+		
+		/**
+		 * 撤销平整
+		 * 撤销虚拟母卷统计
+		 * @param object_no_vt 虚拟母卷号
+		 * @param object_no 实物母卷号
+		 * @throws Exception 
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void SkinrollingFinsh_SumCancel(PlnMaterielDetail pmd) throws Exception{
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			//读取虚拟物料表【PLN_MATERIEL_DETAIL】,获取虚拟母卷信息
+			List<PlnMaterielDetail> lpmd=this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, "object_no_vt = '"+pmd.getObject_no_vt()+"' and nvl(invalid_flg,0) = '0'", null, 0, 1);
+			if(lpmd==null||lpmd.size()==0){
+				throw new Exception("虚拟物料无["+pmd.getObject_no_vt()+"]卷!");
+			}
+		
+			// 工序点信息
+						List<ComBaseInfo> infoi = this.getMapper(ComBaseInfoMapper.class).findWithCondition(null,
+								"sort_code = '2002' AND validflag = '1'", null, 0, 0);
+						ProcessPoint processpoint = new ProcessPoint(infoi);
+						
+						// 修改物料附加信息
+						this.getBean(MesApiDesignInfoImpl.class).updateMExInfo(pmd.getObject_no(), processpoint.smooth_code,false);
+						
+			// 将无效的虚拟物料子卷恢复
+//			List<PlnMaterielDetail> child = this.getMapper(
+//					PlnMaterielDetailMapper.class).findWithCondition(
+//					null,
+//					"mat_object_no_vt = '" + lpmd.get(0).getObject_no_vt()
+//							+ "' and invalid_flg = '1'", "", 0, 0);
+//			if (Utils.isNotEmpty(child)) {
+//				this.getBean(MesApiDesignInfoImpl.class).recoveryChild(child);
+//			}
+			
+			//读取虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】,获取虚拟母卷最后一条
+			PrcMaterielVtProcess pmvp=new PrcMaterielVtProcess();
+			pmvp.setStatus("0PSR10");
+			pmvp.setObject_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PrcMaterielVtProcess> lpmvp=this.getMapper(PrcMaterielVtProcessMapper.class).findWithCondition(pmvp, "", " create_time desc ", 0, 1);
+			
+			//循环 (MAT_OBJECT_NO_VT=虚拟母卷号) 的所有虚拟子卷记录
+			PlnMaterielDetail pmdc=new PlnMaterielDetail();
+			pmdc.setMat_object_no_vt(lpmd.get(0).getObject_no_vt());
+			List<PlnMaterielDetail> lpmdc=this.getMapper(PlnMaterielDetailMapper.class).find(pmdc, 0, 0);
+			for(PlnMaterielDetail pmdcc:lpmdc){
+				PlnMaterielDetail pmdu=new PlnMaterielDetail();
+				pmdu.setSerial_no(pmdcc.getSerial_no());
+				pmdu.setIs_finished("0");
+				//修改虚拟物料表【PLN_MATERIEL_DETAIL】:IS_FINISHED=0;
+				this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			}
+			
+			//修改虚拟物料表_母卷信息
+			PlnMaterielDetail pmdu=new PlnMaterielDetail();
+			pmdu.setSerial_no(lpmd.get(0).getSerial_no());
+			pmdu.setNeed_extopt("0");
+			pmdu.setIs_next_finished("0");
+			pmdu.setSr_plan_no(lpmvp.get(0).getSr_plan_no());
+			pmdu.setStatus_desc("0PSR03");
+			
+			if(lpmd.get(0).getObject_no()==null||"".equals(lpmd.get(0).getObject_no())){
+				pmdu.setObject_no(lpmvp.get(0).getObject_no());
+			}
+			// 2018-06-23 opt_Times 之前一直没减,判断条件不对
+			if(lpmd.get(0).getOpt_times()!=null){
+				pmdu.setOpt_times(lpmd.get(0).getOpt_times()-1);
+			}
+			this.getMapper(PlnMaterielDetailMapper.class).update(pmdu);
+			
+			//新增虚拟物料履历表【PRC_MATERIEL_VT_PROCESS】记录
+			this.getBean(MesApiServiceImpl.class).InsertMatVtProc(lpmd.get(0).getObject_no_vt(),"0PSR03",userName,new Date());
+			
+			//修改虚拟物料对应的 平整计划进程表
+			PlnSrPlanStatistic plps=new PlnSrPlanStatistic();
+			plps.setMat_sr(-lpmd.get(0).getSingle_weight());
+			plps.setMat_sr_cnt(-1l);
+			plps.setSr_plan_no(lpmd.get(0).getSr_plan_no());
+			this.getMapper(PlnSrPlanStatisticMapper.class).doUpdatePlaned(plps);
+			
+			//回退实物母卷的物料跟踪 
+			PrcMaterielProcess pmp=new PrcMaterielProcess();
+			pmp.setObject_no(lpmd.get(0).getObject_no());
+			pmp.setPrc_code("5BSR10");
+			pmp.setRemark("撤销母卷平整");
+			pmp.setKeep_sametime_status(0);
+			//防止物料号为null
+			if (StringUtils.isEmpty(pmp.getObject_no())) {
+				String condition = " and object_no_vt = '"+lpmd.get(0).getObject_no_vt()+"' and object_no is not null";
+				List<PlnMatReplaceLog> pmrList = this.getMapper(PlnMatReplaceLogMapper.class).findWithCondition(null, condition, null, 0, 0);
+				if (CollectionUtils.isNotEmpty(pmrList)) {
+					pmp.setObject_no(pmrList.get(0).getObject_no());
+				}
+			}
+			
+			ResultModel rm = this.getBean(MesApiServiceImpl.class).ARRAYLIST(pmp);
+			if(!"0".equals(rm.getState())){
+				//throw new Exception("平整完成后,母卷状态已发生改变,不能撤销!");
+			}
+			
+			//平整计划明细表【PLN_LENGTHWISE_PLAN_DETAIL】:STATUS= 5BSR03
+			PlnSkinrollingPlanDetail plpd=new PlnSkinrollingPlanDetail();
+			plpd.setSr_plan_no(lpmd.get(0).getSr_plan_no());
+			plpd.setStatus("5BSR03");
+			plpd.setObject_no_vt(pmd.getObject_no_vt());		
+			this.getMapper(PlnSkinrollingPlanDetailMapper.class).doUpdateWSum(plpd);
+			
+			//平整计划主表【PLN_LENGTHWISE_PLAN】:调用公共函数1(平整计划号);
+			doUpdatePlnSkinrollingPlan(lpmd.get(0).getSr_plan_no());
+			// ----------------------------2018-06-19-------------------------------
+			// ---------------2018-10-16 挂单的时候一起修改
+//			this.getBean(MesApiDesignInfoImpl.class).updatePlnStatic(lpmd.get(0).getProd_order_no(), lpmd.get(0).getOrder_no(), lpmd.get(0).getNext_dsn_process_code(), lpmd.get(0).getSingle_weight(), false);
+		}
+		
+		/**
+		 * 函数_通过加工计划产生设计
+		 * @param pro_order_no 生产订单号
+		 * @throws Exception 
+		 * */
+		public PlnSkinrollingDsnMain ProcessingPlanDsn(String pro_order_no) throws Exception{
+			PlnSkinrollingDsnMain sr_design_no=null;
+			String userName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+			PlnProdorder pp=new PlnProdorder();
+			pp.setProd_order_no(pro_order_no);
+			List<PlnProdorder> lpp=this.getMapper(PlnProdorderMapper.class).find(pp, 0, 1);
+			//根据加工计划号  读取生产订单对应的生产加工表[PLN_PROCESS_PLAN]
+			PlnProcessPlan ppp=new PlnProcessPlan();
+			ppp.setProduce_no(lpp.get(0).getProduce_no());
+			ppp.setValid_flag("1");
+			List<PlnProcessPlan> lppp=this.getMapper(PlnProcessPlanMapper.class).findWithCondition(ppp, null, " cut_order_no ", 0, 0);
+			if(lppp==null||lppp.size()==0){
+				throw new Exception("未找到生产订单["+ppp.getOrder_no()+"]对应的生产加工信息");
+			}
+			
+			//保存设计主表数据:  平整设计号:DSR+YYMMDD+6流水号
+			String sDate=new SimpleDateFormat("yyMMdd").format(new Date());
+			PlnSkinrollingDsnMain pldm=new PlnSkinrollingDsnMain();
+			List<PlnSkinrollingDsnMain> lpdmNo=this.getMapper(PlnSkinrollingDsnMainMapper.class).findWithCondition(null, "", " serial_no desc ", 0, 1);
+			pldm.setSr_design_no("DSR"+sDate+String.format("%06d", 1));
+			if(lpdmNo!=null&&lpdmNo.size()>0){
+				pldm.setSerial_no(lpdmNo.get(0).getSerial_no()+1);
+				if(sDate.equals(lpdmNo.get(0).getSr_design_no().substring(3,9))){
+					pldm.setSr_design_no("DSR"+sDate+String.format("%06d", Integer.parseInt(lpdmNo.get(0).getSr_design_no().substring(9,15))+1 ));
+				}
+			}
+			
+			// 订单信息
+			pldm.setProd_order_no(lpp.get(0).getProd_order_no());
+			pldm.setOrder_no(lpp.get(0).getOrder_no());
+			pldm.setPline_code(lpp.get(0).getPline_code());
+			pldm.setSteel_code(lpp.get(0).getSteel_code());
+			
+			String isMulti="0";//是否拼料 根据订单数判断,多个订单填1,否则填0
+			pldm.setIs_multi(isMulti);
+			
+			// 只有一条加工计划记录情况下
+			if(lppp.size()==1){
+				pldm.setThick(lppp.get(0).getThick());
+				pldm.setWidth(lppp.get(0).getWidth());
+				pldm.setLength(lppp.get(0).getLength());
+				pldm.setDiameter_inn(lppp.get(0).getDiameter_inn());
+				pldm.setDiameter_out(lppp.get(0).getDiameter_out());
+				pldm.setSingle_weight(lppp.get(0).getEstimate_weight());
+			}
+			
+			// 加工计划分切方式
+//			pldm.setCut_style(lppp.get(0).getCut_style());
+//			
+//			pldm.setCrosscut_style(lppp.get(0).getCrosscut_style());
+//			pldm.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//			pldm.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+			pldm.setDeliver_date(lpp.get(0).getDeliver_date());
+			
+			pldm.setDesign_quantity(1);
+//			pldm.setDesign_weight(ypd.getFactweight());
+			
+			pldm.setDeliver_date_earliest(lpp.get(0).getDeliver_date());
+			pldm.setDeliver_date_latest(lpp.get(0).getDeliver_date());
+			pldm.setCreate_man_name(userName);
+			pldm.setCreate_time(new Date());
+			pldm.setIs_finished(0L);
+			pldm.setReserve_1(lppp.get(0).getProduce_no());
+			this.getMapper(PlnSkinrollingDsnMainMapper.class).insert(pldm);
+			sr_design_no=pldm;
+			
+			//倒叙取一条拼料信息
+			List<PlnSkinrollingDsnMultinfo> lpdmM=this.getMapper(PlnSkinrollingDsnMultinfoMapper.class).findWithCondition(null, "", " serial_no desc ", 0,1);
+			long DsnNo=1;
+			if(lpdmM!=null&&lpdmM.size()>0){
+				DsnNo=lpdmM.get(0).getSerial_no()+1;
+			}
+			
+						//-----------------写拼料-----------------------------
+						PlnSkinrollingDsnMultinfo pldmc=new PlnSkinrollingDsnMultinfo();
+						pldmc.setSerial_no(DsnNo++);
+						pldmc.setSr_design_no(pldm.getSr_design_no());
+//						pldmc.setAn_seq(1);
+//						pldmc.setSeg_seq(1);
+						pldmc.setOrder_no(lpp.get(0).getOrder_no());
+						pldmc.setProd_order_no(lpp.get(0).getProd_order_no());
+						pldmc.setThick(lpp.get(0).getThick());
+						pldmc.setWidth(lpp.get(0).getWidth());
+						pldmc.setLength(lpp.get(0).getLength());
+						pldmc.setDiameter_inn(lpp.get(0).getDiameter_inn());
+						pldmc.setDiameter_out(lpp.get(0).getDiameter_out());
+						pldmc.setWeight(pldm.getSingle_weight());
+//						pldmc.setFixed_length_type_no(lpp.get(0).getFixed_length_type_no());
+//						pldmc.setCut_edge_type_no(lpp.get(0).getCut_edge_type_no());
+						pldmc.setSub_seq(1);
+						this.getMapper(PlnSkinrollingDsnMultinfoMapper.class).insert(pldmc);
+			
+			return sr_design_no;
+		}
+		
+		
+		/**
+		 * 公共函数1 修改平整计划主表状态
+		 * @param 平整计划号
+		 * @throws Exception
+		 */
+		@Transactional(value="tm", rollbackFor=Exception.class)
+		public void doUpdatePlnSkinrollingPlan(String anPlanNo) throws Exception {
+			PlnSkinrollingPlan plp = new PlnSkinrollingPlan();
+			plp.setSr_plan_no(anPlanNo);
+			String MIN_STATUS = "";
+			boolean flag = false;
+			PlnSkinrollingPlanDetail plpd = new PlnSkinrollingPlanDetail();
+			plpd.setSr_plan_no(anPlanNo);
+			List<PlnSkinrollingPlanDetail> lplpd = this.getMapper(PlnSkinrollingPlanDetailMapper.class)
+					.findWithCondition(plpd, "status <> '0PSRXX'", "status asc", 0, 0);
+			if (lplpd == null || lplpd.size() == 0) {
+				throw new Exception("未找到平整计划明细数据!");
+			}
+			MIN_STATUS = lplpd.get(0).getStatus();
+
+			// 计划状态						// 实物状态		
+			// 0PSR01平整计划已编制			// 5BSR01平整计划已编制		
+			// 0PSR02平整计划已下发			// 5BSR02平整计划已下发		
+			// 0PSR03开始平整作业				// 5BSR03开始平整作业		
+			// 0PAN79平整剪废				// 5BAN05正在平整作业		
+			// 0PSR10平整作业完成				// 5BAN79平整剪废		
+			// 0PSRXX平整计划已失效			// 5BSR10平整作业完成		
+											// 5BAN83等待平整判定		
+											// 5BAN90平整判定完成		
+			
+			// 如果明细记录中有卷开始作业,主表状态改为开始作业
+			for (PlnSkinrollingPlanDetail plnL : lplpd) {
+				if ("5BSR03".equals(plnL.getStatus())) {
+					flag = true;
+					break;
+				}
+			}
+			if (flag) {
+				plp.setStatus("0PSR03");
+			} else if ("5BSR01".equals(MIN_STATUS)) {
+				plp.setStatus("0PSR01");
+			} else if (MIN_STATUS.compareTo("5BSR02") <= 0) {
+				plp.setStatus("0PSR02");
+			} else if (MIN_STATUS.compareTo("5BSR03") <= 0) {
+				plp.setStatus("0PSR03");
+			} else if (MIN_STATUS.compareTo("5BSR10") <= 0) {
+				plp.setStatus("0PSR10");
+			}
+			this.getMapper(PlnSkinrollingPlanMapper.class).doUpdate(plp);
+		}
+
+	}
+

+ 5034 - 0
src/main/java/market/Api/Mes/impl/MesApiTpmPdiPdoImpl.java

@@ -0,0 +1,5034 @@
+/***文档注释***********************************************
+ * 作者               :                   宋燕辉
+ * 创建日期      :                   2018.11.01
+ * 描述               :                  平整机  pdipdo
+ * 注意事项      :                   无
+ * 遗留BUG :                   无
+ * 修改日期      :                   
+ * 修改人员      :                   
+ * 修改内容      :                   
+ ***********************************************************/
+package market.Api.Mes.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import market.Api.Lms.impl.LmsApiServiceImpl;
+import market.Api.Mes.service.MesApiTpmPdiPdoService;
+import market.Com.mapper.ComBaseInfoMapper;
+import market.Com.mapper.ComBaseMachineMapper;
+import market.Com.mapper.ComBaseSteelMapper;
+import market.Com.pb.PropertiesUtils;
+import market.Com.vo.ComBaseMachine;
+import market.Com.vo.ComBaseSteel;
+import market.Com.vo.CommonPage;
+import market.Com.vo.ResultModel;
+import market.Lms.Warehouse.mapper.YdmProductDetailMapper;
+import market.Lms.Warehouse.mapper.YdmProductOutlistMapper;
+import market.Lms.Warehouse.vo.YdmProductDetail;
+import market.Lms.Warehouse.vo.YdmProductOutlist;
+import market.Mes.Dev.impl.DevRollerPairMServiceImpl;
+import market.Mes.Dev.mapper.DevRollerInfoMapper;
+import market.Mes.Dev.mapper.DevRollerPairDMapper;
+import market.Mes.Dev.mapper.DevRollerPairMMapper;
+import market.Mes.Dev.vo.DevRollerInfo;
+import market.Mes.Dev.vo.DevRollerPairD;
+import market.Mes.Dev.vo.DevRollerPairM;
+import market.Mes.Lengthwise.Plan.mapper.PlnMaterielDetailMapper;
+import market.Mes.Lengthwise.Plan.vo.PlnMaterielDetail;
+import market.Mes.Shift.mapper.MesShiftMMapper;
+import market.Mes.Shift.vo.MesShiftM;
+import market.Mes.Tpm.impl.MesTpmDServiceImpl;
+import market.Mes.Tpm.mapper.IfTpm01L2AnswerRevokeMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2AskOrdMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2AskPdiMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2EnergyMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2PdoMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2PrdEndMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2PrdStrMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2RejectMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2RevokeMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2RllLoadDMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2RllLoadMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2RllRmvDMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2RllRmvMapper;
+import market.Mes.Tpm.mapper.IfTpm01L2StopMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3AnswerPdoMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3AnswerRejectMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3AnswerRevokeMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3NoneOrdMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3NonePdiMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3OrdCoilMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3OrdMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3PdiMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3RevokeMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3RollerDMapper;
+import market.Mes.Tpm.mapper.IfTpm01L3RollerMapper;
+import market.Mes.Tpm.mapper.IfTpm01LogMapper;
+import market.Mes.Tpm.mapper.MesTpmDMapper;
+import market.Mes.Tpm.mapper.MesTpmEnergyMapper;
+import market.Mes.Tpm.mapper.MesTpmMMapper;
+import market.Mes.Tpm.mapper.MesTpmStopMapper;
+import market.Mes.Tpm.mapper.MesTpmTrcMapper;
+import market.Mes.Tpm.mapper.PlnSkinrollingPlanDetailMapper;
+import market.Mes.Tpm.mapper.PlnSkinrollingPlanMapper;
+import market.Mes.Tpm.vo.IfTpm01L2AnswerRevoke;
+import market.Mes.Tpm.vo.IfTpm01L2AskOrd;
+import market.Mes.Tpm.vo.IfTpm01L2AskPdi;
+import market.Mes.Tpm.vo.IfTpm01L2Energy;
+import market.Mes.Tpm.vo.IfTpm01L2Pdo;
+import market.Mes.Tpm.vo.IfTpm01L2PdoDfc;
+import market.Mes.Tpm.vo.IfTpm01L2PrdEnd;
+import market.Mes.Tpm.vo.IfTpm01L2PrdStr;
+import market.Mes.Tpm.vo.IfTpm01L2Reject;
+import market.Mes.Tpm.vo.IfTpm01L2Revoke;
+import market.Mes.Tpm.vo.IfTpm01L2RllLoad;
+import market.Mes.Tpm.vo.IfTpm01L2RllLoadD;
+import market.Mes.Tpm.vo.IfTpm01L2RllRmv;
+import market.Mes.Tpm.vo.IfTpm01L2RllRmvD;
+import market.Mes.Tpm.vo.IfTpm01L2Stop;
+import market.Mes.Tpm.vo.IfTpm01L3AnswerPdo;
+import market.Mes.Tpm.vo.IfTpm01L3AnswerReject;
+import market.Mes.Tpm.vo.IfTpm01L3AnswerRevoke;
+import market.Mes.Tpm.vo.IfTpm01L3NoneOrd;
+import market.Mes.Tpm.vo.IfTpm01L3NonePdi;
+import market.Mes.Tpm.vo.IfTpm01L3Ord;
+import market.Mes.Tpm.vo.IfTpm01L3OrdCoil;
+import market.Mes.Tpm.vo.IfTpm01L3Pdi;
+import market.Mes.Tpm.vo.IfTpm01L3Revoke;
+import market.Mes.Tpm.vo.IfTpm01L3Roller;
+import market.Mes.Tpm.vo.IfTpm01L3RollerD;
+import market.Mes.Tpm.vo.IfTpmOrderView;
+import market.Mes.Tpm.vo.IfTpmRollerView;
+import market.Mes.Tpm.vo.MesTpmD;
+import market.Mes.Tpm.vo.MesTpmEnergy;
+import market.Mes.Tpm.vo.MesTpmM;
+import market.Mes.Tpm.vo.MesTpmStop;
+import market.Mes.Tpm.vo.MesTpmTrc;
+import market.Mes.Tpm.vo.PlnSkinrollingPlan;
+import market.Mes.Tpm.vo.PlnSkinrollingPlanDetail;
+import market.Mes.Tpm.vo.Tpm0lL3NoView;
+import market.Mes.anneal.mapper.MesCrAnnealMMapper;
+import market.Mes.anneal.vo.MesCrAnnealM;
+import market.Mes.anneal.vo.MesJihuaZhi;
+import market.Mes.util.DateUtil;
+import market.Qms.slmord.vo.SlmOrdDesignMscTicItem;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
+import org.apache.log4j.Logger;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.hnshituo.basic.service.impl.BaseServiceImpl;
+import com.hnshituo.basic.spring.remoting.annotation.RemoteService;
+import com.hnshituo.core.auth.service.HomeService;
+
+@RemoteService(path = "MesApiTpmPdiPdoService")
+public class MesApiTpmPdiPdoImpl extends BaseServiceImpl implements MesApiTpmPdiPdoService {
+
+	
+	public static String TPMPDI_ORDER = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_ORDER");
+	public static String TPMPDI_PDI = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_PDI");
+	public static String TPMPDI_ORDERDELE = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_ORDERDELE");
+	public static String TPMPDI_NOORDER = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_NOORDER");
+	public static String TPMPDI_NOPDI = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_NOPDI");
+	public static String TPMPDI_L2ORDERDELE = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_L2ORDERDELE");
+	public static String TPMPDI_HUITUI = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_HUITUI");
+	public static String TPMPDI_MES = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_MES");
+	public static String TPMPDI_ROLLING = PropertiesUtils.getPdioProperties().getProperty("TPMPDI_ROLLING");
+	
+	
+	
+	//获取日志记录器Logger,名字为本类类名
+    private static Logger log = Logger.getLogger(MesApiTpmPdiPdoImpl.class);
+    
+    /**
+	 * 平整机作业指示
+	 * @param oci
+	 * object:
+	 * material_no:投料卷号
+	 * materailcoilno:原始卷号
+	 * steel_name:牌号
+	 * order_no:订单号
+	 * reciver_unit_name:客户名称
+	 * memo1:传机台代码
+	 * startTime:开始时间
+	 * endTime:结束时间
+	 * @return
+	 */
+	public ResultModel doQueryTpmWeb(CommonPage<MesJihuaZhi> oci){
+		ResultModel rm=new ResultModel();
+		if(oci.getMemo1()==null || "".equals(oci.getMemo1())){
+			rm.setState("500");
+			rm.setMsgInfo("请输入机台代码");
+			return rm;
+		}
+		try{
+			List<HashMap> lpav=this.getMapper(IfTpm01L3PdiMapper.class).doQueryWeb(oci.getObject(),oci.getMemo1(),oci.getMemo2(),oci.getStartTime(),oci.getEndTime(),oci.getMemo3());
+			rm.setData(lpav);
+			rm.setState("200");
+		}catch(Exception ex){
+			ex.printStackTrace();
+			rm.setState("500");
+			rm.setMsgInfo("查询失败!"+ex.getMessage());
+		}
+		return rm;
+	}
+
+	
+    
+	/**
+	 *  1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2指示顺序请求电文时调用;																																							
+		2)、	此接口参数为“L2指示顺序请求电文JSON对象”(电文编号:DR3E01);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L3AswOrder(IfTpm01L2AskOrd json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//  --(1)、函数参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_ask_ord 代替描述
+		IfTpm01L2AskOrd v_rec_l2_ask_ord=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_指示顺序请求为空";
+			//v_message="500";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_ask_ord.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_ask_ord.setMsg_time(new Date());
+		}
+		//  --(1、2)、将对象,插入L2指示顺序请求表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2AskOrdMapper.class).insert(v_rec_l2_ask_ord);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用应答L2指示顺序请求函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3AswOrder_d(v_mch_code,v_rec_l2_ask_ord.getCoil_no(),
+					v_rec_l2_ask_ord.getNum_coil(),
+					v_message);
+			//this.getSqlSession("sqlSessionFactory").getConnection().
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_ask_ord.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param="L2请求时间 MSG_TIME {"+mes_time+"} L2上次请求的最后一卷的卷号 COIL_NO {"+v_rec_l2_ask_ord.getCoil_no()+"}"
+					+ "请求卷数 NUM_COIL {"+v_rec_l2_ask_ord.getNum_coil()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L3AswOrder",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由接口 Tpm01L3AswOrder 调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(L2上次请求的最后一卷的卷号)、V_NUM_COIL(请求卷数)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param coil_no
+	 * @param num_coil
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3AswOrder_d(String v_mch_code, String v_entry_coil_no,
+			Long v_num_coil, String v_message) throws Exception{
+		
+		Integer v_cnt=null;
+		Long v_count_pln=null;
+		Long v_count_act=null;
+		Long v_plan_seq=null;
+		Long v_sr_seq=null;
+		Integer v_success=null;
+		List<HashMap> v_coil_no=new ArrayList<>();
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//  --(1.3)、参数:请求卷数																																							
+			//  --(1.3.1)、如果为空,或者 ≤ 0,则默认20																																							
+			//  --(1.3.2)、如果 > 200,则默认200																																							
+			//  --(1.3.3)、否则直接使用																																							
+			if(v_num_coil==null || v_num_coil<=0){
+				v_count_pln=20l;
+			}else if(v_num_coil>200){
+				v_count_pln=200l;
+			}else{
+				v_count_pln=v_num_coil;
+			}
+			v_plan_seq=-1l;
+			v_sr_seq=-1l;
+			//  --(1.4)、参数:L2上次请求的最后一卷的卷号																																							
+			//  --(1.4.1)、先获取此卷的 计划顺序号、计划内序号																																							
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount1(v_mch_code,v_entry_coil_no);
+			if(v_cnt==1){
+				//    --(1.4.2)、找到唯一的记录,则获取此卷的 计划顺序号、计划内序号
+				PlnSkinrollingPlan psp=this.getMapper(PlnSkinrollingPlanMapper.class).doQuery1(v_mch_code,v_entry_coil_no);
+				v_plan_seq=psp.getPlan_seq();
+				v_sr_seq=psp.getSr_seq();
+			}
+			//  --(1.4.3)、未指定卷号,或指定卷号信息不存在,则找到已给L2指示顺序的最大 计划顺序号、计划内序号																																							
+			if(v_plan_seq==-1 && v_sr_seq==-1){
+				v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount2(v_mch_code,"");
+				if(v_cnt>0){
+					//  --(1.4.4)、先找到已给L2指示顺序的最大 计划顺序号																																							
+					v_plan_seq=this.getMapper(PlnSkinrollingPlanMapper.class).doCount3(v_mch_code,"");
+					//  --(1.4.5)、再找此 计划顺序号下的最大 计划内序号																																							
+					v_sr_seq=this.getMapper(PlnSkinrollingPlanMapper.class).doCount4(v_mch_code,v_plan_seq);
+				}
+			}
+			v_count_act=0l;// --实际卷数计数清零
+			//  --(1.4.6)、循环 ≥ v_plan_seq 的计划主表,按 plan_seq 排序																																							
+			List<PlnSkinrollingPlan> cur_01_list=this.getMapper(PlnSkinrollingPlanMapper.class).doQuery2(v_mch_code, v_plan_seq);
+			for(PlnSkinrollingPlan cur_01:cur_01_list){
+				if(v_count_act>=v_count_pln){
+					//continue;//--实际卷数,超出计划卷数,跳出循环
+					break;//--实际卷数,超出计划卷数,跳出循环
+				}
+				//    --(1.4.7)、循环对应计划明细表,按 sr_seq 排序
+				List<PlnSkinrollingPlanDetail> cur_02_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).findWithCondition(null, "sr_plan_no='"+cur_01.getSr_plan_no()+"'", "sr_seq", 0, 0);
+				for(PlnSkinrollingPlanDetail cur_02:cur_02_list){
+					//      --(1.4.8)、从指定的钢卷往后开始找
+					if((cur_01.getPlan_seq()==v_plan_seq && cur_02.getSr_seq()>v_sr_seq) ||
+							cur_01.getPlan_seq()>v_plan_seq){
+						if(v_count_act>=v_count_pln){
+							//continue;//--实际卷数,超出计划卷数,跳出循环
+							break;//--实际卷数,超出计划卷数,跳出循环
+						}
+						
+						//  --(2.4)、验证当前还未生产交工
+						MesTpmM mCross = new MesTpmM();
+						mCross.setSchedule_no(cur_02.getSr_plan_no());
+						mCross.setMaterial_no(cur_02.getObject_no());
+						v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+						if(v_cnt>0){
+							List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+						    MesTpmM v_rec_tpm_m =lmcam.get(0);
+						    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+//						    	v_message="机台代码{"+v_mch_code+"} 入口卷号{"+cur_02.getObject_no()+"} 已生产交工";
+//						    	return v_message;
+						    	continue;
+						    }
+						}
+						
+						//--缓存钢卷号到集合队列中最后位置
+						HashMap<String,String> hash=new HashMap();
+						hash.put("entry_coil_no", cur_02.getObject_no());
+						v_coil_no.add(hash);
+						
+ 						//--计数器加1
+						v_count_act=v_count_act+1;
+					}
+				}
+			
+			}
+			//  --(2)、根据获取的可发送指示顺序的钢卷数,确定调用接口																																							
+			//  --(2.1)、有可用的指示顺序																																							
+			if(v_count_act>0){
+				//--(2.1.1)、调用指示顺序接口
+				try{
+					v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3Order(v_coil_no,v_success,v_message);
+				}catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+				}
+				if(v_message==null){
+					v_message="";
+				}
+				String v_success_str="";
+				if(v_message.contains("_success:")){
+					v_success_str=v_message.substring(v_message.length()-1);
+					v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+				}
+				if("1".equals(v_success_str)){
+					v_message="L2指示顺序请求应答成功!"+v_message;
+				}else if("2".equals(v_success_str)){
+					v_message="L2指示顺序请求应答部分成功!"+v_message;
+				}else{
+					v_message="L2指示顺序请求应答失败!"+v_message;
+				}
+			}else{
+			   //  --(2.2)、无可用的指示顺序																																							
+			   // --(2.2.1)、获取已下发指示顺序的钢卷数	
+			   //select count(1) from pln_skinrolling_plan t1, pln_skinrolling_plan_detail t2 where t1.machine_code = 'M0007' and t1.sr_plan_no = t2.sr_plan_no and t2.send_flag is not null and t2.send_flag in ('1', '3') 	
+			   v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount5(v_mch_code,"");
+			   if(v_cnt>9999){
+				   v_cnt=9999;//--电文字段长度所限
+			   }
+			   // --(2.2.2)、调用无指示顺序接口   --注意返回值
+			   try{
+					v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3NoOrder(v_entry_coil_no,v_cnt,v_success,v_message);
+				}catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+			   }
+			   if(v_message==null){
+					v_message="";
+			   }
+			   String v_success_str="";
+				if(v_message.contains("_success:")){
+					v_success_str=v_message.substring(v_message.length()-1);
+					v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+				}
+				if("1".equals(v_success_str)){
+					v_message="L2无指示顺序请求应答成功!"+v_message;
+				}else if("2".equals(v_success_str)){
+					v_message="L2无指示顺序请求应答部分成功!"+v_message;
+				}else{
+					v_message="L2无指示顺序请求应答失败!"+v_message;
+				}
+			}
+			
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L3AswOrder_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L3AswOrder_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	
+
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L3AswOrder_d 方法调用;																																							
+		2)、	接口参数 IN:V_COIL_NO(卷号集合)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_coil_no
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value = "tm", rollbackFor = Exception.class)
+	public String Tpm01L3Order(List<HashMap>  v_coil_no, Integer v_success,
+			String v_message) throws Exception{
+		v_success=0;
+		Integer v_num_coil;
+		Integer v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0
+		try{
+			//  --(2)、验证传入参数:																																							
+			//  --(2.1)、未指定卷号集合																																							
+			if(v_coil_no ==null || v_coil_no.size()<=0){
+				v_message = "Tpm01L3Order 未指定钢卷号!"+"_success:"+v_success;
+				return v_message;
+			}
+			v_num_coil=v_coil_no.size();
+			Integer youxiao_numcoil=v_coil_no.size();
+			Integer ii=0;
+			Integer jj=200-v_num_coil.intValue();
+			for(ii=0;ii<jj;ii++){
+				HashMap<String,String> hash=new HashMap();
+				hash.put("entry_coil_no", new String());
+				v_coil_no.add(hash);
+			}
+			
+			//  --(3)、调用公司接口,将“指示顺序”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)
+			IfTpmOrderView tlnov=new IfTpmOrderView();
+			tlnov.setNum_coil(v_num_coil.longValue());
+			tlnov.setCoils(v_coil_no);
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(tlnov,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_ORDER);
+				String url = TPMPDI_ORDER;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="指示顺序电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发指示顺序电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发指示顺序电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发指示顺序电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			//  --(2.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Tpm01L3Order 指示顺序电文发送失败!"+v_message+"_success:"+v_success;
+				return v_message;
+			}
+			
+			//  --(4)、插入接口记录表相关信息																																							
+			//  --(4.1)、创建记录号																																							
+			Long v_serial_no=this.getMapper(IfTpm01L3OrdMapper.class).doCount1();
+			v_num_coil=v_coil_no.size();
+			//  --(4.2)、开始事物:																																							
+			for(int i=0;i<youxiao_numcoil;i++){
+				if(v_coil_no!=null && v_coil_no.get(i)!=null && 
+						v_coil_no.get(i).get("entry_coil_no")!=null && !"".equals(v_coil_no.get(i).get("entry_coil_no"))){
+				//  --(4.3)、插入 IF_TPM01_L3_ORD_COIL 指示顺序钢卷记录			
+					IfTpm01L3OrdCoil itloc=new IfTpm01L3OrdCoil();
+					itloc.setSerial_no(v_serial_no);
+					itloc.setSeq_no(Long.parseLong(i+""));
+					itloc.setEntry_coil_no(v_coil_no.get(i).get("entry_coil_no")+"");
+					this.getMapper(IfTpm01L3OrdCoilMapper.class).insert(itloc);
+					//   --(4.4)、更新 PLN_SKINROLLING_PLAN_DETAIL 指示顺序下发状态
+					this.getMapper(PlnSkinrollingPlanDetailMapper.class).doUpdate1(v_coil_no.get(i).get("entry_coil_no")+"","");
+				}
+				
+			}
+			//  --(4.5)、插入 IF_TPM01_L3_ORD 指示顺序主记录
+			IfTpm01L3Ord itlo=new IfTpm01L3Ord();
+			itlo.setSerial_no(v_serial_no);
+			itlo.setSend_time(new Date());
+			itlo.setSend_opr("L2Ask");
+			itlo.setNum_coil(Long.parseLong(v_num_coil+""));
+			this.getMapper(IfTpm01L3OrdMapper.class).insert(itlo);
+			//  --(5)、提交事务
+			//  --唯一标示操作成功的地方																																							
+			v_success = 1;																																							
+			v_message = "Tpm01L3Order 指示顺序电文发送成功!记录号{"+v_serial_no+"} 钢卷数{"+v_num_coil+"}"+"_success:"+v_success;
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3Order 指示顺序电文发送成功!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Tpm01L3Order 指示顺序电文发送成功!"+e.getMessage()+"_success:"+v_success;
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3Order 指示顺序电文发送失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Tpm01L3Order 指示顺序电文发送失败!"+e.getMessage()+"_success:"+v_success;
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+	    1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L3AswOrder_d 方法调用;																																							
+		2)、	接口参数 IN:V_ENTRY_COIL_NO(已传送给L2的最后一个钢卷号)、V_NUM_COIL(已下发钢卷数)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_entry_coil_no
+	 * @param v_cnt
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value = "tm", rollbackFor = Exception.class)
+	public String Tpm01L3NoOrder(String v_entry_coil_no, Integer v_num_coil,
+			Integer v_success, String v_message) throws Exception{
+		//  --(1)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		Integer v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0
+		String v_coil_no;
+		Integer v_count;//--已下发钢卷数
+		try{
+			//  --(2)、参数处理
+			if(v_entry_coil_no ==null || "".equals(v_entry_coil_no)){
+				v_coil_no = "00000000000000000000"; //--PS:20个0
+			}else{
+				v_coil_no=v_entry_coil_no;
+			}
+			if(v_num_coil==null || v_num_coil<0){
+				v_count=0;
+			}else if(v_num_coil>9999){
+			    v_count = 9999;
+			}else{
+				 v_count = v_num_coil;
+			}
+			Tpm0lL3NoView tlnov=new Tpm0lL3NoView();
+			tlnov.setEntry_coil_no(v_coil_no);
+			tlnov.setNum_coils(v_count);
+			//  --(3)、调用公司接口,将“无指示顺序”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)																																							
+			//  --(3.1)、电文参数,使用处理后的变量 v_coil_no,v_count																																							
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(tlnov,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_NOORDER);
+				String url = TPMPDI_NOORDER;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="无指示顺序电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发无指示顺序电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发无指示顺序电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发无指示顺序电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			//  --(3.2)、电文发送失败(失败状态,根据接口提供定义确定)																																							
+			if(v_flag == 0){																																							
+			    v_message = "Tpm01L3NoOrder 无指示顺序电文发送失败!"+v_message+"_success:"+v_success;																																			
+			    return v_message;																																							
+			}																																						
+			//  --(4)、插入接口记录表相关信息		
+			IfTpm01L3NoneOrd itlno=new IfTpm01L3NoneOrd();
+			itlno.setSend_time(new Date());
+			itlno.setSend_opr("L2Ask");
+			itlno.setEntry_coil_no(v_coil_no);
+			itlno.setNum_coils(Long.parseLong(v_count+""));
+			this.getMapper(IfTpm01L3NoneOrdMapper.class).insert(itlno);
+			//  --(5)、提交事务
+			//  --唯一标示操作成功的地方																																							
+			v_success = 1;																																							
+			v_message = "Tpm01L3NoOrder 无指示顺序电文发送成功!ENTRY_COIL_NO {"+v_coil_no+"} NUM_COILS {"+v_count+"}"+"_success:"+v_success;		
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3NoOrder 无指示顺序电文发送成功!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Tpm01L3NoOrder 无指示顺序电文发送成功!"+e.getMessage()+"_success:"+v_success;
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3NoOrder 无指示顺序电文发送失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Tpm01L3NoOrder 无指示顺序电文发送失败!"+e.getMessage()+"_success:"+v_success;
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2 PDI数据请求电文时调用;																																							
+		2)、	此接口参数为“L2 PDI数据请求电文JSON对象”(电文编号:DR3E02);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L3AswPdi(IfTpm01L2AskPdi json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//  --(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_ask_pdi 代替描述
+		IfTpm01L2AskPdi v_rec_l2_ask_pdi=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_PDI数据请求为空";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_ask_pdi.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_ask_pdi.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入L2 PDI数据请求表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2AskPdiMapper.class).insert(v_rec_l2_ask_pdi);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用应答L2 PDI数据请求函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3AswPdi_d(v_mch_code,v_rec_l2_ask_pdi.getEntry_coil_no(),
+					v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_ask_pdi.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param="L2请求时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO {"+v_rec_l2_ask_pdi.getEntry_coil_no()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L3AswPdi",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	
+	/**
+	 *	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L3AswPdi 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param entry_coil_no
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3AswPdi_d(String v_mch_code, String v_entry_coil_no,
+			String v_message) throws Exception{
+		
+		Integer v_cnt=null;
+		String v_msg="";
+		String v_entry_location=null;
+		String v_steel=null , reduce_code = null , spm_elong_code = null ;
+		Integer v_success=null;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		YdmProductDetail v_rec_ydm_d=new YdmProductDetail();
+		IfTpm01L3Pdi  v_rec_pdi=new IfTpm01L3Pdi();
+		try{
+			//  --(1.1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			Integer v_flag=1;//--变量默认为1,认为有PDI数据
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_msg="入口卷号{"+v_entry_coil_no+"} 未指定入口卷号!";
+				v_flag=0;//--无PDI数据
+			}
+			//  --(2)、验证入口卷对应的作业计划信息存在
+			if(v_flag==1){
+				v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount1(v_mch_code,v_entry_coil_no);
+				if(v_cnt<=0){
+					v_msg="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+					v_flag=0;//--无PDI数据    
+				}else if(v_cnt>1){
+					v_msg="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+					v_flag=0;//--无PDI数据    
+				}else{
+					List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+					v_rec_pln_d=v_rec_pln_d_list.get(0);
+				}
+			}
+			// --(3)、验证入口卷对应的库存明细存在
+			List<YdmProductDetail> v_rec_ydm_d_list=new ArrayList<>();
+			if(v_flag==1){
+				v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_entry_coil_no+"'", null, 0, 0);
+				if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+					v_msg="入口卷号{"+v_entry_coil_no+"}库存明细记录不存在!";
+					v_flag=0;//--无PDI数据    
+				}
+				//2019-03-07
+				v_rec_ydm_d=v_rec_ydm_d_list.get(0);
+			}
+			
+			//  --(2.4)、验证当前还未生产交工
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_rec_pln_d.getSr_plan_no());
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    MesTpmM v_rec_tpm_m =lmcam.get(0);
+			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+			    	v_msg="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工,不能重复下发PDI!";
+			    	//return v_message;
+			    	v_flag=0;//--无PDI数据    
+			    }
+			}
+			
+			
+			//  --(4)、验证入口卷对应的虚拟物料信息存在	
+			if(v_flag==1){
+				List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+						"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"' and object_no='"+v_rec_pln_d.getObject_no()+"'", null, 0, 0);
+				if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+					v_msg="入口卷号{"+v_entry_coil_no+"} 虚拟物料信息不存在!";
+					v_flag=0;//--无PDI数据    
+				}
+			}	
+			//  --(5)、获取其它相关信息,注意忽略错误
+			if(v_flag==1){
+				//    --(5.1)、获取牌号/钢种名称
+				List<ComBaseSteel> lcbs = this.getMapper(ComBaseSteelMapper.class).findWithCondition(null, "steel_code='"+v_rec_ydm_d.getSteelcode()+"'", null, 0, 0);
+				if(lcbs==null || lcbs.size()<=0){
+					v_steel=v_rec_ydm_d.getSteelcode();
+				}else{
+					if(lcbs.get(0).getSteel_name()==null){
+						v_steel=lcbs.get(0).getSteel_code();
+					}else{
+						v_steel=lcbs.get(0).getSteel_name();
+					}
+				}
+				//    --(5.2)、获取入口卷库位
+				v_entry_location=this.getMapper(MesCrAnnealMMapper.class).doQueryLocation(v_entry_coil_no);
+				if(v_entry_location==null){
+					v_entry_location="";
+				}
+			}
+			//  --(6)、根据 v_flag 标志,确定调用接口																																							
+			//  --(6.1)、v_flag = 1,有可用的PDI数据																																							
+			if(v_flag==1){
+				//    --(6.1.0)、PDI数据属性赋值(注意:记录号、下发时间、下发人,到调用接函数内才赋值)
+			    v_rec_pdi.setEntry_coil_no        ( v_entry_coil_no);// --入口卷号																																							
+			    v_rec_pdi.setExit_coil_no         ( v_rec_ydm_d.getMaterailcoilno());// --出口卷号 2019-09-26 panbin 调整为原料卷号(以便二级系统显示)																																							
+			    v_rec_pdi.setEntry_coil_source    ( 1l);// --入口卷来源(0:自产、1:外购)																																							
+			    v_rec_pdi.setPlan_no              ( v_rec_pln_d.getSr_plan_no());// --计划号	
+			    if(v_rec_ydm_d.getThick()!=null){
+			    	Double thick_um=v_rec_ydm_d.getThick()*1000;
+			    	v_rec_pdi.setEntry_thichness(thick_um.longValue());// --入口热卷厚度(um)	//	1mm(毫米)=1000um(微米) 
+			    }
+			    if(v_rec_ydm_d.getWidth()!=null){
+			    	Double width_um=v_rec_ydm_d.getWidth();
+			    	v_rec_pdi.setEntry_width(width_um.longValue());// --入口热卷宽度(mm)	//1mm(毫米)=1000um(微米)
+			    }
+			    if(v_rec_ydm_d.getFactweight()!=null){
+			    	v_rec_pdi.setEntry_weight(v_rec_ydm_d.getFactweight().longValue());// --入口热卷重量(kg)  ??
+			    }
+			    if(v_rec_ydm_d.getDiameter_inn()!=null){
+			    	v_rec_pdi.setInner_diameter(v_rec_ydm_d.getDiameter_inn().longValue());// --入口热卷内径(mm)
+			    }
+			    if(v_rec_ydm_d.getDiameter_out()!=null){
+			    	v_rec_pdi.setOuter_diameter(v_rec_ydm_d.getDiameter_out().longValue());// --入口热卷外径(mm)		
+			    }
+			    
+			    v_rec_pdi.setHarderness_annealing ( null);// --退火后硬度																																							
+			    v_rec_pdi.setTemp_annealing       ( null);// --退火温度(℃)																																							
+			    v_rec_pdi.setSpm_mode             ( 0l);// --平整模式(0:平整、1:轧制),需要生产或质量提供接口																																							
+			    v_rec_pdi.setSpm_elong            ( null);// --平整伸长率(0.01%,e.g. 255 => 2.55 %  ,平整模式),需要生产或质量提供接口																																							
+			    v_rec_pdi.setReduce               ( null);// --压下率(%),需要生产或质量提供接口																																							
+			    v_rec_pdi.setSleeve               (0l);// --套筒(0:无、1:有),需要生产或质量提供接口																																							
+			    v_rec_pdi.setOuter_dia_sleeve     ( null);// --出口套筒外径(520~600),需要生产或质量提供接口																																							
+			    v_rec_pdi.setWeight_sleeve        ( null);// --套筒重量(10^-2kg),需要生产或质量提供接口	
+			    
+			    v_rec_pdi.setGb_steel_grade       ( v_steel);// --国标钢种																																							
+			    v_rec_pdi.setSteel_grade          ( v_steel);// --钢种																																							
+			    v_rec_pdi.setPreced_process_code  ( "");// --上道工序代码																																							
+			    v_rec_pdi.setNext_process_code    ( "");// --后道工序代码																																							
+			    v_rec_pdi.setComment              ( "");// --备注信息																																							
+			    v_rec_pdi.setExit_yard_location   ( "");// --出口库位																																							
+			    v_rec_pdi.setEntry_yard_location  ( v_entry_location);// --入口库位																																							
+			    v_rec_pdi.setReserve              ( "");// --预留	
+			    
+			    // 2019-09-26 panbin 调整从质量获取延伸率和压下率并且默认平整模式  延伸率不为空(平整) 压下率不为空 (轧制)
+			    // 获取工艺标准
+			    List<SlmOrdDesignMscTicItem> items = new ArrayList<SlmOrdDesignMscTicItem>();
+			    try{
+			    	 items = this.getBean(MesApiDesignInfoImpl.class)
+			    			.getPrc_Params(v_rec_pln_d.getObject_no_vt(),v_mch_code);
+			    	 reduce_code = this.getMapper(ComBaseInfoMapper.class).findById("20100201").getBase_name();
+			    	 spm_elong_code = this.getMapper(ComBaseInfoMapper.class).findById("20100202").getBase_name();
+			    }catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+				}
+			    if(Utils.isNotEmpty(items)) {
+			    	for(SlmOrdDesignMscTicItem sodm : items) {
+			    		// 压下率 Reduce
+			    		if(reduce_code.equals(sodm.getCraft_param_code()) && Utils.isNotEmpty(sodm.getMin_value())) {
+			    			Integer reduce=(int)(Double.valueOf(sodm.getMin_value())*100);
+			    			v_rec_pdi.setReduce(reduce.longValue());
+			    		}
+			    		// 延伸率 Spm_elong
+			    		if(spm_elong_code.equals(sodm.getCraft_param_code()) && Utils.isNotEmpty(sodm.getMin_value())) {
+			    			Integer spm_elong=(int)(Double.valueOf(sodm.getMin_value())*100);
+			    			v_rec_pdi.setSpm_elong(spm_elong.longValue());
+			    		}
+			    	}
+			    }
+			    // 平整模式
+			    if(Utils.isNotEmpty(v_rec_pdi.getReduce())) {
+			    	v_rec_pdi.setSpm_mode(1l);
+			    } else if(Utils.isNotEmpty(v_rec_pdi.getSpm_elong())) {
+			    	v_rec_pdi.setSpm_mode(0l);
+			    }
+			    // --(6.1.1)、调用PDI数据接口
+			    try{
+			    	String vOprName = (String) this.getSession().getAttribute(HomeService.SESSION_USER_NAME);
+					if(vOprName==null){
+						vOprName="L2Ask";
+					}
+					v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3Pdi(v_rec_pdi,vOprName,v_success,
+							v_message);
+				}catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+				}
+				if(v_message==null){
+					v_message="";
+				}
+				String v_success_str="";
+				if(v_message.contains("_success:")){
+					v_success_str=v_message.substring(v_message.length()-1);
+					v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+				}
+				if("1".equals(v_success_str)){
+					//v_message="L2 PDI数据请求应答成功!"+v_message;
+				}else if("2".equals(v_success_str)){
+					v_message="L2 PDI数据请求应答部分成功!"+v_message;
+				}else{
+					//v_message="L2 PDI数据请求应答失败!"+v_message;
+				}
+			}else{
+				//--(6.2)、调用无PDI数据接口
+				try{
+					v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3NoPdi(v_entry_coil_no,"L2Ask",v_success,
+							v_message);
+				}catch(Exception e){
+					e.printStackTrace();
+					v_message=e.getMessage();
+				}
+				if(v_message==null){
+					v_message="";
+				}
+				String v_success_str="";
+				if(v_message.contains("_success:")){
+					v_success_str=v_message.substring(v_message.length()-1);
+					v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+				}
+				if("1".equals(v_success_str)){
+					v_message="L2  无PDI数据请求应答成功!"+v_msg+v_message;
+				}else if("2".equals(v_success_str)){
+					v_message="L2  无PDI数据请求应答部分成功!"+v_msg+v_message;
+				}else{
+					v_message="L2  无PDI数据请求应答失败!"+v_msg+v_message;
+				}
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L3AswPdi_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L3AswPdi_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+		1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L3AswPdi_d 或 Tpm01L3SendPdi_d 方法调用;																																							
+		2)、	接口参数 IN:V_REC_PDI(PDI数据对象)、V_OPR_NAME(操作人)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_pdi
+	 * @param string
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3Pdi(IfTpm01L3Pdi v_rec_pdi, String v_opr_name,
+			Integer v_success, String v_message) throws Exception{
+		v_success=0;
+		Integer v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0  
+		
+		try{
+			//  --(2)、调用公司接口,将“PDI数据”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_pdi,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_PDI);
+				String url = TPMPDI_PDI;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="PDI下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发PDI给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发PDI给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发PDI给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			//  --(2.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Tpm01L3Pdi PDI数据电文发送失败!"+v_message+"_success:"+v_success;
+				return v_message;
+			}
+			//  --(3)、插入接口记录表相关信息																																							
+			//  --(3.1)、创建记录号																																							
+			Long v_serial_no=this.getMapper(IfTpm01L3PdiMapper.class).doCount1();
+			
+			//  --(3.2)、开始事物:																																							
+			//  --(3.2.1)、插入 IF_TPM01_L3_PDI PDI数据记录																																							
+			v_rec_pdi.setSerial_no(v_serial_no);
+			v_rec_pdi.setSend_time(new Date());
+			v_rec_pdi.setSend_opr(v_opr_name);
+			this.getMapper(IfTpm01L3PdiMapper.class).insert(v_rec_pdi);
+			//  --(3.2.2)、更新 PLN_SKINROLLING_PLAN_DETAIL PDI数据下发状态
+			if(v_opr_name==null){
+				v_opr_name="";
+			}
+			this.getMapper(PlnSkinrollingPlanDetailMapper.class).doUpdate2(v_opr_name,v_rec_pdi.getPlan_no(), v_rec_pdi.getEntry_coil_no());
+			//  --(4)、提交事务
+			//  --唯一标示操作成功的地方																																							
+			v_success = 1;																																							
+			v_message = "Tpm01L3Pdi PDI数据电文发送成功!记录号{"+v_serial_no+"} 计划号{"+v_rec_pdi.getPlan_no()+"} 入口卷号{"+v_rec_pdi.getEntry_coil_no()+"}"+"_success:"+v_success;
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3Pdi PDI数据电文发送成功!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Tpm01L3Pdi PDI数据电文发送成功!"+e.getMessage()+"_success:"+v_success;
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3Pdi PDI数据电文发送失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Tpm01L3Pdi PDI数据电文发送失败!"+e.getMessage()+"_success:"+v_success;
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+	 1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L3AswPdi_d 方法调用;																																							
+	 2)、	接口参数 IN:V_ENTRY_COIL_NO(L2请求的钢卷号)、V_OPR_NAME(操作人)																																							
+	 3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_entry_coil_no
+	 * @param string
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3NoPdi(String v_entry_coil_no, String v_opr_name,
+			Integer v_success, String v_message) throws Exception{
+		//  --(1)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		Integer v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0
+		String v_coil_no;
+		Integer v_count;//--已下发钢卷数
+		try{
+			//  --(2)、参数处理
+			if(v_entry_coil_no ==null || "".equals(v_entry_coil_no)){
+				v_coil_no = "00000000000000000000"; //--PS:20个0
+			}else{
+				v_coil_no=v_entry_coil_no;
+			}
+			Tpm0lL3NoView ilnv=new Tpm0lL3NoView();
+			ilnv.setEntry_coil_no(v_coil_no);
+			//ilnv.setNum_coil(v_num_coil);
+			//  --(3)、调用公司接口,将“无PDI数据”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)																																							
+			//  --(3.1)、电文参数,使用处理后的变量 v_coil_no																																							
+			//  --......																																							
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(ilnv,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_NOPDI);
+				String url = TPMPDI_NOPDI;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="无PDI下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发无PDI给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发无PDI给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发无PDI给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			//  --(3.2)、电文发送失败(失败状态,根据接口提供定义确定)																																							
+			if(v_flag == 0){																																							
+			    v_message = "Tpm01L3NoPdi 无PDI数据电文发送失败!"+v_message+"_success:"+v_success;																																			
+			    return v_message;																																							
+			}																																						
+			// --(4)、插入接口记录表相关信息		
+			IfTpm01L3NonePdi itlno=new IfTpm01L3NonePdi();
+			itlno.setSend_time(new Date());
+			itlno.setSend_opr(v_opr_name);
+			itlno.setEntry_coil_no(v_coil_no);
+			this.getMapper(IfTpm01L3NonePdiMapper.class).insert(itlno);
+			//  --(5)、提交事务
+			//  --唯一标示操作成功的地方																																							
+			v_success = 1;																																							
+			v_message = "Tpm01L3NoPdi 无PDI数据电文发送成功!ENTRY_COIL_NO {"+v_coil_no+"}"+"_success:"+v_success;		
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3NoPdi 无PDI数据电文发送成功!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Tpm01L3NoPdi 无PDI数据电文发送成功!"+e.getMessage()+"_success:"+v_success;
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3NoPdi 无PDI数据电文发送失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+				}else{
+					v_message="Tpm01L3NoPdi 无PDI数据电文发送失败!"+e.getMessage()+"_success:"+v_success;
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2指示删除电文时调用;																																							
+		2)、	此接口参数为“L2指示删除电文JSON对象”(电文编号:DR3E03);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2Revoke(IfTpm01L2Revoke json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//  --(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_rvk 代替描述
+		IfTpm01L2Revoke v_rec_l2_rvk=json;
+		if(json==null){
+			v_message="二级接口-平整机_L2_指示删除为空";
+			return v_message;
+		}
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_rvk.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_rvk.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入L2指示删除表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2RevokeMapper.class).insert(v_rec_l2_rvk);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2指示删除处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Revoke_d(v_mch_code,v_rec_l2_rvk.getEntry_coil_no(),
+					v_rec_l2_rvk.getOperator(),v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_rvk.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param="消息时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO {"+v_rec_l2_rvk.getEntry_coil_no()+"} "
+			  		+ "删除责任者 OPERATOR {"+v_rec_l2_rvk.getOperator()+"} 删除原因代码 REASON_CODE {"+v_rec_l2_rvk.getReason_code()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2Revoke",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+
+	
+	/**
+	 *	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L3AswPdi 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param entry_coil_no
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Revoke_d(String v_mch_code, String v_entry_coil_no,
+			String v_operator, String v_message) throws Exception{
+		
+		IfTpm01L3AnswerRevoke v_rec_l3_asw_rvk=new IfTpm01L3AnswerRevoke();
+		Integer v_success=null;
+		try{
+			//  --(1)、调用 L2指示删除 处理函数
+			try{
+				v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Revoke_d_d(v_mch_code,v_entry_coil_no,
+						v_operator,v_success,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message=e.getMessage();
+			}
+			//  --(1.1)、构造 L3应答L2指示数据删除 电文																																							
+			//  --(1.1.1)、L3处理L2指示删除电文成功(1:成功)																																							
+			if(v_message==null){
+				v_message="";
+			}
+			String v_success_str="";
+			//对v_message和v_success进行处理
+			if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				//v_success= Integer.parseInt(v_success_str);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			}
+			if("1".equals(v_success_str)){
+			    v_rec_l3_asw_rvk.setResult(0l);// --处理结果(0:成功、1:错误)
+			}else{
+				v_rec_l3_asw_rvk.setResult(1l);//--处理标志(0:成功、1:不成功)
+			}
+			v_rec_l3_asw_rvk.setEntry_coil_no(v_entry_coil_no);//--入口钢卷号
+			v_rec_l3_asw_rvk.setSend_time(new Date());
+			v_rec_l3_asw_rvk.setSend_opr("L3");//--下发人
+			//  --(2)、调用 L3应答L2指示数据删除 处理函数
+			String v_message2="";
+			try{
+				v_message2=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3AswRevoke(v_rec_l3_asw_rvk,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message2=e.getMessage();
+			}
+			String send_time=DateUtil.formatDate(v_rec_l3_asw_rvk.getSend_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(4)、拼接返回字符串
+			String v_param= "下发时间 SEND_TIME {"+send_time+"} 下发人 SEND_OPR {"+v_rec_l3_asw_rvk.getSend_opr()+"} "
+					+ "入口卷号 ENTRY_COIL_NO {"+v_rec_l3_asw_rvk.getEntry_coil_no()+"} 处理结果(0:成功、1:错误) RESULT {"+v_rec_l3_asw_rvk.getResult()+"}";
+			//  --(5)、写接口日志:与业务处理分开,单独的事务
+			try{
+				this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L3AswRevoke",v_param,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2Revoke_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2Revoke_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+	 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Revoke_d 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)、V_OPERATOR(删除操作人)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_entry_coil_no
+	 * @param v_operator
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Revoke_d_d(String v_mch_code, String v_entry_coil_no,
+			String v_operator, Integer v_success, String v_message) throws Exception{
+		//  --(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		Integer v_cnt=null;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message+"_success:"+v_success;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message+"_success:"+v_success;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_message="入口卷号{"+v_entry_coil_no+"} 未指定入口卷号!";
+				return v_message+"_success:"+v_success;
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.1)、验证入口卷对应的作业计划信息存在																																							
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount1(v_mch_code,v_entry_coil_no);
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+				return v_message+"_success:"+v_success;
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+				return v_message+"_success:"+v_success;
+			}else{
+				List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、验证已下发过PDI
+			if(v_rec_pln_d.getSend_flag()==null || "0".equals(v_rec_pln_d.getSend_flag())){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 还未下发指示顺序或PDI数据!";
+				return v_message+"_success:"+1;
+			}
+			//  --(2.3)、验证当前还未生产交工
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_rec_pln_d.getSr_plan_no());
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    MesTpmM v_rec_tpm_m =lmcam.get(0);
+			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+			    	v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工!";
+			    	return v_message+"_success:"+v_success;
+			    }
+			}
+			//  --(3)、开始事物:																																							
+			//  --(3.1)、修改指示状态																																							
+			this.getMapper(PlnSkinrollingPlanDetailMapper.class).doUpdate3(v_operator, v_rec_pln_d.getSr_plan_no(), v_entry_coil_no);
+			//  --(4)、提交事务
+			//唯一标示操作成功的地方
+			v_success=1;
+			v_message="Tpm01L2Revoke L2指示删除电文处理成功!"+"_success:"+v_success;
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2Revoke L2指示删除电文处理失败!"+e.getMessage().substring(0,200)+"_success:"+v_success;
+			}else{
+				v_message="Tpm01L2Revoke L2指示删除电文处理失败!"+e.getMessage()+"_success:"+v_success;
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+	  	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Revoke_d 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)、V_OPERATOR(删除操作人)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_l3_asw_rvk
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3AswRevoke(IfTpm01L3AnswerRevoke v_rec_l3_asw_rvk,
+			String v_message) throws Exception{
+		Integer v_flag=null;// --电文发送成功标志
+		try{
+			//  --(1)、无接口调试时,设置1,直接跳过,否则设置为0
+			v_flag=0;// --1:成功、0:失败
+			//  --(1)、调用公司接口,将“L3应答L2指示数据删除电文” v_rec_l3_asw_rvk 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_l3_asw_rvk,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_L2ORDERDELE);
+				String url = TPMPDI_L2ORDERDELE;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3应答L2指示数据删除电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发L3应答L2指示数据删除电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发L3应答L2指示数据删除电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发L3应答L2指示数据删除电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			
+			//  --(1.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Tpm01L3AswRevoke L3应答L2指示数据删除电文发送失败!"+v_message;
+				return v_message;
+			}
+			//  --(1.2)、电文发送成功(成功状态,根据接口提供定义确定),插入 L3应答L2指示数据删除 记录																																			
+			this.getMapper(IfTpm01L3AnswerRevokeMapper.class).insert(v_rec_l3_asw_rvk);
+			// --(1.2.1)、提交事务
+			v_message="Tpm01L3AswRevoke L3应答L2指示数据删除电文发送成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(1.2.2)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(1.2.2.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3AswRevoke L3应答L2指示数据删除电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3AswRevoke L3应答L2指示数据删除电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3AswRevoke L3应答L2指示数据删除电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3AswRevoke L3应答L2指示数据删除电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2开始生产电文时调用;																																							
+		2)、	此接口参数为“L2开始生产电文JSON对象”(电文编号:DR3E05);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2ProduceStart(IfTpm01L2PrdStr json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//  --(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_prd_str 代替描述
+		IfTpm01L2PrdStr v_rec_l2_prd_str=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_开始生产为空";
+			return v_message;
+		}
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_prd_str.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_prd_str.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入L2开始生产表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2PrdStrMapper.class).insert(v_rec_l2_prd_str);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2开始生产处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2ProduceStart_d(v_mch_code,v_rec_l2_prd_str,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_prd_str.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO {"+v_rec_l2_prd_str.getEntry_coil_no()+"} 时间 TC_TIME {"+v_rec_l2_prd_str.getTc_time()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2ProduceStart",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2ProduceStart 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_PRD_STR(L2开始生产记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_prd_str
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2ProduceStart_d(String v_mch_code,
+			IfTpm01L2PrdStr v_rec_l2_prd_str, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.2.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_mch_code);
+			if(cbm.getMachine_mark()==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+				return v_message;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_rec_l2_prd_str.getEntry_coil_no()==null || "".equals(v_rec_l2_prd_str.getEntry_coil_no())){
+				v_message="入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} 未指定入口卷号!";
+				return v_message;
+			}
+			//--(1.4)、验证电文中“开始生产时间”
+			Date v_str_time=null;
+			if(v_rec_l2_prd_str.getTc_time()==null || "".equals(v_rec_l2_prd_str.getTc_time())){
+				v_str_time=new Date();//--如果“开始生产”事件时刻为空,则赋值为当前时刻
+			}else{
+				//    --将生产开始时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+				try {
+					List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_prd_str.getTc_time());
+					v_str_time=li.get(0).getCreate_time();
+				} catch (Exception e) {
+					e.printStackTrace();
+					v_message="电文中“生产开始”事件时刻{"+v_rec_l2_prd_str.getTc_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+					return v_message;
+				}
+			}
+			String rmDb=DateUtil.formatDate(v_str_time, "yyyy-MM-dd HH:mm:ss");
+			String v_date=null,v_ord=null;
+			String dbTime=rmDb.substring(11);
+			v_date=rmDb.substring(0,10);
+			// --(1.1.1)、如果 v_charge_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_charge_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				v_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				v_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				v_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(v_date);
+				} catch (Exception e) {
+					return "获取数据库时间失败,请稍后重试";
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+		        v_date=formatYmd.format(c.getTime());
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.0)、根据计算的日期班次,获取交接班记录的班组																																							
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(v_date);
+			msm.setWrk_ord(v_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_grp=null;
+			if(v_cnt<=0){
+				v_grp="";// --无交接班记录,则赋空值(交工时,会提示用户完善信息)
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_grp=lmsm.get(0).getWrk_grp();
+			}
+			//  --(2.1)、验证入口卷对应的作业计划信息存在  
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount1(v_mch_code,v_rec_l2_prd_str.getEntry_coil_no());
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} 找不到作业计划信息!";
+				return v_message;  
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"}存在2条或以上的作业计划信息!";
+				return v_message; 
+			}else{
+				List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_rec_l2_prd_str.getEntry_coil_no());
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此电文事件)
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_rec_pln_d.getSr_plan_no());
+			mCross.setMaterial_no(v_rec_l2_prd_str.getEntry_coil_no());
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			MesTpmM v_rec_tpm_m=new MesTpmM();
+			boolean flag=false;//
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    v_rec_tpm_m =lmcam.get(0);
+			    flag=true;
+			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+			    	v_message = "机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} "
+			    			+ "入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} 已生产交工,忽略此电文事件!'";
+					return v_message;
+			    }
+			}
+			//  --(2.3)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";																																							
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			//  --(2.4)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_l2_prd_str.getEntry_coil_no()+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} 原料卷库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=  v_rec_ydm_d_list.get(0);
+			//  --(2.5)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BSR02".equals(v_rec_pln_d.getStatus()) || "5BSR03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			List<PlnMaterielDetail> v_rec_mtr_out_list2=this.getMapper(PlnMaterielDetailMapper.class).doQueryWeb2(v_rec_pln_d.getObject_no_vt(),"");
+			PlnMaterielDetail v_rec_mtr_out=v_rec_mtr_out_list2.get(0);
+			//  --(2.6)、出口卷编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)
+			//String v_coil_no = v_rec_l2_prd_str.getEntry_coil_no().substring(0, 8) + "P"+ lpad(cbm.getMachine_mark(), 2, "0");
+			//  --(2.6.1)、获取当前起始流水号  ??
+			//v_cnt=this.getMapper(MesTpmMMapper.class).doQueryWeb4(v_coil_no);
+//			v_cnt=this.getMapper(MesTpmMMapper.class).doQueryWeb5(v_coil_no,v_rec_pln_d.getSr_plan_no(),v_rec_l2_prd_str.getEntry_coil_no());
+//			if(v_cnt==null){
+//				v_cnt=1;
+//			}else if(v_cnt>99){
+//				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_prd_str.getEntry_coil_no()+"} "
+//						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"出口钢卷号超出规则范围,流水号超出最大值99!";																																							
+//				return v_message;
+//			}
+//			//  --(2.6.2)、出口卷编码规则:出口卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)																																					
+//			v_coil_no=v_coil_no+lpad(v_cnt+"",2,"0");
+			//  --(2.7)、在 v_rec_tpm_m 对象基础上,构建平整主实绩,并插入记录																																							
+			//  --(2.7.1):v_rec_tpm_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+			//  --(2.7.2):v_rec_tpm_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)																																							
+			  v_rec_tpm_m.setMachine_code    ( v_mch_code);// --机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			  v_rec_tpm_m.setSchedule_no     ( v_rec_pln_d.getSr_plan_no());// --作业计划号																																							
+			  v_rec_tpm_m.setInner_seq       ( v_rec_pln_d.getSr_seq());// --计划内序号																																							
+			  v_rec_tpm_m.setMaterial_no_vt  ( v_rec_pln_d.getObject_no_vt());// --虚拟原料卷号																																							
+			  v_rec_tpm_m.setPln_steel_code  ( v_rec_mtr_in.getSteel_code());// --计划原料卷牌号																																							
+			  v_rec_tpm_m.setPln_mtr_thk     ( v_rec_mtr_in.getThick());// --计划原料卷厚度																																							
+			  v_rec_tpm_m.setPln_mtr_wdt     ( v_rec_mtr_in.getWidth());// --计划原料卷宽度																																							
+			  v_rec_tpm_m.setPln_mtr_len     ( v_rec_mtr_in.getLength());// --计划原料卷长度																																							
+			  v_rec_tpm_m.setPln_mtr_inn_dia ( v_rec_mtr_in.getDiameter_inn());// --计划原料卷内径																																							
+			  v_rec_tpm_m.setPln_mtr_out_dia ( v_rec_mtr_in.getDiameter_out());// --计划原料卷外径																																							
+			  v_rec_tpm_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.getSingle_weight());// --计划原料卷理重																																							
+			  v_rec_tpm_m.setMaterial_no     ( v_rec_l2_prd_str.getEntry_coil_no());// --原料卷号																																							
+			  v_rec_tpm_m.setMaterial_no_src ( v_rec_ydm_d.getMaterailcoilno());// --原始卷号																																							
+			  v_rec_tpm_m.setMtr_thk         ( v_rec_ydm_d.getThick());// --原料卷厚度																																							
+			  v_rec_tpm_m.setMtr_wdt         ( v_rec_ydm_d.getWidth());// --原料卷宽度																																							
+			  v_rec_tpm_m.setMtr_len         ( v_rec_ydm_d.getLength());// --原料卷长度																																							
+			  v_rec_tpm_m.setMtr_inn_dia     ( v_rec_ydm_d.getDiameter_inn());// --原料卷内径																																							
+			  v_rec_tpm_m.setMtr_out_dia     ( v_rec_ydm_d.getDiameter_out());// --原料卷外径																																							
+			  if(v_rec_ydm_d.getTheoryweight()!=null){
+				  v_rec_tpm_m.setMtr_thr_wgt     ( v_rec_ydm_d.getTheoryweight());// --原料卷理重	
+			  }else{
+				  v_rec_tpm_m.setMtr_thr_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷理重
+			  }
+			  v_rec_tpm_m.setMtr_act_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷实重																																							
+			  v_rec_tpm_m.setSteel_code      ( v_rec_ydm_d.getSteelcode());// --原料卷牌号
+			  
+//			  if(!flag){//如果 v_rec_tpm_m 对象为空(即之前无生产实绩),则覆盖 作业日期、班次、班组(与生产开始不同,请注意)
+//				  v_rec_tpm_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)																																							
+//				  v_rec_tpm_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)																																							
+//				  v_rec_tpm_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)																																							
+//				  v_rec_tpm_m.setFeeding_time ( v_str_time); //--上料时间		
+//				  
+//			  }
+			  if(v_rec_tpm_m.getWrk_date()==null){
+				  v_rec_tpm_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)									
+			  }
+			  if(v_rec_tpm_m.getWrk_grp()==null){
+				  v_rec_tpm_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)			
+			  }
+			  if(v_rec_tpm_m.getWrk_ord()==null){
+				  v_rec_tpm_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)				
+			  }
+			  if(v_rec_tpm_m.getFeeding_time()==null){
+				  v_rec_tpm_m.setFeeding_time ( v_str_time); //--上料时间	
+			  }
+			  
+			  v_rec_tpm_m.setTp_str_time(v_str_time); //--生产开始时间
+			  v_rec_tpm_m.setMemo             ( null);// --备注																																							
+			  v_rec_tpm_m.setHand_over_status ( "0");// --交工状态																																							
+			  v_rec_tpm_m.setHand_over_time   ( null);// --交工时间																																							
+			  v_rec_tpm_m.setHand_over_opr    ( null);// --交工人																																							
+
+			  if(!flag){
+				  //  --如果 v_rec_tpm_m 对象为空(即之前无生产实绩),则:
+				  v_rec_tpm_m.setCreate_opr( "L2_DR3E05");// --操作人																																							
+				  v_rec_tpm_m.setCreate_time( new Date());// --操作时间																																							
+			  }else{
+				  //  --如果 v_rec_tpm_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				  v_rec_tpm_m.setUpdate_opr("L2_DR3E05");// --修改人																																							
+				  v_rec_tpm_m.setUpdate_time(new Date()) ;//--修改时间																																							
+			  }
+			  
+			  //--(3)、开始事物:																																							
+			  //--(3.0)、更新生产跟踪表	??	
+			  try{
+				  int count = this.getMapper(MesTpmTrcMapper.class).countWithCondition(null,"machine_code='"+v_mch_code+"'"); 
+				  if(count<=0){
+					  	MesTpmTrc mcst=new MesTpmTrc();
+					  	mcst.setMachine_code(v_mch_code);
+					  	mcst.setCur_coil_no(v_rec_l2_prd_str.getEntry_coil_no());
+					  	mcst.setCur_str_time(v_str_time);
+					  	mcst.setUpdate_program("Tpm01L2ProduceStart");
+					  	mcst.setUpdate_time(new Date());
+						this.getMapper(MesTpmTrcMapper.class).insert(mcst);
+				  }else{
+					  MesTpmTrc v_rec_tpm_trc = this.getMapper(MesTpmTrcMapper.class).findById(v_mch_code);
+					  //    --(3.0.1)、如果生产结束入口卷号 <> 生产跟踪表的当前钢卷号
+					  if(!v_rec_l2_prd_str.getEntry_coil_no().equals(v_rec_tpm_trc.getCur_coil_no())){
+						    MesTpmTrc mcst=new MesTpmTrc();
+						  	mcst.setMachine_code(v_mch_code);
+						  	mcst.setLst_coil_no(v_rec_tpm_trc.getCur_coil_no());
+						  	mcst.setLst_str_time(v_rec_tpm_trc.getCur_str_time());
+						  	mcst.setLst_end_time(null);
+						  	mcst.setCur_coil_no(v_rec_l2_prd_str.getEntry_coil_no());
+						  	mcst.setCur_str_time(v_str_time);
+						  	mcst.setUpdate_program("Tpm01L2ProduceStart");
+						  	mcst.setUpdate_time(new Date());
+							this.getMapper(MesTpmTrcMapper.class).update(mcst);
+					  }else{
+						  MesTpmTrc mcstcc=new MesTpmTrc();
+						  mcstcc.setMachine_code(v_mch_code);
+						  mcstcc.setCur_str_time(v_str_time);
+						  mcstcc.setUpdate_program("Tpm01L2ProduceStart");
+						  mcstcc.setUpdate_time(new Date());
+						  this.getMapper(MesTpmTrcMapper.class).update(mcstcc);
+					  }
+				  }
+			  }catch(Exception e){
+				  e.printStackTrace();
+			  }
+			  
+			  //  --(3.1)、删除可能存在的平整作业实绩记录
+			  this.getMapper(MesTpmMMapper.class).doDelete1(v_rec_pln_d.getSr_plan_no(),v_rec_l2_prd_str.getEntry_coil_no());
+			  //  --(3.2)、插入平整作业实绩记录
+			  this.getMapper(MesTpmMMapper.class).insert(v_rec_tpm_m);
+			  
+			  //--(3.3)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			  //--(3.3.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+																																										
+			  //--(3.4)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			  //--(3.4.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+				MesTpmM  mcsm=new MesTpmM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.getSr_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_l2_prd_str.getEntry_coil_no());//投料卷号
+				mcsm.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟卷号 
+				List<MesTpmM> lmcsm=new ArrayList<MesTpmM>();
+				//时间
+				SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+			    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+			    mcsm.setMemo(date);
+			    lmcsm.add(mcsm);
+			   //调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag2=true;
+				try{
+					this.getBean(MesApiSkinrollingPlanImpl.class).MesTpmMAddValid(lmcsm);
+				}catch(Exception e){
+					flag2=false;
+					e.printStackTrace();
+				}
+				if(flag2){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiSkinrollingPlanImpl.class).MesTpmMAdd(lmcsm); 
+				}
+				
+				//调用物流模块(仓库管理)接口,对原料卷进行生产投料出库操作(接口由物流模块提供);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_l2_prd_str.getEntry_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_l2_prd_str.getEntry_coil_no());//注意
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(date);
+					cp2.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+				}
+			v_message = "Tpm01L2ProduceStart L2开始生产电文处理成功!";  
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2ProduceStart L2开始生产电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2ProduceStart L2开始生产电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2钢卷回退实绩电文时调用;																																							
+		2)、	此接口参数为“L2钢卷回退实绩电文JSON对象”(电文编号:DR3E07);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2Reject(IfTpm01L2Reject json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//  --(1)、先将参数转换为Java实体类,此处以 v_rec_l2_reject 代替描述
+		IfTpm01L2Reject v_rec_l2_reject=json;
+		if(json==null){
+			v_message="参数错误:二级接口-平整机_L2_钢卷回退实绩为空";
+			return v_message;
+		}
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_reject.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_reject.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入L2钢卷回退实绩表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2RejectMapper.class).insert(v_rec_l2_reject);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2钢卷回退实绩处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Reject_d(v_mch_code,v_rec_l2_reject,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_reject.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param = "消息时间 MSG_TIME {"+mes_time+"} 回退钢卷号 REJECT_COIL_NO {"+v_rec_l2_reject.getReject_coil_no()+"} "
+					+ "入口钢卷号 ENTRY_COIL_NO {"+v_rec_l2_reject.getEntry_coil_no()+"} 材料标志 COIL_FLAG {"+v_rec_l2_reject.getCoil_flag()+"} "
+							+ "回退方式 REJECT_MODE {"+v_rec_l2_reject.getReject_mode()+"} 回退卷长 REJECT_COIL_LENGTH {"+v_rec_l2_reject.getReject_coil_length()+"} "
+									+ "回退卷重 REJECT_COIL_WEIGHT {"+v_rec_l2_reject.getReject_coil_weight()+"} 回退卷外径 REJECT_OUTER_DIAMETER {"+																																						
+			             v_rec_l2_reject.getReject_outer_diameter() +"} 回退原因代码 REJECT_REASON_CODE {"+v_rec_l2_reject.getReject_reason_code() +"} "
+			             		+ "封闭代码 WITHHOLDING_FLAG {"+v_rec_l2_reject.getWithholding_flag()	+"} 封闭原因代码 WITHHOLDING_REASON {"+
+			             v_rec_l2_reject.getWithholding_reason() +"} 封闭责任者代码 USER_ID {"+																																						
+			             v_rec_l2_reject.getUser_id() +"} 回退时间 REJECT_TIME {"+																																							
+			             v_rec_l2_reject.getReject_time()+ "} 班次 SHIFT {"+																																							
+			             v_rec_l2_reject.getShift() +"} 班别 CREW {"+ v_rec_l2_reject.getCrew()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2Reject",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Reject 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_REJECT(L2钢卷回退实绩对象)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_reject
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Reject_d(String v_mch_code,
+			IfTpm01L2Reject v_rec_l2_reject, String v_message) throws Exception{
+		
+		IfTpm01L3AnswerReject v_rec_l3_asw_reject=new IfTpm01L3AnswerReject();
+		Integer v_success=null;
+		try{
+			//  --(1)、调用 L2钢卷回退实绩 处理函数
+			try{
+				v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Reject_d_d(v_mch_code,v_rec_l2_reject,
+						v_success,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message=e.getMessage();
+			}
+			//  --(1.1)、构造 L3应答L2钢卷回退实绩 电文																																							
+			//  --(1.1.1)、L3处理L2钢卷回退实绩电文成功(1:成功)																																							
+			if(v_message==null){
+				v_message="";
+			}
+			String v_success_str="";
+			//对v_message和v_success进行处理
+			if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			}
+			if("1".equals(v_success_str)){
+				v_rec_l3_asw_reject.setResult(0l);// --处理结果(0:成功、1:错误)
+			}else{
+				v_rec_l3_asw_reject.setResult(1l);//--处理标志(0:成功、1:不成功)
+			}
+			v_rec_l3_asw_reject.setReject_coil_no(v_rec_l2_reject.getReject_coil_no());//--回退卷号
+			v_rec_l3_asw_reject.setSend_time(new Date());
+			v_rec_l3_asw_reject.setSend_opr("L3");//--下发人
+			//  --(2)、调用 L3应答L2钢卷回退实绩 处理函数
+			String v_message2="";
+			try{
+				v_message2=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3AswReject(v_rec_l3_asw_reject,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message2=e.getMessage();
+			}
+			String send_time=DateUtil.formatDate(v_rec_l3_asw_reject.getSend_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(4)、拼接返回字符串
+			String  v_param = "下发时间 SEND_TIME {"+send_time+"} 下发人 SEND_OPR {"+v_rec_l3_asw_reject.getSend_opr()+"} "
+			  		+ "回退卷号 REJECT_COIL_NO {"+v_rec_l3_asw_reject.getReject_coil_no()+"} 处理结果(0:成功、1:错误) RESULT {"+v_rec_l3_asw_reject.getResult()+"} "
+			  				+ "预留 RESERVE {"+v_rec_l3_asw_reject.getReserve()+"}";																																							
+			//  --(5)、写接口日志:与业务处理分开,单独的事务
+			try{
+				this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L3AswReject",v_param,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2Reject_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2Reject_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Reject_d 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_REJECT(L2钢卷回退实绩对象)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_reject
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Reject_d_d(String v_mch_code,
+			IfTpm01L2Reject v_rec_l2_reject, Integer v_success, String v_message) throws Exception{
+		Integer v_cnt=null;
+		// --(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.2.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_mch_code);
+			if(cbm.getMachine_mark()==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+				return v_message;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_rec_l2_reject.getEntry_coil_no()==null || "".equals(v_rec_l2_reject.getEntry_coil_no())){
+				v_message="入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} 未指定入口卷号!";
+				return v_message;
+			}
+			//  --(1.4)、验证回退方式(1: 整卷回退、2:半卷回退)
+			if(v_rec_l2_reject.getReject_mode()==null || "".equals(v_rec_l2_reject.getReject_mode())){
+				v_message="回退方式{"+v_rec_l2_reject.getReject_mode()+"} 未指定,系统无法处理!";
+				return v_message;
+			}else if(v_rec_l2_reject.getReject_mode().longValue()!=1 && v_rec_l2_reject.getReject_mode().longValue()!=2){
+				v_message="回退方式{"+v_rec_l2_reject.getReject_mode()+"} 代码无法识别!";
+				return v_message;
+			}
+			
+			if(v_rec_l2_reject.getReject_mode().longValue()==1){
+				v_message="整卷回退 的情况,系统不做处理,由人工到MES系统取消实绩,恢复为计划";
+				return v_message;
+			}
+			
+			Date v_time=null;
+			//  --(2)、只处理“半卷回退”的情况(整卷回退 的情况,系统不做处理,由人工到MES系统取消实绩,恢复为计划)
+			if("2".equals(v_rec_l2_reject.getReject_mode())){
+				//    --(2.1)、验证电文中“回退时间(YYYYMMDDHHMMSS)”
+				if(v_rec_l2_reject.getReject_time()==null || "".equals(v_rec_l2_reject.getReject_time())){
+					v_time=new Date();//--如果回退时间为空,则赋值为当前时刻
+				}else{
+					//    --(2.1.1)、将回退时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+					try {
+						List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_reject.getReject_time());
+						v_time=li.get(0).getCreate_time();
+					} catch (Exception e) {
+						e.printStackTrace();
+						v_message="电文中“回退时间”{"+v_rec_l2_reject.getReject_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+						return v_message;
+					}
+				}
+			}
+			
+			String rmDb=DateUtil.formatDate(v_time, "yyyy-MM-dd HH:mm:ss");
+			String v_date=null,v_ord=null;
+			String dbTime=rmDb.substring(11);
+			v_date=rmDb.substring(0,10);
+			// --(1.1.1)、如果 v_charge_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_charge_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				v_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				v_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				v_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(v_date);
+				} catch (Exception e) {
+					return "获取数据库时间失败,请稍后重试";
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+		        v_date=formatYmd.format(c.getTime());
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//    --(2.3)、根据计算的日期班次,获取交接班记录的班组																																						
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(v_date);
+			msm.setWrk_ord(v_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_grp=null;
+			if(v_cnt<=0){
+				  //      --(2.3.1)、电文中 班别(A:甲、B:乙、C:丙、D:丁),对应MES系统(1:甲、2:乙、3:丙、4:丁)
+				  String l2_grp=v_rec_l2_reject.getCrew(); //--无交接班记录,是使用电文中的生产班别
+				  if("A".equals(l2_grp)){
+					  v_grp = "1"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("B".equals(l2_grp)){
+					  v_grp = "2"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("C".equals(l2_grp)){
+					  v_grp = "3"; //--无交接班记录,是使用电文中的生产班别
+				  }else if("D".equals(l2_grp)){
+					  v_grp = "4"; //--无交接班记录,是使用电文中的生产班别
+				  }
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_grp=lmsm.get(0).getWrk_grp();
+			}
+			// --(2.4)、验证入口卷对应的作业计划信息存在
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount1(v_mch_code,v_rec_l2_reject.getEntry_coil_no());
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} 找不到作业计划信息!";
+				return v_message;  
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"}存在2条或以上的作业计划信息!";
+				return v_message; 
+			}else{
+				List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_rec_l2_reject.getEntry_coil_no());
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//    --(2.5)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此电文事件)
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_rec_pln_d.getSr_plan_no());
+			mCross.setMaterial_no(v_rec_l2_reject.getEntry_coil_no());
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			MesTpmM v_rec_tpm_m=new MesTpmM();
+			boolean flag=false;//
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    v_rec_tpm_m =lmcam.get(0);
+			    flag=true;
+			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+			    	v_message = "机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} "
+			    			+ "入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} 已生产交工,忽略此电文事件!'";
+					return v_message;
+			    }
+			}
+			//    --(2.6)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";																																							
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			//    --(2.7)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_l2_reject.getEntry_coil_no()+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} 原料卷库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=  v_rec_ydm_d_list.get(0);
+			//    --(2.8)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BSR02".equals(v_rec_pln_d.getStatus()) || "5BSR03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			List<PlnMaterielDetail> v_rec_mtr_out_list2=this.getMapper(PlnMaterielDetailMapper.class).doQueryWeb2(v_rec_pln_d.getObject_no_vt(),"");
+			PlnMaterielDetail v_rec_mtr_out=v_rec_mtr_out_list2.get(0);
+//			//    --(2.9)、出口卷编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)
+//			String v_coil_no = v_rec_l2_reject.getEntry_coil_no().substring(0, 8) + "P"+ lpad(cbm.getMachine_mark(), 2, "0");
+//			//    --(2.9.1)、获取当前起始流水号
+//			v_cnt=this.getMapper(MesTpmMMapper.class).doQueryWeb5(v_coil_no,v_rec_pln_d.getSr_plan_no(),v_rec_l2_reject.getEntry_coil_no());
+//			if(v_cnt==null){
+//				v_cnt=1;
+//			}else if(v_cnt>99){
+//				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} "
+//						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"出口钢卷号超出规则范围,流水号超出最大值99!";																																							
+//				return v_message;
+//			}
+//			//    --(2.9.2)、出口卷编码规则:出口卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)																																				
+//			v_coil_no=v_coil_no+lpad(v_cnt+"",2,"0");
+			//    --(2.10)、计算吊销卷号
+			String v_reject_coil_no=null;
+			for(int idx=1;idx<=9;idx++){
+				//      --(2.10.1)、吊销卷号编码规则:原料卷号(8位最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)+ 'R' + 1位流水(1 - 9)
+				v_reject_coil_no=v_rec_l2_reject.getEntry_coil_no().substring(0, 8) + "P"+lpad(cbm.getMachine_mark(), 2, "0")+"R"+idx;
+				String schedule_no=null;
+				String material_no=null;
+				if(v_rec_tpm_m==null){
+					schedule_no="NULL";
+					material_no="NULL";
+				}else{
+					schedule_no=v_rec_tpm_m.getSchedule_no()==null?"NULL":v_rec_tpm_m.getSchedule_no();
+					material_no=v_rec_tpm_m.getMaterial_no()==null?"NULL":v_rec_tpm_m.getMaterial_no();
+				}
+				v_cnt=this.getMapper(MesTpmMMapper.class).doCount2(v_reject_coil_no,schedule_no,material_no);
+				//  --(2.10.2)、--吊销卷号未占用
+				if(v_cnt==0){
+					break;
+				}
+			}
+			//    --(2.10.3)、--吊销卷号无法生成(1-9序号全部被使用)
+			if(v_cnt>0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_reject.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"吊销卷号生成失败,序号已全部占用!";																																							
+				return v_message;
+			}
+		    // --(2.11)、在 v_rec_tpm_m 对象基础上,构建平整主实绩,并插入记录																																							
+		    // --(2.11.1):v_rec_tpm_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+		    // --(2.11.2):v_rec_tpm_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)																																							
+			  v_rec_tpm_m.setMachine_code    ( v_mch_code);// --机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			  v_rec_tpm_m.setSchedule_no     ( v_rec_pln_d.getSr_plan_no());// --作业计划号																																							
+			  v_rec_tpm_m.setInner_seq       ( v_rec_pln_d.getSr_seq());// --计划内序号																																							
+			  v_rec_tpm_m.setMaterial_no_vt  ( v_rec_pln_d.getObject_no_vt());// --虚拟原料卷号																																							
+			  v_rec_tpm_m.setPln_steel_code  ( v_rec_mtr_in.getSteel_code());// --计划原料卷牌号																																							
+			  v_rec_tpm_m.setPln_mtr_thk     ( v_rec_mtr_in.getThick());// --计划原料卷厚度																																							
+			  v_rec_tpm_m.setPln_mtr_wdt     ( v_rec_mtr_in.getWidth());// --计划原料卷宽度																																							
+			  v_rec_tpm_m.setPln_mtr_len     ( v_rec_mtr_in.getLength());// --计划原料卷长度																																							
+			  v_rec_tpm_m.setPln_mtr_inn_dia ( v_rec_mtr_in.getDiameter_inn());// --计划原料卷内径																																							
+			  v_rec_tpm_m.setPln_mtr_out_dia ( v_rec_mtr_in.getDiameter_out());// --计划原料卷外径																																							
+			  v_rec_tpm_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.getSingle_weight());// --计划原料卷理重																																							
+			  v_rec_tpm_m.setMaterial_no     ( v_rec_l2_reject.getEntry_coil_no());// --原料卷号																																							
+			  v_rec_tpm_m.setMaterial_no_src ( v_rec_ydm_d.getMaterailcoilno());// --原始卷号																																							
+			  v_rec_tpm_m.setMtr_thk         ( v_rec_ydm_d.getThick());// --原料卷厚度																																							
+			  v_rec_tpm_m.setMtr_wdt         ( v_rec_ydm_d.getWidth());// --原料卷宽度																																							
+			  v_rec_tpm_m.setMtr_len         ( v_rec_ydm_d.getLength());// --原料卷长度																																							
+			  v_rec_tpm_m.setMtr_inn_dia     ( v_rec_ydm_d.getDiameter_inn());// --原料卷内径																																							
+			  v_rec_tpm_m.setMtr_out_dia     ( v_rec_ydm_d.getDiameter_out());// --原料卷外径																																							
+			  if(v_rec_ydm_d.getTheoryweight()!=null){
+				  v_rec_tpm_m.setMtr_thr_wgt     ( v_rec_ydm_d.getTheoryweight());// --原料卷理重	
+			  }else{
+				  v_rec_tpm_m.setMtr_thr_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷理重
+			  }																																						
+			  v_rec_tpm_m.setMtr_act_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷实重																																							
+			  v_rec_tpm_m.setSteel_code      ( v_rec_ydm_d.getSteelcode());// --原料卷牌号
+			  
+			  if(!flag){//如果 v_rec_tpm_m 对象为空(即之前无生产实绩),则覆盖 作业日期、班次、班组(与生产开始不同,请注意)
+				  v_rec_tpm_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)																																							
+				  v_rec_tpm_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)																																							
+				  v_rec_tpm_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)																																							
+				  v_rec_tpm_m.setFeeding_time ( v_time); //--上料时间		
+			  }
+			  //    --半卷回退(即:部分卷吊销)信息设置
+			  v_rec_tpm_m.setPartial_rejected("1");//--部分原料卷吊销(1是、0否)
+			  v_rec_tpm_m.setRejected_coil_no(v_reject_coil_no);// --吊销卷号																																							
+			  v_rec_tpm_m.setRejected_coil_thr_wgt ( v_rec_l2_reject.getReject_coil_weight()==null?null:v_rec_l2_reject.getReject_coil_weight().doubleValue()); //--吊销卷理重																																							
+			  v_rec_tpm_m.setRejected_coil_act_wgt ( v_rec_l2_reject.getReject_coil_weight()==null?null:v_rec_l2_reject.getReject_coil_weight().doubleValue()); //--吊销卷实重																																							
+			  v_rec_tpm_m.setRejected_coil_len     ( v_rec_l2_reject.getReject_coil_length()==null?null:v_rec_l2_reject.getReject_coil_length().doubleValue());// --吊销卷长度(m)																																							
+			  v_rec_tpm_m.setRejected_coil_out_dia ( v_rec_l2_reject.getReject_outer_diameter()==null?null:v_rec_l2_reject.getReject_outer_diameter().doubleValue());// --吊销卷外径																																							
+			  v_rec_tpm_m.setMemo             ( null);// --备注																																							
+			  v_rec_tpm_m.setHand_over_status ( "0");// --交工状态																																							
+			  v_rec_tpm_m.setHand_over_time   ( null);// --交工时间																																							
+			  v_rec_tpm_m.setHand_over_opr    ( null);// --交工人																																							
+
+			  if(!flag){
+				  //  --如果 v_rec_tpm_m 对象为空(即之前无生产实绩),则:
+				  v_rec_tpm_m.setCreate_opr( "L2_DR3E07");// --操作人																																							
+				  v_rec_tpm_m.setCreate_time( new Date());// --操作时间																																							
+			  }else{
+				  //  --如果 v_rec_tpm_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				  v_rec_tpm_m.setUpdate_opr("L2_DR3E07");// --修改人																																							
+				  v_rec_tpm_m.setUpdate_time(new Date()) ;//--修改时间																																							
+			  }
+			  //    --(2.12)、开始事物																																						
+			  //    --(2.12.0)、删除可能存在的平整作业实绩记录
+			  this.getMapper(MesTpmMMapper.class).doDelete1(v_rec_pln_d.getSr_plan_no(),v_rec_l2_reject.getEntry_coil_no());
+			  //    --(2.12.1)、插入平整作业实绩记录
+			  this.getMapper(MesTpmMMapper.class).insert(v_rec_tpm_m);
+			  
+			  //  --(2.12.2)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			  //  --(2.12.2.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+			  																																							
+			  //  --(2.12.3)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			  //  --(2.12.3.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+																																					
+				MesTpmM  mcsm=new MesTpmM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.getSr_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_l2_reject.getEntry_coil_no());//投料卷号
+				mcsm.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟卷号 
+				List<MesTpmM> lmcsm=new ArrayList<MesTpmM>();
+				//时间
+				SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+			    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+			    mcsm.setMemo(date);
+			    lmcsm.add(mcsm);
+			   //调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag2=true;
+				try{
+					this.getBean(MesApiSkinrollingPlanImpl.class).MesTpmMAddValid(lmcsm);
+				}catch(Exception e){
+					flag2=false;
+					e.printStackTrace();
+				}
+				if(flag2){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiSkinrollingPlanImpl.class).MesTpmMAdd(lmcsm); 
+				}
+				
+				//调用物流模块(仓库管理)接口,对原料卷进行生产投料出库操作(接口由物流模块提供);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_l2_reject.getEntry_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_l2_reject.getEntry_coil_no());//注意
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(date);
+					cp2.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+				}
+		    v_success=1;//--唯一置为成功的地方
+			v_message = "Tpm01L2Reject L2钢卷回退实绩电文处理成功!";  
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2Reject L2钢卷回退实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2Reject L2钢卷回退实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+		
+	}
+
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Reject_d 方法调用;																																							
+		2)、	接口参数 IN:V_REC_L3_ASW_REJECT(L3应答L2钢卷回退实绩对象)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_l3_asw_reject
+	 * @param v_message2
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3AswReject(IfTpm01L3AnswerReject v_rec_l3_asw_reject,
+			String v_message) throws Exception{
+		Integer v_flag=null;// --电文发送成功标志
+		try{
+			//  --(1)、无接口调试时,设置1,直接跳过,否则设置为0
+			v_flag=0;// --1:成功、0:失败
+			//  --(1)、调用公司接口,将“L3应答L2钢卷回退实绩电文” v_rec_l3_asw_reject 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_l3_asw_reject,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_HUITUI);
+				String url = TPMPDI_HUITUI;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3应答L2钢卷回退实绩电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发L3应答L2钢卷回退实绩电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发L3应答L2钢卷回退实绩电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发L3应答L2钢卷回退实绩电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			// --(1.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Tpm01L3AswReject L3应答L2钢卷回退实绩电文发送失败!"+v_message;
+				return v_message;
+			}
+			//  --(1.2)、电文发送成功(成功状态,根据接口提供定义确定),插入 L3应答L2钢卷回退实绩 记录																																		
+			this.getMapper(IfTpm01L3AnswerRejectMapper.class).insert(v_rec_l3_asw_reject);
+			// --(1.2.1)、提交事务
+			v_message="Tpm01L3AswReject L3应答L2钢卷回退实绩电文发送成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(1.2.2)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(1.2.2.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3AswReject L3应答L2钢卷回退实绩电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3AswReject L3应答L2钢卷回退实绩电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3AswReject L3应答L2钢卷回退实绩电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3AswReject L3应答L2钢卷回退实绩电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2钢卷生产实绩电文时调用;																																							
+		2)、	此接口参数为“L2钢卷生产实绩电文JSON对象”(电文编号:DR3E08);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2Pdo(IfTpm01L2Pdo json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//  --(1)、先将参数转换为Java实体类,此处以 v_rec_l2_pdo 代替描述
+		IfTpm01L2Pdo v_rec_l2_pdo=json;
+		if(json==null){
+			v_message="二级接口-平整机_L2_PDO为空";
+			return v_message;
+		}
+		if(v_rec_l2_pdo.getSpm_mode()==null || v_rec_l2_pdo.getSpm_mode().longValue()==0){//平整  延伸率
+			v_rec_l2_pdo.setElongation(v_rec_l2_pdo.getElongation_reduction());
+		}else if(v_rec_l2_pdo.getSpm_mode().longValue()==1){//轧制 压下率
+			v_rec_l2_pdo.setReduction(v_rec_l2_pdo.getElongation_reduction());
+		}
+		
+		//  --(1.0)、创建L2钢卷生产实绩表记录号
+		Long max_serial_no=this.getMapper(IfTpm01L2PdoMapper.class).doCount();
+		v_rec_l2_pdo.setSerial_no(max_serial_no);
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_pdo.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_pdo.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入 L2钢卷生产实绩表 以及 L2_PDO_缺陷信息表(单独的事务)																																							
+		//  --(1.2.1)、此电文需要拆分为 主从表(1:N),其中缺陷信息为字表(编码时注意处理)																																							
+		try{
+			this.getMapper(IfTpm01L2PdoMapper.class).insert(v_rec_l2_pdo);
+			
+			//--(1.2.2)、缺陷子记录数,根据电文实际情况确认(电文ID:DR3E08) ??
+			for(int i=1;i<=20;i++){
+				IfTpm01L2PdoDfc itpd=new IfTpm01L2PdoDfc();
+				//itpd.setSerial_no(serial_no);//记录号(由业务接口创建,唯一标识消息)  ??
+				itpd.setStart_pos(null);//起始位置(m,Calculate from tail, like weldseam position)
+				itpd.setEnd_pos(null);//终止位置(m)
+				Long defect_no=(long)i;
+				itpd.setDefect_no(defect_no);//序号(由业务创建,1 - 99)
+				itpd.setDefect_type("");//缺陷类型代码
+				itpd.setDefect_intensity("1");//缺陷级别(1:slight,、2:medium、3:heavy)
+				//this.getMapper(IfTpm01L2PdoDfcMapper.class).insert(itpd);
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2钢卷生产实绩处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Pdo_d(v_mch_code,v_rec_l2_pdo,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_pdo.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param="消息时间 MSG_TIME {"+mes_time+"} 记录号 SERIAL_NO {"+v_rec_l2_pdo.getSerial_no()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2Pdo",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Pdo 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_PDO(L2钢卷生产实绩电文对象)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_pdo
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Pdo_d(String v_mch_code, IfTpm01L2Pdo v_rec_l2_pdo,
+			String v_message) throws Exception{
+		IfTpm01L3AnswerPdo v_rec_l3_asw_pdo=new IfTpm01L3AnswerPdo();
+		Integer v_success=null;
+		try{
+			//  --(1)、调用 L2钢卷生产实绩 处理函数
+			try{
+				v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Pdo_d_d(v_mch_code,v_rec_l2_pdo,
+						v_success,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message=e.getMessage();
+			}
+			//  --(1.1)、构造 L3应答L2钢卷生产实绩 电文																																							
+			//  --(1.1.1)、L3处理L2钢卷生产实绩电文成功(1:成功)																																							
+			if(v_message==null){
+				v_message="";
+			}
+			String v_success_str="";
+			if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			}
+			if("1".equals(v_success_str)){
+				v_rec_l3_asw_pdo.setResult(0l);// --处理结果(0:成功、1:错误)
+			}else{
+				v_rec_l3_asw_pdo.setResult(1l);//--处理标志(0:成功、1:不成功)
+			}
+			v_rec_l3_asw_pdo.setExit_coil_no(v_rec_l2_pdo.getExit_coil_no());//--入口钢卷号
+			v_rec_l3_asw_pdo.setSend_time(new Date());
+			v_rec_l3_asw_pdo.setSend_opr("L3");//--下发人
+			//  --(2)、调用 L3应答L2钢卷生产实绩 处理函数
+			String v_message2="";
+			try{
+				v_message2=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3AswPdo(v_rec_l3_asw_pdo,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message2=e.getMessage();
+			}
+			String send_time=DateUtil.formatDate(v_rec_l3_asw_pdo.getSend_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(4)、拼接返回字符串
+			String v_param = "下发时间 SEND_TIME {"+v_rec_l3_asw_pdo.getSend_time()+"} 下发人 SEND_OPR {"+ v_rec_l3_asw_pdo.getSend_opr()	+																																						
+			             "} 出口卷号 EXIT_COIL_NO {"+v_rec_l3_asw_pdo.getExit_coil_no()+"} 处理结果(0:成功、1:错误) RESULT {"+
+					v_rec_l3_asw_pdo.getResult()+"} 预留 RESERVE {"+v_rec_l3_asw_pdo.getReserve()+"}";																																							
+			//  --(5)、写接口日志:与业务处理分开,单独的事务
+			try{
+				this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L3AswPdo",v_param,v_message2);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2Pdo_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2Pdo_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+		
+	}
+	
+
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Pdo_d 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_PDO(L2钢卷生产实绩电文对象)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_pdo
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Pdo_d_d(String v_mch_code, IfTpm01L2Pdo v_rec_l2_pdo,
+			Integer v_success, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		//--(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.2.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_mch_code);
+			if(cbm.getMachine_mark()==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+				return v_message;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_rec_l2_pdo.getEntry_coil_no()==null || "".equals(v_rec_l2_pdo.getEntry_coil_no())){
+				v_message="入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} 未指定入口卷号!";
+				return v_message;
+			}
+			//  --(2)、业务处理:																																							
+			//  --(2.1)、验证电文中“开始生产时刻(YYYYMMDDHHMMSS)”																																							
+			Date v_str_time=null;
+			if(v_rec_l2_pdo.getStart_time()==null || "".equals(v_rec_l2_pdo.getStart_time())){
+				v_str_time=new Date();//--如果开始生产时间为空,则赋值为当前时刻
+			}else{
+				//    --(2.1.1)、将开始生产时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+				try {
+					List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_pdo.getStart_time());
+					v_str_time=li.get(0).getCreate_time();
+				} catch (Exception e) {
+					e.printStackTrace();
+					v_message="电文中“开始生产时间”{"+v_rec_l2_pdo.getStart_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+					return v_message;
+				}
+			}
+			// --(2.1')、验证电文中“结束生产时刻(YYYYMMDDHHMMSS)”
+			Date v_end_time=null;
+			if(v_rec_l2_pdo.getEnd_time()==null || "".equals(v_rec_l2_pdo.getEnd_time())){
+				v_end_time=new Date();//--如果开始结束时间为空,则赋值为当前时刻
+			}else{
+				//  --(2.1.1)、将结束生产时间的字符串,转换日期时间格式(可以在JAVA中转化,此处以PLSQL处理代替描述)
+				try {
+					List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_pdo.getEnd_time());
+					v_end_time=li.get(0).getCreate_time();
+				} catch (Exception e) {
+					e.printStackTrace();
+					//v_message="电文中“开始生产时间”{"+v_rec_l2_pdo.getEnd_time()+"} 格式转化失败,无法计算日期班次!约定的标准格式【yyyyMMddHHmmss】";
+					//return v_message;
+					//--(2.1.2')、转化失败(非约定的标准格式:YYYYMMDDHHmmss):则赋值为当前时刻
+					v_end_time=new Date();
+				}
+			}
+			String rmDb=DateUtil.formatDate(v_str_time, "yyyy-MM-dd HH:mm:ss");
+			String v_date=null,v_ord=null;
+			String dbTime=rmDb.substring(11);
+			v_date=rmDb.substring(0,10);
+			// --(1.1.1)、如果 v_charge_time 的时间>=00:00:00并且<08:00:00,则 作业日期 = v_charge_time 的日期(格式化为yyyy-MM-dd),班次 = "1",即表示当天晚班;
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				v_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				v_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				v_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(v_date);
+				} catch (Exception e) {
+					return "获取数据库时间失败,请稍后重试";
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+		        v_date=formatYmd.format(c.getTime());
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.3)、根据计算的日期班次,获取交接班记录的班组																																				
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(v_date);
+			msm.setWrk_ord(v_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_grp=null;
+			if(v_cnt<=0){
+				v_grp="";// --无交接班记录,则赋空值(交工时,会提示用户完善信息)
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_grp=lmsm.get(0).getWrk_grp();
+			}
+			//  --(2.4)、验证入口卷对应的作业计划信息存在  
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount1(v_mch_code,v_rec_l2_pdo.getEntry_coil_no());
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} 找不到作业计划信息!";
+				return v_message;  
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"}存在2条或以上的作业计划信息!";
+				return v_message; 
+			}else{
+				List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_rec_l2_pdo.getEntry_coil_no());
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.5)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此电文事件)
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_rec_pln_d.getSr_plan_no());
+			mCross.setMaterial_no(v_rec_l2_pdo.getEntry_coil_no());
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			MesTpmM v_rec_tpm_m=new MesTpmM();
+			boolean flag=false;//
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    v_rec_tpm_m =lmcam.get(0);
+			    flag=true;
+			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+			    	v_message = "机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} "
+			    			+ "入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} 已生产交工,忽略此电文事件!'";
+					return v_message;
+			    }
+			}
+			//  --(2.6)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";																																							
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			//  --(2.7)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_l2_pdo.getEntry_coil_no()+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} 原料卷库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=  v_rec_ydm_d_list.get(0);
+			//  --(2.8)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BSR02".equals(v_rec_pln_d.getStatus()) || "5BSR03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			List<PlnMaterielDetail> v_rec_mtr_out_list2=this.getMapper(PlnMaterielDetailMapper.class).doQueryWeb2(v_rec_pln_d.getObject_no_vt(),"");
+			PlnMaterielDetail v_rec_mtr_out=v_rec_mtr_out_list2.get(0);
+			//  --(2.9)、出口卷编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)
+//			String v_coil_no = v_rec_l2_pdo.getEntry_coil_no().substring(0, 8) + "P"+ lpad(cbm.getMachine_mark(), 2, "0");
+//			//  --(2.9.1)、获取当前起始流水号  ??
+//			//v_cnt=this.getMapper(MesTpmMMapper.class).doQueryWeb4(v_coil_no);
+//			v_cnt=this.getMapper(MesTpmMMapper.class).doQueryWeb5(v_coil_no,v_rec_pln_d.getSr_plan_no(),v_rec_l2_pdo.getEntry_coil_no());
+//			if(v_cnt==null){
+//				v_cnt=1;
+//			}else if(v_cnt>99){
+//				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_pdo.getEntry_coil_no()+"} "
+//						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"出口钢卷号超出规则范围,流水号超出最大值99!";																																							
+//				return v_message;
+//			}
+			
+			/*
+			 * 2019-03-08断带情况、正常分卷的处理
+			 * */
+			if(v_rec_l2_pdo.getExit_coil_no()!=null && v_rec_l2_pdo.getExit_coil_no().length()>3 &&
+					!"1".equals(v_rec_l2_pdo.getExit_coil_no().substring(v_rec_l2_pdo.getExit_coil_no().length()-1, 
+							v_rec_l2_pdo.getExit_coil_no().length()))){
+				int i=v_rec_l2_pdo.getExit_coil_no().length()-v_rec_l2_pdo.getEntry_coil_no().length();
+				String subtri = v_rec_l2_pdo.getExit_coil_no().substring(v_rec_l2_pdo.getExit_coil_no().length()-1, 
+						v_rec_l2_pdo.getExit_coil_no().length());
+				long abc2=0;
+				try{
+					abc2 = Long.valueOf(subtri);
+				}catch(Exception e){
+					
+				}
+				if(i==1 && abc2>1){
+				//  --(1)、出现断带情况,调用 L2钢卷出口卷2,3,4,xx
+					try{
+						v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Pdo_d_d_234(v_mch_code,v_rec_l2_pdo,v_rec_tpm_m,
+								v_success,v_message);
+					}catch(Exception e){
+						e.printStackTrace();
+						v_message=e.getMessage();
+					}
+					return v_message;
+				}
+			    
+			}
+			
+			//  --(2.9.2)、出口卷编码规则:出口卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)																																					
+			//v_coil_no=v_coil_no+lpad(v_cnt+"",2,"0");
+			//  --(2.11)、在 v_rec_tpm_m 对象基础上,构建平整主实绩,并插入记录																																							
+			//  --(2.11.1):v_rec_tpm_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+			//  --(2.11.2):v_rec_tpm_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)																																							
+			  v_rec_tpm_m.setMachine_code    ( v_mch_code);// --机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			  v_rec_tpm_m.setSchedule_no     ( v_rec_pln_d.getSr_plan_no());// --作业计划号																																							
+			  v_rec_tpm_m.setInner_seq       ( v_rec_pln_d.getSr_seq());// --计划内序号																																							
+			  v_rec_tpm_m.setMaterial_no_vt  ( v_rec_pln_d.getObject_no_vt());// --虚拟原料卷号																																							
+			  v_rec_tpm_m.setPln_steel_code  ( v_rec_mtr_in.getSteel_code());// --计划原料卷牌号																																							
+			  v_rec_tpm_m.setPln_mtr_thk     ( v_rec_mtr_in.getThick());// --计划原料卷厚度																																							
+			  v_rec_tpm_m.setPln_mtr_wdt     ( v_rec_mtr_in.getWidth());// --计划原料卷宽度																																							
+			  v_rec_tpm_m.setPln_mtr_len     ( v_rec_mtr_in.getLength());// --计划原料卷长度																																							
+			  v_rec_tpm_m.setPln_mtr_inn_dia ( v_rec_mtr_in.getDiameter_inn());// --计划原料卷内径																																							
+			  v_rec_tpm_m.setPln_mtr_out_dia ( v_rec_mtr_in.getDiameter_out());// --计划原料卷外径																																							
+			  v_rec_tpm_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.getSingle_weight());// --计划原料卷理重																																							
+			  v_rec_tpm_m.setMaterial_no     ( v_rec_l2_pdo.getEntry_coil_no());// --原料卷号																																							
+			  v_rec_tpm_m.setMaterial_no_src ( v_rec_ydm_d.getMaterailcoilno());// --原始卷号																																							
+			  v_rec_tpm_m.setMtr_thk         ( v_rec_ydm_d.getThick());// --原料卷厚度																																							
+			  v_rec_tpm_m.setMtr_wdt         ( v_rec_ydm_d.getWidth());// --原料卷宽度																																							
+			  v_rec_tpm_m.setMtr_len         ( v_rec_ydm_d.getLength());// --原料卷长度																																							
+			  v_rec_tpm_m.setMtr_inn_dia     ( v_rec_ydm_d.getDiameter_inn());// --原料卷内径																																							
+			  v_rec_tpm_m.setMtr_out_dia     ( v_rec_ydm_d.getDiameter_out());// --原料卷外径																																							
+			  if(v_rec_ydm_d.getTheoryweight()!=null){
+				  v_rec_tpm_m.setMtr_thr_wgt     ( v_rec_ydm_d.getTheoryweight());// --原料卷理重	
+			  }else{
+				  v_rec_tpm_m.setMtr_thr_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷理重
+			  }																																							
+			  v_rec_tpm_m.setMtr_act_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷实重																																							
+			  v_rec_tpm_m.setSteel_code      ( v_rec_ydm_d.getSteelcode());// --原料卷牌号
+			  
+			  if(!flag){//如果 v_rec_tpm_m 对象为空(即之前无生产实绩),则覆盖 作业日期、班次、班组(与生产开始不同,请注意)
+				  v_rec_tpm_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)																																							
+				  v_rec_tpm_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)																																							
+				  v_rec_tpm_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)																																							
+				  v_rec_tpm_m.setFeeding_time ( v_str_time); //--上料时间		
+			  }
+			  if(v_rec_l2_pdo.getStrip_break()!=null){
+				  v_rec_tpm_m.setStrip_break(v_rec_l2_pdo.getStrip_break()+""); //--是否断带(1:断带、0:正常)
+			  }
+			  
+			  v_rec_tpm_m.setTp_str_time(v_str_time); //--生产开始时间
+			  v_rec_tpm_m.setTp_end_time(v_end_time); 
+			  //--生产时间(min)
+			  if(v_rec_l2_pdo.getDuration()==null || "".equals(v_rec_l2_pdo.getDuration())){
+				  v_rec_tpm_m.setTp_duration(null);
+			  }else{
+				  try{
+					  v_rec_tpm_m.setTp_duration(Long.parseLong(v_rec_l2_pdo.getDuration()));
+				  }catch(Exception e){
+					  //v_rec_tpm_m.setTp_duration(null);
+				  }
+			  }
+			  
+			  v_rec_tpm_m.setEntry_tension_avg   ( v_rec_l2_pdo.getEntry_tension_avg());// --前张力平均值(10^-2kn)																																							
+			  v_rec_tpm_m.setEntry_tension_max   ( v_rec_l2_pdo.getEntry_tension_max());// --前张力最大值(10^-2kn)																																							
+			  v_rec_tpm_m.setEntry_tension_min   ( v_rec_l2_pdo.getEntry_tension_min());// --前张力最小值(10^-2kn)																																							
+			  v_rec_tpm_m.setExit_tension_avg    ( v_rec_l2_pdo.getExit_tension_avg());// --后张力平均值(10^-2kn)																																							
+			  v_rec_tpm_m.setExit_tension_max    ( v_rec_l2_pdo.getExit_tension_max());// --后张力最大值(10^-2kn)																																							
+			  v_rec_tpm_m.setExit_tension_min    ( v_rec_l2_pdo.getExit_tension_min());// --后张力最小值(10^-2kn)																																							
+			  v_rec_tpm_m.setSpindle_torque_avg  ( v_rec_l2_pdo.getSpindle_torque());// --转矩平均值(10^-2kn)																																							
+			  v_rec_tpm_m.setMill_force          ( v_rec_l2_pdo.getMill_force());// --轧制力(10^-2kn)																																							
+			  v_rec_tpm_m.setMill_force_deta     ( v_rec_l2_pdo.getMill_force_deta());// --轧制力方差(10^-2kn)																																							
+			  v_rec_tpm_m.setWkr_bending_force   ( v_rec_l2_pdo.getWkr_bending_force());// --工作弯辊力(10^-2kn)																																							
+			  v_rec_tpm_m.setImr_bending_force   ( v_rec_l2_pdo.getImr_bending_force());// --中辊弯辊力(10^-2kn)																																							
+			  v_rec_tpm_m.setShift_pos           ( v_rec_l2_pdo.getShift_pos());// --串辊位置(mm)																																							
+			  v_rec_tpm_m.setElongation          ( v_rec_l2_pdo.getElongation());// --延伸率(10-2%,根据平整模式判断)																																							
+			  v_rec_tpm_m.setReduction           ( v_rec_l2_pdo.getReduction());// --压下率(10-2%,根据平整模式判断)																																							
+			  v_rec_tpm_m.setMill_speed          ( v_rec_l2_pdo.getMill_speed());// --轧制速度(m/min)																																							
+			  v_rec_tpm_m.setExit_thickness_set  ( v_rec_l2_pdo.getExit_thickness_setp());// --1#机架出口卷厚度设定值(um)																																							
+			  v_rec_tpm_m.setExit_thickness_avg  ( v_rec_l2_pdo.getExit_thickness_avg());// --1#机架出口卷厚度平均值(um)																																							
+			  v_rec_tpm_m.setExit_thickness_max  ( v_rec_l2_pdo.getExit_thickness_max());// --1#机架出口卷厚度最大值(um)																																							
+			  v_rec_tpm_m.setExit_thickness_min  ( v_rec_l2_pdo.getExit_thickness_min());// --1#机架出口卷厚度最小值(um)																																							
+			  v_rec_tpm_m.setExit_thickness_deta ( v_rec_l2_pdo.getExit_thickness_delta());// --1#机架出口卷厚度方差(um)																																							
+			  v_rec_tpm_m.setThickness_class_1   ( v_rec_l2_pdo.getThickness_class_1());// --<±1%公差(10^-2%)																																							
+			  v_rec_tpm_m.setThickness_class_2   ( v_rec_l2_pdo.getThickness_class_2());// --<±2%公差(10^-2%)																																							
+			  v_rec_tpm_m.setThickness_class_3   ( v_rec_l2_pdo.getThickness_class_3());// --<±4%公差(10^-2%)																																							
+			  v_rec_tpm_m.setThickness_class_4   ( v_rec_l2_pdo.getThickness_class_4());// --<±6%公差(10^-2%)																																							
+			  v_rec_tpm_m.setThickness_class_5   ( v_rec_l2_pdo.getThickness_class_5());// --<±10%公差(10^-2%)																																							
+			  v_rec_tpm_m.setThickness_class_6   ( v_rec_l2_pdo.getThickness_class_6());// -->±10%公差(10^-2%)																																							
+			  v_rec_tpm_m.setNum_defects         ( v_rec_l2_pdo.getNum_defects());// --缺陷个数																																							
+			  //v_rec_tpm_m.setFeeding_wgt         ( v_rec_l2_pdo.getEntry_weight()==null?null:v_rec_l2_pdo.getEntry_weight().doubleValue());// --入口重量(kg)
+			  v_rec_tpm_m.setFeeding_wgt         ( v_rec_ydm_d.getFactweight());// --入口重量(kg)
+			  if(v_rec_l2_pdo.getSpm_mode()!=null){
+				  v_rec_tpm_m.setSpm_mode            ( v_rec_l2_pdo.getSpm_mode()+"");// --平整模式	
+			  }
+			  //v_rec_tpm_m.setMemo             ( null);// --备注																																							
+			  v_rec_tpm_m.setHand_over_status ( "0");// --交工状态																																							
+			  v_rec_tpm_m.setHand_over_time   ( null);// --交工时间																																							
+			  v_rec_tpm_m.setHand_over_opr    ( null);// --交工人																																							
+
+			  if(!flag){
+				  //  --如果 v_rec_tpm_m 对象为空(即之前无生产实绩),则:
+				  v_rec_tpm_m.setCreate_opr( "L2_DR3E08");// --操作人																																							
+				  v_rec_tpm_m.setCreate_time( new Date());// --操作时间																																							
+			  }else{
+				  //  --如果 v_rec_tpm_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				  v_rec_tpm_m.setUpdate_opr("L2_DR3E08");// --修改人																																							
+				  v_rec_tpm_m.setUpdate_time(new Date()) ;//--修改时间																																							
+			  }
+			  
+			  //--(2.12)、开始事物																																					
+			  //--(2.12.0)、删除可能存在的平整作业实绩记录
+			  this.getMapper(MesTpmMMapper.class).doDelete1(v_rec_pln_d.getSr_plan_no(),v_rec_l2_pdo.getEntry_coil_no());
+			  //  --(3.2)、插入平整作业实绩记录
+			  this.getMapper(MesTpmMMapper.class).insert(v_rec_tpm_m);
+			  
+			  
+			  MesTpmD mtd=new MesTpmD();
+			  mtd.setSchedule_no(v_rec_pln_d.getSr_plan_no());
+			  mtd.setMaterial_no(v_rec_l2_pdo.getEntry_coil_no());
+		      List<MesTpmD> list = this.getMapper(MesTpmDMapper.class).find(mtd, 0, 0);
+			  if(list==null || list.size()<=0){
+				  ResultModel doAddsWebRm=new ResultModel();
+				  try{
+					  doAddsWebRm = this.getBean(MesTpmDServiceImpl.class).doAddsWeb_PDO(v_rec_pln_d.getSr_plan_no(),
+							  v_rec_pln_d.getObject_no_vt(),v_rec_pln_d.getObject_no(),"M0007","Tpm01L2Pdo_d");
+					  if("200".equals(doAddsWebRm.getState())){//子卷新增成功
+						  List<MesTpmD> list_mtd = this.getMapper(MesTpmDMapper.class).findWithCondition(mtd, "", "coil_no", 0, 0);
+						  if(list_mtd!=null && list_mtd.size()>0){
+							  MesTpmD mtd0=list_mtd.get(0);
+							  MesTpmD mtd0_new=new MesTpmD();
+							  mtd0_new.setCoil_no(mtd0.getCoil_no());
+							  mtd0_new.setAct_thk      ( v_rec_l2_pdo.getExit_thick()==null?null:v_rec_l2_pdo.getExit_thick().doubleValue()/1000);// --产出卷厚度um	
+							  mtd0_new.setAct_len      ( v_rec_l2_pdo.getExit_length()==null?null:v_rec_l2_pdo.getExit_length().doubleValue()*1000);// --产出卷长度(m)																																							
+							  mtd0_new.setAct_inn_dia  ( v_rec_l2_pdo.getInner_diameter()==null?null:v_rec_l2_pdo.getInner_diameter().doubleValue());// --产出卷内径																																							
+							  mtd0_new.setAct_out_dia  ( v_rec_l2_pdo.getOuter_diameter()==null?null:v_rec_l2_pdo.getOuter_diameter().doubleValue());// --产出卷外径																																							
+							  //mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_calc_weight()==null?null:v_rec_l2_pdo.getExit_calc_weight().doubleValue());// --产出卷理重																																							
+							  //mtd0_new.setCoil_act_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:v_rec_l2_pdo.getExit_weight().doubleValue());// --产出卷实量	
+							  mtd0_new.setCoil_thr_wgt (mtd0.getCoil_thr_wgt());// --产出卷理重																																							
+							  mtd0_new.setCoil_act_wgt (mtd0.getCoil_act_wgt());// --产出卷实量
+							  mtd0_new.setCoil_wgt_time(new Date());//出口卷称重时间
+							  this.getMapper(MesTpmDMapper.class).update(mtd0_new);
+						  }
+					  }else{
+						  throw new Exception("生产实绩调用批量新增子卷接口报错");
+					  }
+				  }catch(Exception e){
+					  e.printStackTrace();
+					  v_message=e.getMessage();
+					  throw new Exception("生产实绩调用批量新增子卷接口报错"+v_message);
+				  }
+					  
+			  }else{//之前就存在子卷实绩
+				  List<MesTpmD> list_mtd = this.getMapper(MesTpmDMapper.class).findWithCondition(mtd, "substr(coil_no, -1) <> 'B'", "coil_no", 0, 0);
+				  if(list_mtd!=null && list_mtd.size()>0){
+					  MesTpmD mtd0=list_mtd.get(0);
+					  MesTpmD mtd0_new=new MesTpmD();
+					  mtd0_new.setCoil_no(mtd0.getCoil_no());
+					  mtd0_new.setAct_thk      ( v_rec_l2_pdo.getExit_thick()==null?null:v_rec_l2_pdo.getExit_thick().doubleValue()/1000);// --产出卷厚度um	
+					  mtd0_new.setAct_len      ( v_rec_l2_pdo.getExit_length()==null?null:v_rec_l2_pdo.getExit_length().doubleValue()*1000);// --产出卷长度(m)																																							
+					  mtd0_new.setAct_inn_dia  ( v_rec_l2_pdo.getInner_diameter()==null?null:v_rec_l2_pdo.getInner_diameter().doubleValue());// --产出卷内径																																							
+					  mtd0_new.setAct_out_dia  ( v_rec_l2_pdo.getOuter_diameter()==null?null:v_rec_l2_pdo.getOuter_diameter().doubleValue());// --产出卷外径																																							
+					  //mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_calc_weight()==null?null:v_rec_l2_pdo.getExit_calc_weight().doubleValue());// --产出卷理重																																							
+					  //mtd0_new.setCoil_act_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:v_rec_l2_pdo.getExit_weight().doubleValue());// --产出卷实量	
+					  mtd0_new.setCoil_thr_wgt (mtd0.getCoil_thr_wgt());// --产出卷理重																																							
+					  mtd0_new.setCoil_act_wgt (mtd0.getCoil_act_wgt());// --产出卷实量
+					  mtd0_new.setCoil_wgt_time(new Date());//出口卷称重时间
+					  this.getMapper(MesTpmDMapper.class).update(mtd0_new);
+				  }
+			  }
+			  
+			  //--(3.3)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			  //--(3.3.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+																																										
+			  //--(3.4)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			  //--(3.4.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+				MesTpmM  mcsm=new MesTpmM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.getSr_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_l2_pdo.getEntry_coil_no());//投料卷号
+				mcsm.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟卷号 
+				List<MesTpmM> lmcsm=new ArrayList<MesTpmM>();
+				//时间
+				SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+			    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+			    mcsm.setMemo(date);
+			    lmcsm.add(mcsm);
+			   //调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag2=true;
+				try{
+					this.getBean(MesApiSkinrollingPlanImpl.class).MesTpmMAddValid(lmcsm);
+				}catch(Exception e){
+					flag2=false;
+					e.printStackTrace();
+				}
+				if(flag2){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiSkinrollingPlanImpl.class).MesTpmMAdd(lmcsm); 
+				}
+				
+				//调用物流模块(仓库管理)接口,对原料卷进行生产投料出库操作(接口由物流模块提供);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_l2_pdo.getEntry_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_l2_pdo.getEntry_coil_no());//注意
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(date);
+					cp2.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+				}
+			//--唯一置为成功的地方	
+			v_success=1;	
+			v_message = "Tpm01L2Pdo L2钢卷生产实绩电文处理成功!"+"_success:"+v_success;  
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2Pdo L2钢卷生产实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2Pdo L2钢卷生产实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	//断带的情况、正常分卷的情况
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Pdo_d_d_234(String v_mch_code, IfTpm01L2Pdo v_rec_l2_pdo,
+			MesTpmM v_rec_tpm_m, Integer v_success, String v_message) throws Exception{
+		String seqcount="";
+		try{
+			seqcount = v_rec_l2_pdo.getExit_coil_no().substring(v_rec_l2_pdo.getExit_coil_no().length()-1, 
+					v_rec_l2_pdo.getExit_coil_no().length());
+			
+			if(v_rec_tpm_m==null || v_rec_tpm_m.getMaterial_no()==null || v_rec_tpm_m.getSchedule_no()==null){
+				v_message="此电文处理产出卷{"+seqcount+"},"+"还未存在实绩信息";
+				return v_message;
+			}
+			MesTpmM mtm=new MesTpmM();
+			mtm.setMaterial_no(v_rec_tpm_m.getMaterial_no());
+			mtm.setSchedule_no(v_rec_tpm_m.getSchedule_no());
+			List<MesTpmM> list = this.getMapper(MesTpmMMapper.class).find(mtm, 0, 0);
+			if(list==null || list.size()<=0){
+				v_message="此电文处理产出卷{"+seqcount+"},"+"还未存在实绩信息";
+				return v_message;
+			}
+			MesTpmM mesTpmM = list.get(0);
+			
+			
+			MesTpmD mtd=new MesTpmD();
+			mtd.setSchedule_no(mesTpmM.getSchedule_no());
+			mtd.setMaterial_no(mesTpmM.getMaterial_no());
+			List<MesTpmD> list_mtd = this.getMapper(MesTpmDMapper.class).findWithCondition(mtd, "substr(coil_no, -1) <> 'B'", "coil_no", 0, 0);
+			if(list_mtd==null || list_mtd.size()<=0){
+				  	v_message="此电文处理产出卷{"+seqcount+"},"+"还未存在第一个出口卷";
+					return v_message;  
+			}else{//之前就存在子卷实绩
+				  if(list_mtd.size()>=Integer.parseInt(seqcount)){
+					  MesTpmD mtd0=list_mtd.get(Integer.parseInt(seqcount)-1);
+					  MesTpmD mtd0_new=new MesTpmD();
+					  mtd0_new.setCoil_no(mtd0.getCoil_no());
+					  mtd0_new.setAct_thk      ( v_rec_l2_pdo.getExit_thick()==null?null:v_rec_l2_pdo.getExit_thick().doubleValue()/1000);// --产出卷厚度um	
+					  mtd0_new.setAct_len      ( v_rec_l2_pdo.getExit_length()==null?null:v_rec_l2_pdo.getExit_length().doubleValue()*1000);// --产出卷长度(m)																																							
+					  mtd0_new.setAct_inn_dia  ( v_rec_l2_pdo.getInner_diameter()==null?null:v_rec_l2_pdo.getInner_diameter().doubleValue());// --产出卷内径																																							
+					  mtd0_new.setAct_out_dia  ( v_rec_l2_pdo.getOuter_diameter()==null?null:v_rec_l2_pdo.getOuter_diameter().doubleValue());// --产出卷外径																																							
+					  //mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_calc_weight()==null?null:v_rec_l2_pdo.getExit_calc_weight().doubleValue());// --产出卷理重																																							
+					  //mtd0_new.setCoil_act_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:v_rec_l2_pdo.getExit_weight().doubleValue());// --产出卷实量
+					  mtd0_new.setCoil_thr_wgt (mtd0.getCoil_thr_wgt());// --产出卷理重																																							
+					  mtd0_new.setCoil_act_wgt (mtd0.getCoil_act_wgt());// --产出卷实量
+					  mtd0_new.setCoil_wgt_time(new Date());//出口卷称重时间
+					  this.getMapper(MesTpmDMapper.class).update(mtd0_new);
+				  }else{
+					  MesTpmD mtd0_new=new MesTpmD();
+					  mtd0_new.setAct_thk      ( v_rec_l2_pdo.getExit_thick()==null?null:v_rec_l2_pdo.getExit_thick().doubleValue()/1000);// --产出卷厚度um	
+					  mtd0_new.setAct_len      ( v_rec_l2_pdo.getExit_length()==null?null:v_rec_l2_pdo.getExit_length().doubleValue()*1000);// --产出卷长度(m)																																							
+					  mtd0_new.setAct_inn_dia  ( v_rec_l2_pdo.getInner_diameter()==null?null:v_rec_l2_pdo.getInner_diameter().doubleValue());// --产出卷内径																																							
+					  mtd0_new.setAct_out_dia  ( v_rec_l2_pdo.getOuter_diameter()==null?null:v_rec_l2_pdo.getOuter_diameter().doubleValue());// --产出卷外径																																							
+					  mtd0_new.setCoil_thr_wgt ( v_rec_l2_pdo.getExit_calc_weight()==null?null:v_rec_l2_pdo.getExit_calc_weight().doubleValue());// --产出卷理重																																							
+					  mtd0_new.setCoil_act_wgt ( v_rec_l2_pdo.getExit_weight()==null?null:v_rec_l2_pdo.getExit_weight().doubleValue());// --产出卷实量	
+					  //this.getBean(MesTpmDServiceImpl.class).doAddmaterielWeb_PDO(mesTpmM.getSchedule_no(),mesTpmM.getMaterial_no_vt(),mesTpmM.getMaterial_no(),"M0007",mtd0_new);
+				  }
+				  
+			  }
+			
+		}catch(Exception e){
+			throw new Exception("此电文处理产出卷{"+seqcount+"}出错");
+		}
+		v_success=1;	
+		v_message="Tpm01L2Pdo【断带、分卷】L2钢卷生产实绩电文处理产出卷{"+seqcount+"},处理成功!"+"_success:"+v_success;
+		
+		return v_message;
+	}
+	
+	
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Pdo_d 方法调用;																																							
+	    2)、	接口参数 IN:V_REC_L3_ASW_PDO(L3应答L2钢卷生产实绩对象)																																							
+	    3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_rec_l3_asw_pdo
+	 * @param v_message2
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(propagation = Propagation.REQUIRES_NEW,value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3AswPdo(IfTpm01L3AnswerPdo v_rec_l3_asw_pdo,
+			String v_message) throws Exception{
+		Integer v_flag=null;// --电文发送成功标志
+		try{
+			//  --(1)、无接口调试时,设置1,直接跳过,否则设置为0
+			v_flag=0;// --1:成功、0:失败
+			//--(1)、调用公司接口,将“L3应答L2钢卷生产实绩电文” v_rec_l3_asw_pdo 发送给L2(获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(v_rec_l3_asw_pdo,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_MES);
+				String url = TPMPDI_MES;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3应答L2钢卷生产实绩电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发L3应答L2钢卷生产实绩电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发L3应答L2钢卷生产实绩电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发无PDI给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			
+			// --(1.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Tpm01L3AswPdo L3应答L2钢卷生产实绩电文发送失败!"+v_message;
+				return v_message;
+			}
+			//--(1.2)、电文发送成功(成功状态,根据接口提供定义确定),插入 L3应答L2钢卷生产实绩 记录																																	
+			this.getMapper(IfTpm01L3AnswerPdoMapper.class).insert(v_rec_l3_asw_pdo);
+			// --(1.2.1)、提交事务
+			v_message="Tpm01L3AswPdo L3应答L2钢卷生产实绩电文发送成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(1.2.2)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(1.2.2.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3AswPdo L3应答L2钢卷生产实绩电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3AswPdo L3应答L2钢卷生产实绩电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3AswPdo L3应答L2钢卷生产实绩电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3AswPdo L3应答L2钢卷生产实绩电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2生产结束电文时调用;																																							
+		2)、	此接口参数为“L2生产结束电文JSON对象”(电文编号:DR3E09);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2ProduceEnd(IfTpm01L2PrdEnd json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_prd_end 代替描述
+		IfTpm01L2PrdEnd v_rec_l2_prd_end=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_生产结束为空";
+			return v_message;
+		}
+		//  --(1.1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_prd_end.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_prd_end.setMsg_time(new Date());
+		}
+		//--(1.2)、将对象,插入L2生产结束表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2PrdEndMapper.class).insert(v_rec_l2_prd_end);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用L2生产结束处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2ProduceEnd_d(v_mch_code,v_rec_l2_prd_end,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_prd_end.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param = "消息时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO "
+					+ "{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 出口卷号 EXIT_COIL_NO {"+v_rec_l2_prd_end.getExit_coil_no()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2ProduceEnd",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2ProduceEnd 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_PRD_END(L2生产结束记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_prd_str
+	 * @param v_message
+	 * @return
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2ProduceEnd_d(String v_mch_code,
+			IfTpm01L2PrdEnd v_rec_l2_prd_end, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		try{
+			//  --(1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.2.1)、获取机台基础信息表中,配置的机台设备代号(设备编号,如1,2,3)
+			ComBaseMachine cbm = this.getMapper(ComBaseMachineMapper.class).findById(v_mch_code);
+			if(cbm.getMachine_mark()==null){
+				v_message="机台代码{"+v_mch_code+"} 设备编号未配置,无法处理!";
+				return v_message;
+			}
+			//  --(1.3)、验证入口卷号不为空
+			if(v_rec_l2_prd_end.getEntry_coil_no()==null || "".equals(v_rec_l2_prd_end.getEntry_coil_no())){
+				v_message="入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 未指定入口卷号!";
+				return v_message;
+			}
+			//  --(1.4)、“生产结束时间”赋值未当前时刻
+			Date v_end_time=new Date();
+			String rmDb=DateUtil.formatDate(v_end_time, "yyyy-MM-dd HH:mm:ss");
+			String v_date=null,v_ord=null;
+			String dbTime=rmDb.substring(11);
+			v_date=rmDb.substring(0,10);
+			if(dbTime.compareTo(DateUtil.NBeginTime)>-1&&dbTime.compareTo(DateUtil.BeginTime)<0){
+				v_ord="1";
+			}else if(dbTime.compareTo(DateUtil.BeginTime)>-1&&dbTime.compareTo(DateUtil.EndTime)<0){
+				v_ord="2";
+			}else if(dbTime.compareTo(DateUtil.EndTime)>-1&&dbTime.compareTo(DateUtil.NEndTime)<0){
+				v_ord="1";
+				SimpleDateFormat formatYmd = new SimpleDateFormat("yyyy-MM-dd");
+				Date date;
+				try {
+					date = formatYmd.parse(v_date);
+				} catch (Exception e) {
+					return "获取数据库时间失败,请稍后重试";
+				}
+				Calendar c = Calendar.getInstance();  
+		        c.setTime(date);  
+		        c.add(Calendar.DAY_OF_MONTH, 1);//日期+1 
+		        v_date=formatYmd.format(c.getTime());
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.0)、根据计算的日期班次,获取交接班记录的班组																																							
+			MesShiftM msm=new MesShiftM();
+			msm.setMachine_code(v_mch_code);
+			msm.setWrk_date(v_date);
+			msm.setWrk_ord(v_ord);
+			v_cnt=this.getMapper(MesShiftMMapper.class).count(msm);
+			String v_grp=null;
+			if(v_cnt<=0){
+				v_grp="";// --暂无交接班记录,置空(由操作人员在页面上选取保存)
+			}else{
+				//    --否则获取交接班记录中的班组
+				List<MesShiftM> lmsm = this.getMapper(MesShiftMMapper.class).find(msm, 0, 0);
+				v_grp=lmsm.get(0).getWrk_grp();
+			}
+			//  --(2.1)、验证入口卷对应的作业计划信息存在  
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount1(v_mch_code,v_rec_l2_prd_end.getEntry_coil_no());
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 找不到作业计划信息!";
+				return v_message;  
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"}存在2条或以上的作业计划信息!";
+				return v_message; 
+			}else{
+				List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_rec_l2_prd_end.getEntry_coil_no());
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、如果已有生产实绩(人工操作或L2重复发送PDO情况下),且已交工,则返回(忽略此电文事件)
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_rec_pln_d.getSr_plan_no());
+			mCross.setMaterial_no(v_rec_l2_prd_end.getEntry_coil_no());
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			MesTpmM v_rec_tpm_m=new MesTpmM();
+			boolean flag=false;//
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    v_rec_tpm_m =lmcam.get(0);
+			    flag=true;
+			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+			    	v_message = "机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} "
+			    			+ "入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 已生产交工,忽略此电文事件!'";
+					return v_message;
+			    }
+			}
+			//  --(2.3)、验证虚拟物料表中,原料卷计划信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 原料卷虚拟物料信息不存在!";																																							
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			//  --(2.4)、验证原料卷号库存明细记录存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_rec_l2_prd_end.getEntry_coil_no()+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} "
+						+ "入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} 原料卷库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=  v_rec_ydm_d_list.get(0);
+			//  --(2.5)、验证虚拟物料表中,出口卷虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_out_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+					"mat_object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"'", null, 0, 0);
+			if(v_rec_mtr_out_list==null || v_rec_mtr_out_list.size()<=0){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} "
+						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+" 出口卷虚拟物料信息不存在!";
+				return v_message;
+			}
+			
+			//2018-11-29 只有是已下发状态的钢卷才能下发
+			if(v_rec_pln_d!=null){
+				if(!("5BSR02".equals(v_rec_pln_d.getStatus()) || "5BSR03".equals(v_rec_pln_d.getStatus()))){
+					v_message="当前状态{"+v_rec_pln_d.getStatus()+"}错误";
+					return v_message;
+				}
+			}
+			
+			List<PlnMaterielDetail> v_rec_mtr_out_list2=this.getMapper(PlnMaterielDetailMapper.class).doQueryWeb2(v_rec_pln_d.getObject_no_vt(),"");
+			PlnMaterielDetail v_rec_mtr_out=v_rec_mtr_out_list2.get(0);
+//			//  --(2.6)、出口卷编码前缀:原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)
+//			String v_coil_no = v_rec_l2_prd_end.getEntry_coil_no().substring(0, 8) + "P"+ lpad(cbm.getMachine_mark(), 2, "0");
+//			//  --(2.6.1)、获取当前起始流水号 
+//			v_cnt=this.getMapper(MesTpmMMapper.class).doQueryWeb5(v_coil_no,v_rec_pln_d.getSr_plan_no(),v_rec_l2_prd_end.getEntry_coil_no());
+//			if(v_cnt==null){
+//				v_cnt=1;
+//			}else if(v_cnt>99){
+//				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_rec_pln_d.getSr_plan_no()+"} 入口卷号{"+v_rec_l2_prd_end.getEntry_coil_no()+"} "
+//						+ "虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"出口钢卷号超出规则范围,流水号超出最大值99!";																																							
+//				return v_message;
+//			}
+//			//  --(2.6.2)、出口卷编码规则:出口卷编码前缀【原料卷号(最初始原料卷号) + 1位工序代号(平整P)+ 2位设备代号(01-99)】+ 2位流水(01 - 99)																																					
+//			v_coil_no=v_coil_no+lpad(v_cnt+"",2,"0");
+			//  --(2.7)、在 v_rec_tpm_m 对象基础上,构建平整主实绩,并插入记录																																							
+			//  --(2.7.1):v_rec_tpm_m 对象可能不为空(之前实绩已存在),则更新部分信息,保留部分信息(未赋值的属性即是保留原有对象的属性值)																																							
+			//  --(2.7.2):v_rec_tpm_m 对象如果为空,请先实例化此对象(plsql示例逻辑无此问题)																																							
+			  v_rec_tpm_m.setMachine_code    ( v_mch_code);// --机台号(区分厂家:艾伯纳、中冶南方、宝信)																																							
+			  v_rec_tpm_m.setSchedule_no     ( v_rec_pln_d.getSr_plan_no());// --作业计划号																																							
+			  v_rec_tpm_m.setInner_seq       ( v_rec_pln_d.getSr_seq());// --计划内序号																																							
+			  v_rec_tpm_m.setMaterial_no_vt  ( v_rec_pln_d.getObject_no_vt());// --虚拟原料卷号																																							
+			  v_rec_tpm_m.setPln_steel_code  ( v_rec_mtr_in.getSteel_code());// --计划原料卷牌号																																							
+			  v_rec_tpm_m.setPln_mtr_thk     ( v_rec_mtr_in.getThick());// --计划原料卷厚度																																							
+			  v_rec_tpm_m.setPln_mtr_wdt     ( v_rec_mtr_in.getWidth());// --计划原料卷宽度																																							
+			  v_rec_tpm_m.setPln_mtr_len     ( v_rec_mtr_in.getLength());// --计划原料卷长度																																							
+			  v_rec_tpm_m.setPln_mtr_inn_dia ( v_rec_mtr_in.getDiameter_inn());// --计划原料卷内径																																							
+			  v_rec_tpm_m.setPln_mtr_out_dia ( v_rec_mtr_in.getDiameter_out());// --计划原料卷外径																																							
+			  v_rec_tpm_m.setPln_mtr_thr_wgt ( v_rec_mtr_in.getSingle_weight());// --计划原料卷理重																																							
+			  v_rec_tpm_m.setMaterial_no     ( v_rec_l2_prd_end.getEntry_coil_no());// --原料卷号																																							
+			  v_rec_tpm_m.setMaterial_no_src ( v_rec_ydm_d.getMaterailcoilno());// --原始卷号																																							
+			  v_rec_tpm_m.setMtr_thk         ( v_rec_ydm_d.getThick());// --原料卷厚度																																							
+			  v_rec_tpm_m.setMtr_wdt         ( v_rec_ydm_d.getWidth());// --原料卷宽度																																							
+			  v_rec_tpm_m.setMtr_len         ( v_rec_ydm_d.getLength());// --原料卷长度																																							
+			  v_rec_tpm_m.setMtr_inn_dia     ( v_rec_ydm_d.getDiameter_inn());// --原料卷内径																																							
+			  v_rec_tpm_m.setMtr_out_dia     ( v_rec_ydm_d.getDiameter_out());// --原料卷外径																																							
+			  if(v_rec_ydm_d.getTheoryweight()!=null){
+				  v_rec_tpm_m.setMtr_thr_wgt     ( v_rec_ydm_d.getTheoryweight());// --原料卷理重	
+			  }else{
+				  v_rec_tpm_m.setMtr_thr_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷理重
+			  }																																					
+			  v_rec_tpm_m.setMtr_act_wgt     ( v_rec_ydm_d.getFactweight());// --原料卷实重																																							
+			  v_rec_tpm_m.setSteel_code      ( v_rec_ydm_d.getSteelcode());// --原料卷牌号
+			  
+			  if(!flag){//如果 v_rec_tpm_m 对象为空(即之前无生产实绩),则覆盖 作业日期、班次、班组(与生产开始不同,请注意)
+				  v_rec_tpm_m.setWrk_date     ( v_date);// --作业日期(YYYY-MM-DD)																																							
+				  v_rec_tpm_m.setWrk_ord      ( v_ord); //--作业班次(0常白班、1晚班、2白班、3中班)																																							
+				  v_rec_tpm_m.setWrk_grp      ( v_grp);// --作业班组(0常白班、1甲班、2乙班、3丙班、4丁班)																																							
+				  v_rec_tpm_m.setFeeding_time ( v_end_time); //--上料时间		
+				  v_rec_tpm_m.setTp_str_time  (v_end_time); //--生产开始时间
+				  
+			  }
+			  v_rec_tpm_m.setMemo             ( null);// --备注																																							
+			  v_rec_tpm_m.setHand_over_status ( "0");// --交工状态																																							
+			  v_rec_tpm_m.setHand_over_time   ( null);// --交工时间																																							
+			  v_rec_tpm_m.setHand_over_opr    ( null);// --交工人																																							
+	
+			  if(!flag){
+				  //  --如果 v_rec_tpm_m 对象为空(即之前无生产实绩),则:
+				  v_rec_tpm_m.setCreate_opr( "L2_DR3E09");// --操作人																																							
+				  v_rec_tpm_m.setCreate_time( new Date());// --操作时间																																							
+			  }else{
+				  //  --如果 v_rec_tpm_m 对象不为空(即之前存在生产实绩),则(创建人、创建时间保留原值):
+				  v_rec_tpm_m.setUpdate_opr("L2_DR3E09");// --修改人																																							
+				  v_rec_tpm_m.setUpdate_time(new Date()) ;//--修改时间																																							
+			  }
+			  
+			  //--(3)、开始事物:																																							
+			  //--(3.0)、更新生产跟踪表	??	
+			  try{
+				  int count = this.getMapper(MesTpmTrcMapper.class).countWithCondition(null,"machine_code='"+v_mch_code+"'"); 
+				  if(count<=0){
+					  	MesTpmTrc mcst=new MesTpmTrc();
+					  	mcst.setMachine_code(v_mch_code);
+					  	mcst.setLst_coil_no(v_rec_l2_prd_end.getEntry_coil_no());
+					  	mcst.setLst_end_time(v_end_time);
+					  	mcst.setUpdate_program("Tpm01L2ProduceEnd");
+					  	mcst.setUpdate_time(new Date());
+						this.getMapper(MesTpmTrcMapper.class).insert(mcst);
+				  }else{
+					  MesTpmTrc v_rec_tpm_trc = this.getMapper(MesTpmTrcMapper.class).findById(v_mch_code);
+					  // --(3.0.2)、如果生产结束入口卷号 = 生产跟踪表的当前钢卷号
+					  if(v_rec_l2_prd_end.getEntry_coil_no().equals(v_rec_tpm_trc.getCur_coil_no())){
+						    MesTpmTrc mcst=new MesTpmTrc();
+						  	mcst.setMachine_code(v_mch_code);
+						  	mcst.setLst_coil_no(v_rec_tpm_trc.getCur_coil_no());
+						  	mcst.setLst_str_time(v_rec_tpm_trc.getCur_str_time());
+						  	mcst.setLst_end_time(v_end_time);
+						  	mcst.setCur_coil_no(null);
+						  	mcst.setCur_str_time(null);
+						  	mcst.setUpdate_program("Tpm01L2ProduceEnd");
+						  	mcst.setUpdate_time(new Date());
+							this.getMapper(MesTpmTrcMapper.class).update(mcst);
+					  }else if(v_rec_l2_prd_end.getEntry_coil_no().equals(v_rec_tpm_trc.getLst_coil_no())){//--(3.0.3)、如果生产结束入口卷号 = 生产跟踪表的上一钢卷号
+						  MesTpmTrc mcstcc=new MesTpmTrc();
+						  mcstcc.setMachine_code(v_mch_code);
+						  mcstcc.setLst_end_time(v_end_time);
+						  mcstcc.setUpdate_program("Tpm01L2ProduceEnd");
+						  mcstcc.setUpdate_time(new Date());
+						  this.getMapper(MesTpmTrcMapper.class).update(mcstcc);
+					  }
+				  }
+			  }catch(Exception e){
+				  e.printStackTrace();
+			  }
+			  
+			  //  --(3.1)、删除可能存在的平整作业实绩记录
+			  this.getMapper(MesTpmMMapper.class).doDelete1(v_rec_pln_d.getSr_plan_no(),v_rec_l2_prd_end.getEntry_coil_no());
+			  //  --(3.2)、插入平整作业实绩记录
+			  this.getMapper(MesTpmMMapper.class).insert(v_rec_tpm_m);
+			  
+			  //--(3.3)、调用生产管理接口,执行业计划状态、物料进程状态相关操作(接口由生产管理模块提供);;																																							
+			  //--(3.3.1)、注意:可能在收到此PDO前,已执行过上料操作,并进行了此接口的操作,要求能正常处理,不能影响上述操作																																							
+																																										
+			  //--(3.4)、调用物流模块接口,执行原料卷生产投料出库相关操作(接口由物流模块提供);																																							
+			  //--(3.4.1)、注意:可能在收到此PDO前,已执行过上料操作,原料卷可能已投料出库,此时不能影响上述操作																																							
+				MesTpmM  mcsm=new MesTpmM();
+				mcsm.setMachine_code(v_mch_code);//机台号
+				mcsm.setSchedule_no(v_rec_pln_d.getSr_plan_no());//作业计划号
+				mcsm.setMaterial_no(v_rec_l2_prd_end.getEntry_coil_no());//投料卷号
+				mcsm.setMaterial_no_vt(v_rec_pln_d.getObject_no_vt());//虚拟卷号 
+				List<MesTpmM> lmcsm=new ArrayList<MesTpmM>();
+				//时间
+				SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");//设置日期格式
+			    String date = dfs.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
+			    mcsm.setMemo(date);
+			    lmcsm.add(mcsm);
+			   //调用生产管理接口验证作业计划状态能执行此操作
+				boolean flag2=true;
+				try{
+					this.getBean(MesApiSkinrollingPlanImpl.class).MesTpmMAddValid(lmcsm);
+				}catch(Exception e){
+					flag2=false;
+					e.printStackTrace();
+				}
+				if(flag2){
+					//调用生产管理接口,更改业计划状态(主表、从表)、原料虚拟物料进程状态
+					this.getBean(MesApiSkinrollingPlanImpl.class).MesTpmMAdd(lmcsm); 
+				}
+				
+				//调用物流模块(仓库管理)接口,对原料卷进行生产投料出库操作(接口由物流模块提供);
+				YdmProductOutlist ypo=new YdmProductOutlist();
+				ypo.setCoilno(v_rec_l2_prd_end.getEntry_coil_no());
+				ypo.setOuttype("500501");
+				v_cnt = this.getMapper(YdmProductOutlistMapper.class).count(ypo);
+				if(v_cnt<=0){
+					CommonPage<YdmProductDetail> cp2=new CommonPage<YdmProductDetail>();
+					YdmProductDetail ypdu=new YdmProductDetail();
+					ypdu.setCoilno(v_rec_l2_prd_end.getEntry_coil_no());//注意
+					// 传入操作时间字符串带毫秒
+					ypdu.setMemo(date);
+					cp2.setObject(ypdu);
+					this.getBean(LmsApiServiceImpl.class).doOutStorage(cp2);
+				}
+			v_message = "Tpm01L2ProduceEnd L2生产结束电文处理成功!";  
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2ProduceEnd L2生产结束电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2ProduceEnd L2生产结束电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2机组停机检测实绩电文时调用;																																							
+		2)、	此接口参数为“L2机组停机检测实绩电文JSON对象”(电文编号:DR3E10);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2Stop(IfTpm01L2Stop json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_stop 代替描述
+		IfTpm01L2Stop v_rec_l2_stop=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_机组停机检测为空";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_stop.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_stop.setMsg_time(new Date());
+		}
+		//--(1.2)、将对象,插入L2机组停机检测表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2StopMapper.class).insert(v_rec_l2_stop);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用L2机组停机检测处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Stop_d(v_mch_code,v_rec_l2_stop,
+					v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_stop.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 停机标识 FLAG {"+v_rec_l2_stop.getFlag()+"} "
+					+ "停机时间 TIME {"+v_rec_l2_stop.getTime()+"} 原因代码 REASON_CODE {"+v_rec_l2_stop.getReason_code()+"}";																																							
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2Stop",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+		1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Stop 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_STOP(L2机组停机检测记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_stop
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Stop_d(String v_mch_code,
+			IfTpm01L2Stop v_rec_l2_stop, String v_message) throws Exception{
+		Integer v_cnt=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//  --(2)、开始事物																																							
+			//  --(2.1)、插入平整停开机记录																																							
+			MesTpmStop mts=new MesTpmStop();
+			mts.setMachine_code(v_mch_code);
+			if(v_rec_l2_stop.getFlag()!=null){
+				mts.setStop_flag(v_rec_l2_stop.getFlag()+"");
+			}
+			//??to_date(v_rec_l2_stop.time, 'yyyymmddhh24miss')?
+			Date stop_time = null;
+			try {
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_stop.getTime());
+				stop_time=li.get(0).getCreate_time();
+			} catch (Exception e) {
+				
+			}
+			mts.setStop_time(stop_time);
+			mts.setStop_reason(v_rec_l2_stop.getReason_code());
+			mts.setCreate_opr("L2_DR3E10");
+			mts.setCreate_time(new Date());
+			this.getMapper(MesTpmStopMapper.class).insert(mts);
+			//--(3)、提交事务
+			v_message="Tpm01L2Stop L2机组停机检测电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2Stop L2机组停机检测电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2Stop L2机组停机检测电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2能耗实绩电文时调用;																																							
+		2)、	此接口参数为“L2能耗实绩电文JSON对象”(电文编号:DR3E11);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2Energy(IfTpm01L2Energy json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_energy 代替描述
+		IfTpm01L2Energy v_rec_l2_energy=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_能耗实绩为空";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_energy.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_energy.setMsg_time(new Date());
+		}
+		//--(1.2)、将对象,插入L2能耗实绩表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2EnergyMapper.class).insert(v_rec_l2_energy);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//  --(2)、调用L2能耗实绩处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2Energy_d(v_mch_code,v_rec_l2_energy,
+					v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_energy.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String v_param = "消息时间 MSG_TIME {"+mes_time+"} 日期 TC_TIME {"+v_rec_l2_energy.getTc_time()+"} 班次 SHIFT {"+v_rec_l2_energy.getShift()+"} 班别 CREW {"+v_rec_l2_energy.getCrew()+"} 电 ELECTRICITY {"+v_rec_l2_energy.getElectricity()+
+					  "} 净化水 PURIFY_WATER {"+v_rec_l2_energy.getPurify_water()+"} 循环水 CIRCULATING_WATER {"+v_rec_l2_energy.getCirculating_water()+"} 预留 RESERVER {"+v_rec_l2_energy.getReserver()+"}";																																							
+			
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2Energy",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2Energy 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_ENERGY(L2能耗实绩记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_energy
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2Energy_d(String v_mch_code,IfTpm01L2Energy v_rec_l2_energy, 
+			String v_message) throws Exception{
+		Integer v_cnt=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证日期
+			if(v_rec_l2_energy.getTc_time()==null || "".equals(v_rec_l2_energy.getTc_time())){
+				v_message="日期{"+v_rec_l2_energy.getTc_time()+"} 不能为空!";
+				return v_message;
+			}
+			//--(1.3.1)、验证日期格式
+			String v_wrk_date=null;
+			try {
+				v_wrk_date=this.getMapper(MesTpmMMapper.class).doQueryDate(v_rec_l2_energy.getTc_time());
+			} catch (Exception e) {
+				e.printStackTrace();
+				v_message="日期{"+v_rec_l2_energy.getTc_time()+"} 格式无法识别!约定的标准格式【yyyymmdd】";
+				return v_message;
+			}
+			//  --(1.4)、验证班次(1:晚、2:白、3:中)
+			if(v_rec_l2_energy.getShift()==null){
+				v_message="班次不能为空";
+				return v_message;
+			}else if(!"1".equals(v_rec_l2_energy.getShift()) && !"2".equals(v_rec_l2_energy.getShift())  
+					&& !"3".equals(v_rec_l2_energy.getShift())) {
+				v_message="班次{"+v_rec_l2_energy.getShift()+"}代码无法识别!";
+				return v_message;
+			}
+			String v_wrk_ord=v_rec_l2_energy.getShift();
+			
+			//  --(2)、开始事物																																							
+			//--(2.1)、验证平整能耗实绩是否存在			
+			MesTpmEnergy mte=new MesTpmEnergy();
+			mte.setMachine_code(v_mch_code);
+			mte.setWrk_date(v_wrk_date);
+			mte.setWrk_ord(v_wrk_ord);
+		    v_cnt = this.getMapper(MesTpmEnergyMapper.class).count(mte);
+		    if(v_cnt>0){
+		    	//--(2.2)、存在则更新记录
+		    	MesTpmEnergy m=new MesTpmEnergy();
+		    	m.setMachine_code(v_mch_code);
+		    	m.setWrk_date(v_wrk_date);
+		    	m.setWrk_ord(v_wrk_ord);
+		    	m.setCsm_elec(v_rec_l2_energy.getElectricity()==null?null:v_rec_l2_energy.getElectricity().doubleValue());
+		    	m.setCsm_prf_water(v_rec_l2_energy.getPurify_water()==null?null:v_rec_l2_energy.getPurify_water().doubleValue()/100);
+		    	m.setCsm_ccl_water(v_rec_l2_energy.getCirculating_water()==null?null:v_rec_l2_energy.getCirculating_water().doubleValue()/100);
+		    	m.setUpdate_opr("L2_DR3E11");
+		    	m.setUpdate_time(new Date());
+		    	this.getMapper(MesTpmEnergyMapper.class).update(m);
+		    }else{
+		    	// --(2.3)、不存在则插入记录
+		    	MesTpmEnergy m=new MesTpmEnergy();
+		    	m.setMachine_code(v_mch_code);
+		    	m.setWrk_date(v_wrk_date);
+		    	m.setWrk_ord(v_wrk_ord);
+		    	m.setCsm_elec(v_rec_l2_energy.getElectricity()==null?null:v_rec_l2_energy.getElectricity().doubleValue());
+		    	m.setCsm_prf_water(v_rec_l2_energy.getPurify_water()==null?null:v_rec_l2_energy.getPurify_water().doubleValue()/100);
+		    	m.setCsm_ccl_water(v_rec_l2_energy.getCirculating_water()==null?null:v_rec_l2_energy.getCirculating_water().doubleValue()/100);
+		    	m.setCreate_opr("L2_DR3E11");
+		    	m.setCreate_time(new Date());
+		    	this.getMapper(MesTpmEnergyMapper.class).insert(m);
+		    }
+			//--(3)、提交事务
+			v_message="Tpm01L2Energy L2能耗实绩电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2Energy L2能耗实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2Energy L2能耗实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+		
+	}
+
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2应答L3指示删除电文时调用;																																							
+		2)、	此接口参数为“L2应答L3指示删除电文JSON对象”(电文编号:DR3E12);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2AswRevoke(IfTpm01L2AnswerRevoke json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_asw_rvk 代替描述
+		IfTpm01L2AnswerRevoke v_rec_l2_asw_rvk=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_应答L3指示删除为空";
+			return v_message;
+		}
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_asw_rvk.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_asw_rvk.setMsg_time(new Date());
+		}
+		//--(1.2)、将对象,插入L2应答L3指示删除表(单独的事务)
+		try{
+			this.getMapper(IfTpm01L2AnswerRevokeMapper.class).insert(v_rec_l2_asw_rvk);
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用应答L2应答L3指示删除处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2AswRevoke_d(v_mch_code,v_rec_l2_asw_rvk.getEntry_coil_no(),
+					v_rec_l2_asw_rvk.getResult(),v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_asw_rvk.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 入口卷号 ENTRY_COIL_NO {"+v_rec_l2_asw_rvk.getEntry_coil_no()+"} 结果 RESULT {"+v_rec_l2_asw_rvk.getResult()+"}";																																							
+			
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2AswRevoke",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	    1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2AswRevoke 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_ENTRY_COIL_NO(入口卷号)、V_RESULT(操作结果(1:成功、0:失败))																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param entry_coil_no
+	 * @param result
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2AswRevoke_d(String v_mch_code, String v_entry_coil_no,
+			Long v_result, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证入口卷号不为空
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_message="入口卷号{"+v_entry_coil_no+"} 未指定入口卷号!";
+				return v_message;
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.1)、验证入口卷对应的作业计划信息存在																																							
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount1(v_mch_code,v_entry_coil_no);
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+				return v_message;
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+				return v_message;
+			}else{
+				List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、验证已下发过PDI
+			if(v_rec_pln_d.getSend_flag()==null || "0".equals(v_rec_pln_d.getSend_flag())){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 还未下发指示顺序或PDI数据!";
+				return v_message;
+			}
+			//  --(2.3)、验证当前还未生产交工
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_rec_pln_d.getSr_plan_no());
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    MesTpmM v_rec_tpm_m =lmcam.get(0);
+			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+			    	v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工!";
+			    	return v_message;
+			    }
+			}
+			//  --(3)、开始事物:																																							
+			//  --(3.1)、如果应答电文中,RESULT = 0 即L2指示删除操作成功时,才修改L3对应指示状态																																							
+			if(v_result==0){
+				this.getMapper(PlnSkinrollingPlanDetailMapper.class).doUpdate4("L2Asw", v_rec_pln_d.getSr_plan_no(), v_entry_coil_no);
+			}
+			//--(4)、提交事务
+			v_message="Tpm01L2AswRevoke L2应答L3指示删除电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2AswRevoke L2应答L3指示删除电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2AswRevoke L2应答L3指示删除电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2装辊实绩电文时调用;																																							
+		2)、	此接口参数为“L2装辊实绩电文JSON对象”(电文编号:DR3E13);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2RllLoad(IfTpm01L2RllLoad json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_rll_load 代替描述
+		IfTpm01L2RllLoad v_rec_l2_rll_load=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_装辊实绩为空";
+			return v_message;
+		}
+		//--(1.0)、创建L2装辊实绩表记录号
+		Long v_serial_no=this.getMapper(IfTpm01L2RllLoadMapper.class).doQuery1();
+		//--(1.0.0)、赋值
+		v_rec_l2_rll_load.setSerial_no(v_serial_no);
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_rll_load.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_rll_load.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入 L2装辊实绩表 以及 L2装辊实绩表-上下辊表(单独的事务)																																							
+		//  --(1.2.1)、此电文需要拆分为 主从表(1:2),其中上下辊为子表(编码时注意处理)	??	  																																					
+		try{
+			this.getMapper(IfTpm01L2RllLoadMapper.class).insert(v_rec_l2_rll_load);
+			//轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊)
+			if(v_rec_l2_rll_load.getRoll_type()!=null){
+				//W:工作辊、B:支承辊、I:中间辊)
+				if(v_rec_l2_rll_load.getRoll_type().equals("WKR")){
+					v_rec_l2_rll_load.setRoll_type("W");
+				}else if(v_rec_l2_rll_load.getRoll_type().equals("BUR")){
+					v_rec_l2_rll_load.setRoll_type("B");
+				}else if(v_rec_l2_rll_load.getRoll_type().equals("IMR")){
+					v_rec_l2_rll_load.setRoll_type("I");
+				}
+			}
+			
+			List<IfTpm01L2RllLoadD> litlrd = v_rec_l2_rll_load.getLitlrd();
+			if(litlrd!=null && litlrd.size()>1){
+				//this.getMapper(IfTpm01L2RllLoadDMapper.class).insert(v_rec_l2_rll_load_t);
+				//this.getMapper(IfTpm01L2RllLoadDMapper.class).insert(v_rec_l2_rll_load_b);
+				IfTpm01L2RllLoadD ilrld1=new IfTpm01L2RllLoadD();
+				ilrld1.setSerial_no(v_serial_no);//记录号(由业务接口创建,唯一标识消息)
+				ilrld1.setRoll_id(litlrd.get(0).getRoll_id());//轧辊号 ??
+				//ilrld1.setRoll_pos(litlrd.get(0).getReserve());//轧辊位置(T:上辊、B:下辊) ??
+				ilrld1.setRoll_pos("T");//轧辊位置(T:上辊、B:下辊) ??
+				ilrld1.setReserve(litlrd.get(0).getReserve());//预留
+				this.getMapper(IfTpm01L2RllLoadDMapper.class).insert(ilrld1);
+				IfTpm01L2RllLoadD ilrld2=new IfTpm01L2RllLoadD();
+				ilrld2.setSerial_no(v_serial_no);//记录号(由业务接口创建,唯一标识消息)
+				ilrld2.setRoll_id(litlrd.get(1).getRoll_id());//轧辊号 ??
+				//ilrld2.setRoll_pos(litlrd.get(1).getReserve());//轧辊位置(T:上辊、B:下辊) ??
+				ilrld2.setRoll_pos("B");//轧辊位置(T:上辊、B:下辊) ??
+				ilrld2.setReserve(litlrd.get(1).getReserve());//预留
+				this.getMapper(IfTpm01L2RllLoadDMapper.class).insert(ilrld2);
+			}
+			
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用L2装辊实绩处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2RllLoad_d(v_mch_code,v_rec_l2_rll_load,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_rll_load.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 记录号 SERIAL_NO {"+v_rec_l2_rll_load.getSerial_no()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2RllLoad",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	  	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2RllLoad 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_RLL_LOAD(L2装辊实绩记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_rll_load
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2RllLoad_d(String v_mch_code,
+			IfTpm01L2RllLoad v_rec_l2_rll_load, String v_message) throws Exception{
+		Integer v_cnt=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--此电文需要轧辊管理功能完成后,再具体实现,先搭起此代码框架  ??
+			//执行上机操作
+			
+			/**
+			 * 动作处理_上机按钮
+			 * object:
+			 * mount_time:上机时间    比如:2018-11-27 09:11:43
+			 * mount_reason_code:上机原因代码(390203%)
+			 * mount_reason_desc:上机原因描述
+			 * stand_id:机架号
+			 * mount_memo:上机备注
+			 * 
+			 * memo1:配辊记录号
+			 * */
+			CommonPage<DevRollerPairM> sum=new CommonPage<>();
+		    sum.setObject(new DevRollerPairM());
+			
+			try {
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_rll_load.getMount_time());
+				sum.getObject().setMount_time(li.get(0).getCreate_time());
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			if(sum.getObject().getMount_time()==null){
+				sum.getObject().setMount_time(new Date());
+			}
+			sum.getObject().setMount_reason_code(v_rec_l2_rll_load.getReason_code());
+			sum.getObject().setMount_ord(v_rec_l2_rll_load.getShift());
+			sum.getObject().setMount_grp(v_rec_l2_rll_load.getCrew());
+			sum.getObject().setRoller_type(v_rec_l2_rll_load.getRoll_type());
+			if(v_rec_l2_rll_load.getStand_id()!=null){
+				sum.getObject().setStand_id(v_rec_l2_rll_load.getStand_id()+"");
+			}
+			sum.getObject().setMount_memo("收集L2装辊实绩信息");
+			List<IfTpm01L2RllLoadD> litlrd = v_rec_l2_rll_load.getLitlrd();
+			if(litlrd!=null && litlrd.size()>1){
+				DevRollerPairM drpm=new DevRollerPairM();
+				DevRollerInfo dri0 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(0).getRoll_id());
+				DevRollerInfo dri1 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(1).getRoll_id());
+				if(litlrd.get(0).getRoll_id()!=null && !"".equals(litlrd.get(0).getRoll_id()) &&
+						litlrd.get(1).getRoll_id()!=null && !"".equals(litlrd.get(1).getRoll_id()) &&	
+					dri0!=null && dri1!=null && dri0.getRoller_no()!=null && dri1.getRoller_no()!=null){
+					DevRollerInfo dri0T=new DevRollerInfo();
+					dri0T.setRoller_no(litlrd.get(0).getRoll_id());
+					dri0T.setRoller_position("T");
+					this.getMapper(DevRollerInfoMapper.class).update(dri0T);
+					DevRollerInfo dri1B=new DevRollerInfo();
+					dri1B.setRoller_no(litlrd.get(1).getRoll_id());
+					dri1B.setRoller_position("B");
+					this.getMapper(DevRollerInfoMapper.class).update(dri1B);
+					
+					if("T".equals(dri0.getRoller_position())){
+						drpm.setT_roller_no(dri0.getRoller_no());
+					}else if("B".equals(dri0.getRoller_position())){
+						drpm.setB_roller_no(dri0.getRoller_no());
+					}
+					if("T".equals(dri1.getRoller_position())){
+						drpm.setT_roller_no(dri1.getRoller_no());
+					}else if("B".equals(dri1.getRoller_position())){
+						drpm.setB_roller_no(dri1.getRoller_no());
+					}
+					if(drpm.getT_roller_no()!=null && drpm.getB_roller_no()!=null){
+						drpm.setStatus("1");//配对状态,进行上机操作
+						drpm.setMachine_code("M0007");
+						List<DevRollerPairM> ldrpm = this.getMapper(DevRollerPairMMapper.class).find(drpm, 0, 0);
+//						if(ldrpm==null || ldrpm.size()<=0){
+//							try{
+//								CommonPage<DevRollerInfo> sumxx=new CommonPage<DevRollerInfo>();
+//								sumxx.setMemo2("1");//机架号
+//								sumxx.setMemo3(dri0.getRoller_no());//上辊编号
+//								sumxx.setMemo4(dri1.getRoller_no());//下辊编号
+//								this.getBean(DevRollerPairDServiceImpl.class).doRollerPairWeb(sumxx);
+//							}catch(Exception e){
+//								e.printStackTrace();
+//							}
+//						}
+						if(ldrpm!=null && ldrpm.size()>0){
+							sum.setMemo1(ldrpm.get(0).getSerial_no());
+							this.getBean(DevRollerPairMServiceImpl.class).doRollerPairUpWeb(sum);
+						}
+					}
+					
+				}
+				
+			}
+			
+			//--(4)、提交事务
+			v_message="Tpm01L2RllLoad L2装辊实绩电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2RllLoad L2装辊实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2RllLoad L2装辊实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	
+	/**
+		1)、	此接口为纯后台逻辑,不与前端页面交互,收到L2换辊实绩电文时调用;																																							
+		2)、	此接口参数为“L2换辊实绩电文JSON对象”(电文编号:DR3E14);																																							
+	 * @param json
+	 * @return
+	 */
+	public String Tpm01L2RllRmv(IfTpm01L2RllRmv json){
+		String v_message="";
+		String v_mch_code="M0007";
+		//--(1)、参数为JSON对象,先转换为Java实体类,此处以 v_rec_l2_rll_rmv 代替描述
+		IfTpm01L2RllRmv v_rec_l2_rll_rmv=json;
+		if(json==null ){
+			v_message="参数错误:二级接口-平整机_L2_换辊实绩为空";
+			return v_message;
+		}
+		//--(1.0)、创建L2装辊实绩表记录号
+		Long v_serial_no=this.getMapper(IfTpm01L2RllRmvMapper.class).doQuery1();
+		//--(1.0.0)、赋值
+		v_rec_l2_rll_rmv.setSerial_no(v_serial_no);
+		//  --(1、1)、如果电文中(接口参数)未包含消息时间(MSG_TIME),或为空值,则赋值为当前时刻
+		if(v_rec_l2_rll_rmv.getMsg_time()==null){//作业时间为null,则取当前时间
+			v_rec_l2_rll_rmv.setMsg_time(new Date());
+		}
+		//  --(1.2)、将对象,插入 L2换辊实绩表 以及 L2换辊实绩表-上下辊表(单独的事务)																																							
+		//  --(1.2.1)、此电文需要拆分为 主从表(1:2),其中上下辊为子表(编码时注意处理)																																							
+		try{
+			this.getMapper(IfTpm01L2RllRmvMapper.class).insert(v_rec_l2_rll_rmv);
+			//轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊)
+			if(v_rec_l2_rll_rmv.getRoll_type()!=null){
+				//W:工作辊、B:支承辊、I:中间辊)
+				if(v_rec_l2_rll_rmv.getRoll_type().equals("WKR")){
+					v_rec_l2_rll_rmv.setRoll_type("W");
+				}else if(v_rec_l2_rll_rmv.getRoll_type().equals("BUR")){
+					v_rec_l2_rll_rmv.setRoll_type("B");
+				}else if(v_rec_l2_rll_rmv.getRoll_type().equals("IMR")){
+					v_rec_l2_rll_rmv.setRoll_type("I");
+				}
+			}
+			
+			
+			List<IfTpm01L2RllRmvD> litlrd = v_rec_l2_rll_rmv.getLitlrrd();
+			if(litlrd!=null && litlrd.size()>1){
+				IfTpm01L2RllRmvD ilrld1=new IfTpm01L2RllRmvD();
+				ilrld1.setSerial_no(v_serial_no);//记录号(由业务接口创建,唯一标识消息)
+				ilrld1.setRoll_id(litlrd.get(0).getRoll_id());//轧辊号 ??
+				DevRollerInfo dri0 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(0).getRoll_id());
+				ilrld1.setRoll_pos(dri0==null?"":"T");//轧辊位置(T:上辊、B:下辊) ??
+				ilrld1.setRolled_length(litlrd.get(0).getRolled_length());//轧制公里数(km)??
+				ilrld1.setRolled_weight(litlrd.get(0).getRolled_weight());//轧制量(t)
+				ilrld1.setRolled_time(litlrd.get(0).getRolled_time());//生产时间(hours)
+			    ilrld1.setReserve(litlrd.get(0).getReserve());//预留
+				this.getMapper(IfTpm01L2RllRmvDMapper.class).insert(ilrld1);
+				
+				IfTpm01L2RllRmvD ilrld2=new IfTpm01L2RllRmvD();
+				ilrld2.setSerial_no(v_serial_no);//记录号(由业务接口创建,唯一标识消息)
+				ilrld2.setRoll_id(litlrd.get(1).getRoll_id());//轧辊号 ??
+				DevRollerInfo dri1 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(1).getRoll_id());
+				ilrld2.setRoll_pos(dri1==null?"":"B");//轧辊位置(T:上辊、B:下辊) ??
+				ilrld2.setRolled_length(litlrd.get(1).getRolled_length());//轧制公里数(km)??
+				ilrld2.setRolled_weight(litlrd.get(1).getRolled_weight());//轧制量(t)
+				ilrld2.setRolled_time(litlrd.get(1).getRolled_time());//生产时间(hours)
+			    ilrld2.setReserve(litlrd.get(1).getReserve());//预留
+				this.getMapper(IfTpm01L2RllRmvDMapper.class).insert(ilrld2);
+			}
+			
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		//--(2)、调用L2换辊实绩处理函数
+		try{
+			v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L2RllRmv_d(v_mch_code,v_rec_l2_rll_rmv,v_message);
+		}catch(Exception e){
+			e.printStackTrace();
+			v_message=e.getMessage();
+		}finally{
+			String mes_time=DateUtil.formatDate(v_rec_l2_rll_rmv.getMsg_time(), "yyyy-MM-dd HH:mm:ss");
+			//  --(5)、拼接参数
+			String  v_param = "消息时间 MSG_TIME {"+mes_time+"} 记录号 SERIAL_NO {"+v_rec_l2_rll_rmv.getSerial_no()+"}";
+			//  --(6)、写接口日志:与业务处理分开,单独的事务
+			try{
+				 this.getMapper(IfTpm01LogMapper.class).doInsert(null,"Tpm01L2RllRmv",v_param,v_message);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+		}
+		return v_message;
+	}
+	
+	/**
+	 * 	1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由 Tpm01L2RllRmv 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_REC_L2_RLL_RMV(L2换辊实绩记录)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param v_mch_code
+	 * @param v_rec_l2_rll_rmv
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L2RllRmv_d(String v_mch_code,
+			IfTpm01L2RllRmv v_rec_l2_rll_rmv, String v_message) throws Exception{
+		Integer v_cnt=null;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--此电文需要轧辊管理功能完成后,再具体实现,先搭起此代码框架  ??
+			//下机操作
+			/**
+			 * 动作处理_下机按钮
+			 * object:
+			 * dismount_time:下机时间    比如:2018-11-27 09:11:43
+			 * dismount_reason_code:下机原因代码(390203%)
+			 * dismount_reason_desc:下机原因描述
+			 * rll_num:轧制卷数
+			 * rll_len:轧制里程数(km)
+			 * rll_wgt:轧制吨数(吨)
+			 * dismount_memo:下机备注
+			 * 
+			 * memo1:配辊记录号
+			 * */
+			
+			CommonPage<DevRollerPairM> sum=new CommonPage<>();
+		    sum.setObject(new DevRollerPairM());
+			
+			try {
+				List<MesCrAnnealM> li =this.getMapper(MesCrAnnealMMapper.class).doQueryDate(v_rec_l2_rll_rmv.getDismount_time());
+				sum.getObject().setDismount_time(li.get(0).getCreate_time());
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			if(sum.getObject().getDismount_time()==null){
+				sum.getObject().setDismount_time(new Date());
+			}
+			sum.getObject().setDismount_reason_code(v_rec_l2_rll_rmv.getReason_code());
+			sum.getObject().setDismount_ord(v_rec_l2_rll_rmv.getShift());
+			sum.getObject().setDismount_grp(v_rec_l2_rll_rmv.getCrew());
+			sum.getObject().setRoller_type(v_rec_l2_rll_rmv.getRoll_type());
+			if(v_rec_l2_rll_rmv.getStand_id()!=null){
+				sum.getObject().setStand_id(v_rec_l2_rll_rmv.getStand_id()+"");
+			}
+			sum.getObject().setDismount_memo("收集L2换辊实绩信息");
+			
+			List<IfTpm01L2RllRmvD> litlrd = v_rec_l2_rll_rmv.getLitlrrd();
+			if(litlrd!=null && litlrd.size()>1){
+				sum.getObject().setRll_len(litlrd.get(0).getRolled_length()==null?null:litlrd.get(0).getRolled_length().doubleValue());
+				//sum.getObject().setRll_num(litlrd.get(0).get);// ??轧制卷数
+				sum.getObject().setRll_wgt(litlrd.get(0).getRolled_weight()==null?null:litlrd.get(0).getRolled_weight().doubleValue());
+				DevRollerPairM drpm=new DevRollerPairM();
+				DevRollerInfo dri0 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(0).getRoll_id());
+				DevRollerInfo dri1 = this.getMapper(DevRollerInfoMapper.class).findById(litlrd.get(1).getRoll_id());
+				if(litlrd.get(0).getRoll_id()!=null && !"".equals(litlrd.get(0).getRoll_id()) &&
+						litlrd.get(1).getRoll_id()!=null && !"".equals(litlrd.get(1).getRoll_id()) &&	
+						dri0!=null && dri1!=null && dri0.getRoller_no()!=null && dri1.getRoller_no()!=null){
+					DevRollerInfo dri0T=new DevRollerInfo();
+					dri0T.setRoller_no(litlrd.get(0).getRoll_id());
+					dri0T.setRoller_position("T");
+					this.getMapper(DevRollerInfoMapper.class).update(dri0T);
+					DevRollerInfo dri1B=new DevRollerInfo();
+					dri1B.setRoller_no(litlrd.get(1).getRoll_id());
+					dri1B.setRoller_position("B");
+					this.getMapper(DevRollerInfoMapper.class).update(dri1B);
+					
+					
+					if("T".equals(dri0.getRoller_position())){
+						drpm.setT_roller_no(dri0.getRoller_no());
+					}else if("B".equals(dri0.getRoller_position())){
+						drpm.setB_roller_no(dri0.getRoller_no());
+					}
+					if("T".equals(dri1.getRoller_position())){
+						drpm.setT_roller_no(dri1.getRoller_no());
+					}else if("B".equals(dri1.getRoller_position())){
+						drpm.setB_roller_no(dri1.getRoller_no());
+					}
+					if(drpm.getT_roller_no()!=null && drpm.getB_roller_no()!=null){
+						drpm.setStatus("2");//上机状态,进行下机操作
+						drpm.setMachine_code("M0007");
+						List<DevRollerPairM> ldrpm = this.getMapper(DevRollerPairMMapper.class).find(drpm, 0, 0);
+						if(ldrpm!=null && ldrpm.size()>0){
+							sum.setMemo1(ldrpm.get(0).getSerial_no());
+							this.getBean(DevRollerPairMServiceImpl.class).doRollerPairDownWeb(sum);
+						}
+					}
+					
+				}
+				
+			}
+			
+			//--(4)、提交事务
+			v_message="Tpm01L2RllRmv L2换辊实绩电文处理成功!";
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L2RllRmv L2换辊实绩电文处理失败!"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L2RllRmv L2换辊实绩电文处理失败!"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由“平整机作业管理-【下发PDI按钮】”方法 Tpm01L3SendPdi 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_PLAN_NO(作业计划号)、V_ENTRY_COIL_NO(入口卷号)、V_OPR_NAME(操作人)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param memo1
+	 * @param schedule_no
+	 * @param material_no
+	 * @param userName
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3SendPdi_d(String v_mch_code, String v_plan_no,
+			String v_entry_coil_no, String v_opr_name, String v_message) throws Exception{
+		Integer v_cnt=null;
+		String reduce_code = null , spm_elong_code = null ;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		try{
+			//  --(1.1)、验证传入参数的基本有效性
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证作业计划号不为空
+			if(v_plan_no==null || "".equals(v_plan_no)){
+				v_message="未指定作业计划号!";
+				return v_message;
+			}
+			//--(1.4)、验证入口卷号不为空
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_message="未指定入口卷号!";
+				return v_message;
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.1)、验证入口卷对应的作业计划信息存在  																																							
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount6(v_mch_code, v_plan_no,v_entry_coil_no);
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+				return v_message;
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+				return v_message;
+			}else{
+				List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//--(2.2)、验证入口卷对应的库存明细存在
+			List<YdmProductDetail> v_rec_ydm_d_list = this.getMapper(YdmProductDetailMapper.class).findWithCondition(null, "coilno='"+v_entry_coil_no+"'", null, 0, 0);
+			if(v_rec_ydm_d_list==null || v_rec_ydm_d_list.size()<=0){
+				v_message="入口卷号{"+v_entry_coil_no+"}库存明细记录不存在!";
+				return v_message;
+			}
+			YdmProductDetail v_rec_ydm_d=v_rec_ydm_d_list.get(0);
+			//--(2.3)、验证入口卷对应的虚拟物料信息存在
+			List<PlnMaterielDetail> v_rec_mtr_in_list = this.getMapper(PlnMaterielDetailMapper.class).findWithCondition(null, 
+						"object_no_vt='"+v_rec_pln_d.getObject_no_vt()+"' and object_no='"+v_rec_pln_d.getObject_no()+"'", null, 0, 0);
+			if(v_rec_mtr_in_list==null || v_rec_mtr_in_list.size()<=0){
+				v_message="入口卷号{"+v_entry_coil_no+"} 虚拟卷号{"+v_rec_pln_d.getObject_no_vt()+"} 虚拟物料信息不存在!";
+				return v_message;
+			}
+			PlnMaterielDetail v_rec_mtr_in=v_rec_mtr_in_list.get(0);
+			
+			//  --(2.4)、验证当前还未生产交工
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_plan_no);
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    MesTpmM v_rec_tpm_m =lmcam.get(0);
+//			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+//			    	v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_plan_no+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工,不能重复下发PDI!";
+//			    	return v_message;
+//			    }
+			}
+			//  --(3)、获取其它相关信息,注意忽略错误  																																							
+			//  --(3.1)、获取牌号/钢种名称	
+			String v_steel=null;
+			List<ComBaseSteel> lcbs = this.getMapper(ComBaseSteelMapper.class).findWithCondition(null, "steel_code='"+v_rec_ydm_d.getSteelcode()+"'", null, 0, 0);
+			if(lcbs==null || lcbs.size()<=0){
+				v_steel=v_rec_ydm_d.getSteelcode();
+			}else{
+				if(lcbs.get(0).getSteel_name()==null){
+					v_steel=lcbs.get(0).getSteel_code();
+				}else{
+					v_steel=lcbs.get(0).getSteel_name();
+				}
+			}
+			//--(3.2)、获取入口卷库位
+			String v_entry_location=this.getMapper(MesCrAnnealMMapper.class).doQueryLocation(v_entry_coil_no);
+			if(v_entry_location==null){
+				v_entry_location="";
+			}
+			IfTpm01L3Pdi v_rec_pdi=new IfTpm01L3Pdi();
+			//  --(4)、调用PDI数据下发函数																																							
+			//  --(4.1)、PDI数据属性赋值(注意:记录号、下发时间、下发人,到调用接函数内才赋值)																																							
+			  v_rec_pdi.setEntry_coil_no        ( v_entry_coil_no);// --入口卷号																																							
+			  v_rec_pdi.setExit_coil_no         ( v_rec_ydm_d.getMaterailcoilno());// --出口卷号	2019-09-26 panbin 修改 传原料卷号																																						
+			  v_rec_pdi.setEntry_coil_source    ( 1l);// --入口卷来源(0:自产、1:外购)																																							
+			  v_rec_pdi.setPlan_no              ( v_rec_pln_d.getSr_plan_no());// --计划号	
+			  if(v_rec_ydm_d.getThick()!=null){
+				  Double thick=v_rec_ydm_d.getThick()*1000;
+				  v_rec_pdi.setEntry_thichness( v_rec_ydm_d.getThick()==null?null:thick.longValue());// --入口热卷厚度(um)
+			  }
+			  																																							
+			  v_rec_pdi.setEntry_width          ( v_rec_ydm_d.getWidth()==null?null:v_rec_ydm_d.getWidth().longValue());// --入口热卷宽度(mm)																																							
+			  v_rec_pdi.setEntry_weight         ( v_rec_ydm_d.getFactweight()==null?null:v_rec_ydm_d.getFactweight().longValue());// --入口热卷重量(kg)																																							
+			  v_rec_pdi.setInner_diameter       ( v_rec_ydm_d.getDiameter_inn()==null?null:v_rec_ydm_d.getDiameter_inn().longValue());// --入口热卷内径(mm)																																							
+			  v_rec_pdi.setOuter_diameter       ( v_rec_ydm_d.getDiameter_out()==null?null:v_rec_ydm_d.getDiameter_out().longValue());// --入口热卷外径(mm)																																							
+			  v_rec_pdi.setHarderness_annealing ( null);// --退火后硬度																																							
+			  v_rec_pdi.setTemp_annealing       ( null);// --退火温度(℃)																																							
+			  v_rec_pdi.setSpm_mode             ( 0l);// --平整模式(0:平整、1:轧制),需要生产或质量提供接口																																							
+			  v_rec_pdi.setSpm_elong            ( null);// --平整伸长率(0.01%,e.g. 255 => 2.55 %  ,平整模式),需要生产或质量提供接口																																							
+			  v_rec_pdi.setReduce               ( null);// --压下率(%),需要生产或质量提供接口																																							
+			  v_rec_pdi.setSleeve               ( 0l);// --套筒(0:无、1:有),需要生产或质量提供接口																																							
+			  v_rec_pdi.setOuter_dia_sleeve     ( null);// --出口套筒外径(520~600),需要生产或质量提供接口																																							
+			  v_rec_pdi.setWeight_sleeve        ( null);// --套筒重量(kg),需要生产或质量提供接口																																							
+			  v_rec_pdi.setGb_steel_grade       ( v_steel);// --国标钢种																																							
+			  v_rec_pdi.setSteel_grade          ( v_steel);// --钢种																																							
+			  v_rec_pdi.setPreced_process_code  ( "");// --上道工序代码																																							
+			  v_rec_pdi.setNext_process_code    ( "");// --后道工序代码																																							
+			  v_rec_pdi.setComment              ( "");// --备注信息																																							
+			  v_rec_pdi.setExit_yard_location   ( "");// --出口库位																																							
+			  v_rec_pdi.setEntry_yard_location  ( v_entry_location);// --入口库位																																							
+			  v_rec_pdi.setReserve              ( "");// --预留	
+			
+			// 2019-09-26 panbin 调整从质量获取延伸率和压下率并且默认平整模式  延伸率不为空(平整) 压下率不为空 (轧制)
+			// 获取工艺标准
+			List<SlmOrdDesignMscTicItem> items = new ArrayList<SlmOrdDesignMscTicItem>();
+			try {
+				items = this.getBean(MesApiDesignInfoImpl.class).getPrc_Params(v_rec_pln_d.getObject_no_vt(),
+						v_mch_code);
+				reduce_code = this.getMapper(ComBaseInfoMapper.class).findById("20100201").getBase_name();
+				spm_elong_code = this.getMapper(ComBaseInfoMapper.class).findById("20100202").getBase_name();
+			} catch (Exception e) {
+				e.printStackTrace();
+				v_message = e.getMessage();
+			}
+			if (Utils.isNotEmpty(items)) {
+				for (SlmOrdDesignMscTicItem sodm : items) {
+					// 压下率 Reduce
+					if (reduce_code.equals(sodm.getCraft_param_code())
+							&& Utils.isNotEmpty(sodm.getMin_value())) {
+						Integer reduce=(int)(Double.valueOf(sodm.getMin_value())*100);
+						v_rec_pdi.setReduce(reduce.longValue());
+					}
+					// 延伸率 Spm_elong
+					if (spm_elong_code.equals(sodm.getCraft_param_code())
+							&& Utils.isNotEmpty(sodm.getMin_value())) {
+						Integer spm_elong=(int)(Double.valueOf(sodm.getMin_value())*100);
+						v_rec_pdi.setSpm_elong(spm_elong.longValue());
+					}
+				}
+			}
+			// 平整模式
+			if (Utils.isNotEmpty(v_rec_pdi.getReduce())) {
+				v_rec_pdi.setSpm_mode(1l);
+			} else if (Utils.isNotEmpty(v_rec_pdi.getSpm_elong())) {
+				v_rec_pdi.setSpm_mode(0l);
+			}
+			  try{
+				  Integer v_success=null;
+				  v_message=this.getBean(MesApiTpmPdiPdoImpl.class).Tpm01L3Pdi(v_rec_pdi,v_opr_name,v_success,v_message);
+			  }catch(Exception e){
+				  e.printStackTrace();
+				  v_message=e.getMessage();
+			  }
+			  if(v_message==null){
+					v_message="";
+			  }
+			 String v_success_str="";
+			 if(v_message.contains("_success:")){
+				v_success_str=v_message.substring(v_message.length()-1);
+				v_message=v_message.substring(0, v_message.lastIndexOf("_success"));
+			 }
+			 if("1".equals(v_success_str)){
+				 //v_message="PDI数据下发成功!"+v_message;
+			 }else if("2".equals(v_success_str)){
+				 v_message="PDI数据下发部分成功!"+v_message;
+			 }else{
+				 //v_message="PDI数据下发失败!"+v_message;
+			 }
+			
+		}catch(Exception e){
+			e.printStackTrace();
+			if(e.getMessage()!=null && e.getMessage().length()>200){
+				v_message="Tpm01L3SendPdi_d处理出错:"+e.getMessage().substring(0,200);
+			}else{
+				v_message="Tpm01L3SendPdi_d处理出错:"+e.getMessage();
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	/**
+	 *  1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由“平整机作业管理-【撤销PDI按钮】”方法 Tpm01L3Revoke 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_PLAN_NO(作业计划号)、V_ENTRY_COIL_NO(入口卷号)、V_OPR_NAME(操作人)																																							
+		3)、	接口参数 OUT:V_SUCCESS(操作成功标志(1:成功、0:失败))、V_MESSAGE(操作结果信息)																																							
+	 * @param memo1
+	 * @param schedule_no
+	 * @param material_no
+	 * @param userName
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3Revoke_d(String v_mch_code, String v_plan_no,
+			String v_entry_coil_no, String v_opr_name, Integer v_success,
+			String v_message) throws Exception{
+		//--(0)、置输出参数:操作成功标志为0:失败
+		v_success=0;
+		Integer v_cnt=null;
+		Integer v_flag=null;
+		PlnSkinrollingPlanDetail v_rec_pln_d=new PlnSkinrollingPlanDetail();
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证作业计划号不为空
+			if(v_plan_no ==null || "".equals(v_plan_no)){
+				v_message="未指定作业计划号!";
+				return v_message;
+			}
+			//  --(1.4)、验证入口卷号不为空
+			if(v_entry_coil_no==null || "".equals(v_entry_coil_no)){
+				v_message="未指定入口卷号!";
+				return v_message;
+			}
+			//  --(2)、验证业务数据合理性																																							
+			//  --(2.1)、验证入口卷对应的作业计划信息存在																																							
+			v_cnt=this.getMapper(PlnSkinrollingPlanMapper.class).doCount6(v_mch_code,v_plan_no,v_entry_coil_no);
+			if(v_cnt<=0){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"} 找不到作业计划信息!";
+				return v_message;
+			}else if(v_cnt>1){
+				v_message="机台代码{"+v_mch_code+"} 入口卷号{"+v_entry_coil_no+"}存在2条或以上的作业计划信息!";
+				return v_message;
+			}else{
+				List<PlnSkinrollingPlanDetail> v_rec_pln_d_list=this.getMapper(PlnSkinrollingPlanDetailMapper.class).doQuery3(v_mch_code, v_entry_coil_no);
+				v_rec_pln_d=v_rec_pln_d_list.get(0);
+			}
+			//  --(2.2)、验证已下发过PDI   切记???
+			if(v_rec_pln_d.getSend_flag()==null || "0".equals(v_rec_pln_d.getSend_flag())){
+				v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_plan_no+"} 入口卷号{"+v_entry_coil_no+"} 还未下发指示顺序或PDI数据!";
+				return v_message;
+			}
+			//  --(2.3)、验证当前还未生产交工
+			MesTpmM mCross = new MesTpmM();
+			mCross.setSchedule_no(v_plan_no);
+			mCross.setMaterial_no(v_entry_coil_no);
+			v_cnt = this.getBean(MesTpmMMapper.class).count(mCross);
+			if(v_cnt>0){
+				List<MesTpmM> lmcam = this.getMapper(MesTpmMMapper.class).find(mCross, 0, 0);
+			    MesTpmM v_rec_tpm_m =lmcam.get(0);
+			    if("1".equals(v_rec_tpm_m.getHand_over_status())){
+			    	v_message="机台代码{"+v_mch_code+"} 作业计划号{"+v_plan_no+"} 入口卷号{"+v_entry_coil_no+"} 已生产交工,不能撤销PDI!";
+			    	return v_message;
+			    }
+			}
+			
+			//撤销PDI实体类
+			IfTpm01L3Revoke itl=new IfTpm01L3Revoke();
+			itl.setSend_time(new Date());
+			itl.setSend_opr(v_opr_name);//注意L2是否扛得住?
+			itl.setEntry_coil_no(v_entry_coil_no);
+			
+			v_flag=0;//--无接口调试时,设置1,直接跳过,否则设置为0
+			//--(3)、调用公司接口,将“L3指示删除”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(itl,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_ORDERDELE);
+				String url = TPMPDI_ORDERDELE;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="L3指示删除电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发L3指示删除电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发L3指示删除电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发L3指示删除电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			// --(3.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Tpm01L3Revoke L3指示删除电文发送失败!"+v_message;
+				return v_message;
+			}
+			//  --(4)、开始事物:																																							
+			//  --(4.1)、插入接口记录表相关信息																																							
+			this.getMapper(IfTpm01L3RevokeMapper.class).insert(itl);
+			//--(5)、提交事务
+			//唯一标示操作成功的地方
+			v_success=1;
+			v_message="Tpm01L3Revoke L3指示删除电文发送成功!入口卷号{"+v_entry_coil_no+"}";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(6)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(6.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3Revoke L3指示删除电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3Revoke L3指示删除电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3Revoke L3指示删除电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3Revoke L3指示删除电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	/**
+	    1)、	此函数为JAVA后台内调函数,可考虑将方法设为私有,由“轧辊配辊管理-【发送配辊信息至L2】(待设计开发)”方法 Tpm01L3Roller 方法调用;																																							
+		2)、	接口参数 IN:V_MCH_CODE(机台代码)、V_PAIR_NO(配辊编号)、V_ROLL_TYPE(轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊))、V_OPR_NAME(操作人)																																							
+		3)、	接口参数 OUT:V_MESSAGE(操作结果信息)																																							
+	 * @param memo1
+	 * @param schedule_no
+	 * @param material_no
+	 * @param userName
+	 * @param v_success
+	 * @param v_message
+	 * @return
+	 * @throws Exception
+	 */
+	@Transactional(value="tm", rollbackFor=Exception.class)
+	public String Tpm01L3Roller_d(String v_mch_code, String v_pair_no,
+			String v_roll_type, String v_opr_name,String v_message) throws Exception{
+		Integer v_cnt=null;
+		Integer v_flag=null;
+		Integer v_serial_no=null;
+		Integer v_success=null;
+		try{
+			//  --(1.1)、验证机台代码不为空
+			if(v_mch_code==null || "".equals(v_mch_code)){
+				v_message="参数错误:机台代码不能为空!";
+				return v_message;
+			}
+			//  --(1.2)、验证机台基础信息存在
+			ComBaseMachine machine = new ComBaseMachine();
+			machine.setMachine_code(v_mch_code);
+			v_cnt = this.getMapper(ComBaseMachineMapper.class).count(machine);
+			if (v_cnt <= 0) {
+				v_message = ("机台代码:{" + v_mch_code+ "}机台基础信息不存在!");
+				return v_message;
+			}
+			//--(1.3)、验证配辊编号不为空
+			if(v_pair_no ==null || "".equals(v_pair_no)){
+				v_message="未指定配辊编号!";
+				return v_message;
+			}
+			//--轧辊类型(WKR:工作辊、BUR: 支撑辊、IMR:中间辊)
+			if(v_roll_type==null || "".equals(v_roll_type)){
+				v_message="未指定轧辊类型!";
+				return v_message;
+			}
+			
+			List<DevRollerPairM> ldbgg = this.getMapper(DevRollerPairMMapper.class).findWithCondition(null, "serial_no='"+v_pair_no+"'", null, 0, 0);
+			DevRollerPairM v_rec_grd = ldbgg.get(0);
+			DevRollerPairD t_drpd=new DevRollerPairD();
+			t_drpd.setSerial_no(v_rec_grd.getSerial_no());
+			//轧辊位置(T:上辊、B:下辊)
+			t_drpd.setRoller_position("T");
+			List<DevRollerPairD> t_drpd_list = this.getMapper(DevRollerPairDMapper.class).find(t_drpd,0,0);
+			
+			DevRollerPairD b_drpd=new DevRollerPairD();
+			b_drpd.setSerial_no(v_rec_grd.getSerial_no());
+			//轧辊位置(T:上辊、B:下辊)
+			b_drpd.setRoller_position("B");
+			List<DevRollerPairD> b_drpd_list = this.getMapper(DevRollerPairDMapper.class).find(b_drpd,0,0);
+			
+			IfTpmRollerView itrv=new IfTpmRollerView();
+			IfTpm01L3Roller v_rec_roller=new IfTpm01L3Roller();
+			IfTpm01L3RollerD v_rec_roller_t=new IfTpm01L3RollerD();
+			IfTpm01L3RollerD v_rec_roller_b=new IfTpm01L3RollerD();
+			//2019-03-01
+			Long max_serial_no=this.getMapper(IfTpm01L3RollerMapper.class).doQuery1();
+			v_rec_roller.setSerial_no(max_serial_no);
+				
+			
+			
+			//--(4)、轧辊数据属性赋值
+			v_rec_roller.setArea_id(2l);//--轧辊区域(1:冷轧钢、2:平整)
+			v_rec_roller.setStand_id(Long.parseLong(v_rec_grd.getStand_id()));
+			v_rec_roller.setRoll_type(v_rec_grd.getRoller_type());
+			itrv.setArea_id(2l);//--轧辊区域(1:冷轧钢、2:平整)
+			itrv.setStand_id(Long.parseLong(v_rec_grd.getStand_id()));
+			itrv.setRoll_type(v_rec_grd.getRoller_type());
+			
+			//v_rec_roller_t.setSerial_no(Long.parseLong(t_drpd_list.get(0).getSerial_no().substring(1)));
+			v_rec_roller_t.setSerial_no(max_serial_no);
+			v_rec_roller_t.setRoll_pos(t_drpd_list.get(0).getRoller_position());
+			v_rec_roller_t.setRoll_id(t_drpd_list.get(0).getRoller_no());
+			if(t_drpd_list.get(0).getDia_current()!=null){
+				Double dia_current=t_drpd_list.get(0).getDia_current()*1000;
+				v_rec_roller_t.setDiameter(dia_current.longValue());  //直径(10^-3 mm)
+			}
+			if(t_drpd_list.get(0).getConvexity()!=null){
+				Double convexity=t_drpd_list.get(0).getConvexity()*1000;
+				v_rec_roller_t.setCrown(convexity.longValue());//微米
+			}
+			if(t_drpd_list.get(0).getCone_len()!=null){
+				v_rec_roller_t.setL_cone(t_drpd_list.get(0).getCone_len().longValue());
+			}
+			if(t_drpd_list.get(0).getCone_hgt()!=null){
+				Double cone_hgt=t_drpd_list.get(0).getCone_hgt()*1000;
+				v_rec_roller_t.setH_cone(cone_hgt.longValue());
+			}
+			if(t_drpd_list.get(0).getRoughness()!=null){
+				Double roughness=t_drpd_list.get(0).getRoughness()*100000;
+				v_rec_roller_t.setRoughness(roughness.longValue());
+			}
+			//v_rec_roller_t.setProperty_class(t_drpd_list.get(0).getMaterial_code());//PROPERTY_CLASS材质代码(0:光棍、1:毛辊)
+			
+			//v_rec_roller_b.setSerial_no(Long.parseLong(b_drpd_list.get(0).getSerial_no().substring(1)));
+			v_rec_roller_b.setSerial_no(max_serial_no);
+			v_rec_roller_b.setRoll_pos(b_drpd_list.get(0).getRoller_position());
+			v_rec_roller_b.setRoll_id(b_drpd_list.get(0).getRoller_no());
+			if(b_drpd_list.get(0).getDia_current()!=null){
+				Double dia_current=b_drpd_list.get(0).getDia_current()*1000;
+				v_rec_roller_b.setDiameter(dia_current.longValue());  //直径(10^-3 mm)
+			}
+			if(b_drpd_list.get(0).getConvexity()!=null){
+				Double convexity=b_drpd_list.get(0).getConvexity()*1000;
+				v_rec_roller_b.setCrown(convexity.longValue());//微米
+			}
+			if(b_drpd_list.get(0).getCone_len()!=null){
+				v_rec_roller_b.setL_cone(b_drpd_list.get(0).getCone_len().longValue());
+			}
+			if(b_drpd_list.get(0).getCone_hgt()!=null){
+				Double cone_hgt=b_drpd_list.get(0).getCone_hgt()*1000;
+				v_rec_roller_b.setH_cone(cone_hgt.longValue());
+			}
+			if(b_drpd_list.get(0).getRoughness()!=null){
+				Double roughness=b_drpd_list.get(0).getRoughness()*100000;
+				v_rec_roller_b.setRoughness(roughness.longValue());
+			}
+			//v_rec_roller_b.setProperty_class(b_drpd_list.get(0).getMaterial_code());//PROPERTY_CLASS材质代码(0:光棍、1:毛辊)
+			
+			itrv.getRoll_data().add(v_rec_roller_t);
+			itrv.getRoll_data().add(v_rec_roller_b);
+			
+			//--(4.1)、置输出参数:操作成功标志为0:失败
+			v_flag=0;// --无接口调试时,设置1,直接跳过,否则设置为0
+			//--(4.2)、调用公司接口,将“轧辊数据”电文发送给L2(电文格式见接口文档,获取接口执行成功状态:v_flag,错误信息:v_message)
+			
+			JsonConfig jsonConfig=new JsonConfig();
+			jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+			jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+			jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+			JSONObject jsonObject=JSONObject.fromObject(itrv,jsonConfig);
+			System.out.println(jsonObject.toString());
+			try{
+				log.debug("url:"+TPMPDI_ROLLING);
+				String url = TPMPDI_ROLLING;
+				String body = jsonObject.toString();
+		        RestfulHttpClient.HttpResponse response = RestfulHttpClient.getClient(url)
+		                .post()              //设置post请求
+		                .addPostParam("body", "json")
+		                .body(body)
+		                .addHeader("Content-type", "application/json")   //添加header
+		                //.addPathParam("id", "2")        //设置url路径参数
+		                //.addQueryParam("test", "value") //设置url请求参数
+		                .request();         //发起请求
+		        System.out.println(response.getCode());     //响应状态码
+		        System.out.println(response.getRequestUrl());//最终发起请求的地址
+		        if(response.getCode() == 200){
+		            //请求成功
+		            //System.out.println(response.getContent());  //响应内容
+		            log.debug("responseCONTENT:"+response.getContent());
+		            if(response.getContent()!=null && (response.getContent().contains("vsuccess")|| response.getContent().contains("成功"))){//成功往L2的pdi表中插入数据
+		            	v_flag=1;
+		            	v_message="轧辊数据电文下发成功!";
+		            }else{
+		            	if(response.getContent()!=null && response.getContent().length()>200){
+		    				v_message="已下发轧辊数据电文给L2,插入失败!【"+response.getContent().substring(0,200)+"】";
+		    			}else{
+		    				v_message="已下发轧辊数据电文给L2,插入失败!【"+response.getContent()+"】";
+		    			}
+		            }
+		        }else{
+		        	v_message="下发轧辊数据电文给L2失败!发送请求失败!";
+		        }
+			}catch(Exception e){
+				e.printStackTrace();
+				v_message="【通讯过程出错:"+e.getMessage()+"】";
+			}
+			
+			
+			
+			
+			
+			// --(4.2.1)、电文发送失败(失败状态,根据接口提供定义确定)
+			if(v_flag==0){
+				v_message="Tpm01L3Roller 轧辊数据电文发送失败!";
+				return v_message;
+			}
+			//  --(5)、插入接口记录表相关信息																																							
+			//  --(5.1)、开始事物:					
+			try{
+			//  --(5.1.1)、插入 IF_TPM01_L3_ROLLER 记录																																							
+				this.getMapper(IfTpm01L3RollerMapper.class).insert(v_rec_roller);	
+				//--(5.1.2)、插入 IF_TPM01_L3_ROLLER_D 上辊记录
+				this.getMapper(IfTpm01L3RollerDMapper.class).insert(v_rec_roller_t);
+				//--(5.1.3)、插入 IF_TPM01_L3_ROLLER_D 下辊记录
+				this.getMapper(IfTpm01L3RollerDMapper.class).insert(v_rec_roller_b);
+			}catch(Exception e){
+				e.printStackTrace();
+			}
+			
+			//--(5.1.4)、修改配辊记录表中,下发L2状态
+			//状态(1:配对、2:上机、3:下机、0:拆卸)
+			DevRollerPairM drpm=new DevRollerPairM();
+			drpm.setSerial_no(v_rec_grd.getSerial_no());
+			drpm.setSend_l2("1");
+			drpm.setUpdate_opr(v_opr_name);
+			drpm.setUpdate_time(new Date());
+			this.getMapper(DevRollerPairMMapper.class).update(drpm);
+			// --(6)、提交事务
+			v_message="Tpm01L3Roller 轧辊数据电文发送成功!记录号{"+v_rec_grd.getSerial_no()+"}";
+		}catch(Exception e){
+			e.printStackTrace();
+		    //--(7)、捕获未定义的异常,提示信息最多200字符																																							
+		    //--(7.1)、电文发送成功(成功状态,根据接口提供定义确定)																																							
+			if(v_flag==1){
+				v_success=2;
+				// --部分成功(电文已下发成功,但记录未写成功)
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3Roller 轧辊数据电文发送成功!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3Roller 轧辊数据电文发送成功!"+e.getMessage();
+				}
+			}else{
+				if(e.getMessage()!=null && e.getMessage().length()>200){
+					v_message="Tpm01L3Roller 轧辊数据电文发送失败!"+e.getMessage().substring(0,200);
+				}else{
+					v_message="Tpm01L3Roller 轧辊数据电文发送失败!"+e.getMessage();
+				}
+			}
+			throw new Exception(v_message);
+		}
+		return v_message;
+	}
+	
+	
+	public void testgetObjectJson(){
+		IfTpmRollerView itrv=new IfTpmRollerView();
+		itrv.setArea_id(111l);
+		itrv.setStand_id(3l);
+		itrv.setRoll_type("wtr");
+		IfTpm01L3RollerD  d1=new IfTpm01L3RollerD();
+		d1.setCrown(367l);
+		d1.setL_cone(903l);
+		d1.setRoll_pos("T");
+		d1.setRoll_id("roid2018");
+		IfTpm01L3RollerD  d2=new IfTpm01L3RollerD();
+		d2.setCrown(367l);
+		d2.setL_cone(903l);
+		d2.setRoll_pos("B");
+		d2.setRoll_id("roid2020");
+		itrv.getRoll_data().add(d1);
+		itrv.getRoll_data().add(d2);
+		
+		JsonConfig jsonConfig=new JsonConfig();
+		jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
+		jsonConfig.registerJsonValueProcessor(java.lang.Double.class, new DoubleJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Long.class, new LongJsonValueProcessor());
+		jsonConfig.registerJsonValueProcessor(java.lang.Integer.class, new IntegerJsonValueProcessor());
+		JSONObject jsonObject=JSONObject.fromObject(itrv,jsonConfig);
+		System.out.println(jsonObject.toString());
+		/*
+		 {"roll_type":"wtr","stand_id":3,"area_id":111,"litlrd":[{"roll_pos":"T","l_cone":903,"diameter":"","roughness":"","reserve":"","roll_id":"roid2018","h_cone":"","property_class":"","serial_no":"","crown":367},{"roll_pos":"B","l_cone":903,"diameter":"","roughness":"","reserve":"","roll_id":"roid2020","h_cone":"","property_class":"","serial_no":"","crown":367}]}
+		 */
+	}
+	
+	
+	// 补零
+	public static String lpad(String str, int num, String pad) {
+		String n_str = str;
+		if (str == null && "".equals(str))
+			n_str = " ";
+		for (int i = str.length(); i < num; i++) {
+			n_str = pad + n_str;
+		}
+		return n_str;
+	}
+
+}

+ 77 - 0
src/main/java/market/Api/Mes/impl/ProcessPoint.java

@@ -0,0 +1,77 @@
+package market.Api.Mes.impl;
+
+import java.util.List;
+
+import market.Com.vo.ComBaseInfo;
+
+
+/**
+ * 工序代码
+ * @author bin.pan
+ */
+/**
+ * @author bin.pan
+ *
+ */
+public class ProcessPoint {
+	
+	/**
+	 * 分条
+	 */
+	public String slitting_code; 
+	
+	/**
+	 * 开平
+	 */
+	public String cross_cutting_code; 
+	
+	/**
+	 * 罩退
+	 */
+	public String anneal_code; 
+	
+	
+	/**
+	 * 平整
+	 */
+	public String smooth_code;
+	
+	/**
+	 * 轧制
+	 */
+	public String rolling_code;
+	
+	/**
+	 * 酸洗
+	 */
+	public String pickle_code;
+	
+	public ProcessPoint (List<ComBaseInfo> info ){
+		for (ComBaseInfo comBaseInfo : info) {
+			switch (comBaseInfo.getBase_code()) {
+			case "200201":
+				slitting_code = comBaseInfo.getMemo();
+				break;
+			case "200202":
+				cross_cutting_code = comBaseInfo.getMemo();
+				break;
+			case "200203":
+				anneal_code = comBaseInfo.getMemo();
+				break;
+			case "200204":
+				smooth_code = comBaseInfo.getMemo();
+				break;
+			case "200205":
+				rolling_code = comBaseInfo.getMemo();
+				break;
+			case "200206":
+				pickle_code = comBaseInfo.getMemo();
+				break;
+
+			default:
+				break; 
+			}
+		}
+	}
+
+}

+ 76 - 0
src/main/java/market/Api/Mes/impl/ProcessUtils.java

@@ -0,0 +1,76 @@
+package market.Api.Mes.impl;
+
+/**
+ * @author bin.pan
+ * 
+ * 工艺路径类
+ */
+public class ProcessUtils {
+	
+	/**
+	 * 工序代码
+	 */
+	private String proc_code ;
+	
+	
+	/**
+	 * 工序名称
+	 */
+	private String proc_name;
+	
+	/**
+	 * 路径中序号
+	 */
+	private int proc_index;
+	
+	/**
+	 * 重复次数
+	 */
+	private int repeat_times;
+	
+	/**
+	 * 状态  -1 减少   0 不变   1 新增
+	 */
+	private String status ;
+
+	public String getProc_code() {
+		return proc_code;
+	}
+
+	public void setProc_code(String proc_code) {
+		this.proc_code = proc_code;
+	}
+
+	public int getProc_index() {
+		return proc_index;
+	}
+
+	public void setProc_index(int proc_index) {
+		this.proc_index = proc_index;
+	}
+
+	public int getRepeat_times() {
+		return repeat_times;
+	}
+
+	public void setRepeat_times(int repeat_times) {
+		this.repeat_times = repeat_times;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public String getProc_name() {
+		return proc_name;
+	}
+
+	public void setProc_name(String proc_name) {
+		this.proc_name = proc_name;
+	} 
+
+}

+ 622 - 0
src/main/java/market/Api/Mes/impl/RestfulHttpClient.java

@@ -0,0 +1,622 @@
+package market.Api.Mes.impl;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+ public class RestfulHttpClient {
+    /** 全局默认请求头 */
+    private static final Map<String, String> defaultHeaders = new HashMap<>();
+    /** 全局默认请求头 */
+    private static List<URLConnectionInitializer> initializers;
+    private static final String charset = "UTF-8";
+    private static final int readTimeout = 60000;
+    private static final int connectTimeout = 60000;
+
+    public static final String METHOD_GET = "GET";
+    public static final String METHOD_POST = "POST";
+    public static final String METHOD_PUT = "PUT";
+    public static final String METHOD_PATCH = "PATCH";
+    public static final String METHOD_DELETE = "DELETE";
+
+    private RestfulHttpClient(){ }
+
+    /**
+     * 发起请求
+     * @param method        请求方式:GET、POST、PUT、PATCH、DELETE
+     * @param url           请求url
+     * @param body          请求体body
+     * @throws IOException
+     */
+    public static HttpResponse request(String method, String url, Object body) throws IOException {
+        return request(method, url, body, defaultHeaders);
+    }
+
+    /**
+     * 发起请求
+     * @param method        请求方式:GET、POST、PUT、PATCH、DELETE
+     * @param url           请求url
+     * @param body          请求体body
+     * @param headers       请求头
+     * @throws IOException
+     */
+    public static HttpResponse request(String method, String url, Object body, Map<String, String> headers) throws IOException {
+        return getClient(url).method(method).body(body).headers(headers).request();
+    }
+
+    /**
+     * 获取请求客户端
+     * @param url
+     * @return
+     */
+    public static HttpClient getClient(String url){
+        return new HttpClient(url);
+    }
+
+    /**
+     * 添加全局请求连接初始化器
+     * @param initializer
+     */
+    public static void addInitializer(URLConnectionInitializer initializer){
+        if(initializer == null){
+            throw new NullPointerException("不能添加空的连接初始化器");
+        }
+        if(initializers == null){
+            initializers = new ArrayList<>();
+        }
+        initializers.add(initializer);
+    }
+
+    /**
+     * 请求客户端
+     */
+    public static class HttpClient{
+        private Map<String, String> headers;
+        private int readTimeout = RestfulHttpClient.readTimeout;
+        private int connectTimeout = RestfulHttpClient.connectTimeout;
+        private String method = METHOD_GET;
+        private String url;
+        private Map<String, String> pathParams;
+        private Map<String, String> queryParams;
+        private Map<String, String> postParams;
+        private Object body;
+        private HttpResponse response;
+        private List<URLConnectionInitializer> initializers;
+
+        public HttpClient(String url){
+            if(StringUtils.isBlank(url)){
+                throw new IllegalArgumentException("请求地址不能为空");
+            }
+            this.url = url;
+            headers = new HashMap<>();
+            pathParams = new HashMap<>();
+            queryParams = new HashMap<>();
+            postParams = new HashMap<>();
+            headers.putAll(defaultHeaders);
+            initializers = RestfulHttpClient.initializers;
+        }
+
+        public HttpClient get(){
+            method = METHOD_GET;
+            return this;
+        }
+
+        public HttpClient post(){
+            method = METHOD_POST;
+            return this;
+        }
+
+        public HttpClient put(){
+            method = METHOD_PUT;
+            return this;
+        }
+
+        public HttpClient patch(){
+            method = METHOD_PATCH;
+            return this;
+        }
+
+        public HttpClient delete(){
+            method = METHOD_DELETE;
+            return this;
+        }
+
+        /**
+         * 添加请求头
+         */
+        public HttpClient addHeader(String key, String value){
+            this.headers.put(key, value);
+            return this;
+        }
+
+        /**
+         * 批量添加请求头
+         */
+        public HttpClient addHeaders(Map<String, String> headers){
+            this.headers.putAll(headers);
+            return this;
+        }
+
+        /**
+         * 设置读取超时时间
+         */
+        public HttpClient readTimeout(int readTimeout){
+            this.readTimeout = readTimeout;
+            return this;
+        }
+
+        /**
+         * 设置连接超时时间
+         */
+        public HttpClient connectTimeout(int connectTimeout){
+            this.connectTimeout = connectTimeout;
+            return this;
+        }
+
+        /**
+         * 重置请求头
+         */
+        public HttpClient headers(Map<String, String> headers){
+            this.headers.clear();
+            this.headers.putAll(defaultHeaders);
+            return addHeaders(headers);
+        }
+
+        /**
+         * 设置请求方式,默认:GET
+         */
+        public HttpClient method(String method) {
+            if(StringUtils.isBlank(method)){
+                throw new IllegalArgumentException("请求方式不能为空");
+            }
+            //请求方式不做限制
+//            if(!ArrayUtils.contains(new String[]{METHOD_GET, METHOD_POST, METHOD_PUT, METHOD_PATCH, METHOD_DELETE}, method.toUpperCase())){
+//                throw new IllegalArgumentException("请求方式设置错误,不能设置为:" + method);
+//            }
+            this.method = method.toUpperCase();
+            return this;
+        }
+
+        /**
+         * 设置请求地址,可带path参数
+         * 如:/user/{id}
+         */
+        public HttpClient url(String url) {
+            this.url = url;
+            return this;
+        }
+
+        /**
+         * 设置请求地址参数,替换url上的参数
+         * 如:/user/{id} 上的{id}
+         */
+        public HttpClient pathParams(Map<String, String> pathParams) {
+            this.pathParams.putAll(pathParams);
+            return this;
+        }
+
+        /**
+         * 添加请求地址参数,替换url上的参数
+         * 如:/user/{id} 上的{id}
+         */
+        public HttpClient addPathParam(String key, String value) {
+            this.pathParams.put(key, value);
+            return this;
+        }
+
+        /**
+         * 设置url请求参数,url问题后面的参数
+         */
+        public HttpClient queryParams(Map<String, String> queryParams) {
+            this.queryParams.putAll(queryParams);
+            return this;
+        }
+
+        /**
+         * 添加url请求参数,url问题后面的参数
+         */
+        public HttpClient addQueryParam(String key, String value) {
+            this.queryParams.put(key, value);
+            return this;
+        }
+
+        /**
+         * 设置表单参数,与body参数冲突,只能设置其中一个,优先使用body
+         */
+        public HttpClient postParams(Map<String, String> postParams) {
+            this.postParams.putAll(postParams);
+            return this;
+        }
+
+        /**
+         * 添加表单参数
+         */
+        public HttpClient addPostParam(String key, String value) {
+            this.postParams.put(key, value);
+            return this;
+        }
+
+        /**
+         * 设置请求体body,与post参数冲突,只能设置其中一个
+         */
+        public HttpClient body(Object body) {
+            this.body = body;
+            return this;
+        }
+
+        /**
+         * 获取最终的请求地址
+         * @return
+         */
+        public String getRequestUrl(){
+            return transformUrl(this.url, pathParams, queryParams);
+        }
+
+        /**
+         * 发起请求
+         * @return
+         * @throws IOException
+         */
+        public HttpResponse request() throws IOException {
+            response = RestfulHttpClient.request(this);
+            return response;
+        }
+
+        /**
+         * 添加请求连接初始化器
+         * @param initializer
+         */
+        public HttpClient addInitializer(URLConnectionInitializer initializer){
+            if(initializer == null){
+                throw new NullPointerException("不能添加空的连接初始化器");
+            }
+            if(initializers == null){
+                initializers = new ArrayList<>();
+            }
+            initializers.add(initializer);
+            return this;
+        }
+
+        public Map<String, String> getHeaders() {
+            return headers;
+        }
+
+        public int getReadTimeout() {
+            return readTimeout;
+        }
+
+        public int getConnectTimeout() {
+            return connectTimeout;
+        }
+
+        public String getMethod() {
+            return method;
+        }
+
+        public String getUrl() {
+            return url;
+        }
+
+        public Map<String, String> getQueryParams() {
+            return queryParams;
+        }
+
+        public Map<String, String> getPathParams() {
+            return pathParams;
+        }
+
+        public Map<String, String> getPostParams() {
+            return postParams;
+        }
+
+        public Object getBody() {
+            return body;
+        }
+
+        public HttpResponse getResponse() {
+            return response;
+        }
+    }
+
+    /**
+     * 请求响应结果
+     */
+    public static class HttpResponse{
+        private int code;
+        private Map<String, List<String>> headers;
+        private String requestUrl;
+        private String content;
+
+        public HttpResponse(int code, Map<String, List<String>> headers, String requestUrl, String content){
+            this.code = code;
+            this.headers = headers;
+            this.requestUrl = requestUrl;
+            this.content = content;
+        }
+
+        public <T>T getContent(Class<T> clz) throws IOException {
+            if(StringUtils.isNotBlank(content)){
+                return new ObjectMapper().readValue(content, clz);
+            }
+            return null;
+        }
+
+        /**
+         * 获取响应状态码
+         */
+        public int getCode() {
+            return code;
+        }
+
+        /**
+         * 获取响应头
+         */
+        public Map<String, List<String>> getHeaders() {
+            return headers;
+        }
+
+        /**
+         * 获取最后请求地址
+         */
+        public String getRequestUrl() {
+            return requestUrl;
+        }
+
+        /**
+         * 获取响应内容
+         */
+        public String getContent() {
+            return content;
+        }
+    }
+
+    /**
+     * 发起请求
+     * @throws IOException
+     */
+    private static HttpResponse request(HttpClient client) throws IOException {
+        HttpURLConnection con = instance(client);
+        if(METHOD_GET.equalsIgnoreCase(client.getMethod())){
+            //GET请求,不用发请求体
+            return readResponse(con);
+        }
+        String requestBody = null;
+        if(isPrimitiveOrWrapClzOrStr(client.getBody())){
+            requestBody = client.getBody().toString();
+        }else if(client.getBody() != null){
+            requestBody = new ObjectMapper().writeValueAsString(client.getBody());
+            if(!client.getHeaders().containsKey("Content-Type")){
+                //设置请求媒体类型为json提交
+                con.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
+            }
+        }else if(client.getPostParams() != null && !client.getPostParams().isEmpty()){
+            requestBody = toUrlParams(client.getPostParams());
+        }
+
+        con.setDoOutput(true);
+        con.setDoInput(true);
+        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), charset));
+        if(requestBody != null){
+            //写入请求内容
+            bw.write(requestBody);
+        }
+        bw.flush();
+        bw.close();
+
+        return readResponse(con);
+    }
+
+    /**
+     * 判断是否是字符串或基本类型或包装类型
+     * @param o
+     * @return
+     */
+    private static boolean isPrimitiveOrWrapClzOrStr(Object o){
+        if(o == null){
+            return false;
+        }else if(o instanceof String){
+            //是字符串类型
+            return true;
+        }else if(o.getClass().isPrimitive()){
+            //是基本类型
+            return true;
+        }else{
+            try {
+                //是包装类型
+                return ((Class) o.getClass().getField("TYPE").get(null)).isPrimitive();
+            } catch (Exception e) {
+                return false;
+            }
+        }
+    }
+
+    /**
+     * 读取响应结果
+     * edit by yds 2020
+     * @param con
+     * @return
+     * @throws IOException
+     */
+    private static HttpResponse readResponse(HttpURLConnection con) throws IOException {
+        try{
+            System.out.println(con.getResponseCode());
+            int code = con.getResponseCode();
+            InputStream is = null;
+            if (con.getResponseCode() == HttpURLConnection.HTTP_OK){
+                is = con.getInputStream();
+            }else{
+                is = con.getErrorStream();
+            }
+            StringBuilder sb = new StringBuilder();
+            if (is!=null) {
+                BufferedReader br = new BufferedReader(new InputStreamReader(is, charset));
+                String read = null;
+                while ((read = br.readLine()) != null) {
+                    sb.append(read);
+                    sb.append("\n");
+                }
+                br.close();
+            }
+            return new HttpResponse(con.getResponseCode(), con.getHeaderFields(),
+                    con.getURL().toString(), sb.toString());
+        } finally {
+            con.disconnect();
+        }
+    }
+
+    /**
+     * 初始化请求连接
+     * @param client
+     * @return
+     * @throws IOException
+     */
+    private static HttpURLConnection instance(HttpClient client) throws IOException {
+        URL u = new URL(client.getRequestUrl());
+        HttpURLConnection con = (HttpURLConnection) u.openConnection();
+        con.setReadTimeout(client.getReadTimeout());
+        con.setConnectTimeout(client.getConnectTimeout());
+        con.setRequestMethod(client.getMethod());
+        Map<String, String> headers = client.getHeaders();
+        if(headers != null && !headers.isEmpty()){
+            for (String key : headers.keySet()) {
+                con.setRequestProperty(key, headers.get(key));
+            }
+        }
+
+        List<URLConnectionInitializer> initializers = client.initializers;
+        if(initializers != null && !initializers.isEmpty()){
+            for (URLConnectionInitializer initializer : initializers) {
+                HttpURLConnection init = initializer.init(con, client);
+                if(init != null){
+                    con = init;
+                }
+            }
+        }
+        return con;
+    }
+
+    /**
+     * 处理url的参数
+     * 如:/user/{id},将id转成值
+     * @param url
+     * @param pathParams    地址参数
+     * @param queryParams   请求参数
+     * @return
+     */
+    private static String transformUrl(String url, Map<String, String> pathParams, Map<String, String> queryParams){
+        if(pathParams != null && !pathParams.isEmpty()){
+            for (String key : pathParams.keySet()) {
+                url = url.replaceAll("\\{"+key+"\\}", pathParams.get(key));
+            }
+        }
+        if(queryParams != null && !queryParams.isEmpty()){
+            if(url.indexOf("?") > 0){
+                url += "&" + toUrlParams(queryParams);
+            }else{
+                url += "?" + toUrlParams(queryParams);
+            }
+        }
+        return url;
+    }
+
+    /**
+     * 将map参数转成url参数形式:name1=value2&name2=value2...
+     * @param paras
+     * @return
+     */
+    public static String toUrlParams(Map<String, String> paras){
+        if(paras != null && !paras.isEmpty()){
+            StringBuffer urlParams = new StringBuffer();
+            for (String k : paras.keySet()) {
+                urlParams.append(k+"="+paras.get(k)+"&");
+            }
+            if(urlParams.length() > 0){
+                return urlParams.substring(0, urlParams.length() - 1);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取全局默认请求headers设置
+     * @return
+     */
+    public static Map<String, String> getDefaultHeaders(){
+        return defaultHeaders;
+    }
+
+    /**
+     * 设置默认全局默认请求headers
+     * @param headers
+     * @return
+     */
+    public static Map<String, String> setDefaultHeaders(Map<String, String> headers){
+        defaultHeaders.clear();
+        defaultHeaders.putAll(headers);
+        return getDefaultHeaders();
+    }
+
+    /**
+     * 连接初始化器
+     */
+    public interface URLConnectionInitializer{
+        /**
+         * 初始化http请求连接对象
+         * @param connection
+         * @return
+         */
+        HttpURLConnection init(HttpURLConnection connection, HttpClient client);
+    }
+
+    public static void main(String[] args) throws IOException {
+        /*String url = "http://localhost:8081/user/{id}";
+
+        RestfulHttpClient.HttpResponse response = getClient(url)
+                .post()              //设置post请求
+                .addHeader("token", "tokenValue")   //添加header
+                .addPathParam("id", "2")        //设置url路径参数
+                .addQueryParam("test", "value") //设置url请求参数
+                .request();         //发起请求*/
+        String url = "http://172.16.0.18:9090/ZyTg/services/Passport/sv";
+        String params = "{\n" +
+                "    \"forecast\": \"123456789123\",\n" +
+                "    \"reason\": \"测试\",\n" +
+                "    \"recoder\": \"优特钢酸洗\"\n" +
+                "}";
+        RestfulHttpClient.HttpResponse response = getClient(url)
+                .put()
+                .addHeader("Content-Type", "application/json; charset=utf-8")
+                .body(params)
+                //.connectTimeout(30*1000)
+                .request();
+        if(response.getCode() == 200){
+            String result = response.getContent();
+            System.out.println(result);
+            JSONObject jo = JSONObject.fromObject(result);
+            if (StringUtils.isNotEmpty(jo.getString("status")) && "TRUE".equals(jo.getString("status").toUpperCase())){
+                System.out.println("success");
+            }else{
+               System.out.println(jo.getString("errMsg"));
+            }
+        }else {
+            String result = response.getContent();
+            System.out.println(result);
+        }
+    }
+}

+ 60 - 0
src/main/java/market/Api/Mes/impl/TimestampMorpher.java

@@ -0,0 +1,60 @@
+package market.Api.Mes.impl;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import net.sf.ezmorph.MorphException;
+import net.sf.ezmorph.object.AbstractObjectMorpher;
+
+/**
+ * 将json串中的日期字符串转换为bean中的Timestamp、Date
+ * 
+ * @author syh
+ * 
+ */
+public class TimestampMorpher extends AbstractObjectMorpher {
+    /*** 日期字符串格式 */
+    private String[] formats;
+
+    public TimestampMorpher(String[] formats) {
+        this.formats = formats;
+    }
+
+    public Object morph(Object value) {
+        if (value == null) {
+            return null;
+        }
+        if (Timestamp.class.isAssignableFrom(value.getClass())) {
+            return (Timestamp) value;
+        }
+        if (!supports(value.getClass())) {
+            throw new MorphException(value.getClass() + " 是不支持的类型");
+        }
+        String strValue = (String) value;
+        SimpleDateFormat dateParser = null;
+        for (int i = 0; i < formats.length; i++) {
+            if (null == dateParser) {
+                dateParser = new SimpleDateFormat(formats[i]);
+            } else {
+                dateParser.applyPattern(formats[i]);
+            }
+            try {
+                return new Timestamp(dateParser.parse(strValue.toLowerCase()).getTime());
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Class morphsTo() {
+        return Timestamp.class;
+    }
+
+    public boolean supports(Class clazz) {
+        return String.class.isAssignableFrom(clazz);
+    }
+
+}

+ 131 - 0
src/main/java/market/Api/Mes/impl/Utils.java

@@ -0,0 +1,131 @@
+package market.Api.Mes.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class Utils {
+	/**
+	 * 判定对象是否为空
+	 * 包括字符串、list集合
+	 * @param obj 对象
+	 * @return 
+	 */
+	public static boolean isEmpty(Object obj) {
+		if (obj == null) {
+			return true;
+		}
+		if (obj instanceof List) {
+			return ((List) obj).size() == 0;
+		}
+		if ((obj instanceof String)) {
+			return ((String) obj).trim().equals("");
+		}
+		return false;
+	}
+	
+	 /**
+	 * 判定对象不为空
+	 * @param obj 对象
+	 * @return
+	 */
+	public static boolean isNotEmpty(Object obj) {
+		return !isEmpty(obj);
+	}
+
+	
+	/**
+	 * 获取集合的交集
+	 * @param list
+	 * @return
+	 */
+	public static ArrayList<String> getIntersection(List<ArrayList<String>> list) {
+		ArrayList<String> result = new ArrayList<String>();
+		int size = list.size();
+		if (size > 1) {
+			// 取集合中的交集
+			for (int i = 0; i < size; i++) {
+				if (i + 1 < size) {
+					list.get(0).retainAll(list.get(i + 1));
+					if (i == size - 2) {
+						for (String name : list.get(0)) {
+							if (!result.contains(name)) {
+								result.add(name);
+							}
+						}
+					}
+				}
+			}
+		} else {
+			// 只有一个集合则不取交集
+			for (List<String> list2 : list) {
+				for (String name : list2) {
+					if (!result.contains(name)) {
+						result.add(name);
+					}
+				}
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * 获取公共区间的最小值
+	 * 
+	 * @param min_f 
+	 * @param max_f
+	 * @param min_n
+	 * @param max_n
+	 * @return -1.0 说明没有公共区间
+	 */
+	public static double getInterval_min(double min_f , double max_f, double min_n ,double max_n) {
+		if (min_f > max_n || max_f < min_n) {
+			return -1.0 ;
+		}else {
+			return Math.max(min_n, min_f);
+		}
+	}
+	
+	/**
+	 * 获取公共区间的最大值
+	 * 
+	 * @param min_f 
+	 * @param max_f
+	 * @param min_n
+	 * @param max_n
+	 * @return -1.0 说明没有公共区间
+	 */
+	public static double getInterval_max(double min_f , double max_f, double min_n ,double max_n) {
+		if (min_f > max_n || max_f < min_n) {
+			return -1.0 ;
+		}else {
+			return Math.min(max_f, max_n);
+		}
+	}
+	
+	/**
+	 *获取字符串包含子串的次数
+	 * 
+	 * @param str   
+	 * @param str_n
+	 * @return
+	 */
+	public static int getContain_Times(String str,String str_n) {
+		if (!str.contains(str_n)) {
+			return 0;
+		}else {
+			int i = 1; 
+			i += getContain_Times(StringUtils.substringAfter(str, str_n),str_n);
+			return i;
+		}
+		
+	}
+	
+	public static void main(String[] args) {
+//		double a = 3.5 , b = 5.5 , c = 4.5 ,d = 6.0 ; 
+//		System.out.println(getInterval_min(a,b,c,d));
+//		System.out.println(getInterval_max(a,b,c,d));
+		System.out.println(getContain_Times("E-B-B-E-B-E", "B"));
+	}
+}

+ 7 - 0
src/main/java/market/Api/Mes/service/MesApi12mmPdiPdoService.java

@@ -0,0 +1,7 @@
+package market.Api.Mes.service;
+
+import com.hnshituo.basic.service.BaseService;
+
+public interface MesApi12mmPdiPdoService extends BaseService {
+
+}

Some files were not shown because too many files changed in this diff