unknown hace 1 mes
commit
343771ca81
Se han modificado 100 ficheros con 8466 adiciones y 0 borrados
  1. 47 0
      .gitignore
  2. 20 0
      LICENSE
  3. 109 0
      README.md
  4. 12 0
      bin/clean.bat
  5. 12 0
      bin/package.bat
  6. 14 0
      bin/run.bat
  7. 284 0
      pom.xml
  8. 121 0
      ruoyi-admin/pom.xml
  9. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  10. 18 0
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
  11. 55 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/controller/ArapDeductController.java
  12. 81 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/controller/ArapOffsetController.java
  13. 86 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/controller/ArapRecvController.java
  14. 86 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/controller/ArapRefundController.java
  15. 92 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/ArapOffset.java
  16. 74 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/ArapOffsetItem.java
  17. 138 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/ArapRecv.java
  18. 138 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/ArapRefund.java
  19. 92 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/vo/ArapDeductItemVo.java
  20. 48 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/vo/ArapOpenPayVo.java
  21. 51 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/vo/ArapOrderOpenVo.java
  22. 16 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/mapper/ArapDeductMapper.java
  23. 41 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/mapper/ArapOffsetMapper.java
  24. 21 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/mapper/ArapRecvMapper.java
  25. 21 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/mapper/ArapRefundMapper.java
  26. 15 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/IArapDeductService.java
  27. 22 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/IArapOffsetService.java
  28. 19 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/IArapRecvService.java
  29. 19 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/IArapRefundService.java
  30. 55 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/impl/ArapDeductServiceImpl.java
  31. 186 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/impl/ArapOffsetServiceImpl.java
  32. 121 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/impl/ArapRecvServiceImpl.java
  33. 121 0
      ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/impl/ArapRefundServiceImpl.java
  34. 91 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseAutoLevelController.java
  35. 90 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseBrandController.java
  36. 90 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseBreedController.java
  37. 88 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseCoatColorController.java
  38. 88 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseCustomerChannelController.java
  39. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseDepartmentController.java
  40. 95 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseEmployeeController.java
  41. 91 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseFaristAccountController.java
  42. 89 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseLevelController.java
  43. 111 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseLineController.java
  44. 90 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseMarketController.java
  45. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseMaterialController.java
  46. 90 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BasePriceTypeController.java
  47. 186 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseProductCategoryController.java
  48. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseProductTypeController.java
  49. 90 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseSalesTerritoryController.java
  50. 92 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseSubAccountController.java
  51. 89 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseSupplySourceController.java
  52. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseUnitController.java
  53. 90 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseVarietyController.java
  54. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/MaterialBacthController.java
  55. 91 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureApportionController.java
  56. 152 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureQuotationController.java
  57. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureQuotationGoodsController.java
  58. 193 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureReceivingController.java
  59. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureReceivingGoodsController.java
  60. 119 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureSettlementController.java
  61. 91 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureSettlementGoodsController.java
  62. 92 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureSupplierController.java
  63. 87 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionBatchProcessingTypeController.java
  64. 142 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionCompletionReportController.java
  65. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionCompletionReportGoodsController.java
  66. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionInstockController.java
  67. 20 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionInstockGoodsController.java
  68. 105 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionMaterialMappingController.java
  69. 174 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionPlanController.java
  70. 99 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionPlanGoodsController.java
  71. 107 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionPlantController.java
  72. 123 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionProductController.java
  73. 110 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionRecordController.java
  74. 257 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionRegularController.java
  75. 99 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionRegularGradingController.java
  76. 85 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionSegmentedProductController.java
  77. 194 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionShipmentNotificationController.java
  78. 135 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionSlaughterController.java
  79. 158 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionSlaughterGoodsController.java
  80. 229 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripAllocationController.java
  81. 85 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripBatchController.java
  82. 117 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripPreCoolingController.java
  83. 117 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripRefinedController.java
  84. 99 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripRegularController.java
  85. 134 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripRequisitionController.java
  86. 50 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseAutoLevel.java
  87. 39 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseBrand.java
  88. 35 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseBreed.java
  89. 42 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseCoatColor.java
  90. 38 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseCustomerChannel.java
  91. 40 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseDepartment.java
  92. 119 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseEmployee.java
  93. 34 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseFaristAccount.java
  94. 41 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseLevel.java
  95. 77 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseLine.java
  96. 62 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseMarket.java
  97. 93 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseMaterial.java
  98. 51 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BasePriceType.java
  99. 44 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseProductCategory.java
  100. 0 0
      ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseProductType.java

+ 47 - 0
.gitignore

@@ -0,0 +1,47 @@
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### JRebel ###
+rebel.xml
+
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.xml.versionsBackup
+*.swp
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml

+ 20 - 0
LICENSE

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

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 109 - 0
README.md


+ 12 - 0
bin/clean.bat

@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [信息] 清理工程target生成路径。
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+call mvn clean
+
+pause

+ 12 - 0
bin/package.bat

@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [信息] 打包Web工程,生成war/jar包文件。
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+call mvn clean package -Dmaven.test.skip=true
+
+pause

+ 14 - 0
bin/run.bat

@@ -0,0 +1,14 @@
+@echo off
+echo.
+echo [信息] 使用Jar命令运行Web工程。
+echo.
+
+cd %~dp0
+cd ../ruoyi-admin/target
+
+set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
+
+java -jar %JAVA_OPTS% ruoyi-admin.jar
+
+cd bin
+pause

+ 284 - 0
pom.xml

@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	
+    <groupId>com.ruoyi</groupId>
+    <artifactId>ruoyi</artifactId>
+    <version>3.9.1</version>
+
+    <name>ruoyi</name>
+    <url>http://www.ruoyi.vip</url>
+    <description>若依管理系统</description>
+    
+    <properties>
+        <ruoyi.version>3.9.1</ruoyi.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
+        <spring-boot.version>2.5.15</spring-boot.version>
+        <druid.version>1.2.27</druid.version>
+        <bitwalker.version>1.21</bitwalker.version>
+        <yauaa.version>7.32.0</yauaa.version>
+        <swagger.version>3.0.0</swagger.version>
+        <kaptcha.version>2.3.3</kaptcha.version>
+        <pagehelper.boot.version>1.4.7</pagehelper.boot.version>
+        <fastjson.version>2.0.60</fastjson.version>
+        <oshi.version>6.9.1</oshi.version>
+        <commons.io.version>2.21.0</commons.io.version>
+        <poi.version>4.1.2</poi.version>
+        <velocity.version>2.3</velocity.version>
+        <jwt.version>0.9.1</jwt.version>
+        <!-- override dependency version -->
+        <tomcat.version>9.0.112</tomcat.version>
+        <logback.version>1.2.13</logback.version>
+        <spring-security.version>5.7.14</spring-security.version>
+        <spring-framework.version>5.3.39</spring-framework.version>
+
+    </properties>
+
+    <!-- 依赖声明 -->
+    <dependencyManagement>
+        <dependencies>
+
+            <!-- 覆盖SpringFramework的依赖配置-->
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-framework-bom</artifactId>
+                <version>${spring-framework.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+
+            <!-- 覆盖SpringSecurity的依赖配置-->
+            <dependency>
+                <groupId>org.springframework.security</groupId>
+                <artifactId>spring-security-bom</artifactId>
+                <version>${spring-security.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- SpringBoot的依赖配置-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- 覆盖logback的依赖配置-->
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-core</artifactId>
+                <version>${logback.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>ch.qos.logback</groupId>
+                <artifactId>logback-classic</artifactId>
+                <version>${logback.version}</version>
+            </dependency>
+
+            <!-- 覆盖tomcat的依赖配置-->
+            <dependency>
+                <groupId>org.apache.tomcat.embed</groupId>
+                <artifactId>tomcat-embed-core</artifactId>
+                <version>${tomcat.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.tomcat.embed</groupId>
+                <artifactId>tomcat-embed-el</artifactId>
+                <version>${tomcat.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.tomcat.embed</groupId>
+                <artifactId>tomcat-embed-websocket</artifactId>
+                <version>${tomcat.version}</version>
+            </dependency>
+
+            <!-- 阿里数据库连接池 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+
+            <!-- 解析客户端操作系统、浏览器等 -->
+            <dependency>
+                <groupId>nl.basjes.parse.useragent</groupId>
+                <artifactId>yauaa</artifactId>
+                <version>${yauaa.version}</version>
+            </dependency>
+
+            <!-- 解析客户端操作系统、浏览器等 -->
+            <dependency>
+                <groupId>eu.bitwalker</groupId>
+                <artifactId>UserAgentUtils</artifactId>
+                <version>${bitwalker.version}</version>
+            </dependency>
+
+            <!-- pagehelper 分页插件 -->
+            <dependency>
+                <groupId>com.github.pagehelper</groupId>
+                <artifactId>pagehelper-spring-boot-starter</artifactId>
+                <version>${pagehelper.boot.version}</version>
+            </dependency>
+
+            <!-- 获取系统信息 -->
+            <dependency>
+                <groupId>com.github.oshi</groupId>
+                <artifactId>oshi-core</artifactId>
+                <version>${oshi.version}</version>
+            </dependency>
+
+            <!-- Swagger3依赖 -->
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-boot-starter</artifactId>
+                <version>${swagger.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>io.swagger</groupId>
+                        <artifactId>swagger-models</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+
+            <!-- io常用工具类 -->
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>${commons.io.version}</version>
+            </dependency>
+
+            <!-- excel工具 -->
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+
+            <!-- velocity代码生成使用模板 -->
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity-engine-core</artifactId>
+                <version>${velocity.version}</version>
+            </dependency>
+
+            <!-- 阿里JSON解析器 -->
+            <dependency>
+                <groupId>com.alibaba.fastjson2</groupId>
+                <artifactId>fastjson2</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+
+            <!-- Token生成与解析-->
+            <dependency>
+                <groupId>io.jsonwebtoken</groupId>
+                <artifactId>jjwt</artifactId>
+                <version>${jwt.version}</version>
+            </dependency>
+
+            <!-- 验证码 -->
+            <dependency>
+                <groupId>pro.fessional</groupId>
+                <artifactId>kaptcha</artifactId>
+                <version>${kaptcha.version}</version>
+            </dependency>
+
+            <!-- 定时任务-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-quartz</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!-- 代码生成-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-generator</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!-- 核心模块-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-framework</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!-- 系统模块-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-system</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!-- 通用工具-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-common</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+    <modules>
+        <module>ruoyi-admin</module>
+        <module>ruoyi-framework</module>
+        <module>ruoyi-system</module>
+        <module>ruoyi-quartz</module>
+        <module>ruoyi-generator</module>
+        <module>ruoyi-common</module>
+    </modules>
+    <packaging>pom</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>

+ 121 - 0
ruoyi-admin/pom.xml

@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.9.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
+    <artifactId>ruoyi-admin</artifactId>
+
+    <description>
+        web服务入口
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- spring-boot-devtools -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional> <!-- 表示依赖不会传递 -->
+        </dependency>
+
+        <!-- swagger3-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+        </dependency>
+
+        <!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-models</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+
+         <!-- Mysql驱动包 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
+        <!-- 定时任务-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-quartz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.26</version>
+        </dependency>
+
+        <!-- 代码生成-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-generator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.jcraft</groupId>
+            <artifactId>jsch</artifactId>
+            <version>0.1.54</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.12.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.5.15</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>   
+                <groupId>org.apache.maven.plugins</groupId>   
+                <artifactId>maven-war-plugin</artifactId>   
+                <version>3.1.0</version>   
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>   
+           </plugin>   
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -0,0 +1,20 @@
+package com.ruoyi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+/**
+ * 启动程序
+ * 
+ * @author ruoyi
+ */
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
+public class RuoYiApplication
+{
+    public static void main(String[] args)
+    {
+        // System.setProperty("spring.devtools.restart.enabled", "false");
+        SpringApplication.run(RuoYiApplication.class, args);
+    }
+}

+ 18 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java

@@ -0,0 +1,18 @@
+package com.ruoyi;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ * 
+ * @author ruoyi
+ */
+public class RuoYiServletInitializer extends SpringBootServletInitializer
+{
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
+    {
+        return application.sources(RuoYiApplication.class);
+    }
+}

+ 55 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/controller/ArapDeductController.java

@@ -0,0 +1,55 @@
+package com.ruoyi.web.arap.controller;
+
+import com.ruoyi.web.arap.domain.vo.ArapDeductItemVo;
+import com.ruoyi.web.arap.service.IArapDeductService;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.stock.service.IRoleOrgService;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/erp/arap/deduct")
+public class ArapDeductController extends BaseController {
+
+    @Autowired
+    private IArapDeductService arapDeductService;
+
+    @Autowired
+    private IRoleOrgService roleOrgService;
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:deduct:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(@RequestParam(value = "bizDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date bizDate) {
+        startPage();
+        List<ArapDeductItemVo> list = arapDeductService.listByDate(currentOrgId(), bizDate);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:deduct:run')")
+    @Log(title = "应收单扣款作业", businessType = BusinessType.UPDATE)
+    @PostMapping("/batchDeduct")
+    public AjaxResult batchDeduct(@RequestBody List<ArapDeductItemVo> rows) {
+        return toAjax(arapDeductService.batchDeduct(currentOrgId(), getUsername(), rows));
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:deduct:reverse')")
+    @Log(title = "应收单扣款作业", businessType = BusinessType.UPDATE)
+    @PostMapping("/batchUndeduct")
+    public AjaxResult batchUndeduct(@RequestBody List<ArapDeductItemVo> rows) {
+        return toAjax(arapDeductService.batchUndeduct(currentOrgId(), getUsername(), rows));
+    }
+
+    private String currentOrgId() {
+        return roleOrgService.resolveOrgId(getUserId(), getDeptId());
+    }
+}
+

+ 81 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/controller/ArapOffsetController.java

@@ -0,0 +1,81 @@
+package com.ruoyi.web.arap.controller;
+
+import com.ruoyi.web.arap.domain.ArapOffset;
+import com.ruoyi.web.arap.domain.vo.ArapOpenPayVo;
+import com.ruoyi.web.arap.service.IArapOffsetService;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.stock.service.IRoleOrgService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/erp/arap/offset")
+public class ArapOffsetController extends BaseController {
+
+    @Autowired
+    private IArapOffsetService arapOffsetService;
+    @Autowired
+    private IRoleOrgService roleOrgService;
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:offset:list')")
+    @GetMapping("/openPay/list")
+    public TableDataInfo openPayList(ArapOffset query) {
+        query.setOrgId(currentOrgId());
+        startPage();
+        List<ArapOpenPayVo> list = arapOffsetService.listOpenPay(query);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:offset:list')")
+    @GetMapping("/order/list")
+    public AjaxResult orderList(@RequestParam("custNo") String custNo,
+                                @RequestParam(value = "startDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
+                                @RequestParam(value = "endDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
+                                @RequestParam(value = "remark", required = false) String remark) {
+        return success(arapOffsetService.listOrderOpen(currentOrgId(), custNo, startDate, endDate, remark));
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:offset:save')")
+    @Log(title = "冲销作业", businessType = BusinessType.INSERT)
+    @PostMapping("/save")
+    public AjaxResult save(@RequestBody ArapOffset form) {
+        return toAjax(arapOffsetService.saveOffset(form, currentOrgId(), getUsername()));
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:offset:list')")
+    @GetMapping("/record/list")
+    public TableDataInfo recordList(ArapOffset query) {
+        query.setOrgId(currentOrgId());
+        startPage();
+        return getDataTable(arapOffsetService.listOffset(query));
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:offset:list')")
+    @GetMapping("/{id}")
+    public AjaxResult detail(@PathVariable("id") Long id) {
+        ArapOffset data = arapOffsetService.getOffset(id, currentOrgId());
+        if (data == null) return error("记录不存在");
+        return success(data);
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:offset:reverse')")
+    @Log(title = "反冲销作业", businessType = BusinessType.UPDATE)
+    @PostMapping("/reverse")
+    public AjaxResult reverse(@RequestBody ArapOffset form) {
+        return toAjax(arapOffsetService.reverseOffset(form, currentOrgId(), getUsername()));
+    }
+
+    private String currentOrgId() {
+        return roleOrgService.resolveOrgId(getUserId(), getDeptId());
+    }
+}
+

+ 86 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/controller/ArapRecvController.java

@@ -0,0 +1,86 @@
+package com.ruoyi.web.arap.controller;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.text.Convert;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.arap.domain.ArapRecv;
+import com.ruoyi.web.arap.service.IArapRecvService;
+import com.ruoyi.web.stock.service.IRoleOrgService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/erp/arap/recv")
+public class ArapRecvController extends BaseController {
+
+    @Autowired
+    private IArapRecvService arapRecvService;
+
+    @Autowired
+    private IRoleOrgService roleOrgService;
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:recv:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ArapRecv query) {
+        query.setOrgId(currentOrgId());
+        startPage();
+        List<ArapRecv> list = arapRecvService.selectList(query);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:recv:query')")
+    @GetMapping("/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        ArapRecv entity = arapRecvService.selectById(id);
+        if (entity == null || !currentOrgId().equals(entity.getOrgId())) {
+            return error("无权访问该数据");
+        }
+        return success(entity);
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:recv:add')")
+    @Log(title = "收款登记", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ArapRecv entity) {
+        entity.setOrgId(currentOrgId());
+        return toAjax(arapRecvService.add(entity, getUsername()));
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:recv:edit')")
+    @Log(title = "收款登记", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ArapRecv entity) {
+        ArapRecv old = arapRecvService.selectById(entity.getId());
+        if (old == null || !currentOrgId().equals(old.getOrgId())) {
+            return error("无权修改该数据");
+        }
+        entity.setOrgId(currentOrgId());
+        return toAjax(arapRecvService.edit(entity, getUsername()));
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:recv:remove')")
+    @Log(title = "收款登记", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable("ids") String ids) {
+        int rows = 0;
+        for (Long id : Convert.toLongArray(ids)) {
+            ArapRecv old = arapRecvService.selectById(id);
+            if (old == null || !currentOrgId().equals(old.getOrgId())) {
+                continue;
+            }
+            rows += arapRecvService.removeById(id, old.getOrgId(), getUsername());
+        }
+        return toAjax(rows);
+    }
+
+    private String currentOrgId() {
+        return roleOrgService.resolveOrgId(getUserId(), getDeptId());
+    }
+}
+

+ 86 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/controller/ArapRefundController.java

@@ -0,0 +1,86 @@
+package com.ruoyi.web.arap.controller;
+
+import com.ruoyi.web.arap.domain.ArapRefund;
+import com.ruoyi.web.arap.service.IArapRefundService;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.text.Convert;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.stock.service.IRoleOrgService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/erp/arap/refund")
+public class ArapRefundController extends BaseController {
+
+    @Autowired
+    private IArapRefundService arapRefundService;
+
+    @Autowired
+    private IRoleOrgService roleOrgService;
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:refund:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ArapRefund query) {
+        query.setOrgId(currentOrgId());
+        startPage();
+        List<ArapRefund> list = arapRefundService.selectList(query);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:refund:query')")
+    @GetMapping("/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        ArapRefund entity = arapRefundService.selectById(id);
+        if (entity == null || !currentOrgId().equals(entity.getOrgId())) {
+            return error("无权访问该数据");
+        }
+        return success(entity);
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:refund:add')")
+    @Log(title = "客户退款登记", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ArapRefund entity) {
+        entity.setOrgId(currentOrgId());
+        return toAjax(arapRefundService.add(entity, getUsername()));
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:refund:edit')")
+    @Log(title = "客户退款登记", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ArapRefund entity) {
+        ArapRefund old = arapRefundService.selectById(entity.getId());
+        if (old == null || !currentOrgId().equals(old.getOrgId())) {
+            return error("无权修改该数据");
+        }
+        entity.setOrgId(currentOrgId());
+        return toAjax(arapRefundService.edit(entity, getUsername()));
+    }
+
+    @PreAuthorize("@ss.hasPermi('erp:arap:refund:remove')")
+    @Log(title = "客户退款登记", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable("ids") String ids) {
+        int rows = 0;
+        for (Long id : Convert.toLongArray(ids)) {
+            ArapRefund old = arapRefundService.selectById(id);
+            if (old == null || !currentOrgId().equals(old.getOrgId())) {
+                continue;
+            }
+            rows += arapRefundService.removeById(id, old.getOrgId(), getUsername());
+        }
+        return toAjax(rows);
+    }
+
+    private String currentOrgId() {
+        return roleOrgService.resolveOrgId(getUserId(), getDeptId());
+    }
+}
+

+ 92 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/ArapOffset.java

@@ -0,0 +1,92 @@
+package com.ruoyi.web.arap.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public class ArapOffset extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    private String orgId;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date offDate;
+    private String offNo;
+    private String requestUnit;
+    private String custNo;
+    private String custName;
+    private BigDecimal totalOpenAmt;
+    private BigDecimal availAmt;
+    private BigDecimal totalOffAmt;
+    private String revStatus;
+    private String delFlag;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date offStartDate;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date offEndDate;
+    private String ccyNo;
+    private String ccyName;
+    private String billRemark;
+    private String invoiceNo;
+    private String invoiceStatus;
+    private String acctYm;
+    private String hasRecvData;
+
+    private List<ArapOffsetItem> itemList;
+    private List<Long> openPayIds;
+    private List<Long> reverseItemIds;
+
+    public Long getId() { return id; }
+    public void setId(Long id) { this.id = id; }
+    public String getOrgId() { return orgId; }
+    public void setOrgId(String orgId) { this.orgId = orgId; }
+    public Date getOffDate() { return offDate; }
+    public void setOffDate(Date offDate) { this.offDate = offDate; }
+    public String getOffNo() { return offNo; }
+    public void setOffNo(String offNo) { this.offNo = offNo; }
+    public String getRequestUnit() { return requestUnit; }
+    public void setRequestUnit(String requestUnit) { this.requestUnit = requestUnit; }
+    public String getCustNo() { return custNo; }
+    public void setCustNo(String custNo) { this.custNo = custNo; }
+    public String getCustName() { return custName; }
+    public void setCustName(String custName) { this.custName = custName; }
+    public BigDecimal getTotalOpenAmt() { return totalOpenAmt; }
+    public void setTotalOpenAmt(BigDecimal totalOpenAmt) { this.totalOpenAmt = totalOpenAmt; }
+    public BigDecimal getAvailAmt() { return availAmt; }
+    public void setAvailAmt(BigDecimal availAmt) { this.availAmt = availAmt; }
+    public BigDecimal getTotalOffAmt() { return totalOffAmt; }
+    public void setTotalOffAmt(BigDecimal totalOffAmt) { this.totalOffAmt = totalOffAmt; }
+    public String getRevStatus() { return revStatus; }
+    public void setRevStatus(String revStatus) { this.revStatus = revStatus; }
+    public String getDelFlag() { return delFlag; }
+    public void setDelFlag(String delFlag) { this.delFlag = delFlag; }
+    public Date getOffStartDate() { return offStartDate; }
+    public void setOffStartDate(Date offStartDate) { this.offStartDate = offStartDate; }
+    public Date getOffEndDate() { return offEndDate; }
+    public void setOffEndDate(Date offEndDate) { this.offEndDate = offEndDate; }
+    public List<ArapOffsetItem> getItemList() { return itemList; }
+    public void setItemList(List<ArapOffsetItem> itemList) { this.itemList = itemList; }
+    public List<Long> getOpenPayIds() { return openPayIds; }
+    public void setOpenPayIds(List<Long> openPayIds) { this.openPayIds = openPayIds; }
+    public List<Long> getReverseItemIds() { return reverseItemIds; }
+    public void setReverseItemIds(List<Long> reverseItemIds) { this.reverseItemIds = reverseItemIds; }
+    public String getCcyNo() { return ccyNo; }
+    public void setCcyNo(String ccyNo) { this.ccyNo = ccyNo; }
+    public String getCcyName() { return ccyName; }
+    public void setCcyName(String ccyName) { this.ccyName = ccyName; }
+    public String getBillRemark() { return billRemark; }
+    public void setBillRemark(String billRemark) { this.billRemark = billRemark; }
+    public String getInvoiceNo() { return invoiceNo; }
+    public void setInvoiceNo(String invoiceNo) { this.invoiceNo = invoiceNo; }
+    public String getInvoiceStatus() { return invoiceStatus; }
+    public void setInvoiceStatus(String invoiceStatus) { this.invoiceStatus = invoiceStatus; }
+    public String getAcctYm() { return acctYm; }
+    public void setAcctYm(String acctYm) { this.acctYm = acctYm; }
+    public String getHasRecvData() { return hasRecvData; }
+    public void setHasRecvData(String hasRecvData) { this.hasRecvData = hasRecvData; }
+}
+

+ 74 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/ArapOffsetItem.java

@@ -0,0 +1,74 @@
+package com.ruoyi.web.arap.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class ArapOffsetItem extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+    private Long id;
+    private String orgId;
+    private Long offId;
+    private String offNo;
+    private String docType;
+    private String custNo;
+    private String custName;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date docDate;
+    private String docNo;
+    private BigDecimal totalAmt;
+    private BigDecimal openAmt;
+    private BigDecimal offAmt;
+    private BigDecimal offDiscAmt;
+    private BigDecimal unoffAmt;
+    private BigDecimal afterTaxDiscAmt;
+    private BigDecimal recvArAmt;
+    private String recvNo;
+    private String recvType;
+    private String revStatus;
+    private String delFlag;
+
+    public Long getId() { return id; }
+    public void setId(Long id) { this.id = id; }
+    public String getOrgId() { return orgId; }
+    public void setOrgId(String orgId) { this.orgId = orgId; }
+    public Long getOffId() { return offId; }
+    public void setOffId(Long offId) { this.offId = offId; }
+    public String getOffNo() { return offNo; }
+    public void setOffNo(String offNo) { this.offNo = offNo; }
+    public String getDocType() { return docType; }
+    public void setDocType(String docType) { this.docType = docType; }
+    public String getCustNo() { return custNo; }
+    public void setCustNo(String custNo) { this.custNo = custNo; }
+    public String getCustName() { return custName; }
+    public void setCustName(String custName) { this.custName = custName; }
+    public Date getDocDate() { return docDate; }
+    public void setDocDate(Date docDate) { this.docDate = docDate; }
+    public String getDocNo() { return docNo; }
+    public void setDocNo(String docNo) { this.docNo = docNo; }
+    public BigDecimal getTotalAmt() { return totalAmt; }
+    public void setTotalAmt(BigDecimal totalAmt) { this.totalAmt = totalAmt; }
+    public BigDecimal getOpenAmt() { return openAmt; }
+    public void setOpenAmt(BigDecimal openAmt) { this.openAmt = openAmt; }
+    public BigDecimal getOffAmt() { return offAmt; }
+    public void setOffAmt(BigDecimal offAmt) { this.offAmt = offAmt; }
+    public BigDecimal getOffDiscAmt() { return offDiscAmt; }
+    public void setOffDiscAmt(BigDecimal offDiscAmt) { this.offDiscAmt = offDiscAmt; }
+    public BigDecimal getUnoffAmt() { return unoffAmt; }
+    public void setUnoffAmt(BigDecimal unoffAmt) { this.unoffAmt = unoffAmt; }
+    public BigDecimal getAfterTaxDiscAmt() { return afterTaxDiscAmt; }
+    public void setAfterTaxDiscAmt(BigDecimal afterTaxDiscAmt) { this.afterTaxDiscAmt = afterTaxDiscAmt; }
+    public BigDecimal getRecvArAmt() { return recvArAmt; }
+    public void setRecvArAmt(BigDecimal recvArAmt) { this.recvArAmt = recvArAmt; }
+    public String getRecvNo() { return recvNo; }
+    public void setRecvNo(String recvNo) { this.recvNo = recvNo; }
+    public String getRecvType() { return recvType; }
+    public void setRecvType(String recvType) { this.recvType = recvType; }
+    public String getRevStatus() { return revStatus; }
+    public void setRevStatus(String revStatus) { this.revStatus = revStatus; }
+    public String getDelFlag() { return delFlag; }
+    public void setDelFlag(String delFlag) { this.delFlag = delFlag; }
+}
+

+ 138 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/ArapRecv.java

@@ -0,0 +1,138 @@
+package com.ruoyi.web.arap.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 收款登记 arap_recv。
+ */
+public class ArapRecv extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date recvDate;
+
+    private String recvNo;
+
+    private String custNo;
+
+    private String custName;
+
+    private String recvBy;
+
+    /** 现金:CASH */
+    private String recvType;
+
+    private String bankNo;
+
+    private BigDecimal recvAmt;
+
+    /** 是否已扣款:0否 1是 */
+    private String deducted;
+
+    private String delFlag;
+
+    private String orgId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Date getRecvDate() {
+        return recvDate;
+    }
+
+    public void setRecvDate(Date recvDate) {
+        this.recvDate = recvDate;
+    }
+
+    public String getRecvNo() {
+        return recvNo;
+    }
+
+    public void setRecvNo(String recvNo) {
+        this.recvNo = recvNo;
+    }
+
+    public String getCustNo() {
+        return custNo;
+    }
+
+    public void setCustNo(String custNo) {
+        this.custNo = custNo;
+    }
+
+    public String getCustName() {
+        return custName;
+    }
+
+    public void setCustName(String custName) {
+        this.custName = custName;
+    }
+
+    public String getRecvBy() {
+        return recvBy;
+    }
+
+    public void setRecvBy(String recvBy) {
+        this.recvBy = recvBy;
+    }
+
+    public String getRecvType() {
+        return recvType;
+    }
+
+    public void setRecvType(String recvType) {
+        this.recvType = recvType;
+    }
+
+    public BigDecimal getRecvAmt() {
+        return recvAmt;
+    }
+
+    public void setRecvAmt(BigDecimal recvAmt) {
+        this.recvAmt = recvAmt;
+    }
+
+    public String getBankNo() {
+        return bankNo;
+    }
+
+    public void setBankNo(String bankNo) {
+        this.bankNo = bankNo;
+    }
+
+    public String getDeducted() {
+        return deducted;
+    }
+
+    public void setDeducted(String deducted) {
+        this.deducted = deducted;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public String getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(String orgId) {
+        this.orgId = orgId;
+    }
+}
+

+ 138 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/ArapRefund.java

@@ -0,0 +1,138 @@
+package com.ruoyi.web.arap.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 客户退款登记 arap_refund。
+ */
+public class ArapRefund extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date refDate;
+
+    private String refNo;
+
+    private String custNo;
+
+    private String custName;
+
+    private String refBy;
+
+    /** 现金:CASH */
+    private String refType;
+
+    private String bankNo;
+
+    private BigDecimal refAmt;
+
+    /** 是否已扣款:0否 1是 */
+    private String deducted;
+
+    private String delFlag;
+
+    private String orgId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Date getRefDate() {
+        return refDate;
+    }
+
+    public void setRefDate(Date refDate) {
+        this.refDate = refDate;
+    }
+
+    public String getRefNo() {
+        return refNo;
+    }
+
+    public void setRefNo(String refNo) {
+        this.refNo = refNo;
+    }
+
+    public String getCustNo() {
+        return custNo;
+    }
+
+    public void setCustNo(String custNo) {
+        this.custNo = custNo;
+    }
+
+    public String getCustName() {
+        return custName;
+    }
+
+    public void setCustName(String custName) {
+        this.custName = custName;
+    }
+
+    public String getRefBy() {
+        return refBy;
+    }
+
+    public void setRefBy(String refBy) {
+        this.refBy = refBy;
+    }
+
+    public String getRefType() {
+        return refType;
+    }
+
+    public void setRefType(String refType) {
+        this.refType = refType;
+    }
+
+    public BigDecimal getRefAmt() {
+        return refAmt;
+    }
+
+    public void setRefAmt(BigDecimal refAmt) {
+        this.refAmt = refAmt;
+    }
+
+    public String getBankNo() {
+        return bankNo;
+    }
+
+    public void setBankNo(String bankNo) {
+        this.bankNo = bankNo;
+    }
+
+    public String getDeducted() {
+        return deducted;
+    }
+
+    public void setDeducted(String deducted) {
+        this.deducted = deducted;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public String getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(String orgId) {
+        this.orgId = orgId;
+    }
+}
+

+ 92 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/vo/ArapDeductItemVo.java

@@ -0,0 +1,92 @@
+package com.ruoyi.web.arap.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class ArapDeductItemVo {
+    private Long docId;
+    /** 收款单/退款单 */
+    private String docType;
+    private String docNo;
+    private String custNo;
+    private String custName;
+    private String bankNo;
+    /** 应收金额(退款为负) */
+    private BigDecimal arAmt;
+    private Date docDate;
+    /** 是否已扣款:0否 1是 */
+    private String deducted;
+
+    public Long getDocId() {
+        return docId;
+    }
+
+    public void setDocId(Long docId) {
+        this.docId = docId;
+    }
+
+    public String getDocType() {
+        return docType;
+    }
+
+    public void setDocType(String docType) {
+        this.docType = docType;
+    }
+
+    public String getDocNo() {
+        return docNo;
+    }
+
+    public void setDocNo(String docNo) {
+        this.docNo = docNo;
+    }
+
+    public String getCustNo() {
+        return custNo;
+    }
+
+    public void setCustNo(String custNo) {
+        this.custNo = custNo;
+    }
+
+    public String getCustName() {
+        return custName;
+    }
+
+    public void setCustName(String custName) {
+        this.custName = custName;
+    }
+
+    public String getBankNo() {
+        return bankNo;
+    }
+
+    public void setBankNo(String bankNo) {
+        this.bankNo = bankNo;
+    }
+
+    public BigDecimal getArAmt() {
+        return arAmt;
+    }
+
+    public void setArAmt(BigDecimal arAmt) {
+        this.arAmt = arAmt;
+    }
+
+    public Date getDocDate() {
+        return docDate;
+    }
+
+    public void setDocDate(Date docDate) {
+        this.docDate = docDate;
+    }
+
+    public String getDeducted() {
+        return deducted;
+    }
+
+    public void setDeducted(String deducted) {
+        this.deducted = deducted;
+    }
+}
+

+ 48 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/vo/ArapOpenPayVo.java

@@ -0,0 +1,48 @@
+package com.ruoyi.web.arap.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class ArapOpenPayVo {
+    private Long id;
+    private String srcType;
+    private Long srcId;
+    private String payNo;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date payDate;
+    private String requestUnit;
+    private String custNo;
+    private String custName;
+    private String bankNo;
+    private BigDecimal totalAmt;
+    private BigDecimal openAmt;
+    private String settleStatus;
+
+    public Long getId() { return id; }
+    public void setId(Long id) { this.id = id; }
+    public String getSrcType() { return srcType; }
+    public void setSrcType(String srcType) { this.srcType = srcType; }
+    public Long getSrcId() { return srcId; }
+    public void setSrcId(Long srcId) { this.srcId = srcId; }
+    public String getPayNo() { return payNo; }
+    public void setPayNo(String payNo) { this.payNo = payNo; }
+    public Date getPayDate() { return payDate; }
+    public void setPayDate(Date payDate) { this.payDate = payDate; }
+    public String getRequestUnit() { return requestUnit; }
+    public void setRequestUnit(String requestUnit) { this.requestUnit = requestUnit; }
+    public String getCustNo() { return custNo; }
+    public void setCustNo(String custNo) { this.custNo = custNo; }
+    public String getCustName() { return custName; }
+    public void setCustName(String custName) { this.custName = custName; }
+    public String getBankNo() { return bankNo; }
+    public void setBankNo(String bankNo) { this.bankNo = bankNo; }
+    public BigDecimal getTotalAmt() { return totalAmt; }
+    public void setTotalAmt(BigDecimal totalAmt) { this.totalAmt = totalAmt; }
+    public BigDecimal getOpenAmt() { return openAmt; }
+    public void setOpenAmt(BigDecimal openAmt) { this.openAmt = openAmt; }
+    public String getSettleStatus() { return settleStatus; }
+    public void setSettleStatus(String settleStatus) { this.settleStatus = settleStatus; }
+}
+

+ 51 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/domain/vo/ArapOrderOpenVo.java

@@ -0,0 +1,51 @@
+package com.ruoyi.web.arap.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class ArapOrderOpenVo {
+    private Long id;
+    private String docType;
+    private String custNo;
+    private String custName;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date docDate;
+    private String docNo;
+    private BigDecimal totalAmt;
+    private BigDecimal openAmt;
+    private BigDecimal offAmt;
+    private BigDecimal offDiscAmt;
+    private BigDecimal unoffAmt;
+    private BigDecimal afterTaxDiscAmt;
+    private BigDecimal recvArAmt;
+
+    public Long getId() { return id; }
+    public void setId(Long id) { this.id = id; }
+    public String getDocType() { return docType; }
+    public void setDocType(String docType) { this.docType = docType; }
+    public String getCustNo() { return custNo; }
+    public void setCustNo(String custNo) { this.custNo = custNo; }
+    public String getCustName() { return custName; }
+    public void setCustName(String custName) { this.custName = custName; }
+    public Date getDocDate() { return docDate; }
+    public void setDocDate(Date docDate) { this.docDate = docDate; }
+    public String getDocNo() { return docNo; }
+    public void setDocNo(String docNo) { this.docNo = docNo; }
+    public BigDecimal getTotalAmt() { return totalAmt; }
+    public void setTotalAmt(BigDecimal totalAmt) { this.totalAmt = totalAmt; }
+    public BigDecimal getOpenAmt() { return openAmt; }
+    public void setOpenAmt(BigDecimal openAmt) { this.openAmt = openAmt; }
+    public BigDecimal getOffAmt() { return offAmt; }
+    public void setOffAmt(BigDecimal offAmt) { this.offAmt = offAmt; }
+    public BigDecimal getOffDiscAmt() { return offDiscAmt; }
+    public void setOffDiscAmt(BigDecimal offDiscAmt) { this.offDiscAmt = offDiscAmt; }
+    public BigDecimal getUnoffAmt() { return unoffAmt; }
+    public void setUnoffAmt(BigDecimal unoffAmt) { this.unoffAmt = unoffAmt; }
+    public BigDecimal getAfterTaxDiscAmt() { return afterTaxDiscAmt; }
+    public void setAfterTaxDiscAmt(BigDecimal afterTaxDiscAmt) { this.afterTaxDiscAmt = afterTaxDiscAmt; }
+    public BigDecimal getRecvArAmt() { return recvArAmt; }
+    public void setRecvArAmt(BigDecimal recvArAmt) { this.recvArAmt = recvArAmt; }
+}
+

+ 16 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/mapper/ArapDeductMapper.java

@@ -0,0 +1,16 @@
+package com.ruoyi.web.arap.mapper;
+
+import com.ruoyi.web.arap.domain.vo.ArapDeductItemVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface ArapDeductMapper {
+    List<ArapDeductItemVo> selectDeductList(@Param("orgId") String orgId, @Param("bizDate") Date bizDate);
+
+    int updateRecvDeducted(@Param("id") Long id, @Param("orgId") String orgId, @Param("deducted") String deducted, @Param("updateBy") String updateBy);
+
+    int updateRefundDeducted(@Param("id") Long id, @Param("orgId") String orgId, @Param("deducted") String deducted, @Param("updateBy") String updateBy);
+}
+

+ 41 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/mapper/ArapOffsetMapper.java

@@ -0,0 +1,41 @@
+package com.ruoyi.web.arap.mapper;
+
+import com.ruoyi.web.arap.domain.ArapOffset;
+import com.ruoyi.web.arap.domain.ArapOffsetItem;
+import com.ruoyi.web.arap.domain.vo.ArapOpenPayVo;
+import com.ruoyi.web.arap.domain.vo.ArapOrderOpenVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface ArapOffsetMapper {
+    int syncOpenPayFromRecv(@Param("orgId") String orgId);
+    int syncOpenPayFromRefund(@Param("orgId") String orgId);
+    int syncOrderOpenFromDelivery(@Param("orgId") String orgId);
+    int syncOrderOpenFromReturn(@Param("orgId") String orgId);
+
+    List<ArapOpenPayVo> selectOpenPayList(ArapOffset query);
+    List<ArapOrderOpenVo> selectOrderOpenList(@Param("orgId") String orgId, @Param("custNo") String custNo,
+                                              @Param("startDate") Date startDate, @Param("endDate") Date endDate,
+                                              @Param("remark") String remark);
+
+    Integer selectTodayMaxSeq(@Param("orgId") String orgId, @Param("dateText") String dateText);
+
+    int insertOffset(ArapOffset entity);
+    int insertOffsetItemBatch(@Param("list") List<ArapOffsetItem> list);
+
+    int decreaseOrderOpen(@Param("orgId") String orgId, @Param("docType") String docType, @Param("docNo") String docNo,
+                          @Param("amt") java.math.BigDecimal amt, @Param("updateBy") String updateBy);
+    int decreaseOpenPay(@Param("id") Long id, @Param("orgId") String orgId, @Param("amt") java.math.BigDecimal amt, @Param("updateBy") String updateBy);
+
+    List<ArapOffset> selectOffsetList(ArapOffset query);
+    ArapOffset selectOffsetById(@Param("id") Long id, @Param("orgId") String orgId);
+    List<ArapOffsetItem> selectOffsetItems(@Param("offId") Long offId, @Param("orgId") String orgId);
+
+    int markItemReversed(@Param("id") Long id, @Param("orgId") String orgId, @Param("updateBy") String updateBy);
+    int increaseOrderOpen(@Param("orgId") String orgId, @Param("docType") String docType, @Param("docNo") String docNo,
+                          @Param("amt") java.math.BigDecimal amt, @Param("updateBy") String updateBy);
+    int updateOffsetReverseStatus(@Param("offId") Long offId, @Param("orgId") String orgId, @Param("status") String status, @Param("updateBy") String updateBy);
+}
+

+ 21 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/mapper/ArapRecvMapper.java

@@ -0,0 +1,21 @@
+package com.ruoyi.web.arap.mapper;
+
+import com.ruoyi.web.arap.domain.ArapRecv;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ArapRecvMapper {
+    ArapRecv selectById(Long id);
+
+    List<ArapRecv> selectList(ArapRecv query);
+
+    int insert(ArapRecv entity);
+
+    int updateById(ArapRecv entity);
+
+    int deleteById(@Param("id") Long id, @Param("orgId") String orgId, @Param("updateBy") String updateBy);
+
+    Integer selectTodayMaxSeq(@Param("orgId") String orgId, @Param("dateText") String dateText);
+}
+

+ 21 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/mapper/ArapRefundMapper.java

@@ -0,0 +1,21 @@
+package com.ruoyi.web.arap.mapper;
+
+import com.ruoyi.web.arap.domain.ArapRefund;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ArapRefundMapper {
+    ArapRefund selectById(Long id);
+
+    List<ArapRefund> selectList(ArapRefund query);
+
+    int insert(ArapRefund entity);
+
+    int updateById(ArapRefund entity);
+
+    int deleteById(@Param("id") Long id, @Param("orgId") String orgId, @Param("updateBy") String updateBy);
+
+    Integer selectTodayMaxSeq(@Param("orgId") String orgId, @Param("dateText") String dateText);
+}
+

+ 15 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/IArapDeductService.java

@@ -0,0 +1,15 @@
+package com.ruoyi.web.arap.service;
+
+import com.ruoyi.web.arap.domain.vo.ArapDeductItemVo;
+
+import java.util.Date;
+import java.util.List;
+
+public interface IArapDeductService {
+    List<ArapDeductItemVo> listByDate(String orgId, Date bizDate);
+
+    int batchDeduct(String orgId, String operator, List<ArapDeductItemVo> rows);
+
+    int batchUndeduct(String orgId, String operator, List<ArapDeductItemVo> rows);
+}
+

+ 22 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/IArapOffsetService.java

@@ -0,0 +1,22 @@
+package com.ruoyi.web.arap.service;
+
+import com.ruoyi.web.arap.domain.ArapOffset;
+import com.ruoyi.web.arap.domain.vo.ArapOpenPayVo;
+import com.ruoyi.web.arap.domain.vo.ArapOrderOpenVo;
+
+import java.util.List;
+
+public interface IArapOffsetService {
+    List<ArapOpenPayVo> listOpenPay(ArapOffset query);
+
+    List<ArapOrderOpenVo> listOrderOpen(String orgId, String custNo, java.util.Date startDate, java.util.Date endDate, String remark);
+
+    ArapOffset getOffset(Long id, String orgId);
+
+    List<ArapOffset> listOffset(ArapOffset query);
+
+    int saveOffset(ArapOffset form, String orgId, String operator);
+
+    int reverseOffset(ArapOffset form, String orgId, String operator);
+}
+

+ 19 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/IArapRecvService.java

@@ -0,0 +1,19 @@
+package com.ruoyi.web.arap.service;
+
+import com.ruoyi.web.arap.domain.ArapRecv;
+
+import java.util.List;
+
+public interface IArapRecvService {
+
+    ArapRecv selectById(Long id);
+
+    List<ArapRecv> selectList(ArapRecv query);
+
+    int add(ArapRecv entity, String operator);
+
+    int edit(ArapRecv entity, String operator);
+
+    int removeById(Long id, String orgId, String operator);
+}
+

+ 19 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/IArapRefundService.java

@@ -0,0 +1,19 @@
+package com.ruoyi.web.arap.service;
+
+import com.ruoyi.web.arap.domain.ArapRefund;
+
+import java.util.List;
+
+public interface IArapRefundService {
+
+    ArapRefund selectById(Long id);
+
+    List<ArapRefund> selectList(ArapRefund query);
+
+    int add(ArapRefund entity, String operator);
+
+    int edit(ArapRefund entity, String operator);
+
+    int removeById(Long id, String orgId, String operator);
+}
+

+ 55 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/impl/ArapDeductServiceImpl.java

@@ -0,0 +1,55 @@
+package com.ruoyi.web.arap.service.impl;
+
+import com.ruoyi.web.arap.domain.vo.ArapDeductItemVo;
+import com.ruoyi.web.arap.mapper.ArapDeductMapper;
+import com.ruoyi.web.arap.service.IArapDeductService;
+import com.ruoyi.common.exception.ServiceException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class ArapDeductServiceImpl implements IArapDeductService {
+
+    @Autowired
+    private ArapDeductMapper arapDeductMapper;
+
+    @Override
+    public List<ArapDeductItemVo> listByDate(String orgId, Date bizDate) {
+        return arapDeductMapper.selectDeductList(orgId, bizDate);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchDeduct(String orgId, String operator, List<ArapDeductItemVo> rows) {
+        return doBatchSet(orgId, operator, rows, "1");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchUndeduct(String orgId, String operator, List<ArapDeductItemVo> rows) {
+        return doBatchSet(orgId, operator, rows, "0");
+    }
+
+    private int doBatchSet(String orgId, String operator, List<ArapDeductItemVo> rows, String value) {
+        if (rows == null || rows.isEmpty()) {
+            throw new ServiceException("提交失败,至少选择一条数据");
+        }
+        int n = 0;
+        for (ArapDeductItemVo row : rows) {
+            if (row == null || row.getDocId() == null || row.getDocType() == null) {
+                continue;
+            }
+            if ("收款单".equals(row.getDocType())) {
+                n += arapDeductMapper.updateRecvDeducted(row.getDocId(), orgId, value, operator);
+            } else if ("退款单".equals(row.getDocType())) {
+                n += arapDeductMapper.updateRefundDeducted(row.getDocId(), orgId, value, operator);
+            }
+        }
+        return n;
+    }
+}
+

+ 186 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/impl/ArapOffsetServiceImpl.java

@@ -0,0 +1,186 @@
+package com.ruoyi.web.arap.service.impl;
+
+import com.ruoyi.web.arap.domain.ArapOffset;
+import com.ruoyi.web.arap.domain.ArapOffsetItem;
+import com.ruoyi.web.arap.domain.vo.ArapOpenPayVo;
+import com.ruoyi.web.arap.domain.vo.ArapOrderOpenVo;
+import com.ruoyi.web.arap.mapper.ArapOffsetMapper;
+import com.ruoyi.web.arap.service.IArapOffsetService;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Service
+public class ArapOffsetServiceImpl implements IArapOffsetService {
+
+    @Autowired
+    private ArapOffsetMapper arapOffsetMapper;
+
+    @Override
+    public List<ArapOpenPayVo> listOpenPay(ArapOffset query) {
+        syncBaseData(query.getOrgId());
+        if (query.getOffStartDate() == null && query.getOffEndDate() == null && query.getOffDate() != null) {
+            query.setOffStartDate(query.getOffDate());
+            query.setOffEndDate(query.getOffDate());
+        }
+        return arapOffsetMapper.selectOpenPayList(query);
+    }
+
+    @Override
+    public List<ArapOrderOpenVo> listOrderOpen(String orgId, String custNo, Date startDate, Date endDate, String remark) {
+        syncBaseData(orgId);
+        return arapOffsetMapper.selectOrderOpenList(orgId, custNo, startDate, endDate, remark);
+    }
+
+    @Override
+    public ArapOffset getOffset(Long id, String orgId) {
+        ArapOffset head = arapOffsetMapper.selectOffsetById(id, orgId);
+        if (head == null) return null;
+        head.setItemList(arapOffsetMapper.selectOffsetItems(id, orgId));
+        return head;
+    }
+
+    @Override
+    public List<ArapOffset> listOffset(ArapOffset query) {
+        return arapOffsetMapper.selectOffsetList(query);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int saveOffset(ArapOffset form, String orgId, String operator) {
+        if (form == null || form.getItemList() == null || form.getItemList().isEmpty()) {
+            throw new ServiceException("保存失败,冲销明细不能为空");
+        }
+        if (StringUtils.isEmpty(form.getCustNo())) {
+            throw new ServiceException("保存失败,客户编号不能为空");
+        }
+        if (form.getOffDate() == null) {
+            form.setOffDate(new Date());
+        }
+        String offNo = generateNo(orgId, form.getOffDate());
+        form.setOffNo(offNo);
+        form.setOrgId(orgId);
+        form.setDelFlag("0");
+        form.setRevStatus("0");
+        form.setCreateBy(operator);
+        form.setUpdateBy(operator);
+
+        BigDecimal totalOff = BigDecimal.ZERO;
+        BigDecimal totalOpen = BigDecimal.ZERO;
+
+        for (ArapOffsetItem item : form.getItemList()) {
+            BigDecimal open = nvl(item.getOpenAmt());
+            BigDecimal off = nvl(item.getOffAmt());
+            BigDecimal disc = nvl(item.getOffDiscAmt());
+            if (off.add(disc).compareTo(open) > 0) {
+                throw new ServiceException("保存失败,冲销金额+折让金额不能超过未清款");
+            }
+            item.setUnoffAmt(open.subtract(off).subtract(disc));
+            totalOff = totalOff.add(off).add(disc);
+            totalOpen = totalOpen.add(open);
+        }
+        form.setTotalOpenAmt(totalOpen);
+        form.setAvailAmt(totalOpen);
+        form.setTotalOffAmt(totalOff);
+
+        arapOffsetMapper.insertOffset(form);
+        for (ArapOffsetItem item : form.getItemList()) {
+            item.setOrgId(orgId);
+            item.setOffId(form.getId());
+            item.setOffNo(form.getOffNo());
+            item.setRevStatus("0");
+            item.setDelFlag("0");
+            item.setCreateBy(operator);
+            item.setUpdateBy(operator);
+        }
+        arapOffsetMapper.insertOffsetItemBatch(form.getItemList());
+
+        // 回写货单未清金额
+        for (ArapOffsetItem item : form.getItemList()) {
+            BigDecimal used = nvl(item.getOffAmt()).add(nvl(item.getOffDiscAmt()));
+            if (used.compareTo(BigDecimal.ZERO) <= 0) continue;
+            arapOffsetMapper.decreaseOrderOpen(orgId, item.getDocType(), item.getDocNo(), used, operator);
+        }
+
+        // 回写未结收付款单(顺序抵扣)
+        BigDecimal remain = totalOff;
+        List<Long> openPayIds = form.getOpenPayIds() == null ? Collections.emptyList() : form.getOpenPayIds();
+        List<ArapOpenPayVo> openList = arapOffsetMapper.selectOpenPayList(buildOpenPayIdsQuery(orgId, openPayIds));
+        for (ArapOpenPayVo p : openList) {
+            if (remain.compareTo(BigDecimal.ZERO) <= 0) break;
+            BigDecimal canUse = abs(nvl(p.getOpenAmt()));
+            BigDecimal use = canUse.min(remain);
+            if (use.compareTo(BigDecimal.ZERO) > 0) {
+                arapOffsetMapper.decreaseOpenPay(p.getId(), orgId, use, operator);
+                remain = remain.subtract(use);
+            }
+        }
+        return 1;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int reverseOffset(ArapOffset form, String orgId, String operator) {
+        if (form == null || form.getId() == null) {
+            throw new ServiceException("反冲销失败,冲销单ID不能为空");
+        }
+        if (form.getReverseItemIds() == null || form.getReverseItemIds().isEmpty()) {
+            throw new ServiceException("反冲销失败,请选择至少一条货单");
+        }
+        ArapOffset head = arapOffsetMapper.selectOffsetById(form.getId(), orgId);
+        if (head == null) {
+            throw new ServiceException("反冲销失败,冲销单不存在");
+        }
+        List<ArapOffsetItem> all = arapOffsetMapper.selectOffsetItems(head.getId(), orgId);
+        Map<Long, ArapOffsetItem> map = new HashMap<>();
+        for (ArapOffsetItem it : all) map.put(it.getId(), it);
+
+        int n = 0;
+        for (Long itemId : form.getReverseItemIds()) {
+            ArapOffsetItem it = map.get(itemId);
+            if (it == null || "1".equals(it.getRevStatus())) continue;
+            BigDecimal used = nvl(it.getOffAmt()).add(nvl(it.getOffDiscAmt()));
+            arapOffsetMapper.increaseOrderOpen(orgId, it.getDocType(), it.getDocNo(), used, operator);
+            arapOffsetMapper.markItemReversed(itemId, orgId, operator);
+            n++;
+        }
+        // 只要有任意反冲,主单标记已反冲
+        if (n > 0) {
+            arapOffsetMapper.updateOffsetReverseStatus(head.getId(), orgId, "1", operator);
+        }
+        return n;
+    }
+
+    private void syncBaseData(String orgId) {
+        arapOffsetMapper.syncOpenPayFromRecv(orgId);
+        arapOffsetMapper.syncOpenPayFromRefund(orgId);
+        arapOffsetMapper.syncOrderOpenFromDelivery(orgId);
+        arapOffsetMapper.syncOrderOpenFromReturn(orgId);
+    }
+
+    private String generateNo(String orgId, Date offDate) {
+        String dateText = new SimpleDateFormat("yyyyMMdd").format(offDate);
+        Integer maxSeq = arapOffsetMapper.selectTodayMaxSeq(orgId, dateText);
+        int next = (maxSeq == null ? 0 : maxSeq) + 1;
+        return dateText + String.format("%04d", next);
+    }
+
+    private BigDecimal nvl(BigDecimal n) { return n == null ? BigDecimal.ZERO : n; }
+    private BigDecimal abs(BigDecimal n) { return n == null ? BigDecimal.ZERO : n.abs(); }
+
+    private ArapOffset buildOpenPayIdsQuery(String orgId, List<Long> ids) {
+        ArapOffset q = new ArapOffset();
+        q.setOrgId(orgId);
+        if (ids != null && !ids.isEmpty()) {
+            q.getParams().put("idList", ids);
+        }
+        return q;
+    }
+}
+

+ 121 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/impl/ArapRecvServiceImpl.java

@@ -0,0 +1,121 @@
+package com.ruoyi.web.arap.service.impl;
+
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.web.arap.domain.ArapRecv;
+import com.ruoyi.web.arap.mapper.ArapRecvMapper;
+import com.ruoyi.web.arap.service.IArapRecvService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+@Service
+public class ArapRecvServiceImpl implements IArapRecvService {
+
+    @Autowired
+    private ArapRecvMapper arapRecvMapper;
+
+    @Override
+    public ArapRecv selectById(Long id) {
+        return arapRecvMapper.selectById(id);
+    }
+
+    @Override
+    public java.util.List<ArapRecv> selectList(ArapRecv query) {
+        return arapRecvMapper.selectList(query);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int add(ArapRecv entity, String operator) {
+        validate(entity);
+        normalize(entity);
+
+        if (StringUtils.isEmpty(entity.getRecvType())) {
+            entity.setRecvType("CASH");
+        }
+        entity.setRecvType(entity.getRecvType().toUpperCase(Locale.ROOT));
+
+        if (StringUtils.isEmpty(entity.getRecvNo())) {
+            entity.setRecvNo(generateNo(entity.getOrgId(), entity.getRecvDate()));
+        }
+
+        entity.setDelFlag("0");
+        entity.setCreateBy(operator);
+        entity.setUpdateBy(operator);
+        return arapRecvMapper.insert(entity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int edit(ArapRecv entity, String operator) {
+        if (entity == null || entity.getId() == null) {
+            throw new ServiceException("修改失败,id不能为空");
+        }
+        validate(entity);
+        normalize(entity);
+
+        if (StringUtils.isEmpty(entity.getRecvType())) {
+            entity.setRecvType("CASH");
+        }
+        entity.setRecvType(entity.getRecvType().toUpperCase(Locale.ROOT));
+
+        if (StringUtils.isEmpty(entity.getRecvNo())) {
+            throw new ServiceException("修改失败,收款编号不能为空");
+        }
+
+        entity.setUpdateBy(operator);
+        return arapRecvMapper.updateById(entity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeById(Long id, String orgId, String operator) {
+        return arapRecvMapper.deleteById(id, orgId, operator);
+    }
+
+    private void validate(ArapRecv e) {
+        if (e == null) {
+            throw new ServiceException("提交失败,参数不能为空");
+        }
+        if (e.getRecvDate() == null) {
+            throw new ServiceException("提交失败,收款日期不能为空");
+        }
+        if (StringUtils.isEmpty(e.getOrgId())) {
+            throw new ServiceException("提交失败,企业标识不能为空");
+        }
+        if (StringUtils.isEmpty(e.getCustNo())) {
+            throw new ServiceException("提交失败,客户编号不能为空");
+        }
+        if (StringUtils.isEmpty(e.getCustName())) {
+            throw new ServiceException("提交失败,客户名称不能为空");
+        }
+        if (StringUtils.isEmpty(e.getRecvBy())) {
+            throw new ServiceException("提交失败,收款人不能为空");
+        }
+        if (StringUtils.isEmpty(e.getBankNo())) {
+            throw new ServiceException("提交失败,银行卡号不能为空");
+        }
+        if (e.getRecvAmt() == null) {
+            throw new ServiceException("提交失败,收款金额不能为空");
+        }
+    }
+
+    private void normalize(ArapRecv e) {
+        if (e.getRecvAmt() == null) e.setRecvAmt(BigDecimal.ZERO);
+        if (StringUtils.isEmpty(e.getDeducted())) e.setDeducted("0");
+    }
+
+    private String generateNo(String orgId, Date recvDate) {
+        String dateText = new SimpleDateFormat("yyyyMMdd").format(recvDate);
+        Integer maxSeq = arapRecvMapper.selectTodayMaxSeq(orgId, dateText);
+        int nextSeq = (maxSeq == null ? 0 : maxSeq) + 1;
+        return dateText + String.format("%04d", nextSeq);
+    }
+}
+

+ 121 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/arap/service/impl/ArapRefundServiceImpl.java

@@ -0,0 +1,121 @@
+package com.ruoyi.web.arap.service.impl;
+
+import com.ruoyi.web.arap.domain.ArapRefund;
+import com.ruoyi.web.arap.mapper.ArapRefundMapper;
+import com.ruoyi.web.arap.service.IArapRefundService;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+@Service
+public class ArapRefundServiceImpl implements IArapRefundService {
+
+    @Autowired
+    private ArapRefundMapper arapRefundMapper;
+
+    @Override
+    public ArapRefund selectById(Long id) {
+        return arapRefundMapper.selectById(id);
+    }
+
+    @Override
+    public java.util.List<ArapRefund> selectList(ArapRefund query) {
+        return arapRefundMapper.selectList(query);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int add(ArapRefund entity, String operator) {
+        validate(entity);
+        normalize(entity);
+
+        if (StringUtils.isEmpty(entity.getRefType())) {
+            entity.setRefType("CASH");
+        }
+        entity.setRefType(entity.getRefType().toUpperCase(Locale.ROOT));
+
+        if (StringUtils.isEmpty(entity.getRefNo())) {
+            entity.setRefNo(generateNo(entity.getOrgId(), entity.getRefDate()));
+        }
+
+        entity.setDelFlag("0");
+        entity.setCreateBy(operator);
+        entity.setUpdateBy(operator);
+        return arapRefundMapper.insert(entity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int edit(ArapRefund entity, String operator) {
+        if (entity == null || entity.getId() == null) {
+            throw new ServiceException("修改失败,id不能为空");
+        }
+        validate(entity);
+        normalize(entity);
+
+        if (StringUtils.isEmpty(entity.getRefType())) {
+            entity.setRefType("CASH");
+        }
+        entity.setRefType(entity.getRefType().toUpperCase(Locale.ROOT));
+
+        if (StringUtils.isEmpty(entity.getRefNo())) {
+            throw new ServiceException("修改失败,退款编号不能为空");
+        }
+
+        entity.setUpdateBy(operator);
+        return arapRefundMapper.updateById(entity);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeById(Long id, String orgId, String operator) {
+        return arapRefundMapper.deleteById(id, orgId, operator);
+    }
+
+    private void validate(ArapRefund e) {
+        if (e == null) {
+            throw new ServiceException("提交失败,参数不能为空");
+        }
+        if (e.getRefDate() == null) {
+            throw new ServiceException("提交失败,退款日期不能为空");
+        }
+        if (StringUtils.isEmpty(e.getOrgId())) {
+            throw new ServiceException("提交失败,企业标识不能为空");
+        }
+        if (StringUtils.isEmpty(e.getCustNo())) {
+            throw new ServiceException("提交失败,客户编号不能为空");
+        }
+        if (StringUtils.isEmpty(e.getCustName())) {
+            throw new ServiceException("提交失败,客户名称不能为空");
+        }
+        if (StringUtils.isEmpty(e.getRefBy())) {
+            throw new ServiceException("提交失败,退款人不能为空");
+        }
+        if (StringUtils.isEmpty(e.getBankNo())) {
+            throw new ServiceException("提交失败,银行卡号不能为空");
+        }
+        if (e.getRefAmt() == null) {
+            throw new ServiceException("提交失败,退款金额不能为空");
+        }
+    }
+
+    private void normalize(ArapRefund e) {
+        if (e.getRefAmt() == null) e.setRefAmt(BigDecimal.ZERO);
+        if (StringUtils.isEmpty(e.getDeducted())) e.setDeducted("0");
+    }
+
+    private String generateNo(String orgId, Date refDate) {
+        String dateText = new SimpleDateFormat("yyyyMMdd").format(refDate);
+        Integer maxSeq = arapRefundMapper.selectTodayMaxSeq(orgId, dateText);
+        int nextSeq = (maxSeq == null ? 0 : maxSeq) + 1;
+        return dateText + String.format("%04d", nextSeq);
+    }
+}
+

+ 91 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseAutoLevelController.java

@@ -0,0 +1,91 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseAutoLevel;
+import com.ruoyi.web.base.service.IBaseAutoLevelService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 自动转级别 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@RestController
+@RequestMapping("/base-auto-level")
+public class BaseAutoLevelController {
+    @Autowired
+    private IBaseAutoLevelService baseAutoLevelService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("自动转级别管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseAutoLevel baseAutoLevel, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseAutoLevelService.count(new QueryWrapper<BaseAutoLevel>().eq("org_id",loginOrgId).eq("level_no", baseAutoLevel.getLevelNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseAutoLevel.setOrgId(loginOrgId);
+        baseAutoLevel.setCreateBy(getUsername());
+
+        return success(baseAutoLevelService.save(baseAutoLevel));
+    }
+
+    @ApiOperation("自动转级别管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseAutoLevel baseAutoLevel, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseAutoLevelService.count(new QueryWrapper<BaseAutoLevel>().ne("id",baseAutoLevel.getId()).eq("org_id",loginOrgId).eq("level_no", baseAutoLevel.getLevelNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseAutoLevel.setUpdateBy(getUsername());
+        return success(baseAutoLevelService.updateById(baseAutoLevel));
+    }
+
+    @ApiOperation("自动转级别管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseAutoLevelService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("自动转级别管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(baseAutoLevelService.list(new QueryWrapper<BaseAutoLevel>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("自动转级别管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(baseAutoLevelService.page(new Page<BaseAutoLevel>(pageNum,pageSize),new QueryWrapper<BaseAutoLevel>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("自动转级别管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseAutoLevelService.getById(id));
+    }
+
+}

+ 90 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseBrandController.java

@@ -0,0 +1,90 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseBrand;
+import com.ruoyi.web.base.service.IBaseBrandService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 品牌 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@RestController
+@RequestMapping("/base-brand")
+public class BaseBrandController {
+    @Autowired
+    private IBaseBrandService baseBrandService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("品牌管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseBrand baseBrand, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseBrandService.count(new QueryWrapper<BaseBrand>().eq("org_id",loginOrgId).eq("brand_num", baseBrand.getBrandNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseBrand.setOrgId(loginOrgId);
+        baseBrand.setCreateBy(getUsername());
+
+        return success(baseBrandService.save(baseBrand));
+    }
+
+    @ApiOperation("品牌管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseBrand baseBrand, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseBrandService.count(new QueryWrapper<BaseBrand>().ne("id",baseBrand.getId()).eq("org_id",loginOrgId).eq("brand_num", baseBrand.getBrandNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseBrand.setUpdateBy(getUsername());
+        return success(baseBrandService.updateById(baseBrand));
+    }
+
+    @ApiOperation("品牌管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseBrandService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("品牌管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(baseBrandService.list(new QueryWrapper<BaseBrand>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("品牌管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(baseBrandService.page(new Page<BaseBrand>(pageNum,pageSize),new QueryWrapper<BaseBrand>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("品牌管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseBrandService.getById(id));
+    }
+}

+ 90 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseBreedController.java

@@ -0,0 +1,90 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseBreed;
+import com.ruoyi.web.base.service.IBaseBreedService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@RestController
+@RequestMapping("/base-breed")
+public class BaseBreedController {
+    @Autowired
+    private IBaseBreedService baseBreedService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("畜种管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseBreed baseBreed, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseBreedService.count(new QueryWrapper<BaseBreed>().eq("org_id",loginOrgId).eq("breed_num", baseBreed.getBreedName())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseBreed.setOrgId(tokenService.getLoginOrgId(request));
+        baseBreed.setCreateBy(getUsername());
+
+        return success(baseBreedService.save(baseBreed));
+    }
+
+    @ApiOperation("畜种管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseBreed baseBreed, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseBreedService.count(new QueryWrapper<BaseBreed>().ne("id",baseBreed.getId()).eq("org_id",loginOrgId).eq("breed_num", baseBreed.getBreedName())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseBreed.setUpdateBy(getUsername());
+        return success(baseBreedService.updateById(baseBreed));
+    }
+
+    @ApiOperation("畜种管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseBreedService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("畜种管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseBreedService.list(new QueryWrapper<BaseBreed>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("畜种管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(baseBreedService.page(new Page<BaseBreed>(pageNum,pageSize),new QueryWrapper<BaseBreed>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("畜种管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseBreedService.getById(id));
+    }
+
+}

+ 88 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseCoatColorController.java

@@ -0,0 +1,88 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseCoatColor;
+import com.ruoyi.web.base.service.IBaseCoatColorService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 毛色 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@RestController
+@RequestMapping("/base-coat-color")
+public class BaseCoatColorController {
+    @Autowired
+    private IBaseCoatColorService baseCoatColorService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("毛色管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseCoatColor baseCoatColor, HttpServletRequest request) throws Exception  {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseCoatColorService.count(new QueryWrapper<BaseCoatColor>().eq("org_id",loginOrgId).eq("coat_num", baseCoatColor.getCoatNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseCoatColor.setOrgId(loginOrgId);
+        baseCoatColor.setCreateBy(getUsername());
+        return success(baseCoatColorService.save(baseCoatColor));
+    }
+
+    @ApiOperation("毛色管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseCoatColor baseCoatColor, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseCoatColorService.count(new QueryWrapper<BaseCoatColor>().ne("id",baseCoatColor.getId()).eq("org_id",loginOrgId).eq("coat_num", baseCoatColor.getCoatNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseCoatColor.setUpdateBy(getUsername());
+        return success(baseCoatColorService.updateById(baseCoatColor));
+    }
+
+    @ApiOperation("毛色管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseCoatColorService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("毛色管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseCoatColorService.list(new QueryWrapper<BaseCoatColor>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("毛色管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(baseCoatColorService.page(new Page<BaseCoatColor>(pageNum,pageSize),new QueryWrapper<BaseCoatColor>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("毛色管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseCoatColorService.getById(id));
+    }
+}

+ 88 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseCustomerChannelController.java

@@ -0,0 +1,88 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseCustomerChannel;
+import com.ruoyi.web.base.service.IBaseCustomerChannelService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 客户渠道 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@RestController
+@RequestMapping("/base-customer-channel")
+public class BaseCustomerChannelController {
+    @Autowired
+    private IBaseCustomerChannelService customerChannelService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("客户渠道管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseCustomerChannel baseCustomerChannel, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (customerChannelService.count(new QueryWrapper<BaseCustomerChannel>().eq("org_id",loginOrgId).eq("customer_num", baseCustomerChannel.getCustomerNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseCustomerChannel.setOrgId(loginOrgId);
+        baseCustomerChannel.setCreateBy(getUsername());
+        return success(customerChannelService.save(baseCustomerChannel));
+    }
+
+    @ApiOperation("客户渠道管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseCustomerChannel baseCustomerChannel, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (customerChannelService.count(new QueryWrapper<BaseCustomerChannel>().ne("id",baseCustomerChannel.getId()).eq("org_id",loginOrgId).eq("customerr_num", baseCustomerChannel.getCustomerNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseCustomerChannel.setUpdateBy(getUsername());
+        return success(customerChannelService.updateById(baseCustomerChannel));
+    }
+
+    @ApiOperation("客户渠道管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            customerChannelService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("客户渠道管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(customerChannelService.list(new QueryWrapper<BaseCustomerChannel>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("客户渠道管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(customerChannelService.page(new Page<BaseCustomerChannel>(pageNum,pageSize),new QueryWrapper<BaseCustomerChannel>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("客户渠道管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(customerChannelService.getById(id));
+    }
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseDepartmentController.java

@@ -0,0 +1,93 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseDepartment;
+import com.ruoyi.web.base.service.IBaseDepartmentService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@RestController
+@RequestMapping("/base-department")
+@Api("部门管理")
+public class BaseDepartmentController {
+
+    @Autowired
+    private IBaseDepartmentService baseDepartmentService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("部门管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseDepartment baseDepartment, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseDepartmentService.count(new QueryWrapper<BaseDepartment>().eq("org_id",loginOrgId).eq("department_num", baseDepartment.getDepartmentNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseDepartment.setOrgId(loginOrgId);
+        baseDepartment.setCreateBy(getUsername());
+        return success(baseDepartmentService.save(baseDepartment));
+    }
+
+    @ApiOperation("部门管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseDepartment baseDepartment, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseDepartmentService.count(new QueryWrapper<BaseDepartment>().ne("id",baseDepartment.getId())
+                .eq("org_id",loginOrgId).eq("department_num", baseDepartment.getDepartmentNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseDepartment.setUpdateBy(getUsername());
+        return success(baseDepartmentService.updateById(baseDepartment));
+    }
+
+    @ApiOperation("部门管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseDepartmentService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("部门管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseDepartmentService.list(new QueryWrapper<BaseDepartment>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("部门管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+          ) {
+        return success(baseDepartmentService.page(new Page<BaseDepartment>(pageNum,pageSize),new QueryWrapper<BaseDepartment>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("部门管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseDepartmentService.getById(id));
+    }
+
+}

+ 95 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseEmployeeController.java

@@ -0,0 +1,95 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseEmployee;
+import com.ruoyi.web.base.service.IBaseEmployeeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@RestController
+@RequestMapping("/base-employee")
+@Api("员工管理")
+public class BaseEmployeeController {
+    @Autowired
+    private IBaseEmployeeService employeeService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("员工管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseEmployee baseEmployee, HttpServletRequest request) throws Exception {
+
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (employeeService.count(new QueryWrapper<BaseEmployee>().eq("org_id",loginOrgId).eq("employee_num", baseEmployee.getEmployeeNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseEmployee.setOrgId(loginOrgId);
+        baseEmployee.setCreateBy(getUsername());
+
+        return success(employeeService.save(baseEmployee));
+    }
+
+    @ApiOperation("员工管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseEmployee baseEmployee,HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (employeeService.count(new QueryWrapper<BaseEmployee>().eq("org_id",loginOrgId).eq("employee_num", baseEmployee.getEmployeeNum()).ne("id",baseEmployee.getId())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        baseEmployee.setUpdateBy(getUsername());
+        return success(employeeService.updateById(baseEmployee));
+    }
+
+    @ApiOperation("员工管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            employeeService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("员工管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(employeeService.list(new QueryWrapper<BaseEmployee>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("员工管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(employeeService.page(new Page<BaseEmployee>(pageNum,pageSize),new QueryWrapper<BaseEmployee>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("员工管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(employeeService.getById(id));
+    }
+
+
+}

+ 91 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseFaristAccountController.java

@@ -0,0 +1,91 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseFaristAccount;
+import com.ruoyi.web.base.service.IBaseFaristAccountService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 一级科目 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@RestController
+@RequestMapping("/base-farist-account")
+public class BaseFaristAccountController {
+    @Autowired
+    private IBaseFaristAccountService baseFaristAccountService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("一级科目管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseFaristAccount baseFaristAccount, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseFaristAccountService.count(new QueryWrapper<BaseFaristAccount>().eq("org_id",loginOrgId).eq("farist_num", baseFaristAccount.getFaristNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseFaristAccount.setOrgId(loginOrgId);
+        baseFaristAccount.setCreateBy(getUsername());
+
+        return success(baseFaristAccountService.save(baseFaristAccount));
+    }
+
+    @ApiOperation("一级科目管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseFaristAccount baseFaristAccount, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseFaristAccountService.count(new QueryWrapper<BaseFaristAccount>().ne("id",baseFaristAccount.getId()).eq("org_id",loginOrgId).eq("farist_num", baseFaristAccount.getFaristNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseFaristAccount.setUpdateBy(getUsername());
+        return success(baseFaristAccountService.updateById(baseFaristAccount));
+    }
+
+    @ApiOperation("一级科目管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseFaristAccountService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("一级科目管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(baseFaristAccountService.list(new QueryWrapper<BaseFaristAccount>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("一级科目管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(baseFaristAccountService.page(new Page<BaseFaristAccount>(pageNum,pageSize),new QueryWrapper<BaseFaristAccount>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("一级科目管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseFaristAccountService.getById(id));
+    }
+
+}

+ 89 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseLevelController.java

@@ -0,0 +1,89 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseLevel;
+import com.ruoyi.web.base.service.IBaseLevelService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@RestController
+@RequestMapping("/base-level")
+public class BaseLevelController {
+    @Autowired
+    private IBaseLevelService baseLevelService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("级别管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseLevel baseLevel, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseLevelService.count(new QueryWrapper<BaseLevel>().eq("org_id",loginOrgId).eq("level_no", baseLevel.getLevelName())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        baseLevel.setOrgId(loginOrgId);
+        baseLevel.setCreateBy(getUsername());
+        return success(baseLevelService.save(baseLevel));
+    }
+
+    @ApiOperation("级别管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseLevel baseLevel, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseLevelService.count(new QueryWrapper<BaseLevel>().ne("id",baseLevel.getId()).eq("org_id",loginOrgId).eq("level_no", baseLevel.getLevelName())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseLevel.setUpdateBy(getUsername());
+        return success(baseLevelService.updateById(baseLevel));
+    }
+
+    @ApiOperation("级别管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseLevelService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("级别管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseLevelService.list(new QueryWrapper<BaseLevel>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("级别管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(baseLevelService.page(new Page<BaseLevel>(pageNum,pageSize),new QueryWrapper<BaseLevel>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("级别管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseLevelService.getById(id));
+    }
+}

+ 111 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseLineController.java

@@ -0,0 +1,111 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseLine;
+import com.ruoyi.web.base.domain.BaseMarket;
+import com.ruoyi.web.base.domain.param.LineRequest;
+import com.ruoyi.web.base.domain.param.WiteStripRequest;
+import com.ruoyi.web.base.service.IBaseLineService;
+import com.ruoyi.web.base.service.IBaseMarketService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 物流线 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@RestController
+@RequestMapping("/base-line")
+public class BaseLineController {
+
+    @Autowired
+    private IBaseLineService baseLineService;
+    @Autowired
+    private IBaseMarketService marketService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("物流线管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseLine baseLine, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseLineService.count(new QueryWrapper<BaseLine>().eq("org_id",loginOrgId).eq("line_num", baseLine.getLineNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        baseLine.setOrgId(loginOrgId);
+        baseLine.setCreateBy(getUsername());
+        return success(baseLineService.save(baseLine));
+    }
+
+    @ApiOperation("物流线管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseLine baseLine, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseLineService.count(new QueryWrapper<BaseLine>().ne("id",baseLine.getId()).eq("org_id",loginOrgId).eq("line_num", baseLine.getLineNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseLine.setUpdateBy(getUsername());
+        return success(baseLineService.updateById(baseLine));
+    }
+
+    @ApiOperation("物流线管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseLineService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("物流线管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseLineService.list(new QueryWrapper<BaseLine>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("物流线管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(baseLineService.page(new Page<BaseLine>(pageNum,pageSize),new QueryWrapper<BaseLine>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+    @ApiOperation("物流线市场分页")
+    @PostMapping("/lineMarketPage")
+    public AjaxResult lineMarketPage(
+            @RequestBody LineRequest lineRequest,
+            HttpServletRequest request
+    ) {
+        QueryWrapper<BaseLine> wrapper = new QueryWrapper<BaseLine>().eq("org_id", tokenService.getLoginOrgId(request));
+        Page<BaseLine> page = baseLineService.page(new Page<BaseLine>(lineRequest.getPageNum(), lineRequest.getPageSize()),
+                wrapper);
+        for (BaseLine record : page.getRecords()) {
+            record.setGoods(marketService.list(new QueryWrapper<BaseMarket>().eq("line_num",record.getLineNum())));
+        }
+        return success(page );
+    }
+
+    @ApiOperation("物流线管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseLineService.getById(id));
+    }
+
+}

+ 90 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseMarketController.java

@@ -0,0 +1,90 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseMarket;
+import com.ruoyi.web.base.service.IBaseMarketService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 市场 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@RestController
+@RequestMapping("/base-market")
+public class BaseMarketController {
+
+    @Autowired
+    private IBaseMarketService baseMarketService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("市场管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseMarket baseMarket, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseMarketService.count(new QueryWrapper<BaseMarket>().eq("org_id",loginOrgId).eq("market_num", baseMarket.getMarketNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseMarket.setOrgId(loginOrgId);
+        baseMarket.setCreateBy(getUsername());
+        return success(baseMarketService.save(baseMarket));
+    }
+
+    @ApiOperation("市场管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseMarket baseMarket, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseMarketService.count(new QueryWrapper<BaseMarket>().ne("id",baseMarket.getId()).eq("org_id",loginOrgId).eq("marke_num", baseMarket.getMarketNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseMarket.setUpdateBy(getUsername());
+        return success(baseMarketService.updateById(baseMarket));
+    }
+
+    @ApiOperation("市场管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseMarketService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("市场管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseMarketService.list(new QueryWrapper<BaseMarket>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("市场管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(baseMarketService.page(new Page<BaseMarket>(pageNum,pageSize),new QueryWrapper<BaseMarket>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("市场管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseMarketService.getById(id));
+    }
+
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseMaterialController.java

@@ -0,0 +1,93 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseMaterial;
+import com.ruoyi.web.base.service.IBaseMaterialService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@RestController
+@RequestMapping("/base-material")
+public class BaseMaterialController {
+    @Autowired
+    private IBaseMaterialService baseMaterialService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("物料管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseMaterial baseMaterial, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseMaterialService.count(new QueryWrapper<BaseMaterial>().eq("org_id",loginOrgId).eq("goods_num", baseMaterial.getGoodsNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        baseMaterial.setOrgId(loginOrgId);
+        baseMaterial.setCreateBy(getUsername());
+        return success(baseMaterialService.save(baseMaterial));
+    }
+
+    @ApiOperation("物料管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseMaterial baseMaterial, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseMaterialService.count(new QueryWrapper<BaseMaterial>().ne("id",baseMaterial.getId()).eq("org_id",loginOrgId).eq("goods_num", baseMaterial.getGoodsNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseMaterial.setUpdateBy(getUsername());
+        return success(baseMaterialService.updateById(baseMaterial));
+    }
+
+    @ApiOperation("物料管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseMaterialService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("物料管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( @RequestBody Map<String, String> paramsMap,HttpServletRequest request){
+           return success(baseMaterialService.list(new QueryWrapper<BaseMaterial>().eq("org_id",tokenService.getLoginOrgId(request))));
+
+    }
+
+    @ApiOperation("物料管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(baseMaterialService.page(new Page<BaseMaterial>(pageNum,pageSize),new QueryWrapper<BaseMaterial>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("物料管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseMaterialService.getById(id));
+    }
+
+
+}

+ 90 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BasePriceTypeController.java

@@ -0,0 +1,90 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BasePriceType;
+import com.ruoyi.web.base.service.IBasePriceTypeService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 价格类型 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@RestController
+@RequestMapping("/base-price-type")
+public class BasePriceTypeController {
+    @Autowired
+    private IBasePriceTypeService basePriceTypeService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("价格类型管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BasePriceType basePriceType, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (basePriceTypeService.count(new QueryWrapper<BasePriceType>().eq("org_id",loginOrgId).eq("price_type_num", basePriceType.getPriceTypeNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        basePriceType.setOrgId(loginOrgId);
+        basePriceType.setCreateBy(getUsername());
+
+        return success(basePriceTypeService.save(basePriceType));
+    }
+
+    @ApiOperation("价格类型管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BasePriceType basePriceType, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (basePriceTypeService.count(new QueryWrapper<BasePriceType>().ne("id",basePriceType.getId()).eq("org_id",loginOrgId).eq("price_type_num", basePriceType.getPriceTypeNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        basePriceType.setUpdateBy(getUsername());
+        return success(basePriceTypeService.updateById(basePriceType));
+    }
+
+    @ApiOperation("价格类型管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            basePriceTypeService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("价格类型管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(basePriceTypeService.list(new QueryWrapper<BasePriceType>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("价格类型管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(basePriceTypeService.page(new Page<BasePriceType>(pageNum,pageSize),new QueryWrapper<BasePriceType>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("价格类型管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(basePriceTypeService.getById(id));
+    }
+}

+ 186 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseProductCategoryController.java

@@ -0,0 +1,186 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseMaterial;
+import com.ruoyi.web.base.domain.BaseProductCategory;
+import com.ruoyi.web.base.service.IBaseMaterialService;
+import com.ruoyi.web.base.service.IBaseProductCategoryService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.ruoyi.common.core.domain.AjaxResult.error;
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 货品类别 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@RestController
+@RequestMapping("/base-product-category")
+public class BaseProductCategoryController {
+    @Autowired
+    private IBaseProductCategoryService baseProductCategoryService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private IBaseMaterialService baseMaterialService;
+
+    @ApiOperation("货品类别管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseProductCategory baseProductCategory, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseProductCategoryService.count(new QueryWrapper<BaseProductCategory>().eq("org_id",loginOrgId).eq("num", baseProductCategory.getNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseProductCategory.setOrgId(loginOrgId);
+        baseProductCategory.setCreateBy(getUsername());
+
+        return success(baseProductCategoryService.save(baseProductCategory));
+    }
+
+    @ApiOperation("货品类别管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseProductCategory baseProductCategory, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseProductCategoryService.count(new QueryWrapper<BaseProductCategory>().ne("id",baseProductCategory.getId()).eq("org_id",loginOrgId).eq("num", baseProductCategory.getNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseProductCategory.setUpdateBy(getUsername());
+        return success(baseProductCategoryService.updateById(baseProductCategory));
+    }
+
+    @ApiOperation("货品类别管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseProductCategoryService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("货品类别管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(baseProductCategoryService.list(new QueryWrapper<BaseProductCategory>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("货品类别管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(baseProductCategoryService.page(new Page<BaseProductCategory>(pageNum,pageSize),new QueryWrapper<BaseProductCategory>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("货品类别管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseProductCategoryService.getById(id));
+    }
+
+    @ApiOperation("货品类别结构")
+    @PostMapping("/productStructure")
+    @Transactional
+    public AjaxResult productStructure(@RequestBody Map<String, String> paramsMap){
+        String parentId = paramsMap.get("parentId");
+        String ids = paramsMap.get("ids");
+        if (StringUtils.isNotEmpty(parentId) && StringUtils.isNotEmpty(ids)){
+            String[] split = ids.split(",");
+            BaseProductCategory baseProductCategory = new BaseProductCategory();
+            baseProductCategory.setParentId(Integer.parseInt(parentId));
+            baseProductCategoryService.update(baseProductCategory ,new UpdateWrapper<BaseProductCategory>().in("id", split));
+
+            return success();
+        }
+        return error("请传入编号");
+    }
+
+    @ApiOperation("树状货品类别管理列表")
+    @PostMapping("/listTree")
+    public AjaxResult listTree( HttpServletRequest request){
+        List<BaseProductCategory> productCategories = baseProductCategoryService.list(new QueryWrapper<BaseProductCategory>().eq("org_id", tokenService.getLoginOrgId(request)));
+
+        return success(buildTree(productCategories,0));
+    }
+
+    @ApiOperation("根据类别获取全部物料")
+    @PostMapping("/listMaterialByGoodsType")
+    public AjaxResult listAll( @RequestBody Map<String, String> paramsMap,HttpServletRequest request){
+        String goodsType = paramsMap.get("goodsType");
+
+        if (StringUtils.isEmpty(goodsType)){
+            return success(baseMaterialService.list(new QueryWrapper<BaseMaterial>().eq("org_id", tokenService.getLoginOrgId(request))));
+        }else {
+            List<BaseProductCategory> productCategories = baseProductCategoryService.list(new QueryWrapper<BaseProductCategory>().eq("org_id", tokenService.getLoginOrgId(request)));
+            BaseProductCategory num = baseProductCategoryService.getOne(new QueryWrapper<BaseProductCategory>().eq("num", goodsType));
+            List<BaseProductCategory> productCategories1 = buildTree(productCategories, num.getId());
+            List<String> collect = productCategories1.stream().map(BaseProductCategory::getNum).collect(Collectors.toList());
+            collect.add(goodsType);
+
+            return success(baseMaterialService
+                    .list(new QueryWrapper<BaseMaterial>().eq("org_id", tokenService.getLoginOrgId(request))
+                            .in("goods_type",collect)));
+
+
+        }
+
+
+    }
+
+
+    public List<BaseProductCategory> buildTree(List<BaseProductCategory> nodes, Integer maxId ) {
+        // 1. 创建ID到节点的映射
+        Map<Integer, BaseProductCategory> nodeMap = new HashMap<>();
+        for (BaseProductCategory node : nodes) {
+            nodeMap.put(node.getId(), node);
+        }
+
+        List<BaseProductCategory> roots = new ArrayList<>();
+        // 2. 构建父子关系
+        for (BaseProductCategory node : nodes) {
+            Integer parentId = node.getParentId();
+            if (parentId.equals(maxId)) {
+                roots.add(node); // 顶级节点直接加入根列表
+            } else {
+                BaseProductCategory parent = nodeMap.get(parentId);
+                if (parent != null) {
+                    if (parent.getChild() != null){
+                        parent.getChild().add(node);
+                    }else {
+                        List<BaseProductCategory> list= new ArrayList<BaseProductCategory>();
+                        list.add(node);
+                        parent.setChild(list);
+                    }
+
+
+                } else {
+                    // 处理无效parentId:可抛异常或作为根节点
+
+//                    roots.add(node);
+                }
+            }
+        }
+        return roots;
+    }
+
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseProductTypeController.java

@@ -0,0 +1,93 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseProductType;
+import com.ruoyi.web.base.service.IBaseProductTypeService;
+import com.ruoyi.web.base.service.IBaseProductTypeService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 产品类型 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-06
+ */
+@RestController
+@RequestMapping("/base-product-type")
+public class BaseProductTypeController {
+
+    @Autowired
+    private IBaseProductTypeService  baseProductTypeService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("产品类型管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseProductType baseProductType, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseProductTypeService.count(new QueryWrapper<BaseProductType>().eq("org_id",loginOrgId).eq("type_num", baseProductType.getTypeNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseProductType.setOrgId(loginOrgId);
+        baseProductType.setCreateBy(getUsername());
+
+        return success(baseProductTypeService.save(baseProductType));
+    }
+
+    @ApiOperation("仓库管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseProductType baseProductType, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseProductTypeService.count(new QueryWrapper<BaseProductType>().ne("id",baseProductType.getId()).eq("org_id",loginOrgId).eq("type_num", baseProductType.getTypeNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseProductType.setUpdateBy(getUsername());
+        return success(baseProductTypeService.updateById(baseProductType));
+    }
+
+    @ApiOperation("仓库管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseProductTypeService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("仓库管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(baseProductTypeService.list(new QueryWrapper<BaseProductType>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("仓库管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(baseProductTypeService.page(new Page<BaseProductType>(pageNum,pageSize),new QueryWrapper<BaseProductType>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("仓库管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseProductTypeService.getById(id));
+    }
+
+}

+ 90 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseSalesTerritoryController.java

@@ -0,0 +1,90 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseSalesTerritory;
+import com.ruoyi.web.base.service.IBaseSalesTerritoryService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 销售区域 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@RestController
+@RequestMapping("/base-sales-territory")
+public class BaseSalesTerritoryController {
+    @Autowired
+    private IBaseSalesTerritoryService baseSalesTerritoryService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("销售区域管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseSalesTerritory baseSalesTerritory, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseSalesTerritoryService.count(new QueryWrapper<BaseSalesTerritory>().eq("org_id",loginOrgId).eq("sales_territory_num", baseSalesTerritory.getSalesTerritoryNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        baseSalesTerritory.setOrgId(loginOrgId);
+        baseSalesTerritory.setCreateBy(getUsername());
+        return success(baseSalesTerritoryService.save(baseSalesTerritory));
+    }
+
+    @ApiOperation("销售区域管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseSalesTerritory baseSalesTerritory, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseSalesTerritoryService.count(new QueryWrapper<BaseSalesTerritory>().ne("id",baseSalesTerritory.getId()).eq("org_id",loginOrgId).eq("sales_territory_num", baseSalesTerritory.getSalesTerritoryNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseSalesTerritory.setUpdateBy(getUsername());
+        return success(baseSalesTerritoryService.updateById(baseSalesTerritory));
+    }
+
+    @ApiOperation("销售区域管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseSalesTerritoryService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("销售区域管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseSalesTerritoryService.list(new QueryWrapper<BaseSalesTerritory>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("销售区域管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(baseSalesTerritoryService.page(new Page<BaseSalesTerritory>(pageNum,pageSize),new QueryWrapper<BaseSalesTerritory>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("销售区域管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseSalesTerritoryService.getById(id));
+    }
+
+}

+ 92 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseSubAccountController.java

@@ -0,0 +1,92 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseSubAccount;
+import com.ruoyi.web.base.service.IBaseSubAccountService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 二级科目 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@RestController
+@RequestMapping("/base-sub-account")
+public class BaseSubAccountController {
+    @Autowired
+    private IBaseSubAccountService baseSubAccountService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("二级科目管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseSubAccount baseSubAccount, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseSubAccountService.count(new QueryWrapper<BaseSubAccount>().eq("org_id",loginOrgId).eq("sub_num", baseSubAccount.getSubNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseSubAccount.setOrgId(loginOrgId);
+        baseSubAccount.setCreateBy(getUsername());
+
+        return success(baseSubAccountService.save(baseSubAccount));
+    }
+
+    @ApiOperation("二级科目管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseSubAccount baseSubAccount, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseSubAccountService.count(new QueryWrapper<BaseSubAccount>().ne("id",baseSubAccount.getId()).eq("org_id",loginOrgId).eq("sub_num", baseSubAccount.getSubNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseSubAccount.setUpdateBy(getUsername());
+        return success(baseSubAccountService.updateById(baseSubAccount));
+    }
+
+    @ApiOperation("二级科目管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseSubAccountService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("二级科目管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(baseSubAccountService.list(new QueryWrapper<BaseSubAccount>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("二级科目管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(baseSubAccountService.page(new Page<BaseSubAccount>(pageNum,pageSize),new QueryWrapper<BaseSubAccount>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("二级科目管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseSubAccountService.getById(id));
+    }
+
+
+}

+ 89 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseSupplySourceController.java

@@ -0,0 +1,89 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseSupplySource;
+import com.ruoyi.web.base.service.IBaseSupplySourceService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 供应来源 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@RestController
+@RequestMapping("/base-supply-source")
+public class BaseSupplySourceController {
+    @Autowired
+    private IBaseSupplySourceService baseSupplySourceService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("供应来源管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseSupplySource baseSupplySource, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseSupplySourceService.count(new QueryWrapper<BaseSupplySource>().eq("org_id",loginOrgId).eq("supply_source_num", baseSupplySource.getSupplySourceNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        baseSupplySource.setOrgId(loginOrgId);
+        baseSupplySource.setCreateBy(getUsername());
+        return success(baseSupplySourceService.save(baseSupplySource));
+    }
+
+    @ApiOperation("供应来源管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseSupplySource baseSupplySource, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseSupplySourceService.count(new QueryWrapper<BaseSupplySource>().ne("id",baseSupplySource.getId()).eq("org_id",loginOrgId).eq("supply_source_num", baseSupplySource.getSupplySourceNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseSupplySource.setUpdateBy(getUsername());
+        return success(baseSupplySourceService.updateById(baseSupplySource));
+    }
+
+    @ApiOperation("供应来源管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseSupplySourceService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("供应来源管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseSupplySourceService.list(new QueryWrapper<BaseSupplySource>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("供应来源管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(baseSupplySourceService.page(new Page<BaseSupplySource>(pageNum,pageSize),new QueryWrapper<BaseSupplySource>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("供应来源管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseSupplySourceService.getById(id));
+    }
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseUnitController.java

@@ -0,0 +1,93 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseUnit;
+import com.ruoyi.web.base.service.IBaseUnitService;
+import com.ruoyi.web.base.service.IBaseUnitService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 单位 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-06
+ */
+@RestController
+@RequestMapping("/base-unit")
+public class BaseUnitController {
+    @Autowired
+    private IBaseUnitService baseUnitService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("单位管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseUnit baseUnit, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseUnitService.count(new QueryWrapper<BaseUnit>().eq("org_id",loginOrgId).eq("unit_name", baseUnit.getUnitName())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseUnit.setOrgId(loginOrgId);
+        baseUnit.setCreateBy(getUsername());
+
+        return success(baseUnitService.save(baseUnit));
+    }
+
+    @ApiOperation("仓库管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseUnit baseUnit, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseUnitService.count(new QueryWrapper<BaseUnit>().ne("id",baseUnit.getId()).eq("org_id",loginOrgId).eq("unit_name", baseUnit.getUnitName())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseUnit.setUpdateBy(getUsername());
+        return success(baseUnitService.updateById(baseUnit));
+    }
+
+    @ApiOperation("仓库管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseUnitService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("仓库管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(baseUnitService.list(new QueryWrapper<BaseUnit>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("仓库管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(baseUnitService.page(new Page<BaseUnit>(pageNum,pageSize),new QueryWrapper<BaseUnit>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("仓库管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseUnitService.getById(id));
+    }
+
+
+}

+ 90 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/BaseVarietyController.java

@@ -0,0 +1,90 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.BaseVariety;
+import com.ruoyi.web.base.service.IBaseVarietyService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@RestController
+@RequestMapping("/base-variety")
+public class BaseVarietyController {
+    @Autowired
+    private IBaseVarietyService baseVarietyService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("品种管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BaseVariety baseVariety, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseVarietyService.count(new QueryWrapper<BaseVariety>().eq("org_id",loginOrgId).eq("variety_no", baseVariety.getVarietyNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        baseVariety.setOrgId(loginOrgId);
+        baseVariety.setCreateBy(getUsername());
+        return success(baseVarietyService.save(baseVariety));
+    }
+
+    @ApiOperation("品种管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody BaseVariety baseVariety, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (baseVarietyService.count(new QueryWrapper<BaseVariety>().ne("id",baseVariety.getId()).eq("org_id",loginOrgId).eq("variety_no", baseVariety.getVarietyNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        baseVariety.setUpdateBy(getUsername());
+        return success(baseVarietyService.updateById(baseVariety));
+    }
+
+    @ApiOperation("品种管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            baseVarietyService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("品种管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        return success(baseVarietyService.list(new QueryWrapper<BaseVariety>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("品种管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize,HttpServletRequest request
+    ) {
+        return success(baseVarietyService.page(new Page<BaseVariety>(pageNum,pageSize),new QueryWrapper<BaseVariety>().eq("org_id",tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("品种管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(baseVarietyService.getById(id));
+    }
+
+}

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/MaterialBacthController.java

@@ -0,0 +1,20 @@
+package com.ruoyi.web.base.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 物料批次初始化 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-04
+ */
+@RestController
+@RequestMapping("/material-bacth")
+public class MaterialBacthController {
+
+}

+ 91 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureApportionController.java

@@ -0,0 +1,91 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProcureApportion;
+import com.ruoyi.web.base.service.IProcureApportionService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 分摊 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-05
+ */
+@RestController
+@RequestMapping("/procure-apportion")
+public class ProcureApportionController {
+    @Autowired
+    private IProcureApportionService procureApportionService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("分摊管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProcureApportion procureApportion, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureApportionService.count(new QueryWrapper<ProcureApportion>().eq("org_id",loginOrgId).eq("goods_num", procureApportion.getGoodsNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        procureApportion.setOrgId(loginOrgId);
+        procureApportion.setCreateBy(getUsername());
+
+        return success(procureApportionService.save(procureApportion));
+    }
+
+    @ApiOperation("分摊管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProcureApportion procureApportion, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureApportionService.count(new QueryWrapper<ProcureApportion>().ne("id",procureApportion.getId()).eq("org_id",loginOrgId).eq("goods_num", procureApportion.getGoodsNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        procureApportion.setUpdateBy(getUsername());
+        return success(procureApportionService.updateById(procureApportion));
+    }
+
+    @ApiOperation("分摊管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            procureApportionService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("分摊管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(procureApportionService.list(new QueryWrapper<ProcureApportion>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("分摊管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(procureApportionService.page(new Page<ProcureApportion>(pageNum,pageSize),new QueryWrapper<ProcureApportion>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("分摊管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(procureApportionService.getById(id));
+    }
+
+}

+ 152 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureQuotationController.java

@@ -0,0 +1,152 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProcureQuotation;
+import com.ruoyi.web.base.domain.ProcureQuotationGoods;
+import com.ruoyi.web.base.service.IProcureQuotationService;
+import com.ruoyi.web.base.service.IProcureQuotationGoodsService;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+import static com.ruoyi.web.base.util.NumUtils.generateString;
+import static com.ruoyi.web.base.util.NumUtils.substringToInt;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+/**
+ * <p>
+ * 供应商报价单 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-05
+ */
+@RestController
+@RequestMapping("/procure-quotation")
+public class ProcureQuotationController {
+    @Autowired
+    private IProcureQuotationService procureQuotationService;
+    @Autowired
+    private IProcureQuotationGoodsService goodsService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("供应商报价单添加")
+    @PostMapping("/add")
+    @Transactional
+    public AjaxResult add(@RequestBody ProcureQuotation procureQuotation, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureQuotationService.count(new QueryWrapper<ProcureQuotation>().eq("org_id",loginOrgId).eq("quotation_num", procureQuotation.getQuotationNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        String username = getUsername();
+        procureQuotation.setOrgId(loginOrgId);
+        procureQuotation.setCreateBy(username);
+        List<ProcureQuotationGoods> goods = procureQuotation.getGoods();
+        for (ProcureQuotationGoods good : goods) {
+            good.setOrgId(loginOrgId);
+            good.setCreateBy(username);
+            good.setQuotationNum(procureQuotation.getQuotationNum());
+            goodsService.save(good);
+        }
+
+        return success(procureQuotationService.save(procureQuotation));
+    }
+
+    @ApiOperation("供应商报价单修改")
+    @PostMapping("/edit")
+    @Transactional
+    public AjaxResult edit(@RequestBody ProcureQuotation procureQuotation, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureQuotationService.count(new QueryWrapper<ProcureQuotation>().ne("id",procureQuotation.getId()).eq("org_id",loginOrgId).eq("quotation_num", procureQuotation.getQuotationNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        String username = getUsername();
+        procureQuotation.setOrgId(loginOrgId);
+        procureQuotation.setCreateBy(username);
+        List<ProcureQuotationGoods> goods = procureQuotation.getGoods();
+        goodsService.remove(new QueryWrapper<ProcureQuotationGoods>().eq("quotation_num",procureQuotation.getQuotationNum()));
+        for (ProcureQuotationGoods good : goods) {
+            good.setOrgId(loginOrgId);
+            good.setCreateBy(username);
+            good.setQuotationNum(procureQuotation.getQuotationNum());
+            goodsService.save(good);
+        }
+        procureQuotation.setUpdateBy(username);
+
+        return success(procureQuotationService.updateById(procureQuotation));
+    }
+
+    @ApiOperation("供应商报价单删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            procureQuotationService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("供应商报价单列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        List<ProcureQuotation> org_id = procureQuotationService.list(new QueryWrapper<ProcureQuotation>().eq("org_id", tokenService.getLoginOrgId(request)));
+        for (ProcureQuotation procureQuotation : org_id) {
+            procureQuotation.setGoods(goodsService.list(new QueryWrapper<ProcureQuotationGoods>().eq("quotation_num",procureQuotation.getQuotationNum())));
+        }
+        return success(org_id);
+    }
+
+    @ApiOperation("供应商报价单分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        Page<ProcureQuotation> org_id = procureQuotationService.page(new Page<ProcureQuotation>(pageNum, pageSize), new QueryWrapper<ProcureQuotation>().eq("org_id", tokenService.getLoginOrgId(request)));
+        for (ProcureQuotation procureQuotation : org_id.getRecords()) {
+            procureQuotation.setGoods(goodsService.list(new QueryWrapper<ProcureQuotationGoods>().eq("quotation_num",procureQuotation.getQuotationNum())));
+        }
+        return success(org_id);
+    }
+
+    @ApiOperation("供应商报价单详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        ProcureQuotation byId = procureQuotationService.getById(id);
+        byId.setGoods(goodsService.list(new QueryWrapper<ProcureQuotationGoods>().eq("quotation_num",byId.getQuotationNum())));
+        return success(byId);
+    }
+
+    @ApiOperation("获取最新报价单编号")
+    @PostMapping("/getQuotaNum")
+    public AjaxResult getQuotaNum(HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        ProcureQuotation one = procureQuotationService.getOne(new QueryWrapper<ProcureQuotation>().eq("org_id", loginOrgId).orderByDesc("id").last("limit 1"));
+        if (ObjectUtils.isEmpty(one)){
+
+            return success(generateString("bj",1));
+        }
+        String quotationNum = one.getQuotationNum();
+
+        return success(generateString("bj",substringToInt(quotationNum)));
+
+    }
+
+
+}

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureQuotationGoodsController.java

@@ -0,0 +1,20 @@
+package com.ruoyi.web.base.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 供应商报价单,货品表 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-05
+ */
+@RestController
+@RequestMapping("/procure-quotation-goods")
+public class ProcureQuotationGoodsController {
+
+}

+ 193 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureReceivingController.java

@@ -0,0 +1,193 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProcureQuotation;
+import com.ruoyi.web.base.domain.ProcureQuotationGoods;
+import com.ruoyi.web.base.domain.ProcureReceiving;
+import com.ruoyi.web.base.domain.ProcureReceivingGoods;
+import com.ruoyi.web.base.service.IProcureReceivingGoodsService;
+import com.ruoyi.web.base.service.IProcureReceivingService;
+import com.ruoyi.web.stock.domain.WarehouseIn;
+import com.ruoyi.web.stock.domain.WarehouseInGoods;
+import com.ruoyi.web.stock.service.IRoleOrgService;
+import com.ruoyi.web.stock.service.IWarehouseInboundService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.MapUtils.convertValue;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+import static com.ruoyi.web.base.util.NumUtils.generateString;
+import static com.ruoyi.web.base.util.NumUtils.substringToInt;
+
+/**
+ * <p>
+ * 采购入库单 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-05
+ */
+@RestController
+@RequestMapping("/procure-receiving")
+public class ProcureReceivingController extends BaseController {
+    @Autowired
+    private IProcureReceivingService procureReceivingService;
+    @Autowired
+    private IProcureReceivingGoodsService goodsService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private IRoleOrgService roleOrgService;
+
+    @Autowired
+    private IWarehouseInboundService warehouseInboundService;
+
+    @ApiOperation("获取采购入库单编号")
+    @PostMapping("/getReceivingNum")
+    public AjaxResult getQuotaNum(HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        ProcureReceiving one = procureReceivingService.getOne(new QueryWrapper<ProcureReceiving>().eq("org_id", loginOrgId).orderByDesc("id").last("limit 1"));
+        if (ObjectUtils.isEmpty(one)){
+
+            return success(generateString("cg",1));
+        }
+        String quotationNum = one.getReceivingNum();
+
+        return success(generateString("bj",substringToInt(quotationNum)));
+
+    }
+
+    @ApiOperation("采购入库单添加")
+    @PostMapping("/add")
+    @Transactional
+    public AjaxResult add(@RequestBody ProcureReceiving procureReceiving, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureReceivingService.count(new QueryWrapper<ProcureReceiving>().eq("org_id",loginOrgId).eq("receiving_num", procureReceiving.getReceivingNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        String username = getUsername();
+        procureReceiving.setOrgId(loginOrgId);
+        procureReceiving.setCreateBy(username);
+        List<ProcureReceivingGoods> goods = procureReceiving.getGoods();
+        for (ProcureReceivingGoods good : goods) {
+            good.setOrgId(loginOrgId);
+            good.setCreateBy(username);
+            good.setReceivingNum(procureReceiving.getReceivingNum());
+            goodsService.save(good);
+        }
+        //入库存
+        List<WarehouseInGoods> inGoods = goods.stream()
+                .map(item -> {
+                    WarehouseInGoods good = new WarehouseInGoods();
+                    good.setGoodsNum(item.getGoodsNum());
+                    good.setGoodsName(item.getGoodsName());
+                    good.setGoodsSpec(item.getGoodsSpec());
+                    good.setGoodsType("");
+                    good.setWarehouseNo(item.getWarehouseNo());
+                    good.setWarehouseName(item.getWarehouseName());
+                    good.setBatchNo(item.getBatch());
+                    good.setBaseUnit(item.getBaseUnit());
+                    good.setBaseQty(BigDecimal.valueOf(Double.parseDouble(item.getBaseNum())));
+                    good.setAssistantUnit(item.getAssUnit());
+                    good.setAssistantQty(BigDecimal.valueOf(Double.parseDouble(item.getAssNum())));
+                    good.setAmount(BigDecimal.valueOf(Double.parseDouble(item.getAmount())));
+                    good.setRemark(item.getRemark());
+
+                    return good;
+                })
+                .collect(Collectors.toList());
+        WarehouseIn warehouseInEntity = new WarehouseIn();
+        warehouseInEntity.setSheetDate(procureReceiving.getReceivingDate());
+        warehouseInEntity.setProductionType(procureReceiving.getOrderType());
+        warehouseInEntity.setTotalAmount(BigDecimal.valueOf(Double.parseDouble(procureReceiving.getTotalAmount())));
+        warehouseInEntity.setOrgId(currentOrgId());
+        warehouseInEntity.setGoodsList(inGoods);
+        warehouseInboundService.submitInbound(warehouseInEntity, getUsername());
+        return success(procureReceivingService.save(procureReceiving));
+    }
+
+    @ApiOperation("采购入库单修改")
+    @PostMapping("/edit")
+    @Transactional
+    public AjaxResult edit(@RequestBody ProcureReceiving procureReceiving, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureReceivingService.count(new QueryWrapper<ProcureReceiving>().ne("id",procureReceiving.getId()).eq("org_id",loginOrgId).eq("receiving_num", procureReceiving.getReceivingNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+
+        String username = getUsername();
+        procureReceiving.setOrgId(loginOrgId);
+        procureReceiving.setCreateBy(username);
+        List<ProcureReceivingGoods> goods = procureReceiving.getGoods();
+        goodsService.remove(new QueryWrapper<ProcureReceivingGoods>().eq("receiving_num",procureReceiving.getReceivingNum()));
+        for (ProcureReceivingGoods good : goods) {
+            good.setOrgId(loginOrgId);
+            good.setCreateBy(username);
+            good.setReceivingNum(procureReceiving.getReceivingNum());
+            goodsService.save(good);
+        }
+        procureReceiving.setUpdateBy(username);
+
+        return success(procureReceivingService.updateById(procureReceiving));
+    }
+
+    @ApiOperation("采购入库单删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            procureReceivingService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("采购入库单列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        List<ProcureReceiving> org_id = procureReceivingService.list(new QueryWrapper<ProcureReceiving>().eq("org_id", tokenService.getLoginOrgId(request)));
+        for (ProcureReceiving procureQuotation : org_id) {
+            procureQuotation.setGoods(goodsService.list(new QueryWrapper<ProcureReceivingGoods>().eq("receiving_num",procureQuotation.getReceivingNum())));
+        }
+        return success(org_id);
+    }
+
+    @ApiOperation("采购入库单分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        Page<ProcureReceiving> org_id = procureReceivingService.page(new Page<ProcureReceiving>(pageNum, pageSize), new QueryWrapper<ProcureReceiving>().eq("org_id", tokenService.getLoginOrgId(request)));
+        for (ProcureReceiving procureQuotation : org_id.getRecords()) {
+            procureQuotation.setGoods(goodsService.list(new QueryWrapper<ProcureReceivingGoods>().eq("receiving_num",procureQuotation.getReceivingNum())));
+        }
+        return success(org_id);
+    }
+
+    @ApiOperation("采购入库单详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        ProcureReceiving byId = procureReceivingService.getById(id);
+        byId.setGoods(goodsService.list(new QueryWrapper<ProcureReceivingGoods>().eq("receiving_num",byId.getReceivingNum())));
+        return success(byId);
+    }
+
+    private String currentOrgId() {
+        return roleOrgService.resolveOrgId(getUserId(), getDeptId());
+    }
+}

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureReceivingGoodsController.java

@@ -0,0 +1,20 @@
+package com.ruoyi.web.base.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 供应商入库单,货品表 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-05
+ */
+@RestController
+@RequestMapping("/procure-receiving-goods")
+public class ProcureReceivingGoodsController {
+
+}

+ 119 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureSettlementController.java

@@ -0,0 +1,119 @@
+//package com.ruoyi.web.baseandprocure.controller;
+//
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+//import com.ruoyi.common.core.domain.AjaxResult;
+//import com.ruoyi.framework.web.service.TokenService;
+//import com.ruoyi.web.baseandprocure.domain.ProcureSettlement;
+//import com.ruoyi.web.baseandprocure.domain.ProcureSettlementGoods;
+//import com.ruoyi.web.baseandprocure.service.IProcureSettlementGoodsService;
+//import com.ruoyi.web.baseandprocure.service.IProcureSettlementService;
+//import com.ruoyi.web.baseandprocure.service.IProcureSettlementGoodsService;
+//import com.ruoyi.web.baseandprocure.service.IProcureSettlementService;
+//import io.swagger.annotations.ApiOperation;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.transaction.annotation.Transactional;
+//import org.springframework.web.bind.annotation.*;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import java.util.List;
+//import java.util.Map;
+//
+//import static com.ruoyi.common.core.domain.AjaxResult.success;
+//import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+//
+///**
+// * <p>
+// * 采购结算单 前端控制器
+// * </p>
+// *
+// * @author author
+// * @since 2026-02-05
+// */
+//@RestController
+//@RequestMapping("/procure-settlement")
+//public class ProcureSettlementController {
+//    @Autowired
+//    private IProcureSettlementService settlementService;
+//    @Autowired
+//    private IProcureSettlementGoodsService goodsService;
+//    @Autowired
+//    private TokenService tokenService;
+//
+//    @ApiOperation("供应商报价单添加")
+//    @PostMapping("/add")
+//    @Transactional
+//    public AjaxResult add(@RequestBody ProcureSettlement procureSettlement, HttpServletRequest request) throws Exception {
+//        String loginOrgId = tokenService.getLoginOrgId(request);
+//
+//        String username = getUsername();
+//        procureSettlement.setOrgId(loginOrgId);
+//        procureSettlement.setCreateBy(username);
+//        List<ProcureSettlementGoods> goods = procureSettlement.getGoods();
+//        for (ProcureSettlementGoods good : goods) {
+//            good.setOrgId(loginOrgId);
+//            good.setCreateBy(username);
+//            good.setReceivingNum(procureSettlement.getReceivingNum());
+//            goodsService.save(good);
+//        }
+//
+//        return success(settlementService.save(procureSettlement));
+//    }
+//
+//    @ApiOperation("供应商报价单修改")
+//    @PostMapping("/edit")
+//    @Transactional
+//    public AjaxResult edit(@RequestBody ProcureSettlement procureSettlement, HttpServletRequest request) throws Exception {
+//        String loginOrgId = tokenService.getLoginOrgId(request);
+//        if (settlementService.count(new QueryWrapper<ProcureSettlement>().ne("id",procureSettlement.getId()).eq("org_id",loginOrgId).eq("receiving_num", procureSettlement.getReceivingNum())) >0 ){
+//            throw new Exception("该编号已存在");
+//        }
+//
+//        String username = getUsername();
+//        procureSettlement.setOrgId(loginOrgId);
+//        procureSettlement.setCreateBy(username);
+//        List<ProcureSettlementGoods> goods = procureSettlement.getGoods();
+//        goodsService.remove(new QueryWrapper<ProcureSettlementGoods>().eq("receiving_num",procureSettlement.getReceivingNum()));
+//        for (ProcureSettlementGoods good : goods) {
+//            good.setOrgId(loginOrgId);
+//            good.setCreateBy(username);
+//            good.setReceivingNum(procureSettlement.getReceivingNum());
+//            goodsService.save(good);
+//        }
+//        procureSettlement.setUpdateBy(username);
+//
+//        return success(settlementService.updateById(procureSettlement));
+//    }
+//
+//    @ApiOperation("供应商报价单删除")
+//    @PostMapping("/delete")
+//    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+//        String ids = paramsMap.get("ids");
+//        for (String s : ids.split(",")) {
+//            settlementService.removeById(s);
+//        }
+//        return success();
+//    }
+//
+//    @ApiOperation("供应商报价单列表")
+//    @PostMapping("/list")
+//    public AjaxResult listAll( HttpServletRequest request){
+//
+//        return success(settlementService.list(new QueryWrapper<ProcureSettlement>().eq("org_id", tokenService.getLoginOrgId(request))));
+//    }
+//
+//    @ApiOperation("供应商报价单分页")
+//    @GetMapping("/page")
+//    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+//            , HttpServletRequest request) {
+//        return success(settlementService.page(new Page<ProcureSettlement>(pageNum,pageSize),new QueryWrapper<ProcureSettlement>().eq("org_id", tokenService.getLoginOrgId(request))));
+//    }
+//
+//    @ApiOperation("供应商报价单详情")
+//    @PostMapping("/listById")
+//    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+//        String id = paramsMap.get("id");
+//        return success(settlementService.getById(id));
+//    }
+//}

+ 91 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureSettlementGoodsController.java

@@ -0,0 +1,91 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProcureSettlementGoods;
+import com.ruoyi.web.base.service.IProcureSettlementGoodsService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 采购结算单,物料单 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-05
+ */
+@RestController
+@RequestMapping("/procure-settlement-goods")
+public class ProcureSettlementGoodsController {
+    @Autowired
+    private IProcureSettlementGoodsService procureSettlementGoodsService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("分摊管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProcureSettlementGoods procureSettlementGoods, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureSettlementGoodsService.count(new QueryWrapper<ProcureSettlementGoods>().eq("org_id",loginOrgId).eq("settlement_no", procureSettlementGoods.getSettlementNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        procureSettlementGoods.setOrgId(loginOrgId);
+        procureSettlementGoods.setCreateBy(getUsername());
+
+        return success(procureSettlementGoodsService.save(procureSettlementGoods));
+    }
+
+    @ApiOperation("分摊管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProcureSettlementGoods procureSettlementGoods, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureSettlementGoodsService.count(new QueryWrapper<ProcureSettlementGoods>().ne("id",procureSettlementGoods.getId()).eq("org_id",loginOrgId).eq("settlement_no", procureSettlementGoods.getSettlementNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        procureSettlementGoods.setUpdateBy(getUsername());
+        return success(procureSettlementGoodsService.updateById(procureSettlementGoods));
+    }
+
+    @ApiOperation("分摊管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            procureSettlementGoodsService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("分摊管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(procureSettlementGoodsService.list(new QueryWrapper<ProcureSettlementGoods>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("分摊管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(procureSettlementGoodsService.page(new Page<ProcureSettlementGoods>(pageNum,pageSize),new QueryWrapper<ProcureSettlementGoods>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("分摊管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(procureSettlementGoodsService.getById(id));
+    }
+
+}

+ 92 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProcureSupplierController.java

@@ -0,0 +1,92 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProcureSupplier;
+import com.ruoyi.web.base.service.IProcureSupplierService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 供应商管理 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-05
+ */
+@RestController
+@RequestMapping("/procure-supplier")
+public class ProcureSupplierController {
+    @Autowired
+    private IProcureSupplierService procureSupplierService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("自动转级别管理添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProcureSupplier procureSupplier, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureSupplierService.count(new QueryWrapper<ProcureSupplier>().eq("org_id",loginOrgId).eq("supplier_num", procureSupplier.getSupplierNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        procureSupplier.setOrgId(loginOrgId);
+        procureSupplier.setCreateBy(getUsername());
+
+        return success(procureSupplierService.save(procureSupplier));
+    }
+
+    @ApiOperation("自动转级别管理修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProcureSupplier procureSupplier, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (procureSupplierService.count(new QueryWrapper<ProcureSupplier>().ne("id",procureSupplier.getId()).eq("org_id",loginOrgId).eq("supplier_num", procureSupplier.getSupplierNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        procureSupplier.setUpdateBy(getUsername());
+        return success(procureSupplierService.updateById(procureSupplier));
+    }
+
+    @ApiOperation("自动转级别管理删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            procureSupplierService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("自动转级别管理列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+
+        return success(procureSupplierService.list(new QueryWrapper<ProcureSupplier>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("自动转级别管理分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        return success(procureSupplierService.page(new Page<ProcureSupplier>(pageNum,pageSize),new QueryWrapper<ProcureSupplier>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("自动转级别管理详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        return success(procureSupplierService.getById(id));
+    }
+
+
+}

+ 87 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionBatchProcessingTypeController.java

@@ -0,0 +1,87 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionBatchProcessingType;
+import com.ruoyi.web.base.service.IProductionBatchProcessingTypeService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 批量修改加工类型操作记录表,用于记录批量修改加工类型的操作信息及数据变更前后情况 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-19
+ */
+@RestController
+@RequestMapping("/production-batch-processing-type")
+public class ProductionBatchProcessingTypeController {
+    @Autowired
+    private IProductionBatchProcessingTypeService productionBatchProcessingTypeService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("生产批次加工类型添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionBatchProcessingType productionBatchProcessingType, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        productionBatchProcessingType.setOrgId(loginOrgId);
+        productionBatchProcessingType.setCreateBy(getUsername());
+        return success(productionBatchProcessingTypeService.save(productionBatchProcessingType));
+    }
+
+    @ApiOperation("生产批次加工类型修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionBatchProcessingType productionBatchProcessingType, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        productionBatchProcessingType.setUpdateBy(getUsername());
+        return success(productionBatchProcessingTypeService.updateById(productionBatchProcessingType));
+    }
+
+    @ApiOperation("生产批次加工类型删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionBatchProcessingTypeService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产批次加工类型列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        return success(productionBatchProcessingTypeService.list(
+                new QueryWrapper<ProductionBatchProcessingType>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("生产批次加工类型分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum,
+                           @RequestParam("pageSize") Integer pageSize,
+                           HttpServletRequest request) {
+        return success(productionBatchProcessingTypeService.page(
+                new Page<>(pageNum, pageSize),
+                new QueryWrapper<ProductionBatchProcessingType>().eq("org_id", tokenService.getLoginOrgId(request))));
+    }
+
+    @ApiOperation("生产批次加工类型详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionBatchProcessingTypeService.getById(id));
+    }
+}

+ 142 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionCompletionReportController.java

@@ -0,0 +1,142 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.ruoyi.web.base.domain.*;
+import com.ruoyi.web.base.domain.param.ProductionCompletionRequest;
+import com.ruoyi.web.base.service.IProductionCompletionReportGoodsService;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.service.IProductionCompletionReportService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+/**
+ * <p>
+ * 生产完工报告表,存储生产完工报告的详细信息 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-19
+ */
+@RestController
+@RequestMapping("/production-completion-report")
+public class ProductionCompletionReportController {
+    @Autowired
+    private IProductionCompletionReportService productionCompletionReportService;
+    @Autowired
+    private IProductionCompletionReportGoodsService goodsService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("生产完工报告添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionCompletionReport report, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionCompletionReportService.count(
+                new QueryWrapper<ProductionCompletionReport>()
+                        .eq("org_id", loginOrgId)
+                        .eq("report_number", report.getReportNumber())
+        ) > 0) {
+            throw new Exception("该报告编号已存在");
+        }
+        report.setOrgId(loginOrgId);
+        report.setCreateBy(getUsername());
+        List<ProductionCompletionReportGoods> goods = report.getGoods();
+        for (ProductionCompletionReportGoods good : goods) {
+
+            good.setReportNumber(report.getReportNumber());
+            goodsService.save(good);
+        }
+        return success(productionCompletionReportService.save(report));
+    }
+
+    @ApiOperation("生产完工报告修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionCompletionReport report, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionCompletionReportService.count(
+                new QueryWrapper<ProductionCompletionReport>()
+                        .ne("id", report.getId())
+                        .eq("org_id", loginOrgId)
+                        .eq("report_number", report.getReportNumber())
+        ) > 0) {
+            throw new Exception("该报告编号已存在");
+        }
+        List<ProductionCompletionReportGoods> goods = report.getGoods();
+        goodsService.remove(new QueryWrapper<ProductionCompletionReportGoods>().eq("report_number",report.getReportNumber()));
+        for (ProductionCompletionReportGoods good : goods) {
+
+            good.setReportNumber(report.getReportNumber());
+            goodsService.save(good);
+        }
+
+        report.setUpdateBy(getUsername());
+        return success(productionCompletionReportService.updateById(report));
+    }
+
+    @ApiOperation("生产完工报告删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionCompletionReportService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产完工报告列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        List<ProductionCompletionReport> org_id = productionCompletionReportService.list(
+                new QueryWrapper<ProductionCompletionReport>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        );
+
+        for (ProductionCompletionReport procureQuotation : org_id) {
+            procureQuotation.setGoods(goodsService.list(new QueryWrapper<ProductionCompletionReportGoods>().eq("report_number",procureQuotation.getReportNumber())));
+        }
+        return success(org_id);
+
+
+    }
+
+    @ApiOperation("生产完工报告分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+           @RequestBody ProductionCompletionRequest regular ,
+            HttpServletRequest request
+    ) {
+        Page<ProductionCompletionReport> org_id = productionCompletionReportService.page(
+                new Page<ProductionCompletionReport>(regular.getPageNum(), regular.getPageSize()),
+                new QueryWrapper<ProductionCompletionReport>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        );
+
+        for (ProductionCompletionReport procureQuotation : org_id.getRecords()) {
+            procureQuotation.setGoods(goodsService.list(new QueryWrapper<ProductionCompletionReportGoods>().eq("report_number",procureQuotation.getReportNumber())));
+        }
+        return success(org_id);
+    }
+
+    @ApiOperation("生产完工报告详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        ProductionCompletionReport byId = productionCompletionReportService.getById(id);
+        byId.setGoods(goodsService.list(new QueryWrapper<ProductionCompletionReportGoods>().eq("report_number",byId.getReportNumber())));
+        return success(byId);
+    }
+
+}

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionCompletionReportGoodsController.java

@@ -0,0 +1,20 @@
+package com.ruoyi.web.base.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 生产完工报告表 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-25
+ */
+@RestController
+@RequestMapping("/production-completion-report-goods")
+public class ProductionCompletionReportGoodsController {
+
+}

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionInstockController.java

@@ -0,0 +1,20 @@
+package com.ruoyi.web.base.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 生产入库 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-04
+ */
+@RestController
+@RequestMapping("/production-instock")
+public class ProductionInstockController {
+
+}

+ 20 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionInstockGoodsController.java

@@ -0,0 +1,20 @@
+package com.ruoyi.web.base.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 生产入库,货品表 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-04
+ */
+@RestController
+@RequestMapping("/production-instock-goods")
+public class ProductionInstockGoodsController {
+
+}

+ 105 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionMaterialMappingController.java

@@ -0,0 +1,105 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionMaterialMapping;
+
+import com.ruoyi.web.base.service.IProductionMaterialMappingService;
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 物料生产对应管理表 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-16
+ */
+@RestController
+@RequestMapping("/production-material-mapping")
+public class ProductionMaterialMappingController {
+    @Autowired
+    private IProductionMaterialMappingService productionMaterialMappingService;
+  
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("物料生产对应添加")
+    @PostMapping("/add")
+    @Transactional
+    public AjaxResult add(@RequestBody ProductionMaterialMapping productionMaterialMapping, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionMaterialMappingService.count(new QueryWrapper<ProductionMaterialMapping>().eq("org_id",loginOrgId).eq("goods_num", productionMaterialMapping.getGoodsNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        String username = getUsername();
+        productionMaterialMapping.setOrgId(loginOrgId);
+        productionMaterialMapping.setCreateBy(username);
+       
+        return success(productionMaterialMappingService.save(productionMaterialMapping));
+    }
+
+    @ApiOperation("物料生产对应修改")
+    @PostMapping("/edit")
+    @Transactional
+    public AjaxResult edit(@RequestBody ProductionMaterialMapping productionMaterialMapping, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionMaterialMappingService.count(new QueryWrapper<ProductionMaterialMapping>().ne("id",productionMaterialMapping.getId()).eq("org_id",loginOrgId).eq("production_plant_no", productionMaterialMapping.getProductionPlantNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        String username = getUsername();
+        productionMaterialMapping.setOrgId(loginOrgId);
+        productionMaterialMapping.setCreateBy(username);
+        productionMaterialMapping.setUpdateBy(username);
+        return success(productionMaterialMappingService.updateById(productionMaterialMapping));
+    }
+
+    @ApiOperation("物料生产对应删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            productionMaterialMappingService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("物料生产对应列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        List<ProductionMaterialMapping> org_id = productionMaterialMappingService.list(new QueryWrapper<ProductionMaterialMapping>().eq("org_id", tokenService.getLoginOrgId(request)));
+
+        return success(org_id);
+    }
+
+    @ApiOperation("物料生产对应分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        Page<ProductionMaterialMapping> org_id = productionMaterialMappingService.page(new Page<ProductionMaterialMapping>(pageNum, pageSize), new QueryWrapper<ProductionMaterialMapping>().eq("org_id", tokenService.getLoginOrgId(request)));
+
+        return success(org_id);
+    }
+
+    @ApiOperation("物料生产对应详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        ProductionMaterialMapping byId = productionMaterialMappingService.getById(id);
+        return success(byId);
+    }
+}

+ 174 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionPlanController.java

@@ -0,0 +1,174 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionPlan;
+import com.ruoyi.web.base.domain.ProductionPlanGoods;
+import com.ruoyi.web.base.domain.param.ProductionPlanRequest;
+import com.ruoyi.web.base.service.IProductionPlanGoodsService;
+import com.ruoyi.web.base.service.IProductionPlanService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+import static com.ruoyi.web.base.util.NumUtils.generateString;
+import static com.ruoyi.web.base.util.NumUtils.substringToInt;
+
+/**
+ * <p>
+ * 生产计划单表 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-16
+ */
+@RestController
+@RequestMapping("/production-plan")
+public class ProductionPlanController {
+    @Autowired
+    private IProductionPlanService productionPlanService;
+    @Autowired
+    private IProductionPlanGoodsService goodsService;
+    @Autowired
+    private TokenService tokenService;
+
+
+
+    @ApiOperation("获取生产计划单编号")
+    @PostMapping("/getProductionNum")
+    public AjaxResult getQuotaNum(HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        ProductionPlan one = productionPlanService.getOne(new QueryWrapper<ProductionPlan>().eq("org_id", loginOrgId).orderByDesc("id").last("limit 1"));
+        if (ObjectUtils.isEmpty(one)){
+
+            return success(generateString("cg",1));
+        }
+        String quotationNum = one.getOrderNum();
+
+        return success(generateString("bj",substringToInt(quotationNum)));
+
+    }
+
+
+
+    @ApiOperation("生产计划单添加")
+    @PostMapping("/add")
+    @Transactional
+    public AjaxResult add(@RequestBody ProductionPlan productionPlan, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionPlan.getOrderDate() == null) {
+            throw new Exception("生产日期不能为空");
+        }
+        String orderNum = productionPlanService.generateOrderNum(loginOrgId, productionPlan.getOrderDate());
+        productionPlan.setOrderNum(orderNum);
+        String username = getUsername();
+        productionPlan.setOrgId(loginOrgId);
+        productionPlan.setCreateBy(username);
+        List<ProductionPlanGoods> goods = productionPlan.getGoods();
+        for (ProductionPlanGoods good : goods) {
+            good.setOrgId(loginOrgId);
+            good.setCreateBy(username);
+            good.setOrderNum(productionPlan.getOrderNum());
+            goodsService.save(good);
+        }
+
+        return success(productionPlanService.save(productionPlan));
+    }
+
+    @ApiOperation("生产计划单修改")
+    @PostMapping("/edit")
+    @Transactional
+    public AjaxResult edit(@RequestBody ProductionPlan productionPlan, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionPlanService.count(new QueryWrapper<ProductionPlan>().ne("id",productionPlan.getId()).eq("org_id",loginOrgId).eq("order_num", productionPlan.getOrderNum())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        String username = getUsername();
+        productionPlan.setOrgId(loginOrgId);
+        productionPlan.setCreateBy(username);
+        List<ProductionPlanGoods> goods = productionPlan.getGoods();
+        goodsService.remove(new QueryWrapper<ProductionPlanGoods>().eq("order_num",productionPlan.getOrderNum()));
+        for (ProductionPlanGoods good : goods) {
+            good.setOrgId(loginOrgId);
+            good.setCreateBy(username);
+            good.setOrderNum(productionPlan.getOrderNum());
+            goodsService.save(good);
+        }
+        productionPlan.setUpdateBy(username);
+
+        return success(productionPlanService.updateById(productionPlan));
+    }
+
+    @ApiOperation("生产计划单删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            productionPlanService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产计划单列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request,
+    @RequestBody Map<String,String> map ){
+        String productionType = map.get("productionType");
+        String startDate = map.get("startDate");
+        String endDate = map.get("endDate");
+        List<ProductionPlan> org_id = productionPlanService.list(new QueryWrapper<ProductionPlan>()
+                .eq(StringUtils.isNotEmpty(productionType),"production_type",productionType)
+                .eq("org_id", tokenService.getLoginOrgId(request))
+                .ge(StringUtils.isNotEmpty(startDate),"order_date",startDate)
+                .le(StringUtils.isNotEmpty(endDate),"order_date",endDate)
+        );
+        for (ProductionPlan procureQuotation : org_id) {
+            procureQuotation.setGoods(goodsService.list(new QueryWrapper<ProductionPlanGoods>().eq("order_num",procureQuotation.getOrderNum())));
+        }
+        return success(org_id);
+    }
+
+    @ApiOperation("生产计划单分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+            @RequestBody ProductionPlanRequest productionPlanParam, HttpServletRequest request) {
+
+
+        QueryWrapper<ProductionPlan> wrapper = new QueryWrapper<ProductionPlan>().eq("org_id", tokenService.getLoginOrgId(request));
+
+        wrapper.like(StringUtils.isNotEmpty(productionPlanParam.getOrderNum()),"order_num",productionPlanParam.getOrderNum())
+                .eq(StringUtils.isNotEmpty(productionPlanParam.getProductionType()),"production_type",productionPlanParam.getProductionType())
+                .ge(StringUtils.isNotEmpty(productionPlanParam.getStartTime()),"order_date",productionPlanParam.getStartTime())
+                .le(StringUtils.isNotEmpty(productionPlanParam.getEndTime()),"order_date",productionPlanParam.getEndTime());
+        Page<ProductionPlan> org_id =
+                productionPlanService.page(new Page<ProductionPlan>(productionPlanParam.getPageNum(), productionPlanParam.getPageSize()),wrapper);
+
+        for (ProductionPlan procureQuotation : org_id.getRecords()) {
+            procureQuotation.setGoods(goodsService.list(new QueryWrapper<ProductionPlanGoods>().eq("order_num",procureQuotation.getOrderNum())));
+        }
+        return success(org_id);
+    }
+
+    @ApiOperation("生产计划单详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        ProductionPlan byId = productionPlanService.getById(id);
+        byId.setGoods(goodsService.list(new QueryWrapper<ProductionPlanGoods>().eq("order_num",byId.getOrderNum())));
+        return success(byId);
+    }
+
+}

+ 99 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionPlanGoodsController.java

@@ -0,0 +1,99 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionPlanGoods;
+import com.ruoyi.web.base.service.IProductionPlanGoodsService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-plan-goods")
+public class ProductionPlanGoodsController {
+
+    @Autowired
+    private IProductionPlanGoodsService productionPlanGoodsService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("生产计划商品添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionPlanGoods goods, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionPlanGoodsService.count(
+                new QueryWrapper<ProductionPlanGoods>()
+                        .eq("org_id", loginOrgId)
+                        .eq("order_num", goods.getOrderNum())
+        ) > 0) {
+            throw new Exception("该计划编号已存在");
+        }
+        goods.setOrgId(loginOrgId);
+        goods.setCreateBy(getUsername());
+        return success(productionPlanGoodsService.save(goods));
+    }
+
+    @ApiOperation("生产计划商品修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionPlanGoods goods, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionPlanGoodsService.count(
+                new QueryWrapper<ProductionPlanGoods>()
+                        .ne("id", goods.getId())
+                        .eq("org_id", loginOrgId)
+                        .eq("order_num", goods.getOrderNum())
+        ) > 0) {
+            throw new Exception("该计划编号已存在");
+        }
+        goods.setUpdateBy(getUsername());
+        return success(productionPlanGoodsService.updateById(goods));
+    }
+
+    @ApiOperation("生产计划商品删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionPlanGoodsService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产计划商品列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        return success(productionPlanGoodsService.list(
+                new QueryWrapper<ProductionPlanGoods>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产计划商品分页")
+    @GetMapping("/page")
+    public AjaxResult page(
+            @RequestParam("pageNum") Integer pageNum,
+            @RequestParam("pageSize") Integer pageSize,
+            HttpServletRequest request
+    ) {
+        return success(productionPlanGoodsService.page(
+                new Page<ProductionPlanGoods>(pageNum, pageSize),
+                new QueryWrapper<ProductionPlanGoods>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产计划商品详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionPlanGoodsService.getById(id));
+    }
+}

+ 107 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionPlantController.java

@@ -0,0 +1,107 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionPlant;
+import com.ruoyi.web.base.domain.ProductionPlan;
+import com.ruoyi.web.base.service.IProductionPlantService;
+import com.ruoyi.web.base.service.IProductionPlanService;
+import com.ruoyi.web.base.service.IProductionPlantService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 车间信息表 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-16
+ */
+@RestController
+@RequestMapping("/production-plant")
+public class ProductionPlantController {
+    @Autowired
+    private IProductionPlantService productionPlantService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("车间信息表添加")
+    @PostMapping("/add")
+    @Transactional
+    public AjaxResult add(@RequestBody ProductionPlant productionPlant, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionPlantService.count(new QueryWrapper<ProductionPlant>().eq("org_id",loginOrgId).eq("production_plant_no", productionPlant.getProductionPlantNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        String username = getUsername();
+        productionPlant.setOrgId(loginOrgId);
+        productionPlant.setCreateBy(username);
+
+        return success(productionPlantService.save(productionPlant));
+    }
+
+    @ApiOperation("车间信息表修改")
+    @PostMapping("/edit")
+    @Transactional
+    public AjaxResult edit(@RequestBody ProductionPlant productionPlant, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionPlantService.count(new QueryWrapper<ProductionPlant>().ne("id",productionPlant.getId()).eq("org_id",loginOrgId).eq("production_plant_no", productionPlant.getProductionPlantNo())) >0 ){
+            throw new Exception("该编号已存在");
+        }
+        String username = getUsername();
+        productionPlant.setOrgId(loginOrgId);
+        productionPlant.setCreateBy(username);
+        productionPlant.setUpdateBy(username);
+        return success(productionPlantService.updateById(productionPlant));
+    }
+
+    @ApiOperation("车间信息表删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            productionPlantService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("车间信息表列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request){
+        List<ProductionPlant> org_id = productionPlantService.list(new QueryWrapper<ProductionPlant>().eq("org_id", tokenService.getLoginOrgId(request)));
+
+        return success(org_id);
+    }
+
+    @ApiOperation("车间信息表分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , HttpServletRequest request) {
+        Page<ProductionPlant> org_id = productionPlantService.page(new Page<ProductionPlant>(pageNum, pageSize), new QueryWrapper<ProductionPlant>().eq("org_id", tokenService.getLoginOrgId(request)));
+
+        return success(org_id);
+    }
+
+    @ApiOperation("车间信息表详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        ProductionPlant byId = productionPlantService.getById(id);
+        return success(byId);
+    }
+
+}

+ 123 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionProductController.java

@@ -0,0 +1,123 @@
+package com.ruoyi.web.base.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionProduct;
+import com.ruoyi.web.base.domain.ProductionRecord;
+import com.ruoyi.web.base.domain.param.ProductionProductRequest;
+import com.ruoyi.web.base.domain.param.ProductionRegularPlanRequest;
+import com.ruoyi.web.base.service.IProductionProductService;
+import com.ruoyi.web.base.service.IProductionRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-product")
+@Api("分割品副产品")
+public class ProductionProductController {
+
+    @Autowired
+    private IProductionProductService productionProductService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private IProductionRecordService productionRecordService;
+
+    @ApiOperation("分割品副产品添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionProduct product, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionProductService.count(
+                new QueryWrapper<ProductionProduct>()
+                        .eq("org_id", loginOrgId)
+                        .eq("production_record_number", product.getProductionRecordNumber())
+        ) > 0) {
+            throw new Exception("该产品编号已存在");
+        }
+        product.setOrgId(loginOrgId);
+        product.setCreateBy(getUsername());
+
+
+        ProductionRecord productionRecord = new ProductionRecord();
+        BeanUtil.copyProperties(product, productionRecord);
+        productionRecordService.save(productionRecord);
+        return success(productionProductService.save(product));
+    }
+
+    @ApiOperation("分割品副产品修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionProduct product, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionProductService.count(
+                new QueryWrapper<ProductionProduct>()
+                        .ne("id", product.getId())
+                        .eq("org_id", loginOrgId)
+                        .eq("production_record_number", product.getProductionRecordNumber())
+        ) > 0) {
+            throw new Exception("该产品编号已存在");
+        }
+        product.setUpdateBy(getUsername());
+        return success(productionProductService.updateById(product));
+    }
+
+    @ApiOperation("分割品副产品删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionProductService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("分割品副产品列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(   @RequestBody ProductionProductRequest planRequest,HttpServletRequest request) {
+        QueryWrapper<ProductionProduct> wrapper = new QueryWrapper<ProductionProduct>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getProductionDate()),"production_date",planRequest.getProductionDate());
+        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()),"production_plan_number",planRequest.getProductionPlanNumber());
+        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionRecordNumber()),"production_record_number",planRequest.getProductionRecordNumber());
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getProductionType()),"production_date",planRequest.getProductionDate());
+        return success(productionProductService.list(
+                wrapper
+        ));
+    }
+
+    @ApiOperation("分割品副产品分页")
+    @GetMapping("/page")
+    public AjaxResult page(
+            @RequestBody ProductionProductRequest planRequest,
+            HttpServletRequest request
+    ) {
+        QueryWrapper<ProductionProduct> wrapper = new QueryWrapper<ProductionProduct>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getProductionDate()),"production_date",planRequest.getProductionDate());
+        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()),"production_plan_number",planRequest.getProductionPlanNumber());
+        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionRecordNumber()),"production_record_number",planRequest.getProductionRecordNumber());
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getProductionType()),"production_date",planRequest.getProductionDate());
+        return success(productionProductService.page(
+                new Page<ProductionProduct>(planRequest.getPageNum(), planRequest.getPageSize()),
+                wrapper
+        ));
+    }
+
+    @ApiOperation("分割品副产品详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionProductService.getById(id));
+    }
+}

+ 110 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionRecordController.java

@@ -0,0 +1,110 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionRecord;
+import com.ruoyi.web.base.domain.param.ProductionPlanRequest;
+import com.ruoyi.web.base.domain.param.ProductionRecordRequest;
+import com.ruoyi.web.base.service.IProductionRecordService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-record")
+public class ProductionRecordController {
+
+    @Autowired
+    private IProductionRecordService productionRecordService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("生产记录添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionRecord record, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        record.setOrgId(loginOrgId);
+        record.setCreateBy(getUsername());
+        return success(productionRecordService.save(record));
+    }
+
+    @ApiOperation("生产记录修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionRecord record, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        record.setUpdateBy(getUsername());
+        return success(productionRecordService.updateById(record));
+    }
+
+    @ApiOperation("生产记录删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionRecordService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产记录列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(  @RequestBody ProductionRecordRequest productionPlanParam, HttpServletRequest request) {
+        QueryWrapper<ProductionRecord> wrapper =  getWrapper(productionPlanParam);
+        return success(productionRecordService.list(
+                wrapper
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产记录分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+            @RequestBody ProductionRecordRequest productionPlanParam, HttpServletRequest request
+
+    ) {
+
+        QueryWrapper<ProductionRecord> wrapper =  getWrapper(productionPlanParam);
+        return success(productionRecordService.page(
+                new Page<ProductionRecord>(productionPlanParam.getPageNum(), productionPlanParam.getPageSize()),
+                wrapper
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    private QueryWrapper<ProductionRecord> getWrapper(ProductionRecordRequest productionPlanParam) {
+        QueryWrapper<ProductionRecord> wrapper = new QueryWrapper<>();
+        wrapper.like(StringUtils.isNotEmpty(productionPlanParam.getProductionType()),"production_type",productionPlanParam.getProductionType());
+        wrapper.like(StringUtils.isNotEmpty(productionPlanParam.getBatch()),"batch",productionPlanParam.getBatch());
+        wrapper.like(StringUtils.isNotEmpty(productionPlanParam.getInspectResult()),"inspect_result",productionPlanParam.getInspectResult());
+        wrapper.ge(StringUtils.isNotEmpty(productionPlanParam.getLevelstart()),"grade",productionPlanParam.getLevelstart());
+        wrapper.le(StringUtils.isNotEmpty(productionPlanParam.getLevelEnd()),"grade",productionPlanParam.getLevelEnd());
+        wrapper.like(StringUtils.isNotEmpty(productionPlanParam.getPigBatch()),"getPig_batch",productionPlanParam.getPigBatch());
+        wrapper.like(StringUtils.isNotEmpty(productionPlanParam.getProcessType()),"processing_type",productionPlanParam.getProcessType());
+        wrapper.le(StringUtils.isNotEmpty(productionPlanParam.getRecordDateEnd()),"production_record_date",productionPlanParam.getRecordDateEnd());
+        wrapper.ge(StringUtils.isNotEmpty(productionPlanParam.getRecordDatestart()),"production_record_date",productionPlanParam.getRecordDatestart());
+        wrapper.like(StringUtils.isNotEmpty(productionPlanParam.getVariety()),"variety",productionPlanParam.getVariety());
+        wrapper.ge(StringUtils.isNotEmpty(productionPlanParam.getWhiteNostart()),"white_strip_number",productionPlanParam.getVariety());
+        wrapper.le(StringUtils.isNotEmpty(productionPlanParam.getWhiteNoEnd()),"white_strip_number",productionPlanParam.getWhiteNoEnd());
+        wrapper.le(StringUtils.isNotEmpty(productionPlanParam.getAnimalIdentification()),"animal_identification",productionPlanParam.getAnimalIdentification());
+        return wrapper;
+
+    }
+
+    @ApiOperation("生产记录详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionRecordService.getById(id));
+    }
+}

+ 257 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionRegularController.java

@@ -0,0 +1,257 @@
+package com.ruoyi.web.base.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionPlan;
+import com.ruoyi.web.base.domain.ProductionPlanGoods;
+import com.ruoyi.web.base.domain.ProductionRecord;
+import com.ruoyi.web.base.domain.ProductionRegular;
+import com.ruoyi.web.base.domain.param.ProductionRegularPlanRequest;
+import com.ruoyi.web.base.service.IProductionPlanGoodsService;
+import com.ruoyi.web.base.service.IProductionPlanService;
+import com.ruoyi.web.base.service.IProductionRecordService;
+import com.ruoyi.web.base.service.IProductionRegularService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.error;
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+import static com.ruoyi.web.base.util.NumUtils.*;
+
+@RestController
+@RequestMapping("/production-regular")
+public class ProductionRegularController {
+
+    @Autowired
+    private IProductionRegularService productionRegularService;
+    @Autowired
+    private IProductionPlanGoodsService planGoodsService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private IProductionPlanService planService;
+    @Autowired
+    private IProductionRecordService productionRecordService;
+
+    @ApiOperation("批量修改加工类型")
+    @PostMapping("/updateBatchType")
+    @Transactional
+    public AjaxResult updateBatch(@RequestBody Map<String, String> paramsMap,
+    HttpServletRequest request) throws Exception {
+         String ids = paramsMap.get("ids");
+         String processingType = paramsMap.get("processingType");
+        for (String id : ids.split(",")) {
+            ProductionRegular productionRegular = new ProductionRegular();
+            productionRegular.setId(Integer.parseInt(id));
+            productionRegular.setProcessingType(processingType);
+            productionRegularService.updateById(productionRegular);
+        }
+        return success();
+    }
+
+    @ApiOperation("获取常规生产单编号")
+    @PostMapping("/getProductionNum")
+    public AjaxResult getQuotaNum(HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        ProductionRecord one = productionRecordService.getOne(new QueryWrapper<ProductionRecord>().eq("org_id", loginOrgId).orderByDesc("id").last("limit 1"));
+        if (ObjectUtils.isEmpty(one)) {
+
+            return success(generateString2("JL", 1));
+        }
+        String quotationNum = one.getProductionRecordNumber();
+
+        return success(generateString2("JL", substringToInt2(quotationNum)));
+
+    }
+
+    @ApiOperation("生产常规添加")
+    @PostMapping("/add")
+    @Transactional
+    public AjaxResult add(@RequestBody ProductionRegular regular, HttpServletRequest request) throws Exception {
+        if ("1".equals(regular.getQuarantineInspection()) ) {
+            String pigBatch = regular.getPigBatch();
+            ProductionPlanGoods productionPlanGoods = new ProductionPlanGoods();
+            productionPlanGoods.setProductionStatus(1);
+            planGoodsService.update(productionPlanGoods, new UpdateWrapper<ProductionPlanGoods>().eq("batch", pigBatch));
+        }
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        if (productionRegularService.count(
+                new QueryWrapper<ProductionRegular>()
+                        .eq("org_id", loginOrgId).eq("production_record_number", regular.getProductionRecordNumber())
+                        .eq("white_strip_number", regular.getWhiteStripNumber())
+        ) > 0) {
+            throw new Exception("该白条已存在");
+        }
+        regular.setOrgId(loginOrgId);
+        regular.setCreateBy(getUsername());
+        ProductionRecord productionRecord = new ProductionRecord();
+        BeanUtil.copyProperties(regular, productionRecord);
+        productionRecord.setProductionRecordDate(regular.getProductionDate());
+        productionRecordService.save(productionRecord);
+        return success(productionRegularService.save(regular));
+    }
+
+    @ApiOperation("生产常规修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionRegular regular, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionRegularService.count(
+                new QueryWrapper<ProductionRegular>()
+                        .ne("id", regular.getId())
+                        .eq("org_id", loginOrgId)
+                        .eq("production_record_number", regular.getProductionRecordNumber()).eq("white_strip_number", regular.getWhiteStripNumber())
+        ) > 0) {
+            throw new Exception("该常规编号已存在");
+        }
+        regular.setUpdateBy(getUsername());
+        return success(productionRegularService.updateById(regular));
+    }
+
+    @ApiOperation("生产常规删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionRegularService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产常规列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(
+            @RequestBody ProductionRegularPlanRequest planRequest, HttpServletRequest request) {
+
+        return success(productionRegularService.list(
+                new QueryWrapper<ProductionRegular>()
+                        .eq("org_id", tokenService.getLoginOrgId(request)).
+                        eq(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()), "production_plan_number", planRequest.getProductionPlanNumber())
+                        .eq(StringUtils.isNotEmpty(planRequest.getPigBatch()), "pig_batch", planRequest.getPigBatch())
+                        .eq(StringUtils.isNotEmpty(planRequest.getProductionDate()), "production_date", planRequest.getProductionDate())
+                        .eq(StringUtils.isNotEmpty(planRequest.getProductionType()), "production_type", planRequest.getProductionType())
+                        .eq(StringUtils.isNotEmpty(planRequest.getProductionWorkshop()), "productionorkshop", planRequest.getProductionWorkshop())
+                )
+        );
+    }
+    @ApiOperation("白条分配")
+    @PostMapping("/listFenPei")
+    public AjaxResult listFenPei(
+            @RequestBody ProductionRegularPlanRequest planRequest, HttpServletRequest request) {
+
+        return success(productionRegularService.list(
+                new QueryWrapper<ProductionRegular>()
+                        .eq("org_id", tokenService.getLoginOrgId(request)).
+                        eq("is_fenpei",0).
+                        eq(StringUtils.isNotEmpty(planRequest.getAnimalTag()), "animal_identification", planRequest.getAnimalTag())
+                        .eq(StringUtils.isNotEmpty(planRequest.getBatch()), "pig_batch", planRequest.getBatch())
+                        .eq(StringUtils.isNotEmpty(planRequest.getProductionDate()), "production_date", planRequest.getProductionDate())
+                        .eq(StringUtils.isNotEmpty(planRequest.getLevel()), "grade", planRequest.getLevel())
+                        .eq(StringUtils.isNotEmpty(planRequest.getVariety()), "variety", planRequest.getVariety())
+                        .eq(StringUtils.isNotEmpty(planRequest.getWhiteNo()), "white_strip_num", planRequest.getWhiteNo())
+                )
+        );
+    }
+
+    @ApiOperation("生产常规分页")
+    @PostMapping("/page")
+    public AjaxResult page(@RequestBody ProductionRegularPlanRequest planRequest,
+                           HttpServletRequest request
+    ) {
+
+        QueryWrapper<ProductionRegular> wrapper = new QueryWrapper<ProductionRegular>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()), "production_plan_number", planRequest.getProductionPlanNumber())
+                .eq(StringUtils.isNotEmpty(planRequest.getProductionDate()), "production_date", planRequest.getProductionDate())
+                .eq(StringUtils.isNotEmpty(planRequest.getGradel()), "grade", planRequest.getGradel())
+                .eq(StringUtils.isNotEmpty(planRequest.getVariety()), "variety", planRequest.getVariety())
+                .eq(StringUtils.isNotEmpty(planRequest.getAnimalIdentification()), "animal_identification", planRequest.getAnimalIdentification())
+                .eq(StringUtils.isNotEmpty(planRequest.getProcessingType()), "processing_type", planRequest.getProcessingType())
+                .eq(StringUtils.isNotEmpty(planRequest.getProductionType()), "production_type", planRequest.getProductionType())
+        ;
+        return success(productionRegularService.page(
+                new Page<ProductionRegular>(planRequest.getPageNum(), planRequest.getPageSize()), wrapper
+                )
+        );
+    }
+
+    @ApiOperation("生产常规详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionRegularService.getById(id));
+    }
+
+    @ApiOperation("获取今日白条精修")
+    @PostMapping("/listWhite")
+    public AjaxResult listWhite(@RequestBody ProductionRegularPlanRequest planRequest,
+                                HttpServletRequest request
+    ) {
+        long planCount = planService.count(new QueryWrapper<ProductionPlan>()
+                .eq(StringUtils.isNotEmpty(planRequest.getProductionType()), "production_type", planRequest.getProductionType())
+                .eq("org_id", tokenService.getLoginOrgId(request)));
+        if (planCount < 1) {
+            return error("今日暂无生产计划");
+        }
+
+        QueryWrapper<ProductionRegular> wrapper = new QueryWrapper<ProductionRegular>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getWhiteStripDate()), "production_date", planRequest.getWhiteStripDate())
+                .eq(StringUtils.isNotEmpty(planRequest.getWhiteStripNum()), "white_strip_number", planRequest.getWhiteStripNum())
+                .eq(StringUtils.isNotEmpty(planRequest.getProcessingType()), "processing_type", planRequest.getProcessingType())
+                .ge(StringUtils.isNotEmpty(planRequest.getStartDate()), "production_date", planRequest.getStartDate())
+                .le(StringUtils.isNotEmpty(planRequest.getEndDate()), "production_date", planRequest.getEndDate())
+                .eq(StringUtils.isNotEmpty(planRequest.getStartGrade()), "grade", planRequest.getStartGrade())
+                .eq(StringUtils.isNotEmpty(planRequest.getEndGrade()), "grade", planRequest.getEndGrade())
+                .eq(StringUtils.isNotEmpty(planRequest.getVariety()), "variety", planRequest.getVariety())
+                .eq(StringUtils.isNotEmpty(planRequest.getAnimalIdentification()), "animal_identification", planRequest.getAnimalIdentification())
+                .ge(StringUtils.isNotEmpty(planRequest.getStartWhiteStripNum()), "white_strip_number", planRequest.getStartWhiteStripNum())
+                .le(StringUtils.isNotEmpty(planRequest.getEndWhiteStripNum()), "white_strip_number", planRequest.getEndWhiteStripNum())
+        ;
+
+        ProductionRegular one = productionRegularService.getOne(wrapper);
+        if (ObjectUtils.isEmpty(one)) {
+            return error("今日暂无该白条编号");
+        }
+        return success(one);
+    }
+    @ApiOperation("获取今日白条分割")
+    @PostMapping("/listWhiteFenGe")
+    public AjaxResult listWhiteFenGe(@RequestBody ProductionRegularPlanRequest planRequest,
+                                HttpServletRequest request
+    ) {
+
+
+        QueryWrapper<ProductionRegular> wrapper = new QueryWrapper<ProductionRegular>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.
+             eq(StringUtils.isNotEmpty(planRequest.getProcessingType()), "processing_type", planRequest.getProcessingType())
+             .eq("is_fenge", 0)
+                .ge(StringUtils.isNotEmpty(planRequest.getStartDate()), "production_date", planRequest.getStartDate())
+                .le(StringUtils.isNotEmpty(planRequest.getEndDate()), "production_date", planRequest.getEndDate())
+                .eq(StringUtils.isNotEmpty(planRequest.getStartGrade()), "grade", planRequest.getStartGrade())
+                .eq(StringUtils.isNotEmpty(planRequest.getEndGrade()), "grade", planRequest.getEndGrade())
+                .eq(StringUtils.isNotEmpty(planRequest.getVariety()), "variety", planRequest.getVariety())
+                .eq(StringUtils.isNotEmpty(planRequest.getAnimalIdentification()), "animal_identification", planRequest.getAnimalIdentification())
+                .ge(StringUtils.isNotEmpty(planRequest.getStartWhiteStripNum()), "white_strip_number", planRequest.getStartWhiteStripNum())
+                .le(StringUtils.isNotEmpty(planRequest.getEndWhiteStripNum()), "white_strip_number", planRequest.getEndWhiteStripNum())
+                .ge(StringUtils.isNotEmpty(planRequest.getQualityInspectionResult()), "quality_inspection_result", planRequest.getQualityInspectionResult())
+        ;
+
+
+        return success( productionRegularService.list(wrapper));
+    }
+}

+ 99 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionRegularGradingController.java

@@ -0,0 +1,99 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionRegularGrading;
+import com.ruoyi.web.base.service.IProductionRegularGradingService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-regular-grading")
+public class ProductionRegularGradingController {
+
+    @Autowired
+    private IProductionRegularGradingService productionRegularGradingService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("生产常规分级添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionRegularGrading grading, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionRegularGradingService.count(
+                new QueryWrapper<ProductionRegularGrading>()
+                        .eq("org_id", loginOrgId)
+                        .eq("production_plan_number", grading.getProductionPlanNumber())
+        ) > 0) {
+            throw new Exception("该分级编号已存在");
+        }
+        grading.setOrgId(loginOrgId);
+        grading.setCreateBy(getUsername());
+        return success(productionRegularGradingService.save(grading));
+    }
+
+    @ApiOperation("生产常规分级修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionRegularGrading grading, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionRegularGradingService.count(
+                new QueryWrapper<ProductionRegularGrading>()
+                        .ne("id", grading.getId())
+                        .eq("org_id", loginOrgId)
+                        .eq("production_plan_number", grading.getProductionPlanNumber())
+        ) > 0) {
+            throw new Exception("该分级编号已存在");
+        }
+        grading.setUpdateBy(getUsername());
+        return success(productionRegularGradingService.updateById(grading));
+    }
+
+    @ApiOperation("生产常规分级删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionRegularGradingService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产常规分级列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        return success(productionRegularGradingService.list(
+                new QueryWrapper<ProductionRegularGrading>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产常规分级分页")
+    @GetMapping("/page")
+    public AjaxResult page(
+            @RequestParam("pageNum") Integer pageNum,
+            @RequestParam("pageSize") Integer pageSize,
+            HttpServletRequest request
+    ) {
+        return success(productionRegularGradingService.page(
+                new Page<ProductionRegularGrading>(pageNum, pageSize),
+                new QueryWrapper<ProductionRegularGrading>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产常规分级详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionRegularGradingService.getById(id));
+    }
+}

+ 85 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionSegmentedProductController.java

@@ -0,0 +1,85 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionSegmentedProduct;
+import com.ruoyi.web.base.service.IProductionSegmentedProductService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-segmented-product")
+public class ProductionSegmentedProductController {
+
+    @Autowired
+    private IProductionSegmentedProductService productionSegmentedProductService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("生产分段产品添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionSegmentedProduct product, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        product.setOrgId(loginOrgId);
+        product.setCreateBy(getUsername());
+        return success(productionSegmentedProductService.save(product));
+    }
+
+    @ApiOperation("生产分段产品修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionSegmentedProduct product, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        product.setUpdateBy(getUsername());
+        return success(productionSegmentedProductService.updateById(product));
+    }
+
+    @ApiOperation("生产分段产品删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionSegmentedProductService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产分段产品列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        return success(productionSegmentedProductService.list(
+                new QueryWrapper<ProductionSegmentedProduct>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产分段产品分页")
+    @GetMapping("/page")
+    public AjaxResult page(
+            @RequestParam("pageNum") Integer pageNum,
+            @RequestParam("pageSize") Integer pageSize,
+            HttpServletRequest request
+    ) {
+        return success(productionSegmentedProductService.page(
+                new Page<ProductionSegmentedProduct>(pageNum, pageSize),
+                new QueryWrapper<ProductionSegmentedProduct>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产分段产品详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionSegmentedProductService.getById(id));
+    }
+}

+ 194 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionShipmentNotificationController.java

@@ -0,0 +1,194 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionShipmentNotification;
+import com.ruoyi.web.base.domain.param.ProductionRegularPlanParam;
+import com.ruoyi.web.base.domain.param.ProductionRegularPlanRequest;
+import com.ruoyi.web.base.domain.param.TreeNode;
+import com.ruoyi.web.base.service.IProductionShipmentNotificationService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.core.domain.AjaxResult.warn;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-shipment-notification")
+public class ProductionShipmentNotificationController {
+
+    @Autowired
+    private IProductionShipmentNotificationService productionShipmentNotificationService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("出货通知添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionShipmentNotification notification, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        notification.setOrgId(loginOrgId);
+        notification.setCreateBy(getUsername());
+        return success(productionShipmentNotificationService.save(notification));
+    }
+
+    @ApiOperation("出货通知修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionShipmentNotification notification, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        notification.setUpdateBy(getUsername());
+        return success(productionShipmentNotificationService.updateById(notification));
+    }
+
+    @ApiOperation("出货通知删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionShipmentNotificationService.removeById(id);
+        }
+        return success();
+    }
+
+
+
+    @ApiOperation("出货通知列表")
+    @PostMapping("/listTree")
+    public AjaxResult listTree(  @RequestBody ProductionRegularPlanRequest planRequest,HttpServletRequest request) {
+        String productionTypes = planRequest.getProductTypes();
+        QueryWrapper<ProductionShipmentNotification> wrapper = new QueryWrapper<ProductionShipmentNotification>()
+                .eq("a.org_id", tokenService.getLoginOrgId(request));
+        if (StringUtils.isNotEmpty(productionTypes)){
+            wrapper.in("a.product_num", Arrays.asList(productionTypes.split(",")));
+        }
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getDeliveryDate()),"a.delivery_date",planRequest.getDeliveryDate());
+        List<ProductionRegularPlanParam> listTree = productionShipmentNotificationService.listTree(wrapper);
+
+        System.out.println(listTree.toString());
+        return success( buildTree(listTree));
+    }
+    public static void main(String[] args) {
+        // 测试数据
+        List<ProductionRegularPlanParam> dataList = new ArrayList<>();
+        dataList.add(new ProductionRegularPlanParam("客户A", "市场1", "线路X", "C1", "L1", "M1"));
+        dataList.add(new ProductionRegularPlanParam("客户B", "市场1", "线路X", "C2", "L1", "M1"));
+        dataList.add(new ProductionRegularPlanParam("客户C", "市场2", "线路Y", "C3", "L2", "M2"));
+
+        // 构建树
+        List<TreeNode> tree = buildTree(dataList);
+
+        // 打印树结构
+        for (TreeNode treeNode : tree) {
+            System.out.println(treeNode);
+        }
+    }
+        public static List<TreeNode> buildTree(List<ProductionRegularPlanParam> dataList) {
+            // 存储根节点(按lineNum分组)
+            Map<String, TreeNode> lineNodeMap = new HashMap<>();
+            // 存储市场节点(按marketNum分组)
+            Map<String, TreeNode> marketNodeMap = new HashMap<>();
+
+            // 第一步:构建所有节点并建立层级关系
+            for (ProductionRegularPlanParam data : dataList) {
+                // 创建或获取line节点
+                TreeNode lineNode = lineNodeMap.computeIfAbsent(data.getLineNum(),
+                        k -> new TreeNode(TreeNode.NodeType.LINE, data.getLineNum(), data.getLineName()));
+
+                // 创建或获取market节点
+                TreeNode marketNode = marketNodeMap.computeIfAbsent(data.getMarketNum(),
+                        k -> new TreeNode(TreeNode.NodeType.MARKET, data.getMarketNum(), data.getMarketName()));
+
+                // 确保market节点属于正确的line节点
+                if (!lineNode.getChildren().contains(marketNode)) {
+                    lineNode.addChild(marketNode);
+
+                }
+
+
+                if (!marketNode.getAllCustomerNums().contains(data.getCustomerNum())) {
+                    TreeNode customerNode = new TreeNode(TreeNode.NodeType.CUSTOMER,
+                            data.getCustomerNum(), data.getCustomer());
+                    marketNode.addChild(customerNode);
+                    customerNode.addCustomerNum(data.getCustomerNum());
+                }
+                marketNode.addCustomerNum(data.getCustomerNum());
+                lineNode.addCustomerNum(data.getCustomerNum());
+            }
+
+
+//            for (TreeNode lineNode : lineNodeMap.values()) {
+//                for (TreeNode marketNode : lineNode.getChildren()) {
+//                    for (TreeNode customerNode : marketNode.getChildren()) {
+//                        customerNode.addCustomerNum(customerNode.getNum());
+//                        // 收集market节点的customerNum
+//                        marketNode.getAllCustomerNums().add(customerNode.getNum());
+//                    }
+//
+//                    // 收集line节点的customerNum
+//                    lineNode.getAllCustomerNums().addAll(marketNode.getAllCustomerNums());
+//                }
+//            }
+
+            return new ArrayList<>(lineNodeMap.values());
+        }
+
+
+    @ApiOperation("出货通知分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+            @RequestBody ProductionRegularPlanRequest planRequest,
+            HttpServletRequest request
+    ) {
+        String productionTypes = planRequest.getProductTypes();
+        String customerNums = planRequest.getCustomerNums();
+        QueryWrapper<ProductionShipmentNotification> wrapper = new QueryWrapper<ProductionShipmentNotification>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        if (StringUtils.isNotEmpty(productionTypes)){
+            wrapper.in("product_type", Arrays.asList(productionTypes.split(",")));
+        }
+        if (StringUtils.isNotEmpty(customerNums)){
+            wrapper.in("customer_number", Arrays.asList(customerNums.split(",")));
+        }
+
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getDeliveryDate()),"delivery_date",planRequest.getDeliveryDate());
+
+
+
+        return success( productionShipmentNotificationService.page(new Page<>(planRequest.getPageNum(),planRequest.getPageSize()),wrapper));
+    }
+    @ApiOperation("出货通知列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(  @RequestBody ProductionRegularPlanRequest planRequest,HttpServletRequest request) {
+        String productionTypes = planRequest.getProductTypes();
+        String customerNums = planRequest.getCustomerNums();
+        QueryWrapper<ProductionShipmentNotification> wrapper = new QueryWrapper<ProductionShipmentNotification>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        if (StringUtils.isNotEmpty(productionTypes)){
+            wrapper.in("product_type", Arrays.asList(productionTypes.split(",")));
+        }
+        if (StringUtils.isNotEmpty(customerNums)){
+            wrapper.in("customer_number", Arrays.asList(customerNums.split(",")));
+        }
+
+        wrapper.eq(StringUtils.isNotEmpty(planRequest.getDeliveryDate()),"delivery_date",planRequest.getDeliveryDate());
+
+
+        return success( productionShipmentNotificationService.list(wrapper));
+    }
+
+    @ApiOperation("出货通知详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionShipmentNotificationService.getById(id));
+    }
+}

+ 135 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionSlaughterController.java

@@ -0,0 +1,135 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionSlaughter;
+import com.ruoyi.web.base.domain.param.WiteStripRequest;
+import com.ruoyi.web.base.service.IProductionSlaughterService;
+import com.ruoyi.web.v1.DTO.PurchaserDimension;
+import com.ruoyi.web.v1.DTO.SupplierDimension;
+import com.ruoyi.web.v1.model.DistributeBatch;
+import com.ruoyi.web.v1.model.EntranceBatch;
+import com.ruoyi.web.v1.model.Purchaser;
+import com.ruoyi.web.v1.model.Supplier;
+import com.ruoyi.web.v1.service.IDistributeBatchService;
+import com.ruoyi.web.v1.service.IEntranceBatchService;
+import com.ruoyi.web.v1.service.IPurchaserService;
+import com.ruoyi.web.v1.service.ISupplierService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-slaughter")
+public class ProductionSlaughterController {
+
+    @Autowired
+    private IProductionSlaughterService productionSlaughterService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private IEntranceBatchService entranceBatchService;
+
+    @Autowired
+    private IDistributeBatchService distributeBatchService;
+    @Autowired
+    private ISupplierService supplierService;
+    @Autowired
+    private IPurchaserService purchaserService;
+
+    @ApiOperation("生产屠宰添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionSlaughter slaughter, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        slaughter.setOrgId(loginOrgId);
+        slaughter.setCreateBy(getUsername());
+        slaughter.setCreateTime(new Date());
+        Supplier supplierDimension = supplierService.getSupplierDimension(new SupplierDimension(slaughter.getSupplierNumber()));
+        Purchaser purchaserDimension = purchaserService.getPurchaserDimension(new PurchaserDimension(slaughter.getSlaughterAgencyNumber()));
+        //新增入场
+        EntranceBatch entranceBatch = new EntranceBatch();
+        entranceBatch.setSupplierId(supplierDimension.getId());
+        entranceBatch.setEntranceTime(slaughter.getAdditionTime());
+        entranceBatch.setAmount(slaughter.getPlannedSlaughterQuantity());
+        entranceBatch.setCreateBy(getUsername());
+        entranceBatch.setCreateTime(new Date());
+        entranceBatch.setCargoOwner(slaughter.getSupplierName());
+        entranceBatch.setCargoOwnerPhone(supplierDimension.getPhone());
+        entranceBatch.setAnimalType("1");//默认猪
+        Long entranceId = entranceBatchService.insertEntranceBatch(entranceBatch);
+        if (entranceId <=0) {
+            throw new RuntimeException("添加入场失败");
+        }
+        //新增分销
+        DistributeBatch distributeBatch = new DistributeBatch();
+        distributeBatch.setEntranceBatchId(entranceId);
+        distributeBatch.setAmount(slaughter.getPlannedSlaughterQuantity());
+        distributeBatch.setCreateBy(getUsername());
+        distributeBatch.setCreateTime(new Date());
+        distributeBatch.setPurchaserId(purchaserDimension.getId());
+        distributeBatch.setSupplierId(supplierDimension.getId());
+        int distributeBatchId = distributeBatchService.insertDistributeBatch(distributeBatch);
+        if (distributeBatchId <=0) {
+            throw new RuntimeException("添加分销失败");
+        }
+        return success(productionSlaughterService.save(slaughter));
+    }
+
+    @ApiOperation("生产屠宰修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionSlaughter slaughter, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        slaughter.setUpdateBy(getUsername());
+        slaughter.setUpdateTime(new Date());
+        return success(productionSlaughterService.updateById(slaughter));
+    }
+
+    @ApiOperation("生产屠宰删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionSlaughterService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产屠宰列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        return success(productionSlaughterService.list(
+                new QueryWrapper<ProductionSlaughter>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产屠宰分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+            @RequestBody WiteStripRequest planRequest,
+            HttpServletRequest request
+    ) {
+        return success(productionSlaughterService.page(
+                new Page<ProductionSlaughter>(planRequest.getPageNum(), planRequest.getPageSize()),
+                new QueryWrapper<ProductionSlaughter>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("生产屠宰详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionSlaughterService.getById(id));
+    }
+}

+ 158 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionSlaughterGoodsController.java

@@ -0,0 +1,158 @@
+package com.ruoyi.web.base.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionProduct;
+import com.ruoyi.web.base.domain.ProductionSlaughter;
+import com.ruoyi.web.base.domain.ProductionSlaughterGoods;
+import com.ruoyi.web.base.domain.param.ProductionSlaughterGoodsRequest;
+import com.ruoyi.web.base.service.IProductionSlaughterGoodsService;
+import com.ruoyi.web.base.service.IProductionSlaughterGoodsService;
+import com.ruoyi.web.base.service.IProductionSlaughterService;
+import com.ruoyi.web.base.util.NumUtils;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+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.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+import static com.ruoyi.web.base.util.NumUtils.generateString;
+import static com.ruoyi.web.base.util.NumUtils.substringToInt;
+
+/**
+ * <p>
+ * 代宰信息表,存储代宰相关的详细信息 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-31
+ */
+@RestController
+@RequestMapping("/production-slaughter-goods")
+public class ProductionSlaughterGoodsController {
+
+    @Autowired
+    private IProductionSlaughterService slaughterService;
+    @Autowired
+    private IProductionSlaughterGoodsService goodsService;
+    @Autowired
+    private TokenService tokenService;
+
+
+
+    @ApiOperation("生产计划单添加")
+    @PostMapping("/add")
+    @Transactional
+    public AjaxResult add(@RequestBody ProductionSlaughterGoods productionSlaughterGoods, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        String username = getUsername();
+        productionSlaughterGoods.setOrgId(loginOrgId);
+        productionSlaughterGoods.setCreateBy(username);
+        productionSlaughterGoods.setJingZhong(productionSlaughterGoods.getDzcWeight());
+
+
+        if (goodsService.count(
+                new QueryWrapper<ProductionSlaughterGoods>()
+                        .eq("org_id", loginOrgId)
+                        .eq("document_number", productionSlaughterGoods.getDocumentNumber())
+                        .eq("white_strip_number", productionSlaughterGoods.getWhiteStripNumber())
+        ) > 0) {
+            throw new Exception("该白条已存在");
+        }
+
+        ProductionSlaughter productionSlaughter = slaughterService.getOne(new QueryWrapper<ProductionSlaughter>().eq("document_number", productionSlaughterGoods.getDocumentNumber()));
+        productionSlaughter.setCreateTime(new Date());
+        productionSlaughter.setActualSlaughterQuantity(
+                NumUtils.addStringToDouble(productionSlaughter.getActualSlaughterQuantity(),"0.5"));
+
+        productionSlaughter.setActualSlaughterAmount(
+                NumUtils.addStringToDouble( productionSlaughter.getActualSlaughterAmount(),
+      String.valueOf( 0.5 *Double.parseDouble(productionSlaughter.getUnitPrice())) )
+                );
+        productionSlaughter.setUpdateTime(new Date());
+        slaughterService.updateById(productionSlaughter);
+
+        return success(goodsService.save(productionSlaughterGoods));
+    }
+
+    @ApiOperation("生产计划单修改")
+    @PostMapping("/edit")
+    @Transactional
+    public AjaxResult edit(@RequestBody ProductionSlaughterGoods productionSlaughterGoods, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        String username = getUsername();
+        productionSlaughterGoods.setOrgId(loginOrgId);
+        productionSlaughterGoods.setCreateBy(username);
+
+        productionSlaughterGoods.setUpdateBy(username);
+        productionSlaughterGoods.setUpdateTime(new Date());
+        productionSlaughterGoods.setJingZhong(productionSlaughterGoods.getDzcWeight());
+        return success(goodsService.updateById(productionSlaughterGoods));
+    }
+
+    @ApiOperation("生产计划单删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String s : ids.split(",")) {
+            goodsService.removeById(s);
+        }
+        return success();
+    }
+
+    @ApiOperation("生产计划单列表")
+    @PostMapping("/list")
+    public AjaxResult listAll( HttpServletRequest request,
+                               @RequestBody ProductionSlaughterGoods productionSlaughterGoods ){
+        QueryWrapper<ProductionSlaughterGoods> query = new QueryWrapper<ProductionSlaughterGoods>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        if(productionSlaughterGoods.getDocumentNumber() != null){
+            query.eq("document_number",productionSlaughterGoods.getDocumentNumber());
+        }
+        List<ProductionSlaughterGoods> org_id = goodsService.list(query);
+
+
+        return success(org_id);
+    }
+
+    @ApiOperation("生产计划单分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+            @RequestBody ProductionSlaughterGoodsRequest productionSlaughterGoodsParam, HttpServletRequest request) {
+
+
+        QueryWrapper<ProductionSlaughterGoods> wrapper = new QueryWrapper<ProductionSlaughterGoods>().eq("org_id", tokenService.getLoginOrgId(request));
+
+        Page<ProductionSlaughterGoods> org_id =
+                goodsService.page(new Page<ProductionSlaughterGoods>(productionSlaughterGoodsParam.getPageNum(), productionSlaughterGoodsParam.getPageSize()),wrapper);
+
+
+        return success(org_id);
+    }
+
+    @ApiOperation("生产计划单详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap){
+        String id = paramsMap.get("id");
+        ProductionSlaughterGoods byId = goodsService.getById(id);
+        return success(byId);
+    }
+
+}

+ 229 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripAllocationController.java

@@ -0,0 +1,229 @@
+package com.ruoyi.web.base.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.*;
+import com.ruoyi.web.base.domain.param.WiteStripAllRequest;
+import com.ruoyi.web.base.service.*;
+import com.ruoyi.web.sales.domain.SalesOrder;
+import com.ruoyi.web.sales.domain.SalesOrderGoods;
+import com.ruoyi.web.sales.service.ISalesOrderGoodsService;
+import com.ruoyi.web.sales.service.ISalesOrderService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.parameters.P;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-white-strip-allocation")
+public class ProductionWhiteStripAllocationController {
+
+    @Autowired
+    private IProductionWhiteStripAllocationService productionWhiteStripAllocationService;
+    @Autowired
+    private IProductionRegularService regularService;
+    @Autowired
+    private IBaseMaterialService baseMaterialService;
+    @Autowired
+    private IProductionShipmentNotificationService shipmentNotificationService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+     private ISalesOrderService salesOrderService;
+    @Autowired
+    private ISalesOrderGoodsService salesOrderGoodsService;
+
+    @ApiOperation("白条分配添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionWhiteStripAllocation allocation, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        allocation.setOrgId(loginOrgId);
+        allocation.setCreateBy(getUsername());
+        Integer regularId = allocation.getRegularId();
+        ProductionRegular productionRegular = new ProductionRegular();
+        productionRegular.setId(regularId);
+        productionRegular.setIsFenpei(1);
+        regularService.updateById(productionRegular);
+        return success(productionWhiteStripAllocationService.save(allocation));
+    }
+    @ApiOperation("白条分配批量添加")
+    @PostMapping("/addBatch")
+    public AjaxResult addBatch(@RequestBody WiteStripAllRequest witeStripAllRequest, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+
+
+        String ids = witeStripAllRequest.getIds();
+        for (String id : ids.split(",")) {
+            ProductionRegular byId = regularService.getById(id);
+            byId.setIsFenpei(1);
+            regularService.updateById(byId);
+            ProductionWhiteStripAllocation allocation = new ProductionWhiteStripAllocation();
+            allocation.setOrgId(loginOrgId);
+            allocation.setCreateBy(getUsername());
+            allocation.setAnimalIdentification(byId.getAnimalIdentification());
+//            allocation.setBatchNumber();
+            allocation.setCoatColor(byId.getCoatColor());
+            allocation.setCustomer(witeStripAllRequest.getCustomer());
+//            allocation.setDeductionScore(witeStripAllRequest.getd());
+            allocation.setDeliveryCustomer(witeStripAllRequest.getDeliveryCustomer());
+            allocation.setDeliveryDate(witeStripAllRequest.getDeliveryDate());
+            allocation.setGrade(byId.getGrade());
+            allocation.setMarket(witeStripAllRequest.getMarket());
+            allocation.setLockedLogisticsLine(witeStripAllRequest.getLockedLogisticsLine());
+            BaseMaterial material = baseMaterialService.getOne(new QueryWrapper<BaseMaterial>().eq("goods_num", byId.getGoodsNum()));
+
+            allocation.setMaterialName(material.getGoodsName());
+//            allocation.setOrderUnallocatedQuantity(witeStripAllRequest.geto);
+            allocation.setPigBatch(byId.getPigBatch());
+            allocation.setProductionDate(witeStripAllRequest.getProductionDate());
+            allocation.setRegularId(Integer.parseInt(id));
+            allocation.setSaleId(witeStripAllRequest.getSaleId());
+            allocation.setSaleNum(witeStripAllRequest.getSaleNum());
+            allocation.setVariety(byId.getVariety());
+//            allocation.setWeight(witeStripAllRequest.getw);
+            allocation.setWhiteStripNumber(byId.getWhiteStripNumber());
+
+            productionWhiteStripAllocationService.save(allocation);
+        }
+
+
+        return success();
+    }
+
+    @ApiOperation("白条分配修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionWhiteStripAllocation allocation, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        allocation.setUpdateBy(getUsername());
+        return success(productionWhiteStripAllocationService.updateById(allocation));
+    }
+
+    @ApiOperation("白条分配删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            ProductionWhiteStripAllocation byId = productionWhiteStripAllocationService.getById(id);
+            ProductionRegular productionRegular = new ProductionRegular();
+            productionRegular.setId(byId.getRegularId());
+            productionRegular.setIsFenpei(0);
+            regularService.updateById(productionRegular);
+
+            productionWhiteStripAllocationService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("白条分配列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        return success(productionWhiteStripAllocationService.list(
+                new QueryWrapper<ProductionWhiteStripAllocation>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+    @ApiOperation("根据saleNum查询")
+    @PostMapping("/listBySaleNum")
+    public AjaxResult listBySaleNum(@RequestBody WiteStripAllRequest witeStripAllRequest,
+                                    HttpServletRequest request
+    ) {
+        QueryWrapper<ProductionWhiteStripAllocation> wrapper = new QueryWrapper<ProductionWhiteStripAllocation>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+//        wrapper
+//                .like(StringUtils.isNotEmpty(witeStripAllRequest.getMaterialCode()), "material_code", witeStripAllRequest.getMaterialCode())
+//                .like(StringUtils.isNotEmpty(witeStripAllRequest.getSaleNum()), "sale_num", witeStripAllRequest.getSaleNum())
+//                .eq(StringUtils.isNotEmpty(witeStripAllRequest.getProductionDate()), "production_date", witeStripAllRequest.getProductionDate());
+        wrapper.eq("sale_id",witeStripAllRequest.getSaleId() );
+        return success(productionWhiteStripAllocationService.list(
+                wrapper
+        ));
+    }
+    @ApiOperation("批量修改状态")
+    @PostMapping("/editAllStatus")
+    public AjaxResult editAllStatus(@RequestBody Map<String, String> paramsMap) throws Exception {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            ProductionWhiteStripAllocation productionWhiteStripAllocation = new ProductionWhiteStripAllocation();
+            productionWhiteStripAllocation.setId(Integer.parseInt(id));
+            productionWhiteStripAllocation.setCompletionStatus(1);
+            productionWhiteStripAllocationService.updateById(productionWhiteStripAllocation);
+            ProductionWhiteStripAllocation byId = productionWhiteStripAllocationService.getById(id);
+            saveShipmentNotification(byId);
+        }
+        return success();
+    }
+
+    private void saveShipmentNotification(ProductionWhiteStripAllocation byId) {
+
+        ProductionShipmentNotification productionShipmentNotification = new ProductionShipmentNotification();
+
+        SalesOrderGoods salesOrder = salesOrderGoodsService.getById(byId.getSaleId());
+
+        BeanUtil.copyProperties(byId,productionShipmentNotification);
+        productionShipmentNotification.setAmount(salesOrder.getSubTotal()) ;
+        productionShipmentNotification.setUnitPrice(salesOrder.getUnitPrice()) ;
+
+
+        BaseMaterial material = baseMaterialService.getOne(new QueryWrapper<BaseMaterial>().eq("goods_num", byId.getMaterialCode()));
+        productionShipmentNotification.setProductType(material.getProductTypeName()) ;
+        productionShipmentNotification.setProductNum(material.getProductType());
+        productionShipmentNotification.setMaterialName(material.getGoodsName());
+        productionShipmentNotification.setBaseNum(salesOrder.getBaseNum());
+        productionShipmentNotification.setUnit(salesOrder.getBaseUnit());
+        productionShipmentNotification.setAssNum(salesOrder.getAssNum());
+        productionShipmentNotification.setAuxiliaryUnit(salesOrder.getAssUnit());
+//        productionShipmentNotification.setTotalDeduction(salesOrder.getReceivableCustomer()) ;
+//        productionShipmentNotification.setCustomerChannel(salesOrder.getc()) ;
+        productionShipmentNotification.setWarehouse(material.getWarehouseName()) ;
+        List<SalesOrder> salesOrders = salesOrderService.list(new QueryWrapper<SalesOrder>().eq("order_num", salesOrder.getOrderNum()));
+        if(ObjectUtil.isNotEmpty(salesOrders)){
+            productionShipmentNotification.setReceivableCustomer(salesOrders.get(0).getCustomerName()) ;
+            productionShipmentNotification.setCustomer(salesOrders.get(0).getCustomerName()) ;
+            productionShipmentNotification.setCustomerNumber(salesOrders.get(0).getCustomerNum()) ;
+
+        }
+
+
+        productionShipmentNotification.setSalesWeight(byId.getWeight()) ;
+//        productionShipmentNotification.setSalesDeductionPercentage(salesOrder.getReceivableCustomer()) ;
+
+        shipmentNotificationService.save(productionShipmentNotification);
+    }
+
+    @ApiOperation("白条分配分页")
+    @GetMapping("/page")
+    public AjaxResult page(
+            @RequestParam("pageNum") Integer pageNum,
+            @RequestParam("pageSize") Integer pageSize,
+            HttpServletRequest request
+    ) {
+        return success(productionWhiteStripAllocationService.page(
+                new Page<ProductionWhiteStripAllocation>(pageNum, pageSize),
+                new QueryWrapper<ProductionWhiteStripAllocation>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("白条分配详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionWhiteStripAllocationService.getById(id));
+    }
+}

+ 85 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripBatchController.java

@@ -0,0 +1,85 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionWhiteStripBatch;
+import com.ruoyi.web.base.service.IProductionWhiteStripBatchService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-white-strip-batch")
+public class ProductionWhiteStripBatchController {
+
+    @Autowired
+    private IProductionWhiteStripBatchService productionWhiteStripBatchService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("白条批次添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionWhiteStripBatch batch, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+
+        batch.setOrgId(loginOrgId);
+        batch.setCreateBy(getUsername());
+        return success(productionWhiteStripBatchService.save(batch));
+    }
+
+    @ApiOperation("白条批次修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionWhiteStripBatch batch, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        batch.setUpdateBy(getUsername());
+        return success(productionWhiteStripBatchService.updateById(batch));
+    }
+
+    @ApiOperation("白条批次删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionWhiteStripBatchService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("白条批次列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        return success(productionWhiteStripBatchService.list(
+                new QueryWrapper<ProductionWhiteStripBatch>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("白条批次分页")
+    @GetMapping("/page")
+    public AjaxResult page(
+            @RequestParam("pageNum") Integer pageNum,
+            @RequestParam("pageSize") Integer pageSize,
+            HttpServletRequest request
+    ) {
+        return success(productionWhiteStripBatchService.page(
+                new Page<ProductionWhiteStripBatch>(pageNum, pageSize),
+                new QueryWrapper<ProductionWhiteStripBatch>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("白条批次详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionWhiteStripBatchService.getById(id));
+    }
+}

+ 117 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripPreCoolingController.java

@@ -0,0 +1,117 @@
+package com.ruoyi.web.base.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionRecord;
+import com.ruoyi.web.base.domain.ProductionWhiteStripPreCooling;
+import com.ruoyi.web.base.domain.ProductionWhiteStripRefined;
+import com.ruoyi.web.base.domain.param.WiteStripRequest;
+import com.ruoyi.web.base.service.IProductionRecordService;
+import com.ruoyi.web.base.service.IProductionWhiteStripPreCoolingService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-white-strip-pre-cooling")
+public class ProductionWhiteStripPreCoolingController {
+
+    @Autowired
+    private IProductionWhiteStripPreCoolingService productionWhiteStripPreCoolingService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private IProductionRecordService productionRecordService;
+
+
+    @ApiOperation("白条预冷添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionWhiteStripPreCooling preCooling, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionWhiteStripPreCoolingService.count(
+                new QueryWrapper<ProductionWhiteStripPreCooling>()
+                        .eq("org_id", loginOrgId)
+                        .eq("production_record_number", preCooling.getProductionRecordNumber())
+        ) > 0) {
+            throw new Exception("该预冷编号已存在");
+        }
+        preCooling.setOrgId(loginOrgId);
+        preCooling.setCreateBy(getUsername());
+        ProductionRecord productionRecord = new ProductionRecord();
+        BeanUtil.copyProperties(preCooling,productionRecord);
+        productionRecordService.save(productionRecord);
+        return success(productionWhiteStripPreCoolingService.save(preCooling));
+    }
+
+    @ApiOperation("白条预冷修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionWhiteStripPreCooling preCooling, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionWhiteStripPreCoolingService.count(
+                new QueryWrapper<ProductionWhiteStripPreCooling>()
+                        .ne("id", preCooling.getId())
+                        .eq("org_id", loginOrgId)
+                        .eq("production_record_number", preCooling.getProductionRecordNumber())
+        ) > 0) {
+            throw new Exception("该预冷编号已存在");
+        }
+        preCooling.setUpdateBy(getUsername());
+        return success(productionWhiteStripPreCoolingService.updateById(preCooling));
+    }
+
+    @ApiOperation("白条预冷删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionWhiteStripPreCoolingService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("白条预冷列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(   @RequestBody WiteStripRequest planRequest,
+                                 HttpServletRequest request) {
+        QueryWrapper<ProductionWhiteStripPreCooling> wrapper = new QueryWrapper<ProductionWhiteStripPreCooling>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()),"production_plan_number",planRequest.getProductionPlanNumber())
+                .like(StringUtils.isNotEmpty(planRequest.getProductionRecordNumber()),"production_record_number",planRequest.getProductionRecordNumber());
+
+        return success(productionWhiteStripPreCoolingService.list(
+                wrapper));
+    }
+
+    @ApiOperation("白条预冷分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+            @RequestBody WiteStripRequest planRequest,
+            HttpServletRequest request
+    ) {
+        QueryWrapper<ProductionWhiteStripPreCooling> wrapper = new QueryWrapper<ProductionWhiteStripPreCooling>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()),"production_plan_number",planRequest.getProductionPlanNumber())
+                .like(StringUtils.isNotEmpty(planRequest.getProductionRecordNumber()),"production_record_number",planRequest.getProductionRecordNumber());
+        return success(productionWhiteStripPreCoolingService.page(
+                new Page<ProductionWhiteStripPreCooling>(planRequest.getPageNum(), planRequest.getPageSize()),
+                wrapper
+        ));
+    }
+
+    @ApiOperation("白条预冷详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionWhiteStripPreCoolingService.getById(id));
+    }
+}

+ 117 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripRefinedController.java

@@ -0,0 +1,117 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionRegular;
+import com.ruoyi.web.base.domain.ProductionWhiteStripRefined;
+import com.ruoyi.web.base.domain.param.ProductionRegularPlanRequest;
+import com.ruoyi.web.base.domain.param.WiteStripRequest;
+import com.ruoyi.web.base.service.IProductionWhiteStripRefinedService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-white-strip-refined")
+public class ProductionWhiteStripRefinedController {
+
+    @Autowired
+    private IProductionWhiteStripRefinedService productionWhiteStripRefinedService;
+    @Autowired
+    private TokenService tokenService;
+
+
+
+
+    @ApiOperation("白条精加工添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionWhiteStripRefined refined, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionWhiteStripRefinedService.count(
+                new QueryWrapper<ProductionWhiteStripRefined>()
+                        .eq("org_id", loginOrgId)
+                        .eq("production_plan_number", refined.getProductionPlanNumber())
+                        .eq("white_strip_number", refined.getWhiteStripNumber())
+        ) > 0) {
+            throw new Exception("该精加工编号已存在");
+        }
+        refined.setOrgId(loginOrgId);
+        refined.setCreateBy(getUsername());
+        return success(productionWhiteStripRefinedService.save(refined));
+    }
+
+    @ApiOperation("白条精加工修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionWhiteStripRefined refined, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionWhiteStripRefinedService.count(
+                new QueryWrapper<ProductionWhiteStripRefined>()
+                        .ne("id", refined.getId())
+                        .eq("org_id", loginOrgId)
+
+                        .eq("production_plan_number", refined.getProductionPlanNumber())
+                        .eq("white_strip_number", refined.getWhiteStripNumber())
+        ) > 0) {
+            throw new Exception("该精加工编号已存在");
+        }
+        refined.setUpdateBy(getUsername());
+        return success(productionWhiteStripRefinedService.updateById(refined));
+    }
+
+    @ApiOperation("白条精加工删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+        productionWhiteStripRefinedService.removeById(id);
+    }
+        return success();
+}
+
+    @ApiOperation("白条精加工列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(@RequestBody WiteStripRequest planRequest, HttpServletRequest request) {
+        QueryWrapper<ProductionWhiteStripRefined> wrapper = new QueryWrapper<ProductionWhiteStripRefined>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()),"production_plan_number",planRequest.getProductionPlanNumber())
+                .like(StringUtils.isNotEmpty(planRequest.getProductionRecordNumber()),"production_record_number",planRequest.getProductionRecordNumber());
+        return success(productionWhiteStripRefinedService.list(
+                wrapper
+        ));
+    }
+
+
+
+    @ApiOperation("白条精加工分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+            @RequestBody WiteStripRequest planRequest,
+            HttpServletRequest request
+
+    ) {
+        QueryWrapper<ProductionWhiteStripRefined> wrapper = new QueryWrapper<ProductionWhiteStripRefined>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()),"production_plan_number",planRequest.getProductionPlanNumber())
+                .like(StringUtils.isNotEmpty(planRequest.getProductionRecordNumber()),"production_record_number",planRequest.getProductionRecordNumber());
+        return success(productionWhiteStripRefinedService.page(
+                new Page<ProductionWhiteStripRefined>(planRequest.getPageNum(), planRequest.getPageSize()),
+                wrapper
+        ));
+    }
+
+    @ApiOperation("白条精加工详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionWhiteStripRefinedService.getById(id));
+    }
+}

+ 99 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripRegularController.java

@@ -0,0 +1,99 @@
+package com.ruoyi.web.base.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionWhiteStripRegular;
+import com.ruoyi.web.base.service.IProductionWhiteStripRegularService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+@RestController
+@RequestMapping("/production-white-strip-regular")
+public class ProductionWhiteStripRegularController {
+
+    @Autowired
+    private IProductionWhiteStripRegularService productionWhiteStripRegularService;
+    @Autowired
+    private TokenService tokenService;
+
+    @ApiOperation("白条常规添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody ProductionWhiteStripRegular regular, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionWhiteStripRegularService.count(
+                new QueryWrapper<ProductionWhiteStripRegular>()
+                        .eq("org_id", loginOrgId)
+                        .eq("production_record_number", regular.getProductionRecordNumber())
+        ) > 0) {
+            throw new Exception("该常规编号已存在");
+        }
+        regular.setOrgId(loginOrgId);
+        regular.setCreateBy(getUsername());
+        return success(productionWhiteStripRegularService.save(regular));
+    }
+
+    @ApiOperation("白条常规修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody ProductionWhiteStripRegular regular, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        if (productionWhiteStripRegularService.count(
+                new QueryWrapper<ProductionWhiteStripRegular>()
+                        .ne("id", regular.getId())
+                        .eq("org_id", loginOrgId)
+                        .eq("production_record_number", regular.getProductionRecordNumber())
+        ) > 0) {
+            throw new Exception("该常规编号已存在");
+        }
+        regular.setUpdateBy(getUsername());
+        return success(productionWhiteStripRegularService.updateById(regular));
+    }
+
+    @ApiOperation("白条常规删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionWhiteStripRegularService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("白条常规列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(HttpServletRequest request) {
+        return success(productionWhiteStripRegularService.list(
+                new QueryWrapper<ProductionWhiteStripRegular>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("白条常规分页")
+    @GetMapping("/page")
+    public AjaxResult page(
+            @RequestParam("pageNum") Integer pageNum,
+            @RequestParam("pageSize") Integer pageSize,
+            HttpServletRequest request
+    ) {
+        return success(productionWhiteStripRegularService.page(
+                new Page<ProductionWhiteStripRegular>(pageNum, pageSize),
+                new QueryWrapper<ProductionWhiteStripRegular>()
+                        .eq("org_id", tokenService.getLoginOrgId(request))
+        ));
+    }
+
+    @ApiOperation("白条常规详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionWhiteStripRegularService.getById(id));
+    }
+}

+ 134 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/ProductionWhiteStripRequisitionController.java

@@ -0,0 +1,134 @@
+package com.ruoyi.web.base.controller;
+
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.web.base.domain.ProductionRecord;
+import com.ruoyi.web.base.domain.ProductionRegular;
+import com.ruoyi.web.base.domain.ProductionWhiteStripRequisition;
+import com.ruoyi.web.base.domain.param.AddProductionWhiteStripRequisition;
+import com.ruoyi.web.base.domain.param.WiteStripRequest;
+import com.ruoyi.web.base.service.IProductionRecordService;
+import com.ruoyi.web.base.service.IProductionRegularService;
+import com.ruoyi.web.base.service.IProductionWhiteStripRequisitionService;
+import com.ruoyi.web.base.service.IProductionWhiteStripRequisitionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.SecurityUtils.getUsername;
+
+/**
+ * <p>
+ * 分割生产白条领料表,存储分割生产白条领料的相关数据 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2026-03-19
+ */
+@RestController
+@RequestMapping("/production-white-strip-requisition")
+@Api("分割白条")
+public class ProductionWhiteStripRequisitionController {
+
+    @Autowired
+    private IProductionWhiteStripRequisitionService productionWhiteStripRequisitionService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private IProductionRegularService regularService;
+  
+
+
+    @ApiOperation("分割白条添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody AddProductionWhiteStripRequisition productionWhiteStripRequisition, HttpServletRequest request) throws Exception {
+        String loginOrgId = tokenService.getLoginOrgId(request);
+        List<ProductionWhiteStripRequisition> goods = productionWhiteStripRequisition.getGoods();
+        for (ProductionWhiteStripRequisition good : goods) {
+            good.setOrgId(loginOrgId);
+            good.setCreateBy(getUsername());
+            good.setProductionPlanNum(productionWhiteStripRequisition.getProductionPlanNum());
+            ProductionRegular productionRegular = new ProductionRegular();
+            productionRegular.setIsFenge(1);
+            productionRegular.setId(good.getId());
+            regularService.updateById(productionRegular );
+        }
+        
+        return success(productionWhiteStripRequisitionService.saveBatch(productionWhiteStripRequisition.getGoods()));
+    }
+
+    @ApiOperation("分割白条修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody AddProductionWhiteStripRequisition productionWhiteStripRequisition, HttpServletRequest request) throws Exception {
+  
+        
+        List<ProductionWhiteStripRequisition> goods = productionWhiteStripRequisition.getGoods();
+        for (ProductionWhiteStripRequisition good : goods) {
+            good.setUpdateBy(getUsername());
+            productionWhiteStripRequisitionService.updateById(good);
+        }
+        return success();
+    }
+
+    @ApiOperation("分割白条删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        for (String id : ids.split(",")) {
+            productionWhiteStripRequisitionService.removeById(id);
+        }
+        return success();
+    }
+
+    @ApiOperation("分割白条列表")
+    @PostMapping("/list")
+    public AjaxResult listAll(   @RequestBody WiteStripRequest planRequest,
+                                 HttpServletRequest request) {
+        QueryWrapper<ProductionWhiteStripRequisition> wrapper = new QueryWrapper<ProductionWhiteStripRequisition>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+//        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()),"production_plan_number",planRequest.getProductionPlanNumber())
+//                .like(StringUtils.isNotEmpty(planRequest.getProductionRecordNumber()),"production_record_number",planRequest.getProductionRecordNumber());
+
+        return success(productionWhiteStripRequisitionService.list(
+                wrapper));
+    }
+
+    @ApiOperation("分割白条分页")
+    @PostMapping("/page")
+    public AjaxResult page(
+            @RequestBody WiteStripRequest planRequest,
+            HttpServletRequest request
+    ) {
+        QueryWrapper<ProductionWhiteStripRequisition> wrapper = new QueryWrapper<ProductionWhiteStripRequisition>()
+                .eq("org_id", tokenService.getLoginOrgId(request));
+//        wrapper.like(StringUtils.isNotEmpty(planRequest.getProductionPlanNumber()),"production_plan_number",planRequest.getProductionPlanNumber())
+//                .like(StringUtils.isNotEmpty(planRequest.getProductionRecordNumber()),"production_record_number",planRequest.getProductionRecordNumber());
+        return success(productionWhiteStripRequisitionService.page(
+                new Page<ProductionWhiteStripRequisition>(planRequest.getPageNum(), planRequest.getPageSize()),
+                wrapper
+        ));
+    }
+
+    @ApiOperation("分割白条详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(productionWhiteStripRequisitionService.getById(id));
+    }
+}

+ 50 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseAutoLevel.java

@@ -0,0 +1,50 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 自动转级别
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_auto_level")
+@ApiModel(value="BaseAutoLevel对象", description="自动转级别")
+public class BaseAutoLevel extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "序号")
+    private String varietyNum;
+
+    @ApiModelProperty(value = "品牌名称")
+    private String varietyName;
+
+    private String weightStart;
+
+    private String weightEnd;
+
+    @ApiModelProperty(value = "级别序号")
+    private String levelNo;
+
+    @ApiModelProperty(value = "级别序号")
+    private String levelName;
+
+
+
+
+
+
+}

+ 39 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseBrand.java

@@ -0,0 +1,39 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 品牌
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_brand")
+@ApiModel(value="BaseBrand对象", description="品牌")
+public class BaseBrand extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty(value = "序号")
+    private String brandNum;
+
+    @ApiModelProperty(value = "品牌名称")
+    private String brandName;
+
+
+
+
+}

+ 35 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseBreed.java

@@ -0,0 +1,35 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_breed")
+@ApiModel(value="BaseBreed对象", description="")
+public class BaseBreed extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+
+
+    @ApiModelProperty(value = "畜种名称")
+    private String breedName;
+
+
+}

+ 42 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseCoatColor.java

@@ -0,0 +1,42 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 毛色
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_coat_color")
+@ApiModel(value="BaseCoatColor对象", description="毛色")
+public class BaseCoatColor extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+    private String coatNum;
+
+    @ApiModelProperty(value = "毛色名称")
+    private String coatName;
+
+    @ApiModelProperty(value = "毛色简称")
+    private String coatSortName;
+
+    @ApiModelProperty(value = "状态 0启用")
+    private Integer coatStatus;
+
+
+
+}

+ 38 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseCustomerChannel.java

@@ -0,0 +1,38 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 客户渠道
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_customer_channel")
+@ApiModel(value="BaseCustomerChannel对象", description="客户渠道")
+public class BaseCustomerChannel extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "序号")
+    private String customerNum;
+
+    @ApiModelProperty(value = "渠道名称")
+    private String customerName;
+
+
+
+
+}

+ 40 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseDepartment.java

@@ -0,0 +1,40 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_department")
+public class BaseDepartment extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+    private String departmentNum;
+
+    private String departmentName;
+
+    private String englishName;
+
+    private String departmentAddr;
+
+    private String departmentPhone;
+
+    private String departmentManager;
+
+
+
+}

+ 119 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseEmployee.java

@@ -0,0 +1,119 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_employee")
+@ApiModel(value="BaseEmployee对象", description="")
+public class BaseEmployee extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+
+
+    @ApiModelProperty(value = "员工编号")
+
+    private String employeeNum;
+
+    @ApiModelProperty(value = "员工姓名")
+    private String employeeName;
+
+    @ApiModelProperty(value = "员工类型  员工,采购员,销售员")
+    private String employeeType;
+
+    @ApiModelProperty(value = "部门编号")
+    private String departmentNum;
+
+    @ApiModelProperty(value = "部门名称")
+    private String departmentName;
+
+    @ApiModelProperty(value = "性别")
+    private String gender;
+
+    @ApiModelProperty(value = "血型")
+    private String bloodType;
+
+    @ApiModelProperty(value = "身份证号")
+    private String idCard;
+
+    @ApiModelProperty(value = "转帐科目")
+    private String transferAccount;
+
+    @ApiModelProperty(value = "婚姻")
+    private String marriage;
+
+    @ApiModelProperty(value = "职务")
+    private String position;
+
+    @ApiModelProperty(value = "银行帐号")
+    private String bankNum;
+
+    @ApiModelProperty(value = "出生日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date birthday;
+
+    @ApiModelProperty(value = "到职日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date employmentDate;
+
+    @ApiModelProperty(value = "离职日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date departureDate;
+
+    @ApiModelProperty(value = "籍贯")
+    private String placeOrigin;
+
+    @ApiModelProperty(value = "联络人")
+    private String contactPerson;
+
+    @ApiModelProperty(value = "联络电话")
+    private String contactPhone;
+
+    @ApiModelProperty(value = "联络地址")
+    private String contactAddr;
+
+    @ApiModelProperty(value = "户籍地址")
+    private String registerAddress;
+
+    @ApiModelProperty(value = "手机")
+    private String phone;
+
+    @ApiModelProperty(value = "E一Mail")
+    private String mail;
+
+    @ApiModelProperty(value = "经历")
+    private String experience;
+
+    @ApiModelProperty(value = "学历")
+    private String qualification;
+
+    @ApiModelProperty(value = "备注一")
+    private String remark1;
+
+    @ApiModelProperty(value = "备注二")
+    private String remark2;
+
+
+}

+ 34 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseFaristAccount.java

@@ -0,0 +1,34 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 一级科目
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_farist_account")
+@ApiModel(value="BaseFaristAccount对象", description="一级科目")
+public class BaseFaristAccount extends Base {
+
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "序号")
+    private String faristNum;
+
+    @ApiModelProperty(value = "名称")
+    private String faristName;
+
+}

+ 41 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseLevel.java

@@ -0,0 +1,41 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_level")
+@ApiModel(value="BaseLevel对象", description="")
+public class BaseLevel extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+    private String levelNo;
+
+    @ApiModelProperty(value = "畜种名称")
+    private String levelName;
+
+    @ApiModelProperty(value = "数字级别")
+    private String numLevel;
+
+    @ApiModelProperty(value = "打印级别")
+    private String printLevel;
+
+
+}

+ 77 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseLine.java

@@ -0,0 +1,77 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 物流线
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_line")
+@ApiModel(value="BaseLine对象", description="物流线")
+public class BaseLine extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty(value = "序号")
+    private String lineNum;
+
+    @ApiModelProperty(value = "物流线名称")
+    private String lineName;
+
+    @ApiModelProperty(value = "车牌号")
+    private String carNum;
+
+    @ApiModelProperty(value = "车型")
+    private String carModel;
+
+    @ApiModelProperty(value = "载重")
+    private String loadCapacity;
+
+    @ApiModelProperty(value = "司机姓名")
+    private String driverName;
+
+    @ApiModelProperty(value = "手机")
+    private String phone;
+
+    @ApiModelProperty(value = "身份证号")
+    private String idCrad;
+
+    @ApiModelProperty(value = "家庭住址")
+    private String address;
+
+    @ApiModelProperty(value = "起始站")
+    private String startStation;
+
+    @ApiModelProperty(value = "终点站")
+    private String endStation;
+
+    @ApiModelProperty(value = "总里程")
+    private String totalMileage;
+
+    @ApiModelProperty(value = "状态")
+    private Integer lineStatus;
+    @TableField(exist =  false)
+    private List<BaseMarket> goods;
+
+
+
+
+}

+ 62 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseMarket.java

@@ -0,0 +1,62 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 市场
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_market")
+@ApiModel(value="BaseMarket对象", description="市场")
+public class BaseMarket extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty(value = "序号")
+    private String marketNum;
+
+    @ApiModelProperty(value = "市场名称")
+    private String marketName;
+
+    @ApiModelProperty(value = "物流线")
+    private String lineNum;
+
+    @ApiModelProperty(value = "物流线")
+    private String lineName;
+
+    @ApiModelProperty(value = "区域")
+    private String region;
+
+    @ApiModelProperty(value = "价格类型")
+    private String priceType;
+
+    @ApiModelProperty(value = "市场容量")
+    private String marketSize;
+
+    @ApiModelProperty(value = "市场地址")
+    private String marketAddress;
+
+    @ApiModelProperty(value = "业务员")
+    private String salesperson;
+
+    @ApiModelProperty(value = "状态")
+    private Integer marketStatus;
+
+
+
+}

+ 93 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseMaterial.java

@@ -0,0 +1,93 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_material")
+@ApiModel(value="BaseMaterial对象", description="")
+public class BaseMaterial extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty(value = "货品编号")
+    private String goodsNum;
+
+    @ApiModelProperty(value = "货品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "仓库编号")
+    private String warehouseNo;
+
+    @ApiModelProperty(value = "仓库名称")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "货品类别")
+    private String goodsType;
+    private String goodsTypeName;
+
+    @ApiModelProperty(value = "货品规格")
+    private String goodsSpec;
+
+    @ApiModelProperty(value = "货品条码")
+    private String goodsBarcode;
+
+    @ApiModelProperty(value = "计量单位")
+    private String unit;
+
+    @ApiModelProperty(value = "辅助计量单位")
+    private String assistantUnit;
+
+    @ApiModelProperty(value = "换算值")
+    private String conversionValue;
+
+    @ApiModelProperty(value = "品种")
+    private String variety;
+    private String varietyName;
+
+    @ApiModelProperty(value = "级别")
+    private String goodsLevel;
+
+    @ApiModelProperty(value = "状态")
+    private String goodsStatus;
+
+    @ApiModelProperty(value = "货品颜色")
+    private String goodsColor;
+
+    @ApiModelProperty(value = "货品尺寸")
+    private String goodsSize;
+
+    @ApiModelProperty(value = "产品类型")
+    private String productType;
+    private String productTypeName;
+
+
+    private String remark1;
+
+    private String remark2;
+
+    private String remark3;
+
+    private String remark4;
+
+    private String remark5;
+
+
+}

+ 51 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BasePriceType.java

@@ -0,0 +1,51 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 价格类型
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_price_type")
+@ApiModel(value="BasePriceType对象", description="价格类型")
+public class BasePriceType  extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+
+
+    @ApiModelProperty(value = "编号")
+    private String priceTypeNum;
+
+    @ApiModelProperty(value = "名称")
+    private String priceTypeName;
+
+    @ApiModelProperty(value = "简称")
+    private String sortName;
+
+    @ApiModelProperty(value = "0启用")
+    private Integer priceTypeStatus;
+
+
+
+}

+ 44 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseProductCategory.java

@@ -0,0 +1,44 @@
+package com.ruoyi.web.base.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.ruoyi.web.base.domain.base.Base;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 货品类别
+ * </p>
+ *
+ * @author author
+ * @since 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_product_category")
+@ApiModel(value="BaseProductCategory对象", description="货品类别")
+public class BaseProductCategory extends Base {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "编号")
+    private String num;
+
+    @ApiModelProperty(value = "名称")
+    private String categoryName;
+
+    private Integer parentId;
+
+    @TableField(exist =  false)
+    private List<BaseProductCategory> child;
+
+
+}

+ 0 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/BaseProductType.java


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio