Bladeren bron

first commit

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

@@ -0,0 +1,2 @@
+/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

+ 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 {
+
+}

+ 9 - 0
src/main/java/market/Api/Mes/service/MesApiAnnealPdiPdoService.java

@@ -0,0 +1,9 @@
+package market.Api.Mes.service;
+
+import com.hnshituo.basic.service.BaseService;
+
+@SuppressWarnings("rawtypes")
+public interface MesApiAnnealPdiPdoService extends BaseService{
+
+	
+}

+ 13 - 0
src/main/java/market/Api/Mes/service/MesApiAnnealPlanService.java

@@ -0,0 +1,13 @@
+package market.Api.Mes.service;
+
+import com.hnshituo.basic.service.BaseService;
+
+public interface MesApiAnnealPlanService extends BaseService{
+
+	/**
+	 * 公共函数1 修改罩退计划主表状态
+	 * @param 罩退计划号
+	 * @throws Exception
+	 */
+	public void doUpdatePlnAnnealPlan(String anPlanNo) throws Exception;
+}

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