diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index f20d44b..a21b0f0 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -2,6 +2,7 @@
 <project version="4">
   <component name="Encoding" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="UTF-8">
     <file url="file://$PROJECT_DIR$" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
     <file url="PROJECT" charset="UTF-8" />
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 5b5276e..65a5aa1 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,11 +5,61 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="baeae966-16bb-4f97-a411-22fe5a65cefd" name="Default Changelist" comment="">
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ApkController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ApkInfo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/Constant.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/general/CompanyInfo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/general/MobileUserController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/invenory/InventoryDetails.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/invenory/MobileInventory.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/invenory/ShipmentDetail.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/invenory/TaskIds.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MaterialInfo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MobileOneByOneReceiptController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MobilePutawayController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/ReceiptBill.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/ReceiptResult.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/Materialforecast.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/MobileShipmentController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/MobileTaskForASRSController.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/Shipment.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/ShipmentBill.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/ShipmentTaskModel.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/common/mapper/ApkMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/domain/ReceiptContainerView.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/domain/MobileTask.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/resources/mybatis/download/DownloadMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/resources/templates/config/material/print.html" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/templates/config/material/print.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/framework/config/ShiroConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/framework/config/ShiroConfig.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/service/LocationService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/service/LocationService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/mapper/MaterialMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/mapper/MaterialMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/service/MaterialService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/service/MaterialService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/service/MaterialServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/service/MaterialServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeader/mapper/ReceiptHeaderMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeader/mapper/ReceiptHeaderMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/application-dev.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/application-dev.yml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mybatis/config/LocationMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mybatis/config/LocationMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mybatis/config/MaterialMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mybatis/config/MaterialMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mybatis/config/WcsscanbarcodeMapper.xml" beforeDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mybatis/receipt/ReceiptHeaderMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mybatis/receipt/ReceiptHeaderMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mybatis/xinyi/TokenMapper.xml" beforeDir="false" />
     </list>
     <ignored path="$PROJECT_DIR$/target/" />
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="TRACKING_ENABLED" value="true" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -50,33 +100,11 @@
   </component>
   <component name="FileEditorManager">
     <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/src/main/resources/templates/config/material/print.html">
+      <file leaf-file-name="MobileBatchReceiptController.java" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="133">
-              <caret line="64" column="29" lean-forward="true" selection-start-line="64" selection-start-column="29" selection-end-line="64" selection-end-column="29" />
-              <folding>
-                <element signature="n#style#0;n#input#0;n#td#1;n#tr#4;n#tbody#0;n#table#0;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-                <element signature="n#style#0;n#input#0;n#td#1;n#tr#4;n#tbody#0;n#table#0;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/resources/templates/config/material/material.html">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="-3041">
-              <caret line="67" column="12" selection-start-line="67" selection-start-column="12" selection-end-line="67" selection-end-column="12" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/controller/MaterialController.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="113">
-              <caret line="193" column="28" lean-forward="true" selection-start-line="193" selection-start-column="28" selection-end-line="193" selection-end-column="28" />
+            <state relative-caret-position="-1234">
+              <caret line="404" column="51" selection-start-line="404" selection-start-column="40" selection-end-line="404" selection-end-column="51" />
             </state>
           </provider>
         </entry>
@@ -96,6 +124,18 @@
   <component name="FindBugs-IDEA-Workspace">
     <toolWindowEditorPreview>false</toolWindowEditorPreview>
   </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>materialService</find>
+      <find>mobileCheckLocationCode</find>
+      <find>inventoryDetailService</find>
+      <find>getCompany</find>
+      <find>getCompanyInfo</find>
+      <find>&lt;/insert&gt;</find>
+      <find>&lt;/insert&gt;</find>
+      <find>insertApkInfo</find>
+    </findStrings>
+  </component>
   <component name="Git.Settings">
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
     <option name="RECENT_BRANCH_BY_REPOSITORY">
@@ -107,30 +147,73 @@
   <component name="IdeDocumentHistory">
     <option name="CHANGED_PATHS">
       <list>
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/controller/ReceiptApi.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/service/ReceiptApiService.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/shipment/shipmentDetail/service/ShipmentDetailServiceImpl.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/service/ShipmentApiService.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/system/user/service/UserServiceImpl.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/system/user/service/IUserService.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/controller/BasicDataApi.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/domain/InventoryDomain.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/service/BasicDataApiService.java" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/container/controller/ContainerController.java" />
-        <option value="$PROJECT_DIR$/src/main/resources/templates/config/container/container.html" />
-        <option value="$USER_HOME$/Desktop/boot/boot/打印二维码 - 多个组2.html" />
-        <option value="$PROJECT_DIR$/src/main/resources/static/css/style.css" />
-        <option value="$PROJECT_DIR$/src/main/resources/templates/config/container/print.html" />
-        <option value="$PROJECT_DIR$/src/main/resources/templates/config/location/location.html" />
-        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/controller/LocationController.java" />
-        <option value="$PROJECT_DIR$/src/main/resources/templates/config/location/print.html" />
-        <option value="$PROJECT_DIR$/src/main/resources/templates/config/material/material.html" />
-        <option value="$PROJECT_DIR$/src/main/resources/templates/config/material/report.html" />
         <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/controller/MaterialController.java" />
         <option value="$PROJECT_DIR$/src/main/resources/templates/config/material/print.html" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/cycleCountHeader/controller/CycleCountHeaderController.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/templates/inventory/cycleCountHeader/add.html" />
+        <option value="$PROJECT_DIR$/src/main/resources/templates/shipment/shipmentHeader/report.html" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/service/CycleCountService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/domain/CycCountDomain.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/cycleCountDetail/controller/CycleCountDetailController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/controller/CycleCountApi.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/domain/AdjustDomain.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/controller/AdjustApi.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/adjustDetail/controller/adjustDetailController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/service/AdjustService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/service/ReceiptApiService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/api/general/controller/ReceiptApi.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/general/MobileUserController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/domain/MobileTask.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/mybatis/config/LocationMapper.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderServiceImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/mapper/MaterialMapper.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/mybatis/config/MaterialMapper.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeader/mapper/ReceiptHeaderMapper.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/mybatis/receipt/ReceiptHeaderMapper.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/service/LocationService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/MobileShipmentController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MobilePutawayController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/service/MaterialService.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/service/MaterialServiceImpl.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/wcsScanBarcode/WcsScanBarcodeController.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/application-dev.yml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ApkInfo.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ret/ServiceException.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/Constant.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ApkMapper.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/mapper/ApkMapper.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/framework/config/ShiroConfig.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/mybatis/download/DownloadMapper.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/pc/common/mapper/ApkMapper.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ApkController.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java" />
       </list>
     </option>
   </component>
+  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsGulpfileManager">
+    <detection-done>true</detection-done>
+    <sorting>DEFINITION_ORDER</sorting>
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="importingSettings">
+      <MavenImportingSettings>
+        <option name="importAutomatically" value="true" />
+      </MavenImportingSettings>
+    </option>
+  </component>
   <component name="MavenProjectNavigator">
     <treeState>
       <expand>
@@ -142,10 +225,14 @@
       <select />
     </treeState>
   </component>
+  <component name="NodePackageJsonFileManager">
+    <packageJsonPaths />
+  </component>
   <component name="ProjectFrameBounds" extendedState="6">
-    <option name="x" value="470" />
-    <option name="width" value="980" />
-    <option name="height" value="1030" />
+    <option name="x" value="-10" />
+    <option name="y" value="-10" />
+    <option name="width" value="1400" />
+    <option name="height" value="780" />
   </component>
   <component name="ProjectId" id="1QOzUtfkdeRmYuw3MIDHXXMLsFH" />
   <component name="ProjectLevelVcsManager">
@@ -156,8 +243,7 @@
       <foldersAlwaysOnTop value="true" />
     </navigator>
     <panes>
-      <pane id="Scope" />
-      <pane id="PackagesPane" />
+      <pane id="AndroidView" />
       <pane id="ProjectPane">
         <subPane>
           <expand>
@@ -208,53 +294,7 @@
               <item name="java" type="462c0819:PsiDirectoryNode" />
               <item name="com" type="462c0819:PsiDirectoryNode" />
               <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="api" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="com" type="462c0819:PsiDirectoryNode" />
-              <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="com" type="462c0819:PsiDirectoryNode" />
-              <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-              <item name="config" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="com" type="462c0819:PsiDirectoryNode" />
-              <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-              <item name="config" type="462c0819:PsiDirectoryNode" />
-              <item name="location" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="com" type="462c0819:PsiDirectoryNode" />
-              <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-              <item name="config" type="462c0819:PsiDirectoryNode" />
-              <item name="location" type="462c0819:PsiDirectoryNode" />
-              <item name="controller" type="462c0819:PsiDirectoryNode" />
+              <item name="mobile" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
@@ -264,92 +304,8 @@
               <item name="java" type="462c0819:PsiDirectoryNode" />
               <item name="com" type="462c0819:PsiDirectoryNode" />
               <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-              <item name="config" type="462c0819:PsiDirectoryNode" />
-              <item name="material" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="com" type="462c0819:PsiDirectoryNode" />
-              <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-              <item name="config" type="462c0819:PsiDirectoryNode" />
-              <item name="material" type="462c0819:PsiDirectoryNode" />
-              <item name="controller" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="com" type="462c0819:PsiDirectoryNode" />
-              <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-              <item name="inventory" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="com" type="462c0819:PsiDirectoryNode" />
-              <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-              <item name="inventory" type="462c0819:PsiDirectoryNode" />
-              <item name="inventoryTransaction" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="com" type="462c0819:PsiDirectoryNode" />
-              <item name="huaheng" type="462c0819:PsiDirectoryNode" />
-              <item name="pc" type="462c0819:PsiDirectoryNode" />
-              <item name="inventory" type="462c0819:PsiDirectoryNode" />
-              <item name="inventoryTransaction" type="462c0819:PsiDirectoryNode" />
-              <item name="controller" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="resources" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="resources" type="462c0819:PsiDirectoryNode" />
-              <item name="templates" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="resources" type="462c0819:PsiDirectoryNode" />
-              <item name="templates" type="462c0819:PsiDirectoryNode" />
-              <item name="config" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
-              <item name="wms2" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="resources" type="462c0819:PsiDirectoryNode" />
-              <item name="templates" type="462c0819:PsiDirectoryNode" />
-              <item name="config" type="462c0819:PsiDirectoryNode" />
-              <item name="material" type="462c0819:PsiDirectoryNode" />
+              <item name="mobile" type="462c0819:PsiDirectoryNode" />
+              <item name="receipt" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
@@ -357,8 +313,6 @@
               <item name="src" type="462c0819:PsiDirectoryNode" />
               <item name="main" type="462c0819:PsiDirectoryNode" />
               <item name="resources" type="462c0819:PsiDirectoryNode" />
-              <item name="templates" type="462c0819:PsiDirectoryNode" />
-              <item name="inventory" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="wms2" type="b2602c69:ProjectViewProjectNode" />
@@ -366,14 +320,14 @@
               <item name="src" type="462c0819:PsiDirectoryNode" />
               <item name="main" type="462c0819:PsiDirectoryNode" />
               <item name="resources" type="462c0819:PsiDirectoryNode" />
-              <item name="templates" type="462c0819:PsiDirectoryNode" />
-              <item name="inventory" type="462c0819:PsiDirectoryNode" />
-              <item name="inventoryTransaction" type="462c0819:PsiDirectoryNode" />
+              <item name="mybatis" type="462c0819:PsiDirectoryNode" />
             </path>
           </expand>
           <select />
         </subPane>
       </pane>
+      <pane id="PackagesPane" />
+      <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
@@ -383,11 +337,12 @@
     <property name="RequestMappingsPanelOrder1" value="1" />
     <property name="RequestMappingsPanelWidth0" value="75" />
     <property name="RequestMappingsPanelWidth1" value="75" />
+    <property name="SearchEverywhereHistoryKey" value="Shiro&#9;PSI&#9;JAVA://com.huaheng.framework.config.ShiroConfig&#10;LocationSer&#9;PSI&#9;JAVA://com.huaheng.pc.config.location.service.LocationService" />
     <property name="WebServerToolWindowFactoryState" value="false" />
     <property name="aspect.path.notification.shown" value="true" />
-    <property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1578455422696" />
+    <property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1579247661958" />
     <property name="full.screen.before.presentation.mode" value="false" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/src/main/resources/static/ajax/libs/bootstrap-table/extensions/editable" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
     <property name="node.js.detected.package.eslint" value="true" />
     <property name="node.js.detected.package.tslint" value="true" />
     <property name="node.js.path.for.package.eslint" value="project" />
@@ -402,17 +357,22 @@
     <property name="settings.editor.selected.configurable" value="preferences.pluginManager" />
   </component>
   <component name="RecentsManager">
-    <key name="MoveFile.RECENT_KEYS">
-      <recent name="E:\code\wms2\src\main\resources\templates\config\configWarning" />
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="E:\web\wms2\src\main\resources\mybatis\download" />
+      <recent name="E:\web\wms2\src\main\java\com\huaheng\mobile\download" />
+      <recent name="E:\web\wms2\src\main\java\com\huaheng" />
+      <recent name="D:\wms2\src\main\resources\templates\shipment\shipmentHeader" />
+      <recent name="D:\wms2\src\main\resources\templates\config\material" />
     </key>
     <key name="CopyClassDialog.RECENTS_KEY">
-      <recent name="com.huaheng.api.general.domain" />
+      <recent name="com.huaheng.pc.common.mapper" />
+      <recent name="com.huaheng.mobile.download" />
+      <recent name="com.huaheng.pc.receipt.receiptContainerHeader.domain" />
+      <recent name="com.huaheng.pc.task.taskHeader.domain" />
+      <recent name="com.huaheng.api.general.service" />
     </key>
-    <key name="CopyFile.RECENT_KEYS">
-      <recent name="D:\wms2\src\main\resources\templates\config\material" />
-      <recent name="D:\wms2\src\main\resources\templates\config\location" />
-      <recent name="D:\wms2\src\main\resources\templates\config\container" />
-      <recent name="E:\code\wms2\src\main\resources\static\ajax\libs\bootstrap-table\extensions\editable" />
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="E:\code\wms2\src\main\resources\templates\config\configWarning" />
     </key>
   </component>
   <component name="RunAnythingCache">
@@ -438,7 +398,7 @@
     </option>
     <option name="contentProportion" value="0.012987013" />
   </component>
-  <component name="RunManager" selected="Spring Boot.HuaHengApplication (1)">
+  <component name="RunManager" selected="Spring Boot.HuaHengApplication">
     <configuration name="EncryptPassword" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
       <option name="MAIN_CLASS_NAME" value="com.huaheng.test.EncryptPassword" />
       <module name="huaheng" />
@@ -448,9 +408,6 @@
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
     </configuration>
     <configuration name="MqTest.send" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
       <module name="huaheng" />
@@ -460,13 +417,20 @@
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
       <option name="PACKAGE_NAME" value="com.huaheng.test" />
       <option name="MAIN_CLASS_NAME" value="com.huaheng.test.MqTest" />
       <option name="METHOD_NAME" value="send" />
       <option name="TEST_OBJECT" value="method" />
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
+      <option name="VM_PARAMETERS" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <patterns />
     </configuration>
     <configuration name="ServiceTest.sendSimpleMail" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
       <module name="huaheng" />
@@ -476,13 +440,20 @@
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
+      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+      <option name="ALTERNATIVE_JRE_PATH" />
       <option name="PACKAGE_NAME" value="com.huaheng.test" />
       <option name="MAIN_CLASS_NAME" value="com.huaheng.test.ServiceTest" />
       <option name="METHOD_NAME" value="sendSimpleMail" />
       <option name="TEST_OBJECT" value="method" />
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
+      <option name="VM_PARAMETERS" />
+      <option name="PARAMETERS" />
+      <option name="WORKING_DIRECTORY" />
+      <option name="PASS_PARENT_ENVS" value="true" />
+      <option name="TEST_SEARCH_SCOPE">
+        <value defaultName="singleModule" />
+      </option>
+      <patterns />
     </configuration>
     <configuration name="HuaHengApplication (1)" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
       <module name="wms2" />
@@ -493,9 +464,6 @@
         </pattern>
       </extension>
       <option name="SPRING_BOOT_MAIN_CLASS" value="com.huaheng.HuaHengApplication" />
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
     </configuration>
     <configuration name="HuaHengApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
       <module name="huaheng" />
@@ -509,9 +477,6 @@
       <option name="ALTERNATIVE_JRE_PATH" />
       <option name="UPDATE_ACTION_UPDATE_POLICY" value="UpdateResources" />
       <option name="FRAME_DEACTIVATION_UPDATE_POLICY" value="UpdateClassesAndResources" />
-      <method v="2">
-        <option name="Make" enabled="true" />
-      </method>
     </configuration>
     <list>
       <item itemvalue="Application.EncryptPassword" />
@@ -522,8 +487,8 @@
     </list>
     <recent_temporary>
       <list>
-        <item itemvalue="Spring Boot.HuaHengApplication (1)" />
         <item itemvalue="Spring Boot.HuaHengApplication" />
+        <item itemvalue="Spring Boot.HuaHengApplication (1)" />
         <item itemvalue="JUnit.ServiceTest.sendSimpleMail" />
         <item itemvalue="JUnit.MqTest.send" />
         <item itemvalue="Application.EncryptPassword" />
@@ -742,14 +707,17 @@
       <workItem from="1578293993555" duration="9808000" />
       <workItem from="1578358115196" duration="1507000" />
       <workItem from="1578379653786" duration="11257000" />
-      <workItem from="1578444006015" duration="7109000" />
-    </task>
-    <task id="LOCAL-00026" summary="添加自动生成容器编码">
-      <created>1569484931952</created>
-      <option name="number" value="00026" />
-      <option name="presentableId" value="LOCAL-00026" />
-      <option name="project" value="LOCAL" />
-      <updated>1569484931952</updated>
+      <workItem from="1578444006015" duration="19976000" />
+      <workItem from="1578529843067" duration="14401000" />
+      <workItem from="1578563682646" duration="32000" />
+      <workItem from="1578620227025" duration="6145000" />
+      <workItem from="1578880033342" duration="15319000" />
+      <workItem from="1578962187281" duration="17339000" />
+      <workItem from="1579048372056" duration="1299000" />
+      <workItem from="1579135252936" duration="19097000" />
+      <workItem from="1579221601177" duration="15358000" />
+      <workItem from="1582509082347" duration="14821000" />
+      <workItem from="1582590353002" duration="16210000" />
     </task>
     <task id="LOCAL-00027" summary="修改入库首选项页面,规则查询使用数据字典值,表格值显示修改">
       <created>1569553028716</created>
@@ -1087,50 +1055,58 @@
       <option name="project" value="LOCAL" />
       <updated>1578455348001</updated>
     </task>
-    <option name="localTasksCounter" value="75" />
+    <task id="LOCAL-00075" summary="物料打印">
+      <created>1578455439194</created>
+      <option name="number" value="00075" />
+      <option name="presentableId" value="LOCAL-00075" />
+      <option name="project" value="LOCAL" />
+      <updated>1578455439194</updated>
+    </task>
+    <option name="localTasksCounter" value="76" />
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="158484000" />
+    <option name="totallyTimeSpent" value="291372000" />
   </component>
   <component name="ToolWindowManager">
     <frame x="-7" y="-7" width="1550" height="838" extended-state="6" />
-    <editor active="true" />
     <layout>
-      <window_info content_ui="combo" id="Project" order="0" sideWeight="0.4978903" visible="true" weight="0.23391421" />
-      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
-      <window_info id="Designer" order="2" />
-      <window_info id="Image Layers" order="3" />
+      <window_info anchor="right" id="Palette" order="4" />
+      <window_info anchor="bottom" id="Event Log" order="10" sideWeight="0.08847185" side_tool="true" weight="0.43909347" />
+      <window_info anchor="right" id="Maven Projects" order="5" weight="0.3297587" />
+      <window_info anchor="bottom" id="Database Changes" order="12" />
       <window_info id="Capture Tool" order="4" />
+      <window_info id="Designer" order="2" />
+      <window_info anchor="bottom" id="Statistic" order="11" />
+      <window_info anchor="right" id="Database" order="6" />
+      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
       <window_info id="UI Designer" order="5" />
-      <window_info id="Favorites" order="6" sideWeight="0.5021097" side_tool="true" weight="0.308311" />
-      <window_info id="Web" order="7" side_tool="true" />
-      <window_info anchor="bottom" id="Message" order="0" />
-      <window_info anchor="bottom" id="Find" order="1" />
-      <window_info anchor="bottom" id="Run" order="2" />
       <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
-      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
-      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
       <window_info anchor="bottom" id="TODO" order="6" />
+      <window_info anchor="bottom" id="Messages" order="15" sideWeight="0.49932975" weight="0.3281027" />
+      <window_info anchor="right" id="Palette&#9;" order="7" />
+      <window_info id="Image Layers" order="3" />
+      <window_info anchor="bottom" id="Java Enterprise" order="11" />
+      <window_info anchor="right" id="Capture Analysis" order="5" />
+      <window_info active="true" anchor="bottom" id="Run Dashboard" order="14" sideWeight="0.91152817" visible="true" weight="0.33808845" />
+      <window_info anchor="bottom" id="Version Control" order="13" sideWeight="0.91152817" weight="0.32719547" />
+      <window_info anchor="bottom" id="Run" order="2" />
       <window_info anchor="bottom" id="Spring" order="7" />
       <window_info anchor="bottom" id="Terminal" order="8" />
-      <window_info anchor="bottom" id="Docker" order="9" show_stripe_button="false" />
-      <window_info anchor="bottom" id="Event Log" order="10" sideWeight="0.09048257" side_tool="true" weight="0.44192636" />
-      <window_info anchor="bottom" id="Java Enterprise" order="11" />
-      <window_info anchor="bottom" id="Database Changes" order="12" />
-      <window_info anchor="bottom" id="Version Control" order="13" sideWeight="0.91152817" weight="0.3281471" />
-      <window_info active="true" anchor="bottom" id="Run Dashboard" order="14" sideWeight="0.9095174" visible="true" weight="0.43342775" />
-      <window_info anchor="bottom" id="Messages" order="15" sideWeight="0.49932975" weight="0.3286119" />
+      <window_info content_ui="combo" id="Project" order="0" sideWeight="0.4978903" visible="true" weight="0.3069705" />
+      <window_info anchor="right" id="Bean Validation" order="9" weight="0.3297587" />
+      <window_info id="Web" order="7" side_tool="true" />
+      <window_info anchor="bottom" id="Find" order="1" weight="0.32952926" />
+      <window_info anchor="right" id="Theme Preview" order="8" />
+      <window_info id="Favorites" order="6" sideWeight="0.5021097" side_tool="true" weight="0.308311" />
+      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
       <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
-      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
-      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+      <window_info anchor="bottom" id="Docker" order="9" show_stripe_button="false" />
+      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
+      <window_info anchor="bottom" id="Message" order="0" />
       <window_info anchor="right" id="Maven" order="3" weight="0.3297587" />
-      <window_info anchor="right" id="Palette" order="4" />
-      <window_info anchor="right" id="Capture Analysis" order="5" />
-      <window_info anchor="right" id="Database" order="6" />
-      <window_info anchor="right" id="Palette&#9;" order="7" />
-      <window_info anchor="right" id="Theme Preview" order="8" />
-      <window_info anchor="right" id="Bean Validation" order="9" weight="0.3297587" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
     </layout>
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -1154,20 +1130,9 @@
         </entry>
       </map>
     </option>
-    <option name="RECENT_FILTERS">
-      <map>
-        <entry key="Branch">
-          <value>
-            <list />
-          </value>
-        </entry>
-        <entry key="User">
-          <value>
-            <list />
-          </value>
-        </entry>
-      </map>
-    </option>
+  </component>
+  <component name="VcsContentAnnotationSettings">
+    <option name="myLimit" value="2678400000" />
   </component>
   <component name="VcsManagerConfiguration">
     <MESSAGE value="修改接口实体类" />
@@ -1199,92 +1164,10 @@
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
-      <breakpoints>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/bom/controller/BomHeaderController.java</url>
-          <line>164</line>
-          <properties />
-          <option name="timeStamp" value="24" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/check/checkingRegister/controller/CheckingRegisterController.java</url>
-          <line>179</line>
-          <properties />
-          <option name="timeStamp" value="28" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/configValue/controller/ConfigValueController.java</url>
-          <line>141</line>
-          <properties />
-          <option name="timeStamp" value="66" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java</url>
-          <line>190</line>
-          <properties />
-          <option name="timeStamp" value="87" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/WarecellAllocationServiceImpl.java</url>
-          <line>194</line>
-          <properties>
-            <option name="lambda-ordinal" value="-1" />
-          </properties>
-          <option name="timeStamp" value="112" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java</url>
-          <line>107</line>
-          <properties />
-          <option name="timeStamp" value="121" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/configWarning/service/ConfigWarningService.java</url>
-          <line>110</line>
-          <properties />
-          <option name="timeStamp" value="124" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/configWarning/service/ConfigWarningService.java</url>
-          <line>140</line>
-          <properties />
-          <option name="timeStamp" value="125" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/configWarning/service/ConfigWarningService.java</url>
-          <line>118</line>
-          <properties />
-          <option name="timeStamp" value="126" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/configWarning/service/ConfigWarningService.java</url>
-          <line>109</line>
-          <properties />
-          <option name="timeStamp" value="127" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java</url>
-          <line>709</line>
-          <properties />
-          <option name="timeStamp" value="135" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeader/controller/ReceiptHeaderController.java</url>
-          <line>198</line>
-          <properties />
-          <option name="timeStamp" value="139" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="javascript">
-          <url>file://$PROJECT_DIR$/src/main/resources/templates/check/checkingRegister/checkingRegister.html</url>
-          <line>308</line>
-          <option name="timeStamp" value="29" />
-        </line-breakpoint>
-        <line-breakpoint enabled="true" type="javascript">
-          <url>file://$PROJECT_DIR$/src/main/resources/templates/config/waveFlowHeader/waveFlowHeader.html</url>
-          <line>71</line>
-          <option name="timeStamp" value="43" />
-        </line-breakpoint>
-      </breakpoints>
+      <breakpoints-dialog>
+        <breakpoints-dialog />
+      </breakpoints-dialog>
+      <option name="time" value="8" />
     </breakpoint-manager>
     <watches-manager>
       <configuration name="SpringBootApplicationConfigurationType">
@@ -1298,399 +1181,351 @@
     </SUITE>
   </component>
   <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/src/main/resources/static/js/qrcode/qrcode.min.js">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state>
-          <caret column="4" selection-start-column="4" selection-end-column="4" />
+        <state relative-caret-position="268">
+          <caret line="63" column="34" selection-start-line="63" selection-start-column="15" selection-end-line="63" selection-end-column="34" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/receipt/receiptHeader/receiptHeader.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="152">
-          <caret line="675" column="43" lean-forward="true" selection-start-line="675" selection-start-column="43" selection-end-line="675" selection-end-column="43" />
+        <state relative-caret-position="28823">
+          <caret line="1593" column="40" selection-start-line="1593" selection-start-column="40" selection-end-line="1593" selection-end-column="40" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/receipt/receiptHeader/add.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MaterialInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-962" />
+        <state relative-caret-position="57">
+          <caret line="3" column="2" lean-forward="true" selection-start-line="3" selection-start-column="2" selection-end-line="3" selection-end-column="2" />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$USER_HOME$/Desktop/长沙华恒企网2.0_new/答题HTML/答题HTML/answer.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MobilePutawayController.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-171" />
+        <state relative-caret-position="513">
+          <caret line="46" column="7" selection-start-line="46" selection-start-column="7" selection-end-line="46" selection-end-column="7" />
+        </state>
       </provider>
     </entry>
-    <entry file="jar://$MAVEN_REPOSITORY$/com/alibaba/druid/1.1.18/druid-1.1.18.jar!/support/http/resources/css/bootstrap.min.css">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/MobileShipmentController.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="152">
-          <caret line="8" column="25402" selection-start-line="8" selection-start-column="25402" selection-end-line="8" selection-end-column="25402" />
+        <state relative-caret-position="950">
+          <caret line="76" column="69" selection-start-line="76" selection-start-column="69" selection-end-line="76" selection-end-column="69" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/static/css/main/style.min862f.css">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/shipment/MobileTaskForASRSController.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state>
-          <caret column="49663" selection-start-column="49663" selection-end-column="49663" />
+        <state relative-caret-position="399">
+          <caret line="35" column="16" selection-start-line="35" selection-start-column="16" selection-end-line="35" selection-end-column="16" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/static/css/bootstrap.min.css">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/service/MaterialService.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="127">
-          <caret line="2721" column="1" selection-start-line="2721" selection-start-column="1" selection-end-line="2721" selection-end-column="1" />
+        <state relative-caret-position="589">
+          <caret line="36" selection-start-line="36" selection-end-line="36" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/static/css/style.css">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/wcsScanBarcode/WcsScanBarcodeController.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/resources/application-prd.yml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="241">
-          <caret line="3360" column="17" lean-forward="true" selection-start-line="3360" selection-start-column="17" selection-end-line="3360" selection-end-column="17" />
+        <state relative-caret-position="209">
+          <caret line="11" column="10" selection-start-line="11" selection-start-column="10" selection-end-line="11" selection-end-column="10" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/receipt/receiptHeader/report.html">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/application-dev.yml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1330">
-          <caret line="70" column="4" lean-forward="true" selection-start-line="70" selection-start-column="4" selection-end-line="70" selection-end-column="22" />
-          <folding>
-            <element signature="n#style#0;n#span#1;n#td#0;n#tr#0;n#thead#0;n#table#0;n#div#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
+        <state relative-caret-position="1292">
+          <caret line="68" column="19" selection-start-line="68" selection-start-column="19" selection-end-line="68" selection-end-column="19" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/config/container/print.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/service/MaterialServiceImpl.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="551">
-          <caret line="29" column="24" lean-forward="true" selection-start-line="29" selection-start-column="24" selection-end-line="29" selection-end-column="24" />
-          <folding>
-            <element signature="n#style#0;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#div#0;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#table#0;n#div#0;n#div#0;n#div#0;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#table#0;n#div#1;n#div#0;n#div#0;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
+        <state relative-caret-position="271">
+          <caret line="160" column="5" selection-start-line="160" selection-start-column="5" selection-end-line="160" selection-end-column="5" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$USER_HOME$/Desktop/boot/boot/打印二维码 - 多个组2.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/shipment/shippingCombination/domain/ShippingSearch.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="19">
-          <caret line="47" column="36" selection-start-line="47" selection-start-column="36" selection-end-line="47" selection-end-column="36" />
+        <state relative-caret-position="145">
+          <caret line="46" column="18" selection-start-line="46" selection-start-column="18" selection-end-line="46" selection-end-column="18" />
           <folding>
-            <element signature="n#style#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#div#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#caption#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#0;n#tbody#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#tr#1;n#tbody#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#1;n#tbody#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#2;n#tr#1;n#tbody#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#img#0;n#td#2;n#tr#1;n#tbody#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#2;n#tbody#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#3;n#tbody#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#input#0;n#td#1;n#tr#3;n#tbody#0;n#table#0;n#div#1;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#caption#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#0;n#tbody#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#tr#1;n#tbody#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#1;n#tbody#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#2;n#tr#1;n#tbody#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#img#0;n#td#2;n#tr#1;n#tbody#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#2;n#tbody#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="e#3995#4001#0" expanded="true" />
-            <element signature="e#4001#4007#0" expanded="true" />
-            <element signature="e#4007#4013#0" expanded="true" />
-            <element signature="e#4013#4019#0" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#3;n#tbody#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#input#0;n#td#1;n#tr#3;n#tbody#0;n#table#0;n#div#2;n#div#1;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
+            <element signature="e#990#991#0" expanded="true" />
+            <element signature="e#1024#1025#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/service/taskFinish/TaskFinishServiceImpl.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/general/MobileUserController.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="149">
-          <caret line="27" column="22" selection-start-line="27" selection-start-column="22" selection-end-line="27" selection-end-column="22" />
+        <state relative-caret-position="304">
+          <caret line="111" column="5" selection-start-line="111" selection-start-column="5" selection-end-line="111" selection-end-column="5" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/service/taskFinish/TaskFinishService.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="133">
-          <caret line="8" column="15" selection-start-line="8" selection-start-column="15" selection-end-line="8" selection-end-column="15" />
-        </state>
-      </provider>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ret/RetCode.java">
+      <provider selected="true" editor-type-id="text-editor" />
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/controller/EmptyOutHandle.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="149">
-          <caret line="24" column="13" selection-start-line="24" selection-start-column="13" selection-end-line="24" selection-end-column="13" />
-        </state>
-      </provider>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ret/RetResponse.java">
+      <provider selected="true" editor-type-id="text-editor" />
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/controller/OverrideHandle.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ret/ServiceException.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="149">
-          <caret line="23" column="13" selection-start-line="23" selection-start-column="13" selection-end-line="23" selection-end-column="13" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/controller/WarecellAllocation.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-70">
-          <caret line="41" column="67" selection-start-line="41" selection-start-column="60" selection-end-line="41" selection-end-column="67" />
+        <state relative-caret-position="285">
+          <caret line="19" column="1" lean-forward="true" selection-start-line="19" selection-start-column="1" selection-end-line="19" selection-end-column="1" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/service/taskCancel/TaskCancelServiceImpl.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ret/RetResult.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="209">
-          <caret line="19" column="11" selection-start-line="19" selection-start-column="7" selection-end-line="19" selection-end-column="11" />
+        <state relative-caret-position="95">
+          <caret line="7" column="13" selection-start-line="7" selection-start-column="13" selection-end-line="7" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/service/taskCancel/TaskCancelService.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/Constant.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="133">
-          <caret line="7" column="15" selection-start-line="7" selection-start-column="15" selection-end-line="7" selection-end-column="15" />
+          <caret line="7" selection-start-line="7" selection-end-line="7" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/controller/TaskInfoController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/application.yml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="296">
-          <caret line="24" column="34" lean-forward="true" selection-start-line="24" selection-start-column="34" selection-end-line="24" selection-end-column="34" />
+        <state relative-caret-position="95">
+          <caret line="5" column="3" selection-start-line="5" selection-start-column="3" selection-end-line="5" selection-end-column="3" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/controller/TaskFinish.java">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/application-druid.properties">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="310">
-          <caret line="35" column="59" lean-forward="true" selection-start-line="35" selection-start-column="59" selection-end-line="35" selection-end-column="59" />
+        <state relative-caret-position="437">
+          <caret line="23" column="15" selection-start-line="23" selection-start-column="15" selection-end-line="23" selection-end-column="15" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/general/controller/BasicDataApi.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/domain/ReceiptDetail.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="291">
-          <caret line="170" column="1" selection-start-line="170" selection-start-column="1" selection-end-line="170" selection-end-column="1" />
+        <state relative-caret-position="-437">
+          <caret line="15" column="13" selection-start-line="15" selection-start-column="13" selection-end-line="15" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/wcs/domain/WcsTask.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="149">
-          <caret line="14" column="13" selection-start-line="14" selection-start-column="13" selection-end-line="14" selection-end-column="13" />
+        <state relative-caret-position="494">
+          <caret line="67" column="31" selection-start-line="67" selection-start-column="12" selection-end-line="67" selection-end-column="31" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/general/service/ReceiptApiService.java">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/task/TaskDetailMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="247">
-          <caret line="44" column="13" selection-start-line="44" selection-start-column="13" selection-end-line="44" selection-end-column="13" />
+        <state relative-caret-position="171">
+          <caret line="9" column="32" lean-forward="true" selection-start-line="9" selection-start-column="32" selection-end-line="9" selection-end-column="32" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/general/controller/ReceiptController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/task/TaskHeaderMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="494">
-          <caret line="35" column="51" selection-start-line="35" selection-start-column="51" selection-end-line="35" selection-end-column="51" />
+        <state relative-caret-position="-95">
+          <caret line="13" column="25" lean-forward="true" selection-start-line="13" selection-start-column="25" selection-end-line="13" selection-end-column="25" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/general/service/ReceiptService.java">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/task/TaskPreferenceMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="665">
-          <caret line="64" column="42" selection-start-line="64" selection-start-column="33" selection-end-line="64" selection-end-column="42" />
-        </state>
+        <state relative-caret-position="-342" />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/HuaHengServletInitializer.java">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/system/DeptMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="150">
-          <caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" />
+        <state relative-caret-position="266">
+          <caret line="14" column="26" selection-start-line="14" selection-start-column="26" selection-end-line="14" selection-end-column="26" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/application-dev.yml">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptDetail/mapper/ReceiptDetailMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="189">
-          <caret line="66" column="12" lean-forward="true" selection-start-line="66" selection-start-column="12" selection-end-line="66" selection-end-column="12" />
+        <state relative-caret-position="76">
+          <caret line="4" column="56" lean-forward="true" selection-start-line="4" selection-start-column="56" selection-end-line="4" selection-end-column="56" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/application.yml">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/receipt/ReceiptDetailMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-824" />
+        <state relative-caret-position="-576">
+          <caret line="70" column="5" lean-forward="true" selection-start-line="70" selection-start-column="5" selection-end-line="70" selection-end-column="5" />
+        </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/HuaHengApplication.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-26">
-          <caret line="15" column="13" selection-start-line="15" selection-start-column="13" selection-end-line="15" selection-end-column="13" />
+        <state relative-caret-position="157">
+          <caret line="46" column="13" lean-forward="true" selection-start-line="46" selection-start-column="3" selection-end-line="46" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/adjustHeader/controller/adjustHeaderController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/logback.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="202">
-          <caret line="156" lean-forward="true" selection-start-line="156" selection-end-line="156" />
+        <state relative-caret-position="266">
+          <caret line="14" column="17" lean-forward="true" selection-start-line="14" selection-start-column="17" selection-end-line="14" selection-end-column="17" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/cycleCountHeader/controller/CycleCountHeaderController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/mapper/ApkMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="317">
-          <caret line="71" selection-start-line="71" selection-end-line="71" />
+        <state relative-caret-position="266">
+          <caret line="22" selection-start-line="22" selection-end-line="23" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/check/checkHeader/controller/CheckHeaderController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/framework/config/ShiroConfig.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="190">
-          <caret line="38" column="13" selection-start-line="38" selection-start-column="13" selection-end-line="38" selection-end-column="13" />
+        <state relative-caret-position="791">
+          <caret line="267" column="71" lean-forward="true" selection-start-line="267" selection-start-column="71" selection-end-line="267" selection-end-column="71" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/general/controller/ReceiptApi.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/invenory/MobileInventory.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="304">
-          <caret line="25" column="7" selection-start-line="25" selection-start-column="7" selection-end-line="25" selection-end-column="7" />
+        <state relative-caret-position="259">
+          <caret line="18" column="15" lean-forward="true" selection-start-line="18" selection-start-column="15" selection-end-line="18" selection-end-column="15" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/api/general/domain/ReceiptDomain.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/check/checkDetail/mapper/CheckDetailMapper.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="95">
-          <caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" />
+          <caret line="6" column="1" lean-forward="true" selection-start-line="6" selection-start-column="1" selection-end-line="6" selection-end-column="1" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/container/controller/ContainerController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/check/CheckHeaderMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="2812">
-          <caret line="181" selection-start-line="181" selection-end-line="195" selection-end-column="5" />
+        <state relative-caret-position="-57">
+          <caret line="21" column="71" lean-forward="true" selection-start-line="21" selection-start-column="71" selection-end-line="21" selection-end-column="71" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/config/container/container.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/check/checkingRegister/mapper/CheckingRegisterMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="61">
-          <caret line="202" selection-start-line="202" selection-end-line="214" selection-end-column="9" />
+        <state relative-caret-position="76">
+          <caret line="5" column="17" selection-start-line="5" selection-start-column="17" selection-end-line="5" selection-end-column="17" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$APPLICATION_HOME_DIR$/plugins/JavaScriptLanguage/jsLanguageServicesImpl/external/lib.es5.d.ts">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerDetail/mapper/ReceiptContainerDetailMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="166">
-          <caret line="1215" column="4" selection-start-line="1215" selection-start-column="4" selection-end-line="1215" selection-end-column="4" />
+        <state relative-caret-position="76">
+          <caret line="5" column="17" selection-start-line="5" selection-start-column="17" selection-end-line="5" selection-end-column="17" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/static/js/echarts/echarts.js">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/mapper/ReceiptContainerHeaderMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="190">
-          <caret line="11245" column="4" selection-start-line="11245" selection-start-column="4" selection-end-line="11245" selection-end-column="4" />
+        <state relative-caret-position="76">
+          <caret line="5" column="17" selection-start-line="5" selection-start-column="17" selection-end-line="5" selection-end-column="17" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$USER_HOME$/Desktop/HttpPrinter3.0.0.5_20200103_014305_%E5%90%ABhtml%E7%A4%BA%E4%BE%8B/调用示例/Http协议示例/html/http_test_fastreport.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeader/mapper/ReceiptHeaderMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-3819">
-          <caret line="207" column="42" selection-start-line="207" selection-start-column="27" selection-end-line="207" selection-end-column="42" />
+        <state relative-caret-position="114">
+          <caret line="9" column="32" lean-forward="true" selection-start-line="9" selection-start-column="32" selection-end-line="9" selection-end-column="32" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/static/js/jquery.jqprint-0.3.js">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/receipt/receiptHeaderHistory/mapper/ReceiptHeaderHistoryMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="126">
-          <caret line="60" column="104" selection-start-line="60" selection-start-column="104" selection-end-line="60" selection-end-column="104" />
+        <state relative-caret-position="95">
+          <caret line="6" column="1" lean-forward="true" selection-start-line="6" selection-start-column="1" selection-end-line="6" selection-end-column="1" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$APPLICATION_HOME_DIR$/plugins/JavaScriptLanguage/jsLanguageServicesImpl/external/browser.d.ts">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/check/checkHeader/mapper/CheckHeaderMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="240">
-          <caret line="46" column="7" selection-start-line="46" selection-start-column="7" selection-end-line="46" selection-end-column="7" />
+        <state relative-caret-position="209">
+          <caret line="12" column="1" lean-forward="true" selection-start-line="12" selection-start-column="1" selection-end-line="12" selection-end-column="1" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/inventory/inventoryTransaction/report.html">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/system/ConfigMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="665">
-          <caret line="47" column="29" lean-forward="true" selection-start-line="47" selection-start-column="29" selection-end-line="47" selection-end-column="29" />
-          <folding>
-            <element signature="n#style#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#span#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#td#1;n#tr#2;n#tbody#0;n#table#0;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
+        <state relative-caret-position="251">
+          <caret line="71" column="73" lean-forward="true" selection-start-line="71" selection-start-column="73" selection-end-line="71" selection-end-column="73" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/config/location/print.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ApkInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="146">
-          <caret line="113" lean-forward="true" selection-start-line="113" selection-end-line="113" />
+        <state relative-caret-position="171">
+          <caret line="9" column="23" lean-forward="true" selection-start-line="9" selection-start-column="23" selection-end-line="9" selection-end-column="23" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/config/location/location.html">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/config/WarehouseMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="285">
-          <caret line="75" column="45" selection-start-line="75" selection-start-column="45" selection-end-line="75" selection-end-column="45" />
+        <state relative-caret-position="1380">
+          <caret line="144" column="34" lean-forward="true" selection-start-line="144" selection-start-column="34" selection-end-line="144" selection-end-column="34" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/inventory/inventoryTransaction/inventoryTransaction.html">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/config/ZoneMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="179">
-          <caret line="310" selection-start-line="310" selection-end-line="322" selection-end-column="10" />
+        <state relative-caret-position="189">
+          <caret line="32" lean-forward="true" selection-start-line="32" selection-end-line="32" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/inventory/inventoryTransaction/controller/InventoryTransactionController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/zone/mapper/ZoneMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="241">
-          <caret line="105" column="28" lean-forward="true" selection-start-line="105" selection-start-column="28" selection-end-line="105" selection-end-column="28" />
+        <state relative-caret-position="133">
+          <caret line="9" column="44" lean-forward="true" selection-start-line="9" selection-start-column="17" selection-end-line="9" selection-end-column="44" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$USER_HOME$/Desktop/demo.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/common/mapper/ApkMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="19">
-          <caret line="1" column="6" lean-forward="true" selection-start-line="1" selection-start-column="6" selection-end-line="1" selection-end-column="6" />
+        <state relative-caret-position="167">
+          <caret line="16" column="8" selection-start-line="16" selection-start-column="8" selection-end-line="16" selection-end-column="8" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/location/controller/LocationController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/system/config/mapper/ConfigMapper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="208">
-          <caret line="317" column="50" lean-forward="true" selection-start-line="317" selection-start-column="50" selection-end-line="317" selection-end-column="50" />
+        <state relative-caret-position="164">
+          <caret line="40" column="17" lean-forward="true" selection-start-line="40" selection-start-column="17" selection-end-line="40" selection-end-column="17" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/config/material/material.html">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/mybatis/download/DownloadMapper.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-3041">
-          <caret line="67" column="12" selection-start-line="67" selection-start-column="12" selection-end-line="67" selection-end-column="12" />
+        <state relative-caret-position="114">
+          <caret line="6" column="4" selection-start-line="6" selection-start-column="4" selection-end-line="6" selection-end-column="4" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/pc/config/material/controller/MaterialController.java">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/download/ApkController.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="113">
-          <caret line="193" column="28" lean-forward="true" selection-start-line="193" selection-start-column="28" selection-end-line="193" selection-end-column="28" />
+        <state relative-caret-position="1381">
+          <caret line="86" column="13" lean-forward="true" selection-start-line="86" selection-start-column="13" selection-end-line="86" selection-end-column="13" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/resources/templates/config/material/print.html">
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="133">
-          <caret line="64" column="29" lean-forward="true" selection-start-line="64" selection-start-column="29" selection-end-line="64" selection-end-column="29" />
-          <folding>
-            <element signature="n#style#0;n#input#0;n#td#1;n#tr#4;n#tbody#0;n#table#0;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#input#0;n#td#1;n#tr#4;n#tbody#0;n#table#0;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
+        <state relative-caret-position="-1234">
+          <caret line="404" column="51" selection-start-line="404" selection-start-column="40" selection-end-line="404" selection-end-column="51" />
         </state>
       </provider>
     </entry>
diff --git a/src/main/java/com/huaheng/api/general/controller/AdjustApi.java b/src/main/java/com/huaheng/api/general/controller/AdjustApi.java
new file mode 100644
index 0000000..bb27e16
--- /dev/null
+++ b/src/main/java/com/huaheng/api/general/controller/AdjustApi.java
@@ -0,0 +1,39 @@
+package com.huaheng.api.general.controller;
+
+
+import com.huaheng.api.general.domain.AdjustDomain;
+import com.huaheng.api.general.domain.CycCountDomain;
+import com.huaheng.api.general.service.AdjustService;
+import com.huaheng.api.general.service.CycleCountService;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/adjustApi")
+@Api(tags = {"adjust"}, description = "调整单接口")
+public class AdjustApi {
+
+    @Resource
+    private AdjustService adjustService;
+
+
+    /**
+     * 同步调整单
+     */
+    @Log(title = "调整单添加", action = BusinessType.INSERT)
+    @PostMapping("/adjust")
+    @ApiOperation("调整单添加公共接口")
+    @ResponseBody
+    public AjaxResult adjust(@RequestBody AdjustDomain adjustDomain)
+    {
+        AjaxResult ajaxResult = adjustService.insertAdjust(adjustDomain);
+        return ajaxResult;
+    }
+
+}
diff --git a/src/main/java/com/huaheng/api/general/controller/CycleCountApi.java b/src/main/java/com/huaheng/api/general/controller/CycleCountApi.java
new file mode 100644
index 0000000..be468a8
--- /dev/null
+++ b/src/main/java/com/huaheng/api/general/controller/CycleCountApi.java
@@ -0,0 +1,41 @@
+package com.huaheng.api.general.controller;
+
+
+import com.huaheng.api.general.domain.CycCountDomain;
+import com.huaheng.api.general.domain.ReceiptDomain;
+import com.huaheng.api.general.service.CycleCountService;
+import com.huaheng.api.general.service.ReceiptApiService;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.inventory.cycleCountHeader.domain.CycleCountHeader;
+import com.huaheng.pc.inventory.cycleCountHeader.service.CycleCountHeaderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/cycleCountApi")
+@Api(tags = {"cycleCount"}, description = "盘点单接口")
+public class CycleCountApi {
+
+    @Resource
+    private CycleCountService cycleCountService;
+
+
+    /**
+     * 同步盘点单
+     */
+    @Log(title = "盘点单添加", action = BusinessType.INSERT)
+    @PostMapping("/adjust")
+    @ApiOperation("盘点单添加公共接口")
+    @ResponseBody
+    public AjaxResult cycleCount(@RequestBody CycCountDomain cycCountDomain)
+    {
+        AjaxResult ajaxResult = cycleCountService.insertCycleCount(cycCountDomain);
+        return ajaxResult;
+    }
+
+}
diff --git a/src/main/java/com/huaheng/api/general/controller/ReceiptApi.java b/src/main/java/com/huaheng/api/general/controller/ReceiptApi.java
index d39993d..5b60603 100644
--- a/src/main/java/com/huaheng/api/general/controller/ReceiptApi.java
+++ b/src/main/java/com/huaheng/api/general/controller/ReceiptApi.java
@@ -3,11 +3,14 @@ package com.huaheng.api.general.controller;
 
 import com.huaheng.api.general.domain.ReceiptDomain;
 import com.huaheng.api.general.service.ReceiptApiService;
+import com.huaheng.common.utils.StringUtils;
 import com.huaheng.framework.aspectj.lang.annotation.Log;
 import com.huaheng.framework.aspectj.lang.constant.BusinessType;
 import com.huaheng.framework.web.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -34,4 +37,18 @@ public class ReceiptApi {
         return ajaxResult;
     }
 
+
+    /**
+     * 取消入库单
+     */
+    @Log(title = "入库-入库单 ",operating = "入库单删除", action = BusinessType.UPDATE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(@RequestBody Integer[] ids){
+        if (StringUtils.isNull(ids)){
+            return AjaxResult.error("id为空");
+        }
+        return receiptApiService.add(ids);
+    }
+
 }
diff --git a/src/main/java/com/huaheng/api/general/controller/ReceiptController.java b/src/main/java/com/huaheng/api/general/controller/ReceiptController.java
deleted file mode 100644
index d847f6a..0000000
--- a/src/main/java/com/huaheng/api/general/controller/ReceiptController.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.huaheng.api.general.controller;
-
-import com.huaheng.api.general.domain.Receipt;
-import com.huaheng.api.general.service.ReceiptService;
-import com.huaheng.framework.aspectj.lang.annotation.Log;
-import com.huaheng.framework.aspectj.lang.constant.BusinessType;
-import com.huaheng.framework.web.domain.AjaxResult;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-
-/**
- * Created by Enzo Cotter on 2019/11/4.
- * @author mahuandong
- */
-@RestController
-@RequestMapping("/api/receipt")
-@Api(tags = {"basicData"}, description = "入库接口")
-public class ReceiptController {
-
-    @Resource
-    private ReceiptService receiptService;
-
-    /**
-     * 入库单下发
-     */
-    @Log(title = "入库单下发", action = BusinessType.INSERT)
-    @PostMapping("/insertReceipt")
-    @ApiOperation("入库单下发接口")
-    @ResponseBody
-    public AjaxResult MaterialApi(@RequestBody Receipt receipt) {
-        System.out.println("————————开始接收入库单——————————");
-        System.out.println(receipt);
-        AjaxResult ajaxResult = receiptService.insertReceipt(receipt);
-        return ajaxResult;
-    }
-
-}
diff --git a/src/main/java/com/huaheng/api/general/domain/AdjustDomain.java b/src/main/java/com/huaheng/api/general/domain/AdjustDomain.java
new file mode 100644
index 0000000..aebcff5
--- /dev/null
+++ b/src/main/java/com/huaheng/api/general/domain/AdjustDomain.java
@@ -0,0 +1,14 @@
+package com.huaheng.api.general.domain;
+
+import com.huaheng.pc.inventory.adjustDetail.domain.AdjustDetail;
+import com.huaheng.pc.inventory.adjustHeader.domain.AdjustHeader;
+import com.huaheng.pc.inventory.cycleCountHeader.domain.CycleCountHeader;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AdjustDomain {
+    private AdjustHeader adjustHeader;
+    private List<AdjustDetail> adjustDetailList;
+}
diff --git a/src/main/java/com/huaheng/api/general/domain/CycCountDomain.java b/src/main/java/com/huaheng/api/general/domain/CycCountDomain.java
new file mode 100644
index 0000000..3e5334b
--- /dev/null
+++ b/src/main/java/com/huaheng/api/general/domain/CycCountDomain.java
@@ -0,0 +1,15 @@
+package com.huaheng.api.general.domain;
+
+import com.huaheng.pc.inventory.cycleCountHeader.domain.CycleCountHeader;
+import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
+import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class CycCountDomain {
+    private CycleCountHeader cycleCountHeader;
+    private Integer[] inventoryId;
+}
diff --git a/src/main/java/com/huaheng/api/general/domain/Receipt.java b/src/main/java/com/huaheng/api/general/domain/Receipt.java
deleted file mode 100644
index ab37cd9..0000000
--- a/src/main/java/com/huaheng/api/general/domain/Receipt.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.huaheng.api.general.domain;
-
-import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
-import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * Created by Enzo Cotter on 2019/11/4.
- * @author mahuandong
- */
-@Data
-public class Receipt {
-
-    private ReceiptHeader receiptHeader;
-
-    private List<ReceiptDetail> receiptDetails;
-}
diff --git a/src/main/java/com/huaheng/api/general/service/AdjustService.java b/src/main/java/com/huaheng/api/general/service/AdjustService.java
new file mode 100644
index 0000000..1cb516b
--- /dev/null
+++ b/src/main/java/com/huaheng/api/general/service/AdjustService.java
@@ -0,0 +1,227 @@
+package com.huaheng.api.general.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.api.general.domain.AdjustDomain;
+import com.huaheng.api.general.domain.CycCountDomain;
+import com.huaheng.common.constant.QuantityConstant;
+import com.huaheng.common.exception.service.ServiceException;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.check.checkDetail.domain.CheckDetail;
+import com.huaheng.pc.check.checkDetail.service.CheckDetailService;
+import com.huaheng.pc.config.configValue.domain.ConfigValue;
+import com.huaheng.pc.config.configValue.service.ConfigValueService;
+import com.huaheng.pc.config.cycleCountPreference.service.CycleCountPreferenceService;
+import com.huaheng.pc.config.location.service.LocationService;
+import com.huaheng.pc.config.material.domain.Material;
+import com.huaheng.pc.config.material.service.MaterialService;
+import com.huaheng.pc.inventory.adjustDetail.domain.AdjustDetail;
+import com.huaheng.pc.inventory.adjustDetail.service.AdjustDetailService;
+import com.huaheng.pc.inventory.adjustHeader.domain.AdjustHeader;
+import com.huaheng.pc.inventory.adjustHeader.mapper.AdjustHeaderMapper;
+import com.huaheng.pc.inventory.adjustHeader.service.AdjustHeaderService;
+import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetail;
+import com.huaheng.pc.inventory.cycleCountDetail.service.CycleCountDetailService;
+import com.huaheng.pc.inventory.cycleCountHeader.domain.CycleCountHeader;
+import com.huaheng.pc.inventory.cycleCountHeader.service.CycleCountHeaderService;
+import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
+import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
+import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by Enzo Cotter on 2019/11/4.
+ * @author mahuandong
+ */
+@Component
+@Transactional(rollbackFor = Exception.class)
+public class AdjustService {
+
+    @Resource
+    private AdjustHeaderMapper adjustHeaderMapper;
+    @Resource
+    private AdjustDetailService adjustDetailService;
+    @Resource
+    private AdjustHeaderService adjustHeaderService;
+    @Resource
+    private InventoryDetailService inventoryDetailService;
+    @Resource
+    private CycleCountDetailService cycleCountDetailService;
+    @Resource
+    private CheckDetailService checkDetailService;
+    @Resource
+    private MaterialService materialService;
+    /**
+     * 调整单下发
+     * @param adjustDomain 调整单
+     * @return 是否下发成功
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult insertAdjust(AdjustDomain adjustDomain){
+        AdjustHeader adjustHeader =adjustDomain.getAdjustHeader();
+
+        List<AdjustDetail> adjustDetailList =adjustDomain.getAdjustDetailList();
+
+        if (adjustHeader==null || adjustDetailList==null){
+            return AjaxResult.error("主单据和单据明细信息不能为空");
+        }
+
+        if (StringUtils.isEmpty(adjustDomain.getAdjustHeader().getProblemType())){
+            return AjaxResult.error("调整类型不能为空");
+        }
+        if (StringUtils.isEmpty(adjustDomain.getAdjustHeader().getWarehouseCode())){
+            return AjaxResult.error("仓库编码不能为空");
+        }
+        if (StringUtils.isEmpty(adjustDomain.getAdjustHeader().getCompanyCode())){
+            return AjaxResult.error("货主编码不能为空");
+        }
+        AdjustHeader adjustHeaderCode= this.addSave(adjustDomain.getAdjustHeader());
+
+        //查询主单及加入仓库和货主,盘点,质检单编码
+        if(adjustHeaderCode == null){
+            return AjaxResult.error("没有对应的主单据!");
+        }
+        List<AdjustDetail> adjustDetails =new ArrayList<>();
+        for (AdjustDetail detail:adjustDetailList) {
+            detail.setWarehouseCode(adjustHeaderCode.getWarehouseCode());
+            detail.setAdjustCode(adjustHeaderCode.getCode());
+            detail.setCompanyCode(adjustHeaderCode.getCompanyCode());
+            detail.setCycleCountCode(adjustHeaderCode.getCycleCountCode());
+            detail.setCheckCode(adjustHeaderCode.getCheckCode());
+             this.addDetails(detail);
+            adjustDetails.add(detail);
+
+        }
+        AdjustDomain adjustDomainAjax =new AdjustDomain();
+        adjustDomainAjax.setAdjustHeader(adjustHeaderCode);
+        adjustDomainAjax.setAdjustDetailList(adjustDetails);
+
+        return AjaxResult.success(adjustDomainAjax);
+    }
+
+    /**
+     * 保存新增调整头
+     * @param adjustHeader
+     * @return
+     */
+    @Transactional
+    public AdjustHeader addSave(AdjustHeader adjustHeader) {
+        //校验调整类型
+        //盘点调整,质检调整需要和盘点和质检单据确认。
+        switch (adjustHeader.getProblemType()){
+            case "checkAdjust":   //质检调整
+                if(StringUtils.isEmpty(adjustHeader.getCheckCode())){
+                    throw new SecurityException("选择单据类型为质检调整时,质检单编码不能为空!");
+                }
+                break;
+            case "cyclecountAdjust":   //盘点调整
+                if(StringUtils.isEmpty(adjustHeader.getCycleCountCode())){
+                    throw new SecurityException("选择单据类型为盘点调整时,盘点单编码不能为空!");
+                }
+                break;
+            case "adjust":   //普通调整
+                if(StringUtils.isEmpty(adjustHeader.getCycleCountCode())){
+                    throw new SecurityException("选择单据类型为普通调整时,盘点单编码不能为空!");
+                }
+                break;
+
+        }
+
+        adjustHeader.setCreated(new Date());
+        adjustHeader.setCreatedBy(ShiroUtils.getLoginName());
+        adjustHeader.setCode(this.createCode());
+        if (!adjustHeaderService.save(adjustHeader)){
+            throw new SecurityException("新增调整单失败!");
+        }
+        return adjustHeader;
+    }
+
+
+    @Transactional
+    public AjaxResult addDetails(AdjustDetail adjustDetail) {
+
+        //查询主单据
+        AdjustHeader adjustHeader = new AdjustHeader();
+        adjustHeader.setCode(adjustDetail.getAdjustCode());
+        adjustHeader.setWarehouseCode(adjustDetail.getWarehouseCode());
+        adjustHeader.setCompanyCode(adjustDetail.getCompanyCode());
+        LambdaQueryWrapper<AdjustHeader> lambdaQueryWrapper = Wrappers.lambdaQuery(adjustHeader);
+        adjustHeader = adjustHeaderService.getOne(lambdaQueryWrapper);
+        //检查库存
+        if((adjustDetail.getInventoryDetailId()) != null){
+            InventoryDetail inventoryDetail = inventoryDetailService.getById(adjustDetail.getInventoryDetailId());
+            if(inventoryDetail == null){
+                return AjaxResult.error("没有该条库存明细");
+            }
+        }
+        //明细单据的上层单编码需要和主单一直,主单空值则不判断
+        if(StringUtils.isNotEmpty(adjustHeader.getCycleCountCode()) || StringUtils.isNotEmpty(adjustHeader.getCheckCode())){
+            adjustDetail.setCycleCountCode(adjustHeader.getCycleCountCode());
+            adjustDetail.setCheckCode(adjustHeader.getCheckCode());
+        }
+        //检查盘点单
+        if(StringUtils.isNotEmpty(adjustDetail.getCycleCountCode())){
+            LambdaQueryWrapper<CycleCountDetail> queryCycleCountCode = Wrappers.lambdaQuery();
+            queryCycleCountCode.eq(CycleCountDetail::getCycleCountHeadCode,adjustDetail.getCycleCountCode());
+            CycleCountDetail cycleCountDetail = cycleCountDetailService.list(queryCycleCountCode).get(0);
+            if(cycleCountDetail == null || !cycleCountDetail.getCycleCountHeadCode().equals(adjustDetail.getCycleCountCode())){
+                return AjaxResult.error("盘点单错误,请核对盘点单据!");
+            }
+        }
+        //检查质检单
+        if(StringUtils.isNotEmpty(adjustDetail.getCheckCode())){
+            CheckDetail checkDetail = checkDetailService.getById(adjustDetail.getCheckDetailId());
+            if(checkDetail == null || !checkDetail.getCheckCode().equals(adjustDetail.getCheckCode())){
+                return AjaxResult.error("质检单错误,请核对质检单据!");
+            }
+        }
+        //检查物料
+        Material material = materialService.findAllByCode(adjustDetail.getMaterialCode());
+        if(material == null){
+            return AjaxResult.error("物料编码错误!");
+        }
+
+        adjustDetail.setProblemType(adjustHeader.getProblemType());//调整类型
+        adjustDetail.setMaterialUnit(material.getUnit());
+        adjustDetail.setMaterialSpec(material.getSpec());
+        adjustDetail.setCreated(new Date());
+        adjustDetail.setCreatedBy(ShiroUtils.getLoginName());
+        adjustDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+        adjustDetail.setLastUpdated(new Date());
+        adjustDetailService.saveOrUpdate(adjustDetail);
+
+        return AjaxResult.success("新增调整明细成功!");
+    }
+
+
+
+    //生成差异单号
+    public String createCode() {
+        String code;
+        Date now = new Date();
+        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
+        String maxCode =  adjustHeaderMapper.getLastCode();;
+        //如果指定类型的最后的code存在,并且日期一致。那么 code = 单类型 + 年月日 + (排序号 + 1)
+        if (maxCode != null && maxCode.substring(maxCode.length() - 13, maxCode.length() - 5).equals(df.format(now)))
+        {
+            Integer Count = Integer.valueOf(maxCode.substring(maxCode.length() - 5, maxCode.length()));
+            code = "AD" + df.format(now) + String.format("%05d", Count + 1);
+        }
+        else
+        {
+            code = "AD" + df.format(now) + "00001";
+        }
+        return code;
+    }
+
+}
diff --git a/src/main/java/com/huaheng/api/general/service/CycleCountService.java b/src/main/java/com/huaheng/api/general/service/CycleCountService.java
new file mode 100644
index 0000000..fa6590c
--- /dev/null
+++ b/src/main/java/com/huaheng/api/general/service/CycleCountService.java
@@ -0,0 +1,172 @@
+package com.huaheng.api.general.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.api.general.domain.CycCountDomain;
+import com.huaheng.common.constant.QuantityConstant;
+import com.huaheng.common.exception.service.ServiceException;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.config.configValue.domain.ConfigValue;
+import com.huaheng.pc.config.configValue.service.ConfigValueService;
+import com.huaheng.pc.config.cycleCountPreference.service.CycleCountPreferenceService;
+import com.huaheng.pc.config.location.service.LocationService;
+import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetail;
+import com.huaheng.pc.inventory.cycleCountDetail.service.CycleCountDetailService;
+import com.huaheng.pc.inventory.cycleCountHeader.domain.CycleCountHeader;
+import com.huaheng.pc.inventory.cycleCountHeader.service.CycleCountHeaderService;
+import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
+import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
+import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by Enzo Cotter on 2019/11/4.
+ * @author mahuandong
+ */
+@Component
+@Transactional(rollbackFor = Exception.class)
+public class CycleCountService {
+
+    @Resource
+    private CycleCountHeaderService cycleCountHeaderService;
+    @Resource
+    private CycleCountDetailService cycleCountDetailService;
+    @Resource
+    private InventoryDetailService inventoryDetailService;
+    @Resource
+    private LocationService locationService;
+    @Resource
+    private TaskHeaderService taskHeaderService;
+    @Resource
+    private TaskDetailService taskDetailService;
+    @Resource
+    private ConfigValueService configValueService;
+    @Resource
+    private CycleCountPreferenceService cycleCountPreferenceService;
+    /**
+     * 盘点单下发
+     * @param cycCountDomain 盘点单
+     * @return 是否下发成功
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult insertCycleCount(CycCountDomain cycCountDomain){
+        CycleCountHeader cycleCountHeader =cycCountDomain.getCycleCountHeader();
+
+        if (cycleCountHeader==null || cycCountDomain.getInventoryId()==null){
+            return AjaxResult.error("主单据或库存id不能为空");
+        }
+
+        if (StringUtils.isEmpty(cycCountDomain.getCycleCountHeader().getCountType())){
+            return AjaxResult.error("盘点类型不能为空");
+        }
+        if (StringUtils.isEmpty(cycleCountHeader.getWarehouseCode())){
+            return AjaxResult.error("仓库编码不能为空");
+        }
+        if (StringUtils.isEmpty(cycleCountHeader.getCompanyCode())){
+            return AjaxResult.error("货主编码不能为空");
+        }
+
+        cycleCountHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        cycleCountHeader.setCompanyCode(cycleCountHeader.getCompanyCode());
+        cycleCountHeader.setCreated(new Date());
+        cycleCountHeader.setCreatedBy(ShiroUtils.getLoginName());
+        cycleCountHeader.setCode(cycleCountHeaderService.createCode());
+        if (!cycleCountHeaderService.save(cycleCountHeader)){
+            return AjaxResult.error("新增盘点单失败");
+        }
+        this.addDetails(cycleCountHeader.getCode(),cycCountDomain.getInventoryId());
+
+        return AjaxResult.success("成功");
+    }
+
+    /**
+     * 新增盘点明细
+     * */
+    @Transactional
+    public AjaxResult addDetails(String cycleCountHeadCode, Integer[] inventoryDetailIdIds) {
+
+        if(cycleCountHeadCode == null){
+            throw new ServiceException("盘点主单编码不能为空!");
+        }
+        CycleCountHeader cyclecountHeader =new CycleCountHeader();
+        cyclecountHeader.setCode(cycleCountHeadCode);
+        LambdaQueryWrapper<CycleCountHeader> ch = Wrappers.lambdaQuery(cyclecountHeader);
+        cyclecountHeader = cycleCountHeaderService.getOne(ch);
+        //可能存在并发删除的情况
+        if(cyclecountHeader==null){
+            return AjaxResult.error("盘点主单据不存在");
+        }
+        if(cyclecountHeader.getStatusCyc() > QuantityConstant.CYCLECOUNT_STATUS_BUILD){
+            return AjaxResult.error("盘点单非新建状态,无法再添加明细");
+        }
+        //默认盘点配置,首选项
+        ConfigValue configValue = new ConfigValue();
+        configValue.setModuleType("cyclecount");
+        configValue.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper<ConfigValue> configValueLambdaQueryWrapper = Wrappers.lambdaQuery(configValue);
+        configValue = configValueService.getOne(configValueLambdaQueryWrapper);
+        if(configValue == null){
+            throw new SecurityException("请先在配置中添加盘点配置");
+        }
+        String preferenceCode = configValue.getIdentifier();
+        //获取已经存在的明细
+        CycleCountDetail cycleCountDetail = new CycleCountDetail();
+        cycleCountDetail.setWarehouseCode(cyclecountHeader.getWarehouseCode());
+        cycleCountDetail.setCompanyCode(cyclecountHeader.getCompanyCode());
+        cycleCountDetail.setCycleCountHeadCode(cyclecountHeader.getCode());
+        LambdaQueryWrapper<CycleCountDetail> cycleCountDetailLambd = Wrappers.lambdaQuery(cycleCountDetail);
+        List<CycleCountDetail> cyclecountDetailList = cycleCountDetailService.list(cycleCountDetailLambd);
+        if(cyclecountDetailList == null){
+            cyclecountDetailList = new ArrayList<>();
+        }
+        for(int inventoryDetailId : inventoryDetailIdIds){
+            //当前有盘点明细时验证是否已经生成盘点细单,生成则跳出该条循环
+            if(cyclecountDetailList.stream().anyMatch(t -> t.getInventoryDetailId()!=null && t.getInventoryDetailId() == inventoryDetailId)){
+                continue;
+            }
+            //查询该条库存明细
+            InventoryDetail inventoryDetail = inventoryDetailService.getById(inventoryDetailId);
+            //写入盘点明细
+            CycleCountDetail ccd = new CycleCountDetail();
+            ccd.setPreferenceCode(preferenceCode);
+            ccd.setCycleCountHeadCode(cyclecountHeader.getCode());
+            ccd.setInventoryDetailId(inventoryDetailId);
+            ccd.setWarehouseCode(inventoryDetail.getWarehouseCode());
+            ccd.setCompanyCode(inventoryDetail.getCompanyCode());
+            ccd.setInventorySts(inventoryDetail.getInventorySts());
+            ccd.setCountId(inventoryDetail.getId());
+            //ccd.setEnableStatus(1);
+            ccd.setLocationCode(inventoryDetail.getLocationCode());
+            ccd.setContainerCode(inventoryDetail.getContainerCode());
+            ccd.setMaterialCode(inventoryDetail.getMaterialCode());
+            ccd.setMaterialName(inventoryDetail.getMaterialName());
+            ccd.setMaterialSpec(inventoryDetail.getMaterialSpec());
+            ccd.setMaterialUnit(inventoryDetail.getMaterialUnit());
+            ccd.setSystemQty(inventoryDetail.getQty());
+            ccd.setBatch(inventoryDetail.getBatch());
+            ccd.setLot(inventoryDetail.getLot());
+            ccd.setProjectNo(inventoryDetail.getProjectNo());
+            ccd.setCountedBy(cyclecountHeader.getCreatedBy());
+            ccd.setCountedAt(cyclecountHeader.getCreated());
+            ccd.setCreated(new Date());
+            ccd.setCreatedBy(ShiroUtils.getLoginName());
+            ccd.setLastUpdated(new Date());
+            ccd.setLastUpdatedBy(ShiroUtils.getLoginName());
+            cycleCountDetailService.save(ccd);
+            //更新库存盘点锁
+            inventoryDetail.setLockCode("cyclecount");
+            inventoryDetailService.saveOrUpdate(inventoryDetail);
+        }
+        return AjaxResult.success("生成盘点明细成功");
+    }
+
+}
diff --git a/src/main/java/com/huaheng/api/general/service/ReceiptApiService.java b/src/main/java/com/huaheng/api/general/service/ReceiptApiService.java
index 3bb80f7..cbca32e 100644
--- a/src/main/java/com/huaheng/api/general/service/ReceiptApiService.java
+++ b/src/main/java/com/huaheng/api/general/service/ReceiptApiService.java
@@ -4,8 +4,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.huaheng.api.general.controller.ReceiptApi;
 import com.huaheng.api.general.domain.ReceiptDomain;
+import com.huaheng.common.constant.QuantityConstant;
 import com.huaheng.common.exception.service.ServiceException;
+import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.pc.config.FilterConfigDetail.domain.FilterConfigDetail;
 import com.huaheng.pc.config.FilterConfigDetail.service.FilterConfigDetailService;
@@ -23,14 +26,21 @@ import com.huaheng.pc.config.warehouse.domain.Warehouse;
 import com.huaheng.pc.config.warehouse.service.WarehouseService;
 import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
 import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
+import com.huaheng.pc.receipt.receiptDetailHistory.domain.ReceiptDetailHistory;
+import com.huaheng.pc.receipt.receiptDetailHistory.service.ReceiptDetailHistoryService;
 import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
 import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
+import com.huaheng.pc.receipt.receiptHeaderHistory.domain.ReceiptHeaderHistory;
+import com.huaheng.pc.receipt.receiptHeaderHistory.service.ReceiptHeaderHistoryService;
+import org.apache.commons.beanutils.BeanUtils;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 @Component
@@ -54,6 +64,10 @@ public class ReceiptApiService {
     private FilterConfigDetailService filterConfigDetailService;
     @Resource
     private StatusFlowHeaderService statusFlowHeaderService;
+    @Resource
+    private ReceiptHeaderHistoryService receiptHeaderHistoryService;
+    @Resource
+    private ReceiptDetailHistoryService receiptDetailHistoryService;
     /**
      * 入库单下发
      * @param receipt 入库单
@@ -218,4 +232,65 @@ public class ReceiptApiService {
 
         return AjaxResult.success("");
     }
+
+
+    @Transactional
+    public AjaxResult add(Integer[] ids){
+        List<Integer> idList = Arrays.asList(ids);
+        for (Integer id : idList) {
+            ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
+            if (receiptHeader == null)  {
+                return AjaxResult.success("");
+            }
+            if((receiptHeader.getFirstStatus()>= QuantityConstant.RECEIPT_HEADER_POSTING && receiptHeader.getLastStatus()>=QuantityConstant.RECEIPT_HEADER_POSTING)||
+                    (receiptHeader.getFirstStatus()<QuantityConstant.RECEIPT_HEADER_POOL &receiptHeader.getLastStatus()<QuantityConstant.RECEIPT_HEADER_POOL)){
+                ReceiptHeaderHistory receiptHeaderHistory = new ReceiptHeaderHistory();
+                List<ReceiptDetailHistory> receiptDetailHistoryList = new ArrayList<>();
+                //查询入库单明细
+                LambdaQueryWrapper<ReceiptDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
+                lambdaQueryWrapper.eq(ReceiptDetail::getReceiptId, id);
+                List<ReceiptDetail> list = receiptDetailService.list(lambdaQueryWrapper);
+                try {
+                    //复制到入库历史实体
+                    BeanUtils.copyProperties(receiptHeaderHistory, receiptHeader);
+                    for (ReceiptDetail receiptDetail: list) {
+                        ReceiptDetailHistory receiptDetailHistory = new ReceiptDetailHistory();
+                        BeanUtils.copyProperties(receiptDetailHistory, receiptDetail);
+                        receiptDetailHistoryList.add(receiptDetailHistory);
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                } catch (InvocationTargetException e) {
+                    e.printStackTrace();
+                }
+
+                receiptHeaderHistory.setLastUpdatedBy(ShiroUtils.getLoginName());
+                if (!receiptHeaderService.removeById(receiptHeader.getId())){
+                    throw new ServiceException("删除头表失败");
+                }
+                if(!receiptHeaderHistoryService.save(receiptHeaderHistory)){
+                    throw new ServiceException("新增历史入库单失败");
+                }
+                // 当存在明细时删除
+                if (list.size()!= 0){
+                    //删除入库明细
+                    List<Integer> receiptDetailIds = new ArrayList<>();
+                    for (int i=0; i<receiptDetailHistoryList.size();i++){
+                        receiptDetailHistoryList.get(i).setLastUpdatedBy(ShiroUtils.getLoginName());
+                        receiptDetailHistoryList.get(i).setReceiptId(receiptHeaderHistory.getId());
+                        receiptDetailIds.add(receiptDetailHistoryList.get(i).getId());
+                    }
+                    if (!receiptDetailService.removeByIds(receiptDetailIds)) {
+                        throw new ServiceException("删除明细表失败");
+                    }
+                    if (!receiptDetailHistoryService.saveBatch(receiptDetailHistoryList)){
+                        throw new ServiceException("新增明细失败");
+                    }                }
+
+            }else {
+                return AjaxResult.success("入库单没有完成,无法删除");
+            }
+        }
+        return AjaxResult.success("删除成功");
+    }
 }
diff --git a/src/main/java/com/huaheng/api/general/service/ReceiptService.java b/src/main/java/com/huaheng/api/general/service/ReceiptService.java
deleted file mode 100644
index 44cf3f3..0000000
--- a/src/main/java/com/huaheng/api/general/service/ReceiptService.java
+++ /dev/null
@@ -1,216 +0,0 @@
-package com.huaheng.api.general.service;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.huaheng.api.general.domain.Receipt;
-import com.huaheng.common.exception.service.ServiceException;
-import com.huaheng.common.utils.StringUtils;
-import com.huaheng.framework.web.domain.AjaxResult;
-import com.huaheng.pc.config.FilterConfigDetail.domain.FilterConfigDetail;
-import com.huaheng.pc.config.FilterConfigDetail.service.FilterConfigDetailService;
-import com.huaheng.pc.config.company.domain.Company;
-import com.huaheng.pc.config.company.service.CompanyService;
-import com.huaheng.pc.config.material.domain.Material;
-import com.huaheng.pc.config.material.service.MaterialService;
-import com.huaheng.pc.config.receiptType.domain.ReceiptType;
-import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
-import com.huaheng.pc.config.statusFlow.domain.StatusFlowHeader;
-import com.huaheng.pc.config.statusFlow.service.StatusFlowHeaderService;
-import com.huaheng.pc.config.supplier.domain.Supplier;
-import com.huaheng.pc.config.supplier.service.SupplierService;
-import com.huaheng.pc.config.warehouse.domain.Warehouse;
-import com.huaheng.pc.config.warehouse.service.WarehouseService;
-import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
-import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
-import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
-import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * Created by Enzo Cotter on 2019/11/4.
- * @author mahuandong
- */
-@Component
-@Transactional(rollbackFor = Exception.class)
-public class ReceiptService {
-
-    @Resource
-    private ReceiptHeaderService receiptHeaderService;
-    @Resource
-    private ReceiptDetailService receiptDetailService;
-    @Resource
-    private ReceiptTypeService receiptTypeService;
-    @Resource
-    private WarehouseService warehouseService;
-    @Resource
-    private CompanyService companyService;
-    @Resource
-    private MaterialService materialService;
-    @Resource
-    private SupplierService supplierService;
-    @Resource
-    private FilterConfigDetailService filterConfigDetailService;
-    @Resource
-    private StatusFlowHeaderService statusFlowHeaderService;
-    /**
-     * 入库单下发
-     * @param receipt 入库单
-     * @return 是否下发成功
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public AjaxResult insertReceipt(Receipt receipt){
-
-        /* 0.step 获取入库头表,获取入库明细*/
-        ReceiptHeader receiptHeader = receipt.getReceiptHeader();
-        List<ReceiptDetail> receiptDetails = receipt.getReceiptDetails();
-        /* 1.step 校验入库单是否为空*/
-        if (receiptHeader == null || receiptDetails.isEmpty()){
-            throw new ServiceException("入库主单或入库子单为空");
-        }
-        /* 2.step 检查入库头表合法性*/
-        AjaxResult checkReceiptHeaderResult = checkReceiptHeader(receiptHeader);
-        if (checkReceiptHeaderResult.hasErr() ){
-            return AjaxResult.error(checkReceiptHeaderResult.getMsg());
-        }
-
-        /* 3.step 检查入库明细合法性*/
-        AjaxResult checkReceiptDetailResult = checkReceiptDetail(receiptDetails);
-        if (checkReceiptDetailResult.hasErr() ){
-            return AjaxResult.error(checkReceiptDetailResult.getMsg());
-        }
-
-        /* 4.step 计算入库明细总行数、总数量*/
-        BigDecimal totalQty = new BigDecimal(0);
-        for (ReceiptDetail receiptDetail: receiptDetails) {
-           totalQty.add(receiptDetail.getTotalQty());
-        }
-        receiptHeader.setTotalLines(receiptDetails.size());
-        receiptHeader.setTotalQty(totalQty);
-
-        /* 5.step 保存的入库头表*/
-        if (!receiptHeaderService.save(receiptHeader)){
-            throw new ServiceException("保存入库头表失败");
-        }
-
-        /* 6.step 保存入库明细*/
-        LambdaQueryWrapper<ReceiptHeader> lambda = Wrappers.lambdaQuery();
-        lambda.eq(ReceiptHeader::getWarehouseCode, receiptHeader.getWarehouseCode())
-                .eq(ReceiptHeader::getCode, receiptHeader.getCode());
-        receiptHeader = receiptHeaderService.getOne(lambda);
-        for (ReceiptDetail receiptDetail : receiptDetails) {
-            receiptDetail.setReceiptId(receiptHeader.getId());
-            receiptDetail.setReceiptCode(receiptHeader.getCode());
-            receiptDetail.setWarehouseCode(receiptHeader.getWarehouseCode());
-            receiptDetail.setCompanyCode(receiptHeader.getWarehouseCode());
-            Material material = materialService.findAllByCode(receiptDetail.getMaterialCode());
-            receiptDetail.setMaterialName(material.getName());
-            receiptDetail.setMaterialSpec(material.getSpec());
-            receiptDetail.setMaterialUnit(material.getUnit());
-            if (!receiptDetailService.save(receiptDetail)){
-                throw new ServiceException("保存入库明细失败");
-            }
-        }
-
-        return AjaxResult.success("成功");
-    }
-
-    /**
-     * 检查入库头表合法性
-     * @param receiptHeader 入库头表
-     * @return 检查结果
-     */
-    private AjaxResult checkReceiptHeader(ReceiptHeader receiptHeader){
-        /* 0.step 必填项是否为空*/
-        if (StringUtils.isEmpty(receiptHeader.getCode()) || StringUtils.isEmpty(receiptHeader.getCompanyCode()) ||
-                StringUtils.isEmpty(receiptHeader.getWarehouseCode()) || StringUtils.isEmpty(receiptHeader.getReceiptType())){
-            return AjaxResult.error("入库主单字段有误");
-        }
-
-        /* 1.step 查询该单据编码是否已存在*/
-        LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery(receiptHeader);
-        if (receiptHeaderService.getOne(receiptHeaderLambda) != null){
-            return AjaxResult.error("该单据已存在:"+receiptHeader.getCode());
-        }
-
-        /* 2.step 判断入库类型是否匹配*/
-        LambdaQueryWrapper<ReceiptType> receiptTypeLambda = Wrappers.lambdaQuery();
-        receiptTypeLambda.eq(ReceiptType::getCode, receiptHeader.getReceiptType());
-        if (receiptTypeService.getOne(receiptTypeLambda) == null){
-            return AjaxResult.error("没有对应的入库单类型");
-        }
-
-        /* 3.step 判断仓库是否存在*/
-        LambdaQueryWrapper<Warehouse> warehouseLambda = Wrappers.lambdaQuery();
-        warehouseLambda.eq(Warehouse::getCode, receiptHeader.getWarehouseCode());
-        if (warehouseService.getOne(warehouseLambda) == null){
-            return AjaxResult.error("该仓库不存在");
-        }
-
-        /* 4.step 判断货主是否存在*/
-        LambdaQueryWrapper<Company> companyLambda = Wrappers.lambdaQuery();
-        companyLambda.eq(Company::getCode, receiptHeader.getCompanyCode());
-        if (companyService.getOne(companyLambda) == null){
-            return AjaxResult.error("该货主不存在");
-        }
-
-        return AjaxResult.success("");
-    }
-
-    /**
-     * 检查入库明细合法性
-     * @param receiptDetails 入库明细
-     * @return 检查结果
-     */
-    private AjaxResult checkReceiptDetail(List<ReceiptDetail> receiptDetails){
-
-        for (ReceiptDetail receiptDetail: receiptDetails) {
-            /* 0.step 判断必填字段是否为空且总数量不能为0*/
-            if (receiptDetail.getMaterialCode() == null ||
-                    new BigDecimal(0).compareTo(receiptDetail.getTotalQty() != null ?
-                            receiptDetail.getTotalQty() : new BigDecimal(0)) == 0 ){
-                return AjaxResult.error("入库明细字段有误");
-            }
-
-            /* 1.step 判断供应商是否存在*/
-            if (receiptDetail.getSupplierCode() != null){
-                LambdaQueryWrapper<Supplier> supplierLambda = Wrappers.lambdaQuery();
-                supplierLambda.eq(Supplier::getCode, receiptDetail.getSupplierCode());
-                if (supplierService.getOne(supplierLambda) == null) {
-                    return AjaxResult.error("供应商不存在");
-                }
-            }
-
-            /* 2.step 判断定位规则是否存在*/
-            if (receiptDetail.getLocatingRule() != null){
-                LambdaQueryWrapper<FilterConfigDetail> filterConfigDetailLambda = Wrappers.lambdaQuery();
-                filterConfigDetailLambda.eq(FilterConfigDetail::getCode, receiptDetail.getLocatingRule())
-                        .eq(FilterConfigDetail::getModuleType, "receipt")
-                        .eq(FilterConfigDetail::getRecordType, "locationRule");
-                FilterConfigDetail filterConfigDetail = filterConfigDetailService.getOne(filterConfigDetailLambda);
-                if (filterConfigDetail == null){
-                    return AjaxResult.error(receiptDetail.getLocatingRule()+"定位规则不存在");
-                }
-            }
-
-            /* 3.step 判断流程编码是否存在*/
-            if (receiptDetail.getStatusFlowCode() != null){
-                LambdaQueryWrapper<StatusFlowHeader> statusFlowHeaderLambda = Wrappers.lambdaQuery();
-                statusFlowHeaderLambda.eq(StatusFlowHeader::getCode, receiptDetail.getStatusFlowCode())
-                        .eq(StatusFlowHeader::getModuleType, "receipt")
-                        .eq(StatusFlowHeader::getRecordType, "receivingFlow");
-                StatusFlowHeader statusFlowHeader = statusFlowHeaderService.getOne(statusFlowHeaderLambda);
-                if (statusFlowHeader == null){
-                    return AjaxResult.error(receiptDetail.getLocatingRule()+"该流程不存在");
-                }
-            }
-        }
-
-        return AjaxResult.success("");
-    }
-
-}
diff --git a/src/main/java/com/huaheng/framework/config/ShiroConfig.java b/src/main/java/com/huaheng/framework/config/ShiroConfig.java
index f9b5c65..0ad6771 100644
--- a/src/main/java/com/huaheng/framework/config/ShiroConfig.java
+++ b/src/main/java/com/huaheng/framework/config/ShiroConfig.java
@@ -263,6 +263,7 @@ public class ShiroConfig
         filterChainDefinitionMap.put("/admin/logout", "adminlogout");
         // 不需要拦截的访问
 //        filterChainDefinitionMap.put("/admin/home", "anon,captchaValidate");
+        filterChainDefinitionMap.put("/mobile/download/*", "anon,captchaValidate");
         filterChainDefinitionMap.put("/admin/login", "anon,captchaValidate");
         filterChainDefinitionMap.put("/login", "anon,captchaValidate");
         filterChainDefinitionMap.put("/api/login", "anon,captchaValidate");
diff --git a/src/main/java/com/huaheng/mobile/download/ApkController.java b/src/main/java/com/huaheng/mobile/download/ApkController.java
new file mode 100644
index 0000000..597c2fa
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/download/ApkController.java
@@ -0,0 +1,104 @@
+package com.huaheng.mobile.download;
+
+import com.alibaba.fastjson.JSONException;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.common.mapper.ApkMapper;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/mobile/download")
+public class ApkController {
+
+    @Resource
+    ApkMapper apkMapper;
+
+    @PostMapping("/getUpdateApkInfo")
+    @ApiOperation("获取apk更新信息")
+    public AjaxResult getUpdateApkInfo(@RequestBody Map<String, String> param) {
+        System.out.println("getUpdateApkInfo pkgName:" + param.get("pkgName"));
+        if  (param.get("pkgName") == null)
+            throw new JSONException("pkgName不能为空");
+        if  (param.get("versionCode") == null)
+            throw new JSONException("versionCode不能为空");
+        List<ApkInfo>  apkinfos = apkMapper.getApkInfoByPkgName(param.get("pkgName"));
+        ApkInfo apkInfo = apkinfos.get(0);
+        int maxVersion = Integer.MAX_VALUE;
+        String project = param.containsKey("project") ? param.get("project") : null;
+        if(project != null) {
+            if(project.equals(Constant.PROJECT_XIANGJI)) {
+                maxVersion = Constant.PROJECT_XIANGJI_MAX_LEVEL;
+            }
+        }
+        for (ApkInfo apkInfo2 : apkinfos)   //循环找到版本最大值
+        {
+            if (apkInfo.getVersionCode() < apkInfo2.getVersionCode()) {
+                if(apkInfo2.getVersionCode() > maxVersion) {
+                    continue;
+                }
+                apkInfo = apkInfo2;
+            }
+        }
+
+        int versionCode = Integer.parseInt(param.get("versionCode"));
+        System.out.println("getUpdateApkInfo versionCode:" + versionCode);
+        System.out.println("apkInfo.getVersionCode():" + apkInfo.getVersionCode());
+        if(versionCode >= apkInfo.getVersionCode()) {
+           return AjaxResult.error("当前已经是最新版本");
+        }
+
+        return AjaxResult.success(apkInfo);
+    }
+
+    @PostMapping("/insertApkInfo")
+    @ApiOperation("插入apk更新信息")
+    public ApkInfo insertApkInfo(@RequestBody Map<String, String> param) {
+        System.out.println("insertApkInfo pkgName:" + param.get("pkgName"));
+        if  (param.get("pkgName") == null)
+            throw new JSONException("pkgName不能为空");
+        if  (param.get("versionCode") == null)
+            throw new JSONException("versionCode不能为空");
+        if  (param.get("versionName") == null)
+            throw new JSONException("versionName");
+        if  (param.get("url") == null)
+            throw new JSONException("url");
+        if  (param.get("md5") == null)
+            throw new JSONException("md5");
+        ApkInfo apkInfo = buildApkInfo(param);
+        try {
+            apkMapper.insertApkInfo(apkInfo.getPkgName(), apkInfo.getVersionCode(), apkInfo.getVersionName(), apkInfo.getUrl(), apkInfo.getMd5());
+        } catch(Exception e) {
+
+        }
+        return apkInfo;
+    }
+
+    @PostMapping("/clearApkInfo")
+    @ApiOperation("删除apk信息")
+    public AjaxResult clearApkInfo(@RequestBody Map<String, String> param) {
+        System.out.println("clearApkInfo");
+        try {
+            apkMapper.clearApkInfo();
+        } catch(Exception e) {
+
+        }
+        return AjaxResult.success("删除apk信息成功");
+    }
+
+    private ApkInfo buildApkInfo(Map<String, String> param) {
+        ApkInfo apkInfo = new ApkInfo();
+        apkInfo.setPkgName(param.get("pkgName"));
+        apkInfo.setVersionCode(Integer.parseInt(param.get("versionCode")));
+        apkInfo.setVersionName(param.get("versionName"));
+        apkInfo.setUrl(param.get("url"));
+        apkInfo.setMd5(param.get("md5"));
+        return apkInfo;
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/download/ApkInfo.java b/src/main/java/com/huaheng/mobile/download/ApkInfo.java
new file mode 100644
index 0000000..c118c46
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/download/ApkInfo.java
@@ -0,0 +1,59 @@
+package com.huaheng.mobile.download;
+
+public class ApkInfo {
+
+    private Integer id;
+    private String pkgName;
+    private Integer versionCode;
+    private String versionName;
+    private String url;
+    private String md5;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getPkgName() {
+        return pkgName;
+    }
+
+    public void setPkgName(String pkgName) {
+        this.pkgName = pkgName;
+    }
+
+    public Integer getVersionCode() {
+        return versionCode;
+    }
+
+    public void setVersionCode(Integer versionCode) {
+        this.versionCode = versionCode;
+    }
+
+    public String getVersionName() {
+        return versionName;
+    }
+
+    public void setVersionName(String versionName) {
+        this.versionName = versionName;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMd5() {
+        return md5;
+    }
+
+    public void setMd5(String md5) {
+        this.md5 = md5;
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/download/Constant.java b/src/main/java/com/huaheng/mobile/download/Constant.java
new file mode 100644
index 0000000..7abcc7c
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/download/Constant.java
@@ -0,0 +1,7 @@
+package com.huaheng.mobile.download;
+
+public class Constant {
+
+    public static final String PROJECT_XIANGJI = "xiangji";
+    public static final int PROJECT_XIANGJI_MAX_LEVEL = 4;
+}
diff --git a/src/main/java/com/huaheng/mobile/general/CompanyInfo.java b/src/main/java/com/huaheng/mobile/general/CompanyInfo.java
new file mode 100644
index 0000000..3f66346
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/general/CompanyInfo.java
@@ -0,0 +1,52 @@
+package com.huaheng.mobile.general;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+public class CompanyInfo {
+
+    private int companyId;
+    private String companyCode;
+    private String companyName;
+
+    public CompanyInfo(int companyId, String companyCode, String companyName) {
+        this.companyId = companyId;
+        this.companyCode = companyCode;
+        this.companyName = companyName;
+    }
+
+    public int getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(int companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCompanyCode() {
+        return companyCode;
+    }
+
+    public void setCompanyCode(String companyCode) {
+        this.companyCode = companyCode;
+    }
+
+    public String getCompanyName() {
+        return companyName;
+    }
+
+    public void setCompanyName(String companyName) {
+        this.companyName = companyName;
+    }
+
+    @Override
+    public String toString() {
+        return "CompanyInfo{" +
+                "companyId=" + companyId +
+                ", companyCode='" + companyCode + '\'' +
+                ", companyName='" + companyName + '\'' +
+                '}';
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/general/MobileUserController.java b/src/main/java/com/huaheng/mobile/general/MobileUserController.java
new file mode 100644
index 0000000..2fd94f0
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/general/MobileUserController.java
@@ -0,0 +1,113 @@
+package com.huaheng.mobile.general;
+
+import com.alibaba.fastjson.JSONException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.web.controller.BaseController;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.config.company.domain.Company;
+import com.huaheng.pc.config.company.service.CompanyService;
+import com.huaheng.pc.system.menu.domain.Menu;
+import com.huaheng.pc.system.menu.service.IMenuService;
+import com.huaheng.pc.system.user.domain.User;
+import com.huaheng.pc.system.user.service.IUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+@RestController
+@RequestMapping("/mobile/")
+@Api(tags = {"MobileUserController"}, description = "移动端用户信息")
+public class MobileUserController extends BaseController {
+
+    @Resource
+    private IMenuService menuService;
+    @Resource
+    private IUserService userService;
+    @Resource
+    private CompanyService companyService;
+
+    @PostMapping("/login")
+    @ApiOperation("用户登陆")
+    public AjaxResult login(@RequestBody @ApiParam(value="code和password的Map集合") Map<String, String> param) {
+        if  (param.get("code") == null) {
+            throw new JSONException("code(用户名)不能为空");
+        }
+        if  (param.get("password") == null) {
+            throw new JSONException("password(密码)不能为空");
+        }
+        UsernamePasswordToken token = new UsernamePasswordToken(param.get("code"), param.get("password"), false);
+        Subject subject = SecurityUtils.getSubject();
+        SecurityUtils.getSubject().getSession().setTimeout(-1000L);
+        try {
+            subject.login(token);
+            List<Map<String, Object>> list = userService.getWarehouseByUserCode(param.get("code"));
+            return AjaxResult.success(list);
+        } catch (AuthenticationException e) {
+            String msg = "用户或密码错误";
+            if (StringUtils.isNotEmpty(e.getMessage())) {
+                msg = e.getMessage();
+            }
+            return error(msg);
+        }
+    }
+
+    @PostMapping("/getModules")
+    @ApiOperation("获取当前用户模块列表")
+    public AjaxResult getModules(@RequestBody @ApiParam(value="WarehouseId和warehouseCode的Map集合") Map<String, String> param) {
+        if  (param.get("warehouseCode") == null) {
+            throw new JSONException("warehouseCode(仓库编码)不能为空");
+        }
+        User user = ShiroUtils.getUser();
+        user.setWarehouseCode(param.get("warehouseCode"));
+        ShiroUtils.setUser(user);
+        List<Company> companys = companyService.selectCompanyByCurrentUserId();
+        user.setCompanyIdList(companys.stream().map(X -> X.getId()).collect(Collectors.toList()));
+        user.setCompanyCodeList(companys.stream().map(X -> X.getCode()).collect(Collectors.toList()));
+        ShiroUtils.setUser(user);
+        List<Menu> menus = menuService.selectMobileMenusByUserId(ShiroUtils.getUserId());
+        return AjaxResult.success(menus);
+    }
+
+    @PostMapping("/heartbeat")
+    @ApiOperation("心跳接口,用于延长cookie有效期")
+    public AjaxResult heartbeat()
+    {
+        return AjaxResult.success("success");
+    }
+
+    @PostMapping("/getCompanyInfo")
+    @ApiOperation("获取公司信息")
+    public AjaxResult getCompanyInfo() {
+        LambdaQueryWrapper<Company> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(Company::getDeleted, false);
+
+        List<Company> companies = companyService.list(queryWrapper);
+        List<CompanyInfo> companyInfos = new ArrayList<>();
+        for(Company company : companies) {
+            companyInfos.add(new CompanyInfo(company.getId(), company.getCode(), company.getName()));
+        }
+        return AjaxResult.success(companyInfos);
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/invenory/InventoryDetails.java b/src/main/java/com/huaheng/mobile/invenory/InventoryDetails.java
new file mode 100644
index 0000000..e4b3387
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/invenory/InventoryDetails.java
@@ -0,0 +1,38 @@
+package com.huaheng.mobile.invenory;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+public class InventoryDetails {
+
+    private String date;
+    private BigDecimal qty;
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public BigDecimal getQty() {
+        return qty;
+    }
+
+    public void setQty(BigDecimal qty) {
+        this.qty = qty;
+    }
+
+    @Override
+    public String toString() {
+        return "InventoryDetails{" +
+                "date='" + date + '\'' +
+                ", qty=" + qty +
+                '}';
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/invenory/MobileInventory.java b/src/main/java/com/huaheng/mobile/invenory/MobileInventory.java
new file mode 100644
index 0000000..82942a1
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/invenory/MobileInventory.java
@@ -0,0 +1,33 @@
+package com.huaheng.mobile.invenory;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+@Data
+public class MobileInventory {
+
+    /** 库位id   */
+    private int id;
+    /** 库位编号 */
+    private String locationCode;
+    /** 容器编号 */
+    private String containerCode;
+    /** 物料编码 */
+    private String materialCode;
+    /**物料名称  */
+    private String materialName;
+    /**物料规格  */
+    private String specification;
+    /** 数量 */
+    private BigDecimal qty;
+    /** 任务数量 */
+    private BigDecimal taskQty = new BigDecimal(0);
+    /** 结果类型 */
+    private int resultType;
+}
diff --git a/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java b/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java
new file mode 100644
index 0000000..ea0e541
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/invenory/MobileInventoryController.java
@@ -0,0 +1,392 @@
+package com.huaheng.mobile.invenory;
+
+import com.alibaba.fastjson.JSONException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.common.support.Convert;
+import com.huaheng.common.utils.DataUtils;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.config.container.domain.Container;
+import com.huaheng.pc.config.container.service.ContainerService;
+import com.huaheng.pc.config.location.domain.Location;
+import com.huaheng.pc.config.location.service.LocationService;
+import com.huaheng.pc.inventory.cycleCountDetail.service.CycleCountDetailService;
+import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
+import com.huaheng.pc.report.excelReport.mapper.ExcelReportMapper;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+@CrossOrigin
+@RestController
+@RequestMapping("/mobile/inventory")
+@Api(tags = {"MobileInventoryController"}, description = "手机立体库库存相关")
+public class MobileInventoryController {
+
+    @Resource
+    private InventoryHeaderService inventoryService;
+    @Resource
+    private TaskHeaderService taskService;
+    @Resource
+    private LocationService locationService;
+    @Resource
+    ExcelReportMapper mapper;
+    @Resource
+    private CycleCountDetailService cycleCountDetailService;
+    @Resource
+    private ContainerService containerService;
+
+    @PostMapping("/getInventoryInfo")
+    @ApiOperation("移动端获得库存详情")
+    @Log(title = "移动端获得库存详情", action = BusinessType.OTHER)
+    public AjaxResult getInventoryInfo(@RequestBody @ApiParam(value="物料编码或者库位号") Map<String, String> param) {
+        if  (param.get("code") == null || param.get("code").trim().length() < 1) {
+            throw new JSONException("查询码(code)不能为空");
+        }
+        if  (param.get("companyCode") == null || param.get("companyCode").trim().length() < 1) {
+            throw new JSONException("(companyCode)不能为空");
+        }
+        return  inventoryService.getInventory(param.get("code"), param.get("companyCode"));
+    }
+
+    @PostMapping("/createCheckOutTask")
+    @ApiOperation("移动端创建出库查看任务")
+    @ResponseBody
+    public AjaxResult createCheckOutTask(@RequestBody @ApiParam(value="库存ids") Map<String, String> param){
+        String ids = param.get("ids");
+        Integer companyId = DataUtils.getInteger(param.get("companyId")) ;
+        String companyCode = param.get("companyCode");
+        if(StringUtils.isEmpty(ids)){
+            return AjaxResult.error("ids不能为空");
+        }
+        return taskService.createCheckOutTask(ids.split(","));
+    }
+
+    @PostMapping("/transfer")
+    @ApiOperation("移动端创建移库任务")
+    @ResponseBody
+    public AjaxResult transfer(@RequestBody @ApiParam(value="库位情况") Map<String, String> param){
+        String sourceLocation = param.get("sourceLocation");
+        String destinationLocation = param.get("destinationLocation");
+        return taskService.createTransferTask(sourceLocation, destinationLocation);
+    }
+
+    @PostMapping( "/execute")
+    @ApiOperation("执行立库任务")
+    @ResponseBody
+    public AjaxResult execute(@RequestBody @ApiParam(value="任务id") Map<String, String> param) {
+        String taskId = param.get("taskId");
+        if (StringUtils.isEmpty(taskId)) {
+            return AjaxResult.error("taskId不能为空");
+        }
+
+        AjaxResult ajaxResult = taskService.sendTaskToWcs(Convert.toIntArray(taskId));
+        if(ajaxResult.hasErr()) {
+            AjaxResult.success("执行失败");
+        }
+        return AjaxResult.success("下发执行成功");
+    }
+
+    @PostMapping( "/executeList")
+    @ApiOperation("执行立库任务")
+    @Log(title = "执行立库任务", action = BusinessType.OTHER)
+    public AjaxResult executeList(@RequestBody List<TaskIds> taskDetails) {
+        Integer[] taskIds = new Integer[taskDetails.size()];
+        for(int i=0; i<taskDetails.size() ; i++) {
+            TaskIds taskDetail = taskDetails.get(i);
+            taskIds[i] = taskDetail.getTaskId();
+        }
+        AjaxResult ajaxResult = taskService.sendTaskToWcs(taskIds);
+        return ajaxResult;
+    }
+
+    @PostMapping( "/completeTaskByWMS")
+    @ApiOperation("完成立库任务")
+    @ResponseBody
+    public AjaxResult completeTaskByWMS(@RequestBody @ApiParam(value="任务id") Map<String, String> param) throws Exception {
+        String taskId = param.get("taskId");
+        if (StringUtils.isEmpty(taskId)) {
+            return AjaxResult.error("taskId不能为空");
+        }
+        AjaxResult ajaxResult = taskService.completeTaskByWMS(Convert.toIntArray(taskId));
+        return ajaxResult;
+    }
+
+    @PostMapping( "/completeTaskListByWMS")
+    @ApiOperation("完成立库任务")
+    @ResponseBody
+    public AjaxResult completeTaskListByWMS(@RequestBody List<TaskIds> taskDetails) throws Exception {
+        Integer[] taskIds = new Integer[taskDetails.size()];
+        for(int i=0; i<taskDetails.size() ; i++) {
+            TaskIds taskDetail = taskDetails.get(i);
+            taskIds[i] = taskDetail.getTaskId();
+        }
+        AjaxResult ajaxResult = taskService.completeTaskByWMS(taskIds);
+        return ajaxResult;
+    }
+
+    @PostMapping( "/isLocation")
+    @ApiOperation("判断是不是库位")
+    @ResponseBody
+    public AjaxResult isLocation(@RequestBody @ApiParam(value="任务id") Map<String, String> param) {
+        String code = param.get("code");
+        if (StringUtils.isEmpty(code)) {
+            return AjaxResult.error("location不能为空");
+        }
+        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(Location::getCode, code);
+        Location location = locationService.getOne(queryWrapper);
+        if(location == null) {
+            return AjaxResult.error("没有这个库位");
+        }
+        return AjaxResult.success("库位存在");
+    }
+
+    @PostMapping("/getLocationCode")
+    @ApiOperation("移动端获得库位联想词")
+    @Log(title = "移动端获得库位联想词", action = BusinessType.OTHER)
+    public AjaxResult getLocationCode(@RequestBody @ApiParam(value="库位号") Map<String, String> param) {
+        if  (param.get("code") == null || param.get("code").trim().length() < 1) {
+            throw new JSONException("查询码(code)不能为空");
+        }
+        String type = param.get("type");
+        if  (type == null || type.trim().length() < 1) {
+            throw new JSONException("type不能为空");
+        }
+
+        return  inventoryService.getLocationForecast(param.get("code"), Integer.parseInt(type));
+    }
+
+    @PostMapping("/createEmptyIn")
+    @ApiOperation("移动端空托入库")
+    @Log(title = "移动端空托入库", action = BusinessType.OTHER)
+    public AjaxResult createEmptyIn(@RequestBody Map<String, String> param) {
+        if  (param.get("containerCode") == null || param.get("containerCode").trim().length() < 1) {
+            throw new JSONException("容器号不能为空");
+        }
+//        if  (param.get("destinationLocation") == null || param.get("destinationLocation").trim().length() < 1) {
+//            throw new JSONException("目的库位不能为空");
+//        }
+        String containerCode = param.get("containerCode");
+        String destinationLocation = param.get("destinationLocation");
+        String companyCode = param.get("companyCode");
+        return  inventoryService.createEmptyIn(containerCode, destinationLocation);
+    }
+
+    @PostMapping("/createEmptyOut")
+    @ApiOperation("移动端空托出库")
+    @Log(title = "移动端空托出库", action = BusinessType.OTHER)
+    public AjaxResult createEmptyOut(@RequestBody Map<String, String> param) {
+        if  (param.get("containerCode") == null || param.get("containerCode").trim().length() < 1){
+           throw new JSONException("容器号不能为空");
+        }
+        if  (param.get("sourceLocation") == null || param.get("sourceLocation").trim().length() < 1) {
+            throw new JSONException("源库位不能为空");
+        }
+        String containerCode = param.get("containerCode");
+        String sourceLocation = param.get("sourceLocation");
+        return  inventoryService.createEmptyOut(containerCode, sourceLocation);
+    }
+
+    @PostMapping("/get7daysShipment")
+    @ApiOperation("移动端获取7天收货和出货量")
+    @Log(title = "移动端获取7天收货和出货量", action = BusinessType.OTHER)
+    public AjaxResult get7daysShipment(@RequestBody Map<String, String> param) {
+        String sql = "select a.click_date as date,ifnull(b.taskQty,0) as qty\n" +
+                "from (\n" +
+                "    SELECT curdate() as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 1 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 2 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 3 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 4 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 5 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 6 day) as click_date\n" +
+                ") a left join (\n" +
+                "SELECT DATE(h.created) AS created , SUM(d.qty) AS taskQty from shipment_container_detail d join shipment_container_header h on d.shippingContainerId = h.id and h.warehouseCode='"+ShiroUtils.getWarehouseCode()+"' WHERE h.created >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND h.status=30 GROUP BY DATE(h.created)\n" +
+                ") b on a.click_date = b.created ORDER BY a.click_date;";
+        List<LinkedHashMap<String, Object>> list = mapper.selectCommon(sql);
+
+        sql = "select a.click_date as date,ifnull(b.taskQty,0) as qty\n" +
+                "from (\n" +
+                "    SELECT curdate() as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 1 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 2 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 3 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 4 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 5 day) as click_date\n" +
+                "    union all\n" +
+                "    SELECT date_sub(curdate(), interval 6 day) as click_date\n" +
+                ") a left join (\n" +
+                "SELECT DATE(h.created) AS created , SUM(d.qty) AS taskQty from receipt_container_detail d join receipt_container_header h on d.receiptContainerId = h.id and h.warehouseCode='"+ShiroUtils.getWarehouseCode()+"' WHERE h.created >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND d.status=30 GROUP BY DATE(h.created)\n" +
+                ") b on a.click_date = b.created ORDER BY a.click_date;";
+        List<LinkedHashMap<String, Object>> list2 = mapper.selectCommon(sql);
+
+
+        List<LinkedHashMap<String, Object>>  result = new ArrayList<>();
+        result.addAll(list);
+        result.addAll(list2);
+
+        List<InventoryDetails> inventoryDetailList = new ArrayList<>();
+        for(LinkedHashMap<String, Object> map : result) {
+            Iterator iter = map.entrySet().iterator();
+            String date = null;
+            BigDecimal qty = new BigDecimal(0);
+            while (iter.hasNext()) {
+                Map.Entry entry = (Map.Entry) iter.next();
+                Object key = entry.getKey();
+                Object val = entry.getValue();
+                if(date == null) {
+                    date = val.toString();
+                } else {
+                    qty = (BigDecimal) val;
+                }
+            }
+            inventoryDetailList.add(newInventoryDetail(date, qty));
+        }
+        return AjaxResult.success(inventoryDetailList);
+    }
+
+    private InventoryDetails newInventoryDetail(String date, BigDecimal qty) {
+        InventoryDetails inventoryDetail = new InventoryDetails();
+        inventoryDetail.setDate(date);
+        inventoryDetail.setQty(qty);
+        return inventoryDetail;
+    }
+
+    @PostMapping("/getTodayShipmentDetail")
+    @ApiOperation("移动端获得今天发货详情")
+    @Log(title = "移动端获得今天发货详情", action = BusinessType.OTHER)
+    public AjaxResult getTodayShipmentDetail(@RequestBody Map<String, String> param) {
+        String sql = "select d.materialName, SUM(d.qty) as qty " +
+                "from shipment_container_header h join shipment_container_detail d " +
+                "on d.shippingContainerId = h.id WHERE h.created >= CURDATE() AND h.`status`>19 GROUP BY d.materialName";
+        List<LinkedHashMap<String, Object>> list = mapper.selectCommon(sql);
+
+        sql = "select m.name, b.taskQty as qty \n" +
+                "from material m \n" +
+                "join (\n" +
+                "select d.materialCode as material, SUM(d.qty) " +
+                "as taskQty from receipt_container_header h join receipt_container_detail d " +
+                "on d.receiptContainerId = h.id WHERE h.created >= CURDATE() AND h.`status`>19 GROUP BY d.materialCode\n" +
+                ") b on m.`code` = b.material ORDER BY m.name";
+        List<LinkedHashMap<String, Object>> list2 = mapper.selectCommon(sql);
+        List<com.huaheng.mobile.invenory.ShipmentDetail> shipmentDetails = getShipmentDetails(list);
+        shipmentDetails.add(newShipmentDetail("delete", new BigDecimal(0)));
+        shipmentDetails.addAll(getShipmentDetails(list2));
+
+        return AjaxResult.success(shipmentDetails);
+    }
+
+    private List<com.huaheng.mobile.invenory.ShipmentDetail> getShipmentDetails(List<LinkedHashMap<String, Object>> list) {
+        List<com.huaheng.mobile.invenory.ShipmentDetail> shipmentDetails = new ArrayList<>();
+        for (LinkedHashMap<String, Object> map : list) {
+            Iterator iter = map.entrySet().iterator();
+            String materialName = null;
+            BigDecimal qty = new BigDecimal(0);
+            while (iter.hasNext()) {
+                Map.Entry entry = (Map.Entry) iter.next();
+                Object key = entry.getKey();
+                Object val = entry.getValue();
+                if (materialName == null) {
+                    materialName = val.toString();
+                } else {
+                    qty = (BigDecimal) val;
+                }
+            }
+            shipmentDetails.add(newShipmentDetail(materialName, qty));
+        }
+        return shipmentDetails;
+    }
+
+    private  com.huaheng.mobile.invenory.ShipmentDetail newShipmentDetail(String materialName, BigDecimal qty){
+        com.huaheng.mobile.invenory.ShipmentDetail shipmentDetail = new com.huaheng.mobile.invenory.ShipmentDetail();
+        shipmentDetail.setMaterialName(materialName);
+        shipmentDetail.setQty(qty);
+        return shipmentDetail;
+    }
+
+    /**
+     * 移动端根据容器编码获取盘点任务
+     * @param param
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/findTransferByContainerCode")
+    public AjaxResult findTransferByContainerCode(@RequestBody Map<String, String> param) {
+        String containCode = param.get("containCode");
+        if (StringUtils.isEmpty(containCode)){
+            return AjaxResult.error("容器编码为空");
+        } else {
+            return AjaxResult.success(taskService.mobileFindTransferTask(containCode));
+        }
+    }
+
+    /**
+     * 移动端实盘登记
+     * @param param
+     * @return
+     */
+    @ResponseBody
+    @PostMapping("/confirmGapQty")
+    public AjaxResult confirmGapQty(@RequestBody Map<String, String> param) {
+        int detailId = Integer.parseInt(param.get("detailId"));
+        BigDecimal qty = new BigDecimal(param.get("qty"));
+        return cycleCountDetailService.confirmGapQty(detailId, qty);
+    }
+
+    @PostMapping("/getEmptyContainerInLocation")
+    @ApiOperation("选取空托出库的库位")
+    @Log(title = "选取空托出库的库位", action = BusinessType.OTHER)
+    public AjaxResult getEmptyContainerInLocation(@RequestBody Map<String, String> param) {
+        String warehouCOde =  ShiroUtils.getWarehouseCode();
+        List<Location> list = containerService.getEmptyContainerInLocation(null,null,ShiroUtils.getWarehouseCode());
+        return  AjaxResult.success(list);
+    }
+
+    @PostMapping("/pickLocation")
+    @ApiOperation("选取补充入库的库位")
+    @Log(title = "选取补充入库的库位", action = BusinessType.OTHER)
+    public AjaxResult pickLocation(@RequestBody Map<String, String> param) {
+        List<Location> locations = locationService.pickLocation();
+        Container condition = new Container();
+        condition.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper lambda3 = Wrappers.lambdaQuery(condition);
+        List<Container> containers = containerService.list(lambda3);
+        for(Location location : locations) {
+            for(Container container : containers) {
+                if(container.getCode().equals(location.getContainerCode())) {
+                    if(container.getStatus().equals("some")) {
+                        location.setStatus("some");
+                    }
+                }
+            }
+        }
+        return  AjaxResult.success(locations);
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/invenory/ShipmentDetail.java b/src/main/java/com/huaheng/mobile/invenory/ShipmentDetail.java
new file mode 100644
index 0000000..71a18f5
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/invenory/ShipmentDetail.java
@@ -0,0 +1,35 @@
+package com.huaheng.mobile.invenory;
+
+import java.math.BigDecimal;
+
+/**
+ * Created by Enzo Cotter on 2019/12/15.
+ */
+public class ShipmentDetail {
+    private String materialName;
+    private BigDecimal qty;
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public BigDecimal getQty() {
+        return qty;
+    }
+
+    public void setQty(BigDecimal qty) {
+        this.qty = qty;
+    }
+
+    @Override
+    public String toString() {
+        return "ShipmentDetail{" +
+                "materialName='" + materialName + '\'' +
+                ", qty=" + qty +
+                '}';
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/invenory/TaskIds.java b/src/main/java/com/huaheng/mobile/invenory/TaskIds.java
new file mode 100644
index 0000000..f495915
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/invenory/TaskIds.java
@@ -0,0 +1,26 @@
+package com.huaheng.mobile.invenory;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+public class TaskIds {
+
+    private int taskId;
+
+    public int getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(int taskId) {
+        this.taskId = taskId;
+    }
+
+    @Override
+    public String toString() {
+        return "TaskDetail{" +
+                "taskId=" + taskId +
+                '}';
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/receipt/MaterialInfo.java b/src/main/java/com/huaheng/mobile/receipt/MaterialInfo.java
new file mode 100644
index 0000000..225d1f3
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/receipt/MaterialInfo.java
@@ -0,0 +1,93 @@
+package com.huaheng.mobile.receipt;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+public class MaterialInfo {
+
+    private String materialCode;
+
+    private String materialName;
+
+    private String qty;
+
+    private String type;
+
+    private String batch;
+
+    private String project;
+
+    private String weight;
+
+    public String getMaterialCode() {
+        return materialCode;
+    }
+
+    public void setMaterialCode(String materialCode) {
+        this.materialCode = materialCode;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getQty() {
+        return qty;
+    }
+
+    public void setQty(String qty) {
+        this.qty = qty;
+    }
+
+    public String getBatch() {
+        return batch;
+    }
+
+    public void setBatch(String batch) {
+        this.batch = batch;
+    }
+
+    public String getProject() {
+        return project;
+    }
+
+    public void setProject(String project) {
+        this.project = project;
+    }
+
+    public String getWeight() {
+        return weight;
+    }
+
+    public void setWeight(String weight) {
+        this.weight = weight;
+    }
+
+    @Override
+    public String toString() {
+        return "MaterialInfo{" +
+                "materialCode='" + materialCode + '\'' +
+                ", materialName='" + materialName + '\'' +
+                ", qty='" + qty + '\'' +
+                ", type='" + type + '\'' +
+                ", batch='" + batch + '\'' +
+                ", project='" + project + '\'' +
+                ", weight='" + weight + '\'' +
+                '}';
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java b/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java
new file mode 100644
index 0000000..d6313d3
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/receipt/MobileBatchReceiptController.java
@@ -0,0 +1,507 @@
+package com.huaheng.mobile.receipt;
+
+import com.alibaba.fastjson.JSONException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.api.general.domain.ReceiptDomain;
+import com.huaheng.common.constant.QuantityConstant;
+import com.huaheng.common.exception.service.ServiceException;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.config.company.service.CompanyService;
+import com.huaheng.pc.config.container.domain.Container;
+import com.huaheng.pc.config.container.service.ContainerService;
+import com.huaheng.pc.config.location.domain.Location;
+import com.huaheng.pc.config.location.service.LocationService;
+import com.huaheng.pc.config.material.domain.Material;
+import com.huaheng.pc.config.material.service.MaterialService;
+import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
+import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
+import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
+import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView;
+import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
+import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
+import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
+import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
+import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
+import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
+import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
+import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import groovy.json.JsonException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+@CrossOrigin
+@RestController
+@RequestMapping("/mobile/receipt/batch")
+@Api(tags = {"MobileBatchReceiptController"}, description = "移动端收货")
+public class MobileBatchReceiptController {
+
+    @Resource
+    private ReceiptContainerHeaderService receiptContainerHeaderService;
+    @Resource
+    private ReceiptHeaderService receiptHeaderService;
+    @Resource
+    private ReceiptDetailService receiptDetailService;
+    @Resource
+    private ReceiptContainerDetailService receiptContainerDetailService;
+    @Resource
+    private ContainerService containerService;
+    @Resource
+    private MaterialService materialService;
+    @Resource
+    private LocationService locationService;
+    @Resource
+    private TaskHeaderService taskHeaderService;
+    @Resource
+    private TaskDetailService taskDetailService;
+    @Resource
+    private CompanyService companyService;
+
+    @PostMapping("/scanBill")
+    @ApiOperation("移动端扫描入库单")
+    @Log(title = "移动端扫描入库单", action = BusinessType.OTHER)
+    public AjaxResult scanBill(@RequestBody @ApiParam(value = "收货单号") Map<String, String> param) throws Exception {
+        if (param.get("code") == null || param.get("code").trim().length() < 1) {
+            throw new JSONException("收货单号(code)不能为空");
+        } else if (StringUtils.isEmpty(param.get("type"))) {
+            throw new JsonException("入库单类型不能为空");
+        } else if (StringUtils.isEmpty(param.get("companyCode"))) {
+            throw new JsonException("库存组织不能为空");
+        }
+        return receiptDetailService.scanReceiptCode(param.get("code"), param.get("type"), param.get("companyCode"));
+    }
+
+    @PostMapping("/scanContainer")
+    @ApiOperation("移动端入库扫描容器")
+    @Log(title = "移动端入库扫描容器", action = BusinessType.OTHER)
+    public AjaxResult scanContainer(@RequestBody @ApiParam(value = "容器号") Map<String, String> param) throws Exception {
+        if (param.get("code") == null || param.get("code").trim().length() < 1) {
+            throw new JSONException("容器号(code)不能为空");
+        }
+
+        ReceiptContainerView receiptContainerView = new ReceiptContainerView();
+        receiptContainerView.setReceiptContainerCode(param.get("code"));
+        receiptContainerView.setTaskType((short) 100);
+        AjaxResult result = receiptContainerHeaderService.checkContainer(receiptContainerView);
+        LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery();
+        containerLambdaQueryWrapper.eq(Container::getCode, param.get("code"));
+        Container container = containerService.getOne(containerLambdaQueryWrapper);
+        if (container == null) {
+            return AjaxResult.error("托盘编码错误");
+        }
+        if (!container.getStatus().equals("empty")) {
+            return AjaxResult.error("托盘状态不为空");
+        }
+        if (!container.getLocationCode().equals("")) {
+            return AjaxResult.error("");
+        }
+        return result;
+    }
+
+    @PostMapping("/save")
+    @ApiOperation("移动端收货保存")
+    @Log(title = "移动端收货保存", action = BusinessType.OTHER)
+    public AjaxResult save(@RequestBody @ApiParam(value = "收货单") List<ReceiptContainerView> record) throws Exception {
+        AjaxResult result = receiptContainerHeaderService.batchSave(record);
+        return result;
+    }
+
+    @PostMapping("/getMaterial")
+    @ApiOperation("移动端获取物料信息")
+    @Log(title = "移动端获取物料信息", action = BusinessType.OTHER)
+    public AjaxResult getMaterial(@RequestBody @ApiParam(value = "物料号") Map<String, String> param) throws Exception {
+        if (param.get("code") == null || param.get("code").trim().length() < 1) {
+            throw new JSONException("容器号(code)不能为空");
+        }
+        Material material = materialService.findAllByCode(param.get("code"));
+        if (material == null) {
+            return AjaxResult.error("没有该物料");
+        }
+        MaterialInfo materialInfo = new MaterialInfo();
+        materialInfo.setMaterialCode(material.getCode());
+        materialInfo.setMaterialName(material.getName());
+        materialInfo.setType(material.getSpec());
+
+        return AjaxResult.success(materialInfo);
+    }
+
+    @PostMapping("/getLatestMaterial")
+    @ApiOperation("移动端获取物料信息")
+    @Log(title = "移动端获取物料信息", action = BusinessType.OTHER)
+    public AjaxResult getLatestMaterial(@RequestBody @ApiParam(value = "物料号") Map<String, String> param) throws Exception {
+        List<Material> materials = materialService.findLatest();
+        if (materials == null) {
+            return AjaxResult.error("没有找到物料");
+        }
+
+        return AjaxResult.success(materials);
+    }
+
+    @PostMapping("/getLatestReceipt")
+    @ApiOperation("移动端获取入库单")
+    @Log(title = "移动端获取入库单", action = BusinessType.OTHER)
+    public AjaxResult getLatestReceipt(@RequestBody @ApiParam(value = "物料号") Map<String, String> param) throws Exception {
+        String companyCode = param.get("companyCode");
+        List<ReceiptHeader> receiptHeaders = receiptHeaderService.getLatestReceipt(companyCode);
+        if (receiptHeaders == null) {
+            return AjaxResult.error("没有找到入库单");
+        }
+        return AjaxResult.success(receiptHeaders);
+    }
+
+
+
+    @PostMapping("/checkLocation")
+    @ApiOperation("移动端验证库位")
+    @Log(title = "移动端验证库位", action = BusinessType.OTHER)
+    public AjaxResult checkLocation(@RequestBody @ApiParam(value = "物料号") Map<String, String> param) throws Exception {
+        if (param.get("code") == null || param.get("code").trim().length() < 1) {
+            throw new JSONException("容器号(code)不能为空");
+        }
+
+        boolean result = locationService.checkLocation(param.get("code"));
+        if (!result) {
+            return AjaxResult.error("没有该库位");
+        }
+        return AjaxResult.success(result);
+    }
+
+    @PostMapping("/getFreeLocation")
+    @ApiOperation("移动端获得空闲库位")
+    @Log(title = "移动端获得空闲库位", action = BusinessType.OTHER)
+    public AjaxResult getFreeLocation(@RequestBody @ApiParam(value = "物料号") Map<String, String> param) throws Exception {
+        if (param.get("materialCode") == null || param.get("materialCode").trim().length() < 1) {
+            throw new JSONException("materialCode不能为空");
+        }
+
+        if (param.get("batch") == null || param.get("batch").trim().length() < 1) {
+            throw new JSONException("batch不能为空");
+        }
+        String materialCode = param.get("materialCode");
+        String batch = param.get("batch");
+        boolean result = locationService.getFreeLocation(materialCode, batch);
+        if (!result) {
+            return AjaxResult.error("没有空闲的分区库位");
+        }
+        return AjaxResult.success(result);
+    }
+
+    @PostMapping("/getContainerCode")
+    @ApiOperation("移动端验证库位")
+    @Log(title = "移动端验证库位", action = BusinessType.OTHER)
+    public AjaxResult getContainerCode(@RequestBody @ApiParam(value = "物料号") Map<String, String> param) throws Exception {
+        if (param.get("code") == null || param.get("code").trim().length() < 1) {
+            throw new JSONException("容器号(code)不能为空");
+        }
+        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(Location::getCode, param.get("code"))
+                .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(Location::getDeleted, false);
+        Location location = locationService.getOne(queryWrapper);
+        if (location == null) {
+            return AjaxResult.error("没有该库位");
+        }
+        return AjaxResult.success("成功", location.getContainerCode());
+    }
+
+    @PostMapping("/quickReceipt")
+    @ApiOperation("移动端收货保存")
+    @Log(title = "移动端收货保存", action = BusinessType.OTHER)
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult quickReceipt(@RequestBody @ApiParam(value="收货单") List<ReceiptBill> receiptBills) throws Exception {
+        if (receiptBills == null || receiptBills.size() <=0) {
+            throw new JSONException("没有收货信息");
+        }
+        String containerCode = receiptBills.get(0).receiptContainerCode;
+        String locationCode = receiptBills.get(0).locationCode;
+        String companyCode = receiptBills.get(0).getCompanyCode();
+        String receiptDetailId = receiptBills.get(0).getReceiptDetailId();
+
+        LambdaQueryWrapper<Container> containerQueryWrapper = Wrappers.lambdaQuery();
+        containerQueryWrapper.eq(Container::getCode, containerCode);
+        Container container = containerService.getOne(containerQueryWrapper);
+        if(container == null) {
+            throw new JSONException("不存在这个托盘");
+        }
+        if(locationCode.equals(container.getLocationCode())) {
+            /* 查询未完成的入库任务*/
+            LambdaQueryWrapper<TaskHeader> taskQueryWrapper = Wrappers.lambdaQuery();
+            taskQueryWrapper.eq(TaskHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                    .in(TaskHeader::getTaskType, QuantityConstant.TASK_TYPE_WHOLERECEIPT,
+                            QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT)
+                    .lt(TaskHeader::getStatus, 100)
+                    .eq(TaskHeader::getContainerCode, containerCode);
+            TaskHeader taskHeader = taskHeaderService.getOne(taskQueryWrapper);
+            if(taskHeader == null) {
+                throw new JSONException("没有找到托盘对应的任务");
+            }
+
+            LambdaQueryWrapper<ReceiptDetail> receiptDetailQueryWrapper = Wrappers.lambdaQuery();
+            receiptDetailQueryWrapper.eq(ReceiptDetail::getId, receiptDetailId);
+            ReceiptDetail receiptDetail = receiptDetailService.getOne(receiptDetailQueryWrapper);
+            if(receiptDetail == null) {
+                throw new JSONException("没有找到入库单详情");
+            }
+
+            LambdaQueryWrapper<ReceiptHeader> receiptHeaderQueryWrapper = Wrappers.lambdaQuery();
+            receiptHeaderQueryWrapper.eq(ReceiptHeader::getId, receiptDetail.getReceiptId());
+            ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderQueryWrapper);
+            if(receiptHeader == null) {
+                throw new JSONException("没有找到入库单");
+            }
+
+            LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
+            lambda.eq(ReceiptContainerHeader::getContainerCode, containerCode)
+                    .lt(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_FINISHED);
+            List<ReceiptContainerHeader> list = receiptContainerHeaderService.list(lambda);
+            if (list.size() >= 1){
+                throw new ServiceException("容器已经生成任务,不能放物料了!");
+            }
+            ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
+            //如果不存在记录则新建记录
+            receiptContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
+            receiptContainerHeader.setCompanyCode(companyCode);
+            receiptContainerHeader.setContainerCode(containerCode);
+            Container container2 = containerService.findAllByCode(containerCode);
+            receiptContainerHeader.setContainerType(container2.getContainerType());
+            receiptContainerHeader.setTaskType(String.valueOf(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT));
+            receiptContainerHeader.setFromLocation(container2.getLocationCode());
+            receiptContainerHeader.setToLocation(locationCode);
+            receiptContainerHeader.setCreatedBy(ShiroUtils.getLoginName());
+            receiptContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+            receiptContainerHeader.setStatus((short)10);
+
+            if (!receiptContainerHeaderService.save(receiptContainerHeader)){
+                throw new ServiceException("入库组盘头表保存失败");
+            }
+
+            receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
+            receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
+            receiptHeaderService.update(receiptHeader, receiptHeaderQueryWrapper);
+
+            taskHeader.setAllocationHeadId(receiptContainerHeader.getId());
+            taskHeaderService.update(taskHeader, taskQueryWrapper);
+
+            for(ReceiptBill receiptBill : receiptBills) {
+                TaskDetail taskDetail = new TaskDetail();
+                taskDetail.setTaskId(taskHeader.getId());
+                taskDetail.setContainerCode(containerCode);
+                taskDetail.setTaskType(taskHeader.getTaskType());
+                taskDetail.setInternalTaskType(taskHeader.getInternalTaskType());
+                taskDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
+                taskDetail.setCompanyCode(companyCode);
+                taskDetail.setBillCode(receiptHeader.getCode());
+                taskDetail.setBillDetailId(Integer.parseInt(receiptBill.getReceiptDetailId()));
+                taskDetail.setMaterialCode(receiptBill.getMaterialCode());
+                taskDetail.setMaterialName(receiptBill.getMaterialName());
+                taskDetail.setQty(receiptBill.getQty());
+                taskDetail.setFromLocation(taskHeader.getFromLocation());
+                taskDetail.setToLocation(taskHeader.getToLocation());
+                taskDetail.setStatus(taskHeader.getStatus());
+                taskDetail.setBatch(receiptBill.getBatch());
+                taskDetail.setCompanyCode(taskHeader.getCompanyCode());
+                taskDetailService.save(taskDetail);
+
+
+                LambdaQueryWrapper<ReceiptDetail> receiptDetail2QueryWrapper = Wrappers.lambdaQuery();
+                receiptDetail2QueryWrapper.eq(ReceiptDetail::getId, receiptBill.getReceiptDetailId());
+                ReceiptDetail receiptDetail2 = receiptDetailService.getOne(receiptDetail2QueryWrapper);
+                if(receiptDetail2 == null) {
+                    throw new JSONException("没有找到入库单详情");
+                }
+
+                BigDecimal openQty = receiptDetail2.getOpenQty();
+                BigDecimal totalQty = receiptDetail2.getTotalQty();
+                BigDecimal qty = openQty.add(receiptBill.getQty());
+                if(totalQty.subtract(qty).compareTo(BigDecimal.ZERO) < 0) {
+                    throw new Exception("配盘数量大于表单数量");
+                }
+
+                receiptDetail2.setOpenQty(qty);
+                receiptDetailService.update(receiptDetail2, receiptDetail2QueryWrapper);
+
+                ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
+                receiptContainerDetail.setReceiptContainerId(receiptContainerHeader.getId());
+                receiptContainerDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
+                receiptContainerDetail.setReceiptId(receiptHeader.getId());
+                receiptContainerDetail.setReceiptDetailId(receiptDetail2.getId());
+                receiptContainerDetail.setReceiptCode(receiptHeader.getCode());
+                receiptContainerDetail.setReceiptType(receiptHeader.getReceiptType());
+                receiptContainerDetail.setLocationCode(locationCode);
+                receiptContainerDetail.setContainerCode(containerCode);
+                receiptContainerDetail.setContainerType(container.getContainerType());
+                receiptContainerDetail.setCompanyCode(companyCode);
+
+                LambdaQueryWrapper<Material> materialQueryWrapper = Wrappers.lambdaQuery();
+                materialQueryWrapper.eq(Material::getCode, receiptBill.getMaterialCode())
+                                    .eq(Material::getDeleted, 0);
+                Material material = materialService.getOne(materialQueryWrapper);
+
+                receiptContainerDetail.setMaterialCode(material.getCode());
+                receiptContainerDetail.setMaterialName(material.getName());
+                receiptContainerDetail.setMaterialSpec(material.getSpec());
+                receiptContainerDetail.setMaterialUnit(material.getUnit());
+                receiptContainerDetail.setQty(receiptBill.getQty());
+                receiptContainerDetail.setStatus(10);
+                receiptContainerDetail.setCreatedBy(ShiroUtils.getLoginName());
+                receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+                receiptContainerDetailService.save(receiptContainerDetail);
+            }
+
+        } else {
+         /*   ReceiptContainerView record = new ReceiptContainerView();
+            record.setReceiptContainerCode(receiptBills.get(0).getReceiptContainerCode());
+            record.setLocationCode(receiptBills.get(0).getLocationCode());
+            record.setTaskType((short)100);
+            record.setCompanyCode(receiptBills.get(0).getCompanyCode());
+            receiptContainerHeaderService.checkContainer(record);
+            receiptContainerHeaderService.mobileCheckLocationCode(record);
+            int receiptHeaderId = receiptHeaderService.createTodayHeader(companyCode);
+            ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptHeaderId);
+            List<Integer> receiptDetailIds = receiptDetailService.insertTodayReceiptDetail(receiptHeaderId, receiptBills, true, companyCode);
+            if(receiptDetailIds != null && receiptDetailIds.size() > 0) {
+                int containerHeaderId = receiptContainerHeaderService.insertTodayReceiptContainerHeader(receiptBills.get(0), receiptHeader.getCode());
+                if(containerHeaderId > 0) {
+                    List<Integer> receiptContainerDetailIds = receiptContainerDetailService.insertTodayReceiptcContainerDetail(containerHeaderId, receiptHeaderId, receiptDetailIds, receiptBills);
+                    if(receiptContainerDetailIds != null && receiptContainerDetailIds.size() > 0) {
+
+                    } else {
+                        return AjaxResult.error("入库组盘失败");
+                    }
+                } else {
+                    return AjaxResult.error("插入入库容器表单头失败");
+                }
+            } else {
+                return AjaxResult.error("插入入库明细表单失败");
+            }   */
+        }
+        return AjaxResult.success("收货成功");
+    }
+
+    @PostMapping("/findReceipt")
+    @ApiOperation("移动端查询入库单")
+    @Log(title = "移动端查询入库单", action = BusinessType.OTHER)
+    public AjaxResult findReceipt(@RequestBody @ApiParam(value = "物料号") Map<String, String> param){
+        String receiptCode = param.get("receiptCode");
+        String companyCode = param.get("companyCode");
+        if (StringUtils.isNull(receiptCode)){
+            return AjaxResult.error("上游系统关联单号为空");
+        } else if (StringUtils.isNull(companyCode)){
+            return AjaxResult.error("公司编码为空");
+        }
+//        else if (StringUtils.isNull(referType)) {
+//            return AjaxResult.error("上游系统关联单类型为空");
+//        }
+
+        /* 查询入库单,如果数据库中不存在,则调用ERP接口拉取单据,成功后再次查询返回结果*/
+         LambdaQueryWrapper<ReceiptHeader> receiptLambdaQueryWrapper = Wrappers.lambdaQuery();
+        receiptLambdaQueryWrapper.eq(ReceiptHeader::getCode, receiptCode)
+                .eq(ReceiptHeader::getCompanyCode, companyCode);
+        ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptLambdaQueryWrapper);
+        if(receiptHeader == null) {
+            return AjaxResult.error("没有找到入库单");
+        }
+        ReceiptDomain receipt = new ReceiptDomain();
+        receipt.setReceiptHeader(receiptHeader);
+
+        LambdaQueryWrapper<ReceiptDetail> receiptDetailQueryWrapper = Wrappers.lambdaQuery();
+        receiptDetailQueryWrapper.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
+        List<ReceiptDetail> receiptDetailList = receiptDetailService.list(receiptDetailQueryWrapper);
+        receipt.setReceiptDetails(receiptDetailList);
+        return AjaxResult.success(receipt);
+    }
+
+    @PostMapping("/callBox")
+    @ApiOperation("移动端呼叫料盒")
+    @Log(title = "移动端呼叫料盒", action = BusinessType.OTHER)
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult callBox(@RequestBody @ApiParam(value = "物料号") Map<String, String> param)  {
+        String containerCode = param.get("containerCode");
+        String destinationLocation = param.get("destinationLocation");
+        int type = Integer.parseInt(param.get("type"));
+        String companyCode = param.get("companyCode");
+        Container container = new Container();
+        container.setCode(containerCode);
+        container.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(container);
+        container = containerService.getOne(lambdaQueryWrapper);
+        if(container==null) {
+            return AjaxResult.error("容器不存在");
+        }
+        if (!StringUtils.isNotEmpty(container.getLocationCode()))  {
+            return AjaxResult.error("容器不在库位[" + container.getLocationCode() + "]上");
+        }
+        if(!container.getLocationCode().equals(destinationLocation)) {
+            return AjaxResult.error("容器不在目的库位上");
+        }
+        Location temp = new Location();
+        temp.setCode(destinationLocation);
+        temp.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper lambda = Wrappers.lambdaQuery(temp);
+        Location loc = locationService.getOne(lambda);
+        if(StringUtils.isNotEmpty(destinationLocation)) {
+            //校验目标地址
+            if (loc == null) {
+                return AjaxResult.error("目标库位不存在");
+            }
+            if (!loc.getStatus().equals("empty")) {
+                return AjaxResult.error("目标库位非空闲");
+            }
+        }
+        //判断托盘是否已经存在任务
+        LambdaQueryWrapper<TaskHeader> headerQueryWrapper = Wrappers.lambdaQuery();
+        headerQueryWrapper.ne(TaskHeader::getStatus, 100)
+                .eq(TaskHeader::getContainerCode, containerCode);
+        Integer taskCount = taskHeaderService.count(headerQueryWrapper);
+        if (taskCount != null && taskCount.intValue() > 0)  {
+            return AjaxResult.error("容器已存在任务");
+        }
+
+        //创建主任务
+        TaskHeader taskHeader = new TaskHeader();
+        taskHeader.setWarehouseCode(loc.getWarehouseCode());
+        taskHeader.setCompanyCode(companyCode);//货主
+        if(type == 200) {
+            taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_SHELF);
+            taskHeader.setTaskType(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT);
+        } else {
+            taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_PICKING);
+            taskHeader.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
+        }
+        taskHeader.setContainerCode(container.getCode());
+        taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
+        taskHeader.setFromLocation(loc.getCode());
+        taskHeader.setToLocation(loc.getCode());
+        taskHeader.setCreated(new Date());
+        taskHeader.setCreatedBy(ShiroUtils.getLoginName());
+        taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
+        taskHeader.setLastUpdated(new Date());
+        if(taskHeaderService.save(taskHeader)){
+            //锁定库位状态
+            locationService.updateStatus(loc.getContainerCode(),"lock");
+        }else{
+            throw new ServiceException("补充入库主表生成失败!");
+        }
+
+        return AjaxResult.success(taskHeader.getId());
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/receipt/MobileOneByOneReceiptController.java b/src/main/java/com/huaheng/mobile/receipt/MobileOneByOneReceiptController.java
new file mode 100644
index 0000000..83a17b8
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/receipt/MobileOneByOneReceiptController.java
@@ -0,0 +1,39 @@
+package com.huaheng.mobile.receipt;
+
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView;
+import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/16
+ */
+@CrossOrigin
+@RestController
+@RequestMapping("/mobile/receipt/oneByOne")
+@Api(tags = {"MobileOneByOneReceiptController"}, description = "移动端逐件收货")
+public class MobileOneByOneReceiptController {
+
+    @Resource
+    private ReceiptContainerHeaderService receiptContainerHeaderService;
+
+    @PostMapping("/save")
+    @ApiOperation("移动端逐件收货保存")
+    @Log(title = "移动端逐件收货保存", action = BusinessType.OTHER)
+    public AjaxResult save(@RequestBody @ApiParam(value="容器号") ReceiptContainerView record) throws Exception {
+        record.setQty(new BigDecimal("1"));
+        AjaxResult retResult = receiptContainerHeaderService.saveCountain(record.getReceiptCode(), record.getReceiptContainerCode(),
+                record.getReceiptDetailId(), record.getLocationCode(), record.getQty().intValue(), null);
+        return retResult;
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/receipt/MobilePutawayController.java b/src/main/java/com/huaheng/mobile/receipt/MobilePutawayController.java
new file mode 100644
index 0000000..3ee5b63
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/receipt/MobilePutawayController.java
@@ -0,0 +1,100 @@
+package com.huaheng.mobile.receipt;
+
+import com.alibaba.fastjson.JSONException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.config.location.domain.Location;
+import com.huaheng.pc.config.location.service.LocationService;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/16
+ */
+@RestController
+@RequestMapping("/mobile/putaway/execute")
+@Api(tags = {"MobilePutawayController"}, description = "手机收货上架")
+public class MobilePutawayController {
+
+    @Resource
+    private TaskHeaderService taskService;
+    @Resource
+    private LocationService locationService;
+
+//    @PostMapping("/createReceiptTask")
+//    @ApiOperation("手机扫描容器收货上架")
+//    @Log(title = "手机扫描容器收货上架", action = BusinessType.OTHER)
+//    public AjaxResult createReceiptTask(@RequestBody @ApiParam(value="容器号") Map<String, String> param) throws Exception {
+//        if  (param.get("containerCode") == null || param.get("containerCode").trim().length() < 1) {
+//            throw new JSONException("容器号(containerCode)不能为空");
+//        }
+//        return AjaxResult retResult = taskService.mobileCreateReceiptTask(param.get("containerCode"), "L10-27-01");
+//    }
+
+    @PostMapping("/getLocationFromContainer")
+    @ApiOperation("手机扫描容器获得库位号")
+    @Log(title = "手机扫描容器获得库位号", action = BusinessType.OTHER)
+    public AjaxResult getLocationFromContainer(@RequestBody @ApiParam(value="容器号") Map<String, String> param) throws Exception {
+        if  (param.get("containerCode") == null || param.get("containerCode").trim().length() < 1) {
+            throw new JSONException("容器号(containerCode)不能为空");
+        }
+        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(Location::getDeleted, false)
+                .eq(Location::getContainerCode, param.get("containerCode"));
+        Location location = locationService.getOne(queryWrapper);
+        if(location == null) {
+            AjaxResult.error("没有该库位");
+        }
+        return AjaxResult.success("获取成功",location.getCode());
+    }
+
+    @PostMapping("/createQuickTask")
+    @ApiOperation("手机扫描容器收货上架")
+    @Log(title = "手机扫描容器收货上架", action = BusinessType.OTHER)
+    public AjaxResult createQuickTask(@RequestBody @ApiParam(value="容器号") Map<String, String> param) throws Exception {
+        if  (param.get("containerCode") == null || param.get("containerCode").trim().length() < 1) {
+            throw new JSONException("容器号(containerCode)不能为空");
+        }
+
+        AjaxResult retResult = taskService.createQuickTask(param.get("containerCode"));
+        return retResult;
+    }
+
+    @PostMapping("/scanLocationCode")
+    @ApiOperation("手机扫描库位收货上架")
+    @Log(title = "手机扫描库位收货上架", action = BusinessType.OTHER)
+    public AjaxResult scanLocationCode(@RequestBody @ApiParam(value="库位编码") Map<String, String> param) throws Exception {
+        if  (param.get("locationCode") == null || param.get("locationCode").trim().length() < 1) {
+            throw new JSONException("库位号(locationCode)不能为空");
+        }
+        AjaxResult retResult = taskService.completeTask(param.get("locationCode"));
+        return retResult;
+    }
+
+    @PostMapping("/createReplenishTask")
+    @ApiOperation("手机扫描容器创建补充入库任务")
+    @Log(title = "手机扫描容器创建补充入库任务", action = BusinessType.OTHER)
+    public AjaxResult createReplenishTask(@RequestBody @ApiParam(value="容器号") Map<String, String> param) throws Exception {
+        if  (param.get("containerCode") == null || param.get("containerCode").trim().length() < 1) {
+            throw new JSONException("容器号(containerCode)不能为空");
+        }
+        AjaxResult retResult = taskService.createReplenishTask(param.get("containerCode"), (short)1);
+        return retResult;
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/receipt/ReceiptBill.java b/src/main/java/com/huaheng/mobile/receipt/ReceiptBill.java
new file mode 100644
index 0000000..f12d0b7
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/receipt/ReceiptBill.java
@@ -0,0 +1,34 @@
+package com.huaheng.mobile.receipt;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+@Data
+public class ReceiptBill {
+    /** 容器编码 */
+    String receiptContainerCode;
+    /** 物料code */
+    String materialCode;
+    /** 收货数量 */
+    BigDecimal qty;
+    /** 库位编码 */
+    String locationCode;
+    /** 批次号 */
+    String batch;
+    /** 项目号 */
+    String project;
+
+    String receiptDetailId;
+
+    /** 货主Code */
+    String companyCode;
+    /** 重量 */
+    String weight;
+    String materialName;
+}
diff --git a/src/main/java/com/huaheng/mobile/receipt/ReceiptResult.java b/src/main/java/com/huaheng/mobile/receipt/ReceiptResult.java
new file mode 100644
index 0000000..5a0dcb4
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/receipt/ReceiptResult.java
@@ -0,0 +1,16 @@
+package com.huaheng.mobile.receipt;
+
+import lombok.Data;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/15
+ */
+@Data
+public class ReceiptResult {
+
+    private int receiptId;
+
+    private String receiptCode;
+}
diff --git a/src/main/java/com/huaheng/mobile/shipment/Materialforecast.java b/src/main/java/com/huaheng/mobile/shipment/Materialforecast.java
new file mode 100644
index 0000000..c35ab42
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/shipment/Materialforecast.java
@@ -0,0 +1,56 @@
+package com.huaheng.mobile.shipment;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/16
+ */
+public class Materialforecast {
+
+    private String materialCode;
+    private String materialName;
+    private String specification;
+    private int type;
+
+    public String getMaterialCode() {
+        return materialCode;
+    }
+
+    public void setMaterialCode(String materialCode) {
+        this.materialCode = materialCode;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public String getSpecification() {
+        return specification;
+    }
+
+    public void setSpecification(String specification) {
+        this.specification = specification;
+    }
+
+    @Override
+    public String toString() {
+        return "Materialforecast{" +
+                "materialCode='" + materialCode + '\'' +
+                ", materialName='" + materialName + '\'' +
+                ", specification='" + specification + '\'' +
+                ", type=" + type +
+                '}';
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/shipment/MobileShipmentController.java b/src/main/java/com/huaheng/mobile/shipment/MobileShipmentController.java
new file mode 100644
index 0000000..3096b15
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/shipment/MobileShipmentController.java
@@ -0,0 +1,124 @@
+package com.huaheng.mobile.shipment;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.huaheng.common.utils.StringUtils;
+import com.huaheng.common.utils.security.ShiroUtils;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.controller.BaseController;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.mobile.invenory.TaskIds;
+import com.huaheng.pc.config.company.domain.Company;
+import com.huaheng.pc.config.company.service.CompanyService;
+import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
+import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
+import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
+import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
+import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
+import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author mahua
+ * @ClassName MobileShipmentController
+ * @projectName wms_xinyi
+ * @description: TODO
+ * @date 2020/2/1115:29
+ */
+@RestController
+@RequestMapping("/mobile/shipment")
+public class MobileShipmentController extends BaseController {
+    @Resource
+    private ShipmentHeaderService shipmentHeaderService;
+    @Resource
+    private ShipmentDetailService shipmentDetailService;
+    @Resource
+    private ShipmentContainerHeaderService shipmentContainerHeaderService;
+    @Resource
+    private CompanyService companyService;
+    @Autowired
+    private TaskHeaderService taskHeaderService;
+
+    /**
+     * 查询出库单主列表
+     */
+    @Log(title = "出库-出库单", operating="查看出库主单", action = BusinessType.GRANT)
+    @PostMapping("/list")
+    public AjaxResult list(@RequestBody @ApiParam(value = "出库单号-referCode、货主编码-companyCode、出库单类型-shipmentType") Map<String, String> param) {
+        if (StringUtils.isEmpty(param.get("companyCode"))) {
+            return AjaxResult.error("上游系统单号为空");
+        } else if (StringUtils.isEmpty(param.get("shipmentType"))) {
+            return AjaxResult.error("类型为空");
+        } else if (StringUtils.isEmpty(param.get("referCode"))) {
+            return AjaxResult.error("上游系统单号为空");
+        }
+        LambdaQueryWrapper<ShipmentHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.eq(ShipmentHeader::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(ShipmentHeader::getDeleted,false)
+                .in(ShipmentHeader::getCompanyCode, param.get("companyCode"))
+                .eq(ShipmentHeader::getShipmentType,param.get("shipmentType"))
+                .eq(ShipmentHeader::getReferCode, param.get("referCode"))
+                .orderByDesc(ShipmentHeader::getId);
+        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(lambdaQueryWrapper);
+
+        if (shipmentHeader == null) {
+//            LambdaQueryWrapper<Company> lambdaQueryWrapper1 = Wrappers.lambdaQuery();
+//            lambdaQueryWrapper1.eq(Company::getCode, param.get("companyCode"));
+//            Company company = companyService.getOne(lambdaQueryWrapper1);
+//            shipmentHeaderService.findErpShipment(String.valueOf(company.getId()), param.get("shipmentType"), param.get("referCode"));
+//            shipmentHeader = shipmentHeaderService.getOne(lambdaQueryWrapper);
+            return AjaxResult.error("没有找到出库单");
+        }
+        LambdaQueryWrapper<ShipmentDetail> detailLambdaQueryWrapper = Wrappers.lambdaQuery();
+        detailLambdaQueryWrapper.eq(ShipmentDetail::getShipmentId, shipmentHeader.getId());
+        Shipment shipment = new Shipment();
+        shipment.setShipmentHeader(shipmentHeader);
+        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(detailLambdaQueryWrapper);
+        shipment.setShipmentDetailList(shipmentDetailList);
+        return AjaxResult.success(shipment);
+    }
+
+    /**
+     * 自动组盘
+     */
+    @PostMapping("/autoCombination")
+    @ResponseBody
+    public AjaxResult autoCombination(@RequestBody Map<String, String> param){
+        String shipmentCode = param.get("shipmentCode");
+        AjaxResult ajaxResult = shipmentContainerHeaderService.autoCombination(shipmentCode);
+        return ajaxResult;
+    }
+
+    /**
+     * 根据出库单号生成出库任务
+     */
+    @PostMapping("/createShipmentTask")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult createShipmentTask(@RequestBody List<TaskIds> taskDetails){
+        ShipmentTaskCreateModel shipmentTask = new ShipmentTaskCreateModel();
+        List<Integer> taskIds = new ArrayList<>();
+        for (TaskIds task : taskDetails) {
+            shipmentTask.setShipmentContainerHeaderIds(task.getTaskId());
+            AjaxResult ajaxResult = taskHeaderService.createTaskFromShipmentContainers(shipmentTask);
+            if(ajaxResult.hasErr()){
+                return ajaxResult;
+            }
+            Integer taskId = (Integer)ajaxResult.getData();
+            taskIds.add(taskId);
+        }
+        return AjaxResult.success(taskIds);
+    }
+
+
+}
diff --git a/src/main/java/com/huaheng/mobile/shipment/MobileTaskForASRSController.java b/src/main/java/com/huaheng/mobile/shipment/MobileTaskForASRSController.java
new file mode 100644
index 0000000..980e5c3
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/shipment/MobileTaskForASRSController.java
@@ -0,0 +1,48 @@
+package com.huaheng.mobile.shipment;
+
+import com.alibaba.fastjson.JSONException;
+import com.huaheng.framework.aspectj.lang.annotation.Log;
+import com.huaheng.framework.aspectj.lang.constant.BusinessType;
+import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.pc.config.material.service.MaterialService;
+import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
+import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/16
+ */
+@CrossOrigin
+@RestController
+@RequestMapping("/mobile/task/taskForASRS")
+@Api(tags = {"MobileTaskForASRSController"}, description = "手机立体库任务拣货相关")
+public class MobileTaskForASRSController {
+
+
+    @Resource
+    private TaskHeaderService taskHeaderService;
+    @Resource
+    private TaskDetailService taskDetailService;
+    @Resource
+    private MaterialService materialService;
+
+    @PostMapping("/getMaterialForecast")
+    @ApiOperation("获得物料联想词")
+    @Log(title = "获得物料联想词", action = BusinessType.OTHER)
+    public AjaxResult getMaterialForecast(@RequestBody @ApiParam(value="物料号") Map<String, String> param) {
+        if  (param.get("code") == null || param.get("code").trim().length() < 1) {
+            throw new JSONException("容器号(code)不能为空");
+        }
+        List<Materialforecast> forecasts = materialService.getMaterialForecast(param.get("code"));
+        return AjaxResult.success("");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/mobile/shipment/Shipment.java b/src/main/java/com/huaheng/mobile/shipment/Shipment.java
new file mode 100644
index 0000000..d06c4cd
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/shipment/Shipment.java
@@ -0,0 +1,24 @@
+package com.huaheng.mobile.shipment;
+
+import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
+import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author mahua
+ * @ClassName Shipment
+ * @projectName wms_xinyi
+ * @description: TODO
+ * @date 2020/2/1115:46
+ */
+@Data
+public class Shipment implements Serializable {
+
+    private ShipmentHeader shipmentHeader;
+
+    private List<ShipmentDetail> shipmentDetailList;
+
+}
diff --git a/src/main/java/com/huaheng/mobile/shipment/ShipmentBill.java b/src/main/java/com/huaheng/mobile/shipment/ShipmentBill.java
new file mode 100644
index 0000000..6036f45
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/shipment/ShipmentBill.java
@@ -0,0 +1,84 @@
+package com.huaheng.mobile.shipment;
+
+import java.math.BigDecimal;
+
+/**
+ * 出库单据
+ * @author Enzo Cotter
+ * @date 2019/12/16
+ */
+public class ShipmentBill {
+
+    /** 物料code */
+    private String materialCode;
+    /** 出库数量 */
+    private BigDecimal qty;
+    /** 货主id */
+    private String companyId;
+    /** 货主code */
+    private String companyCode;
+    /** 货架*/
+    private String location;
+    /**接收点-工位*/
+    private int point;
+
+    public String getMaterialCode() {
+        return materialCode;
+    }
+
+    public void setMaterialCode(String materialCode) {
+        this.materialCode = materialCode;
+    }
+
+    public BigDecimal getQty() {
+        return qty;
+    }
+
+    public void setQty(BigDecimal qty) {
+        this.qty = qty;
+    }
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCompanyCode() {
+        return companyCode;
+    }
+
+    public void setCompanyCode(String companyCode) {
+        this.companyCode = companyCode;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public void setLocation(String location) {
+        this.location = location;
+    }
+
+    public int getPoint() {
+        return point;
+    }
+
+    public void setPoint(int point) {
+        this.point = point;
+    }
+
+    @Override
+    public String toString() {
+        return "ShipmentBill{" +
+                "materialCode='" + materialCode + '\'' +
+                ", qty=" + qty +
+                ", companyId='" + companyId + '\'' +
+                ", companyCode='" + companyCode + '\'' +
+                ", location='" + location + '\'' +
+                ", point=" + point +
+                '}';
+    }
+}
diff --git a/src/main/java/com/huaheng/mobile/shipment/ShipmentTaskModel.java b/src/main/java/com/huaheng/mobile/shipment/ShipmentTaskModel.java
new file mode 100644
index 0000000..d217e3b
--- /dev/null
+++ b/src/main/java/com/huaheng/mobile/shipment/ShipmentTaskModel.java
@@ -0,0 +1,47 @@
+package com.huaheng.mobile.shipment;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/16
+ */
+public class ShipmentTaskModel {
+
+    /**
+     * 需要创建任务的出库货箱列表
+     */
+    private int[] shipmentContainerHeaderIds;
+    /**
+     * 是否优先创建整出任务,1,表示可以创建整出就优先创建整出,不能的话就创建拣选出;2,表示只创建拣选出;
+     */
+    private int taskType;
+
+    /**
+     * 优先级
+     */
+    private short priority;
+
+    public short getPriority() {
+        return priority;
+    }
+
+    public void setPriority(short priority) {
+        this.priority = priority;
+    }
+
+    public int[] getShipmentContainerHeaderIds() {
+        return shipmentContainerHeaderIds;
+    }
+
+    public void setShipmentContainerHeaderIds(int[] shipmentContainerHeaderIds) {
+        this.shipmentContainerHeaderIds = shipmentContainerHeaderIds;
+    }
+
+    public int getTaskType() {
+        return taskType;
+    }
+
+    public void setTaskType(int taskType) {
+        this.taskType = taskType;
+    }
+}
diff --git a/src/main/java/com/huaheng/pc/common/mapper/ApkMapper.java b/src/main/java/com/huaheng/pc/common/mapper/ApkMapper.java
new file mode 100644
index 0000000..89ba51e
--- /dev/null
+++ b/src/main/java/com/huaheng/pc/common/mapper/ApkMapper.java
@@ -0,0 +1,23 @@
+package com.huaheng.pc.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huaheng.mobile.download.ApkInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ApkMapper extends BaseMapper<ApkInfo> {
+
+
+  //  @Select("select * from apkinfo where pkgName=#{pkgName}")
+    List<ApkInfo> getApkInfoByPkgName(String pkgName);
+
+  //  @Options(useGeneratedKeys = true, keyProperty = "id")
+  // @Insert("insert into apkinfo(pkgName, versionCode, versionName, url, md5) values(#{pkgName},#{versionCode},#{versionName},#{url},#{md5})")
+    int insertApkInfo(@Param("pkgName") String pkgName, @Param("versionCode") int versionCode, @Param("versionName") String versionName, @Param("url") String url, @Param("md5") String md5);
+
+ //   @Options(useGeneratedKeys = true, keyProperty = "id")
+  //  @Insert("delete from apkinfo")
+    void clearApkInfo();
+
+}
diff --git a/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java b/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java
index efae305..1247a9f 100644
--- a/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java
+++ b/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java
@@ -24,4 +24,6 @@ public interface LocationMapper extends BaseMapper<Location> {
     //库位利用率
     List<LinkedHashMap<String, Object>> getLocationProp();
 
+    List<Location> pickLocation();
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/config/location/service/LocationService.java b/src/main/java/com/huaheng/pc/config/location/service/LocationService.java
index 8d1f352..11212e5 100644
--- a/src/main/java/com/huaheng/pc/config/location/service/LocationService.java
+++ b/src/main/java/com/huaheng/pc/config/location/service/LocationService.java
@@ -24,4 +24,19 @@ public interface LocationService extends IService<Location>{
 
     //库位利用率
     List<LinkedHashMap<String, Object>> getLocationProp();
+
+    /**
+     * 查询空闲可用的库位用来补充入库
+     * @return location
+     */
+    List<Location> pickLocation();
+
+    /**
+     * 验证库位合法性
+     * @param code
+     * @return
+     */
+    boolean checkLocation(String code);
+
+    boolean getFreeLocation(String materialCode, String batch);
 }
diff --git a/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java b/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java
index 3278ce9..814a2bc 100644
--- a/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java
@@ -205,4 +205,51 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
         return locationMapper.getLocationProp();
     }
 
+    @Override
+    public List<Location> pickLocation() {
+        return locationMapper.pickLocation();
+    }
+
+    /**
+     * 验证库位合法性
+     *
+     * @param code
+     * @return
+     */
+    @Override
+    public boolean checkLocation(String code) {
+        LambdaQueryWrapper<Location> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(Location::getDeleted,false)
+                .eq(Location::getCode, code);
+        List<Location> locations = list(queryWrapper);
+        if (locations.size() >= 1){
+            Location location = locations.get(0);
+            String containerCode =location.getContainerCode();
+            if (containerCode != null && containerCode.length() > 0) {
+                throw new ServiceException("货架上已有容器");
+            }
+            String status = location.getStatus();
+            if(!"empty".equals(status)) {
+                throw new ServiceException("库位状态不为空");
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public boolean getFreeLocation(String materialCode, String batch) {
+        LambdaQueryWrapper<Location> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .eq(Location::getContainerCode, "")
+                .eq(Location::getDeleted, false)
+                .eq(Location::getStatus, "empty");
+        List<Location> locations = locationService.list(lambdaQueryWrapper);
+        if(locations != null && locations.size() > 0) {
+            return true;
+        }
+        return false;
+    }
 }
diff --git a/src/main/java/com/huaheng/pc/config/material/mapper/MaterialMapper.java b/src/main/java/com/huaheng/pc/config/material/mapper/MaterialMapper.java
index 8694d5a..fa324ac 100644
--- a/src/main/java/com/huaheng/pc/config/material/mapper/MaterialMapper.java
+++ b/src/main/java/com/huaheng/pc/config/material/mapper/MaterialMapper.java
@@ -3,6 +3,8 @@ package com.huaheng.pc.config.material.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.huaheng.pc.config.material.domain.Material;
 
+import java.util.List;
+
 public interface MaterialMapper extends BaseMapper<Material> {
 
     /**
@@ -11,4 +13,10 @@ public interface MaterialMapper extends BaseMapper<Material> {
      * @return Material
      */
     Material findAllByCode(String code);
+
+    /**
+     * 根据编码查询物料
+     * @return Material
+     */
+    List<Material> findLatest();
 }
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/config/material/service/MaterialService.java b/src/main/java/com/huaheng/pc/config/material/service/MaterialService.java
index d7c8b99..17b18ce 100644
--- a/src/main/java/com/huaheng/pc/config/material/service/MaterialService.java
+++ b/src/main/java/com/huaheng/pc/config/material/service/MaterialService.java
@@ -1,6 +1,7 @@
 package com.huaheng.pc.config.material.service;
 
 import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.mobile.shipment.Materialforecast;
 import com.huaheng.pc.config.material.domain.Material;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -32,4 +33,13 @@ public interface MaterialService extends IService<Material>{
     AjaxResult addSave(Material material);
 
     Material findAllByCode(String code);
+
+    List<Material> findLatest();
+
+    /**
+     * 获得物料联想词
+     * @param code
+     * @return
+     */
+    List<Materialforecast> getMaterialForecast(String code);
 }
diff --git a/src/main/java/com/huaheng/pc/config/material/service/MaterialServiceImpl.java b/src/main/java/com/huaheng/pc/config/material/service/MaterialServiceImpl.java
index 3cbcebe..396f5e5 100644
--- a/src/main/java/com/huaheng/pc/config/material/service/MaterialServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/config/material/service/MaterialServiceImpl.java
@@ -7,16 +7,20 @@ import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.mobile.shipment.Materialforecast;
 import com.huaheng.pc.config.materialMultiple.domain.MaterialMultiple;
 import com.huaheng.pc.config.materialType.domain.MaterialType;
 import com.huaheng.pc.config.materialType.service.MaterialTypeService;
 import com.huaheng.pc.config.materialUnit.domain.MaterialUnit;
 import com.huaheng.pc.config.materialUnit.service.MaterialUnitService;
+import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
+import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
 import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
 import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.lang.ref.WeakReference;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -35,6 +39,8 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
     private MaterialTypeService materialTypeService;
     @Resource
     private MaterialMapper materialMapper;
+    @Resource
+    private InventoryDetailService inventoryDetailService;
 
     @Override
     public AjaxResult removeByIds(String ids) {
@@ -171,4 +177,49 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> i
 
         return String.format(materialType.getAutoGenSerialNumFormat(), materialType.getTrackSerialNum());
     }
+
+    @Override
+    public List<Material> findLatest() {
+        return materialMapper.findLatest();
+    }
+
+    /**
+     * 获得物料联想词
+     *
+     * @param code
+     * @return
+     */
+    @Override
+    public List<Materialforecast> getMaterialForecast(String code) {
+        List<Materialforecast> forecast = new ArrayList<>();
+        LambdaQueryWrapper<InventoryDetail> detailLambdaQueryWrapper = Wrappers.lambdaQuery();
+        detailLambdaQueryWrapper.eq(InventoryDetail::getMaterialCode, code)
+                .eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                .in(InventoryDetail::getCompanyCode,ShiroUtils.getCompanyCodeList());
+        List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(detailLambdaQueryWrapper);
+        if (!inventoryDetailList.isEmpty()) {
+            for (InventoryDetail inventoryDetail : inventoryDetailList) {
+                Materialforecast materialforecast = new Materialforecast();
+                materialforecast.setMaterialCode(inventoryDetail.getMaterialCode());
+                materialforecast.setType(0);
+                forecast.add(materialforecast);
+            }
+        } else {
+            detailLambdaQueryWrapper = Wrappers.lambdaQuery();
+            detailLambdaQueryWrapper.like(InventoryDetail::getMaterialName, code)
+                    .eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                    .in(InventoryDetail::getCompanyCode,ShiroUtils.getCompanyCodeList());
+            List<InventoryDetail> inventoryDetailList1 = inventoryDetailService.list(detailLambdaQueryWrapper);
+            if (!inventoryDetailList1.isEmpty()) {
+                for (InventoryDetail inventoryDetail : inventoryDetailList) {
+                    Materialforecast materialforecast = new Materialforecast();
+                    materialforecast.setMaterialCode(inventoryDetail.getMaterialCode());
+                    materialforecast.setType(0);
+                    forecast.add(materialforecast);
+                }
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/src/main/java/com/huaheng/pc/config/points/domain/Points.java b/src/main/java/com/huaheng/pc/config/points/domain/Points.java
index bd4e63e..73d01ac 100644
--- a/src/main/java/com/huaheng/pc/config/points/domain/Points.java
+++ b/src/main/java/com/huaheng/pc/config/points/domain/Points.java
@@ -5,8 +5,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.huaheng.framework.web.domain.BaseEntity;
+
 import io.swagger.annotations.ApiModel;
-import lombok.Data;
+
 
 /**
  * @author ricard
@@ -15,7 +16,6 @@ import lombok.Data;
  */
 
 @ApiModel(value="com.huaheng.pc.config.points.domain.Points")
-@Data
 @TableName(value = "points")
 public class Points extends BaseEntity {
     //id
diff --git a/src/main/java/com/huaheng/pc/inventory/cycleCountHeader/controller/CycleCountHeaderController.java b/src/main/java/com/huaheng/pc/inventory/cycleCountHeader/controller/CycleCountHeaderController.java
index 31e746f..2d0589d 100644
--- a/src/main/java/com/huaheng/pc/inventory/cycleCountHeader/controller/CycleCountHeaderController.java
+++ b/src/main/java/com/huaheng/pc/inventory/cycleCountHeader/controller/CycleCountHeaderController.java
@@ -115,7 +115,7 @@ public class CycleCountHeaderController extends BaseController {
     {
 
         cycleCountHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
-        //cycleCountHeader.setCompanyCode(cycleCountHeader.getCompanyCode());
+        cycleCountHeader.setCompanyCode(cycleCountHeader.getCompanyCode());
         //cycleCountHeader.setRound(cycleCountHeader.getRound());//盘点轮次
         cycleCountHeader.setCreated(new Date());
         cycleCountHeader.setCreatedBy(ShiroUtils.getLoginName());
diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java
index 4bf16a6..a02ad09 100644
--- a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java
+++ b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderService.java
@@ -28,6 +28,21 @@ public interface InventoryHeaderService extends IService<InventoryHeader> {
 
     AjaxResult createEmptyCheckOut(String containerCode, String location);
 
+    /**
+     * 移动端获取库存详情
+     * @param code 物料编码
+     * @param companyCode 货主编码
+     * @return
+     */
+    AjaxResult getInventory(String code, String companyCode);
+
+    /**
+     * 移动端获得库位联想词
+     * @param code
+     * @param type
+     * @return
+     */
+    AjaxResult getLocationForecast(String code, int type);
 
 }
 
diff --git a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java
index 671dd47..1c1a0ee 100644
--- a/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/inventory/inventoryHeader/service/InventoryHeaderServiceImpl.java
@@ -7,11 +7,16 @@ import com.huaheng.common.exception.service.ServiceException;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.mobile.invenory.MobileInventory;
 import com.huaheng.pc.config.container.domain.Container;
 import com.huaheng.pc.config.container.service.ContainerService;
 import com.huaheng.pc.config.location.domain.Location;
 import com.huaheng.pc.config.location.service.LocationService;
+import com.huaheng.pc.config.material.domain.Material;
+import com.huaheng.pc.config.material.service.MaterialService;
 import com.huaheng.pc.config.warehouse.domain.Warehouse;
+import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
+import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
 import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
 import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
 import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
@@ -25,7 +30,9 @@ import com.huaheng.pc.inventory.inventoryHeader.mapper.InventoryHeaderMapper;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 @Service
 public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMapper, InventoryHeader> implements InventoryHeaderService {
@@ -41,8 +48,10 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe
     private ContainerService containerService;
     @Resource
     private LocationService locationService;
-
-
+    @Resource
+    private MaterialService materialService;
+    @Resource
+    private InventoryDetailService inventoryDetailService;
 
     /**
      * 移库
@@ -311,7 +320,210 @@ public class InventoryHeaderServiceImpl extends ServiceImpl<InventoryHeaderMappe
     }
 
 
+    /**
+     * 移动端获取库存详情
+     *
+     * @param code        物料编码
+     * @param companyCode 货主编码
+     * @return
+     */
+    @Override
+    public AjaxResult getInventory(String code, String companyCode) {
+        if (StringUtils.isEmpty(code)) {
+            return AjaxResult.error("编码为空");
+        }
+        if (StringUtils.isEmpty(companyCode)) {
+            return AjaxResult.error("公司编码为空");
+        }
+        List<InventoryDetail> inventories = null;
+        List<MobileInventory> mobileInventories = new ArrayList<>();
+        int resultType = 0;
+        inventories = selectListEntityByMaterialCode(code);
+        if(inventories == null || inventories.size() == 0) {
+            inventories = selectListEntityByMaterialName(code);
+        }
+        if(inventories == null || inventories.size() == 0) {
+            inventories = selectListEntityByLocationCode(code);
+            resultType = 1;
+        }
+        if(inventories == null || inventories.size() == 0) {
+            Location location = new Location();
+            location.setContainerCode(code);
+            location.setWarehouseCode(ShiroUtils.getWarehouseCode());
+            location.setDeleted(false);
+            LambdaQueryWrapper lamdba6 = Wrappers.lambdaQuery(location);
+            Location location1 = locationService.getOne(lamdba6);
+            if(location1 != null) {
+                inventories = selectListEntityByLocationCode(location1.getCode());
+                resultType = 1;
+            }
+        }
+        if(inventories != null && inventories.size() > 0) {
+            for(InventoryDetail inventory : inventories) {
+                MobileInventory mobileInventory = new MobileInventory();
+                mobileInventory.setId(inventory.getId());
+                mobileInventory.setLocationCode(inventory.getLocationCode());
+                mobileInventory.setMaterialCode(inventory.getMaterialCode());
+                mobileInventory.setContainerCode(inventory.getContainerCode());
+                Material materialCondition = new Material();
+                materialCondition.setWarehouseCode(ShiroUtils.getWarehouseCode());
+                materialCondition.setDeleted(false);
+                materialCondition.setCode(inventory.getMaterialCode());
+//                materialCondition.setCompanyCode(companyCode);
+                LambdaQueryWrapper lamdba6 = Wrappers.lambdaQuery(materialCondition);
+                Material material = materialService.getOne(lamdba6);
+                if(material == null) {
+                    return AjaxResult.error("没有相对应库存");
+                }
+                mobileInventory.setMaterialName(material.getName());
+                mobileInventory.setQty(inventory.getQty());
+                mobileInventory.setResultType(resultType);
+                mobileInventory.setTaskQty(inventory.getTaskQty());
+                mobileInventory.setSpecification(material.getSpec());
+                mobileInventories.add(mobileInventory);
+            }
+            return AjaxResult.success(mobileInventories);
+        }
+        Location location = new Location();
+        location.setCode(code);
+        location.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        location.setStatus("empty");
+        location.setDeleted(false);
+        LambdaQueryWrapper lamdba62 = Wrappers.lambdaQuery(location);
+        Location location1 = locationService.getOne(lamdba62);
+        if(location1 != null) {
+            resultType = 2;
+            MobileInventory mobileInventory = new MobileInventory();
+            mobileInventory.setResultType(resultType);
+            mobileInventory.setContainerCode(location1.getContainerCode());
+            mobileInventory.setLocationCode(location1.getCode());
+            mobileInventory.setContainerCode(location1.getContainerCode());
+            mobileInventories.add(mobileInventory);
+            return AjaxResult.success(mobileInventories);
+        }
+        if(inventories == null || inventories.size() == 0) {
+            Location condition = new Location();
+            condition.setContainerCode(code);
+            condition.setWarehouseCode(ShiroUtils.getWarehouseCode());
+            condition.setDeleted(false);
+            LambdaQueryWrapper lamdba63 = Wrappers.lambdaQuery(condition);
+            Location location2 = locationService.getOne(lamdba63);
+            if(location2 == null) {
+                condition.setCode(code);
+                condition.setWarehouseCode(ShiroUtils.getWarehouseCode());
+                condition.setDeleted(false);
+            }
+            if(location2 != null) {
+                Container container = new Container();
+                container.setCode(location2.getContainerCode());
+                container.setStatus("empty");
+                LambdaQueryWrapper lamdba6 = Wrappers.lambdaQuery(container);
+                container = containerService.getOne(lamdba6);
+                if(container != null) {
+                    resultType = 2;
+                    MobileInventory mobileInventory = new MobileInventory();
+                    mobileInventory.setResultType(resultType);
+                    mobileInventory.setContainerCode(location2.getContainerCode());
+                    mobileInventory.setLocationCode(location2.getCode());
+                    mobileInventory.setContainerCode(location2.getContainerCode());
+                    mobileInventories.add(mobileInventory);
+                    return AjaxResult.success(mobileInventories);
+                }
+            }
+        }
+        return AjaxResult.error("没有相对应库存");
+    }
+
+    public List<InventoryDetail> selectListEntityByMaterialName(String materialName) {
+        Material material = new Material();
+        material.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        material.setEnable(true);
+        material.setDeleted(false);
+        if(materialName.contains("    ")) {
+            String materialinfos[] = materialName.split("    ");
+            materialName = materialinfos[0];
+            material.setSpec(materialinfos[1]);
+        }
+        material.setName(materialName);
+        LambdaQueryWrapper lamdba62 = Wrappers.lambdaQuery(material);
+        Material result= materialService.getOne(lamdba62);
+        if(result == null) {
+            return null;
+        }
+        InventoryDetail condition = new InventoryDetail();
+        condition.setMaterialCode(result.getCode());
+        condition.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper lamdba6 = Wrappers.lambdaQuery(condition);
+        List<InventoryDetail> inventories = inventoryDetailService.list(lamdba6);
+        return inventories;
+    }
+
+    public List<InventoryDetail> selectListEntityByMaterialCode(String materialCode) {
+        InventoryDetail condition = new InventoryDetail();
+        condition.setMaterialCode(materialCode);
+        condition.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper lamdba6 = Wrappers.lambdaQuery(condition);
+        List<InventoryDetail> inventories = inventoryDetailService.list(lamdba6);
+        return inventories;
+    }
 
+    public List<InventoryDetail> selectListEntityByLocationCode(String locationCode) {
+        InventoryDetail condition = new InventoryDetail();
+        condition.setLocationCode(locationCode);
+        condition.setWarehouseCode(ShiroUtils.getWarehouseCode());
+        LambdaQueryWrapper lamdba6 = Wrappers.lambdaQuery(condition);
+        List<InventoryDetail> inventories = inventoryDetailService.list(lamdba6);
+        return inventories;
+    }
+
+    /**
+     * 移动端获得库位联想词
+     *
+     * @param code
+     * @param type
+     * @return
+     */
+    @Override
+    public AjaxResult getLocationForecast(String code, int type) {
+        List<InventoryDetail> inventoryDetailList = new ArrayList<>();
+        if (type == 0){
+            LambdaQueryWrapper<InventoryDetail> detailLambdaQueryWrapper = Wrappers.lambdaQuery();
+            detailLambdaQueryWrapper.eq(InventoryDetail::getLocationCode, code)
+                    .eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
+            inventoryDetailList = inventoryDetailService.list(detailLambdaQueryWrapper);
+            if (inventoryDetailList.isEmpty()){
+                List<String> results = new ArrayList<>();
+                for (InventoryDetail inventoryDetail : inventoryDetailList) {
+                    String locationCode = inventoryDetail.getLocationCode();
+                    LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
+                    locationLambdaQueryWrapper.eq(Location::getStatus, "empaty")
+                            .eq(Location::getDeleted, false)
+                            .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                            .eq(Location::getCode, locationCode);
+                    Location location = locationService.getOne(locationLambdaQueryWrapper);
+                    if (location == null){
+                        results.add(inventoryDetail.getLocationCode());
+                    }
+                }
+                return AjaxResult.success(results);
+            }
+        } else if (type == 1) {
+            LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
+            locationLambdaQueryWrapper.eq(Location::getCode, code)
+                    .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+                    .eq(Location::getDeleted, false)
+                    .eq(Location::getStatus, "empaty");
+            List<Location> locations = locationService.list(locationLambdaQueryWrapper);
+            if (locations.isEmpty()){
+                List<String> results = new ArrayList<>();
+                for (Location location : locations) {
+                    results.add(location.getCode());
+                }
+                return AjaxResult.success(results);
+            }
+        }
+        return AjaxResult.success(inventoryDetailList);
+    }
 
 
 }
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/domain/ReceiptContainerView.java b/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/domain/ReceiptContainerView.java
new file mode 100644
index 0000000..dbabfbc
--- /dev/null
+++ b/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/domain/ReceiptContainerView.java
@@ -0,0 +1,35 @@
+package com.huaheng.pc.receipt.receiptContainerHeader.domain;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2019/12/30
+ */
+@Data
+public class ReceiptContainerView {
+
+    /** 入库方式 */
+    Short taskType;
+    /** 入库单编码 */
+    String receiptCode;
+    /** 容器编码 */
+    String receiptContainerCode;
+    /** 收货单明细ID */
+    Integer receiptDetailId;
+    /** 库位编码 */
+    String locationCode;
+    /** 库位编码 */
+    String sourceLocation;
+    /** 收货数量 */
+    BigDecimal qty;
+    /** 货主code */
+    String companyCode;
+    /**出入口*/
+    private Integer port;
+    /**重量*/
+    private Double weight;
+}
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderService.java b/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderService.java
index 78cc219..87bafd5 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderService.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderService.java
@@ -3,6 +3,7 @@ package com.huaheng.pc.receipt.receiptContainerHeader.service;
 import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView;
 
 import java.util.List;
 
@@ -22,4 +23,13 @@ public interface ReceiptContainerHeaderService extends IService<ReceiptContainer
                             String locationCode, Integer qty, String locatingRule);
 
     Boolean cancelByIds(List<Integer> id);
+
+    /**
+     * 检查容器状态
+     * @param record
+     * @return
+     */
+    AjaxResult checkContainer(ReceiptContainerView record);
+
+    AjaxResult batchSave(List<ReceiptContainerView> list);
 }
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderServiceImpl.java b/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderServiceImpl.java
index 3625114..ffe8144 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderServiceImpl.java
@@ -19,6 +19,7 @@ import com.huaheng.pc.config.warehouse.domain.Warehouse;
 import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
 import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
 import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
+import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView;
 import com.huaheng.pc.receipt.receiptContainerHeader.mapper.ReceiptContainerHeaderMapper;
 import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
 import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
@@ -206,6 +207,26 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai
     }
 
     /**
+     * 检查容器状态
+     *
+     * @param record
+     * @return
+     */
+    @Override
+    public AjaxResult checkContainer(ReceiptContainerView record) {
+        //容器都是单据SN码,每个入库单都是新增容器
+
+        if (com.huaheng.common.utils.StringUtils.isEmpty(record.getReceiptContainerCode())) {
+            throw new ServiceException("容器不能为空");
+        }
+
+        if (taskHeaderService.UncompleteCount(record.getReceiptContainerCode()).intValue() > 0) {
+            throw new ServiceException("容器已经存在任务,请更换容器");
+        }
+        return AjaxResult.success("");
+    }
+
+    /**
      * 检查容器编码合法性
      * @param containerCode
      * @param materialCode
@@ -416,4 +437,19 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai
         }
         return code;
     }
+
+    @Override
+    public AjaxResult batchSave(List<ReceiptContainerView> list) {
+        if (list.size() < 1) {
+            throw new ServiceException("收货明细是空!");
+        }
+        checkContainer(list.get(0));
+        if (checkLocationCode(list.get(0).getLocationCode(), list.get(0).getLocationCode(), Integer.valueOf(list.get(0).getTaskType())) == true) {
+            locationService.updateStatus(list.get(0).getLocationCode(), "lock");
+        }
+        ReceiptContainerView view = list.get(0);
+        AjaxResult ajaxResult = saveCountain(view.getReceiptCode(), view.getReceiptContainerCode(),
+                view.getReceiptDetailId(), view.getLocationCode(), view.getQty().intValue(), null);
+        return null;
+    }
 }
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailService.java b/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailService.java
index 41018d2..23f9b13 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailService.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailService.java
@@ -1,6 +1,7 @@
 package com.huaheng.pc.receipt.receiptDetail.service;
 
 import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.mobile.receipt.ReceiptBill;
 import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
@@ -38,4 +39,13 @@ public interface ReceiptDetailService extends IService<ReceiptDetail>{
 
     //以货主维度获取入库量
     List<TaskDetail> getCompanyReceipt();
+
+    /**
+     * 移动端扫描入库单
+     * @param code
+     * @return
+     */
+    AjaxResult scanReceiptCode(String code, String type, String companyCode);
+
+    List<Integer> insertTodayReceiptDetail(int headerId, List<ReceiptBill> receiptBills, boolean isCompletedQty, String companyCode);
 }
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java b/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java
index cce67eb..a47fef3 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java
@@ -8,8 +8,11 @@ import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.web.domain.AjaxResult;
+import com.huaheng.mobile.receipt.ReceiptBill;
 import com.huaheng.pc.check.checkHeader.domain.CheckHeader;
 import com.huaheng.pc.check.checkHeader.service.CheckHeaderService;
+import com.huaheng.pc.config.company.domain.Company;
+import com.huaheng.pc.config.company.service.CompanyService;
 import com.huaheng.pc.config.configValue.domain.ConfigValue;
 import com.huaheng.pc.config.configValue.service.ConfigValueService;
 import com.huaheng.pc.config.material.domain.Material;
@@ -32,6 +35,7 @@ import io.swagger.models.auth.In;
 import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.List;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
@@ -62,6 +66,9 @@ public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, R
     private ConfigValueService configValueService;
     @Resource
     private ReceiptDetailMapper receiptDetailMapper;
+    @Resource
+    private CompanyService companyService;
+
 
     /**
      * 新增入库明细
@@ -291,6 +298,7 @@ public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, R
      * 当所有明细表到达该状态时,更新头表状态
      * @param id 头表id
      */
+    @Override
     public void updateReceiptHeaderLastStatus(Integer id){
         LambdaQueryWrapper<ReceiptDetail> lambdaDetails = Wrappers.lambdaQuery();
         lambdaDetails.eq(ReceiptDetail::getReceiptId, id);
@@ -401,4 +409,60 @@ public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, R
         }
         return false;
     }
+
+    /**
+     //     * 移动端收货
+     //     *
+     //     * @param code
+     //     * @return
+     //     */
+    @Override
+    public AjaxResult scanReceiptCode(String code, String type, String companyCode) {
+        LambdaQueryWrapper<ReceiptHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.eq(ReceiptHeader::getReferCode, code)
+                .eq(ReceiptHeader::getReceiptType, type);
+        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaQueryWrapper);
+        if (receiptHeader == null) {
+            LambdaQueryWrapper<Company> companyLambdaQueryWrapper = Wrappers.lambdaQuery();
+            companyLambdaQueryWrapper.eq(Company::getCode,companyCode);
+            Company company = companyService.getOne(companyLambdaQueryWrapper);
+            return AjaxResult.success("");
+        //    return receiptHeaderService.findErpReceipt(String.valueOf(company.getId()), receiptHeader.getReferType(), receiptHeader.getReferCode());
+        } else {
+            LambdaQueryWrapper<ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
+            queryWrapper.eq(ReceiptDetail::getReceiptCode, receiptHeader.getCode());
+            List<ReceiptDetail> receiptDetailList = list(queryWrapper);
+            return AjaxResult.success(receiptDetailList);
+        }
+
+    }
+
+    @Override
+    public List<Integer> insertTodayReceiptDetail(int headerId, List<ReceiptBill> receiptBills, boolean isCompletedQty, String companyCode) {
+        List<Integer> mReceiptDetailIds = new ArrayList<>();
+        ReceiptHeader receiptHeader = receiptHeaderService.getById(headerId);
+
+        for(ReceiptBill receiptBill : receiptBills) {
+            ReceiptDetail receiptDetail = new ReceiptDetail();
+            receiptDetail.setId(null);
+            receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
+            receiptDetail.setCompanyCode(companyCode);
+            receiptDetail.setReceiptId(receiptHeader.getId());
+            receiptDetail.setReceiptCode(receiptHeader.getCode());
+            receiptDetail.setMaterialCode(receiptBill.getMaterialCode());
+            receiptDetail.setInventorySts("good");
+            receiptDetail.setTotalQty(receiptBill.getQty());
+            if(isCompletedQty) {
+                receiptDetail.setOpenQty(receiptBill.getQty());
+            }
+            receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
+            receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
+            receiptDetail.setDeleted(false);
+            receiptDetail.setBatch(receiptBill.getBatch());
+            save(receiptDetail);
+            mReceiptDetailIds.add(receiptDetail.getId());
+        }
+        return mReceiptDetailIds;
+    }
+
 }
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptHeader/mapper/ReceiptHeaderMapper.java b/src/main/java/com/huaheng/pc/receipt/receiptHeader/mapper/ReceiptHeaderMapper.java
index 5de0b59..37280c9 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiptHeader/mapper/ReceiptHeaderMapper.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiptHeader/mapper/ReceiptHeaderMapper.java
@@ -9,4 +9,10 @@ public interface ReceiptHeaderMapper extends BaseMapper<ReceiptHeader> {
 
     List<ReceiptHeader> selectListByCreated();
 
+
+    /**
+     *  获得最新入库单
+     * @return
+     */
+    List<ReceiptHeader> getLatestReceipt(String companyCode);
 }
\ No newline at end of file
diff --git a/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java b/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java
index cfb3e56..31a6ac5 100644
--- a/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java
+++ b/src/main/java/com/huaheng/pc/receipt/receiptHeader/service/ReceiptHeaderService.java
@@ -306,4 +306,10 @@ public class ReceiptHeaderService extends ServiceImpl<ReceiptHeaderMapper, Recei
     public List<ReceiptHeader> selectListByCreated() {
         return receiptHeaderMapper.selectListByCreated();
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    public List<ReceiptHeader> getLatestReceipt(String companyCode) {
+        return receiptHeaderMapper.getLatestReceipt(companyCode);
+    }
+
 }
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/domain/MobileTask.java b/src/main/java/com/huaheng/pc/task/taskHeader/domain/MobileTask.java
new file mode 100644
index 0000000..3d9323f
--- /dev/null
+++ b/src/main/java/com/huaheng/pc/task/taskHeader/domain/MobileTask.java
@@ -0,0 +1,19 @@
+package com.huaheng.pc.task.taskHeader.domain;
+
+import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * @author Enzo Cotter
+ * @date 2020/1/3
+ */
+@Data
+public class MobileTask {
+
+    private TaskHeader taskHeader;
+
+    private List<TaskDetail> taskDetail;
+}
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java
index b25f5b9..5c0f335 100644
--- a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java
+++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderService.java
@@ -2,6 +2,7 @@ package com.huaheng.pc.task.taskHeader.service;
 
 import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetail;
+import com.huaheng.pc.task.taskHeader.domain.MobileTask;
 import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
 import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -42,4 +43,23 @@ public interface TaskHeaderService extends IService<TaskHeader>{
     List<TaskHeader> preferenceRealize (List<TaskHeader> taskHeaderList);
 
     List<TaskHeader>  getTasksStatus(Short lastStatus);
+
+    List<MobileTask> mobileFindTransferTask(String containerCode);
+
+    /**
+     * 容器收货上架
+     * @param containerCode
+     * @return
+     */
+    AjaxResult createQuickTask(String containerCode);
+
+    /**
+     * 根据库位完成任务
+     * @param locationCode
+     * @return
+     * @throws Exception
+     */
+    AjaxResult completeTask(String locationCode) throws Exception;
+
+    AjaxResult createReplenishTask(String containerCode, Short taskStatus);
 }
diff --git a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java
index a051ebe..0aa7b06 100644
--- a/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.huaheng.api.wcs.service.taskAssignService.TaskAssignService;
 import com.huaheng.common.constant.QuantityConstant;
 import com.huaheng.common.exception.service.ServiceException;
+import com.huaheng.common.support.Convert;
 import com.huaheng.common.utils.DataUtils;
 import com.huaheng.common.utils.StringUtils;
 import com.huaheng.common.utils.security.ShiroUtils;
@@ -40,6 +41,7 @@ import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
 import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
 import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
 import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
+import com.huaheng.pc.receipt.receiving.service.ReceivingService;
 import com.huaheng.pc.shipment.shipmentContainerDetail.domain.ShipmentContainerDetail;
 import com.huaheng.pc.shipment.shipmentContainerDetail.service.ShipmentContainerDetailService;
 import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
@@ -50,6 +52,7 @@ import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
 import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
 import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
 import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
+import com.huaheng.pc.task.taskHeader.domain.MobileTask;
 import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
 import org.apache.poi.ss.formula.functions.T;
 import org.jsoup.helper.DataUtil;
@@ -64,6 +67,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.Collectors;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
@@ -121,6 +125,8 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
     private MailService mailService;
     @Resource
     private SendMailService sendMailService;
+    @Resource
+    private ReceivingService receivingService;
 
     /**
      * 盘点任务首选项
@@ -1457,4 +1463,163 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea
         }
 
     }
+
+    /**
+     * 移动端根据容器编码获取盘点任务
+     * @param containerCode 容器编码
+     * @return
+     */
+    @Override
+    public List<MobileTask> mobileFindTransferTask(String containerCode) {
+        /* 查询该容器未完成的盘点任务明细*/
+        LambdaQueryWrapper<TaskDetail> detailLambdaQueryWrapper = Wrappers.lambdaQuery();
+        detailLambdaQueryWrapper.eq(TaskDetail::getContainerCode, containerCode)
+                .eq(TaskDetail::getTaskType, QuantityConstant.TASK_TYPE_CYCLECOUNT)
+                .ne(TaskDetail::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
+        List<TaskDetail> taskDetailList = taskDetailService.list(detailLambdaQueryWrapper);
+
+        /* 获取任务明细中的任务头id*/
+        List<Integer> headerIdList = taskDetailList.stream().map(TaskDetail::getTaskId).collect(Collectors.toList());
+        List<MobileTask> mobileTasks = new ArrayList<>();
+
+        /* 遍历id查询出盘点任务*/
+        for (Integer id : headerIdList) {
+            TaskHeader taskHeader = taskHeaderService.getById(id);
+            MobileTask mobileTask = new MobileTask();
+            mobileTask.setTaskHeader(taskHeader);
+            LambdaQueryWrapper<TaskDetail> queryWrapper = Wrappers.lambdaQuery();
+            queryWrapper.eq(TaskDetail::getTaskId, id)
+                    .eq(TaskDetail::getContainerCode, containerCode);
+            List<TaskDetail> taskDetails = taskDetailService.list(queryWrapper);
+            mobileTask.setTaskDetail(taskDetails);
+            mobileTasks.add(mobileTask);
+        }
+        return mobileTasks;
+    }
+
+    /**
+     * 容器收货上架
+     *
+     * @param containerCode
+     * @return
+     */
+    @Override
+    public AjaxResult createQuickTask(String containerCode) {
+        LambdaQueryWrapper<ReceiptContainerHeader> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ReceiptContainerHeader::getContainerCode, containerCode)
+                .eq(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_BUILD)
+                .eq(ReceiptContainerHeader::getWarehouseCode, ShiroUtils.getWarehouseCode());
+        ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getOne(queryWrapper);
+        if (receiptContainerHeader == null) {
+            throw new ServiceException("该容器没有任务!");
+        }
+
+        LambdaQueryWrapper<ReceiptContainerDetail> containerDetailQueryWrapper = Wrappers.lambdaQuery();
+        containerDetailQueryWrapper.eq(ReceiptContainerDetail::getReceiptContainerId, receiptContainerHeader.getId())
+                .eq(ReceiptContainerDetail::getStatus, QuantityConstant.RECEIPT_CONTAINER_BUILD)
+                .eq(ReceiptContainerDetail::getContainerCode, containerCode);
+        List<ReceiptContainerDetail> containerDetailList = receiptContainerDetailService.list(containerDetailQueryWrapper);
+        if (containerDetailList.isEmpty()) {
+            throw new SecurityException("没有组盘明细,请先组盘");
+        }
+        if (receiptContainerHeader.getStatus().equals(QuantityConstant.RECEIPT_HEADER_BUILD)) {
+            String ids = String.valueOf(receiptContainerHeader.getId());
+            if (StringUtils.isEmpty(ids)){
+                return AjaxResult.error("id不能为空");
+            }
+            List<Integer> idList = Arrays.asList(Convert.toIntArray(ids));
+            for (int i = 0; i<idList.size(); i++){
+                LambdaQueryWrapper<ReceiptContainerDetail> lambda = Wrappers.lambdaQuery();
+                lambda.eq(ReceiptContainerDetail::getReceiptContainerId, idList.get(i));
+                List<ReceiptContainerDetail> receiptContainerDetails = receiptContainerDetailService.list(lambda);
+                for (ReceiptContainerDetail receiptContainerDetail : receiptContainerDetails){
+                    receivingService.position(receiptContainerDetail);
+                }
+
+            }
+            if (StringUtils.isEmpty(ids)){
+                return AjaxResult.error("id不能为空");
+            }
+            for (int i = 0; i<idList.size(); i++){
+                LambdaQueryWrapper<ReceiptContainerDetail> lambda = Wrappers.lambdaQuery();
+                lambda.eq(ReceiptContainerDetail::getReceiptContainerId, idList.get(i));
+                List<ReceiptContainerDetail> receiptContainerDetails = receiptContainerDetailService.list(lambda);
+                for (ReceiptContainerDetail receiptContainerDetail : receiptContainerDetails){
+                    receivingService.position(receiptContainerDetail);
+                }
+
+            }
+
+            Integer maxId = idList.stream().max(Comparator.comparing(Integer::intValue)).orElse(null);
+
+            LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
+            lambda.select(ReceiptContainerHeader::getId)
+                    .lt(ReceiptContainerHeader::getStatus, 10)
+                    .le(ReceiptContainerHeader::getId, maxId);
+            return taskHeaderService.createReceiptTask(idList);
+        }
+        return null;
+    }
+
+    /**
+     * 根据库位完成任务
+     *
+     * @param locationCode
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public AjaxResult completeTask(String locationCode) throws Exception {
+        LambdaQueryWrapper<TaskHeader> taskQueryWrapper = Wrappers.lambdaQuery();
+        taskQueryWrapper.eq(TaskHeader::getToLocation, locationCode);
+        List<TaskHeader> list = this.list(taskQueryWrapper);
+        if (list.size() < 1) {
+            throw new ServiceException("库位(" + locationCode + ")没有任务!");
+        } else if(list.get(0).getStatus() == 100) {
+            //如果已完成则不管
+            throw new ServiceException("库位(" + locationCode + ")任务已经完成!");
+        }
+        if(list.get(0).getTaskType()==100 || list.get(0).getTaskType()==200){
+            //入库任务
+            return  completeReceiptTask((list.get(0)));
+        } else {
+            throw new ServiceException("库位(" + locationCode + ")的任务不是上架,不能完成!");
+        }
+    }
+
+    @Override
+    public AjaxResult createReplenishTask(String containerCode, Short taskStatus) {
+        LambdaQueryWrapper<ReceiptContainerHeader> headerQueryWrapper = Wrappers.lambdaQuery();
+        headerQueryWrapper.eq(ReceiptContainerHeader::getContainerCode, containerCode)
+                .eq(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_BUILD);
+
+        List<ReceiptContainerHeader> receiptContainerHeaderList = receiptContainerHeaderService.list(headerQueryWrapper);
+        if (receiptContainerHeaderList.isEmpty()) {
+            throw new ServiceException("该容器没有任务!");
+        }
+        if (receiptContainerHeaderList.size() > 1){
+            throw new ServiceException("该容器存在多条任务");
+        }
+        if (receiptContainerHeaderList.get(0).getWarehouseCode() != ShiroUtils.getWarehouseCode()) {
+            throw new ServiceException("容器不在当前仓库!");
+        }
+        LambdaQueryWrapper<ReceiptContainerDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.eq(ReceiptContainerDetail::getReceiptContainerId, receiptContainerHeaderList.get(0).getId());
+        List<ReceiptContainerDetail> containerDetailList = receiptContainerDetailService.list(lambdaQueryWrapper);
+        ReceiptContainerHeader containerHeader = receiptContainerHeaderList.get(0);
+        if (containerDetailList.isEmpty()){
+            throw new ServiceException("没有组盘明细,请先组盘!");
+        }
+        if (containerHeader.getStatus().equals(QuantityConstant.TASK_STATUS_BUILD)) {
+            if (containerHeader.getStatus().intValue() != taskStatus.intValue()) {
+                containerHeader.setStatus(taskStatus);
+                receiptContainerHeaderService.updateById(containerHeader);
+            }
+        }
+        List<Integer> ids = new ArrayList<>();
+        ids.add(containerHeader.getId());
+        createReceiptTask(ids);
+        return null;
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 7b9ead6..4c68be9 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -66,4 +66,4 @@ logging:
 server:
   port: 8888
   servlet:
-    context-path: /twms/
\ No newline at end of file
+    context-path: /wms/
\ No newline at end of file
diff --git a/src/main/resources/application-prd.yml b/src/main/resources/application-prd.yml
new file mode 100644
index 0000000..b58492e
--- /dev/null
+++ b/src/main/resources/application-prd.yml
@@ -0,0 +1,69 @@
+# 数据源配置
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 主库
+      master:
+        url: jdbc:mysql://localhost:3306/xinyi_wms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true
+        username: root
+        password: 123456
+      # 从库
+      slave:
+        # 从库不启用
+        enabled: false
+        url:
+        username:
+        password:
+      # 初始连接数
+      initialSize: 5
+      # 最小连接池数量
+      minIdle: 10
+      # 最大连接池数量
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 5000
+      # \配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 30000
+      #配置一个连接在池中最大生存的时间,单位是毫秒
+      maxEvictableIdleTimeMillis: 300000
+      # 配置检测连接是否有效
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 设置白名单,不填则允许所有访问
+        allow:
+        url-pattern: /druid/*
+        # 控制台管理用户名和密码
+        login-username:
+        login-password:
+      filter:
+        stat:
+          enabled: true
+          # 慢SQL记录
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+
+#日志配置
+logging:
+  level:
+    com.huaheng: debug
+    org.springframework: warn
+    spring.springboot.dao: DEBUG
+
+server:
+  port: 8888
+  servlet:
+    context-path: /twms/
\ No newline at end of file
diff --git a/src/main/resources/mybatis/config/LocationMapper.xml b/src/main/resources/mybatis/config/LocationMapper.xml
index 6c8e3e4..95853e3 100644
--- a/src/main/resources/mybatis/config/LocationMapper.xml
+++ b/src/main/resources/mybatis/config/LocationMapper.xml
@@ -94,4 +94,9 @@
       LEFT JOIN
       (SELECT count(1) num2,warehouseCode FROM location WHERE containerCode ='' GROUP BY warehouseCode) b on b.warehouseCode=w.code
     </select>
+
+  <select id="pickLocation" resultType="com.huaheng.pc.config.location.domain.Location">
+        select * from location
+        where containerCode != '' and status = "empty"
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mybatis/config/MaterialMapper.xml b/src/main/resources/mybatis/config/MaterialMapper.xml
index e1c0f5c..e66462c 100644
--- a/src/main/resources/mybatis/config/MaterialMapper.xml
+++ b/src/main/resources/mybatis/config/MaterialMapper.xml
@@ -53,4 +53,9 @@
     <select id="findAllByCode" resultMap="BaseResultMap" parameterType="java.lang.String">
       select * from material where code = #{code,jdbcType=VARCHAR}
     </select>
+
+
+  <select id="findLatest" resultMap="BaseResultMap" parameterType="java.lang.String">
+       select * from material order by id desc  limit 10
+   </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mybatis/download/DownloadMapper.xml b/src/main/resources/mybatis/download/DownloadMapper.xml
new file mode 100644
index 0000000..ef42a58
--- /dev/null
+++ b/src/main/resources/mybatis/download/DownloadMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huaheng.pc.common.mapper.ApkMapper">
+
+    <insert id="insertApkInfo" parameterType="com.huaheng.mobile.download.ApkInfo">
+        insert into apkinfo(pkgName, versionCode, versionName, url, md5) values(#{pkgName},#{versionCode},#{versionName},#{url},#{md5})
+    </insert>
+
+    <update id="clearApkInfo">
+        delete from apkinfo
+    </update>
+
+    <select id="getApkInfoByPkgName" resultType="com.huaheng.mobile.download.ApkInfo">
+        select * from apkinfo where pkgName=#{pkgName}
+    </select>
+
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mybatis/receipt/ReceiptHeaderMapper.xml b/src/main/resources/mybatis/receipt/ReceiptHeaderMapper.xml
index cce1f97..5b3c928 100644
--- a/src/main/resources/mybatis/receipt/ReceiptHeaderMapper.xml
+++ b/src/main/resources/mybatis/receipt/ReceiptHeaderMapper.xml
@@ -59,4 +59,8 @@
       inner join task_detail t on t.billCode=r.code and
       t.status>700 and DATEDIFF(NOW(), t.lastUpdated)=0 GROUP BY r.code
     </select>
+
+  <select id="getLatestReceipt" resultType="com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader">
+     select * from receipt_header where companyCode = #{companyCode,jdbcType=VARCHAR} order by id desc  limit 10
+  </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/config/container/container.html b/src/main/resources/templates/config/container/container.html
index 79958b5..591a74a 100644
--- a/src/main/resources/templates/config/container/container.html
+++ b/src/main/resources/templates/config/container/container.html
@@ -56,8 +56,8 @@
 				<i class="fa fa-plus"></i> 打印
 			</a>
 		</div>
+		</div>
 
-			
 		<div class="col-sm-12 select-info">
 			<table id="bootstrap-table" data-mobile-responsive="true" class="table table-bordered table-hover"></table>
 		</div>
@@ -199,7 +199,6 @@
             };
             $.table.init(options);
         });
-
 		function print() {
 			var rows=$("#bootstrap-table").bootstrapTable('getSelections');
 			if (rows.length == 0) {
diff --git a/src/main/resources/templates/inventory/cycleCountHeader/add.html b/src/main/resources/templates/inventory/cycleCountHeader/add.html
index 64405b3..826cb4c 100644
--- a/src/main/resources/templates/inventory/cycleCountHeader/add.html
+++ b/src/main/resources/templates/inventory/cycleCountHeader/add.html
@@ -34,7 +34,7 @@
                 <label class="col-sm-3 control-label">货主:</label>
                 <div class="col-sm-8">
                     <select id = "companyCode" name="companyCode" class="form-control" th:with="list=${@companyService.selectCompanyByCurrentUserId()}">
-                        <option  th:each="item : ${list}" th:text="${item['name']}" th:value="${item['id']}"  th:attr = " code = ${item['code']}"></option>
+                        <option  th:each="item : ${list}" th:text="${item['name']}" th:value="${item['code']}"  th:attr = " code = ${item['code']}"></option>
                     </select>
                 </div>
             </div>
diff --git a/src/main/resources/templates/inventory/inventoryHeader/emptyCheckOut.html b/src/main/resources/templates/inventory/inventoryHeader/emptyCheckOut.html
index b6c3d1a..3c89464 100644
--- a/src/main/resources/templates/inventory/inventoryHeader/emptyCheckOut.html
+++ b/src/main/resources/templates/inventory/inventoryHeader/emptyCheckOut.html
@@ -39,7 +39,7 @@
             },
         },
         submitHandler: function(form) {
-            $.operate.save(prefix + "/emptyCheckOut", $('#form-task-emptyInOut').serialize());
+            $.operate.save(prefix + "/emptyCheckOut", $('#form-task-emptyCheckOut').serialize());
         }
     });
 
diff --git a/src/main/resources/templates/shipment/shipmentHeader/report.html b/src/main/resources/templates/shipment/shipmentHeader/report.html
index b3949eb..8951061 100644
--- a/src/main/resources/templates/shipment/shipmentHeader/report.html
+++ b/src/main/resources/templates/shipment/shipmentHeader/report.html
@@ -5,7 +5,9 @@
 <body class="white-bg" style="padding:5px 0;" id="ddd">
 <div class="container" style="color: #333;">
     <div class="row">
-        <table id="reportTable" width="100%" border="0" cellspacing="0" cellpadding="0" class="dy-report">
+        <h3 align="center">发货单</h3>
+        <span>发货单号:</span><span th:text="${shipmentHeader['totalLines']}"></span>
+        <table id="reportTable" width="100%" border="1" cellspacing="0" cellpadding="0" class="dy-report">
             <thead style="display:table-header-group;">
             <tr>
                 <td colspan="7">
@@ -25,14 +27,14 @@
                 </td>
             </tr>
             <tr>
-                <th width="18%">存货编码</th>
-                <th width="22%">物料名称</th>
-                <th width="15%">物料规格</th>
-                <th width="5%">批次</th>
-                <th width="5%">批号</th>
-                <th width="5%">项目号</th>
-                <th width="9%">数量</th>
-                <th width="21%">条码</th>
+                <th>序号</th>
+                <th >仓库名称</th>
+                <th >存货编码</th>
+                <th>存货代码</th>
+                <th>存货名称</th>
+                <th>规格型号</th>
+                <th>单位</th>
+                <th>备注</th>
             </tr>
             </thead>
             <tbody>
@@ -44,7 +46,6 @@
                 <td th:text="${row.lot}"></td>
                 <td th:text="${row.projectNo}"></td>
                 <td th:text="${row.shipQty}"></td>
-                <td><img></img></td>
             </tr>
             </tbody>
         </table>
diff --git a/src/main/resources/templates/shipment/shipmentHeader/report1.html b/src/main/resources/templates/shipment/shipmentHeader/report1.html
new file mode 100644
index 0000000..b3949eb
--- /dev/null
+++ b/src/main/resources/templates/shipment/shipmentHeader/report1.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<meta charset="utf-8">
+<head th:include="include :: header"></head>
+<body class="white-bg" style="padding:5px 0;" id="ddd">
+<div class="container" style="color: #333;">
+    <div class="row">
+        <table id="reportTable" width="100%" border="0" cellspacing="0" cellpadding="0" class="dy-report">
+            <thead style="display:table-header-group;">
+            <tr>
+                <td colspan="7">
+                    <span style="padding-top:40px;width: 40%; float:left;" th:text="${#dates.format(shipmentHeader.created,'yyyy-MM-dd HH:mm:ss')}"></span>
+                    <h2 style="width:20%;text-align:center;float:left;padding-top:10px;">出库单</h2>
+                    <span style="padding-top:20px;width:38%;float:right; text-align: right"><img id="shipmentCode" th:data="${shipmentHeader['code']}"></img></span>
+                </td>
+            </tr>
+            <tr style="padding:15px 0 5px 0;border-bottom:1px solid #606060">
+                <td colspan="7">
+                    <div style="width:40%; float:left;">客户名称:<span th:text="${shipmentHeader['customerName']}"></span></div>
+                    <div style="width:50%; float:right; text-align:right">
+                        <span>明细条数:<span th:text="${shipmentHeader['totalLines']}"></span></span>
+                        <span style="padding-left:20px;">明细总数:<span th:text="${shipmentHeader['totalQty']}"></span></span>
+                        <span class="noprint" style="padding-left:20px;"><button type="button" onClick="a()"><i class="fa fa-print"></i> 打印</button></span>
+                    </div>
+                </td>
+            </tr>
+            <tr>
+                <th width="18%">存货编码</th>
+                <th width="22%">物料名称</th>
+                <th width="15%">物料规格</th>
+                <th width="5%">批次</th>
+                <th width="5%">批号</th>
+                <th width="5%">项目号</th>
+                <th width="9%">数量</th>
+                <th width="21%">条码</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr th:each="row,rowStat : ${details}">
+                <td th:text="${row.materialCode}"></td>
+                <td th:text="${row.materialName}"></td>
+                <td th:text="${row.materialSpec}"></td>
+                <td th:text="${row.batch}"></td>
+                <td th:text="${row.lot}"></td>
+                <td th:text="${row.projectNo}"></td>
+                <td th:text="${row.shipQty}"></td>
+                <td><img></img></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+<div th:include="include :: footer"></div>
+<script type="text/javascript" src="../../../js/barcode/JsBarcode.all.js"></script>
+<script th:inline="javascript">
+
+    var  barcodeStyle = {
+        format: "CODE128",//选择要使用的条形码类型
+        width:1,//设置条之间的宽度
+        height:40,//高度
+        displayValue:true,//是否在条形码下方显示文字
+        // text:"456",//覆盖显示的文本
+        // fontOptions:"bold italic",//使文字加粗体或变斜体
+        font:"monospace",//设置文本的字体fantasy
+        textAlign:"center",//设置文本的水平对齐方式
+        textPosition:"bottom",//设置文本的垂直位置
+        textMargin:1,//设置条形码和文本之间的间距
+        fontSize:12,//设置文本的大小
+        background:"#ffffff",//设置条形码的背景
+        lineColor:"#000000",//设置条和文本的颜色。
+        margin:1//设置条形码周围的空白边距
+    };
+
+    $("#shipmentCode").JsBarcode($("#shipmentCode").attr("data"), barcodeStyle);
+
+    // for (var i=0; i<$('#reportTable tbody tr').length; i++){
+    //     var barcodeText = $("#reportTable tbody tr:eq("+ i +") td:eq(0)").innerText;
+    //     $("#reportTable tbody tr:eq("+ i +") td:eq(6) canvas").JsBarcode("6666", barcodeStyle);
+    // }
+
+    $('#reportTable tbody tr').each(function(i) {
+        var barcodeText = $(this).children()[0].innerText;
+        JsBarcode($(this).children()[6].querySelector("img"), barcodeText, barcodeStyle);
+    });
+
+
+</script>
+<style type="text/css">
+    @media print {
+        .noprint{display:none;}
+    }
+</style>
+<script type="text/javascript" src="../../../js/jquery-1.4.4.min.js"></script>
+<script type="text/javascript" src="../../../js/jquery.jqprint-0.3.js"></script>
+<script type="text/javascript">
+    function a(){
+        $("#ddd").jqprint();
+    }
+</script>
+</body>
+</html>
\ No newline at end of file