admin 1 месяц назад
Сommit
257993d806
100 измененных файлов с 13893 добавлено и 0 удалено
  1. 10 0
      .classpath
  2. 1 0
      .gitignore
  3. 10 0
      .idea/.gitignore
  4. 7 0
      .idea/MarsCodeWorkspaceAppSettings.xml
  5. 22 0
      .idea/compiler.xml
  6. 10 0
      .idea/encodings.xml
  7. 20 0
      .idea/jarRepositories.xml
  8. 12 0
      .idea/misc.xml
  9. 6 0
      .idea/vcs.xml
  10. 34 0
      .project
  11. 2 0
      .settings/org.eclipse.core.resources.prefs
  12. 16 0
      .settings/org.eclipse.jdt.core.prefs
  13. 4 0
      .settings/org.eclipse.m2e.core.prefs
  14. 4 0
      client-app/.gitignore
  15. 34 0
      client-app/.project
  16. 61 0
      client-app/pom.xml
  17. 22 0
      client-app/src/main/java/com/sapit/client/app/AppApplication.java
  18. 85 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/goods/EvaluateManageController.java
  19. 129 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/goods/GoodsManageController.java
  20. 115 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/goods/GoodsStatisticsController.java
  21. 53 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/member/ComplaintController.java
  22. 41 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/member/MemberManageController.java
  23. 228 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/AdvertiseManageController.java
  24. 212 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/CarouselManageController.java
  25. 239 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/DineAndDashManageController.java
  26. 147 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/DineAndDashStoreManageController.java
  27. 195 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/IconManageController.java
  28. 48 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/IndexStoreGoodsManageController.java
  29. 285 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/IndexStoreManageController.java
  30. 183 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/NoticeManageController.java
  31. 57 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/RaffleRecordManageController.java
  32. 170 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/operate/SpecialsManageController.java
  33. 213 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/order/FeedbackManageController.java
  34. 253 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/order/OrderManageController.java
  35. 50 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/order/OrderSettlementController.java
  36. 363 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/order/OrderYearController.java
  37. 77 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/order/RefundController.java
  38. 94 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/order/RefundFailedController.java
  39. 133 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/rider/AddressGroupManageController.java
  40. 283 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/rider/AddressManageController.java
  41. 117 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/rider/DeliveryOrderManageController.java
  42. 366 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/rider/RiderManageController.java
  43. 121 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/rider/RiderOrderAcountController.java
  44. 110 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/setting/PrinterManageController.java
  45. 137 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/setting/SystemSettingManageController.java
  46. 88 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/settlement/OperatorSettlementController.java
  47. 469 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/settlement/StoreStatementController.java
  48. 45 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/statistics/OrderSourceStatisticsController.java
  49. 92 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/statistics/OrderStatisticsController.java
  50. 166 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/store/StoreAreaManageController.java
  51. 254 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/store/StoreManageController.java
  52. 218 0
      client-app/src/main/java/com/sapit/client/app/manage/controller/store/StoreUserManageController.java
  53. 46 0
      client-app/src/main/java/com/sapit/client/app/manage/service/goods/EvaluateManageService.java
  54. 105 0
      client-app/src/main/java/com/sapit/client/app/manage/service/goods/GoodsManageService.java
  55. 36 0
      client-app/src/main/java/com/sapit/client/app/manage/service/goods/GoodsStatisticsService.java
  56. 47 0
      client-app/src/main/java/com/sapit/client/app/manage/service/member/ComplaintService.java
  57. 29 0
      client-app/src/main/java/com/sapit/client/app/manage/service/member/MemberManageService.java
  58. 97 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/AdvertiseManageService.java
  59. 107 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/CarouselManageService.java
  60. 118 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/DineAndDashManageService.java
  61. 75 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/DineAndDashStoreManageService.java
  62. 96 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/IconManageService.java
  63. 61 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/IndexStoreGoodsManageService.java
  64. 121 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/IndexStoreManageService.java
  65. 108 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/NoticeManageService.java
  66. 39 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/RaffleRecordManageService.java
  67. 108 0
      client-app/src/main/java/com/sapit/client/app/manage/service/operate/SpecialsManageService.java
  68. 34 0
      client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderDetailService.java
  69. 34 0
      client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderDetailYearService.java
  70. 953 0
      client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderManageService.java
  71. 36 0
      client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderSettlementService.java
  72. 168 0
      client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderYearService.java
  73. 132 0
      client-app/src/main/java/com/sapit/client/app/manage/service/order/RefundFailedService.java
  74. 224 0
      client-app/src/main/java/com/sapit/client/app/manage/service/order/RefundService.java
  75. 109 0
      client-app/src/main/java/com/sapit/client/app/manage/service/rider/AddressGroupManageService.java
  76. 202 0
      client-app/src/main/java/com/sapit/client/app/manage/service/rider/AddressManageService.java
  77. 223 0
      client-app/src/main/java/com/sapit/client/app/manage/service/rider/DeliveryOrderManageService.java
  78. 162 0
      client-app/src/main/java/com/sapit/client/app/manage/service/rider/RiderManageService.java
  79. 51 0
      client-app/src/main/java/com/sapit/client/app/manage/service/rider/RiderOrderAcountService.java
  80. 179 0
      client-app/src/main/java/com/sapit/client/app/manage/service/setting/PrinterManageService.java
  81. 107 0
      client-app/src/main/java/com/sapit/client/app/manage/service/setting/SettingManageService.java
  82. 49 0
      client-app/src/main/java/com/sapit/client/app/manage/service/settlement/OperatorSettlementService.java
  83. 117 0
      client-app/src/main/java/com/sapit/client/app/manage/service/settlement/StoreStatementService.java
  84. 36 0
      client-app/src/main/java/com/sapit/client/app/manage/service/statistics/OrderSourceStatisticsService.java
  85. 76 0
      client-app/src/main/java/com/sapit/client/app/manage/service/statistics/OrderStatisticsService.java
  86. 137 0
      client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreAreaManageService.java
  87. 68 0
      client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreBrowseManageService.java
  88. 51 0
      client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreInfoManageService.java
  89. 431 0
      client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreManageService.java
  90. 100 0
      client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreUserManageService.java
  91. 114 0
      client-app/src/main/java/com/sapit/client/app/manage/store1/controller/StoreManage1Controller.java
  92. 289 0
      client-app/src/main/java/com/sapit/client/app/manage/store1/persistence/StoreManage1Dao.java
  93. 183 0
      client-app/src/main/java/com/sapit/client/app/manage/store1/service/StoreManage1Service.java
  94. 377 0
      client-app/src/main/java/com/sapit/client/app/persistence/goods/EvaluateDao.java
  95. 992 0
      client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsDao.java
  96. 385 0
      client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsModelDao.java
  97. 160 0
      client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsPropertyDao.java
  98. 87 0
      client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsStatisticsDao.java
  99. 207 0
      client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsTypeDao.java
  100. 116 0
      client-app/src/main/java/com/sapit/client/app/persistence/member/ComplaintDao.java

+ 10 - 0
.classpath

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+/target/

+ 10 - 0
.idea/.gitignore

@@ -0,0 +1,10 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 已忽略包含查询文件的默认文件夹
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/

+ 7 - 0
.idea/MarsCodeWorkspaceAppSettings.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="com.codeverse.userSettings.MarscodeWorkspaceAppSettingsState">
+    <option name="chatAppRouterInfo" value="chat-session" />
+    <option name="progress" value="1.0" />
+  </component>
+</project>

+ 22 - 0
.idea/compiler.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="common" />
+        <module name="client-plat" />
+        <module name="client-app" />
+      </profile>
+    </annotationProcessing>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="client-app" options="-parameters" />
+      <module name="client-plat" options="-parameters" />
+      <module name="common" options="-parameters" />
+    </option>
+  </component>
+</project>

+ 10 - 0
.idea/encodings.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/client-app/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/client-plat/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/common/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 20 - 0
.idea/jarRepositories.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+  </component>
+</project>

+ 12 - 0
.idea/misc.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="D:/" vcs="Git" />
+  </component>
+</project>

+ 34 - 0
.project

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>eduepos-group</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1784687315969</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>

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

@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8

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

@@ -0,0 +1,16 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8

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

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

+ 4 - 0
client-app/.gitignore

@@ -0,0 +1,4 @@
+/target/
+/.settings/
+.classpath
+/bin/

+ 34 - 0
client-app/.project

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>client-app</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1784687315949</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>

+ 61 - 0
client-app/pom.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+	    <groupId>com.sapit</groupId>
+	    <artifactId>eduepos-group</artifactId>
+    	<version>1.0.0</version>
+  	</parent>
+  	
+	<artifactId>client-app</artifactId>
+	<name>client-app</name>
+	<packaging>jar</packaging>
+	
+  	<dependencies>
+		<dependency>
+			<groupId>com.sapit</groupId>
+			<artifactId>common</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+	</dependencies>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<layout>ZIP</layout>
+					<includes>
+						<include>
+							<groupId>com.sapit</groupId>
+							<artifactId>common</artifactId>
+						</include>
+					</includes>
+				</configuration>
+			</plugin>
+			<plugin>
+	            <groupId>org.apache.maven.plugins</groupId>
+	            <artifactId>maven-dependency-plugin</artifactId>
+	            <executions>
+	                <execution>
+		                <id>copy-dependencies</id>
+		                <phase>package</phase>
+		                <goals>
+		                    <goal>copy-dependencies</goal>
+		                </goals>
+		                <configuration>
+		                    <type>jar</type>
+		                    <includeTypes>jar</includeTypes>
+		                    <includeScope>runtime</includeScope>
+		                    <outputDirectory>
+		                    ${project.build.directory}/lib
+		                    </outputDirectory>
+		                </configuration>
+	                </execution>
+	            </executions>
+	        </plugin>
+	    </plugins>
+	</build>
+</project>

+ 22 - 0
client-app/src/main/java/com/sapit/client/app/AppApplication.java

@@ -0,0 +1,22 @@
+package com.sapit.client.app;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.cache.annotation.EnableCaching;
+
+
+/**
+ * Hello world!
+ *
+ */
+@EnableCaching
+@SpringBootApplication(scanBasePackages = {"com.sapit"})
+@EntityScan(basePackages = {"com.sapit.*"})
+public class AppApplication 
+{
+    public static void main( String[] args )
+    {
+    	SpringApplication.run(AppApplication.class, args);
+    }
+}

+ 85 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/goods/EvaluateManageController.java

@@ -0,0 +1,85 @@
+package com.sapit.client.app.manage.controller.goods;
+
+import com.sapit.client.app.manage.service.goods.EvaluateManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.goods.BuEvaluate;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.goods.BuEvaluateSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/16 18:57
+ */
+@RestController
+@RequestMapping(value = "evaluateManage", produces = "application/json")
+public class EvaluateManageController {
+
+    @Autowired
+    private EvaluateManageService evaluateManageService;
+
+    /**
+     * 方法名称:评价列表(分页)
+     * 功能描述:评价列表(分页)
+     * 参数说明:
+     * 作    者:jinw
+     * 日    期:2026-7-23
+     */
+    @PostMapping(value = "/getEvaluateList")
+    @AuthToken(type = "admin")
+    public ResultBean getEvaluateList(int pageSize, int currentPage, BuEvaluateSearchBean searchBean) {
+        ResultBean bean = new ResultBean();
+
+        if (pageSize <= 0 || pageSize > 100) {
+            pageSize = 20;
+        }
+        if (currentPage <= 0) {
+            currentPage = 1;
+        }
+
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        List<BuEvaluate> goodsList = evaluateManageService.getEvaluateList(pageControlData, searchBean);
+
+        bean.setList(goodsList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+    /**
+     * 方法名称:根据id删除评价
+     * 功能描述:根据id删除评价
+     * 参数说明:id 评价id
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/deleteById")
+    @AuthToken(type = "admin")
+    public ResultBean deleteById(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            evaluateManageService.deleteById(id);
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+
+        }
+
+        return bean;
+    }
+}

+ 129 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/goods/GoodsManageController.java

@@ -0,0 +1,129 @@
+package com.sapit.client.app.manage.controller.goods;
+
+import com.sapit.client.app.manage.service.goods.GoodsManageService;
+import com.sapit.common.entity.goods.BuGoods;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.goods.BuGoodsSearchBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * 类名称:商品管理Controller 
+ * 类描述:处理商品表的各种操作 
+ * 作  者:Lim 
+ * 时  间:2021-03-26
+ */
+@RestController
+@RequestMapping(value = "goodsManage", produces = "application/json")
+public class GoodsManageController {
+	// 日志输出
+	static final Logger log = LoggerFactory.getLogger(GoodsManageController.class);
+
+	@Autowired
+	private GoodsManageService goodsManageService;
+
+	/**
+	 * 方法名称:获取商品列表
+	 * 功能描述:根据查询条件查询BU_GOODS表数据,返回页面显示
+	 * 参数说明:
+	 * 作    者:jinw
+	 * 日    期:2026-7-23
+	 */
+	@PostMapping(value = "/getGoodsList")
+	@AuthToken(type = "admin")
+	public ResultBean getGoodsList(int pageSize, int currentPage, BuGoodsSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+
+		if (pageSize <= 0 || pageSize > 100) {
+			pageSize = 20;
+		}
+		if (currentPage <= 0) {
+			currentPage = 1;
+		}
+
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+
+		List<BuGoods> goodsList = goodsManageService.getGoodsList(pageControlData, searchBean);
+
+		bean.setList(goodsList);
+		bean.setPage(pageControlData);
+		return bean;
+	}
+
+
+	/**
+	 * 方法名称:根据店铺id获取商品列表
+	 * 功能描述:根据查询条件查询BU_GOODS表数据,返回页面显示
+	 * 参数说明:
+	 * 作    者:Lim
+	 * 日    期:2021-03-23
+	 */
+	@PostMapping(value = "/getGoodsListByStoreId")
+	@AuthToken(type = "admin")
+	public ResultBean getGoodsListByStoreId(Long storeId) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		
+		BuGoodsSearchBean searchBean = new BuGoodsSearchBean();
+		searchBean.setStoreId(storeId);
+		
+		// 获取商品信息List
+		List<BuGoods> goodsList = goodsManageService.getGoodsList(searchBean);
+
+		bean.setList(goodsList);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:根据店铺id获取商品列表
+	 * 功能描述:根据查询条件查询BU_GOODS表数据,返回页面显示
+	 * 参数说明:
+	 * 作    者:Lim
+	 * 日    期:2021-03-23
+	 */
+	@PostMapping(value = "/getSpecialGoodsListByStoreId")
+	@AuthToken(type = "admin")
+	public ResultBean getSpecialGoodsListByStoreId(Long storeId) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+
+
+		// 获取商品信息List
+		List<BuGoods> goodsList = goodsManageService.getSpecialGoodsListByStoreId(storeId);
+
+		bean.setList(goodsList);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取店铺的单型号商品
+	 * 功能描述:获取店铺的单型号商品
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-07-11
+	 */
+	@PostMapping(value = "/getStoreSingleGoods")
+	@AuthToken(type = "admin")
+	public ResultBean getStoreSingleGoods(Long storeId) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+
+		// 获取商品信息List
+		List<BuGoods> goodsList = goodsManageService.getStoreSingleGoods(storeId);
+
+		bean.setList(goodsList);
+		return bean;
+	}
+
+}

+ 115 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/goods/GoodsStatisticsController.java

@@ -0,0 +1,115 @@
+package com.sapit.client.app.manage.controller.goods;
+
+import com.sapit.client.app.manage.service.goods.GoodsStatisticsService;
+import com.sapit.common.bean.goods.BuGoodsStatisticsBean;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.goods.BuGoodsStatisticsSearchBean;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 商品统计Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "goodsStatistics", produces = "application/json")
+public class GoodsStatisticsController {
+
+	@Autowired
+	private GoodsStatisticsService goodsStatisticsService;
+	
+	/**
+	 * 获取商品统计列表
+	 * @param pageSize
+	 * @param currentPage
+	 * @param searchBean
+	 * @return
+	 */
+	@PostMapping(value = "/page")
+	@AuthToken(type = "admin")
+	public ResultBean page(int pageSize, int currentPage, BuGoodsStatisticsSearchBean searchBean) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+
+		// 获取商品信息List
+		List<BuGoodsStatisticsBean> orderList = goodsStatisticsService.page(pageControlData, searchBean);
+
+		bean.setList(orderList);
+		bean.setPage(pageControlData);
+		return bean;
+	}
+	
+	@PostMapping(value = "exportData")
+	@AuthToken(type = "admin")
+	public void exportData(HttpServletResponse response, BuGoodsStatisticsSearchBean searchBean) throws IOException {
+		
+		List<BuGoodsStatisticsBean> orderList = goodsStatisticsService.page(null, searchBean);
+		
+		if (CollectionUtils.isNotEmpty(orderList)) {
+			// 声明一个工作薄
+			XSSFWorkbook workbook = new XSSFWorkbook();
+			// 生成一个表格
+			XSSFSheet sheet = workbook.createSheet("Sheet1");
+			// 产生表格标题行
+			XSSFRow row = sheet.createRow(0);
+			row.createCell(0).setCellValue("店铺");
+			row.createCell(1).setCellValue("商品");
+			row.createCell(2).setCellValue("规格");
+			row.createCell(3).setCellValue("销售数量");
+			row.createCell(4).setCellValue("销售总额");
+			row.createCell(5).setCellValue("销售平均单价");
+			
+			int index = 1;
+	        for (int i = 0; i < orderList.size(); i++) {
+	        	BuGoodsStatisticsBean goods = orderList.get(i);
+
+	        	BigDecimal total = BigDecimal.ZERO;
+	        	BigDecimal averagePrice = BigDecimal.ZERO;
+	        	if (goods.getTotal() != null) {
+	        		total = BigDecimal.valueOf(goods.getTotal()).divide(BigDecimal.valueOf(100)).setScale(2,BigDecimal.ROUND_HALF_UP);
+				}
+	        	if (goods.getAveragePrice() != null) {
+					averagePrice = BigDecimal.valueOf(goods.getAveragePrice()).divide(BigDecimal.valueOf(100)).setScale(2,BigDecimal.ROUND_HALF_UP);
+				}
+
+	    		row = sheet.createRow(index);
+	    		row.createCell(0).setCellValue(goods.getStoreName());
+			    row.createCell(1).setCellValue(goods.getGoodsName());
+			    row.createCell(2).setCellValue(goods.getModelName());
+			    row.createCell(3).setCellValue(goods.getOrderNum());
+			    row.createCell(4).setCellValue(total.toString());
+			    row.createCell(5).setCellValue(averagePrice.toString());
+	            index++;
+	        }
+	        
+	    	// 浏览器下载excel
+	 		response.setContentType("application/vnd.ms-excel;charset=utf-8");
+	 		response.setHeader("Content-disposition", "attachment;filename=售后单.xlsx");
+	 		response.flushBuffer();
+	 		OutputStream outputStream = response.getOutputStream();
+	 		workbook.write(outputStream);
+	 		outputStream.flush();
+	 		outputStream.close();
+		}
+		
+	}
+	
+}

+ 53 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/member/ComplaintController.java

@@ -0,0 +1,53 @@
+package com.sapit.client.app.manage.controller.member;
+
+import com.sapit.client.app.manage.service.member.ComplaintService;
+import com.sapit.common.bean.member.BuComplaintBean;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.member.BuComplaint;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.member.BuComplaintSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 订单管理Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "complaint", produces = "application/json")
+public class ComplaintController {
+
+	@Autowired
+	private ComplaintService complaintService;
+	
+	@PostMapping(value = "getComplaintList")
+	@AuthToken(type = "admin")
+	public ResultBean getComplaintList(int pageSize, int currentPage, BuComplaintSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+		
+		List<BuComplaintBean> list = complaintService.getComplaintList(pageControlData, searchBean);
+		bean.setList(list);
+		bean.setPage(pageControlData);
+		return bean;
+	}
+	
+	@PostMapping(value = "reply")
+	@AuthToken(type = "admin")
+	public ResultBean reply(BuComplaint complaint) {
+		ResultBean bean = new ResultBean();
+		complaintService.reply(complaint);
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+		bean.getRtnBean().setRtnMsg("回复成功!");
+		return bean;
+	}
+}

+ 41 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/member/MemberManageController.java

@@ -0,0 +1,41 @@
+package com.sapit.client.app.manage.controller.member;
+
+import com.sapit.client.app.manage.service.member.MemberManageService;
+import com.sapit.common.entity.member.BuMember;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.member.BuMemberSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 订单管理Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "memberManage", produces = "application/json")
+public class MemberManageController {
+
+	@Autowired
+	private MemberManageService memberManageService;
+	
+	@PostMapping(value = "getMemberList")
+	@AuthToken(type = "admin")
+	public ResultBean getMemberList(int pageSize, int currentPage, BuMemberSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+		
+		List<BuMember> list = memberManageService.getMemberList(pageControlData, searchBean);
+		bean.setList(list);
+		bean.setPage(pageControlData);
+		return bean;
+	}
+}

+ 228 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/AdvertiseManageController.java

@@ -0,0 +1,228 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.sapit.client.app.manage.service.operate.AdvertiseManageService;
+import com.sapit.common.bean.operate.AdvertiseSumBean;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.operate.BuAdvertise;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.AdvertiseSearchBean;
+import com.sapit.common.util.DateUtil;
+
+/**
+ * 类名称:广告费管理Controller 
+ * 类描述:广告费管理Controller
+ * 
+ * 作  者:Vic 
+ * 时  间:2023-12-07
+ */
+@RestController
+@RequestMapping(value = "advertiseManage", produces = "application/json")
+public class AdvertiseManageController {
+
+    @Autowired
+    private AdvertiseManageService advertiseManageService;
+
+
+    /**
+     * 方法名称: 查询广告费列表(带分页)
+     * 功能描述: 查询广告费列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: Vic
+     * 日   期: 2023/12/07
+     * @return:
+     **/
+    @PostMapping(value = "/getAdvertiseList")
+    @AuthToken(type = "admin")
+    public ResultBean getAdvertiseList(int pageSize, int currentPage, AdvertiseSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取商品信息List
+        List<BuAdvertise> advertiseList = advertiseManageService.getAdvertisePage(pageControlData, searchBean);
+
+        bean.setList(advertiseList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+
+    /**
+     * 方法名称:广告费修改
+     * 功能描述:广告费修改
+     * 
+     * 作   者: Vic
+     * 日   期: 2023/12/07
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuAdvertise advertise) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (advertise == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+            return bean;
+        }
+        
+        if (advertise.getAdvertiseId() == null) {
+            // 新增操作
+        	advertise.setCreateDate(DateUtil.getSqlToday());
+        	advertise.setUpdateDate(DateUtil.getSqlToday());
+
+            boolean rtn = advertiseManageService.save(advertise);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+            }
+        } else {
+            // 更新操作
+        	BuAdvertise advertiseOld = advertiseManageService.getAdvertiseById(advertise.getAdvertiseId());
+
+            advertiseOld.setStoreId(advertise.getStoreId());
+            advertiseOld.setType(advertise.getType());
+            advertiseOld.setBeginDate(advertise.getBeginDate());
+            advertiseOld.setEndDate(advertise.getEndDate());
+            advertiseOld.setAccountDate(advertise.getAccountDate());
+            advertiseOld.setAdvertiseFee(advertise.getAdvertiseFee());
+            advertiseOld.setUpdateDate(DateUtil.getSqlToday());
+            
+            boolean rtn = advertiseManageService.update(advertiseOld);
+            
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+            }else {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功");
+            }
+        }
+
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:删除广告费
+     * 功能描述:删除广告费
+     * 参数说明:
+     * 作   者: Vic
+     * 日   期: 2023/12/07
+     */
+    @PostMapping(value = "/delete")
+    @AuthToken(type = "admin")
+    public ResultBean deleteAdvertiseById(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的数据!");
+        } else {
+            // 删除广告费记录
+            advertiseManageService.deleteAdvertiseById(id);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+
+    /**
+     * 方法名称: 查询广告费列表(带分页)
+     * 功能描述: 查询广告费列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: Vic
+     * 日   期: 2023/12/07
+     * @return:
+     **/
+    @PostMapping(value = "/sumAdvertiseFee")
+    @AuthToken(type = "admin")
+    public ResultBean sumAdvertiseFee(AdvertiseSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+
+        // 获取商品信息List
+        List<AdvertiseSumBean> list = advertiseManageService.sumAdvertiseFee(searchBean);
+
+        bean.setList(list);
+        return bean;
+    }
+    
+	/**
+	 * 方法名称:商家结算单导出
+	 * 功能描述:商家结算单导出
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2024-12-17
+	 */
+	@PostMapping(value = "exportAdvertise")
+	@AuthToken(type = "admin")
+	public ResultBean exportAdvertise(HttpServletResponse response, AdvertiseSearchBean searchBean) throws IOException {
+		
+		List<BuAdvertise> advertiseList = advertiseManageService.getAdvertisePage(null, searchBean);
+		
+		if (CollectionUtils.isNotEmpty(advertiseList)) {
+			// 声明一个工作薄
+			XSSFWorkbook workbook = new XSSFWorkbook();
+			// 生成一个表格
+			XSSFSheet sheet = workbook.createSheet("Sheet1");
+			// 产生表格标题行
+			XSSFRow row = sheet.createRow(0);
+			row.createCell(0).setCellValue("店铺");
+			row.createCell(1).setCellValue("栏目");
+			row.createCell(2).setCellValue("广告费(元)");
+			row.createCell(3).setCellValue("展示期间");
+			row.createCell(4).setCellValue("收款日期");
+			row.createCell(5).setCellValue("创建时间");
+
+			int index = 1;
+	        for (int i = 0; i < advertiseList.size(); i++) {
+	        	BuAdvertise advertise = advertiseList.get(i);
+	    		row = sheet.createRow(index);
+	    		row.createCell(0).setCellValue(advertise.getStoreName());
+	    		row.createCell(1).setCellValue(advertise.getTypeName());
+	    		row.createCell(2).setCellValue(String.format("%.2f", advertise.getAdvertiseFee() / 100f));
+	    		row.createCell(3).setCellValue(DateUtil.getDateStr(advertise.getBeginDate(), "yyyy-MM-dd") + " - " + DateUtil.getDateStr(advertise.getEndDate(), "yyyy-MM-dd"));
+	    		row.createCell(4).setCellValue(DateUtil.getDateStr(advertise.getAccountDate(), "yyyy-MM-dd"));
+	    		row.createCell(5).setCellValue(DateUtil.getDateStr(advertise.getCreateDate(), "yyyy-MM-dd HH:mm:ss"));
+	    		
+	            index++;
+	        }
+	        
+	    	// 浏览器下载excel
+	 		response.setContentType("application/vnd.ms-excel;charset=utf-8");
+	 		response.setHeader("Content-disposition", "attachment;filename=广告费.xlsx");
+	 		response.flushBuffer();
+	 		OutputStream outputStream = response.getOutputStream();
+	 		workbook.write(outputStream);
+	 		outputStream.flush();
+	 		outputStream.close();
+		}
+		
+		return null;
+	}
+  
+
+}

+ 212 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/CarouselManageController.java

@@ -0,0 +1,212 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import com.sapit.client.app.manage.service.operate.CarouselManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.operate.BuCarousel;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuCarouselSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.FileFtpUploadUtil;
+import com.sapit.common.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "carouselManage", produces = "application/json")
+public class CarouselManageController {
+
+    @Autowired
+    private CarouselManageService carouselManageService;
+
+
+    /**
+     * 方法名称: 查询首页推荐店铺列表(带分页)
+     * 功能描述: 查询首页推荐店铺列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getCarouselList")
+    @AuthToken(type = "admin")
+    public ResultBean getCarouselList(int pageSize, int currentPage, BuCarouselSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取商品信息List
+        List<BuCarousel> carouselList = carouselManageService.getCarouselPage(pageControlData, searchBean);
+
+        bean.setList(carouselList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+
+    /**
+     * 方法名称:轮播图修改
+     * 功能描述:轮播图修改
+     * 作    者:Liucl
+     * 日    期:2023-05-22
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuCarousel carousel,@RequestParam(value = "file",required = false) MultipartFile file) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (carousel == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+            return bean;
+        }
+        if (file != null && file.getOriginalFilename() != null) {
+            if (file.getSize() > 204800) {
+                bean.getRtnBean().setRtnMsg("图片大小超过200K,请调整清晰度之后再试!");
+                return bean;
+            }
+            String imageType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.') + 1);
+            String filename = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + imageType;
+            // 上传文件
+            try {
+                if (!FileFtpUploadUtil.uploadFile("/operate", filename, file.getInputStream())) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                    return bean;
+                }
+            } catch (Exception e) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                return bean;
+            }
+            carousel.setImgUrl(FileFtpUploadUtil.rootURL + "/operate/" + filename);
+        }
+        if (carousel.getCarouselId() == null) {
+            // 判断跳转类型是否是店铺
+            if (carousel.getType() == 2 && carouselManageService.checkStoreInCarousel(Long.valueOf(carousel.getBusinessValue()), null)){
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该商家已经存在轮播图,请在原信息上修改");
+                return bean;
+            }
+
+            // 新增操作
+            carousel.setCreateDate(DateUtil.getSqlToday());
+            carousel.setStatus(2L); // 默认设置为不展示
+            boolean rtn = carouselManageService.save(carousel);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+            }
+        } else {
+            // 判断跳转类型是否是店铺
+            if (carousel.getType() == 2 && carouselManageService.checkStoreInCarousel(Long.valueOf(carousel.getBusinessValue()), carousel.getCarouselId())){
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该商家已经存在轮播图,请在原信息上修改");
+                return bean;
+            }
+            // 更新操作
+            BuCarousel carouselById = carouselManageService.getCarouselById(carousel.getCarouselId());
+            // 删除旧图片
+            if (!StringUtil.isBlank(carouselById.getImgUrl()) && !carousel.getImgUrl().equals(carouselById.getImgUrl())) {
+                String filename = carouselById.getImgUrl().substring(carouselById.getImgUrl().lastIndexOf('/') + 1);
+                // 删除旧图片
+                FileFtpUploadUtil.deleteFile("/operate", filename);
+            }
+
+
+            carouselById.setCarouselTitle(carousel.getCarouselTitle());
+            carouselById.setImgUrl(carousel.getImgUrl());
+            carouselById.setSort(carousel.getSort());
+            carouselById.setType(carousel.getType());
+            carouselById.setBusinessValue(carousel.getBusinessValue());
+            carouselById.setAppid(carousel.getAppid());
+            carouselById.setBeginDate(carousel.getBeginDate());
+            carouselById.setEndDate(carousel.getEndDate());
+
+            boolean rtn = carouselManageService.update(carouselById);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+            }else {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功");
+            }
+        }
+
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:删除轮播图
+     * 功能描述:删除轮播图
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    @PostMapping(value = "/delete")
+    @AuthToken(type = "admin")
+    public ResultBean deleteCarouselById(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的店铺!");
+        } else {
+            // 删除首页推荐店铺
+            carouselManageService.deleteCarouselById(id);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:更新轮播图展示状态
+     * 功能描述:更新轮播图展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/changeStatus")
+    @AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (id == null || status == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            if (carouselManageService.changeStatus(id, status)) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功!");
+            } else {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该轮播图不存在!");
+            }
+        }
+
+        return bean;
+    }
+
+}

+ 239 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/DineAndDashManageController.java

@@ -0,0 +1,239 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import com.sapit.client.app.manage.service.operate.DineAndDashManageService;
+import com.sapit.common.constant.DineAndDashStatus;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.operate.BuDineAndDash;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuDineAndDashSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.FileFtpUploadUtil;
+import com.sapit.common.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "dineAndDashManage", produces = "application/json")
+public class DineAndDashManageController {
+
+    @Autowired
+    private DineAndDashManageService dineAndDashManageService;
+
+
+    /**
+     * 方法名称: 查询霸王餐列表(带分页)
+     * 功能描述: 查询霸王餐列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getDineAndDashList")
+    @AuthToken(type = "admin")
+    public ResultBean getIndexStoreList(int pageSize, int currentPage, BuDineAndDashSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取商品信息List
+        List<BuDineAndDash> carouselList = dineAndDashManageService.getDineAndDashPage(pageControlData, searchBean);
+
+        bean.setList(carouselList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+
+    /**
+     * 方法名称:霸王餐修改
+     * 功能描述:霸王餐修改
+     * 作    者:Liucl
+     * 日    期:2023-05-22
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuDineAndDash dineAndDash, @RequestParam(value = "file",required = false) MultipartFile file) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (dineAndDash == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            if (file != null && file.getOriginalFilename() != null) {
+                if (file.getSize() > 204800) {
+                    bean.getRtnBean().setRtnMsg("图片大小超过200K,请调整清晰度之后再试!");
+                    return bean;
+                }
+                String imageType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
+                String filename = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + imageType;
+                // 上传文件
+                try {
+                    if (!FileFtpUploadUtil.uploadFile("/operate", filename, file.getInputStream())) {
+                        bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                        bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                        return bean;
+                    }
+                } catch (Exception e) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                    return bean;
+                }
+                dineAndDash.setImgUrl(FileFtpUploadUtil.rootURL + "/operate/" + filename);
+            }
+            if (dineAndDash.getDineAndDashId() == null) {
+                // 新增操作
+                // 判断时间
+
+                String startDate = DateUtil.getDateStr(dineAndDash.getStartDate(), "yyyy-MM-dd");
+                String endDate = DateUtil.getDateStr(dineAndDash.getEndDate(), "yyyy-MM-dd");
+
+                if (!dineAndDashManageService.checkTime(null,startDate,endDate)){
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("开始时间结束时间与其它活动有重合,添加失败");
+                    return bean;
+                }
+                Timestamp today = DateUtil.getSqlToday();
+                int i = DateUtil.dayDiffs(today, dineAndDash.getStartDate());
+                int j = DateUtil.dayDiffs(today, dineAndDash.getEndDate());
+                if (i>0 && j<=0){
+                    dineAndDash.setStatus(DineAndDashStatus.UNDERWAY);
+                } else if (i<0){
+                    dineAndDash.setStatus(DineAndDashStatus.NOT_START);
+                } else if (i>0 && j>0) {
+                    dineAndDash.setStatus(DineAndDashStatus.OVERTIME);
+                }
+
+                dineAndDash.setCreateDate(today);
+                boolean rtn = dineAndDashManageService.save(dineAndDash);
+                if (!rtn) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+                }else {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                    bean.getRtnBean().setRtnMsg("新增成功");
+                }
+            } else {
+                // 新增操作
+                // 判断时间
+
+                String startDate = DateUtil.getDateStr(dineAndDash.getStartDate(), "yyyy-MM-dd");
+                String endDate = DateUtil.getDateStr(dineAndDash.getEndDate(), "yyyy-MM-dd");
+
+                if (!dineAndDashManageService.checkTime(dineAndDash.getDineAndDashId(),startDate,endDate)){
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("开始时间结束时间与其它活动有重合,更新失败");
+                    return bean;
+                }
+                // 更新操作
+                BuDineAndDash dineAndDashById = dineAndDashManageService.getDineAndDashById(dineAndDash.getDineAndDashId());
+                // 删除旧图片
+                if (!StringUtil.isBlank(dineAndDashById.getImgUrl()) && !dineAndDash.getImgUrl().equals(dineAndDashById.getImgUrl())) {
+                    String filename = dineAndDashById.getImgUrl().substring(dineAndDashById.getImgUrl().lastIndexOf("/") + 1);
+                    // 删除旧图片
+                    FileFtpUploadUtil.deleteFile("/operate", filename);
+                }
+
+
+                dineAndDashById.setTitle(dineAndDash.getTitle());
+                dineAndDashById.setImgUrl(dineAndDash.getImgUrl());
+                dineAndDashById.setActivityPrice(dineAndDash.getActivityPrice());
+                dineAndDashById.setPrice(dineAndDash.getPrice());
+                dineAndDashById.setReachPrice(dineAndDash.getReachPrice());
+                dineAndDashById.setStartDate(dineAndDash.getStartDate());
+                dineAndDashById.setEndDate(dineAndDash.getEndDate());
+                dineAndDashById.setMaxNum(dineAndDash.getMaxNum());
+
+                boolean rtn = dineAndDashManageService.update(dineAndDashById);
+                if (!rtn) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+                }else {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                    bean.getRtnBean().setRtnMsg("更新成功");
+                }
+            }
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:删除霸王餐活动
+     * 功能描述:删除霸王餐活动
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    @PostMapping(value = "/delete")
+    @AuthToken(type = "admin")
+    public ResultBean deleteById(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的霸王餐活动!");
+        } else {
+            // 删除霸王餐活动
+            dineAndDashManageService.deleteById(id);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:更新展示状态
+     * 功能描述:更新展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/changeStatus")
+    @AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (id == null || status == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            if (dineAndDashManageService.isHaveEffect(id)){
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("霸王餐活动只能同时启用一个!");
+            } else {
+                if (dineAndDashManageService.changeStatus(id, status)) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                    bean.getRtnBean().setRtnMsg("更新成功!");
+                } else {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("该角色不存在!");
+                }
+            }
+        }
+
+        return bean;
+    }
+
+}

+ 147 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/DineAndDashStoreManageController.java

@@ -0,0 +1,147 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import com.sapit.client.app.manage.service.operate.DineAndDashStoreManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.operate.BuDineAndDashStore;
+import com.sapit.common.entity.store.BuStore;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuDineAndDashStoreSearchBean;
+import com.sapit.common.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "dineAndDashStoreManage", produces = "application/json")
+public class DineAndDashStoreManageController {
+
+    @Autowired
+    private DineAndDashStoreManageService dineAndDashStoreManageService;
+
+
+    /**
+     * 方法名称: 根据霸王餐ID查询店铺列表(带分页)
+     * 功能描述: 根据霸王餐ID查询店铺列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/6/02 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getDineAndDashStorePage")
+    @AuthToken(type = "admin")
+    public ResultBean getDineAndDashStorePage(int pageSize, int currentPage, BuDineAndDashStoreSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取商品信息List
+        List<BuDineAndDashStore> carouselList = dineAndDashStoreManageService.getDineAndDashStorePage(pageControlData, searchBean);
+
+        bean.setList(carouselList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+    /**
+     * 方法名称: 根据霸王餐ID查询没有参加店铺列表
+     * 功能描述: 根据霸王餐ID查询没有参加店铺列表
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/6/28 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getNoJoinStoreList")
+    @AuthToken(type = "admin")
+    public ResultBean getNoJoinStoreList(Long id) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+
+        if (id == null){
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误");
+            return bean;
+        }
+
+        // 获取商品信息List
+        List<BuStore> carouselList = dineAndDashStoreManageService.getNoJoinStoreList(id);
+
+        bean.setList(carouselList);
+        return bean;
+    }
+
+    /**
+     * 方法名称: 店铺参加霸王餐
+     * 功能描述: 店铺参加霸王餐
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/6/28 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/addAndDashAddStore")
+    @AuthToken(type = "admin")
+    public ResultBean addAndDashAddStore(BuDineAndDashStore store) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        if (store == null){
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误");
+            return bean;
+        } else {
+            if (store.getDineAndDashStoreId() == null) {
+                // 新增
+                Timestamp sqlToday = DateUtil.getSqlToday();
+                store.setCreateDate(sqlToday);
+//                store.setJoinTime(sqlToday);
+                store.setResidueNum(store.getTotal());
+                dineAndDashStoreManageService.save(store);
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("添加成功");
+            }
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:删除霸王餐活动门店关联表
+     * 功能描述:删除霸王餐活动门店关联表
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-06-28
+     */
+    @PostMapping(value = "/deleteDineAndDashStoreById")
+    @AuthToken(type = "admin")
+    public ResultBean deleteDineAndDashStoreById(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的店铺!");
+        } else {
+            // 删除首页推荐店铺
+            dineAndDashStoreManageService.deleteDineAndDashStoreById(id);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+
+}

+ 195 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/IconManageController.java

@@ -0,0 +1,195 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import com.sapit.client.app.manage.service.operate.IconManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.operate.BuIcon;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuIconSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.FileFtpUploadUtil;
+import com.sapit.common.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "iconManage", produces = "application/json")
+public class IconManageController {
+
+    @Autowired
+    private IconManageService iconManageService;
+
+
+    /**
+     * 方法名称: 查询首页推荐店铺列表(带分页)
+     * 功能描述: 查询首页推荐店铺列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getIconList")
+    @AuthToken(type = "admin")
+    public ResultBean getIndexStoreList(int pageSize, int currentPage, BuIconSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取首页图标信息List
+        List<BuIcon> icons = iconManageService.getIconPage(pageControlData, searchBean);
+
+        bean.setList(icons);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+
+    /**
+     * 方法名称:图标修改
+     * 功能描述:图标修改
+     * 作    者:Liucl
+     * 日    期:2023-05-22
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuIcon icon,@RequestParam(value = "file",required = false) MultipartFile file) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (icon == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            if (file != null && file.getOriginalFilename() != null) {
+                if (file.getSize() > 204800) {
+                    bean.getRtnBean().setRtnMsg("图片大小超过200K,请调整清晰度之后再试!");
+                    return bean;
+                }
+                String imageType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
+                String filename = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + imageType;
+                // 上传文件
+                try {
+                    if (!FileFtpUploadUtil.uploadFile("/operate", filename, file.getInputStream())) {
+                        bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                        bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                        return bean;
+                    }
+                } catch (Exception e) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                    return bean;
+                }
+                icon.setImgUrl(FileFtpUploadUtil.rootURL + "/operate/" + filename);
+            }
+            if (icon.getIconId() == null) {
+                // 新增操作
+                icon.setCreateDate(DateUtil.getSqlToday());
+                icon.setStatus(2L); // 默认不显示
+                boolean rtn = iconManageService.save(icon);
+                if (!rtn) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+                }
+            } else {
+                // 更新操作
+                BuIcon iconById = iconManageService.getIconById(icon.getIconId());
+                // 删除旧图片
+                if (!StringUtil.isBlank(iconById.getImgUrl()) && !icon.getImgUrl().equals(iconById.getImgUrl())) {
+                    String filename = iconById.getImgUrl().substring(iconById.getImgUrl().lastIndexOf("/") + 1);
+                    // 删除旧图片
+                    FileFtpUploadUtil.deleteFile("/operate", filename);
+                }
+
+
+                iconById.setIconName(icon.getIconName());
+                iconById.setImgUrl(icon.getImgUrl());
+                iconById.setSort(icon.getSort());
+                iconById.setType(icon.getType());
+                iconById.setBusinessValue(icon.getBusinessValue());
+                iconById.setAppid(icon.getAppid());
+                iconById.setBeginDate(icon.getBeginDate());
+                iconById.setEndDate(icon.getEndDate());
+
+                boolean rtn = iconManageService.update(iconById);
+                if (!rtn) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+                }
+            }
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:删除首页图标
+     * 功能描述:删除首页图标
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    @PostMapping(value = "/delete")
+    @AuthToken(type = "admin")
+    public ResultBean deleteIconById(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的店铺!");
+        } else {
+            // 删除首页推荐店铺
+            iconManageService.deleteIconById(id);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+
+    /**
+     * 方法名称:更新展示状态
+     * 功能描述:更新展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/changeStatus")
+    @AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (id == null || status == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            if (iconManageService.changeStatus(id, status)) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功!");
+            } else {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该角色不存在!");
+            }
+        }
+
+        return bean;
+    }
+
+
+}

+ 48 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/IndexStoreGoodsManageController.java

@@ -0,0 +1,48 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import com.sapit.client.app.manage.service.operate.IndexStoreGoodsManageService;
+import com.sapit.common.entity.operate.BuIndexStoreGoods;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuIndexStoreGoodsSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "indexStoreGoodsManage", produces = "application/json")
+public class IndexStoreGoodsManageController {
+
+    @Autowired
+    private IndexStoreGoodsManageService indexStoreGoodsManageService;
+    /**
+     * 方法名称: 查询首页推荐店铺列表(带分页)
+     * 功能描述: 查询首页推荐店铺列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/storeGoodsUrl")
+    @AuthToken(type = "admin")
+    public ResultBean getStoreGoods(BuIndexStoreGoodsSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+
+
+        // 获取商品信息List
+        List<BuIndexStoreGoods> specialFoodList = indexStoreGoodsManageService.getStoreGoods(searchBean);
+
+        bean.setList(specialFoodList);
+        return bean;
+    }
+}

+ 285 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/IndexStoreManageController.java

@@ -0,0 +1,285 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.sapit.client.app.manage.service.operate.IndexStoreGoodsManageService;
+import com.sapit.client.app.manage.service.operate.IndexStoreManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.constant.Status;
+import com.sapit.common.entity.operate.BuIndexStore;
+import com.sapit.common.entity.operate.BuIndexStoreGoods;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuIndexStoreSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.FileFtpUploadUtil;
+import com.sapit.common.util.StringUtil;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "indexStoreManage", produces = "application/json")
+public class IndexStoreManageController {
+
+    @Autowired
+    private IndexStoreManageService indexStoreManageService;
+    @Autowired
+    private IndexStoreGoodsManageService indexStoreGoodsManageService;
+
+    /**
+     * 方法名称: 查询首页推荐店铺列表(带分页)
+     * 功能描述: 查询首页推荐店铺列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getIndexStoreList")
+    @AuthToken(type = "admin")
+    public ResultBean getIndexStoreList(int pageSize, int currentPage, BuIndexStoreSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取商品信息List
+        List<BuIndexStore> indexStoreList = indexStoreManageService.getIndexStoreList(pageControlData, searchBean);
+        List<String> indexStoreIds = new ArrayList<>();
+        for (BuIndexStore store : indexStoreList) {
+        	indexStoreIds.add(store.getIndexStoreId().toString());
+        }
+        if (indexStoreList.isEmpty()) {
+            bean.setList(indexStoreList);
+            bean.setPage(pageControlData);
+            return bean;
+        }
+        
+        List<BuIndexStoreGoods> storeGoodsList = indexStoreGoodsManageService.getStoreGoodsByIndexStoreIds(indexStoreIds);
+        
+        for (BuIndexStore store:indexStoreList){
+        	
+        	List<BuIndexStoreGoods> storeGoods = new ArrayList<>();
+        	
+        	for (BuIndexStoreGoods sGoods : storeGoodsList) {
+        		if (store.getIndexStoreId().equals(sGoods.getIndexStoreId())) {
+        			storeGoods.add(sGoods);
+        		}
+        	}
+        	
+            String goodsName = "";
+            if (!storeGoods.isEmpty()){
+                for (int i=0;i<storeGoods.size();i++) {
+                    if (i == storeGoods.size()-1){
+                        goodsName += storeGoods.get(i).getGoodsName();
+                    }else {
+                        goodsName += storeGoods.get(i).getGoodsName() + ",";
+                    }
+                }
+            }
+            store.setGoodsName(goodsName);
+        }
+
+        bean.setList(indexStoreList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+
+    /**
+     * 方法名称:优选店铺修改
+     * 功能描述:优选店铺修改
+     * 作    者:Liucl
+     * 日    期:2023-05-22
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuIndexStore indexStore, @RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (indexStore == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+
+            // 更新
+            BuIndexStore indexStoreById = indexStoreManageService.getBuIndexStoreById(indexStore.getIndexStoreId());
+
+            // 如果首页展示,判断之前有几个是首页展示的
+            if (indexStore.getStatus() == 1){
+                if (!indexStoreManageService.getIndexShowNum(indexStore.getIndexStoreId())){
+                    bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+                    bean.getRtnBean().setRtnMsg("首页展示店铺最多只能设置两个!");
+                    return bean;
+                }
+            }
+
+
+            // 文件上传
+            if (file != null && !StringUtil.isBlank(file.getOriginalFilename())) {
+                // 上传文件
+                String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
+                String fileName = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + suffix;
+                try {
+                    FileFtpUploadUtil.uploadFile("/operate", fileName, file.getInputStream());
+                } catch (Exception e) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                    return bean;
+                }
+                indexStore.setBackUrl(FileFtpUploadUtil.rootURL + "/operate/" + fileName);
+            }
+
+
+
+            // 删除旧图片
+            if (!StringUtil.isBlank(indexStoreById.getBackUrl()) && !indexStore.getBackUrl().equals(indexStoreById.getBackUrl())) {
+                String filename = indexStoreById.getBackUrl().substring(indexStoreById.getBackUrl().lastIndexOf("/") + 1);
+                // 删除旧图片
+                FileFtpUploadUtil.deleteFile("/operate", filename);
+            }
+
+            // 先删除商品
+            indexStoreGoodsManageService.deleteByIndexStoreId(indexStore.getIndexStoreId());
+
+
+            // 新增操作
+            String [] str = indexStore.getGoodsIds().split(",");
+
+            for (int i = 0; i < str.length; i++) {
+                if (str[i] != null && !str[i].equals("")){
+
+                    BuIndexStoreGoods goods = new BuIndexStoreGoods();
+                    goods.setGoodsId(Long.valueOf(str[i]));
+                    goods.setIndexStoreId(indexStore.getIndexStoreId());
+                    goods.setCreateDate(DateUtil.getSqlToday());
+                    indexStoreGoodsManageService.save(goods);
+                }
+            }
+
+            indexStoreById.setShowType(indexStore.getShowType());
+            indexStoreById.setBackUrl(indexStore.getBackUrl());
+            indexStoreById.setShowStartDate(indexStore.getShowStartDate());
+            indexStoreById.setShowEndDate(indexStore.getShowEndDate());
+            indexStoreById.setSort(indexStore.getSort());
+            // 修改操作
+            boolean rtn = indexStoreManageService.update(indexStoreById);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+            }else {
+                bean.getRtnBean().setRtnMsg("更新成功");
+            }
+
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:特价菜门店增加修改
+     * 功能描述:特价菜门店增加修改
+     * 作    者:Liucl
+     * 日    期:2023-05-22
+     */
+    @PostMapping(value = "/addStore")
+    @AuthToken(type = "admin")
+    public ResultBean addStore(String storeIds) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (storeIds == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 新增操作
+            String [] storeId = storeIds.split(",");
+
+            for (int i = 0; i < storeId.length; i++) {
+                BuIndexStore store = new BuIndexStore();
+                store.setStoreId(Long.valueOf(storeId[i]));
+                store.setStatus(Status.STATUS_FROZEN);
+                store.setShowType(2L);
+                store.setCreateDate(DateUtil.getSqlToday());
+                indexStoreManageService.save(store);
+            }
+        }
+        return bean;
+    }
+
+    /**
+     * 方法名称:删除首页推荐店铺
+     * 功能描述:删除首页推荐店铺
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/delete")
+    @AuthToken(type = "admin")
+    public ResultBean deleteSpecialFood(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的店铺!");
+        } else {
+            // 删除首页推荐店铺
+            indexStoreManageService.deleteIndexStoreGoods(id);
+            // 删除首页推荐店铺商品
+
+            indexStoreGoodsManageService.deleteByIndexStoreId(id);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:更新展示状态
+     * 功能描述:更新展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/changeStatus")
+    @AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (id == null || status == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            if (indexStoreManageService.changeStatus(id, status)) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功!");
+            } else {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该角色不存在!");
+            }
+        }
+
+        return bean;
+    }
+
+
+}

+ 183 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/NoticeManageController.java

@@ -0,0 +1,183 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import com.sapit.client.app.manage.service.operate.NoticeManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.operate.BuNotice;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuNoticeSearchBean;
+import com.sapit.common.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "noticeManage", produces = "application/json")
+public class NoticeManageController {
+
+    @Autowired
+    private NoticeManageService noticeManageService;
+
+
+    /**
+     * 方法名称: 查询公告列表(带分页)
+     * 功能描述: 查询公告列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getNoticeList")
+    @AuthToken(type = "admin")
+    public ResultBean getIndexStoreList(int pageSize, int currentPage, BuNoticeSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取商品信息List
+        List<BuNotice> carouselList = noticeManageService.getNoticePage(pageControlData, searchBean);
+
+        bean.setList(carouselList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+
+    /**
+     * 方法名称:公告修改
+     * 功能描述:公告修改
+     * 作    者:Liucl
+     * 日    期:2023-05-22
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuNotice notice) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (notice == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            if (notice.getNoticeId() == null) {
+
+                if (notice.getStatus() == 1){
+                    if (noticeManageService.checkUseNotice(notice.getNoticeType(), null)){
+                        bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                        bean.getRtnBean().setRtnMsg("公告只能同时启用一个");
+                        return bean;
+                    }
+                }
+                // 新增操作
+                notice.setCreateDate(DateUtil.getSqlToday());
+                boolean rtn = noticeManageService.save(notice);
+                if (!rtn) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+                }
+            } else {
+                // 更新操作
+                BuNotice noticeById = noticeManageService.getNoticeById(notice.getNoticeId());
+
+                if (notice.getStatus() == 1){
+                    if (noticeManageService.checkUseNotice(notice.getNoticeType(), notice.getNoticeId())){
+                        bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                        bean.getRtnBean().setRtnMsg("公告只能同时启用一个");
+                        return bean;
+                    }
+                }
+
+                noticeById.setNoticeType(notice.getNoticeType());
+                noticeById.setContent(notice.getContent());
+                noticeById.setRedirect(notice.getRedirect());
+                noticeById.setTitle(notice.getTitle());
+                noticeById.setStatus(notice.getStatus());
+                noticeById.setUrl(notice.getUrl());
+                noticeById.setStoreId(notice.getStoreId());
+
+
+                boolean rtn = noticeManageService.update(noticeById);
+                if (!rtn) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+                }
+            }
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:删除公告
+     * 功能描述:删除公告
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    @PostMapping(value = "/delete")
+    @AuthToken(type = "admin")
+    public ResultBean deleteIconById(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的店铺!");
+        } else {
+            // 删除首页推荐店铺
+            noticeManageService.deleteNoticeById(id);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+
+    /**
+     * 方法名称:更新公告状态
+     * 功能描述:更新公告状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/changeStatus")
+    @AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status,Long type) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (id == null || status == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            if (status == 1){
+                if (noticeManageService.checkUseNotice(type, id)){
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("公告只能同时启用一个");
+                    return bean;
+                }
+            }
+            if (noticeManageService.changeStatus(id, status)) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功!");
+            } else {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该角色不存在!");
+            }
+        }
+
+        return bean;
+    }
+}

+ 57 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/RaffleRecordManageController.java

@@ -0,0 +1,57 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import com.sapit.client.app.manage.service.operate.RaffleRecordManageService;
+import com.sapit.common.entity.operate.BuRaffleRecord;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuRaffleRecordSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "raffleRecordManage", produces = "application/json")
+public class RaffleRecordManageController {
+
+    @Autowired
+    private RaffleRecordManageService raffleRecordManageService;
+
+
+    /**
+     * 方法名称: 根据活动ID查询兑奖记录(带分页)
+     * 功能描述: 根据活动ID查询兑奖记录(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getRaffleRecordPage")
+    @AuthToken(type = "admin")
+    public ResultBean getRaffleRecordPage(int pageSize, int currentPage, BuRaffleRecordSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        searchBean.setStatus(1L);
+        // 获取商品信息List
+        List<BuRaffleRecord> raffleRecordPage = raffleRecordManageService.getRaffleRecordPage(pageControlData, searchBean);
+
+        bean.setList(raffleRecordPage);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+}

+ 170 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/operate/SpecialsManageController.java

@@ -0,0 +1,170 @@
+package com.sapit.client.app.manage.controller.operate;
+
+import com.sapit.client.app.manage.service.operate.SpecialsManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.operate.BuSpecialFood;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.operate.BuSpecialFoodSearchBean;
+import com.sapit.common.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @description: 管理端特价菜操作
+ * @author: liucl
+ * @date: 2023/5/22 10:37
+ */
+@RestController
+@RequestMapping(value = "specialsManage", produces = "application/json")
+public class SpecialsManageController {
+
+    @Autowired
+    private SpecialsManageService specialsManageService;
+
+    /**
+     * 方法名称: 查询特价菜列表(带分页)
+     * 功能描述:  查询特价菜列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getSpecialsFoodList")
+    @AuthToken(type = "admin")
+    public ResultBean getGoodsList(int pageSize, int currentPage, BuSpecialFoodSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取商品信息List
+        List<BuSpecialFood> specialFoodList = specialsManageService.getSpecialFoodList(pageControlData, searchBean);
+
+        bean.setList(specialFoodList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+    /**
+     * 方法名称:特价菜增加修改
+     * 功能描述:特价菜增加修改
+     * 作    者:Liucl
+     * 日    期:2023-05-22
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuSpecialFood specialFood) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (specialFood == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            if (specialFood.getSpecialFoodId() == null){
+                // 新增操作
+//            	if (specialsManageService.checkStoreInSpecial(specialFood.getStoreId(), null)) {
+//            		bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+//                    bean.getRtnBean().setRtnMsg("特价菜中已经存在该商家的信息了,请在原信息上进行修改!");
+//            	} else {
+	                specialFood.setCreateDate(DateUtil.getSqlToday());
+	                specialFood.setStatus(2L);
+	                boolean rtn = specialsManageService.save(specialFood);
+	                if (!rtn) {
+	                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+	                    bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+	                }else {
+	                    bean.getRtnBean().setRtnMsg("新增成功");
+	                }
+//            	}
+
+            } else {
+//            	if (specialsManageService.checkStoreInSpecial(specialFood.getStoreId(), specialFood.getSpecialFoodId())) {
+//            		bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+//                    bean.getRtnBean().setRtnMsg("特价菜中已经存在该商家的信息了,请在原信息上进行修改!");
+//            	} else {
+	                // 更新
+	                BuSpecialFood specialFoodById = specialsManageService.getSpecialFoodById(specialFood.getSpecialFoodId());
+	                specialFoodById.setStoreId(specialFood.getStoreId());
+	                specialFoodById.setGoodsId(specialFood.getGoodsId());
+	                specialFoodById.setShowType(specialFood.getShowType());
+	                specialFoodById.setShowStartDate(specialFood.getShowStartDate());
+	                specialFoodById.setShowEndDate(specialFood.getShowEndDate());
+	                specialFoodById.setSort(specialFood.getSort());
+	                // 修改操作
+	                boolean rtn = specialsManageService.update(specialFoodById);
+	                if (!rtn) {
+	                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+	                    bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+	                }else {
+	                    bean.getRtnBean().setRtnMsg("更新成功");
+	                }
+//            	}
+            }
+        }
+        return bean;
+    }
+
+    /**
+     * 方法名称:更新展示状态
+     * 功能描述:更新展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/changeStatus")
+    @AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (id == null || status == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            if (specialsManageService.changeStatus(id, status)) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功!");
+            } else {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该角色不存在!");
+            }
+        }
+
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:删除特价菜
+     * 功能描述:删除特价菜
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/deleteSpecialFood")
+    @AuthToken(type = "admin")
+    public ResultBean deleteSpecialFood(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的特价菜!");
+        } else {
+            // 删除特价菜
+            specialsManageService.deleteSpecialFood(id);
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+}

+ 213 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/order/FeedbackManageController.java

@@ -0,0 +1,213 @@
+package com.sapit.client.app.manage.controller.order;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.sapit.client.app.manage.service.order.RefundFailedService;
+import com.sapit.client.app.manage.service.order.RefundService;
+import com.sapit.client.app.user.service.order.OrderApiService;
+import com.sapit.common.bean.system.WxAmountBean;
+import com.sapit.common.constant.PayType;
+import com.sapit.common.constant.Status;
+import com.sapit.common.entity.order.BuRefund;
+import com.sapit.common.entity.order.BuRefundFailed;
+import com.sapit.common.util.AESUtil;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.GetWxOrderno;
+import com.sapit.common.util.PayChannelProperties;
+
+/**
+ * 类名称:支付、退款回调处理
+ * 类描述:支付、退款回调处理
+ * 
+ * 作  者:Bard
+ * 时  间:2020-05-23
+ */
+@RestController
+@RequestMapping(value="feedbackmanage",produces="application/json")
+public class FeedbackManageController {
+
+	// 日志输出
+	static final Logger log = LoggerFactory.getLogger(FeedbackManageController.class);
+	@Autowired
+	private RefundService refundManageService;
+	@Autowired
+	private RefundFailedService refundFailedService;
+	@Autowired
+	private PayChannelProperties payChannelProperties;
+	@Autowired
+	private OrderApiService orderApiService;
+	/**
+	 * 方法名称:等待微信支付返回结果
+	 * 方法描述:
+	 * 
+	 * 作    者:Bard
+	 * 时    间:2020-05-23
+	 * @throws Exception 
+	 */
+	@PostMapping(value = "/wxpayedfeedback")
+	public void wxPayedFeedback(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
+        String line = null;
+        StringBuilder sb = new StringBuilder();
+        
+        try {
+	        while((line = br.readLine())!=null){
+	            sb.append(line);
+	        }
+	        
+	        br.close();
+	        
+	        System.out.println(sb.toString());
+	        log.info("支付结果:" + sb.toString());
+	
+	        GetWxOrderno wxOrderno = new GetWxOrderno();
+	        @SuppressWarnings("rawtypes")
+			Map map = wxOrderno.doXMLParse(sb.toString());
+	        
+	        String returnCode = (String) map.get("return_code");
+	        String resultCode = (String) map.get("result_code");
+	        // 判断报文的返回值
+	        String rtnmsg = "";
+	        if ("SUCCESS".equals(returnCode)) {
+	        	if ("SUCCESS".equals(resultCode)) {
+
+	        		String outTradeNo = (String) map.get("out_trade_no");
+	        		String totalFee = (String) map.get("total_fee");
+	        		
+	        		orderApiService.changeOrderStatusToPayed(outTradeNo, PayType.PAY_TYPE_WX, totalFee);
+        			rtnmsg = "<xml><return_code>SUCCESS</return_code><return_msg>接收成功</return_msg></xml>";
+	        	} else {
+	        		// 支付错误处理
+	        		String errCode = (String) map.get("err_code");
+	        		// 订单超时处理
+	        		if ("ORDERCLOSED".equals(errCode)) {
+	        			
+	        		}
+	        		rtnmsg = "<xml><return_code>SUCCESS</return_code><return_msg>接收成功</return_msg></xml>";
+	        		//SYSTEMERROR 接口后台错误
+	        		//INVALID_TRANSACTIONID 无效 transaction_id
+	        		//PARAM_ERROR 提交参数错误
+	        		//ORDERPAID 订单已支付
+	        		//OUT_TRADE_NO_USED 商户订单号重复
+	        		//NOAUTH 商户无权限
+	        		//NOTENOUGH 余额不足
+	        		//NOTSUPORTCARD 不支持卡类型
+	        		//ORDERCLOSED 订单已关闭
+	        		//BANKERROR 银行系统异常
+	        	}
+	        }
+        
+	        response.getWriter().write(rtnmsg);
+        } catch (Exception e) {
+        	log.info(sb.toString());
+        }
+	}
+	
+	/**
+	 * 方法名称:微信退款反馈
+	 * 方法描述:
+	 * 
+	 * 作    者:Bard
+	 * 时    间:2020-05-23
+	 * @throws Exception 
+	 */
+	@SuppressWarnings("rawtypes")
+	@PostMapping(value = "/wxrefundfeedback")
+	public void wxRefundFeedback(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		
+		//获取实例
+		BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
+        String line = null;
+        StringBuilder sb = new StringBuilder();
+        while((line = br.readLine())!=null){
+            sb.append(line);
+        }
+        
+        br.close();
+        
+        log.info(sb.toString());
+
+        
+        GetWxOrderno wxOrderno = new GetWxOrderno();
+		Map map = wxOrderno.doXMLParse(sb.toString());
+        
+        String returnCode = (String) map.get("return_code");
+        // 判断报文的返回值
+        String rtnmsg = "";
+        if (Status.SUCCESS.equals(returnCode)) {
+        	//String appid = (String) map.get("appid");
+        	//String mch_id = (String) map.get("mch_id");
+        	String reqInfo = (String) map.get("req_info");// 加密信息
+        	String password = payChannelProperties.getMerchantNo();
+        	
+        	// 解密加密字符串
+        	String info = AESUtil.decryptData(reqInfo, password);
+
+        	Map mapInfo = wxOrderno.doXMLParse1(info);
+        	System.out.println("mapInfo:" + mapInfo);
+        	// 退款状态 SUCCESS-退款成功 CHANGE-退款异常 REFUNDCLOSE—退款关闭 
+        	String refundStatus = (String) mapInfo.get("refund_status");
+        	// 退款单号
+        	String outRefundNo = (String) mapInfo.get("out_refund_no");
+        	String orderCode = (String) mapInfo.get("out_trade_no");
+        	if (Status.SUCCESS.equals(refundStatus)) {
+        		// 后台发起退款
+        		if (outRefundNo.startsWith("TH")) {
+        			BuRefund refund = refundManageService.getOneByCode(outRefundNo);
+        			if (refund != null) {
+        				refund.setStatus(1L);
+        				refundManageService.update(refund);
+        			}
+        		}
+        		// 退款成功后处理
+        		rtnmsg = "<xml><return_code>SUCCESS</return_code><return_msg>接收成功</return_msg></xml>";
+        	} else {
+        		// 退款失败处理 在退款失败表新增一条退款失败的记录
+        		BuRefundFailed refundFailed = refundFailedService.getOneByRefundCode(outRefundNo);
+        		if (refundFailed == null) {
+        			refundFailed = new BuRefundFailed();
+        			refundFailed.setOrderCode(orderCode);
+        			refundFailed.setRefundCode(outRefundNo);
+        			refundFailed.setRefundDes(refundStatus);
+        			refundFailed.setStatus(refundStatus);
+        			if (mapInfo.containsKey("amount")) {
+        				WxAmountBean amount = (WxAmountBean) map.get("amount");
+        				if (amount != null) {
+        					refundFailed.setRefundAmount(amount.getRefund());
+        				}
+        			}
+        			refundFailed.setCreateDate(DateUtil.getSqlToday());
+        			refundFailed.setUpdateDate(DateUtil.getSqlToday());
+        			refundFailedService.save(refundFailed);
+        		} else {
+        			if (mapInfo.containsKey("summary")) {
+        				refundFailed.setRefundDes(map.get("summary").toString());
+        			}
+        			
+        			refundFailed.setStatus(refundStatus);
+        			refundFailed.setUpdateDate(DateUtil.getSqlToday());
+        			refundFailedService.update(refundFailed);
+        		}
+        		
+    			rtnmsg = "<xml><return_code>FAIL</return_code><return_msg>接收失败</return_msg></xml>";
+        	}
+        } else {
+        	// 此逻辑应该走不到,但如果走到了,该如何处理呢?
+        	rtnmsg = "<xml><return_code><![CDATA[FAILED]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+        }
+        response.getWriter().write(rtnmsg);
+	}
+	
+}

+ 253 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/order/OrderManageController.java

@@ -0,0 +1,253 @@
+package com.sapit.client.app.manage.controller.order;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.sapit.client.app.manage.service.order.OrderDetailService;
+import com.sapit.client.app.manage.service.order.OrderManageService;
+import com.sapit.common.bean.order.OrderNumBean;
+import com.sapit.common.bean.system.LoginInfoBean;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.order.BuOrderDetail;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.order.BuOrderSearchBean;
+import com.sapit.common.util.RedisTool;
+import com.sapit.common.view.order.BuOrderV;
+
+/**
+ * 订单管理Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "orderManage", produces = "application/json")
+public class OrderManageController {
+
+	@Autowired
+	private OrderManageService orderManageService;
+	
+	@Autowired
+	private OrderDetailService orderDetailService;
+	
+	@Autowired
+	private RedisTool redisTool;
+	
+	/**
+	 * 方法名称:订单列表分页
+	 * 功能描述:订单列表分页
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "/orderPage")
+	@AuthToken(type = "admin")
+	public ResultBean orderPage(int pageSize, int currentPage, BuOrderSearchBean searchBean) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+
+		// 获取商品信息List
+		List<BuOrderV> orderList = orderManageService.page(pageControlData, searchBean);
+		OrderNumBean numBean = orderManageService.getReceivedAndRefundOrderNum(searchBean);
+
+		bean.setList(orderList);
+		bean.setObj(numBean);
+		bean.setPage(pageControlData);
+		return bean;
+	}
+
+	/**
+	 * 方法名称:根据订单id获取订单详情
+	 * 功能描述:根据订单id获取订单详情
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "getOrderDetails")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderDetails(Long orderId) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		
+		if (null == orderId) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		}
+		
+		// 获取订单详情
+		List<BuOrderDetail> list = orderDetailService.listByOrderId(orderId);
+		
+		bean.setList(list);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:重新发起打印订单
+	 * 功能描述:重新发起打印订单
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "printOrder")
+	@AuthToken(type = "admin")
+	public ResultBean printOrder(Long orderId) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		
+		if (null == orderId) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+			return bean;
+		}
+		
+		orderManageService.printOrder(orderId);
+		
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+		bean.getRtnBean().setRtnMsg("操作成功!");
+		return bean;
+	}
+	
+	/**
+	 * 
+	 * @param orderId
+	 * @return
+	 */
+	/**
+	 * 方法名称:接单
+	 * 功能描述:接单
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "acceptOrder")
+	@AuthToken(type = "admin")
+	public ResultBean acceptOrder(Long orderId) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		
+		if (null == orderId) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		}
+		
+		orderManageService.acceptOrder(orderId);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:拒绝接单
+	 * 功能描述:拒绝接单
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "refuseOrder")
+	@AuthToken(type = "admin")
+	public ResultBean refuseOrder(Long orderId, HttpServletRequest request) {
+		String token = request.getHeader("Authorization");
+		LoginInfoBean loginBean = null;
+		String userInfo = redisTool.getValueStr(token);
+		if (userInfo != null) {
+    		JSONObject obj = JSON.parseObject(userInfo);
+    		loginBean = JSON.toJavaObject(obj, LoginInfoBean.class);
+		}
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		
+		if (null == orderId) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+			return bean;
+		}
+		
+		orderManageService.refuseOrder(orderId, loginBean);
+		
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+		bean.getRtnBean().setRtnMsg("操作成功!");
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:完成订单(客户已取货)
+	 * 功能描述:完成订单(客户已取货)
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "completeOrder")
+	@AuthToken(type = "admin")
+	public ResultBean completeOrder(Long orderId, HttpServletRequest request) {
+		String token = request.getHeader("Authorization");
+	    LoginInfoBean loginBean = (LoginInfoBean) request.getSession().getAttribute(token);
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		
+		if (null == orderId) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+			return bean;
+		}
+		
+		orderManageService.completeOrder(orderId, loginBean);
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+		bean.getRtnBean().setRtnMsg("操作成功!");
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取订单支付情况
+	 * 功能描述:获取订单支付情况
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-08-12
+	 */
+	@PostMapping(value = "/getOrderPayedInfo")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderPayedInfo(String orderCode) {
+		ResultBean bean = new ResultBean();
+		
+		// 参数基本验证
+		if (orderCode == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+			return bean;
+		}
+		bean.setObj(orderManageService.getOrderPayedInfo(orderCode));
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取订单退款情况
+	 * 功能描述:获取订单退款情况
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-08-12
+	 */
+	@PostMapping(value = "/getOrderRefundInfo")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderRefundInfo(String orderCode) {
+		ResultBean bean = new ResultBean();
+		
+		// 参数基本验证
+		if (orderCode == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+			return bean;
+		}
+		bean.setObj(orderManageService.getOrderRefundInfo(orderCode));
+		return bean;
+	}
+	
+}

+ 50 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/order/OrderSettlementController.java

@@ -0,0 +1,50 @@
+package com.sapit.client.app.manage.controller.order;
+
+import com.sapit.client.app.manage.service.order.OrderSettlementService;
+import com.sapit.common.bean.order.OrderSettlementBean;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.order.BuOrderSettlementSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 结算订单Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "orderSettlement", produces = "application/json")
+public class OrderSettlementController {
+
+	@Autowired
+	private OrderSettlementService orderSettlementService;
+	
+	/**
+	 * 方法名称:结算订单列表
+	 * 功能描述:结算订单列表
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "orderSettlementPage")
+	@AuthToken(type = "admin")
+	public ResultBean orderSettlementPage(int pageSize, int currentPage, BuOrderSettlementSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+		
+		List<OrderSettlementBean> list = orderSettlementService.page(pageControlData, searchBean);
+		
+		bean.setPage(pageControlData);
+		bean.setList(list);
+		return bean;
+	}
+}

+ 363 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/order/OrderYearController.java

@@ -0,0 +1,363 @@
+package com.sapit.client.app.manage.controller.order;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.sapit.client.app.manage.service.order.OrderDetailYearService;
+import com.sapit.client.app.manage.service.order.OrderYearService;
+import com.sapit.common.bean.order.HomeOrderInfoBean;
+import com.sapit.common.bean.order.OrderIncomeBean;
+import com.sapit.common.bean.order.TodayOrderInfoBean;
+import com.sapit.common.constant.OrderStatus;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.order.BuOrderDetail;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.order.BuOrderSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.view.order.BuOrderYearV;
+
+/**
+ * 订单管理-学年Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "orderYear", produces = "application/json")
+public class OrderYearController {
+
+	@Autowired
+	private OrderYearService orderManageService;
+	
+	@Autowired
+	private OrderDetailYearService orderDetailService;
+	
+	/**
+	 * 方法名称:获取订单列表
+	 * 功能描述:获取订单列表
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "/orderPage")
+	@AuthToken(type = "admin")
+	public ResultBean orderPage(int pageSize, int currentPage, BuOrderSearchBean searchBean) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+
+		// 获取商品信息List
+		List<BuOrderYearV> orderList = orderManageService.page(pageControlData, searchBean);
+
+		bean.setList(orderList);
+		bean.setPage(pageControlData);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:根据订单id获取订单详情
+	 * 功能描述:根据订单id获取订单详情
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "getOrderDetails")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderDetails(Long orderId) {
+		// 定义返回值
+		ResultBean bean = new ResultBean();
+		
+		if (null == orderId) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		}
+		
+		// 获取订单详情
+		List<BuOrderDetail> list = orderDetailService.listByOrderId(orderId);
+		
+		bean.setList(list);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:订单列表页面 导出
+	 * 功能描述:订单列表页面 导出
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "exportOrderInfo")
+	@AuthToken(type = "admin")
+	public ResultBean exportOrderInfo(HttpServletResponse response, BuOrderSearchBean searchBean) throws IOException {
+		List<BuOrderYearV> orderList = orderManageService.getExportList(searchBean);
+		if (CollectionUtils.isNotEmpty(orderList)) {
+			// 声明一个工作薄
+			XSSFWorkbook workbook = new XSSFWorkbook();
+			// 生成一个表格
+			XSSFSheet sheet = workbook.createSheet("Sheet1");
+			// 产生表格标题行
+			XSSFRow row = sheet.createRow(0);
+			row.createCell(0).setCellValue("单号");
+			row.createCell(1).setCellValue("店铺");
+			row.createCell(2).setCellValue("订单金额");
+			row.createCell(3).setCellValue("店铺实际收入");
+			row.createCell(4).setCellValue("收货地址");
+			row.createCell(5).setCellValue("出餐时长");
+			row.createCell(6).setCellValue("取餐时长");
+			row.createCell(7).setCellValue("取餐人员");
+			row.createCell(8).setCellValue("配送时长");
+			row.createCell(9).setCellValue("配送人员");
+			row.createCell(10).setCellValue("下单时间");
+			row.createCell(11).setCellValue("完成时间");
+			row.createCell(12).setCellValue("订单状态");
+	
+			int index = 1;
+	        for (int i = 0; i < orderList.size(); i++) {
+	        	BuOrderYearV order = orderList.get(i);
+	        	// 订单金额
+	        	BigDecimal orderFee = new BigDecimal(order.getOrderFee()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+	        	// 配送费合计
+	        	BigDecimal deliveryFee = new BigDecimal(order.getSortingFee() + order.getDeliveryFee() + order.getClimbingFee()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+	        	// 微信扣点
+	        	BigDecimal wxPoints = new BigDecimal(order.getOrderFee()).multiply(new BigDecimal(order.getWxPoint())).divide(new BigDecimal(1000),6,RoundingMode.HALF_UP).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+	        	// 平台扣点
+	        	BigDecimal commissionPoints = (new BigDecimal(order.getCommissionRate()).divide(new BigDecimal(1000))).multiply(new BigDecimal(order.getOrderFee() - order.getSortingFee() - order.getDeliveryFee() - order.getClimbingFee())).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+	        	// 商家营收入
+	        	BigDecimal storeFee = (orderFee.subtract(deliveryFee).subtract(wxPoints).subtract(commissionPoints)).setScale(2, RoundingMode.HALF_UP);
+	        	
+	    		row = sheet.createRow(index);
+	    		row.createCell(0).setCellValue(order.getOrderCode());
+			    row.createCell(1).setCellValue(order.getStoreName());
+			    row.createCell(2).setCellValue(orderFee.toString());
+			    if (order.getStatus().equals(OrderStatus.COMPLETED)) {
+			    	// 已完成
+			    	row.createCell(3).setCellValue(storeFee.toString());
+			    } else if (order.getStatus().equals(OrderStatus.DELIVERING_REFUND)) {
+			    	// 已配送退款
+			    	row.createCell(3).setCellValue(BigDecimal.ZERO.subtract(deliveryFee).setScale(2, RoundingMode.HALF_UP).toString());
+			    } else {
+			    	// 未配送退款 用户取消 拒绝接单 超时未接单
+			    	row.createCell(3).setCellValue("0");
+			    }
+			    row.createCell(4).setCellValue(order.getOrderAddress());
+			    if (order.getReceiveOrderDate() != null && order.getDoneMealDate() != null) {
+			    	row.createCell(5).setCellValue(DateUtil.dateDiff(order.getReceiveOrderDate(), order.getDoneMealDate()) / 60000 );
+			    }
+			    if (order.getDoneMealDate() != null && order.getTakeMealDate() != null) {
+			    	row.createCell(6).setCellValue(DateUtil.dateDiff(order.getDoneMealDate(), order.getTakeMealDate()) / 60000);
+			    }
+			    row.createCell(7).setCellValue(order.getWaiterName());
+			    if (order.getDeliveryBeginDate() != null && order.getFinishDate() != null) {
+			    	row.createCell(8).setCellValue(DateUtil.dateDiff(order.getDeliveryBeginDate(), order.getFinishDate()) / 60000);
+			    }
+			    row.createCell(9).setCellValue(order.getRiderName());
+			    row.createCell(10).setCellValue(DateUtil.getDateStr(order.getCreateDate(), "yyyy-MM-dd HH:mm:ss"));
+			    if (order.getFinishDate() != null) {
+			    	row.createCell(11).setCellValue(DateUtil.getDateStr(order.getFinishDate(), "yyyy-MM-dd HH:mm:ss"));
+			    }
+			    row.createCell(12).setCellValue(order.getStatusName());
+	            index++;
+	        }
+	        
+	    	// 浏览器下载excel
+	 		response.setContentType("application/vnd.ms-excel;charset=utf-8");
+	 		response.setHeader("Content-disposition", "attachment;filename=售后单.xlsx");
+	 		response.flushBuffer();
+	 		OutputStream outputStream = response.getOutputStream();
+	 		workbook.write(outputStream);
+	 		outputStream.flush();
+	 		outputStream.close();
+		}
+		return null;
+	}
+	
+	/**
+	 * 方法名称:订单收入明细(今日数据)
+	 * 功能描述:订单收入明细(今日数据)
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "todayOrderInfo")
+	@AuthToken(type = "admin")
+	public ResultBean todayOrderInfo() {
+		ResultBean bean = new ResultBean();
+		TodayOrderInfoBean info = orderManageService.todayOrderInfo();
+		bean.setObj(info);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:订单收入明细列表
+	 * 功能描述:订单收入明细列表
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "getOrderIncomeInfo")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderIncomeInfo(int pageSize, int currentPage, BuOrderSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+		List<OrderIncomeBean> info = orderManageService.getOrderIncomeInfo(pageControlData, searchBean);
+		bean.setList(info);
+		bean.setPage(pageControlData);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:导出订单收入明细
+	 * 功能描述:导出订单收入明细
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "exportOrderIncome")
+	@AuthToken(type = "admin")
+	public ResultBean exportOrderIncome(HttpServletResponse response, BuOrderSearchBean searchBean) throws IOException {
+//		searchBean.setStatusWss(OrderStatus.COMPLETED);
+		List<OrderIncomeBean> orderList = orderManageService.getOrderIncomeInfo(null, searchBean);
+		
+		if (CollectionUtils.isNotEmpty(orderList)) {
+			// 声明一个工作薄
+			XSSFWorkbook workbook = new XSSFWorkbook();
+			// 生成一个表格
+			XSSFSheet sheet = workbook.createSheet("Sheet1");
+			// 产生表格标题行
+			XSSFRow row = sheet.createRow(0);
+			row.createCell(0).setCellValue("店铺");
+			row.createCell(1).setCellValue("订单号");
+			row.createCell(2).setCellValue("订单原价(元)");
+			row.createCell(3).setCellValue("特价折扣(元)");
+			row.createCell(4).setCellValue("满减金额(元)");
+			row.createCell(5).setCellValue("新客立减(元)");
+			row.createCell(6).setCellValue("用户实付(元)");
+			row.createCell(7).setCellValue("配送费(元)");
+			row.createCell(8).setCellValue("用户实付配送费(元)");
+			row.createCell(9).setCellValue("商家支付配送费(元)");
+			row.createCell(10).setCellValue("平台扣点(元)");
+			row.createCell(11).setCellValue("微信扣点(元)");
+			row.createCell(12).setCellValue("退款金额(元)");
+			row.createCell(13).setCellValue("商家预计收入");
+			row.createCell(14).setCellValue("订单类型");
+			row.createCell(15).setCellValue("状态");
+			row.createCell(16).setCellValue("下单时间");
+			row.createCell(17).setCellValue("完成时间");
+	
+			int index = 1;
+	        for (int i = 0; i < orderList.size(); i++) {
+	        	OrderIncomeBean order = orderList.get(i);
+	    		row = sheet.createRow(index);
+	    		row.createCell(0).setCellValue(order.getStoreName());
+	    		row.createCell(1).setCellValue(order.getOrderCode());
+			    row.createCell(2).setCellValue(order.getOriginPrice().toString());
+			    row.createCell(3).setCellValue(order.getSpecialDiscounts().toString());
+			    row.createCell(4).setCellValue(order.getFullDiscounts().toString());
+			    row.createCell(5).setCellValue(order.getNewcusDiscounts().toString());
+			    row.createCell(6).setCellValue(order.getOrderFee().toString());
+			    row.createCell(7).setCellValue(order.getDeliveryFee().toString());
+			    row.createCell(8).setCellValue(order.getUserDeliveryFee().toString());
+			    row.createCell(9).setCellValue(order.getStoreDeliveryFee().toString());
+				row.createCell(10).setCellValue(order.getCommissionPoints().toString());
+				row.createCell(11).setCellValue(order.getWxPoints().toString());
+				row.createCell(12).setCellValue(order.getRefundAmount().toString());
+				row.createCell(13).setCellValue(order.getActualIncom().toString());
+				row.createCell(14).setCellValue(order.getOrderTypeStr());
+				row.createCell(15).setCellValue(order.getStatusStr());
+			    row.createCell(16).setCellValue(order.getCreateDateStr());
+			    row.createCell(17).setCellValue(order.getCompleteDateStr());
+	            index++;
+	        }
+	        
+	    	// 浏览器下载excel
+	 		response.setContentType("application/vnd.ms-excel;charset=utf-8");
+	 		response.setHeader("Content-disposition", "attachment;filename=结算订单明细.xlsx");
+	 		response.flushBuffer();
+	 		OutputStream outputStream = response.getOutputStream();
+	 		workbook.write(outputStream);
+	 		outputStream.flush();
+	 		outputStream.close();
+		}
+		return null;
+	}
+	
+	/**
+	 * 方法名称:首页-订单相关信息
+	 * 功能描述:首页-订单相关信息
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "/homeDataInfo")
+	@AuthToken(type = "admin")
+	public ResultBean homeDataInfo() {
+		ResultBean bean = new ResultBean();
+		HomeOrderInfoBean result = orderManageService.homeDataInfo();
+		bean.setObj(result);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取订单支付情况
+	 * 功能描述:获取订单支付情况
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-08-12
+	 */
+	@PostMapping(value = "/getOrderPayedInfo")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderPayedInfo(String orderCode) {
+		ResultBean bean = new ResultBean();
+		
+		// 参数基本验证
+		if (orderCode == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+			return bean;
+		}
+		bean.setObj(orderManageService.getOrderPayedInfo(orderCode));
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取订单退款情况
+	 * 功能描述:获取订单退款情况
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-08-12
+	 */
+	@PostMapping(value = "/getOrderRefundInfo")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderRefundInfo(String orderCode) {
+		ResultBean bean = new ResultBean();
+		
+		// 参数基本验证
+		if (orderCode == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+			return bean;
+		}
+		bean.setObj(orderManageService.getOrderRefundInfo(orderCode));
+		return bean;
+	}
+	
+}

+ 77 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/order/RefundController.java

@@ -0,0 +1,77 @@
+package com.sapit.client.app.manage.controller.order;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.sapit.client.app.manage.service.order.RefundService;
+import com.sapit.common.bean.system.LoginInfoBean;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.util.RedisTool;
+
+/**
+ * 售后管理Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "refund", produces = "application/json")
+public class RefundController {
+
+	@Autowired
+	private RefundService refundService;
+	
+	@Autowired
+	private RedisTool redisTool;
+	
+	/**
+	 * 方法名称:订单全部退款
+	 * 功能描述:订单全部退款
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "orderRefund")
+	@AuthToken(type = "admin")
+	public ResultBean orderRefund(HttpServletRequest request, Long orderId, String reason) {
+		String token = request.getHeader("Authorization");
+		String userInfo = redisTool.getValueStr(token);
+		LoginInfoBean loginBean = null;
+		if (userInfo != null) {
+    		JSONObject obj = JSON.parseObject(userInfo);
+    		loginBean = JSON.toJavaObject(obj, LoginInfoBean.class);
+		}
+		ResultBean bean = new ResultBean();
+		bean = refundService.orderRefund(loginBean, orderId, reason);
+
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取售后列表
+	 * 功能描述:获取售后列表
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@PostMapping(value = "page")
+	@AuthToken(type = "admin")
+	public ResultBean refundPage(int pageSize, int currentPage, Long refundType, String orderCode) {
+		ResultBean bean = new ResultBean();
+		
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+		
+		bean.setList(refundService.refundPage(pageControlData, refundType, orderCode));
+		bean.setPage(pageControlData);
+		return bean;
+	}
+}

+ 94 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/order/RefundFailedController.java

@@ -0,0 +1,94 @@
+package com.sapit.client.app.manage.controller.order;
+
+import com.sapit.client.app.manage.service.order.RefundFailedService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.order.BuRefundFailed;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.order.BuRefundFailedSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 退款失败Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "refundFailed", produces = "application/json")
+public class RefundFailedController {
+
+	@Autowired
+	private RefundFailedService refundFailedService;
+	
+	/**
+	 * 方法名称:退款失败列表(分页)
+	 * 功能描述:退款失败列表(分页)
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "page")
+	@AuthToken(type = "admin")
+	public ResultBean page(int pageSize, int currentPage, BuRefundFailedSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		
+		PageControlData page = new PageControlData();
+		page.setPageSize(pageSize);
+		page.setCurrentPage(currentPage);
+		List<BuRefundFailed> list = refundFailedService.page(page, searchBean);
+		
+		bean.setList(list);
+		bean.setPage(page);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:再次退款
+	 * 功能描述:再次退款
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "refundAgain")
+	@AuthToken(type = "admin")
+	public ResultBean refundAgain(Long refundFailedId) {
+		ResultBean bean = new ResultBean();
+		if (refundFailedId == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+            return bean;
+        }
+		refundFailedService.refundAgain(refundFailedId);
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+        bean.getRtnBean().setRtnMsg("操作成功!");
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:删除失败记录
+	 * 功能描述:删除失败记录
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "delete")
+	@AuthToken(type = "admin")
+	public ResultBean delete(Long refundFailedId) {
+		ResultBean bean = new ResultBean();
+		if (refundFailedId == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+            return bean;
+        }
+		refundFailedService.delete(refundFailedId);
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+        bean.getRtnBean().setRtnMsg("删除成功!");
+		return bean;
+	}
+}

+ 133 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/rider/AddressGroupManageController.java

@@ -0,0 +1,133 @@
+package com.sapit.client.app.manage.controller.rider;
+
+import com.sapit.client.app.manage.service.rider.AddressGroupManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.rider.BuAddressGroup;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.rider.AddressGroupSearchBean;
+import com.sapit.common.util.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * 类名称:配送区域分组管理Controller 
+ * 类描述:处理配送区域分组管理的各种操作
+ *  
+ * 作  者:Vic
+ * 时  间:2023-05-22
+ */
+@RestController
+@RequestMapping(value = "addressgroupmanage", produces = "application/json")
+public class AddressGroupManageController {
+	// 日志输出
+	static final Logger log = LoggerFactory.getLogger(AddressGroupManageController.class);
+
+	@Autowired
+	private AddressGroupManageService addressGroupManageService;
+	
+	/**
+	 * 方法名称:获取配送区域分组列表
+	 * 功能描述:获取配送区域分组列表
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-22
+	 */
+	@PostMapping(value = "/getAddressGroupList")
+	@AuthToken(type = "admin")
+	public ResultBean getAddressGroupList(AddressGroupSearchBean searchBean){
+		ResultBean bean = new ResultBean();
+
+		List<BuAddressGroup> list = addressGroupManageService.getAddressGroupList(searchBean);
+				
+		bean.setList(list);
+        
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:新增、编辑配送区域分组
+	 * 功能描述:新增、编辑配送区域分组
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-22
+	 */
+	@PostMapping(value = "/updateAddressGroup")
+	@AuthToken(type = "admin")
+	public ResultBean updateAddressGroup(BuAddressGroup group){
+		// 定义返回结果Bean
+		ResultBean bean = new ResultBean();
+		if (group == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			if (group.getAddressGroupId() == null) {
+				group.setCreateDate(DateUtil.getSqlToday());
+				boolean rtn = addressGroupManageService.save(group);
+				if (!rtn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+				} else {
+					bean.getRtnBean().setRtnMsg("新增成功!");
+				}
+			} else {
+				// 获取旧数据
+				BuAddressGroup oldGroup = addressGroupManageService.getAddressGroupById(group.getAddressGroupId());
+				oldGroup.setAddressGroupName(group.getAddressGroupName());
+				oldGroup.setUpdateDate(DateUtil.getSqlToday());
+				
+				// 更新操作
+				boolean rtn = addressGroupManageService.update(oldGroup);
+				if (!rtn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+				} else {
+					bean.getRtnBean().setRtnMsg("更新成功!");
+				}
+			}
+		}
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:删除配送区域分组
+	 * 功能描述:删除配送区域分组
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-22
+	 */
+	@PostMapping(value = "/deleteAddressGroup")
+	@AuthToken(type = "admin")
+	public ResultBean deleteAddressGroup(Long id){
+		// 定义返回结果Bean
+		ResultBean bean = new ResultBean();
+		if (id == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			// 验证改名称是否在使用中
+			if (addressGroupManageService.checkGroupIsUsed(id)) {
+				bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+				bean.getRtnBean().setRtnMsg("该区域分组正在使用中,如想删除请先将使用该分组的区域调整为其他分组!");
+			} else {
+				// 删除该区域分组
+				if (!addressGroupManageService.deleteGroupById(id)) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+				} else {
+					bean.getRtnBean().setRtnMsg("删除成功!");
+				}
+			}
+		}
+		
+		return bean;
+	}
+}

+ 283 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/rider/AddressManageController.java

@@ -0,0 +1,283 @@
+package com.sapit.client.app.manage.controller.rider;
+
+import com.sapit.client.app.manage.service.rider.AddressManageService;
+import com.sapit.common.bean.rider.AddressBean;
+import com.sapit.common.constant.Flag;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.rider.BuAddress;
+import com.sapit.common.entity.rider.BuAddressExtraCost;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.rider.AddressSearchBean;
+import com.sapit.common.util.DateUtil;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * 类名称:配送区域管理Controller 
+ * 类描述:处理配送区域管理的各种操作
+ *  
+ * 作  者:Vic
+ * 时  间:2023-05-15
+ */
+@RestController
+@RequestMapping(value = "addressmanage", produces = "application/json")
+public class AddressManageController {
+	// 日志输出
+	static final Logger log = LoggerFactory.getLogger(AddressManageController.class);
+
+	@Autowired
+	private AddressManageService addressManageService;
+	
+	/**
+	 * 方法名称:获取配送区域列表
+	 * 功能描述:获取配送区域列表
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "/getAllAddressList")
+	@AuthToken(type = "admin")
+	public ResultBean getAllAddressList(){
+		ResultBean bean = new ResultBean();
+
+		List<AddressBean> list = addressManageService.getAllAddressList();
+				
+		bean.setList(list);
+        
+		return bean;
+	}
+	
+	
+	/**
+	 * 方法名称:新增、编辑配送区域
+	 * 功能描述:新增、编辑配送区域
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "/updateAddress")
+	@AuthToken(type = "admin")
+	public ResultBean updateAddress(BuAddress address){
+		// 定义返回结果Bean
+		ResultBean bean = new ResultBean();
+		if (address == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+		} else {
+			// 数据处理
+			// 不是末节点的时候
+			if (address.getLastFlg() == null || !Flag.FLAG_YES.equals(address.getLastFlg())) {
+				address.setLastFlg(Flag.FLAG_NO);
+				address.setRiderId(null);
+				address.setAddressGroupId(null);
+				address.setClimbCtlType(null);
+				address.setClimbStatus(null);
+				address.setBeginTime(null);
+				address.setEndTime(null);
+			}
+			if (address.getAddressId() == null) {
+				String pFullName = addressManageService.getParentFullName(address.getPid());
+				String fullName =  StringUtils.isNotBlank(pFullName) ? pFullName + "-" + address.getAddressName() : address.getAddressName();
+				address.setFullName(fullName);
+				// 新增操作
+				address.setCreateDate(DateUtil.getSqlToday());
+				boolean rtn = addressManageService.save(address);
+				if (!rtn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+				}
+			} else {
+				// 获取旧数据
+				BuAddress oldAddress = addressManageService.getAddressById(address.getAddressId());
+				oldAddress.setAddressGroupId(address.getAddressGroupId());
+				oldAddress.setAddressName(address.getAddressName());
+				oldAddress.setBeginTime(address.getBeginTime());
+				oldAddress.setEndTime(address.getEndTime());
+				oldAddress.setClimbCtlType(address.getClimbCtlType());
+				oldAddress.setClimbStatus(address.getClimbStatus());
+				oldAddress.setLastFlg(address.getLastFlg());
+				oldAddress.setRiderId(address.getRiderId());
+				oldAddress.setSort(address.getSort());
+				oldAddress.setStatus(address.getStatus());
+				oldAddress.setUpdateDate(DateUtil.getSqlToday());
+				String pFullName = addressManageService.getParentFullName(address.getPid());
+				String fullName =  StringUtils.isNotBlank(pFullName) ? pFullName + "-" + address.getAddressName() : address.getAddressName();
+				oldAddress.setFullName(fullName);
+				// 更新操作
+				boolean rtn = addressManageService.update(oldAddress);
+				addressManageService.updateChildrenFullName(address.getAddressId());
+
+				if (address.getStatus() == 0) {
+					// 如果禁用删除用户地址
+					addressManageService.deleteMemberAddressByAddressId(address.getAddressId());
+
+				}
+				if (!rtn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+				}
+			}
+		}
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:删除区域地址
+	 * 功能描述:删除区域地址
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-24
+	 */
+	@PostMapping(value = "/deleteAddress")
+	@AuthToken(type = "admin")
+	public ResultBean deleteAddress(Long id){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (id == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+		} else {
+			addressManageService.deleteAddressById(id);
+		}		
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:更新爬楼开关状态
+	 * 功能描述:更新爬楼开关状态
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-24
+	 */
+	@PostMapping(value = "/updatgeClimbStatus")
+	@AuthToken(type = "admin")
+	public ResultBean updatgeClimbStatus(Long id, Long status){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (id == null || status == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+		} else {
+			addressManageService.updatgeClimbStatus(id, status);
+		}		
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取店铺区域的额外配送费用
+	 * 功能描述:获取店铺区域的额外配送费用
+	 * 参数说明: 
+	 * 作	 者:vic
+	 * 日	 期:2023-05-25
+	 */
+	@PostMapping(value = "/getStoreAreaExtraCostList")
+	@AuthToken(type = "admin")
+	public ResultBean getStoreAreaExtraCostList(Long addressId) {
+		ResultBean bean = new ResultBean();
+		
+		if (addressId == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+		} else {
+			List<BuAddressExtraCost> list = addressManageService.getStoreAreaExtraCostList(addressId);
+			bean.setList(list);
+		}
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取店铺区域的额外配送费用
+	 * 功能描述:获取店铺区域的额外配送费用
+	 * 参数说明: 
+	 * 作	 者:vic
+	 * 日	 期:2023-05-25
+	 */
+	@PostMapping(value = "/saveExtraCost")
+	@AuthToken(type = "admin")
+	public ResultBean saveExtraCost(BuAddressExtraCost addressExtraCost) {
+		// 定义返回结果Bean
+		ResultBean bean = new ResultBean();
+		if (addressExtraCost == null || addressExtraCost.getExtraCostString() == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+		} else {
+			Double temp = Double.valueOf(addressExtraCost.getExtraCostString()) * 100;
+			addressExtraCost.setExtraCost(Math.round(temp));
+			
+			if (addressExtraCost.getAddressExtraCostId() == null) {
+				// 新增操作
+				addressExtraCost.setCreateDate(DateUtil.getSqlToday());
+				boolean rtn = addressManageService.saveAddressExtraCost(addressExtraCost);
+				if (!rtn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+				}
+			} else {
+				// 更新操作
+				boolean rtn = addressManageService.updateAddressExtraCostById(addressExtraCost.getAddressExtraCostId(), addressExtraCost.getExtraCost());
+				if (!rtn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+				}
+			}
+		}
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取配送地址
+	 * 功能描述:获取配送地址
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-29
+	 */
+	@PostMapping(value = "/getAddressList")
+	@AuthToken(type = "admin")
+	public ResultBean getAddressList(AddressSearchBean sb){
+		ResultBean bean = new ResultBean();
+
+		List<BuAddress> list = addressManageService.getAddressList(sb);
+				
+		bean.setList(list);
+        
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:根据ID获取配送地址
+	 * 功能描述:根据ID获取配送地址
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-21
+	 */
+	@PostMapping(value = "/getAddressById")
+	@AuthToken(type = "admin")
+	public ResultBean getAddressById(Long id){
+		ResultBean bean = new ResultBean();
+
+		if (id == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+		} else {
+			BuAddress address = addressManageService.getAddressById(id);
+			bean.setObj(address);
+		}
+		
+		return bean;
+	}
+	
+}

+ 117 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/rider/DeliveryOrderManageController.java

@@ -0,0 +1,117 @@
+package com.sapit.client.app.manage.controller.rider;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.sapit.client.app.manage.service.rider.DeliveryOrderManageService;
+import com.sapit.client.app.user.service.system.CommonApiService;
+import com.sapit.common.bean.mobile.SettingBean;
+import com.sapit.common.bean.order.DeliveryOrderBean;
+import com.sapit.common.bean.order.DeliveryOrderCountBean;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.order.BuOrderSearchBean;
+
+
+/**
+ * 类名称:配送订单管理Controller 
+ * 类描述:处理配送订单管理的各种操作
+ *  
+ * 作  者:Vic
+ * 时  间:2023-05-26
+ */
+@RestController
+@RequestMapping(value = "deliveryOrderManage", produces = "application/json")
+public class DeliveryOrderManageController {
+	// 日志输出
+	static final Logger log = LoggerFactory.getLogger(DeliveryOrderManageController.class);
+
+	@Autowired
+	private DeliveryOrderManageService deliveryOrderManageService;
+	@Autowired
+	private CommonApiService commonApiService;
+	
+	/**
+	 * 方法名称:获取配送订单列表
+	 * 功能描述:获取配送订单列表
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "/getDeliveryOrderList")
+	@AuthToken(type = "admin")
+	public ResultBean getDeliveryOrderList(BuOrderSearchBean sb, PageControlData page){
+		ResultBean bean = new ResultBean();
+
+		DeliveryOrderCountBean countBean = deliveryOrderManageService.getDeliveryOrderCount(sb);
+		List<DeliveryOrderBean> list = deliveryOrderManageService.getDeliveryOrderList(page, sb);
+		Long areaId = commonApiService.getSysAreaId();
+		SettingBean setting = commonApiService.getSysSetting(areaId);
+		
+		bean.setObj(countBean);
+		bean.setObj1(setting);
+		bean.setList(list);
+		bean.setPage(page);
+        
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:将订单设置为完成
+	 * 功能描述:将订单设置为完成
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-30
+	 */
+	@PostMapping(value = "/updateOrderFinish")
+	@AuthToken(type = "admin")
+	public ResultBean updateOrderFinish(Long id){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (id == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			if (!deliveryOrderManageService.updateOrderFinish(id)) {
+				bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+				bean.getRtnBean().setRtnMsg("配送状态已变更,不能执行该操作!");
+			}
+		}		
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:给订单分配取餐员
+	 * 功能描述:给订单分配取餐员
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-30
+	 */
+	@PostMapping(value = "/allocationOrder")
+	@AuthToken(type = "admin")
+	public ResultBean allocationOrder(Long orderId, Long riderId, Long status){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (orderId == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			if (!deliveryOrderManageService.allocationOrder(orderId, riderId, status)) {
+				bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+				bean.getRtnBean().setRtnMsg("配送状态已变更,不能执行该操作!");
+			}
+		}		
+		
+		return bean;
+	}
+	
+}

+ 366 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/rider/RiderManageController.java

@@ -0,0 +1,366 @@
+package com.sapit.client.app.manage.controller.rider;
+
+import com.sapit.client.app.manage.service.rider.RiderManageService;
+import com.sapit.common.constant.Flag;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.constant.Status;
+import com.sapit.common.entity.rider.BuRider;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.rider.RiderSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.FileFtpUploadUtil;
+import com.sapit.common.util.MD5;
+import com.sapit.common.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+
+/**
+ * 类名称:配送员管理Controller 
+ * 类描述:处理配送员管理的各种操作
+ *  
+ * 作  者:Vic
+ * 时  间:2023-05-15
+ */
+@RestController
+@RequestMapping(value = "ridermanage", produces = "application/json")
+public class RiderManageController {
+	// 日志输出
+	static final Logger log = LoggerFactory.getLogger(RiderManageController.class);
+
+	@Autowired
+	private RiderManageService riderManageService;
+	
+	/**
+	 * 方法名称:获取配送员列表(带分页)
+	 * 功能描述:获取配送员列表
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	@PostMapping(value = "/getRiderList")
+	@AuthToken(type = "admin")
+	public ResultBean getRiderList(RiderSearchBean searchBean, PageControlData page){
+		ResultBean bean = new ResultBean();
+		searchBean.setIsInside(1L);
+		List<BuRider> list = riderManageService.getRiderList(page, searchBean);
+				
+		bean.setList(list);
+        bean.setPage(page);
+        
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取配送员列表(带分页)
+	 * 功能描述:获取配送员列表
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	@PostMapping(value = "/getRiderListNoPage")
+	@AuthToken(type = "admin")
+	public ResultBean getRiderListNoPage(RiderSearchBean searchBean){
+		ResultBean bean = new ResultBean();
+
+		List<BuRider> list = riderManageService.getRiderList(searchBean);
+				
+		bean.setList(list);
+        
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:获取所有爬楼权限的配送员
+	 * 功能描述:获取所有爬楼权限的配送员
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "/getClimbUserList")
+	@AuthToken(type = "admin")
+	public ResultBean getRiderList(){
+		ResultBean bean = new ResultBean();
+		RiderSearchBean searchBean = new RiderSearchBean();
+		searchBean.setClimbFlg(Flag.FLAG_YES); // 有爬楼权限
+		searchBean.setStatus(Status.STATUS_VALID);// 正常用户
+		searchBean.setIsInside(Flag.FLAG_YES);
+		searchBean.setType("1");
+		
+		List<BuRider> list = riderManageService.getRiderList(searchBean);
+				
+		bean.setList(list);
+        
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:更新配送员工作状态(工作中,休息中)
+	 * 功能描述:更新配送员工作状态(工作中,休息中)
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-19
+	 */
+	@PostMapping(value = "/updateWorkStatu")
+	@AuthToken(type = "admin")
+	public ResultBean updateWorkStatu(Long riderId, Long status){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (riderId == null || status == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			riderManageService.updateWorkStatus(riderId, status);
+		}		
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:更新配送员状态(冻结,正常)
+	 * 功能描述:新配送员状态(冻结,正常)
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	@PostMapping(value = "/updateRiderStatus")
+	@AuthToken(type = "admin")
+	public ResultBean updateRiderStatus(Long riderId, Long status){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (riderId == null || status == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			riderManageService.updateRiderStatus(riderId, status);
+		}		
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:设置配送员取餐权限
+	 * 功能描述:设置配送员取餐权限
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	@PostMapping(value = "/updateSortFlg")
+	@AuthToken(type = "admin")
+	public ResultBean updateSortFlg(Long riderId, Long flg){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (riderId == null || flg == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			riderManageService.updateSortFlg(riderId, flg);
+		}
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:设置配送员送餐权限
+	 * 功能描述:设置配送员送餐权限
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	@PostMapping(value = "/updateDeliveryFlg")
+	@AuthToken(type = "admin")
+	public ResultBean updateDeliveryFlg(Long riderId, Long flg){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (riderId == null || flg == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			riderManageService.updateDeliveryFlg(riderId, flg);
+		}
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:设置配送员爬楼权限
+	 * 功能描述:设置配送员爬楼权限
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	@PostMapping(value = "/updateClimbFlg")
+	@AuthToken(type = "admin")
+	public ResultBean updateClimbFlg(Long riderId, Long flg){
+		ResultBean bean = new ResultBean();
+		// 参数基本验证
+		if (riderId == null || flg == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			riderManageService.updateClimbFlg(riderId, flg);
+		}	
+		
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:新增、编辑配送员
+	 * 功能描述:新增、编辑配送员
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-16
+	 */
+	@PostMapping(value = "/updateRider")
+	@AuthToken(type = "admin")
+	public ResultBean updateRider(BuRider rider, @RequestParam(value = "file", required = false)MultipartFile file){
+		// 定义返回结果Bean
+		ResultBean bean = new ResultBean();
+		if (rider == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+		} else {
+			if (file != null && file.getOriginalFilename() != null) {
+				if (file.getSize() > 204800) {
+					bean.getRtnBean().setRtnMsg("图片大小超过200K,请调整清晰度之后再试!");
+					return bean;
+				}
+				String imageType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
+				String filename = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + imageType;
+				// 上传文件
+				try {
+					if (!FileFtpUploadUtil.uploadFile("/rider", filename, file.getInputStream())) {
+						bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+						bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+						return bean;
+					}
+				} catch (Exception e) {
+					bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+					bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+					return bean;
+				}
+				rider.setHeadimgurl(FileFtpUploadUtil.rootURL + "/rider/" + filename);
+			}
+			
+			if (rider.getRiderId() == null) {
+				// 校验手机号是否有重复的
+				boolean btn = riderManageService.checkRiderTel(null, rider.getTelNo());
+				if (!btn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("手机号已被使用,请更换手机号");
+					return bean;
+				}
+				// 新增操作
+				rider.setStatus(Status.STATUS_VALID);
+				rider.setIsInside(1L);
+				rider.setWorkStatus(0L);
+				rider.setPasswd(MD5.encrypt("123456"));
+				rider.setCreateDate(DateUtil.getSqlToday());
+				boolean rtn = riderManageService.save(rider);
+				if (!rtn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+				}
+			} else {
+				boolean btn = riderManageService.checkRiderTel(rider.getRiderId(), rider.getTelNo());
+				if (!btn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("手机号已被使用,请更换手机号");
+					return bean;
+				}
+				// 获取旧数据
+				BuRider oldRider = riderManageService.getRiderById(rider.getRiderId());
+				oldRider.setRiderName(rider.getRiderName());
+				oldRider.setTelNo(rider.getTelNo());
+				oldRider.setSex(rider.getSex());
+//				oldRider.setPasswd(rider.getPasswd());
+				oldRider.setSortFlg(rider.getSortFlg());
+				oldRider.setDeliveryFlg(rider.getDeliveryFlg());
+				oldRider.setClimbFlg(rider.getClimbFlg());
+				oldRider.setRiderType(rider.getRiderType());
+				oldRider.setWorkStart(rider.getWorkStart());
+				oldRider.setWorkEnd(rider.getWorkEnd());
+				if (rider.getHeadimgurl() != null) {
+					if (!StringUtil.isBlank(oldRider.getHeadimgurl())) {
+						String filename = oldRider.getHeadimgurl().substring(oldRider.getHeadimgurl().lastIndexOf("/") + 1);
+						// 删除旧图片
+						FileFtpUploadUtil.deleteFile("/rider", filename);		
+					}
+					oldRider.setHeadimgurl(rider.getHeadimgurl());
+                }
+				oldRider.setUpdateDate(DateUtil.getSqlToday());
+				
+				// 更新操作
+				boolean rtn = riderManageService.update(oldRider);
+				if (!rtn) {
+					bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+					bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+				}
+			}
+		}
+		
+		return bean;
+	}
+	
+	/**
+     * 方法名称:更改配送员状态
+     * 功能描述:更改配送员状态
+     * 参数说明:
+     * 作    者:Vic
+     * 时    间:2023-05-22
+     */
+    @PostMapping(value = "/changeStatus")
+	@AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        // 参数验证
+        if (id == null || status == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+			return bean;
+		} 
+        // 更新菜单状态
+        riderManageService.updateRiderStatus(id, status);
+
+        return bean;
+    }
+
+    /**
+     * 方法名称:重置密码
+     * 功能描述:更改配送员状态
+     * 参数说明:
+     * 作    者:Vic
+     * 时    间:2023-05-22
+     */
+    @PostMapping(value = "/restPwd")
+	@AuthToken(type = "admin")
+    public ResultBean restPwd(Long riderId) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        // 参数验证
+        if (riderId == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+			return bean;
+		}
+		BuRider byId = riderManageService.getRiderById(riderId);
+        byId.setPasswd(MD5.encrypt("123456"));
+		// 重置密码
+		riderManageService.update(byId);
+//        riderManageService.updateRiderStatus(id, status);
+
+        return bean;
+    }
+
+}

+ 121 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/rider/RiderOrderAcountController.java

@@ -0,0 +1,121 @@
+package com.sapit.client.app.manage.controller.rider;
+
+import com.sapit.client.app.manage.service.rider.RiderOrderAcountService;
+import com.sapit.common.bean.rider.RiderOrderAcountSumBean;
+import com.sapit.common.entity.rider.BuRiderOrderAcount;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.rider.RiderOrderAcountSearchBean;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 类名称:配送订单统计Controller 
+ * 类描述:处理配送订单统计的各种操作
+ *  
+ * 作  者:Vic
+ * 时  间:2023-05-26
+ */
+@RestController
+@RequestMapping(value = "riderOrderAcount", produces = "application/json")
+public class RiderOrderAcountController {
+	// 日志输出
+	static final Logger log = LoggerFactory.getLogger(RiderOrderAcountController.class);
+
+	@Autowired
+	private RiderOrderAcountService riderOrderAcountService;
+	
+	/**
+	 * 方法名称:获取配送订单合计列表
+	 * 功能描述:获取配送订单合计列表
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-30
+	 */
+	@PostMapping(value = "/getRiderOrderAcountList")
+	@AuthToken(type = "admin")
+	public ResultBean getRiderOrderAcountList(int pageSize, int currentPage, RiderOrderAcountSearchBean searchBean){
+		ResultBean bean = new ResultBean();
+		PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+        
+		RiderOrderAcountSumBean countBean = riderOrderAcountService.getRiderOrderAcountSum(searchBean);
+		List<BuRiderOrderAcount> list = riderOrderAcountService.getRiderOrderAcountList(pageControlData, searchBean);
+		
+		bean.setObj(countBean);
+		bean.setList(list);
+		bean.setPage(pageControlData);
+        
+		return bean;
+	}
+
+	@PostMapping(value = "exportData")
+	@AuthToken(type = "admin")
+	public void exportData(HttpServletResponse response, RiderOrderAcountSearchBean searchBean) throws IOException {
+
+		List<BuRiderOrderAcount> list = riderOrderAcountService.getRiderOrderAcountList(null, searchBean);
+
+		if (CollectionUtils.isNotEmpty(list)) {
+			// 声明一个工作薄
+			XSSFWorkbook workbook = new XSSFWorkbook();
+			// 生成一个表格
+			XSSFSheet sheet = workbook.createSheet("Sheet1");
+			// 产生表格标题行
+			XSSFRow row = sheet.createRow(0);
+			row.createCell(0).setCellValue("配送员");
+			row.createCell(1).setCellValue("配送员电话");
+			row.createCell(2).setCellValue("预计收入");
+			row.createCell(3).setCellValue("取餐件数");
+			row.createCell(4).setCellValue("配送件数");
+			row.createCell(5).setCellValue("爬楼件数");
+			row.createCell(6).setCellValue("统计日期");
+
+			int index = 1;
+			for (int i = 0; i < list.size(); i++) {
+				BuRiderOrderAcount acount = list.get(i);
+				row = sheet.createRow(index);
+				BigDecimal total = BigDecimal.ZERO;
+				if (acount.getExpectMoney() != null) {
+					total = BigDecimal.valueOf(acount.getExpectMoney()).divide(BigDecimal.valueOf(100)).setScale(2,BigDecimal.ROUND_HALF_UP);
+				}
+				row.createCell(0).setCellValue(acount.getRiderName());
+				row.createCell(1).setCellValue(acount.getRiderTelNo());
+				row.createCell(2).setCellValue(total.toString());
+				row.createCell(3).setCellValue(acount.getSortingCount());
+				row.createCell(4).setCellValue(acount.getDeliveryCount());
+				row.createCell(5).setCellValue(acount.getClimbCount());
+				row.createCell(6).setCellValue(acount.getAcountDateStr());
+				index++;
+			}
+
+			// 浏览器下载excel
+			response.setContentType("application/vnd.ms-excel;charset=utf-8");
+			response.setHeader("Content-disposition", "attachment;filename=配送员订单统计.xlsx");
+			response.flushBuffer();
+			OutputStream outputStream = response.getOutputStream();
+			workbook.write(outputStream);
+			outputStream.flush();
+			outputStream.close();
+		}
+
+	}
+	
+	
+}

+ 110 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/setting/PrinterManageController.java

@@ -0,0 +1,110 @@
+package com.sapit.client.app.manage.controller.setting;
+
+import com.sapit.client.app.manage.service.setting.PrinterManageService;
+import com.sapit.client.app.store.service.system.FeieyunService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.setting.BuPrinter;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.setting.PrinterSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@RestController
+@RequestMapping(value = "printerManage", produces = "application/json")
+public class PrinterManageController {
+
+    @Autowired
+    private PrinterManageService printerManageService;
+    @Autowired
+    private FeieyunService feieyunService;
+
+
+    /**
+     * 方法名称: 查询小票机列表(带分页)
+     * 功能描述: 查询小票机列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:42
+     * @return:
+     **/
+    @PostMapping(value = "/getPrinterList")
+    @AuthToken(type = "admin")
+    public ResultBean getIndexStoreList(int pageSize, int currentPage, PrinterSearchBean searchBean) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        // 获取小票机List
+        List<BuPrinter> carouselList = printerManageService.getCarouselPage(pageControlData, searchBean);
+
+        bean.setList(carouselList);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+
+    /**
+     * 方法名称:编辑小票机
+     * 功能描述:编辑小票机
+     * 作    者:Liucl
+     * 日    期:2023-05-22
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuPrinter printer) {
+        return printerManageService.updatePrinter(printer);
+
+    }
+
+
+    /**
+     * 方法名称:删除小票机
+     * 功能描述:删除小票机
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    @PostMapping(value = "/delete")
+    @AuthToken(type = "admin")
+    public ResultBean deleteIconById(Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的小票机!");
+        } else {
+            // 查询小票机
+            BuPrinter printerById = printerManageService.getPrinterById(id);
+            // 调用飞鹅云api删除小票机
+            String code = feieyunService.deletePrinter(printerById.getSn());
+            if (!code.equals("OK")){
+                bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                bean.getRtnBean().setRtnMsg("飞鹅云小票机删除失败");
+                return bean;
+            }
+            // 删除小票机
+            printerManageService.deletePrinterById(id);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+        }
+        return bean;
+    }
+
+
+}

+ 137 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/setting/SystemSettingManageController.java

@@ -0,0 +1,137 @@
+package com.sapit.client.app.manage.controller.setting;
+
+import com.sapit.client.app.manage.service.setting.SettingManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.setting.BuSetting;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/12 17:10
+ */
+@RestController
+@RequestMapping(value="settingManage", produces="application/json")
+public class SystemSettingManageController {
+
+    @Autowired
+    private SettingManageService settingManageService;
+
+    /**
+     * 方法名称:获取系统设置信息
+     * 功能描述:获取系统设置信息
+     * 参数说明:
+     * 作    者:Liucl
+     * 时    间:2023-05-12
+     */
+    @PostMapping(value = "/getSettingInfo")
+    @AuthToken(type = "admin")
+    public ResultBean getSettingInfo() {
+        ResultBean bean = new ResultBean();
+        // 获取系统信息
+        BuSetting setting = settingManageService.getSettingInfo();
+
+        bean.setObj(setting);
+        return bean;
+    }
+    /**
+     * 方法名称:编辑系统设置设定
+     * 功能描述:编辑系统设置设定
+     * 作    者:Quinn
+     * 时    间:2022-03-21
+     */
+    @PostMapping("/updateSetting")
+    @AuthToken(type = "admin")
+    public ResultBean updateParam(BuSetting setting) {
+
+        ResultBean bean = new ResultBean();
+
+		if (setting.getSettingId() == null) {
+		    // 新增
+            setting.setCreateDate(DateUtil.getSqlToday());
+            boolean rtn = settingManageService.save(setting);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+            }
+        } else {
+		    // 修改
+            BuSetting settingById = settingManageService.getSettingById(setting.getSettingId());
+//            SysParam paramOld = systemParamManageService.getPlatformParamById(param.getParamId());
+
+
+            settingById.setRiderPrice(setting.getRiderPrice());
+            settingById.setTakePrice(setting.getTakePrice());
+            settingById.setClimbTime(setting.getClimbTime());
+            settingById.setRiderTime(setting.getRiderTime());
+            settingById.setTakeFoodTime(setting.getTakeFoodTime());
+            settingById.setTakeawayPoint(setting.getTakeawayPoint());
+            settingById.setInvitePoint(setting.getInvitePoint());
+            settingById.setWxPoint(setting.getWxPoint() == null ? 0L : setting.getWxPoint());
+            settingById.setCancelOrderTime(setting.getCancelOrderTime());
+            settingById.setNoTakeFoodTime(setting.getNoTakeFoodTime());
+            settingById.setPushTime(setting.getPushTime());
+            settingById.setSysStatus(setting.getSysStatus());
+            settingById.setClimbPrice(setting.getClimbPrice());
+            settingById.setDineTime(setting.getDineTime());
+
+            // 更新操作
+            boolean rtn = settingManageService.update(settingById);
+
+			if (!rtn) {
+				bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+				bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+			}
+		}
+
+        return bean;
+    }
+
+    /**
+     * 方法名称:编辑首页公告
+     * 功能描述:编辑首页公告
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    @PostMapping(value = "/updateContent")
+    @AuthToken(type = "admin")
+    public ResultBean updateContent(Long id,String content) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (id == null || content == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 删除首页推荐店铺
+            settingManageService.updateContent(id,content);
+
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("保存成功");
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:获取系统支付方式
+     * 功能描述:获取系统支付方式
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-09-07
+     */
+    @PostMapping("/getPayType")
+    @AuthToken(type = "admin")
+    public ResultBean getPayType() {
+
+        return settingManageService.getPayType();
+
+    }
+
+}

+ 88 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/settlement/OperatorSettlementController.java

@@ -0,0 +1,88 @@
+package com.sapit.client.app.manage.controller.settlement;
+
+import com.sapit.client.app.manage.service.settlement.OperatorSettlementService;
+import com.sapit.common.bean.settlement.OperatorSettlementNumBean;
+import com.sapit.common.entity.order.BuOperatorSettlement;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.settlement.BuOperatorSettlementSearchBean;
+import com.sapit.common.search.settlement.BuOperatorStatementNumBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 结算订单Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "operatorSettlement", produces = "application/json")
+public class OperatorSettlementController {
+
+	@Autowired
+	private OperatorSettlementService operatorSettlementService;
+	
+	/**
+	 * 方法名称:运营方结算单列表(分页)
+	 * 功能描述:运营方结算单列表(分页)
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "statementPage")
+	@AuthToken(type = "admin")
+	public ResultBean statementPage(int pageSize, int currentPage, BuOperatorSettlementSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+
+		List<BuOperatorSettlement> list = operatorSettlementService.page(pageControlData, searchBean);
+		
+		bean.setPage(pageControlData);
+		bean.setList(list);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:运营方结算单数字统计
+	 * 功能描述:运营方结算单数字统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "statementNum")
+	@AuthToken(type = "admin")
+	public ResultBean statementNum() {
+		ResultBean bean = new ResultBean();
+		
+		OperatorSettlementNumBean numBean = operatorSettlementService.getOperatorStatementNum(null);
+		
+		bean.setObj(numBean);
+		return bean;
+	}
+
+	/**
+	 * 方法名称:运营方结算单数字统计
+	 * 功能描述:运营方结算单数字统计
+	 * 参数说明:添加参数所属学院
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "statementNumNew")
+	@AuthToken(type = "admin")
+	public ResultBean statementNumNew(BuOperatorStatementNumBean numParameterBean) {
+		ResultBean bean = new ResultBean();
+
+		OperatorSettlementNumBean numBean = operatorSettlementService.getOperatorStatementNum(numParameterBean);
+
+		bean.setObj(numBean);
+		return bean;
+	}
+}

+ 469 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/settlement/StoreStatementController.java

@@ -0,0 +1,469 @@
+package com.sapit.client.app.manage.controller.settlement;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.sapit.client.app.manage.service.settlement.StoreStatementService;
+import com.sapit.common.bean.store.StoreStatementBean;
+import com.sapit.common.bean.store.StoreStatementNumBean;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.settlement.BuStoreStatement;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.settlement.BuStoreStatementSearchBean;
+import com.sapit.common.search.settlement.BuStoreStatementNumBean;
+import com.sapit.common.util.DateUtil;
+
+/**
+ * 结算订单Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "storeStatement", produces = "application/json")
+public class StoreStatementController {
+
+	@Autowired
+	private StoreStatementService storeStatementService;
+	
+	/**
+	 * 方法名称:商家结算单
+	 * 功能描述:商家结算单
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "statementPage")
+	@AuthToken(type = "admin")
+	public ResultBean statementPage(int pageSize, int currentPage, BuStoreStatementSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+		
+		List<StoreStatementBean> list = storeStatementService.page(pageControlData, searchBean);
+		
+		bean.setPage(pageControlData);
+		bean.setList(list);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:商家结算单页面数字信息
+	 * 功能描述:商家结算单页面数字信息
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "statementNum")
+	@AuthToken(type = "admin")
+	public ResultBean statementNum() {
+		ResultBean bean = new ResultBean();
+		
+		StoreStatementNumBean numBean = storeStatementService.getStoreStatementNum(null);
+
+		bean.setObj(numBean);
+		return bean;
+	}
+
+	/**
+	 * 方法名称:商家结算单页面数字信息
+	 * 功能描述:商家结算单页面数字信息
+	 * 参数说明:所属学院
+	 * 作    者:zzy
+	 * 日    期:2024-12-20
+	 */
+	@PostMapping(value = "statementNumNew")
+	@AuthToken(type = "admin")
+	public ResultBean statementNumNew(BuStoreStatementNumBean numParameterBean) {
+		ResultBean bean = new ResultBean();
+
+		StoreStatementNumBean numBean = storeStatementService.getStoreStatementNum(numParameterBean);
+
+		bean.setObj(numBean);
+		return bean;
+	}
+
+	/**
+	 * 方法名称:商家结算单导出
+	 * 功能描述:商家结算单导出
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "exportStoreStatement")
+	@AuthToken(type = "admin")
+	public ResultBean exportStoreStatement(HttpServletResponse response, BuStoreStatementSearchBean searchBean) throws IOException {
+		
+		List<StoreStatementBean> orderList = storeStatementService.page(null, searchBean);
+		
+		if (CollectionUtils.isNotEmpty(orderList)) {
+			// 声明一个工作薄
+			XSSFWorkbook workbook = new XSSFWorkbook();
+			// 生成一个表格
+			XSSFSheet sheet = workbook.createSheet("Sheet1");
+			// 产生表格标题行
+			XSSFRow row = sheet.createRow(0);
+			row.createCell(0).setCellValue("店铺");
+			row.createCell(1).setCellValue("账单日");
+			row.createCell(2).setCellValue("订单量");
+			row.createCell(3).setCellValue("用户实际付款");
+			row.createCell(4).setCellValue("退款单量");
+			row.createCell(5).setCellValue("退款金额");
+			row.createCell(6).setCellValue("微信扣点");      //
+			row.createCell(7).setCellValue("平台实际到账金额");
+			row.createCell(8).setCellValue("平台扣点");    //
+			row.createCell(9).setCellValue("应付配送费");    //
+			row.createCell(10).setCellValue("商家应收入");
+			row.createCell(11).setCellValue("配送订单量");
+			row.createCell(12).setCellValue("配送订单金额");
+			row.createCell(13).setCellValue("外带订单量");
+			row.createCell(14).setCellValue("外带订单金额");
+			row.createCell(15).setCellValue("堂吃订单量");
+			row.createCell(16).setCellValue("堂吃订单金额");
+			row.createCell(17).setCellValue("银行卡号");
+			row.createCell(18).setCellValue("开户行");
+			row.createCell(19).setCellValue("开户人");
+
+			int index = 1;
+	        for (int i = 0; i < orderList.size(); i++) {
+	        	StoreStatementBean order = orderList.get(i);
+	    		row = sheet.createRow(index);
+	    		row.createCell(0).setCellValue(order.getStoreName());
+	    		row.createCell(1).setCellValue(DateUtil.getDateStr(order.getAccountDate(), "yyyy-MM-dd"));
+	    		row.createCell(2).setCellValue(order.getOrderNum());
+	    		row.createCell(3).setCellValue(String.format("%.2f", order.getOrderFee() / 100f));
+	    		row.createCell(4).setCellValue(order.getRefundNum());
+	    		row.createCell(5).setCellValue(String.format("%.2f", order.getRefundFee() / 100f));
+	    		row.createCell(6).setCellValue(String.format("%.2f", order.getWxPoints() / 100f));
+	    		row.createCell(7).setCellValue(String.format("%.2f", (order.getOrderFee() - order.getRefundFee() - order.getWxPoints())/ 100f));
+	    		row.createCell(8).setCellValue(String.format("%.2f", order.getCmmissionPoints() / 100f));
+	    		row.createCell(9).setCellValue(String.format("%.2f", order.getDeliveryFee() / 100f));
+	    		row.createCell(10).setCellValue(String.format("%.2f", order.getActualIncome() / 100f));
+	    		row.createCell(11).setCellValue(order.getDeliveryOrderNum());
+	    		row.createCell(12).setCellValue(String.format("%.2f", order.getDeliveryOrderFee() / 100f));
+	    		row.createCell(13).setCellValue(order.getTakeoutOrderNum());
+	    		row.createCell(14).setCellValue(String.format("%.2f", order.getTakeoutOrderFee() / 100f));
+	    		row.createCell(15).setCellValue(order.getEatinOrderNum());
+	    		row.createCell(16).setCellValue(String.format("%.2f", order.getEatinOrderFee() / 100f));
+	    		row.createCell(17).setCellValue(order.getAccountNumber());
+	    		row.createCell(18).setCellValue(order.getOpeningBank());
+	    		row.createCell(19).setCellValue(order.getAccountHolder());
+	            index++;
+	        }
+	        
+	    	// 浏览器下载excel
+	 		response.setContentType("application/vnd.ms-excel;charset=utf-8");
+	 		response.setHeader("Content-disposition", "attachment;filename=结算订单明细.xlsx");
+	 		response.flushBuffer();
+	 		OutputStream outputStream = response.getOutputStream();
+	 		workbook.write(outputStream);
+	 		outputStream.flush();
+	 		outputStream.close();
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * 方法名称:商家结算单导出
+	 * 功能描述:商家结算单导出
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "exportStoreStatementSummary")
+	@AuthToken(type = "admin")
+	public ResultBean exportStoreStatementSummary(HttpServletResponse response, BuStoreStatementSearchBean searchBean) throws IOException {
+		
+		List<StoreStatementBean> orderList = storeStatementService.getExportSummaryList(searchBean);
+		
+		if (CollectionUtils.isNotEmpty(orderList)) {
+			// 声明一个工作薄
+			XSSFWorkbook workbook = new XSSFWorkbook();
+			// 生成一个表格
+			XSSFSheet sheet = workbook.createSheet("Sheet1");
+			// 产生表格标题行
+			XSSFRow row = sheet.createRow(0);
+			row.createCell(0).setCellValue("店铺");
+			row.createCell(1).setCellValue("开户人");
+			row.createCell(2).setCellValue("银行卡号");
+			row.createCell(3).setCellValue("开户行");
+			row.createCell(4).setCellValue("商家应收入");
+
+			int index = 1;
+	        for (int i = 0; i < orderList.size(); i++) {
+	        	StoreStatementBean order = orderList.get(i);
+	    		row = sheet.createRow(index);
+	    		row.createCell(0).setCellValue(order.getStoreName());
+	    		row.createCell(1).setCellValue(order.getAccountHolder());
+	    		row.createCell(2).setCellValue(order.getAccountNumber());
+	    		row.createCell(3).setCellValue(order.getOpeningBank());
+	    		row.createCell(4).setCellValue(String.format("%.2f", order.getActualIncome() / 100f));
+	    		
+	            index++;
+	        }
+	        
+	    	// 浏览器下载excel
+	 		response.setContentType("application/vnd.ms-excel;charset=utf-8");
+	 		response.setHeader("Content-disposition", "attachment;filename=结算订单明细.xlsx");
+	 		response.flushBuffer();
+	 		OutputStream outputStream = response.getOutputStream();
+	 		workbook.write(outputStream);
+	 		outputStream.flush();
+	 		outputStream.close();
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * 方法名称:结算
+	 * 功能描述:结算
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-13
+	 */
+	@PostMapping(value = "settleById")
+	@AuthToken(type = "admin")
+	public ResultBean settleById(String settlementId) {
+		ResultBean bean = new ResultBean();
+		
+		if (settlementId == null) {
+			bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+			bean.getRtnBean().setRtnMsg("参数错误,请指定要进行结算的单据!");
+			return bean;
+		}
+		// 获取要更新的数据ID及金额
+		BuStoreStatementSearchBean searchBean = new BuStoreStatementSearchBean();
+		searchBean.setStoreStatementId(Long.valueOf(settlementId));
+		List<BuStoreStatement> list = storeStatementService.getUnStatementIds(searchBean);
+		
+		if (list.size() != 1) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("没有找到数据!");
+			return bean;
+		}
+		
+		if (!storeStatementService.settleByIds(settlementId, list.get(0).getActualIncome())) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("结算失败,可能该单据已经结算过,请刷新页面后再试!");
+			return bean;
+		}
+		
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+		bean.getRtnBean().setRtnMsg("结算成功!");
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:根据条件结算全部单据
+	 * 功能描述:根据条件结算全部单据
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-13
+	 */
+	@PostMapping(value = "settleAll")
+	@AuthToken(type = "admin")
+	public ResultBean settleAll(BuStoreStatementSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		
+		List<BuStoreStatement> list = storeStatementService.getUnStatementIds(searchBean);
+		if (list.isEmpty()) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("当前条件下无待结算的单据!");
+			return bean;
+		}
+		
+		if (list.size() > 1000) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("每次结算数据不能超过1000件,请重新选取数据!");
+			return bean;
+		}
+		
+		StringBuilder ids = new StringBuilder();
+		Long dtatementFee = 0L;
+		
+		for (int i = 0; i < list.size(); i++) {
+			ids.append(",").append(list.get(i).getStoreStatementId());
+			dtatementFee += list.get(i).getActualIncome();
+		}
+		
+		if (!storeStatementService.settleByIds(ids.toString().substring(1), dtatementFee)) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("结算失败,请刷新页面后再试!");
+			return bean;
+		}
+		
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+		bean.getRtnBean().setRtnMsg("结算成功!");
+		return bean;
+	}
+
+	/**
+	 * 方法名称:结算选中的数据
+	 * 功能描述:结算选中的数据
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-13
+	 */
+	@PostMapping(value = "settleSelected")
+	@AuthToken(type = "admin")
+	public ResultBean settleSelected(String[] settlementIdArr) {
+		ResultBean bean = new ResultBean();
+		if (null == settlementIdArr || settlementIdArr.length == 0) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("参数错误!");
+			return bean;
+		}
+		
+		StringBuilder idstemp = new StringBuilder();
+		for (int i = 0; i < settlementIdArr.length; i++) {
+			idstemp.append(",").append(settlementIdArr[i]);
+		}
+		
+		BuStoreStatementSearchBean searchBean = new BuStoreStatementSearchBean();
+		searchBean.setStoreStatementIds(idstemp.toString().substring(1));
+		List<BuStoreStatement> list = storeStatementService.getUnStatementIds(searchBean);
+		
+		if (list.isEmpty()) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("没有找到数据!");
+			return bean;
+		}
+		
+		if (list.size() > 1000) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("每次结算数据不能超过1000件,请重新选取数据!");
+			return bean;
+		}
+		
+		StringBuilder ids = new StringBuilder();
+		Long dtatementFee = 0L;
+		
+		for (int i = 0; i < list.size(); i++) {
+			ids.append(",").append(list.get(i).getStoreStatementId());
+			dtatementFee += list.get(i).getActualIncome();
+		}
+		
+		if (!storeStatementService.settleByIds(ids.toString().substring(1), dtatementFee)) {
+			bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+			bean.getRtnBean().setRtnMsg("结算失败,请刷新页面后再试!");
+			return bean;
+		}
+		
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+		bean.getRtnBean().setRtnMsg("结算成功!");
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:商家结算统计
+	 * 功能描述:商家结算统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "sumPage")
+	@AuthToken(type = "admin")
+	public ResultBean sumPage(int pageSize, int currentPage, BuStoreStatementSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+		
+		List<StoreStatementBean> list = storeStatementService.sumPage(pageControlData, searchBean);
+		
+		bean.setPage(pageControlData);
+		bean.setList(list);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:导出商家结算统计
+	 * 功能描述:导出商家结算统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "exportSumStoreStatement")
+	@AuthToken(type = "admin")
+	public ResultBean exportSumStoreStatement(HttpServletResponse response, BuStoreStatementSearchBean searchBean) throws IOException {
+		
+		List<StoreStatementBean> orderList = storeStatementService.sumPage(null, searchBean);
+		
+		if (CollectionUtils.isNotEmpty(orderList)) {
+			// 声明一个工作薄
+			XSSFWorkbook workbook = new XSSFWorkbook();
+			// 生成一个表格
+			XSSFSheet sheet = workbook.createSheet("Sheet1");
+			// 产生表格标题行
+			XSSFRow row = sheet.createRow(0);
+			row.createCell(0).setCellValue("店铺");
+			row.createCell(1).setCellValue("订单量");
+			row.createCell(2).setCellValue("用户实际付款");
+			row.createCell(3).setCellValue("退款单量");
+			row.createCell(4).setCellValue("退款金额");
+			row.createCell(5).setCellValue("平台实际到账金额");
+			row.createCell(6).setCellValue("应付配送费");
+			row.createCell(7).setCellValue("微信扣点");
+			row.createCell(8).setCellValue("运营方扣点");
+			row.createCell(9).setCellValue("商家应收入");
+			row.createCell(10).setCellValue("配送订单量");
+			row.createCell(11).setCellValue("配送订单金额(实际到账)");
+			row.createCell(12).setCellValue("外带订单量");
+			row.createCell(13).setCellValue("外带订单金额(实际到账)");
+			row.createCell(14).setCellValue("堂吃订单量");
+			row.createCell(15).setCellValue("堂吃订单金额(实际到账)");
+
+			int index = 1;
+	        for (int i = 0; i < orderList.size(); i++) {
+	        	StoreStatementBean order = orderList.get(i);
+	    		row = sheet.createRow(index);
+	    		row.createCell(0).setCellValue(order.getStoreName());
+	    		row.createCell(1).setCellValue(order.getOrderNum());
+	    		row.createCell(2).setCellValue(String.format("%.2f", order.getOrderFee() / 100f));
+	    		row.createCell(3).setCellValue(order.getRefundNum());
+	    		row.createCell(4).setCellValue(String.format("%.2f", order.getRefundFee() / 100f));
+	    		row.createCell(5).setCellValue(String.format("%.2f", (order.getOrderFee() - order.getRefundFee() - order.getWxPoints())/ 100f));
+	    		row.createCell(6).setCellValue(String.format("%.2f", order.getDeliveryFee() / 100f));
+	    		row.createCell(7).setCellValue(String.format("%.2f", order.getWxPoints() / 100f));
+	    		row.createCell(8).setCellValue(String.format("%.2f", order.getCmmissionPoints() / 100f));
+	    		row.createCell(9).setCellValue(String.format("%.2f", order.getActualIncome() / 100f));
+	    		row.createCell(10).setCellValue(order.getDeliveryOrderNum());
+	    		row.createCell(11).setCellValue(String.format("%.2f", order.getDeliveryOrderFee() / 100f));
+	    		row.createCell(12).setCellValue(order.getTakeoutOrderNum());
+	    		row.createCell(13).setCellValue(String.format("%.2f", order.getTakeoutOrderFee() / 100f));
+	    		row.createCell(14).setCellValue(order.getEatinOrderNum());
+	    		row.createCell(15).setCellValue(String.format("%.2f", order.getEatinOrderFee() / 100f));
+	            index++;
+	        }
+	        
+	    	// 浏览器下载excel
+	 		response.setContentType("application/vnd.ms-excel;charset=utf-8");
+	 		response.setHeader("Content-disposition", "attachment;filename=结算订单明细.xlsx");
+	 		response.flushBuffer();
+	 		OutputStream outputStream = response.getOutputStream();
+	 		workbook.write(outputStream);
+	 		outputStream.flush();
+	 		outputStream.close();
+		}
+		
+		return null;
+	}
+}

+ 45 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/statistics/OrderSourceStatisticsController.java

@@ -0,0 +1,45 @@
+package com.sapit.client.app.manage.controller.statistics;
+
+import com.sapit.client.app.manage.service.statistics.OrderSourceStatisticsService;
+import com.sapit.common.bean.statistics.BuOrderSourceStatisticsBean;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.statistics.OrderSourceStatisticsSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 订单统计Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "orderSourceStatistics", produces = "application/json")
+public class OrderSourceStatisticsController {
+
+	@Autowired
+	private OrderSourceStatisticsService orderStatisticsService;
+	
+	/**
+	 * 方法名称:订单来源统计
+	 * 功能描述:订单来源统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "getOrderSourceStatistics")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderSourceStatistics(OrderSourceStatisticsSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		
+		List<BuOrderSourceStatisticsBean> list = orderStatisticsService.getOrderSourceStatistics(searchBean);
+		
+		bean.setList(list);
+		return bean;
+	}
+	
+}

+ 92 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/statistics/OrderStatisticsController.java

@@ -0,0 +1,92 @@
+package com.sapit.client.app.manage.controller.statistics;
+
+import com.sapit.client.app.manage.service.statistics.OrderStatisticsService;
+import com.sapit.common.bean.statistics.OperatorSettlementBean;
+import com.sapit.common.bean.statistics.StoreBrowseBean;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.statistics.OrderStatisticsSearchBean;
+import com.sapit.common.search.statistics.StoreBrowseStatisticsSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 订单统计Controller
+ * @author Yangyk
+ *
+ */
+@RestController
+@RequestMapping(value = "orderStatistics", produces = "application/json")
+public class OrderStatisticsController {
+
+	@Autowired
+	private OrderStatisticsService orderStatisticsService;
+	
+	/**
+	 * 方法名称:订单统计(总额,图表)
+	 * 功能描述:订单统计(总额,图表)
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "getOrderStatistics")
+	@AuthToken(type = "admin")
+	public ResultBean getOrderStatistics(OrderStatisticsSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		
+		OperatorSettlementBean oBean = orderStatisticsService.getOrderStatistics(searchBean);
+		
+		bean.setObj(oBean);
+		return bean;
+	}
+
+	/**
+	 * 方法名称:订单统计(总额,图表)
+	 * 功能描述:订单统计(总额,图表)
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "getStoreBrowseStatistics")
+	@AuthToken(type = "admin")
+	public ResultBean getStoreBrowseStatistics(StoreBrowseStatisticsSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		List<StoreBrowseBean> list = null;
+		if (searchBean.getStoreId() == null){
+
+			list = orderStatisticsService.getAllStoreBrowseStatistics(searchBean);
+		} else {
+			list = orderStatisticsService.getStoreBrowseStatistics(searchBean);
+		}
+
+		bean.setList(list);
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:运营数据统计
+	 * 功能描述:运营数据统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@PostMapping(value = "getOperatorStatistics")
+	public ResultBean getOperatorStatistics(int pageSize, int currentPage, OrderStatisticsSearchBean searchBean) {
+		ResultBean bean = new ResultBean();
+		PageControlData pageControlData = new PageControlData();
+		pageControlData.setPageSize(pageSize);
+		pageControlData.setCurrentPage(currentPage);
+		
+		OperatorSettlementBean oBean = orderStatisticsService.getOperatorStatistics(pageControlData, searchBean);
+		
+		bean.setObj(oBean);
+		bean.setPage(pageControlData);
+		return bean;
+	}
+	
+}

+ 166 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/store/StoreAreaManageController.java

@@ -0,0 +1,166 @@
+package com.sapit.client.app.manage.controller.store;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.sapit.client.app.manage.service.store.StoreAreaManageService;
+import com.sapit.common.bean.store.StoreAreaBean;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.store.BuStoreArea;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.store.StoreAreaSearchBean;
+import com.sapit.common.util.DateUtil;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/16 16:38
+ */
+@RestController
+@RequestMapping(value = "storeAreaManage", produces = "application/json")
+public class StoreAreaManageController {
+
+    @Autowired
+    private StoreAreaManageService storeAreaManageService;
+    /**
+     * 方法名称:获取门店区域列表List 带分页
+     * 功能描述:获取门店区域列表List
+     * 参数说明:
+     * 作    者:Lim
+     * 日    期:2021-03-31
+     */
+    @PostMapping(value = "/getStoreAreaList")
+    @AuthToken(type = "admin")
+    public ResultBean getStoreAreaPage(StoreAreaSearchBean searchBean) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        // 获取门店区域列表
+        List<StoreAreaBean> goodsTypeList = storeAreaManageService.getStoreAreaAllList(searchBean);
+        bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+        bean.setList(goodsTypeList);
+        return bean;
+    }
+
+    /**
+     * 方法名称:获取门店区域列表List
+     * 功能描述:获取门店区域列表List
+     * 参数说明:
+     * 作    者:Lim
+     * 日    期:2021-03-31
+     */
+    @PostMapping(value = "/getStoreAreas")
+    @AuthToken(type = "admin")
+    public ResultBean getStoreAreaList(StoreAreaSearchBean searchBean) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        // 获取门店区域列表
+        List<BuStoreArea> goodsTypeList = storeAreaManageService.getStoreAreaList(searchBean);
+        bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+        bean.setList(goodsTypeList);
+        return bean;
+    }
+
+    /**
+     * 方法名称:保存门店区域信息
+     * 功能描述:保存门店区域信息
+     * 参数说明:goodsTypeId:商品类型Id
+     * 作    者:Lim
+     * 日    期:2021-04-01
+     */
+    @PostMapping(value = "/saveStoreArea")
+    @AuthToken(type = "admin")
+    public ResultBean saveGoodsType(BuStoreArea storeArea){
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        // 验证参数
+        if (storeArea == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            if (storeArea.getStoreAreaId() != null) {
+                // 获取原商品分类实体
+                BuStoreArea storeAreaById = storeAreaManageService.getStoreAreaById(storeArea.getStoreAreaId());
+                //goodsTypeOld.setGoodsTypeCode(goodsType.getGoodsTypeCode());
+                storeAreaById.setStoreAreaName(storeArea.getStoreAreaName());
+                storeAreaById.setStatus(storeArea.getStatus());
+
+                // 执行编辑操作
+                storeAreaManageService.update(storeAreaById);
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功!");
+
+            } else {
+                storeArea.setCreateDate(DateUtil.getSqlToday());
+                // 执行保存操作
+                storeAreaManageService.save(storeArea);
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("添加成功!");
+
+            }
+        }
+        return bean;
+    }
+
+    /**
+     * 方法名称:删除商品分类
+     * 功能描述:删除商品分类
+     * 参数说明:goodsTypeId:商品类型Id
+     * 作	 者:Lim
+     * 日	 期:2021-04-03
+     */
+    @PostMapping(value = "/deleteStoreArea")
+    @AuthToken(type = "admin")
+    public ResultBean deleteStoreArea(Long storeAreaId) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (storeAreaId == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的门店区域!");
+        } else {
+        	if (storeAreaManageService.inUseStoreAreaCode(storeAreaId)) {
+        		bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                bean.getRtnBean().setRtnMsg("该区域已有店铺,不能删除!");
+        	} else {
+                storeAreaManageService.deleteStoreAreaById(storeAreaId);
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("删除成功!");
+        	}
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:获取商品分类实体
+     * 功能描述:跳转到编辑或添加商品分类页面、跳转到设置商品分类图片页面
+     * 参数说明:goodsTypeId:商品类型Id
+     * 作    者:Lim
+     * 日    期:2021-03-31
+     */
+    @PostMapping(value = "/getStoreArea")
+    @AuthToken(type = "admin")
+    public ResultBean getStoreArea(Long storeAreaId) {
+        // 定义返回值
+        ResultBean bean = new ResultBean();
+        if (storeAreaId == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            StoreAreaSearchBean searchBean = new StoreAreaSearchBean();
+            searchBean.setStoreAreaId(storeAreaId);
+
+            //获取商品分类实体
+            BuStoreArea storeArea = storeAreaManageService.getStoreArea(searchBean);
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.setObj(storeArea);
+        }
+        return bean;
+    }
+}

+ 254 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/store/StoreManageController.java

@@ -0,0 +1,254 @@
+package com.sapit.client.app.manage.controller.store;
+
+import com.sapit.client.app.manage.service.store.StoreManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.store.BuStore;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.store.StoreSearchBean;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @description: 门店管理
+ * @author: liucl
+ * @date: 2023/5/15 11:04
+ */
+@RestController
+@RequestMapping(value = "storeManage", produces = "application/json")
+public class StoreManageController {
+
+    @Autowired
+    private StoreManageService storeManageService;
+
+    /**
+     * 方法名称:分页获取门店列表带分页
+     * 功能描述:分页获取门店列表
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-15
+     */
+    @PostMapping("/getStorePage")
+    @AuthToken(type = "admin")
+    public ResultBean getStorePage(int pageSize, int currentPage, StoreSearchBean searchBean) {
+        ResultBean bean = new ResultBean();
+
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+        List<BuStore> areas = storeManageService.getStorePage(pageControlData,searchBean);
+
+        bean.setList(areas);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:门店增加/编辑保存
+     * 功能描述:门店增加/编辑保存
+     * 作    者:Liucl
+     * 时    间:2023-05-15
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuStore store,
+                             @RequestParam(value = "file1", required = false) MultipartFile file1,
+                             @RequestParam(value = "file2", required = false) MultipartFile file2,
+                             @RequestParam(value = "file3", required = false) MultipartFile file3,
+                             HttpServletRequest request) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (store == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+           return storeManageService.updateStore(store,file1,file2,file3);
+        }
+
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:分页获取门店列表
+     * 功能描述:分页获取门店列表
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-15
+     */
+    @PostMapping("/getStoreList")
+    @AuthToken(type = "admin")
+    public ResultBean getStoreList(StoreSearchBean searchBean) {
+        ResultBean bean = new ResultBean();
+
+        List<BuStore> stores = storeManageService.getStoreList(searchBean);
+
+        bean.setList(stores);
+        return bean;
+    }
+
+    /**
+     * 方法名称:分页获取门店列表带分页
+     * 功能描述:分页获取门店列表
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-15
+     */
+    @PostMapping("/getNotIndexStore")
+    @AuthToken(type = "admin")
+    public ResultBean getNotIndexStore(int pageSize, int currentPage, StoreSearchBean searchBean) {
+        ResultBean bean = new ResultBean();
+
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+        List<BuStore> areas = storeManageService.getNotIndexStore(pageControlData,searchBean);
+
+        bean.setList(areas);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+    /**
+     * 方法名称:分页获取门店列表带分页
+     * 功能描述:分页获取门店列表
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-15
+     */
+    @PostMapping("/getStoreSort")
+    @AuthToken(type = "admin")
+    public ResultBean getStoreSort(int pageSize, int currentPage, StoreSearchBean searchBean) {
+        ResultBean bean = new ResultBean();
+
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+        List<BuStore> areas = storeManageService.getStoreSort(pageControlData,searchBean);
+
+        bean.setList(areas);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+    /**
+     * 方法名称:更新公告状态
+     * 功能描述:更新公告状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/changeSort")
+    @AuthToken(type = "admin")
+    public ResultBean changeSort(Long storeId, Long sortWeight) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (storeId == null || sortWeight == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            BuStore storeById = storeManageService.getStoreById(storeId);
+            Long weight = storeById.getSortWeight();
+            storeById.setSortWeight(sortWeight);
+            storeById.setOrderValue(storeById.getOrderValue()-weight+sortWeight);
+            if (storeManageService.update(storeById)) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功!");
+            } else {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该角色不存在!");
+            }
+        }
+
+        return bean;
+    }
+
+    /**
+     * 方法名称:更新展示状态
+     * 功能描述:更新展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    @PostMapping(value = "/changeStatus")
+    @AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+
+        if (id == null || status == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 更新展示状态
+            if (storeManageService.changeStatus(id, status)) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                bean.getRtnBean().setRtnMsg("更新成功!");
+            } else {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("该角色不存在!");
+            }
+        }
+
+        return bean;
+    }
+
+    /**
+     * 方法名称:批量 冻结/解冻
+     * 功能描述:批量 冻结/解冻
+     * 参数说明:
+     * 作    者:Yangyk
+     * 日    期:2023-08-07
+     */
+    @PostMapping(value = "/frozenBatch")
+    @AuthToken(type = "admin")
+    public ResultBean frozenBatch(Long status, String storeIds) {
+    	ResultBean bean = new ResultBean();
+
+    	if (status == null || StringUtils.isBlank(storeIds)) {
+    		bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+    	} else {
+    		storeManageService.updateStoreStatusBatch(status, storeIds);
+    	}
+
+    	return bean;
+    }
+
+    /**
+     * 方法名称:批量 暂停/营业
+     * 功能描述:批量 暂停/营业
+     * 参数说明:
+     * 作    者:Yangyk
+     * 日    期:2023-08-07
+     */
+    @PostMapping(value = "/pauseBatch")
+    @AuthToken(type = "admin")
+    public ResultBean pauseBatch(Long status, String storeIds) {
+    	ResultBean bean = new ResultBean();
+
+    	if (status == null || StringUtils.isBlank(storeIds)) {
+    		bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+    	} else {
+    		storeManageService.updateStoreBusinessStatusBatch(status, storeIds);
+    	}
+
+    	return bean;
+    }
+
+
+}

+ 218 - 0
client-app/src/main/java/com/sapit/client/app/manage/controller/store/StoreUserManageController.java

@@ -0,0 +1,218 @@
+package com.sapit.client.app.manage.controller.store;
+
+import com.sapit.client.app.manage.service.store.StoreManageService;
+import com.sapit.client.app.manage.service.store.StoreUserManageService;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.store.BuStoreUser;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.store.StoreUserSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.MD5;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @description: 门店管理
+ * @author: liucl
+ * @date: 2023/5/15 11:04
+ */
+@RestController
+@RequestMapping(value = "storeUserManage", produces = "application/json")
+public class StoreUserManageController {
+
+    @Autowired
+    private StoreUserManageService storeUserManageService;
+    @Autowired
+    private StoreManageService storeManageService;
+
+
+    /**
+     * 方法名称:分页获取门店员工列表分页
+     * 功能描述:分页获取门店员工列表分页
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-15
+     */
+//    @PostMapping("/getStoreUserPage")
+//    @AuthToken(type = "admin")
+//    public ResultBean getStoreUserPage(int pageSize, int currentPage,StoreUserSearchBean searchBean) {
+//        ResultBean bean = new ResultBean();
+//
+//        PageControlData pageControlData = new PageControlData();
+//        pageControlData.setPageSize(pageSize);
+//        pageControlData.setCurrentPage(currentPage);
+//
+//        List<BuStoreUser> storeUsers = storeUserManageService.getStoreUserPage(pageControlData,searchBean);
+//
+//        bean.setPage(pageControlData);
+//        bean.setList(storeUsers);
+//        return bean;
+//    }
+    /**
+     * 方法名称:分页查询门店员工列表
+     * 返回值:ResultBean
+     */
+    @PostMapping("/getStoreUserPage")
+    public ResultBean PageQuery(int pageSize, int currentPage, StoreUserSearchBean searchBean) {
+        ResultBean bean = new ResultBean();
+
+        if (pageSize <= 0 || pageSize > 100) {
+            pageSize = 20;
+        }
+        if (currentPage <= 0) {
+            currentPage = 1;
+        }
+
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        List<BuStoreUser> storeUsers = storeUserManageService.getStoreUserPage(pageControlData, searchBean);
+
+        bean.setPage(pageControlData);
+        bean.setList(storeUsers);
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:密码重置
+     * 功能描述: 密码重置
+     * 作    者:Liucl
+     * 日    期:2023-05-19
+     */
+    @PostMapping(value = "/resetPassword")
+    @AuthToken(type = "admin")
+    public ResultBean resetPassword (Long id) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        // 参数验证
+        if (id == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg(ReturnCode.getName(ReturnCode.PARAM_WRONG));
+            return bean;
+        }
+        // 获取员工信息
+        BuStoreUser user = storeUserManageService.getUserById(id);
+
+        if (user == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+            bean.getRtnBean().setRtnMsg("用户不存在,请确认要初始化密码的用户!");
+        } else {
+            user.setPassword(MD5.encrypt(user.getTel()));
+            // 更新
+            storeUserManageService.update(user);
+            bean.getRtnBean().setRtnMsg("重置成功!");
+        }
+        return bean;
+    }
+
+    /**
+     * 方法名称:店员增加
+     * 功能描述:店员增加
+     * 作    者:Liucl
+     * 日    期:2023-05-19
+     */
+    @PostMapping(value = "/save")
+    @AuthToken(type = "admin")
+    public ResultBean save(BuStoreUser user) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (user == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 新增操作
+            boolean btn = storeManageService.checkStoreUserTel(user.getStoreUserId(), user.getTel());
+            if (!btn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("手机号已被使用,请更换手机号");
+                return bean;
+            }
+            user.setCreateDate(DateUtil.getSqlToday());
+            user.setPassword(MD5.encrypt(user.getPassword()));
+            user.setIsManage(0L);
+            boolean rtn = storeUserManageService.save(user);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+            }else {
+                bean.getRtnBean().setRtnMsg("新增成功");
+            }
+        }
+
+        return bean;
+    }
+
+    /**
+     * 方法名称:店员增加
+     * 功能描述:店员增加
+     * 作    者:Liucl
+     * 日    期:2023-05-19
+     */
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuStoreUser user) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (user == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            // 校验手机号
+            boolean btn = storeManageService.checkStoreUserTel(user.getStoreUserId(), user.getTel());
+            if (!btn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("手机号已被使用,请更换手机号");
+                return bean;
+            }
+            BuStoreUser userById = storeUserManageService.getUserById(user.getStoreUserId());
+            userById.setUserName(user.getUserName());
+            userById.setTel(user.getTel());
+            // 修改操作
+            boolean rtn = storeUserManageService.update(userById);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("保存失败,请重新尝试!");
+            }else {
+                bean.getRtnBean().setRtnMsg("编辑成功");
+            }
+        }
+        return bean;
+    }
+
+
+    /**
+     * 方法名称:删除员工
+     * 功能描述:删除员工
+     * 参数说明:goodsTypeId:商品类型Id
+     * 作	 者:Liucl
+     * 日	 期:2023-08-08
+     */
+    @PostMapping(value = "/deleteStoreUser")
+    @AuthToken(type = "admin")
+    public ResultBean deleteStoreArea(Long storeUserId) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (storeUserId == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("请指定要删除的员工!");
+        } else {
+
+            storeUserManageService.deleteStoreUserById(storeUserId);
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("删除成功!");
+
+        }
+        return bean;
+    }
+
+
+}

+ 46 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/goods/EvaluateManageService.java

@@ -0,0 +1,46 @@
+package com.sapit.client.app.manage.service.goods;
+
+import com.sapit.client.app.persistence.goods.EvaluateDao;
+import com.sapit.common.entity.goods.BuEvaluate;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.goods.BuEvaluateSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @description: 评价管理
+ * @author: liucl
+ * @date: 2023/5/16 19:12
+ */
+@Service
+@Transactional
+public class EvaluateManageService {
+    @Autowired
+    private EvaluateDao evaluateDao;
+
+    /**
+     * 方法名称:根据检索条件查询商品评价表
+     * 功能描述:根据检索条件查询商品评价表
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-08
+     */
+    public List<BuEvaluate> getEvaluateList(PageControlData pageControlData, BuEvaluateSearchBean searchBean) {
+        return evaluateDao.getEvaluateList(pageControlData, searchBean);
+    }
+
+    /**
+     * 方法名称:根据id删除商品评价
+     * 功能描述:根据id删除商品评价
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-08
+     */
+    public void deleteById(Long id) {
+        evaluateDao.deleteEvaluateById(id);
+    }
+}

+ 105 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/goods/GoodsManageService.java

@@ -0,0 +1,105 @@
+package com.sapit.client.app.manage.service.goods;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.goods.GoodsDao;
+import com.sapit.common.entity.goods.BuGoods;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.goods.BuGoodsSearchBean;
+
+/**
+ * 类名称:商品管理服务类
+ * 类描述:处理商品管理的各种事务
+ * 作  者:Lim
+ * 时  间:2020-03-31
+ */
+@Service
+@Transactional
+public class GoodsManageService {
+	
+	@Autowired
+	private GoodsDao goodsDao;
+
+	
+	/**
+	 * 方法名称:根据检索条件查询商品管理表
+	 * 功能描述:根据条件查询商品管理表
+	 * 参数说明:
+	 * 作    者:Lim
+     * 日    期:2021-04-01
+	 */
+	public List<BuGoods> getGoodsList(PageControlData pageControlData, BuGoodsSearchBean searchBean) {
+		return goodsDao.getGoodsList(pageControlData, searchBean);
+	}
+
+	/**
+	 * 方法名称:根据检索条件查询商品管理表
+	 * 功能描述:根据检索条件查询商品管理表
+	 * 参数说明:
+	 * 作    者:vic
+     * 日    期:2023-06-19
+	 */
+	public List<BuGoods> getGoodsList(BuGoodsSearchBean searchBean) {
+		return goodsDao.getGoodsList(searchBean);
+	}
+	
+	/**
+	 * 方法名称:获取店铺的特价商品信息
+	 * 功能描述:获取店铺的特价商品信息
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-06-19
+	 */
+	public List<BuGoods> getSpecialGoodsListByStoreId(Long storeId) {
+		return goodsDao.getSpecialGoodsListByStoreId(storeId);
+	}
+
+	/**
+	 * 方法名称:根据检索条件查询商品表实体
+	 * 功能描述:根据id条件查询商品表获取一条数据
+	 * 参数说明:
+	 * 作    者:Lim
+     * 日    期:2021-04-01
+	 */
+	public BuGoods getGoods(BuGoodsSearchBean searchBean) {
+		return (BuGoods) goodsDao.getObject(searchBean);
+	}
+	
+	/**
+	 * 方法名称:更新商品信息
+	 * 功能描述:更新商品信息
+	 * 参数说明:
+	 * 作    者:Lim
+     * 日    期:2021-04-01
+	 */
+	public boolean update(BuGoods goods) {
+		return goodsDao.update(goods);		
+	}
+	
+	/**
+	 * 方法名称:新增商品信息
+	 * 功能描述:新增商品信息
+	 * 参数说明:
+	 * 作    者:Lim
+     * 日    期:2021-04-01
+	 */
+	public boolean save(BuGoods goods) {
+		return goodsDao.save(goods);		
+	}
+	
+	/**
+	 * 方法名称:获取店铺的单型号商品
+	 * 功能描述:获取店铺的单型号商品
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-07-06
+	 */
+	public List<BuGoods> getStoreSingleGoods(Long storeId) {
+		return goodsDao.getStoreSingleGoods(storeId);
+	}
+	
+}

+ 36 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/goods/GoodsStatisticsService.java

@@ -0,0 +1,36 @@
+package com.sapit.client.app.manage.service.goods;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.goods.GoodsStatisticsDao;
+import com.sapit.common.bean.goods.BuGoodsStatisticsBean;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.goods.BuGoodsStatisticsSearchBean;
+
+/**
+ * 商品统计Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class GoodsStatisticsService {
+
+	@Autowired
+	private GoodsStatisticsDao goodsStatisticsDao;
+	
+	/**
+	 * 方法名称:商品统计列表
+	 * 功能描述:商品统计列表
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public List<BuGoodsStatisticsBean> page(PageControlData pageControlData, BuGoodsStatisticsSearchBean searchBean) {
+		return goodsStatisticsDao.page(pageControlData, searchBean);
+	}
+}

+ 47 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/member/ComplaintService.java

@@ -0,0 +1,47 @@
+package com.sapit.client.app.manage.service.member;
+
+import com.sapit.client.app.persistence.member.ComplaintDao;
+import com.sapit.common.bean.member.BuComplaintBean;
+import com.sapit.common.entity.member.BuComplaint;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.member.BuComplaintSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 
+ * @author Administrator
+ *
+ */
+@Service
+@Transactional
+public class ComplaintService {
+
+	@Autowired
+	private ComplaintDao complaintDao;
+	
+	/**
+	 * 方法名称:获取投诉列表
+	 * 功能描述:获取投诉列表
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public List<BuComplaintBean> getComplaintList(PageControlData pageControlData, BuComplaintSearchBean searchBean) {
+		return complaintDao.getComplaintList(pageControlData, searchBean);
+	}
+	
+	/**
+	 * 方法名称:获取投诉列表
+	 * 功能描述:获取投诉列表
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public void reply(BuComplaint complaint) {
+		complaintDao.reply(complaint);
+	}
+}

+ 29 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/member/MemberManageService.java

@@ -0,0 +1,29 @@
+package com.sapit.client.app.manage.service.member;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.member.MemberDao;
+import com.sapit.common.entity.member.BuMember;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.member.BuMemberSearchBean;
+
+/**
+ * 
+ * @author Administrator
+ *
+ */
+@Service
+@Transactional
+public class MemberManageService {
+
+	@Autowired
+	private MemberDao memberDao;
+	
+	public List<BuMember> getMemberList(PageControlData pageControlData, BuMemberSearchBean searchBean) {
+		return memberDao.getMemberList(pageControlData, searchBean);
+	}
+}

+ 97 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/AdvertiseManageService.java

@@ -0,0 +1,97 @@
+package com.sapit.client.app.manage.service.operate;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.operate.AdvertiseDao;
+import com.sapit.common.bean.operate.AdvertiseSumBean;
+import com.sapit.common.entity.operate.BuAdvertise;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.AdvertiseSearchBean;
+
+/**
+ * 类名称:广告费管理service 
+ * 类描述:广告费管理service
+ * 
+ * 作  者:Vic 
+ * 时  间:2023-12-07
+ */
+@Service
+@Transactional
+public class AdvertiseManageService {
+	
+    @Autowired
+    private AdvertiseDao advertiseDao;
+
+    /**
+     * 方法名称: 查询广告费列表(带分页)
+     * 功能描述: 查询广告费列表(带分页)
+     *
+     * 作   者: Vic
+     * 日   期: 2023/17/07
+     **/
+    public List<BuAdvertise> getAdvertisePage(PageControlData pageControlData, AdvertiseSearchBean searchBean){
+        return advertiseDao.getAdvertisePage(pageControlData,searchBean);
+    }
+
+
+    /**
+     * 方法名称:广告费新增
+     * 功能描述:
+     * 
+     * 作   者: Vic
+     * 日   期: 2023/17/07
+     */
+    public boolean save(BuAdvertise advertise) {
+        return advertiseDao.save(advertise);
+    }
+
+    /**
+     * 方法名称:更新广告费
+     * 功能描述:更新广告费
+     *
+     * 作   者: Vic
+     * 日   期: 2023/17/07
+     */
+    public boolean update(BuAdvertise advertise) {
+        return advertiseDao.update(advertise);
+    }
+
+
+    /**
+     * 方法名称:根据Id获取广告费实体
+     * 功能描述:根据Id获取广告费实体
+     *
+     * 作   者: Vic
+     * 日   期: 2023/17/07
+     */
+    public BuAdvertise getAdvertiseById(Long id) {
+        return advertiseDao.getAdvertiseById(id);
+    }
+
+    /**
+     * 方法名称:广告费删除
+     * 功能描述:根据Id删除广告费
+     * 参数说明:
+     * 作   者: Vic
+     * 日   期: 2023/17/07
+     */
+    public void deleteAdvertiseById(Long id) {
+        advertiseDao.deleteById(id);
+    }
+    
+    /**
+     * 方法名称:合计广告费
+     * 功能描述:合计广告费
+     * 参数说明:
+     * 作	 者:Vic
+     * 日	 期:2023-12-07
+     */
+    public List<AdvertiseSumBean> sumAdvertiseFee(AdvertiseSearchBean searchBean) {
+        return advertiseDao.sumAdvertiseFee(searchBean);
+    }
+
+}

+ 107 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/CarouselManageService.java

@@ -0,0 +1,107 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.CarouselDao;
+import com.sapit.common.entity.operate.BuCarousel;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.BuCarouselSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class CarouselManageService {
+    @Autowired
+    private CarouselDao carouselDao;
+
+    /**
+     * 方法名称: 查询轮播图列表(带分页)
+     * 功能描述: 查询轮播图列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+    public List<BuCarousel> getCarouselPage(PageControlData pageControlData, BuCarouselSearchBean searchBean){
+        return carouselDao.getCarouselPage(pageControlData,searchBean);
+    }
+
+
+    /**
+     * 方法名称:轮播图信息新增
+     * 功能描述:根据条件新增轮播图的信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-25
+     */
+    public boolean save(BuCarousel carousel) {
+        return carouselDao.save(carousel);
+    }
+
+    /**
+     * 方法名称:更新轮播图信息
+     * 功能描述:更新轮播图信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-25
+     */
+    public boolean update(BuCarousel carousel) {
+        return carouselDao.update(carousel);
+    }
+
+
+    /**
+     * 方法名称:根据Id获取轮播图实体
+     * 功能描述:根据Id获取轮播图实体
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-24
+     */
+    public BuCarousel getCarouselById(Long iconId) {
+        return carouselDao.getCarouselById(iconId);
+    }
+
+
+    /**
+     * 方法名称:更新轮播图状态
+     * 功能描述:更新轮播图状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-24
+     */
+    public boolean changeStatus(Long carouselId, Long status) {
+        return carouselDao.changeStatus(carouselId, status);
+    }
+
+
+    /**
+     * 方法名称:轮播图删除
+     * 功能描述:根据Id删除轮播图
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    public void deleteCarouselById(Long id) {
+        carouselDao.deleteById(id);
+
+    }
+
+    /**
+     * 方法名称:验证同一家店是否已经存在轮播图
+     * 功能描述:验证同一家店是否已经存在轮播图
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-07-10
+     */
+    public boolean checkStoreInCarousel(Long id, Long carouselId) {
+        return carouselDao.checkStoreInCarousel(id, carouselId);
+    }
+}

+ 118 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/DineAndDashManageService.java

@@ -0,0 +1,118 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.DineAndDashDao;
+import com.sapit.common.entity.operate.BuDineAndDash;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.BuDineAndDashSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class DineAndDashManageService {
+    @Autowired
+    private DineAndDashDao dineAndDashDao;
+
+    /**
+     * 方法名称: 查询轮播图列表(带分页)
+     * 功能描述: 查询轮播图列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+    public List<BuDineAndDash> getDineAndDashPage(PageControlData pageControlData, BuDineAndDashSearchBean searchBean){
+        return dineAndDashDao.getDineAndDashPage(pageControlData,searchBean);
+    }
+
+
+    /**
+     * 方法名称:新增霸王餐活动
+     * 功能描述:根据条件新增霸王餐活动
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-25
+     */
+    public boolean save(BuDineAndDash dineAndDash) {
+        return dineAndDashDao.save(dineAndDash);
+    }
+
+    /**
+     * 方法名称:更新霸王餐活动
+     * 功能描述:更新霸王餐活动
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-25
+     */
+    public boolean update(BuDineAndDash dineAndDash) {
+        return dineAndDashDao.update(dineAndDash);
+    }
+
+
+    /**
+     * 方法名称:根据Id获取霸王餐活动
+     * 功能描述:根据Id获取霸王餐活动
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-24
+     */
+    public BuDineAndDash getDineAndDashById(Long id) {
+        return dineAndDashDao.getDineAndDashById(id);
+    }
+
+
+    /**
+     * 方法名称:更新霸王餐活动状态
+     * 功能描述:更新霸王餐活动状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-24
+     */
+    public boolean changeStatus(Long id, Long status) {
+        return dineAndDashDao.changeStatus(id, status);
+    }
+
+    /**
+     * 方法名称:验证是否有生效中的活动
+     * 功能描述:更新霸王餐活动状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-24
+     */
+    public boolean isHaveEffect(Long id) {
+        return dineAndDashDao.isHaveEffect(id);
+    }
+
+
+    /**
+     * 方法名称:霸王餐删除
+     * 功能描述:根据Id删除霸王餐
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    public void deleteById(Long id) {
+        dineAndDashDao.deleteById(id);
+
+    }
+
+    /**
+     * 方法名称:校验开始时间结束时间是否有重合的
+     * 功能描述:校验开始时间结束时间是否有重合的
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-06-05
+     */
+    public Boolean checkTime(Long id,String startDate, String endDate) {
+       return dineAndDashDao.checkTime(id ,startDate,endDate);
+    }
+}

+ 75 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/DineAndDashStoreManageService.java

@@ -0,0 +1,75 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.DineAndDashStoreDao;
+import com.sapit.common.entity.operate.BuDineAndDashStore;
+import com.sapit.common.entity.store.BuStore;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.BuDineAndDashStoreSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class DineAndDashStoreManageService {
+    @Autowired
+    private DineAndDashStoreDao dineAndDashStoreDao;
+
+    /**
+     * 方法名称: 根据霸王餐ID查询店铺列表(带分页)
+     * 功能描述: 根据霸王餐ID查询店铺列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/6/02 13:40
+     * @return:
+     **/
+    public List<BuDineAndDashStore> getDineAndDashStorePage(PageControlData pageControlData, BuDineAndDashStoreSearchBean searchBean){
+        return dineAndDashStoreDao.getDineAndDashStorePage(pageControlData,searchBean);
+    }
+
+    /**
+     * 方法名称: 根据霸王餐ID查询没有参加店铺列表
+     * 功能描述: 根据霸王餐ID查询没有参加店铺列表
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/6/28 13:40
+     * @return:
+     **/
+    public List<BuStore> getNoJoinStoreList(Long id){
+        return dineAndDashStoreDao.getNoJoinStoreList(id);
+    }
+
+
+    /**
+     * 方法名称:店铺参加活动
+     * 功能描述:店铺参加活动
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-06-28
+     */
+    public boolean save(BuDineAndDashStore store) {
+        return dineAndDashStoreDao.save(store);
+    }
+
+    /**
+     * 方法名称:霸王餐店铺删除
+     * 功能描述:霸王餐店铺删除
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-06-29
+     */
+    public void deleteDineAndDashStoreById(Long id) {
+        dineAndDashStoreDao.deleteById(id);
+
+    }
+
+}

+ 96 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/IconManageService.java

@@ -0,0 +1,96 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.IconDao;
+import com.sapit.common.entity.operate.BuIcon;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.BuIconSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class IconManageService {
+    @Autowired
+    private IconDao iconDao;
+
+    /**
+     * 方法名称: 查询图标列表(带分页)
+     * 功能描述: 查询图标列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+    public List<BuIcon> getIconPage(PageControlData pageControlData, BuIconSearchBean searchBean){
+        return iconDao.getIconPage(pageControlData,searchBean);
+    }
+
+
+    /**
+     * 方法名称:图标信息新增
+     * 功能描述:根据条件新增图标的信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-25
+     */
+    public boolean save(BuIcon icon) {
+        return iconDao.save(icon);
+    }
+
+    /**
+     * 方法名称:更新图标信息
+     * 功能描述:更新图标信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-25
+     */
+    public boolean update(BuIcon icon) {
+        return iconDao.update(icon);
+    }
+
+
+    /**
+     * 方法名称:根据Id获取图标实体
+     * 功能描述:根据Id获取图标实体
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-24
+     */
+    public BuIcon getIconById(Long iconId) {
+        return iconDao.getIconById(iconId);
+    }
+
+
+    /**
+     * 方法名称:更新图标状态
+     * 功能描述:更新图标状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-24
+     */
+    public boolean changeStatus(Long specialFoodId, Long indexShow) {
+        return iconDao.changeStatus(specialFoodId, indexShow);
+    }
+
+
+    /**
+     * 方法名称:图标删除
+     * 功能描述:根据Id删除图标
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    public void deleteIconById(Long id) {
+        iconDao.deleteById(id);
+
+    }
+}

+ 61 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/IndexStoreGoodsManageService.java

@@ -0,0 +1,61 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.IndexStoreGoodsDao;
+import com.sapit.common.entity.operate.BuIndexStoreGoods;
+import com.sapit.common.search.operate.BuIndexStoreGoodsSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class IndexStoreGoodsManageService {
+
+    @Autowired
+    private IndexStoreGoodsDao indexStoreGoodsDao;
+
+    /**
+     * 方法名称:特价菜删除
+     * 功能描述:根据Id删除特价菜
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    public void deleteByIndexStoreId(Long id) {
+        indexStoreGoodsDao.deleteByIndexStoreId(id);
+
+    }
+
+    /**
+     * 方法名称:首页推荐店铺商品新增
+     * 功能描述:首页推荐店铺商品新增
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public boolean save(BuIndexStoreGoods goods) {
+        return indexStoreGoodsDao.save(goods);
+    }
+
+    public List<BuIndexStoreGoods> getStoreGoods(BuIndexStoreGoodsSearchBean searchBean) {
+        return indexStoreGoodsDao.getStoreGoods(searchBean);
+    }
+    
+    /**
+     * 方法名称:根据推荐店铺ids查询首页推荐店铺商品
+     * 功能描述:根据推荐店铺ids查询首页推荐店铺商品
+     * 参数说明:
+     * 作    者:Yangyk
+     * 日    期:2023-05-24
+     */
+    public List<BuIndexStoreGoods> getStoreGoodsByIndexStoreIds(List<String> indexStoreIds) {
+        return indexStoreGoodsDao.getStoreGoodsByIndexStoreIds(indexStoreIds);
+    }
+}

+ 121 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/IndexStoreManageService.java

@@ -0,0 +1,121 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.IndexStoreDao;
+import com.sapit.common.entity.operate.BuIndexStore;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.BuIndexStoreSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class IndexStoreManageService {
+    @Autowired
+    private IndexStoreDao indexStoreDao;
+
+    /**
+     * 方法名称: 查询首页推荐店铺列表(带分页)
+     * 功能描述: 查询首页推荐店铺列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+    public List<BuIndexStore> getIndexStoreList(PageControlData pageControlData, BuIndexStoreSearchBean searchBean){
+        return indexStoreDao.getIndexStoreList(pageControlData,searchBean);
+    }
+
+
+    /**
+     * 方法名称:门店信息新增
+     * 功能描述:根据条件新增门店的信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public boolean save(BuIndexStore indexStore) {
+        return indexStoreDao.save(indexStore);
+    }
+
+    /**
+     * 方法名称:更新门店信息
+     * 功能描述:更新门店信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public boolean update(BuIndexStore indexStore) {
+        return indexStoreDao.update(indexStore);
+    }
+
+
+    /**
+     * 方法名称:根据Id获取用户实体
+     * 功能描述:根据Id获取用户实体
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-22
+     */
+    public BuIndexStore getBuIndexStoreById(Long indexStoreId) {
+        return indexStoreDao.getIndexStoreById(indexStoreId);
+    }
+
+
+    /**
+     * 方法名称:
+     * 功能描述:
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/24 15:37
+     * @return:
+     **/
+    public Boolean getIndexShowNum(Long indexStoreId) {
+        return indexStoreDao.checkIndexShowNum(indexStoreId);
+    }
+
+
+    /**
+     * 方法名称:更新展示状态
+     * 功能描述:更新展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    public boolean changeIndexShow(Long specialFoodId, Long indexShow) {
+        return indexStoreDao.changeIndexShow(specialFoodId, indexShow);
+    }
+
+
+    /**
+     * 方法名称:特价菜删除
+     * 功能描述:根据Id删除特价菜
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    public void deleteIndexStoreGoods(Long id) {
+        indexStoreDao.deleteById(id);
+
+    }
+
+    /**
+     * 方法名称:更新展示状态
+     * 功能描述:更新展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    public boolean changeStatus(Long id, Long status) {
+        return indexStoreDao.changeStatus(id, status);
+    }
+}

+ 108 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/NoticeManageService.java

@@ -0,0 +1,108 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.NoticeDao;
+import com.sapit.common.entity.operate.BuNotice;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.BuNoticeSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class NoticeManageService {
+    @Autowired
+    private NoticeDao noticeDao;
+
+    /**
+     * 方法名称: 查询公告列表(带分页)
+     * 功能描述: 查询公告列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+    public List<BuNotice> getNoticePage(PageControlData pageControlData, BuNoticeSearchBean searchBean){
+        return noticeDao.getNoticePage(pageControlData,searchBean);
+    }
+
+
+    /**
+     * 方法名称:公告信息新增
+     * 功能描述:根据条件新增公告的信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-25
+     */
+    public boolean save(BuNotice notice) {
+        return noticeDao.save(notice);
+    }
+
+    /**
+     * 方法名称:更新公告信息
+     * 功能描述:更新公告信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-25
+     */
+    public boolean update(BuNotice notice) {
+        return noticeDao.update(notice);
+    }
+
+
+    /**
+     * 方法名称:根据Id获取公告实体
+     * 功能描述:根据Id获取公告实体
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-24
+     */
+    public BuNotice getNoticeById(Long iconId) {
+        return noticeDao.getNoticeById(iconId);
+    }
+
+
+    /**
+     * 方法名称:更新公告状态
+     * 功能描述:更新公告状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-24
+     */
+    public boolean changeStatus(Long carouselId, Long status) {
+        return noticeDao.changeStatus(carouselId, status);
+    }
+
+
+    /**
+     * 方法名称:公告删除
+     * 功能描述:根据Id删除公告
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-25
+     */
+    public void deleteNoticeById(Long id) {
+        noticeDao.deleteById(id);
+
+    }
+
+    /**
+     * 方法名称:验证是否有相同的类型启用中的公告
+     * 功能描述:验证是否有相同的类型启用中的公告
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-07-11
+     */
+    public boolean checkUseNotice(Long type, Long noticeId) {
+        return noticeDao.checkUseNotice(type, noticeId);
+    }
+
+}

+ 39 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/RaffleRecordManageService.java

@@ -0,0 +1,39 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.RaffleRecordDao;
+import com.sapit.common.entity.operate.BuRaffleRecord;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.BuRaffleRecordSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class RaffleRecordManageService {
+    @Autowired
+    private RaffleRecordDao raffleRecordDao;
+
+    /**
+     * 方法名称: 根据活动ID查询兑奖记录(带分页)
+     * 功能描述: 根据活动ID查询兑奖记录(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+    public List<BuRaffleRecord> getRaffleRecordPage(PageControlData pageControlData, BuRaffleRecordSearchBean searchBean){
+        return raffleRecordDao.getRaffleRecordPage(pageControlData,searchBean);
+    }
+
+
+
+}

+ 108 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/operate/SpecialsManageService.java

@@ -0,0 +1,108 @@
+package com.sapit.client.app.manage.service.operate;
+
+import com.sapit.client.app.persistence.operate.SpecialFoodDao;
+import com.sapit.common.entity.operate.BuSpecialFood;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.operate.BuSpecialFoodSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/22 10:40
+ */
+@Service
+@Transactional
+public class SpecialsManageService {
+    @Autowired
+    private SpecialFoodDao specialFoodDao;
+
+
+
+    /**
+     * 方法名称: 查询特价菜列表(带分页)
+     * 功能描述:  查询特价菜列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+    public List<BuSpecialFood> getSpecialFoodList(PageControlData pageControlData, BuSpecialFoodSearchBean searchBean){
+        return specialFoodDao.getSpecialFoodList(pageControlData,searchBean);
+    }
+
+    /**
+     * 方法名称:门店信息新增
+     * 功能描述:根据条件新增门店的信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public boolean save(BuSpecialFood specialFood) {
+        return specialFoodDao.save(specialFood);
+    }
+
+    /**
+     * 方法名称:更新门店信息
+     * 功能描述:更新门店信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public boolean update(BuSpecialFood specialFood) {
+        return specialFoodDao.update(specialFood);
+    }
+
+
+    /**
+     * 方法名称:根据Id获取用户实体
+     * 功能描述:根据Id获取用户实体
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-22
+     */
+    public BuSpecialFood getSpecialFoodById(Long userId) {
+        return specialFoodDao.getSpecialFoodById(userId);
+    }
+
+
+    /**
+     * 方法名称:更新展示状态
+     * 功能描述:更新展示状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    public boolean changeStatus(Long specialFoodId, Long indexShow) {
+        return specialFoodDao.changeStatus(specialFoodId, indexShow);
+    }
+
+
+    /**
+     * 方法名称:特价菜删除
+     * 功能描述:根据Id删除特价菜
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-23
+     */
+    public void deleteSpecialFood(Long id) {
+        specialFoodDao.deleteById(id);
+
+    }
+    
+    /**
+     * 方法名称:验证同一家店是否已经存在特价菜
+     * 功能描述:验证同一家店是否已经存在特价菜
+     * 参数说明:
+     * 作    者:vic
+     * 日    期:2023-06-21
+     */
+    public boolean checkStoreInSpecial(Long id, Long specialId) {
+    	return specialFoodDao.checkStoreInSpecial(id, specialId);
+    }
+}

+ 34 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderDetailService.java

@@ -0,0 +1,34 @@
+package com.sapit.client.app.manage.service.order;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.order.OrderDetailDao;
+import com.sapit.common.entity.order.BuOrderDetail;
+
+/**
+ * 订单详情Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class OrderDetailService {
+
+	@Autowired
+	private OrderDetailDao orderDetailDao;
+	
+	/**
+	 * 方法名称:根据订单id获取详情列表
+	 * 功能描述:根据订单id获取详情列表
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public List<BuOrderDetail> listByOrderId(Long orderId) {
+		return orderDetailDao.listByOrderId(orderId);
+	}
+}

+ 34 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderDetailYearService.java

@@ -0,0 +1,34 @@
+package com.sapit.client.app.manage.service.order;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.order.OrderDetailYearDao;
+import com.sapit.common.entity.order.BuOrderDetail;
+
+/**
+ * 订单详情-学年Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class OrderDetailYearService {
+
+	@Autowired
+	private OrderDetailYearDao orderDetailDao;
+	
+	/**
+	 * 方法名称:根据订单id获取详情列表
+	 * 功能描述:根据订单id获取详情列表
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public List<BuOrderDetail> listByOrderId(Long orderId) {
+		return orderDetailDao.listByOrderId(orderId);
+	}
+}

+ 953 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderManageService.java

@@ -0,0 +1,953 @@
+package com.sapit.client.app.manage.service.order;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.rabbitmq.client.Channel;
+import com.rabbitmq.client.MessageProperties;
+import com.sapit.client.app.manage.service.store.StoreBrowseManageService;
+import com.sapit.client.app.persistence.goods.EvaluateDao;
+import com.sapit.client.app.persistence.member.MemberDao;
+import com.sapit.client.app.persistence.member.NewCustomerDao;
+import com.sapit.client.app.persistence.operate.DineAndDashDao;
+import com.sapit.client.app.persistence.operate.DineAndDashStoreDao;
+import com.sapit.client.app.persistence.operate.RaffleRecordDao;
+import com.sapit.client.app.persistence.order.*;
+import com.sapit.client.app.persistence.setting.PrinterDao;
+import com.sapit.client.app.persistence.setting.WxMsgDao;
+import com.sapit.client.app.persistence.store.StoreDao;
+import com.sapit.client.app.user.service.order.OrderApiService;
+import com.sapit.client.app.user.service.system.AccessTokenManageService;
+import com.sapit.client.app.user.service.system.CommonApiService;
+import com.sapit.common.bean.mobile.SettingBean;
+import com.sapit.common.bean.order.*;
+import com.sapit.common.bean.system.AccessTokenBean;
+import com.sapit.common.bean.system.LoginInfoBean;
+import com.sapit.common.constant.*;
+import com.sapit.common.entity.goods.BuEvaluate;
+import com.sapit.common.entity.member.BuMember;
+import com.sapit.common.entity.operate.BuDineAndDash;
+import com.sapit.common.entity.operate.BuRaffleRecord;
+import com.sapit.common.entity.order.*;
+import com.sapit.common.entity.setting.BuPrinter;
+import com.sapit.common.entity.store.BuStore;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.mq.*;
+import com.sapit.common.search.operate.BuDineAndDashSearchBean;
+import com.sapit.common.search.order.BuOrderDetailSearchBean;
+import com.sapit.common.search.order.BuOrderSearchBean;
+import com.sapit.common.search.order.BuOrderYearSearchBean;
+import com.sapit.common.util.*;
+import com.sapit.common.view.order.BuOrderV;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.amqp.core.ExchangeTypes;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+/**
+ * 订单管理Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class OrderManageService {
+
+    // 日志输出
+    static final Logger log = LoggerFactory.getLogger(OrderManageService.class);
+
+    @Autowired
+    private OrderDao orderDao;
+    @Autowired
+    private OrderDetailDao orderDetailDao;
+    @Autowired
+    private RedisTool redisTool;
+    @Autowired
+    private PrinterDao printerDao;
+    @Autowired
+    private NewCustomerDao newCustomerDao;
+    @Autowired
+    private OrderProgressDao orderProgressDao;
+    @Autowired
+    private EvaluateDao evaluateDao;
+    @Autowired
+    private StoreDao storeDao;
+    @Autowired
+    private DineAndDashDao dineAndDashDao;
+    @Autowired
+    private DineAndDashStoreDao dineAndDashStoreDao;
+    @Autowired
+    private OrderYearDao orderYearDao;
+    @Autowired
+    private RaffleRecordDao raffleRecordDao;
+    @Autowired
+    private RabbitTool rabbitTool;
+    @Autowired
+    private MemberDao memberDao;
+    @Autowired
+    private AccessTokenManageService accessTokenManageService;
+    @Autowired
+    private OrderApiService orderApiService;
+    @Autowired
+    private CommonApiService commonApiService;
+    @Autowired
+    private RefundDao refundDao;
+    @Autowired
+    private StoreBrowseManageService storeBrowseManageService;
+    @Autowired
+    private PayChannelProperties payChannelProperties;
+    //	@Autowired
+//	private RefundFailedService	refundFailedService;
+    @Autowired
+    private WxMsgDao wxMsgDao;
+    @Autowired
+    private OrderPrintCountDao orderPrintCountDao;
+
+    @Bean
+    public String getQueuePrefix() {
+        return "a" + commonApiService.getSysAreaId();
+    }
+
+    /**
+     * 订单支付完成
+     * @param message
+     * @param channel
+     * @throws IOException
+     */
+    @RabbitHandler
+    @RabbitListener(
+            bindings = @QueueBinding(
+                    value = @Queue(value = "#{getQueuePrefix}orderpayqueue", durable = "true"),
+                    exchange = @Exchange(name = "edueposExchange", durable = "true", type = ExchangeTypes.DIRECT),
+                    key = "#{getQueuePrefix}orderpay"))
+    public void onOrderPayed(Message message, Channel channel) throws IOException {
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+
+            OrderPayMQBean json = mapper.readValue(message.getBody(), OrderPayMQBean.class);
+            System.out.println(json.toString());
+
+            // 变更订单状态
+            boolean flag = orderApiService.changeOrderStatusToPayed(json.getOrderCode(), Long.valueOf(json.getPayType()), json.getFee());
+
+            if (!flag) {
+                log.info("订单更新失败 失败订单为:" + json.getOrderCode());
+            }
+
+            // 消息处理回调
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 增加此处处理之后容易产生死循环,此消息会重新放回mq中去执行
+            //channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
+        }
+    }
+
+    /**
+     * 订单完成 处理
+     * @param message
+     * @param channel
+     * @throws IOException
+     */
+    @RabbitHandler
+    @RabbitListener(
+            bindings = @QueueBinding(
+                    value = @Queue(value = "#{getQueuePrefix}orderfinishquene", durable = "true"),
+                    exchange = @Exchange(name = "edueposExchange", durable = "true", type = ExchangeTypes.DIRECT),
+                    key = "#{getQueuePrefix}orderfinish"))
+    public void onOrderFinished(Message message, Channel channel) throws IOException {
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+
+            OrderFinishMQBean json = mapper.readValue(message.getBody(), OrderFinishMQBean.class);
+            System.out.println(json.toString());
+
+            BuOrder order = (BuOrder) orderDao.findById(BuOrder.class, Long.valueOf(json.getOrderId()));
+
+            if (order != null) {
+
+                // 获取用户
+                BuMember member = memberDao.getMemberById(order.getMemberId());
+                // 获取店铺
+                BuStore store = storeDao.getById(order.getStoreId());
+
+                //获取订单详情信息
+                List<BuOrderDetail> detailList = orderDetailDao.listByOrderId(order.getOrderId());
+                StringBuilder shopName = new StringBuilder("");
+                for (int j = 0; j < detailList.size(); j++) {
+                    shopName.append("、" + detailList.get(j).getGoodsName());
+                }
+                Long flag = Long.valueOf(json.getFlag());
+                // 发送订阅消息
+                if (flag.equals(1L)) {
+                    // 发送订单完成消息
+                    this.sendSubscribeMessage(member.getOpenid(), order.getOrderCode(), SubscribeMessageType.ORDERFINISH,
+                            new String[]{order.getOrderCode(),
+                                    store.getStoreName(),
+                                    shopName.toString().substring(1),
+                                    OrderStatus.getName(order.getStatus()),
+                                    "订单已完成"});
+                } else {
+                    if (order.getOrderType().equals(OrderType.TAKE) || order.getStatus().equals(OrderType.DINE)) {
+                        // 发送出餐消息
+                        this.sendSubscribeMessage(member.getOpenid(), order.getOrderCode(), SubscribeMessageType.SELFDELIVERY,
+                                new String[]{order.getOrderCode(),
+                                        shopName.toString().substring(1),
+                                        order.getOrderAddress(),
+                                        "订单已出餐,请尽快取餐"});
+                    } else {
+                        // 发送送达楼下消息
+                        this.sendSubscribeMessage(member.getOpenid(), order.getOrderCode(), SubscribeMessageType.SELFDELIVERY,
+                                new String[]{order.getOrderCode(),
+                                        shopName.toString().substring(1),
+                                        order.getOrderAddress(),
+                                        "订单已送达楼下,请尽快取餐"});
+                    }
+                }
+
+                // 如果商家开启评价 生成一条待评价
+                if (store.getEvaluateStatus().equals(Flag.FLAG_YES)) {
+                    BuOrderDetailSearchBean sBean = new BuOrderDetailSearchBean();
+                    sBean.setOrderId(order.getOrderId());
+                    List<BuOrderDetail> details = orderDetailDao.getNewOrderDetailList(sBean);
+                    BuEvaluate evaluate = new BuEvaluate();
+                    evaluate.setOrderId(order.getOrderId());
+                    evaluate.setOrderCode(order.getOrderCode());
+                    evaluate.setMemberId(order.getMemberId());
+                    evaluate.setStoreId(order.getStoreId());
+                    evaluate.setStatus(EvaluateStatus.UN_EVALUATE);
+                    if (CollectionUtils.isNotEmpty(details)) {
+                        evaluate.setGoodsId(details.get(0).getGoodsId());
+                        evaluate.setBuyCount(details.get(0).getBuyCount());
+                        evaluate.setSalePrice(details.get(0).getSalesPrice());
+                    }
+                    evaluateDao.save(evaluate);
+                }
+
+                try {
+                    createRecord(order);
+                } catch (Exception e) {
+                    // 使用日志框架记录异常,包含订单ID便于追踪
+                    log.error("处理霸王餐createRecord时发生异常,不影响主流程执行,订单ID: {}", order.getOrderId(), e);
+                }
+            }
+
+            // 消息处理回调
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 增加此处处理之后容易产生死循环,此消息会重新放回mq中去执行
+            //channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
+        }
+    }
+
+    /**
+     * 订单打印处理  (弃用)
+     * @param message
+     * @param channel
+     * @throws IOException
+     */
+    @RabbitHandler
+    @RabbitListener(
+            bindings = @QueueBinding(
+                    value = @Queue(value = "#{getQueuePrefix}orderprintquene", durable = "true"),
+                    exchange = @Exchange(name = "edueposExchange", durable = "true", type = ExchangeTypes.DIRECT),
+                    key = "#{getQueuePrefix}orderprint"))
+    public void onOrderPrint(Message message, Channel channel) throws IOException {
+
+        ObjectMapper mapper = new ObjectMapper();
+        OrderPrintMQBean json = null;
+        try {
+            json = mapper.readValue(message.getBody(), OrderPrintMQBean.class);
+            BuOrderV order = json.getOrderV();
+            if (order != null && order.getTakeupCode() != null){
+                String printSn = json.getPrintSn();
+                Long printTimes = json.getPrintTimes();
+                String areaName = json.getAreaName();
+                String storeAddress = json.getStoreAddressName();
+                List<BuOrderDetail> detailList = json.getDetailList();
+                Long count = json.getPrintCount();
+                String orderId = json.getOrderId();
+                System.out.println("开始打印小票==========="+order.getOrderCode());
+                // 打印订单
+
+                String print = FeieyunUtil.print(printSn, printTimes, areaName, storeAddress, order, detailList,count);
+                System.out.println("打印结束==============="+print);
+
+                com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(print);
+                int ret = jsonObject.getIntValue("ret");
+                System.out.println("解析打印结果======================"+ jsonObject.toString());
+                String msg = jsonObject.getString("msg");
+                // 4. 判断msg是否为"ok"
+                if (ret == 0) {
+                    System.out.println("接口调用成功,msg = " + msg);
+                    // 后续业务逻辑(如提取data字段)
+                    System.out.println("开始更新打印次数=========="+(count + 1));
+                    Long printCount = count + 1;
+
+                    BuOrderPrintCount orderPrintCount = orderPrintCountDao.getOrderPrintCountByOrderId(Long.valueOf(orderId));
+
+                    orderPrintCount.setNums(printCount);
+                    orderPrintCountDao.update(orderPrintCount);
+                    System.out.println("更新结束==============="+orderPrintCount);
+                } else {
+                    System.out.println("打印失败==============="+msg);
+                }
+            }
+            // 消息处理回调
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            if (json == null) {
+                // 消息格式错误,直接丢弃(不重试)
+                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
+                return;
+            }
+            // 重试次数+1
+            int currentRetry = json.getRetryCount() + 1;
+            // 超过3次则不再重试
+            if (currentRetry > 3) {
+                // 发送到死信队列或直接丢弃
+                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
+                // 可选:记录日志,人工排查
+                System.out.println("订单" + json.getOrderId() + "超过最大重试次数,停止重试");
+            } else {
+                // 更新重试次数,重新入队
+                json.setRetryCount(currentRetry);
+                // 将更新后的消息重新发送到队列(避免原消息被修改,需重新序列化)
+                channel.basicPublish(
+                        message.getMessageProperties().getReceivedExchange(),
+                        message.getMessageProperties().getReceivedRoutingKey(),
+                        MessageProperties.PERSISTENT_TEXT_PLAIN,
+                        mapper.writeValueAsBytes(json)
+                );
+                // 对原消息发送Nack(不重新入队,因为已手动重发)
+                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
+            }
+        }
+    }
+
+
+    /**
+     * 订单打印处理
+     * @param message
+     * @param channel
+     * @throws IOException
+     */
+    @RabbitHandler
+    @RabbitListener(
+            bindings = @QueueBinding(
+                    value = @Queue(value = "#{getQueuePrefix}orderprintquene1", durable = "true"),
+                    exchange = @Exchange(name = "edueposExchange", durable = "true", type = ExchangeTypes.DIRECT),
+                    key = "#{getQueuePrefix}orderprint1"))
+    public void onOrderPrintV1(Message message, Channel channel) throws IOException {
+
+        ObjectMapper mapper = new ObjectMapper();
+        OrderPrintMQBean json = null;
+        boolean printSuccess = false; // 标记是否已成功打印
+        try {
+            json = mapper.readValue(message.getBody(), OrderPrintMQBean.class);
+            BuOrderV order = json.getOrderV();
+            if (order != null && order.getTakeupCode() != null){
+                String printSn = json.getPrintSn();
+                Long printTimes = json.getPrintTimes();
+                String areaName = json.getAreaName();
+                String storeAddress = json.getStoreAddressName();
+                List<BuOrderDetail> detailList = json.getDetailList();
+                Long count = json.getPrintCount();
+                String orderId = json.getOrderId();
+                System.out.println("开始打印小票==========="+order.getOrderCode());
+                // 打印订单
+
+                String print = FeieyunUtil.print(printSn, printTimes, areaName, storeAddress, order, detailList,count);
+                System.out.println("打印结束==============="+print);
+
+                com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(print);
+                int ret = jsonObject.getIntValue("ret");
+                System.out.println("解析打印结果======================"+ jsonObject.toString());
+                String msg = jsonObject.getString("msg");
+                // 4. 判断msg是否为"ok"
+                if (ret == 0) {
+                    System.out.println("接口调用成功,msg = " + msg);
+                    printSuccess = true; // 标记打印成功
+                    // 后续业务逻辑(如提取data字段)
+                    System.out.println("开始更新打印次数=========="+(count + 1));
+                    Long printCount = count + 1;
+
+                    BuOrderPrintCount orderPrintCount = orderPrintCountDao.getOrderPrintCountByOrderId(Long.valueOf(orderId));
+                    if (orderPrintCount != null) {
+                        orderPrintCount.setNums(printCount);
+                        orderPrintCountDao.update(orderPrintCount);
+                    }
+                    System.out.println("更新结束==============="+orderPrintCount);
+                } else {
+                    System.out.println("打印失败==============="+msg);
+                }
+            }
+            // 消息处理回调
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            if (json == null) {
+                // 消息格式错误,直接丢弃(不重试)
+                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
+                return;
+            }
+            // 关键优化:如果已经打印成功,即使后续逻辑异常也不重试
+            if (printSuccess) {
+                System.out.println("打印已成功,后续异常不重试:" + json.getOrderId());
+                channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
+                return;
+            }
+            // 重试次数+1
+            int currentRetry = json.getRetryCount() + 1;
+            // 超过3次则不再重试
+            if (currentRetry > 3) {
+                // 发送到死信队列或直接丢弃
+                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
+                // 可选:记录日志,人工排查
+                System.out.println("订单" + json.getOrderId() + "超过最大重试次数,停止重试");
+            } else {
+                // 更新重试次数,重新入队
+                json.setRetryCount(currentRetry);
+                // 将更新后的消息重新发送到队列(避免原消息被修改,需重新序列化)
+                channel.basicPublish(
+                        message.getMessageProperties().getReceivedExchange(),
+                        message.getMessageProperties().getReceivedRoutingKey(),
+                        MessageProperties.PERSISTENT_TEXT_PLAIN,
+                        mapper.writeValueAsBytes(json)
+                );
+                // 对原消息发送Nack(不重新入队,因为已手动重发)
+                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
+            }
+        }
+    }
+
+
+
+    /**
+     * 订单更新打印次数处理
+     * @param message
+     * @param channel
+     * @throws IOException
+     */
+    @RabbitHandler
+    @RabbitListener(
+            bindings = @QueueBinding(
+                    value = @Queue(value = "#{getQueuePrefix}orderprintupdatetimesquene", durable = "true"),
+                    exchange = @Exchange(name = "edueposExchange", durable = "true", type = ExchangeTypes.DIRECT),
+                    key = "#{getQueuePrefix}orderprintupdatetimes"))
+    public void onOrderPrintUpdateTimes(Message message, Channel channel) throws IOException {
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            OrderPrintUpdateTimesMQBean json = mapper.readValue(message.getBody(), OrderPrintUpdateTimesMQBean.class);
+            System.out.println("次数-============"+json.getTimes());
+            // 更新打印次数
+            orderDao.updatePrintTimes(json.getTimes(), json.getOrderId());
+            // 消息处理回调
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
+
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 方法名称:订单列表分页
+     * 功能描述:订单列表分页
+     * 参数说明:
+     * 作	 者:Yangyk
+     * 日	 期:2023-05-23
+     */
+    public List<BuOrderV> page(PageControlData pageControlData, BuOrderSearchBean searchBean) {
+        List<BuOrderV> list = orderDao.page(pageControlData, searchBean);
+        return list;
+    }
+
+    /**
+     * 方法名称:获取已接单和已退款数量
+     * 功能描述:获取已接单和已退款数量
+     * 参数说明:
+     * 作	 者:Yangyk
+     * 日	 期:2023-05-23
+     */
+    public OrderNumBean getReceivedAndRefundOrderNum(BuOrderSearchBean searchBean) {
+        return orderDao.getReceivedAndRefundOrderNum(searchBean);
+    }
+
+    /**
+     * 方法名称:打印订单
+     * 功能描述:打印订单
+     * 参数说明:
+     * 作	 者:Yangyk
+     * 日	 期:2023-05-23
+     */
+    public void printOrder(Long orderId) {
+        Long sysAreaId = commonApiService.getSysAreaId();
+        // 打印订单
+        OrderPrintMQBean bean = new OrderPrintMQBean();
+        bean.setOrderId(orderId.toString());
+        rabbitTool.putQueue("a" + sysAreaId + "orderprint1", bean);
+    }
+
+    /**
+     * 方法名称:接单
+     * 功能描述:接单
+     * 参数说明:
+     * 作	 者:Yangyk
+     * 日	 期:2023-05-23
+     */
+    public void acceptOrder(Long orderId) {
+        // 获取订单
+        BuOrder order = (BuOrder) orderDao.findById(BuOrder.class, orderId);
+
+        // 变更状态为已接单
+        order.setStatus(OrderStatus.RECEIVED);
+        orderDao.update(order);
+
+        // 生成订单进程
+        BuOrderProgress orderProgress = new BuOrderProgress();
+        orderProgress.setOrderId(orderId);
+        orderProgress.setPayDate(order.getPayDate());
+        orderProgress.setStatus(OrderProcessStatus.RECEIVED);
+        orderProgress.setReceiveOrderDate(DateUtil.getSqlToday());
+        orderProgressDao.save(orderProgress);
+
+        Long sysAreaId = commonApiService.getSysAreaId();
+
+        // 打印订单
+        OrderPrintMQBean bean = new OrderPrintMQBean();
+        bean.setOrderId(order.getOrderId().toString());
+        bean.setTakeupCode(order.getTakeupCode());
+        rabbitTool.putQueue("a" + sysAreaId + "orderprint1", bean);
+    }
+
+    /**
+     * 方法名称:拒绝接单
+     * 功能描述:拒绝接单
+     * 参数说明:
+     * 作	 者:Yangyk
+     * 日	 期:2023-05-23
+     */
+    public void refuseOrder(Long orderId, LoginInfoBean loginBean) {
+        // 获取订单
+        BuOrder order = (BuOrder) orderDao.findById(BuOrder.class, orderId);
+
+        String timenow = DateUtil.getStrToday("yyyyMMddHHmmssSSS");
+        int suiji = new Random().nextInt(10);
+        String code = "TH" + timenow + suiji;
+
+        BuRefund refund = new BuRefund();
+        refund.setRefundCode(code);
+
+        List<com.sapit.common.util.PayChannelProperties.Channel> channels = payChannelProperties.getChannels();
+        com.sapit.common.util.PayChannelProperties.Channel channel = null;
+        if (CollectionUtils.isNotEmpty(channels)) {
+            for (com.sapit.common.util.PayChannelProperties.Channel c : channels) {
+                if (order.getPayChannel().equals(c.getId())) {
+                    channel = c;
+                    break;
+                }
+            }
+        }
+
+        if (channel != null) {
+            //if (order.getPayType().equals(PayType.PAY_TYPE_WX)) {
+            // 先调用微信接口进行退款
+            DoRefundRequestBean refundBean = WeixinBsUtil.doRefund(order.getOrderCode(), refund.getRefundCode(), order.getOrderFee(), order.getOrderFee(), channel);
+            if ("SUCCESS".equals(refundBean.getReturn_code())) {
+                if ("SUCCESS".equals(refundBean.getResult_code())) {
+                    refund.setRefundProgress(RefundProgress.SUCCESSONE);
+                } else {
+                    refund.setRefundProgress(RefundProgress.FAILONE);
+                }
+            }
+
+            //}
+        }
+
+        refund.setRefundCode(code);
+        refund.setOrderId(orderId);
+        refund.setReason("");
+        refund.setRefundAmount(order.getOrderFee());
+        refund.setStatus(0L);    // 申请中,在微信回调接口中更新状态
+        refund.setCreateDate(DateUtil.getSqlToday());
+
+        // 退款类型 设置成管理端退款
+        refund.setRefundType(1L);
+        if (loginBean != null) {
+            refund.setOpId(loginBean.getId());
+            refund.setOpUser(loginBean.getName());
+        }
+
+        refundDao.save(refund);
+
+        Long sysAreaId = commonApiService.getSysAreaId();
+
+        //获取订单详情恢复商品库存
+        List<BuOrderDetail> detailList = orderDetailDao.listByOrderId(orderId);
+        for (int i = 0; i < detailList.size(); i++) {
+            if (detailList.get(i).getSalesPrice() < detailList.get(i).getPrice()) {
+                redisTool.incrBy("a" + sysAreaId + "kt" + detailList.get(i).getModelId(), detailList.get(i).getBuyCount());
+            } else {
+                redisTool.incrBy("a" + sysAreaId + "k" + detailList.get(i).getModelId(), detailList.get(i).getBuyCount());
+            }
+        }
+        // 变更状态为拒绝接单
+        order.setStatus(OrderStatus.REFUSE);
+        order.setRefundFee(order.getOrderFee());
+        order.setFinishDate(DateUtil.getSqlToday());
+        orderDao.update(order);
+
+        if (order.getNewcusDiscounts() != null && order.getNewcusDiscounts() > 0) {
+            newCustomerDao.deleteNewCustomer(order.getMemberId(), order.getStoreId());
+        }
+        // 记录操作日志
+//		log.info("操作者: " + loginBean.getCode() + "; 订单号:" + order.getOrderCode() + "; 操作类型:拒绝接单; 操作时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm").format(new Date()));
+    }
+
+    /**
+     * 方法名称:完成订单(客户已取货)
+     * 功能描述:完成订单(客户已取货)
+     * 参数说明:
+     * 作	 者:Yangyk
+     * 日	 期:2023-05-23
+     */
+    public void completeOrder(Long orderId, LoginInfoBean loginBean) {
+        Long sysAreaId = commonApiService.getSysAreaId();
+        // 更新订单状态
+        orderDao.updateOrderToFinish(orderId);
+        // 将订单放到mq中
+        OrderFinishMQBean bean = new OrderFinishMQBean();
+        bean.setFlag("1");
+        bean.setOrderId(orderId.toString());
+        rabbitTool.putQueue("a" + sysAreaId + "orderfinish", bean);
+
+        // 记录操作日志
+//		log.info("操作者: " + loginBean.getCode() + "; 订单号:" + order.getOrderCode() + "; 操作类型:完成订单; 操作时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm").format(new Date()));
+    }
+
+    /**
+     * 方法名称:订单结算处理
+     * 功能描述:结算前一天的订单到订单结算表,频率为每天一次
+     * 参数说明:
+     * 作    者:Vic
+     * 日    期:2023-06-01
+     */
+    public void orderAcountBatch() {
+        // 删除三天之前并且状态为已完成的订单
+        //orderDao.delete
+
+
+    }
+
+    /**
+     * 方法名称:变更订单状态为已支付
+     * 功能描述:变更订单状态为已支付
+     * 参数说明:
+     * 作	 者:Yangyk
+     * 日	 期:2023-05-23
+     */
+    @SuppressWarnings("unchecked")
+    public boolean changeOrderStatusToPayed(String bussinessKey, Long payType, String totalFee) {
+        // 获取订单
+        BuOrderSearchBean searchBean = new BuOrderSearchBean();
+        searchBean.setOrderCode(bussinessKey);
+
+        List<BuOrder> list = orderDao.searchBySql("FROM BU_ORDER WHERE 1 = 1 " + searchBean.getSerchCondition());
+        if (CollectionUtils.isNotEmpty(list)) {
+            BuOrder order = list.get(0);
+            // 更新订单状态/支付时间
+            order.setStatus(OrderStatus.PAYED);
+            order.setPayDate(DateUtil.getSqlToday());
+
+            orderDao.update(order);
+        } else {
+            return false;
+        }
+
+        return true;
+    }
+
+    public void createRecord(BuOrder order) {
+        if (order == null) {
+            return;
+        }
+
+        try {
+            // 判断是否有正在开启的霸王餐活动
+            BuDineAndDashSearchBean search = new BuDineAndDashSearchBean();
+            search.setStatus(Flag.FLAG_YES);
+            // 获取霸王餐活动
+            BuDineAndDash dineAndDash = dineAndDashDao.getDineAndDashOneForUser(search);
+            if (dineAndDash == null) {
+                return;
+            }
+            // 校验活动日期
+            if (dineAndDash.getStartDate() == null || dineAndDash.getEndDate() == null) {
+                return;
+            }
+
+            // 获取参加该霸王餐的店铺
+            List<BuStore> storeList = dineAndDashStoreDao.getStoreByDineAndDashIdList(dineAndDash.getDineAndDashId());
+            if (storeList == null) {
+                return;
+            }
+            if (storeList.isEmpty()) {
+                return;
+            }
+
+            // 提取店铺ID列表
+            List<Long> storeIds = storeList.stream()
+                    .map(BuStore::getStoreId)
+                    .collect(Collectors.toList());
+
+
+            // 判断当前订单的店铺是否参加霸王餐活动
+            if (!storeIds.contains(order.getStoreId())) {
+                return;
+            }
+
+            // 构建店铺ID字符串(用于查询)
+            String storeIdsStr = storeIds.stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+
+            // 获取今天之前的订单
+            BuOrderYearSearchBean yearSearchBean = new BuOrderYearSearchBean();
+            String startDate = DateUtil.getDateStr(dineAndDash.getStartDate(), "yyyy-MM-dd");
+            String endDate = DateUtil.getDateStr(dineAndDash.getEndDate(), "yyyy-MM-dd");
+            yearSearchBean.setStoreIds(storeIdsStr);
+            yearSearchBean.setStatus(OrderStatus.COMPLETED);
+            yearSearchBean.setMemberIds(order.getMemberId());
+
+            // 查询用户在活动期间的消费总额
+            DineAndDashOrderBean orderYear = orderYearDao.getDineAndDashStoreOrderYearList(yearSearchBean, startDate, endDate);
+            Long goodsFee = (orderYear != null && orderYear.getGoodsFee() != null) ? orderYear.getGoodsFee() : 0L; // 修复空指针
+            // 活动达标金额
+            Long reachPrice = dineAndDash.getReachPrice();
+            if (reachPrice == null || reachPrice <= 0) {
+                return;
+            }
+            int num = (int) (goodsFee / reachPrice);
+            if (num > 0) {
+                // 查询抽奖记录表
+                int count = raffleRecordDao.getCountRecordForStore(dineAndDash.getDineAndDashId(), order.getMemberId());
+                if (num > count) {
+                    for (int i = 0; i < num - count; i++) {
+                        BuRaffleRecord record = new BuRaffleRecord();
+                        record.setDineAndDashId(dineAndDash.getDineAndDashId());
+                        record.setWin(Status.STATUS_UNVALID);
+                        record.setMemberId(order.getMemberId());
+                        record.setCreateDate(DateUtil.getSqlToday());
+                        record.setStatus(Status.STATUS_UNVALID);
+                        record.setUseStatus(Status.STATUS_UNVALID);
+
+                        raffleRecordDao.save(record);
+                    }
+                }
+
+            }
+        } catch (Exception e) {
+            log.error("创建霸王餐记录失败,订单ID: {}", order.getOrderId(), e);
+        }
+    }
+
+    /**
+     * 方法名称:根据订单号获取订单
+     * 功能描述:根据订单号获取订单
+     * 参数说明:
+     * 作	 者:Yangyk
+     * 日	 期:2023-07-06
+     */
+    public BuOrder getOrderInfo(String orderCode) {
+        BuOrderSearchBean searchBean = new BuOrderSearchBean();
+        searchBean.setOrderCode(orderCode);
+        return orderDao.getNewOrder(searchBean);
+    }
+
+    /**
+     * 方法名称:订单页 更新取餐码
+     * 功能描述:订单页 更新取餐码
+     * 参数说明:
+     * 作    者:Yangyk
+     * 日    期:2023-06-06
+     */
+    public void updateTakeupCode(Long orderId, String takeupCode) {
+        orderDao.updateTakeupCode(orderId, takeupCode);
+    }
+
+    /**
+     * 方法名称:发送订阅消息
+     * 功能描述:发送订阅消息
+     * 参数说明:
+     * 作	 者:vic
+     * 日	 期:2023-03-24
+     */
+    private void sendSubscribeMessage(String openid, String param, int flag, String[] data) {
+        AccessTokenBean token = accessTokenManageService.getMinAccessToken();
+        String minToken = token.getAccess_token();
+        if (minToken != null) {
+            SubscribeMessageUtil.subscribeMessage(openid, minToken, param, flag, data);
+        } else {
+            System.out.println("-----小程序消息发送异常-----");
+        }
+    }
+
+
+    /**
+     * 更新浏览量
+     * @param message
+     * @param channel
+     * @throws IOException
+     */
+    @RabbitHandler
+    @RabbitListener(
+            bindings = @QueueBinding(
+                    value = @Queue(value = "#{getQueuePrefix}updateBrowseNumquene", durable = "true"),
+                    exchange = @Exchange(name = "edueposExchange", durable = "true", type = ExchangeTypes.DIRECT),
+                    key = "#{getQueuePrefix}updateBrowseNum"))
+    public void onUpdateBrowse(Message message, Channel channel) throws IOException {
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+
+            StoreBrowseNumMQBean json = mapper.readValue(message.getBody(), StoreBrowseNumMQBean.class);
+            Long storeId = Long.valueOf(json.getStoreId());
+            System.out.println(json.toString());
+            // 更新
+            storeBrowseManageService.updateStoreBrowse(storeId, 1L);
+
+            // 消息处理回调
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            // 增加此处处理之后容易产生死循环,此消息会重新放回mq中去执行
+            //channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
+        }
+    }
+
+    /**
+     * 方法名称:查询订单支付情况
+     * 功能描述:查询订单支付情况
+     * 参数说明:
+     * 作	 者:yangyk
+     * 日	 期:2023-09-25
+     */
+    public OrderWxPayedInfoBean getOrderPayedInfo(String orderCode) {
+        BuOrderV order = orderDao.getOrderByOrderCode(orderCode);
+        BuOrder buOrder = (BuOrder) orderDao.findById(BuOrder.class, order.getOrderId());
+
+        List<com.sapit.common.util.PayChannelProperties.Channel> channels = payChannelProperties.getChannels();
+        com.sapit.common.util.PayChannelProperties.Channel channel = null;
+        if (CollectionUtils.isNotEmpty(channels)) {
+            for (com.sapit.common.util.PayChannelProperties.Channel c : channels) {
+                if (buOrder.getPayChannel().equals(c.getId())) {
+                    channel = c;
+                    break;
+                }
+            }
+        }
+
+        if (channel != null) {
+            //if (buOrder.getPayType().equals(PayType.PAY_TYPE_WX)) {
+            return WeixinBsUtil.getOrderPayedInfo(orderCode, channel);
+            //} else if (buOrder.getPayType().equals(PayType.PAY_TYPE_ICBC)) {
+            //	return IcbcUtil.orderQry(orderCode, channel);
+            //}
+        }
+
+        return null;
+    }
+
+    /**
+     * 方法名称:查询订单退款情况
+     * 功能描述:查询订单退款情况
+     * 参数说明:
+     * 作	 者:yangyk
+     * 日	 期:2023-09-25
+     */
+    public OrderWxRefundInfoBean getOrderRefundInfo(String orderCode) {
+        BuOrderV order = orderDao.getOrderByOrderCode(orderCode);
+//		BuRefund buRefund = refundDao.getRefundByOrderId(order.getOrderId());
+
+        List<com.sapit.common.util.PayChannelProperties.Channel> channels = payChannelProperties.getChannels();
+        com.sapit.common.util.PayChannelProperties.Channel channel = null;
+        if (CollectionUtils.isNotEmpty(channels)) {
+            for (com.sapit.common.util.PayChannelProperties.Channel c : channels) {
+                if (order.getPayChannel().equals(c.getId())) {
+                    channel = c;
+                    break;
+                }
+            }
+        }
+
+        if (channel != null) {
+            //if (order.getPayType().equals(PayType.PAY_TYPE_WX)) {
+            return WeixinBsUtil.getOrderRefundInfo(orderCode, channel);
+            //} else if (order.getPayType().equals(PayType.PAY_TYPE_ICBC)) {
+            //	return IcbcUtil.refundQry(orderCode, buRefund.getRefundCode(), channel);
+            //}
+        }
+
+        return null;
+    }
+
+    /**
+     * 通过公众号给商户发送消息(小票机离线等情况)
+     * @param message
+     * @param channel
+     * @throws IOException
+     */
+    @RabbitHandler
+    @RabbitListener(
+            bindings = @QueueBinding(
+                    value = @Queue(value = "#{getQueuePrefix}wxmsgsendqueue", durable = "true"),
+                    exchange = @Exchange(name = "edueposExchange", durable = "true", type = ExchangeTypes.DIRECT),
+                    key = "#{getQueuePrefix}wxmsgsend"))
+    public void onWxMsgSend(Message message, Channel channel) throws IOException {
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+
+            WxMsgSendMqBean json = mapper.readValue(message.getBody(), WxMsgSendMqBean.class);
+            System.out.println(json.toString());
+
+            AccessTokenBean accessToken = accessTokenManageService.getGzhAccessToken();
+
+            int result = ApiUtil.sendWxMessageToUser(json.getOpenId(), json.getMessage(), accessToken.getAccess_token());
+            if (result == 0) {
+                wxMsgDao.updateStatusById(json.getMsgId(), 1L);
+            } else {
+                wxMsgDao.updateStatusById(json.getMsgId(), 2L);
+            }
+
+            // 消息处理回调
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 增加此处处理之后容易产生死循环,此消息会重新放回mq中去执行
+            //channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
+        }
+    }
+
+}

+ 36 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderSettlementService.java

@@ -0,0 +1,36 @@
+package com.sapit.client.app.manage.service.order;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.order.OrderSettlementDao;
+import com.sapit.common.bean.order.OrderSettlementBean;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.order.BuOrderSettlementSearchBean;
+
+/**
+ * 结算订单Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class OrderSettlementService {
+
+	@Autowired
+	private OrderSettlementDao orderSettlementDao;
+	
+	/**
+	 * 方法名称:结算订单列表
+	 * 功能描述:结算订单列表
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public List<OrderSettlementBean> page(PageControlData page, BuOrderSettlementSearchBean searchBean) {
+		return orderSettlementDao.page(page, searchBean);
+	}
+}

+ 168 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/order/OrderYearService.java

@@ -0,0 +1,168 @@
+package com.sapit.client.app.manage.service.order;
+
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.order.OrderYearDao;
+import com.sapit.common.bean.order.HomeOrderInfoBean;
+import com.sapit.common.bean.order.OrderIncomeBean;
+import com.sapit.common.bean.order.OrderWxPayedInfoBean;
+import com.sapit.common.bean.order.OrderWxRefundInfoBean;
+import com.sapit.common.bean.order.TodayOrderInfoBean;
+import com.sapit.common.entity.order.BuOrderYear;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.order.BuOrderSearchBean;
+import com.sapit.common.util.PayChannelProperties;
+import com.sapit.common.util.WeixinBsUtil;
+import com.sapit.common.view.order.BuOrderV;
+import com.sapit.common.view.order.BuOrderYearV;
+
+/**
+ * 订单管理-学年Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class OrderYearService {
+	
+	// 日志输出
+    static final Logger log = LoggerFactory.getLogger(OrderYearService.class);
+
+	@Autowired
+	private OrderYearDao orderDao;
+	
+//	@Autowired
+//	private RefundDao refundDao;
+	
+	@Autowired
+	private PayChannelProperties payChannelProperties;
+	/**
+	 * 方法名称:订单列表分页
+	 * 功能描述:订单列表分页
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public List<BuOrderYearV> page(PageControlData pageControlData, BuOrderSearchBean searchBean) {
+		List<BuOrderYearV> list = orderDao.page(pageControlData, searchBean);
+		return list;
+	}
+	
+	/**
+	 * 方法名称:获取导出的list
+	 * 功能描述:获取导出的list
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public List<BuOrderYearV> getExportList(BuOrderSearchBean searchBean) {
+		return orderDao.getExportList(searchBean);
+	}
+	
+	/**
+	 * 方法名称:订单收入明细(今日订单信息)
+	 * 功能描述:订单收入明细(今日订单信息)
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public TodayOrderInfoBean todayOrderInfo() {
+		return orderDao.todayOrderInfo();
+	}
+	
+	/**
+	 * 方法名称:获取订单收入明细
+	 * 功能描述:获取订单收入明细
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public List<OrderIncomeBean> getOrderIncomeInfo(PageControlData pageControlData, BuOrderSearchBean searchBean) {
+		return orderDao.getOrderIncomeInfo(pageControlData, searchBean);
+	}
+	
+	/**
+	 * 方法名称:首页-订单相关信息
+	 * 功能描述:首页-订单相关信息
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public HomeOrderInfoBean homeDataInfo() {
+		return orderDao.homeDataInfo(null);
+	}
+	
+	/**
+	 * 方法名称:查询订单支付情况
+	 * 功能描述:查询订单支付情况
+	 * 参数说明:
+	 * 作	 者:yangyk
+	 * 日	 期:2023-09-25
+	 */
+	public OrderWxPayedInfoBean getOrderPayedInfo(String orderCode) {
+		BuOrderV order = orderDao.getOrderByOrderCode(orderCode);
+		BuOrderYear buOrder = (BuOrderYear) orderDao.findById(BuOrderYear.class, order.getOrderId());
+		
+		List<com.sapit.common.util.PayChannelProperties.Channel> channels = payChannelProperties.getChannels();
+		com.sapit.common.util.PayChannelProperties.Channel channel = null;
+		if (CollectionUtils.isNotEmpty(channels)) {
+			for (com.sapit.common.util.PayChannelProperties.Channel c : channels) {
+				if (buOrder.getPayChannel().equals(c.getId())) {
+					channel = c; 
+					break;
+				}
+			}
+		}
+		
+		if (channel != null) {
+			//if (buOrder.getPayType().equals(PayType.PAY_TYPE_WX)) {
+				return WeixinBsUtil.getOrderPayedInfo(orderCode, channel);
+			//} else if (buOrder.getPayType().equals(PayType.PAY_TYPE_ICBC)) {
+			//	return IcbcUtil.orderQry(orderCode, channel);
+			//}
+		}
+		
+		return null;
+	}
+	
+	/**
+	 * 方法名称:查询订单退款情况
+	 * 功能描述:查询订单退款情况
+	 * 参数说明:
+	 * 作	 者:yangyk
+	 * 日	 期:2023-09-25
+	 */
+	public OrderWxRefundInfoBean getOrderRefundInfo(String orderCode) {
+		BuOrderV order = orderDao.getOrderByOrderCode(orderCode);
+		//BuRefund buRefund = refundDao.getRefundByOrderId(order.getOrderId());
+		
+		List<com.sapit.common.util.PayChannelProperties.Channel> channels = payChannelProperties.getChannels();
+		com.sapit.common.util.PayChannelProperties.Channel channel = null;
+		if (CollectionUtils.isNotEmpty(channels)) {
+			for (com.sapit.common.util.PayChannelProperties.Channel c : channels) {
+				if (order.getPayChannel().equals(c.getId())) {
+					channel = c;
+					break;
+				}
+			}
+		}
+		
+		if (channel != null) {
+			//if (order.getPayType().equals(PayType.PAY_TYPE_WX)) {
+				return WeixinBsUtil.getOrderRefundInfo(orderCode, channel);
+			//} else if (order.getPayType().equals(PayType.PAY_TYPE_ICBC)) {
+			//	return IcbcUtil.refundQry(orderCode, buRefund.getRefundCode(), channel);
+			//}
+		}
+		
+		return null;
+	}
+	
+}

+ 132 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/order/RefundFailedService.java

@@ -0,0 +1,132 @@
+package com.sapit.client.app.manage.service.order;
+
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.order.OrderDao;
+import com.sapit.client.app.persistence.order.RefundFailedDao;
+import com.sapit.common.constant.RefundFailedStatus;
+import com.sapit.common.entity.order.BuOrder;
+import com.sapit.common.entity.order.BuRefundFailed;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.order.BuRefundFailedSearchBean;
+import com.sapit.common.util.PayChannelProperties;
+import com.sapit.common.util.PayChannelProperties.Channel;
+import com.sapit.common.util.WeixinBsUtil;
+import com.sapit.common.view.order.BuOrderV;
+
+/**
+ * 退款失败Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class RefundFailedService {
+	
+	@Autowired
+	private RefundFailedDao refundFailedDao;
+	
+	@Autowired
+	private OrderDao orderDao;
+	
+	@Autowired
+	private PayChannelProperties payChannelProperties;
+	
+	/**
+	 * 方法名称:根据订单编码更新状态
+	 * 功能描述:根据订单编码更新状态
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public void updateStatus(Long status, String orderCode) {
+		refundFailedDao.updateStatus(orderCode, status);
+	}
+    
+	/**
+	 * 方法名称:根据退款编码获取
+	 * 功能描述:根据退款编码获取
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public BuRefundFailed getOneByRefundCode(String orderCode) {
+		return refundFailedDao.getOneByRefundCode(orderCode);
+	}
+	
+	/**
+	 * 方法名称:保存退款失败信息
+	 * 功能描述:保存退款失败信息
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public boolean save(BuRefundFailed refundFailed) {
+		return refundFailedDao.save(refundFailed);
+	}
+	
+	/**
+	 * 方法名称:更新退款失败信息
+	 * 功能描述:更新退款失败信息
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public boolean update(BuRefundFailed refundFailed) {
+		return refundFailedDao.update(refundFailed);
+	}
+	
+	/**
+	 * 方法名称:退款失败列表(分页)
+	 * 功能描述:退款失败列表(分页)
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public List<BuRefundFailed> page(PageControlData page, BuRefundFailedSearchBean searchBean) {
+		return refundFailedDao.page(page, searchBean);
+	}
+	
+	/**
+	 * 方法名称:再次退款
+	 * 功能描述:再次退款
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public void refundAgain(Long refundFailedId) {
+		BuRefundFailed refundFailed = (BuRefundFailed) refundFailedDao.findById(BuRefundFailed.class, refundFailedId);
+		BuOrderV order = orderDao.getOrderByOrderCode(refundFailed.getOrderCode());
+		BuOrder buOrder = orderDao.getOrderForRefund(order.getOrderId());
+		List<Channel> channels = payChannelProperties.getChannels();
+		Channel channel = null;
+		if (CollectionUtils.isNotEmpty(channels)) {
+			for (Channel c : channels) {
+				if (buOrder.getPayChannel().equals(c.getId())) {
+					channel = c;
+					break;
+				}
+			}
+		}
+        
+		if (channel != null) {
+			//if (buOrder.getPayType().equals(PayType.PAY_TYPE_WX)) {
+				// 先调用微信接口进行退款 
+				WeixinBsUtil.doRefund(buOrder.getOrderCode(), refundFailed.getRefundCode(), buOrder.getOrderFee(), buOrder.getOrderFee(), channel);
+				refundFailed.setStatus(RefundFailedStatus.APPROVING);
+				refundFailedDao.update(refundFailed);
+//			} else if (buOrder.getPayType().equals(PayType.PAY_TYPE_ICBC)) {
+//				IcbcUtil.merRefund(buOrder.getOrderCode(), refundFailed.getRefundCode(), buOrder.getOrderFee(), channel);
+//			}
+		}
+	}
+	
+	public void delete(Long refundFailedId) {
+		refundFailedDao.delete(refundFailedId);
+	}
+}

+ 224 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/order/RefundService.java

@@ -0,0 +1,224 @@
+package com.sapit.client.app.manage.service.order;
+
+import java.util.List;
+import java.util.Random;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.member.NewCustomerDao;
+import com.sapit.client.app.persistence.order.OrderDao;
+import com.sapit.client.app.persistence.order.OrderProgressDao;
+import com.sapit.client.app.persistence.order.RefundDao;
+import com.sapit.common.bean.order.DoRefundRequestBean;
+import com.sapit.common.bean.system.LoginInfoBean;
+import com.sapit.common.constant.OrderStatus;
+import com.sapit.common.constant.OrderType;
+import com.sapit.common.constant.RefundProgress;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.order.BuOrder;
+import com.sapit.common.entity.order.BuOrderProgress;
+import com.sapit.common.entity.order.BuRefund;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.order.BuOrderProgressSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.PayChannelProperties;
+import com.sapit.common.util.PayChannelProperties.Channel;
+import com.sapit.common.util.WeixinBsUtil;
+
+/**
+ * 售后管理Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class RefundService {
+
+	@Autowired
+	private RefundDao buRefundDao;
+	@Autowired
+	private OrderDao orderDao;
+    @Autowired
+    private OrderProgressDao orderProgressDao;
+    @Autowired
+    private NewCustomerDao newCustomerDao;
+    @Autowired
+    private PayChannelProperties payChannelProperties;
+//	@Autowired
+//	private RefundFailedService	refundFailedService;
+	
+    /**
+	 * 方法名称:订单全部退款
+	 * 功能描述:订单全部退款
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public ResultBean orderRefund(LoginInfoBean loginBean, Long orderId, String reason) {
+		ResultBean bean = new ResultBean();
+		// 校验是否已经发起退款
+		if (isHaveRefund(orderId)) {
+			return bean;
+		}
+		BuOrder order = (BuOrder) orderDao.findById(BuOrder.class, orderId);
+		String timenow = DateUtil.getStrToday("yyyyMMddHHmmssSSS");
+        int suiji = new Random().nextInt(10);
+        String code = "TH" + timenow + suiji;
+        
+        String cDate = DateUtil.getStrToday("yyyy-MM-dd");
+        String pDate = DateUtil.dateToStr(order.getPayDate());
+        
+        if (!cDate.equals(pDate)) {
+        	bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+        	bean.getRtnBean().setRtnMsg("只能对当天订单进行退款,如需隔天退款,请让商户自行线下退款!");
+        	return bean;
+        }
+        
+        BuRefund refund = new BuRefund();
+        refund.setRefundCode(code);
+        
+        List<Channel> channels = payChannelProperties.getChannels();
+		Channel channel = null;
+		if (CollectionUtils.isNotEmpty(channels)) {
+			for (Channel c : channels) {
+				if (order.getPayChannel().equals(c.getId())) {
+					channel = c;
+					break;
+				}
+			}
+		}
+//		if (order.getPayType().equals(PayType.PAY_TYPE_WX)) {
+			// 先调用微信接口进行退款 
+			DoRefundRequestBean refundBean = WeixinBsUtil.doRefund(order.getOrderCode(), refund.getRefundCode(), order.getOrderFee(), order.getOrderFee(), channel);
+			if ("SUCCESS".equals(refundBean.getReturn_code())) {
+				if ("SUCCESS".equals(refundBean.getResult_code())) {
+			    	refund.setRefundProgress(RefundProgress.SUCCESSONE);
+				} else {
+			    	refund.setRefundProgress(RefundProgress.FAILONE);
+				}
+			}
+			
+//		}
+//		else if (order.getPayType().equals(PayType.PAY_TYPE_ICBC)) {
+//			DoRefundRequestBean refundBean = IcbcUtil.merRefund(order.getOrderCode(), refund.getRefundCode(), order.getOrderFee(), channel);
+//			if (refundBean.getResult_code().equals(Flag.FLAG_NO.toString())) {
+//				refund.setRefundProgress(RefundProgress.SUCCESSONE);
+//				refund.setStatus(1L);
+//			} else {
+//				refund.setRefundProgress(RefundProgress.FAILONE);
+//				BuRefundFailed refundFailed = new BuRefundFailed();
+//				refundFailed.setOrderCode(order.getOrderCode());
+//    			refundFailed.setRefundCode(refund.getRefundCode());
+//    			refundFailed.setRefundDes(refundBean.getReturn_msg());
+//    			refundFailed.setStatus(refundBean.getResult_code());
+//    	
+//    			refundFailed.setRefundAmount(order.getOrderFee());
+//    				
+//    			refundFailed.setCreateDate(DateUtil.getSqlToday());
+//    			refundFailed.setUpdateDate(DateUtil.getSqlToday());
+//    			refundFailedService.save(refundFailed);
+//			}
+//		}
+        
+		// 然后更新订单状态 
+		if (order.getOrderType() > OrderType.UP) {
+			order.setStatus(OrderStatus.REFUND);
+		} else {
+			if (order.getStatus() < OrderStatus.DELIVERING) {
+				order.setStatus(OrderStatus.REFUND);
+			} else {
+				order.setStatus(OrderStatus.DELIVERING_REFUND);
+			}
+		}
+		
+		order.setRefundFee(order.getOrderFee());
+		order.setFinishDate(DateUtil.getSqlToday());
+
+		orderDao.update(order);
+		
+		// 更新订单进程
+		BuOrderProgressSearchBean searchBean = new BuOrderProgressSearchBean();
+		searchBean.setOrderId(order.getOrderId());
+		BuOrderProgress progress = orderProgressDao.getNewOrderProgress(searchBean);
+		if (progress != null && (order.getStatus().equals(OrderStatus.REFUND) || order.getStatus().equals(OrderStatus.DELIVERING_REFUND))) {
+			orderProgressDao.updateToFinish(progress.getOrderProgressId());
+		}
+		
+		refund.setRefundCode(code);
+		refund.setOrderId(orderId);
+		refund.setReason(reason);
+		refund.setRefundAmount(order.getOrderFee());
+		refund.setStatus(0L);	// 申请中,在微信回调接口中更新状态
+		refund.setCreateDate(DateUtil.getSqlToday());
+		// 退款类型 设置成管理端退款
+		refund.setRefundType(1L);
+		if (loginBean != null) {
+			refund.setOpId(loginBean.getId());
+			refund.setOpUser(loginBean.getName());
+		}
+		buRefundDao.save(refund);
+		
+		// 退款新客
+		if (order.getNewcusDiscounts() != null && order.getNewcusDiscounts() > 0) {
+			newCustomerDao.deleteNewCustomer(order.getMemberId(), order.getStoreId());
+		}
+		bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+		bean.getRtnBean().setRtnMsg("操作成功!");
+		return bean;
+	}
+	
+	/**
+	 * 方法名称:当前订单是否退款过
+	 * 功能描述:当前订单是否退款过
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public boolean isHaveRefund(Long orderId) {
+		return buRefundDao.isHaveRefund(orderId);
+	}
+	
+	/**
+	 * 方法名称:根据退款编码获取售后记录
+	 * 功能描述:根据退款编码获取售后记录
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	@SuppressWarnings("unchecked")
+	public BuRefund getOneByCode(String refundCode) {
+		StringBuilder hql = new StringBuilder();
+		hql.append("FROM BuRefund WHERE REFUND_CODE = '" + refundCode + "'");
+		List<BuRefund> list = buRefundDao.searchByHql(hql.toString());
+		if (CollectionUtils.isNotEmpty(list)) {
+			return list.get(0);
+		}
+		return null;
+	}
+	
+	/**
+	 * 方法名称:更新售后记录
+	 * 功能描述:更新售后记录
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public void update(BuRefund buRefund) {
+		buRefundDao.update(buRefund);
+	}
+	
+	/**
+	 * 方法名称:获取售后列表
+	 * 功能描述:获取售后列表
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-05-23
+	 */
+	public List<BuRefund> refundPage(PageControlData page, Long refundType, String orderCode) {
+		return buRefundDao.page(page, refundType, orderCode);
+	}
+}

+ 109 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/rider/AddressGroupManageService.java

@@ -0,0 +1,109 @@
+package com.sapit.client.app.manage.service.rider;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.rider.AddressDao;
+import com.sapit.client.app.persistence.rider.AddressGroupDao;
+import com.sapit.common.entity.rider.BuAddressGroup;
+import com.sapit.common.search.rider.AddressGroupSearchBean;
+
+/**
+ * 类名称:配送区域分组管理服务类
+ * 类描述:处理配送区域分组的各种事务
+ * 
+ * 作  者:Vic
+ * 时  间:2023-05-22
+ */
+@Service
+@Transactional
+public class AddressGroupManageService {
+	
+	@Autowired
+	private AddressGroupDao addressGroupDao;
+	@Autowired
+	private AddressDao addressDao;
+
+
+	/**
+	 * 方法名称:根据ID查询配送区域分组表实体
+	 * 功能描述:根据ID查询配送区域分组表实体
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-21
+	 */
+	public BuAddressGroup getAddressGroupById(Long id) {
+		return addressGroupDao.getAddressGroupById(id);
+	}
+	
+	/**
+	 * 方法名称:根据检索条件查询配送区域分组表实体
+	 * 功能描述:根据条件查询配送区域分组表获取一条数据
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-15
+	 */
+	public BuAddressGroup getAddressGroup(AddressGroupSearchBean searchBean) {
+		return (BuAddressGroup) addressGroupDao.getObject(searchBean);
+	}
+	
+	/**
+	 * 方法名称:根据检索条件查询配送区域分组表实体
+	 * 功能描述:根据条件查询配送区域分组表获取一条数据
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-15
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuAddressGroup> getAddressGroupList(AddressGroupSearchBean searchBean) {
+		return addressGroupDao.getList(searchBean, " order by ADDRESS_GROUP_ID desc");
+	}
+	
+	/**
+	 * 方法名称:新增配送区域分组
+	 * 功能描述:新增配送区域分组
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-22
+	 */
+	public boolean save(BuAddressGroup group){
+		return addressGroupDao.save(group);
+	}
+	
+	/**
+	 * 方法名称:编辑配送区域分组
+	 * 功能描述:编辑配送区域分组
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-22
+	 */
+	public boolean update(BuAddressGroup group){
+		return addressGroupDao.update(group);
+	}
+	
+	/**
+	 * 方法名称:根据区域分组ID验证,该区域分组是否在使用中
+	 * 功能描述:根据区域分组ID验证,该区域分组是否在使用中
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-22
+	 */
+	public boolean checkGroupIsUsed(Long groupId) {
+		return addressDao.checkGroupIsUsed(groupId);
+	}
+	
+	/**
+	 * 方法名称:根据Id删除区域分组
+	 * 功能描述:根据Id删除区域分组
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-22
+	 */
+	public boolean deleteGroupById(Long id){
+		return addressGroupDao.deleteGroupById(id);
+	}
+	
+}

+ 202 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/rider/AddressManageService.java

@@ -0,0 +1,202 @@
+package com.sapit.client.app.manage.service.rider;
+
+import com.sapit.client.app.persistence.member.MemberAddressDao;
+import com.sapit.client.app.persistence.rider.AddressDao;
+import com.sapit.client.app.persistence.rider.AddressExtraCostDao;
+import com.sapit.common.bean.rider.AddressBean;
+import com.sapit.common.entity.rider.BuAddress;
+import com.sapit.common.entity.rider.BuAddressExtraCost;
+import com.sapit.common.search.rider.AddressSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 类名称:配送区域管理服务类
+ * 类描述:处理配送区域的各种事务
+ * 
+ * 作  者:Vic
+ * 时  间:2023-05-22
+ */
+@Service
+@Transactional
+public class AddressManageService {
+	
+	@Autowired
+	private AddressDao addressDao;
+	@Autowired
+	private AddressExtraCostDao addressExtraCostDao;
+	@Autowired
+	private MemberAddressDao memberAddressDao;
+
+	
+	/**
+	 * 方法名称:保存额外配送费
+	 * 功能描述:保存额外配送费
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-25
+	 */
+	public boolean saveAddressExtraCost(BuAddressExtraCost cost){
+		return addressExtraCostDao.save(cost);
+	}
+	
+	/**
+	 * 方法名称:根据ID更新额外配送费
+	 * 功能描述:根据ID更新额外配送费
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-25
+	 */
+	public boolean updateAddressExtraCostById(Long id, Long cost){
+		return addressExtraCostDao.updateAddressExtraCostById(id, cost);
+	}
+
+	/**
+	 * 方法名称:查找全部地址,并构造bean返回
+	 * 功能描述:查找全部地址,并构造bean返回
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-23
+	 */
+	public List<AddressBean> getAllAddressList() {
+		return addressDao.getAllAddressList();
+	}
+	
+	/**
+	 * 方法名称:根据检索条件查询配送区域表列表
+	 * 功能描述:根据检索条件查询配送区域表列表
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-16
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuAddress> getAddressList(AddressSearchBean searchBean) {
+		return addressDao.getList(searchBean, " order by ADDRESS_ID desc");
+	}
+	
+	/**
+	 * 方法名称:根据ID查询配送员表实体
+	 * 功能描述:根据ID查询配送员表实体
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-21
+	 */
+	public BuAddress getAddressById(Long id) {
+		return addressDao.getAddressById(id);
+	}
+	
+	/**
+	 * 方法名称:根据检索条件查询配送员表实体
+	 * 功能描述:根据条件查询配送员表获取一条数据
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-15
+	 */
+	public BuAddress getAddress(AddressSearchBean searchBean) {
+		return (BuAddress) addressDao.getObject(searchBean);
+	}
+	
+	/**
+	 * 方法名称:新增配送区域
+	 * 功能描述:新增配送区域
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-23
+	 */
+	public boolean save(BuAddress address){
+		return addressDao.save(address);
+	}
+	
+	/**
+	 * 方法名称:编辑配送区域
+	 * 功能描述:编辑配送区域
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-22
+	 */
+	public boolean update(BuAddress address){
+		return addressDao.update(address);
+	}
+	
+	/**
+	 * 方法名称:根据ID删除区域地址
+	 * 功能描述:根据ID删除区域地址
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-24
+	 */
+	public void deleteAddressById(long id){
+		if (addressDao.deleteAddressById(id)) {
+			// 删除用户地址表数据
+			memberAddressDao.deleteMemberAddressByAddressId(id);
+			//删除额外的费用表数据
+			addressExtraCostDao.deleteAddressExtraCostByAddressId(id);
+		}
+	}
+	
+	/**
+	 * 方法名称:更新爬楼开关状态
+	 * 功能描述:更新爬楼开关状态
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-24
+	 */
+	public void updatgeClimbStatus(Long id, Long status){
+		addressDao.updatgeClimbStatus(id, status);
+	}
+	
+	/**
+	 * 方法名称:获取店铺区域的额外配送费用
+	 * 功能描述:获取店铺区域的额外配送费用
+	 * 参数说明: 
+	 * 作	 者:vic
+	 * 日	 期:2023-05-25
+	 */
+	public List<BuAddressExtraCost> getStoreAreaExtraCostList(Long addressId) {
+		return addressExtraCostDao.getStoreAreaExtraCostList(addressId);
+	}
+	
+	/**
+	 * 获取父级全名
+	 * @param addressId
+	 * @return
+	 */
+	public String getParentFullName(Long addressId) {
+		return addressDao.getParentFullName(addressId);
+	}
+	
+	/**
+	 * 方法名称:更新所有子节点的全名
+	 * 功能描述:更新所有子节点的全名
+	 * 参数说明: 
+	 * 作	 者:Yangyk
+	 * 日	 期:2023-07-25
+	 */
+	public void updateChildrenFullName(Long addressId) {
+		// 获取当前节点的子节点
+		AddressSearchBean searchBean = new AddressSearchBean();
+		searchBean.setPid(addressId.toString());
+		List<BuAddress> list = addressDao.getAddressList(searchBean);
+		for (BuAddress address : list) {
+			String fullName = addressDao.getFullName(address.getAddressId());
+			addressDao.updateFullName(address.getAddressId(), fullName);
+			this.updateChildrenFullName(address.getAddressId());
+		}
+	}
+
+
+	/**
+	 * 方法名称:根据区域ID删除用户地址
+	 * 功能描述:根据区域ID删除用户地址
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-08-08
+	 */
+	public void deleteMemberAddressByAddressId(Long id){
+		memberAddressDao.deleteMemberAddressByAddressId(id);
+
+	}
+}

+ 223 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/rider/DeliveryOrderManageService.java

@@ -0,0 +1,223 @@
+package com.sapit.client.app.manage.service.rider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.order.OrderDao;
+import com.sapit.client.app.persistence.order.OrderProgressDao;
+import com.sapit.client.app.persistence.rider.AddressDao;
+import com.sapit.client.app.persistence.rider.RiderDao;
+import com.sapit.client.app.user.service.system.CommonApiService;
+import com.sapit.common.bean.order.DeliveryOrderBean;
+import com.sapit.common.bean.order.DeliveryOrderCountBean;
+import com.sapit.common.constant.OrderProcessStatus;
+import com.sapit.common.constant.OrderType;
+import com.sapit.common.entity.order.BuOrder;
+import com.sapit.common.entity.order.BuOrderProgress;
+import com.sapit.common.entity.rider.BuAddress;
+import com.sapit.common.entity.rider.BuRider;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.mq.OrderFinishMQBean;
+import com.sapit.common.search.order.BuOrderProgressSearchBean;
+import com.sapit.common.search.order.BuOrderSearchBean;
+import com.sapit.common.util.RabbitTool;
+
+/**
+ * 类名称:配送订单管理服务类
+ * 类描述:处理配送订单的各种事务
+ * 
+ * 作  者:Vic
+ * 时  间:2023-05-26
+ */
+@Service
+@Transactional
+public class DeliveryOrderManageService {
+	
+	@Autowired
+	private OrderProgressDao orderProgressDao;
+	@Autowired
+	private OrderDao orderDao;
+	@Autowired
+	private RiderDao riderDao;
+	@Autowired
+	private AddressDao addressDao;
+	@Autowired
+	private CommonApiService commonApiService;
+	@Autowired
+	private RabbitTool rabbitTool;
+	
+	/**
+	 * 方法名称:获取配送订单统计件数
+	 * 功能描述:获取配送订单统计件数
+	 * 参数说明: 
+	 * 作	 者:vic
+	 * 日	 期:2023-05-26
+	 */
+	public DeliveryOrderCountBean getDeliveryOrderCount(BuOrderSearchBean sb) {
+		return orderDao.getDeliveryOrderCount(sb);
+	}
+	
+	/**
+	 * 方法名称:获取配送订单
+	 * 功能描述:获取配送订单
+	 * 参数说明: 
+	 * 作	 者:vic
+	 * 日	 期:2023-05-26
+	 */
+	public List<DeliveryOrderBean> getDeliveryOrderList(PageControlData page, BuOrderSearchBean sb) {
+		return orderDao.getDeliveryOrderList(page, sb);
+	}
+	
+
+	/**
+	 * 方法名称:将订单设置为完成
+	 * 功能描述:将订单设置为完成
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-30
+	 */
+	public boolean updateOrderFinish(Long id) {
+		if (orderProgressDao.updateOrderProgressFinish(id)) {
+			return orderDao.updateOrderFinish(id);
+		}
+		return false;
+	}
+	
+	/**
+	 * 方法名称:给订单分配取餐员
+	 * 功能描述:给订单分配取餐员
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-30
+	 */
+	public boolean allocationOrder(Long orderId, Long riderId, Long status) {
+		// 获取订单状态;
+		int successNum = 0;
+		if (status != null) {
+			List<String> orderIds = new ArrayList<>();
+			orderIds.add(orderId.toString());
+			if (status.equals(OrderProcessStatus.DINED)) {
+				// 取餐操作
+				successNum = this.takeOrders(riderId, orderIds);
+			} else if (status.equals(OrderProcessStatus.TACKED)) {
+				// 转单-配送
+				this.transferOrders(riderId, orderIds);
+				successNum = this.riderReceiveOrder(orderIds);
+			} else if (status.equals(OrderProcessStatus.COMPLETED)) {
+				// 配送
+				successNum = this.riderReceiveOrder(orderIds);
+			} else if (status.equals(OrderProcessStatus.DELIVERING)) {
+				// 爬楼-接单
+				this.orderDownstairs(orderIds, riderId);
+				this.orderUpstairs(orderIds);
+				successNum = 1;
+			} else if (status.equals(OrderProcessStatus.DOWNSTAIRS)) {
+				this.orderUpstairs(orderIds);
+				successNum = 1;
+			}
+		} 
+		return successNum == 1;
+	}
+	
+	public int takeOrders(Long riderId, List<String> orderIds) {
+		if (CollectionUtils.isNotEmpty(orderIds)) {
+			BuRider rider = (BuRider) riderDao.findById(BuRider.class, riderId);
+			// 批量更新订单状态
+			int successOrderNum = orderDao.updateOrderStatusDeliveryBatch(orderIds);
+			// 批量更新订单进程
+			orderProgressDao.updateToTakeOrderBatch(riderId, orderIds, rider.getIsInside() == 1L ? 1L : 2L);
+			return successOrderNum;
+		}
+		return 0;
+	}
+	
+	/**
+	 * 方法名称:转单
+	 * 功能描述:转单
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-07-14
+	 */
+	public void transferOrders(Long riderId, List<String> orderIds) {
+		if (CollectionUtils.isNotEmpty(orderIds)) {
+			// 批量更新订单进程
+			orderProgressDao.updateToTransferOrderBatch(riderId, orderIds);
+		}
+	}
+	
+	/**
+	 * 方法名称:骑手-接单
+	 * 功能描述:骑手-接单
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-07-14
+	 */
+	public int riderReceiveOrder(List<String> orderIds) {
+		if (CollectionUtils.isNotEmpty(orderIds)) {
+			// 批量更新订单进程
+			return orderProgressDao.updateToRiderReceiveOrderBatch(orderIds);
+		}
+		
+		return 0;
+	}
+	
+	public void orderDownstairs(List<String> orderIds, Long riderId) {
+		List<BuOrder> list = orderDao.getOrderListByOrderIds(orderIds);
+		if (CollectionUtils.isNotEmpty(list)) {
+			for (BuOrder order : list) {
+				if (order.getOrderType().equals(OrderType.DOWN)) {
+					// 楼下自提订单 直接标记成订单完成
+					this.finishOrder(Long.valueOf(order.getOrderId()), 2L);
+				} else if (order.getOrderType().equals(OrderType.UP)) {
+					// 判断订单送达地址,是否允许上楼,如果允许且没有爬楼员,则直接将爬楼员设置为自身
+					BuAddress address = (BuAddress) addressDao.findById(BuAddress.class, order.getAddressId());
+					Long climberId = null;
+					Long isAutoUp = 0L;
+					if (address.getRiderId() == null) {
+						climberId = riderId;
+						isAutoUp = 1L;
+					} else if (address.getRiderId() != null) {
+						// 配送员是本楼的爬楼员时
+						if (address.getRiderId().equals(riderId)) {
+							isAutoUp = 1L;
+						}
+						climberId = address.getRiderId();
+					}
+					orderProgressDao.updateToDownstairs(order.getOrderId().toString(), climberId, isAutoUp);
+				}
+			}
+		}
+
+	}
+	
+	public void finishOrder(Long orderId, Long flag) {
+		// 更新订单状态
+		orderDao.updateOrderToFinish(orderId);
+		
+		// 更新订单进程
+		BuOrderProgressSearchBean searchBean = new BuOrderProgressSearchBean();
+		searchBean.setOrderId(orderId);
+		BuOrderProgress orderProgress = orderProgressDao.getNewOrderProgress(searchBean);
+		orderProgressDao.updateToFinish(orderProgress.getOrderProgressId());
+		
+		Long sysAreaId = commonApiService.getSysAreaId();
+		// 将订单放到mq中
+		OrderFinishMQBean bean = new OrderFinishMQBean();
+		bean.setFlag(flag.toString());
+		bean.setOrderId(orderId.toString());
+		rabbitTool.putQueue("a" + sysAreaId + "orderfinish", bean);
+	}
+	
+	public void orderUpstairs(List<String> orderIds) {
+		if (CollectionUtils.isNotEmpty(orderIds)) {
+			// 批量更新订单进程
+			orderProgressDao.updateToUpstairsBatch(orderIds);
+		}
+	}
+	
+}

+ 162 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/rider/RiderManageService.java

@@ -0,0 +1,162 @@
+package com.sapit.client.app.manage.service.rider;
+
+import com.sapit.client.app.persistence.rider.RiderDao;
+import com.sapit.common.entity.rider.BuRider;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.rider.RiderSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 类名称:配送员管理服务类
+ * 类描述:处理配送员的各种事务
+ * 
+ * 作  者:Vic
+ * 时  间:2023-05-15
+ */
+@Service
+@Transactional
+public class RiderManageService {
+	
+	@Autowired
+	private RiderDao riderDao;
+
+
+	/**
+	 * 方法名称:根据检索条件查询配送员表列表(带分页)
+	 * 功能描述:根据检索条件查询配送员表列表
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-16
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuRider> getRiderList(PageControlData page, RiderSearchBean searchBean) {
+		return riderDao.getList(page, searchBean, " order by RIDER_ID desc");
+	}
+	
+	/**
+	 * 方法名称:根据检索条件查询配送员表列表
+	 * 功能描述:根据检索条件查询配送员表列表
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-16
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuRider> getRiderList(RiderSearchBean searchBean) {
+		return riderDao.getList(searchBean, " order by RIDER_ID desc");
+	}
+	
+	/**
+	 * 方法名称:根据ID查询配送员表实体
+	 * 功能描述:根据ID查询配送员表实体
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-21
+	 */
+	public BuRider getRiderById(Long id) {
+		return riderDao.getRiderById(id);
+	}
+	
+	/**
+	 * 方法名称:根据检索条件查询配送员表实体
+	 * 功能描述:根据条件查询配送员表获取一条数据
+	 * 参数说明:
+	 * 作    者:Vic
+     * 日    期:2023-05-15
+	 */
+	public BuRider getRider(RiderSearchBean searchBean) {
+		return (BuRider) riderDao.getObject(searchBean);
+	}
+	
+	/**
+	 * 方法名称:更新配送员状态(冻结,正常)
+	 * 功能描述:直接用SQL改变配送员状态
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	public void updateRiderStatus(Long riderId, Long status){
+		riderDao.updateRiderStatus(riderId, status);
+	}
+	
+	/**
+	 * 方法名称:更新配送员工作状态(工作中,休息)
+	 * 功能描述:直接用SQL改变配送员工作状态
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	public void updateWorkStatus(Long riderId, Long status){
+		riderDao.updateWorkStatus(riderId, status);
+	}
+	
+	/**
+	 * 方法名称:设置配送员取餐权限
+	 * 功能描述:直接用SQL改变配送员取餐权限
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	public void updateSortFlg(Long riderId, Long flg){
+		riderDao.updateSortFlg(riderId, flg);
+	}
+	
+	/**
+	 * 方法名称:设置配送员送餐权限
+	 * 功能描述:直接用SQL改变配送员送餐权限
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-15
+	 */
+	public void updateDeliveryFlg(Long riderId, Long flg){
+		riderDao.updateDeliveryFlg(riderId, flg);
+	}
+	
+	/**
+	 * 方法名称:设置配送员爬楼权限
+	 * 功能描述:直接用SQL改变配送员爬楼权限
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-16
+	 */
+	public void updateClimbFlg(Long riderId, Long flg){
+		riderDao.updateClimbFlg(riderId, flg);
+	}
+	
+	/**
+	 * 方法名称:新增配送员
+	 * 功能描述:新增配送员
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-16
+	 */
+	public boolean save(BuRider rider){
+		return riderDao.save(rider);
+	}
+	
+	/**
+	 * 方法名称:编辑配送员
+	 * 功能描述:编辑配送员
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-05-16
+	 */
+	public boolean update(BuRider rider){
+		return riderDao.update(rider);
+	}
+
+	/**
+	 * 方法名称:校验配送员手机号是否存在
+	 * 功能描述:校验配送员手机号是否存在
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-08-01
+	 */
+	public boolean checkRiderTel(Long id, String tel){
+		return riderDao.checkRiderTel(id,tel);
+	}
+	
+}

+ 51 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/rider/RiderOrderAcountService.java

@@ -0,0 +1,51 @@
+package com.sapit.client.app.manage.service.rider;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.rider.RiderOrderAcountDao;
+import com.sapit.common.bean.rider.RiderOrderAcountSumBean;
+import com.sapit.common.entity.rider.BuRiderOrderAcount;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.rider.RiderOrderAcountSearchBean;
+
+/**
+ * 类名称:配送订单统计服务类
+ * 类描述:处理配送订单统计的各种事务
+ * 
+ * 作  者:Vic
+ * 时  间:2023-05-30
+ */
+@Service
+@Transactional
+public class RiderOrderAcountService {
+	
+	@Autowired
+	private RiderOrderAcountDao riderOrderAcountDao;
+
+	/**
+	 * 方法名称:获取配送订单统计件数
+	 * 功能描述:获取配送订单统计件数
+	 * 参数说明: 
+	 * 作	 者:vic
+	 * 日	 期:2023-05-26
+	 */
+	public RiderOrderAcountSumBean getRiderOrderAcountSum(RiderOrderAcountSearchBean searchBean) {
+		return riderOrderAcountDao.getRiderOrderAcountSum(searchBean);
+	}
+	
+	/**
+	 * 方法名称:获取配送订单统计表数据
+	 * 功能描述:获取配送订单统计表数据
+	 * 参数说明: 
+	 * 作	 者:vic
+	 * 日	 期:2023-05-30
+	 */
+	public List<BuRiderOrderAcount> getRiderOrderAcountList(PageControlData page, RiderOrderAcountSearchBean searchBean) {
+		return riderOrderAcountDao.getRiderOrderAcountList(page, searchBean);
+	}
+	
+}

+ 179 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/setting/PrinterManageService.java

@@ -0,0 +1,179 @@
+package com.sapit.client.app.manage.service.setting;
+
+import com.sapit.client.app.persistence.setting.PrinterDao;
+import com.sapit.client.app.store.service.system.FeieyunService;
+import com.sapit.common.bean.system.PrinterBean;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.setting.BuPrinter;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.setting.PrinterSearchBean;
+import com.sapit.common.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/23 15:33
+ */
+@Service
+@Transactional
+public class PrinterManageService {
+    @Autowired
+    private PrinterDao printerDao;
+    @Autowired
+    private FeieyunService feieyunService;
+
+    /**
+     * 方法名称: 查询小票机列表(带分页)
+     * 功能描述: 查询小票机列表(带分页)
+     *
+     * 参数说明:
+     * 作   者: liucl
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+    public List<BuPrinter> getCarouselPage(PageControlData pageControlData, PrinterSearchBean searchBean){
+        return printerDao.getPrinterPage(pageControlData,searchBean);
+    }
+
+
+    /**
+     * 方法名称:小票机信息新增
+     * 功能描述:根据条件新增小票机的信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-29
+     */
+    public boolean save(BuPrinter printer) {
+        return printerDao.save(printer);
+    }
+
+    /**
+     * 方法名称:更新小票机信息
+     * 功能描述:更新小票机信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-29
+     */
+    public boolean update(BuPrinter printer) {
+        return printerDao.update(printer);
+    }
+
+
+    /**
+     * 方法名称:根据Id获取小票机实体
+     * 功能描述:根据Id获取小票机实体
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-24
+     */
+    public BuPrinter getPrinterById(Long iconId) {
+        return printerDao.getPrinterById(iconId);
+    }
+
+
+
+    /**
+     * 方法名称:小票机删除
+     * 功能描述:根据Id删除小票机
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-29
+     */
+    public void deletePrinterById(Long id) {
+        printerDao.deleteById(id);
+
+    }
+
+
+    /**
+     * 方法名称:编辑小票机
+     * 功能描述:编辑小票机
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-08-21
+     */
+    public ResultBean updatePrinter(BuPrinter printer) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        if (printer == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            if (printer.getPrinterId() == null) {
+                // 判断小票机编码是否存在
+                boolean btn = printerDao.checkExistSn(null, printer.getSn());
+                if (!btn){
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("小票机编号已经存在,请勿重复添加");
+                    return bean;
+                }
+                // 判断小票机秘钥是否存在
+                boolean btn1 = printerDao.checkExistKey(null, printer.getPrinterKey());
+                if (!btn1){
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("小票机秘钥已经存在,请勿重复添加");
+                    return bean;
+                }
+                // 新增操作
+                printer.setCreateDate(DateUtil.getSqlToday());
+                printer.setStatus(1L);
+                if (printer.getTimes() == null){
+                    printer.setTimes(1L);
+                }
+                // 飞鹅云添加小票机
+                PrinterBean printerBean = new PrinterBean();
+                printerBean.setSn(printer.getSn());
+                printerBean.setKey(printer.getPrinterKey());
+                String code = feieyunService.addPrinter(printerBean);
+                if (!code.equals("OK")){
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("飞鹅云小票机添加失败");
+                    return bean;
+                }
+                boolean rtn = printerDao.save(printer);
+                if (!rtn) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+                }
+            } else {
+                // 判断小票机编码是否存在
+                boolean btn = printerDao.checkExistSn(printer.getPrinterId(), printer.getSn());
+                if (!btn){
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("小票机编号已经存在,请勿重复添加");
+                    return bean;
+                }
+                // 判断小票机秘钥是否存在
+                boolean btn1 = printerDao.checkExistKey(printer.getPrinterId(), printer.getPrinterKey());
+                if (!btn1){
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("小票机秘钥已经存在,请勿重复添加");
+                    return bean;
+                }
+                // 更新操作
+                BuPrinter printerById = printerDao.getPrinterById(printer.getPrinterId());
+                printerById.setPrinterKey(printer.getPrinterKey());
+                printerById.setPrinterName(printer.getPrinterName());
+                printerById.setMoren(printer.getMoren());
+                printerById.setSn(printer.getSn());
+                printerById.setStoreId(printer.getStoreId());
+
+                boolean rtn = printerDao.update(printerById);
+                if (!rtn) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                    bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+                }else {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+                    bean.getRtnBean().setRtnMsg("更新成功");
+                }
+            }
+        }
+        return bean;
+    }
+}

+ 107 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/setting/SettingManageService.java

@@ -0,0 +1,107 @@
+package com.sapit.client.app.manage.service.setting;
+
+import com.sapit.client.app.persistence.setting.BuSettingDao;
+import com.sapit.common.entity.setting.BuSetting;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.util.PayChannelProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/12 17:12
+ */
+@Service
+@Transactional
+public class SettingManageService {
+
+    @Autowired
+    private BuSettingDao settingDao;
+    @Autowired
+    private PayChannelProperties payChannelProperties;
+
+    /**
+     * 方法名称:根据Id获取用户实体
+     * 功能描述:根据Id获取用户实体
+     * 参数说明:
+     * 作    者:韩冰
+     * 日    期:2020-04-15
+     */
+    public BuSetting getSettingInfo() {
+        return settingDao.getInfo();
+    }
+
+    /**
+     * 方法名称:根据Id获取系统设置
+     * 功能描述:根据Id获取系统设置
+     * 参数说明:
+     * 作    者:Vic
+     * 日    期:2020-04-15
+     */
+    public BuSetting getSettingById(Long id) {
+        return settingDao.getSettingById(id);
+    }
+
+    /**
+     * 方法名称:新增系统设置
+     * 功能描述:新增系统设置
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-12
+     */
+    public boolean save(BuSetting setting) {
+        return settingDao.save(setting);
+    }
+
+
+    /**
+     * 方法名称:更新
+     * 功能描述:更新
+     * 参数说明:
+     */
+    public boolean update(BuSetting setting) {
+        return settingDao.update(setting);
+    }
+
+    /**
+     * 方法名称:更新
+     * 功能描述:更新
+     * 参数说明:
+     */
+    public void updateContent(Long id , String content) {
+        settingDao.updateContent(id, content);
+    }
+
+
+    /**
+     * 方法名称:获取系统支付方式
+     * 功能描述:获取系统支付方式
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-09-07
+     */
+    public ResultBean getPayType() {
+        ResultBean bean = new ResultBean();
+
+        List<PayChannelProperties.Channel> channels = payChannelProperties.getChannels();
+        // 当前类型
+        Long current = payChannelProperties.getCurrentId();
+        bean.setList(channels);
+        bean.setObj(current);
+
+        return bean;
+    }
+
+    public BigDecimal getWxPoint(){
+        return new BigDecimal(settingDao.getWxPoint()).divide(new BigDecimal(1000));
+    }
+
+    public BigDecimal getSubtractWxPoint(){
+        return new BigDecimal(1).subtract(new BigDecimal(settingDao.getWxPoint()).divide(new BigDecimal(1000)));
+    }
+}

+ 49 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/settlement/OperatorSettlementService.java

@@ -0,0 +1,49 @@
+package com.sapit.client.app.manage.service.settlement;
+
+import java.util.List;
+
+import com.sapit.common.search.settlement.BuOperatorStatementNumBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.settlement.OperatorSettlementDao;
+import com.sapit.common.bean.settlement.OperatorSettlementNumBean;
+import com.sapit.common.entity.order.BuOperatorSettlement;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.settlement.BuOperatorSettlementSearchBean;
+
+/**
+ * 结算订单Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class OperatorSettlementService {
+
+	@Autowired
+	private OperatorSettlementDao operatorSettlementDao;
+	
+	/**
+	 * 方法名称:运营方结算单列表(分页)
+	 * 功能描述:运营方结算单列表(分页)
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public List<BuOperatorSettlement> page(PageControlData page, BuOperatorSettlementSearchBean searchBean) {
+		return operatorSettlementDao.page(page, searchBean);
+	}	
+	
+	/**
+	 * 方法名称:运营方结算单数字统计
+	 * 功能描述:运营方结算单数字统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public OperatorSettlementNumBean getOperatorStatementNum(BuOperatorStatementNumBean numParameterBean) {
+		return operatorSettlementDao.getOperatorStatementNum(numParameterBean);
+	}
+}

+ 117 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/settlement/StoreStatementService.java

@@ -0,0 +1,117 @@
+package com.sapit.client.app.manage.service.settlement;
+
+import java.util.List;
+import java.util.Random;
+
+import com.sapit.common.search.settlement.BuStoreStatementNumBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.settlement.DtatementDao;
+import com.sapit.client.app.persistence.settlement.StoreStatementDao;
+import com.sapit.common.bean.store.StoreStatementBean;
+import com.sapit.common.bean.store.StoreStatementNumBean;
+import com.sapit.common.entity.settlement.BuDtatement;
+import com.sapit.common.entity.settlement.BuStoreStatement;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.settlement.BuStoreStatementSearchBean;
+import com.sapit.common.util.DateUtil;
+
+/**
+ * 商家结算Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class StoreStatementService {
+
+	@Autowired
+	private StoreStatementDao storeStatementDao;
+	@Autowired
+	private DtatementDao dtatementDao;
+	
+
+	/**
+	 * 方法名称:商家结算单
+	 * 功能描述:商家结算单
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public List<StoreStatementBean> page(PageControlData page, BuStoreStatementSearchBean searchBean) {
+		return storeStatementDao.page(page, searchBean);
+	}
+	
+	/**
+	 * 方法名称:导出商家结算汇总表
+	 * 功能描述:导出商家结算汇总表
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-08-08
+	 */
+	public List<StoreStatementBean> getExportSummaryList(BuStoreStatementSearchBean searchBean) {
+		return storeStatementDao.getExportSummaryList(searchBean);
+	}
+	/**
+	 * 方法名称:按条件获取所有未结算的订单
+	 * 功能描述:按条件获取所有未结算的订单
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-13
+	 */
+	public List<BuStoreStatement> getUnStatementIds(BuStoreStatementSearchBean searchBean) {
+		return storeStatementDao.getUnStatementIds(searchBean);
+	}
+	
+	
+	/**
+	 * 方法名称:商家结算单页面数字信息
+	 * 功能描述:商家结算单页面数字信息
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public StoreStatementNumBean getStoreStatementNum(BuStoreStatementNumBean numParameterBean) {
+		return storeStatementDao.getStoreStatementNum(numParameterBean);
+	}
+	
+	/**
+	 * 方法名称:根据id结算
+	 * 功能描述:根据id结算
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-13
+	 */
+	public boolean settleByIds(String ids, Long dtatementFee) {
+		// 生成结算单号
+		int suiji = new Random().nextInt(10);
+		String dtatementNo = "J" + DateUtil.getStrToday("yyMMddHHmmssSSS") + suiji;
+		
+		long result = storeStatementDao.settleByArrayByIds(ids, dtatementNo);
+		if (result > 0) {
+			BuDtatement dtatement = new BuDtatement();
+			dtatement.setCreateDate(DateUtil.getSqlToday());
+			dtatement.setDtatementFee(dtatementFee);
+			dtatement.setDtatementNo(dtatementNo);
+			dtatement.setDtatementNum(result);
+			
+			dtatementDao.save(dtatement);
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	/**
+	 * 方法名称:商家结算统计
+	 * 功能描述:商家结算统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public List<StoreStatementBean> sumPage(PageControlData page, BuStoreStatementSearchBean searchBean) {
+		return storeStatementDao.sumPage(page, searchBean);
+	}
+}

+ 36 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/statistics/OrderSourceStatisticsService.java

@@ -0,0 +1,36 @@
+package com.sapit.client.app.manage.service.statistics;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.statistics.OrderSourceStatisticsDao;
+import com.sapit.common.bean.statistics.BuOrderSourceStatisticsBean;
+import com.sapit.common.search.statistics.OrderSourceStatisticsSearchBean;
+
+/**
+ * 订单来源统计Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class OrderSourceStatisticsService {
+
+	@Autowired
+	private OrderSourceStatisticsDao orderSourceStatisticsDao;
+	
+	/**
+	 * 方法名称:订单来源统计
+	 * 功能描述:订单来源统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public List<BuOrderSourceStatisticsBean> getOrderSourceStatistics(OrderSourceStatisticsSearchBean searchBean) {
+		return orderSourceStatisticsDao.getOrderSourceStatistics(searchBean);
+	}
+	
+}

+ 76 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/statistics/OrderStatisticsService.java

@@ -0,0 +1,76 @@
+package com.sapit.client.app.manage.service.statistics;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.client.app.persistence.settlement.StoreStatementDao;
+import com.sapit.client.app.persistence.statistics.OrderStatisticsDao;
+import com.sapit.common.bean.statistics.OperatorSettlementBean;
+import com.sapit.common.bean.statistics.StoreBrowseBean;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.statistics.OrderStatisticsSearchBean;
+import com.sapit.common.search.statistics.StoreBrowseStatisticsSearchBean;
+
+/**
+ * 订单统计Service
+ * @author Yangyk
+ *
+ */
+@Service
+@Transactional
+public class OrderStatisticsService {
+
+	@Autowired
+	private OrderStatisticsDao orderStatisticsDao;
+	
+	@Autowired
+	private StoreStatementDao storeStatementDao;
+	
+	/**
+	 * 方法名称:订单统计(总额,图表)
+	 * 功能描述:订单统计(总额,图表)
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public OperatorSettlementBean getOrderStatistics(OrderStatisticsSearchBean searchBean) {
+		return storeStatementDao.getOrderStatistics(searchBean);
+	}
+
+	/**
+	 * 方法名称:店铺浏览量统计
+	 * 功能描述:店铺浏览量统计
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-08-17
+	 */
+	public List<StoreBrowseBean> getAllStoreBrowseStatistics(StoreBrowseStatisticsSearchBean searchBean) {
+		return storeStatementDao.getAllStoreBrowseStatistics(searchBean);
+	}
+
+	/**
+	 * 方法名称:店铺浏览量统计
+	 * 功能描述:店铺浏览量统计
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-08-17
+	 */
+	public List<StoreBrowseBean> getStoreBrowseStatistics(StoreBrowseStatisticsSearchBean searchBean) {
+		return storeStatementDao.getStoreBrowseStatistics(searchBean);
+	}
+	
+	/**
+	 * 方法名称:运营数据统计
+	 * 功能描述:运营数据统计
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	public OperatorSettlementBean getOperatorStatistics(PageControlData page, OrderStatisticsSearchBean searchBean) {
+		return orderStatisticsDao.getOperatorStatistics(page, searchBean);
+	}
+	
+}

+ 137 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreAreaManageService.java

@@ -0,0 +1,137 @@
+package com.sapit.client.app.manage.service.store;
+
+import com.sapit.client.app.persistence.store.StoreAreaDao;
+import com.sapit.client.app.persistence.store.StoreDao;
+import com.sapit.common.bean.store.StoreAreaBean;
+import com.sapit.common.entity.store.BuStoreArea;
+import com.sapit.common.search.store.StoreAreaSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/16 16:38
+ */
+@Service
+@Transactional
+public class StoreAreaManageService {
+    @Autowired
+    private StoreAreaDao storeAreaDao;
+
+    @Autowired
+    private StoreDao storeDao;
+
+    /**
+     * 方法名称:获取门店区域列表List
+     * 功能描述:获取门店区域列表List
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public List<StoreAreaBean> getStoreAreaAllList(StoreAreaSearchBean searchBean) {
+        return storeAreaDao.getStoreAreaAllList(searchBean);
+    }
+
+    /**
+     * 方法名称:获取非禁用状态门店区域列表List
+     * 功能描述:获取非禁用状态门店区域列表List
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public List<BuStoreArea> getStoreAreaList(StoreAreaSearchBean searchBean) {
+        return storeAreaDao.getStoreAreaList(searchBean);
+    }
+
+    /**
+     * 方法名称:检查区域编码是否存在
+     * 功能描述:检查区域编码是否存在
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public boolean isHaveStoreAreaCode(String goodsTypeCode, Long goodsTypeId) {
+        return storeAreaDao.isHaveStoreAreaCode(goodsTypeCode, goodsTypeId);
+    }
+
+    /**
+     * 方法名称:获取门店区域信息实体
+     * 功能描述:根据ID获取门店区域信息实体
+     * 参数说明:storeAreaId:门店区域Id
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public BuStoreArea getStoreAreaById(Long storeAreaId) {
+        return storeAreaDao.getStoreAreaById(storeAreaId);
+    }
+
+    /**
+     * 方法名称:更新门店区域
+     * 功能描述:更新门店区域
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public boolean update(BuStoreArea storeArea) {
+        return storeAreaDao.update(storeArea);
+    }
+
+    /**
+     * 方法名称:新增商品分类
+     * 功能描述:新增商品分类
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public boolean save(BuStoreArea storeArea) {
+        return storeAreaDao.save(storeArea);
+    }
+
+    /**
+     * 方法名称:判断门店区域是否被使用
+     * 方法描述:判断门店区域是否被使用
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public boolean inUseStoreAreaCode(Long storeAreaId) {
+        return storeDao.inUseStoreAreaCode(storeAreaId);
+    }
+
+    /**
+     * 方法名称:根据检索条件查询门店二级区域列表
+     * 功能描述:根据检索条件查询门店二级区域列表
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public List<BuStoreArea> getSecondStoreAreaListByCode(String goodsTypeCode){
+        return storeAreaDao.getSecondStoreAreaListByCode(goodsTypeCode);
+    }
+
+    /**
+     * 方法名称:通过主键删除门店区域
+     * 功能描述:通过主键删除门店区域
+     * 参数说明:goodsTypeId:商品类型Id
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public boolean deleteStoreAreaById(Long storeAreaId) {
+        return storeAreaDao.deleteStoreAreaById(storeAreaId);
+    }
+
+    /**
+     * 方法名称:获取门店区域实体
+     * 功能描述:根据条件查询门店区域
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-16
+     */
+    public BuStoreArea getStoreArea(StoreAreaSearchBean searchBean) {
+        return (BuStoreArea) storeAreaDao.getObject(searchBean);
+    }
+}

+ 68 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreBrowseManageService.java

@@ -0,0 +1,68 @@
+package com.sapit.client.app.manage.service.store;
+
+import com.sapit.client.app.persistence.store.StoreBrowseDao;
+import com.sapit.common.bean.store.BuStoreBrowseBean;
+import com.sapit.common.search.store.StoreBrowseSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/15 11:14
+ */
+@Service
+@Transactional
+public class StoreBrowseManageService {
+
+    @Autowired
+    private StoreBrowseDao storeBrowseDao;
+
+
+    /**
+     * 方法名称:根据Id获取实体
+     * 功能描述:根据Id获取实体
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-22
+     */
+    public BuStoreBrowseBean getStoreBrowseForStore(StoreBrowseSearchBean searchBean) {
+        return storeBrowseDao.getStoreBrowseForStore(searchBean);
+    }
+
+    /**
+     * 方法名称:根据Id获取实体
+     * 功能描述:根据Id获取实体
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2020-05-22
+     */
+    public Long getStoreBrowseMaxIdForStore() {
+        return storeBrowseDao.getStoreBrowseMaxIdForStore();
+    }
+
+
+    /**
+     * 方法名称:更新门店日浏览量
+     * 功能描述:更新门店日浏览量
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public void updateStoreBrowse(Long storeId, Long num) {
+        storeBrowseDao.updateStoreBrowse(storeId,num);
+    }
+
+    /**
+     * 方法名称:门店日浏览量新增
+     * 功能描述:根据条件新增门店日浏览量
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public boolean save(BuStoreBrowseBean storeBrowse) {
+        return storeBrowseDao.save(storeBrowse);
+    }
+
+}

+ 51 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreInfoManageService.java

@@ -0,0 +1,51 @@
+package com.sapit.client.app.manage.service.store;
+
+import com.sapit.client.app.persistence.store.StoreInfoDao;
+import com.sapit.common.entity.store.BuStoreInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @version 1.0
+ * @description: 门店安全信息
+ * @author: liucl
+ * @date: 2023/5/15 11:14
+ */
+@Service
+@Transactional
+public class StoreInfoManageService {
+
+    @Autowired
+    private StoreInfoDao storeInfoDao;
+
+
+    /**
+     * 方法名称:门店安全信息新增
+     * 功能描述:门店安全信息新增
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-06-29
+     */
+    public boolean save(BuStoreInfo storeInfo) {
+        return storeInfoDao.save(storeInfo);
+    }
+
+
+    public BuStoreInfo getStoreInfoByStoreId(Long storeId){
+        return storeInfoDao.getByStoreId(storeId);
+    }
+
+
+    /**
+     * 方法名称:更新门店安全信息
+     * 功能描述:更新门店安全信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-06-29
+     */
+    public boolean update(BuStoreInfo storeInfo) {
+        return storeInfoDao.update(storeInfo);
+    }
+
+}

+ 431 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreManageService.java

@@ -0,0 +1,431 @@
+package com.sapit.client.app.manage.service.store;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.sapit.client.app.manage.service.setting.SettingManageService;
+import com.sapit.client.app.persistence.store.StoreDao;
+import com.sapit.common.constant.Flag;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.constant.Status;
+import com.sapit.common.constant.StoreBusinessStatus;
+import com.sapit.common.entity.setting.BuSetting;
+import com.sapit.common.entity.store.BuStore;
+import com.sapit.common.entity.store.BuStoreInfo;
+import com.sapit.common.entity.store.BuStoreUser;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.store.StoreSearchBean;
+import com.sapit.common.search.store.StoreUserSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.FileFtpUploadUtil;
+import com.sapit.common.util.MD5;
+import com.sapit.common.util.StringUtil;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/15 11:14
+ */
+@Service
+@Transactional
+public class StoreManageService {
+
+    @Autowired
+    private StoreDao storeDao;
+
+    @Autowired
+    private StoreInfoManageService storeInfoManageService;
+
+    @Autowired
+    private StoreUserManageService storeUserManageService;
+    
+    @Autowired
+    private SettingManageService settingManageService;
+
+    /**
+     * 方法名称:获取门店分页
+     * 功能描述:获取门店分页
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-11
+     */
+    public List<BuStore> getStorePage(PageControlData pageControlData, StoreSearchBean searchBean){
+        return storeDao.getStorePage(pageControlData,searchBean);
+    }
+
+    public List<BuStore> getStoreSort(PageControlData pageControlData, StoreSearchBean searchBean){
+        return storeDao.getStoreSort(pageControlData,searchBean);
+    }
+
+
+    public List<BuStore> getNotIndexStore(PageControlData pageControlData, StoreSearchBean searchBean){
+        return storeDao.getNotIndexStore(pageControlData,searchBean);
+    }
+
+
+    public List<BuStore> getStoreList(StoreSearchBean searchBean){
+        return storeDao.getStoreList(searchBean);
+    }
+
+
+    /**
+     * 方法名称:门店信息新增
+     * 功能描述:根据条件新增门店的信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public boolean save(BuStore area) {
+        return storeDao.save(area);
+    }
+
+    /**
+     * 方法名称:更新门店信息
+     * 功能描述:更新门店信息
+     * 参数说明:
+     * 作    者:Vic
+     * 日    期:2019-05-09
+     */
+    public boolean update(BuStore area) {
+        return storeDao.update(area);
+    }
+
+    /**
+     * 方法名称:根据Id获取用户实体
+     * 功能描述:根据Id获取用户实体
+     * 参数说明:
+     * 作    者:韩冰
+     * 日    期:2020-04-15
+     */
+    public BuStore getStoreById(Long storeId) {
+        return storeDao.getStoreById(storeId);
+    }
+
+
+    /**
+     * 方法名称:更新门店权重
+     * 功能描述:更新门店权重
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-24
+     */
+    public boolean changeSort(Long storeId, Long sortWeight) {
+        return storeDao.changeSort(storeId, sortWeight);
+    }
+
+    /**
+     * 方法名称:更新门店状态
+     * 功能描述:更新门店状态
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-05-24
+     */
+    public boolean changeStatus(Long specialFoodId, Long indexShow) {
+        return storeDao.changeStatus(specialFoodId, indexShow);
+    }
+
+    /**
+     * 方法名称:校验手机号是否存在
+     * 功能描述:校验老手机号是否存在
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-08-01
+     */
+    public boolean checkStoreUserTel(Long id, String tel){
+        return storeDao.checkStoreUserTel(id,tel);
+    }
+    
+    /**
+     * 方法名称:批量冻结解冻
+     * 功能描述:批量冻结解冻
+     * 参数说明:
+     * 作    者:Yangyk
+     * 日    期:2023-08-07
+     */
+    public int updateStoreStatusBatch(Long status, String storeIds) {
+    	return storeDao.updateStoreStatusBatch(status, storeIds);
+    }
+    
+    /**
+     * 方法名称:批量 暂停/营业
+     * 功能描述:批量 暂停/营业
+     * 参数说明:
+     * 作    者:Yangyk
+     * 日    期:2023-08-07
+     */
+    public int updateStoreBusinessStatusBatch(Long businessStatus, String storeIds) {
+    	return storeDao.updateStoreBusinessStatusBatch(businessStatus, storeIds);
+    }
+
+
+	public ResultBean updateStore(BuStore store, MultipartFile file1,MultipartFile file2, MultipartFile file3) {
+        // 定义返回结果Bean
+        ResultBean bean = new ResultBean();
+        
+        BuSetting setting = settingManageService.getSettingInfo();
+        
+        if (file1 != null && file1.getOriginalFilename() != null) {
+            if (file1.getSize() > 204800) {
+                bean.getRtnBean().setRtnMsg("图片大小超过200K,请调整清晰度之后再试!");
+                return bean;
+            }
+            String imageType = file1.getOriginalFilename().substring(file1.getOriginalFilename().lastIndexOf(".") + 1);
+            String filename = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + imageType;
+            // 上传文件
+            try {
+                if (!FileFtpUploadUtil.uploadFile("/store", filename, file1.getInputStream())) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                    return bean;
+                }
+            } catch (Exception e) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                return bean;
+            }
+            store.setIconUrl(FileFtpUploadUtil.rootURL + "/store/" + filename);
+        }
+
+        if (file2 != null && file2.getOriginalFilename() != null) {
+            if (file2.getSize() > 204800) {
+                bean.getRtnBean().setRtnMsg("图片大小超过200K,请调整清晰度之后再试!");
+                return bean;
+            }
+            String imageType = file2.getOriginalFilename().substring(file2.getOriginalFilename().lastIndexOf(".") + 1);
+            String filename = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + imageType;
+            // 上传文件
+            try {
+                if (!FileFtpUploadUtil.uploadFile("/store", filename, file2.getInputStream())) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                    return bean;
+                }
+            } catch (Exception e) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                return bean;
+            }
+            store.setLicenseOneUrl(FileFtpUploadUtil.rootURL + "/store/" + filename);
+        }
+
+        if (file3 != null && file3.getOriginalFilename() != null) {
+            if (file3.getSize() > 204800) {
+                bean.getRtnBean().setRtnMsg("图片大小超过200K,请调整清晰度之后再试!");
+                return bean;
+            }
+            String imageType = file3.getOriginalFilename().substring(file3.getOriginalFilename().lastIndexOf(".") + 1);
+            String filename = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + imageType;
+            // 上传文件
+            try {
+                if (!FileFtpUploadUtil.uploadFile("/store", filename, file3.getInputStream())) {
+                    bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                    bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                    return bean;
+                }
+            } catch (Exception e) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                bean.getRtnBean().setRtnMsg("文件上传失败,请重新尝试!");
+                return bean;
+            }
+            store.setLicenseTwoUrl(FileFtpUploadUtil.rootURL + "/store/" + filename);
+        }
+
+
+        if (store.getBusinessStart() != null){
+            String replace = store.getBusinessStart().replace(":", "");
+            store.setBusinessStart(replace);
+        }
+        if (store.getBusinessEnd() != null){
+            String replace = store.getBusinessEnd().replace(":", "");
+            store.setBusinessEnd(replace);
+        }
+        if (store.getStoreId() == null) {
+            // 新增操作
+            // 校验手机号
+            // 判断手机号是否有重复的
+            boolean btn = checkStoreUserTel(null, store.getContactPhone());
+            if (!btn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("手机号已被使用,请更换手机号");
+                return bean;
+            }
+            if (store.getAutoDine().equals(1L) && setting.getDineTime() >= store.getAutoDineTime()) {
+            	bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("自动出餐时间小于系统设置中的可自动出餐时间,请做出调整!");
+                return bean;
+            }
+
+            store.setSortWeight(0L);
+            store.setSalesCount(0L);
+            store.setNewcusDiscounts(0L);
+            store.setAutoGo(1L);
+            store.setStatus(Status.STATUS_VALID);
+            store.setCreateDate(DateUtil.getSqlToday());
+            store.setFullDiscountsStatus(Flag.FLAG_NO);
+            store.setBusinessStatus(StoreBusinessStatus.STATUS_CLOSE);
+            store.setNewStoreFlg(Status.STATUS_VALID);
+            store.setOrderValue(10f);
+            store.setCollectNum(0L);
+            store.setMoonNum(0L);
+            boolean rtn = save(store);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("新增失败,请重新尝试!");
+            }else {
+                // 判断 营业执照和经营许证
+                BuStoreInfo info = new BuStoreInfo();
+                info.setStoreId(store.getStoreId());
+                if (file2 != null || file3 != null){
+                    // 新增店铺安全信息
+                    info.setLicenseOneUrl(store.getLicenseOneUrl());
+                    info.setLicenseTwoUrl(store.getLicenseTwoUrl());
+                }
+                storeInfoManageService.save(info);
+                // 新增
+
+                // 新增店长
+                BuStoreUser storeUser = new BuStoreUser();
+                storeUser.setStoreId(store.getStoreId());
+                storeUser.setUserName(store.getContactName());
+                storeUser.setTel(store.getContactPhone());
+                storeUser.setIsManage(1L);
+                storeUser.setCreateDate(DateUtil.getSqlToday());
+                storeUser.setPassword(MD5.encrypt(store.getContactPhone()));
+
+                storeUserManageService.save(storeUser);
+
+
+                bean.getRtnBean().setRtnMsg("新增成功");
+            }
+        } else {
+
+            // 判断手机号是否有重复的
+            StoreUserSearchBean searchBean = new StoreUserSearchBean();
+            searchBean.setIsManage(1L);
+            searchBean.setId(store.getStoreId());
+
+            BuStoreUser storeUser = storeUserManageService.getStoreManage(searchBean);
+
+            boolean byTel = storeUserManageService.getStoreManageByTel(store.getContactPhone(), storeUser.getStoreUserId());
+            if (byTel){
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("手机号已使用,请勿重新使用");
+                return bean;
+            }
+            if (store.getAutoDine().equals(1L) && setting.getDineTime() >= store.getAutoDineTime()) {
+            	bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("自动出餐时间小于系统设置中的可自动出餐时间,请做出调整!");
+                return bean;
+            }
+            
+            BuStore buStore = getStoreById(store.getStoreId());
+
+
+            // 删除旧图片
+            // 门店头像
+            if (!StringUtil.isBlank(buStore.getIconUrl()) && !store.getIconUrl().equals(buStore.getIconUrl())) {
+                String filename = buStore.getIconUrl().substring(buStore.getIconUrl().lastIndexOf("/") + 1);
+                // 删除旧图片
+                FileFtpUploadUtil.deleteFile("/store", filename);
+            }
+            // 营业执照
+            if (!StringUtil.isBlank(buStore.getLicenseOneUrl()) && !store.getLicenseOneUrl().equals(buStore.getLicenseOneUrl())) {
+                String filename = buStore.getLicenseOneUrl().substring(buStore.getLicenseOneUrl().lastIndexOf("/") + 1);
+                // 删除旧图片
+                FileFtpUploadUtil.deleteFile("/store", filename);
+            }
+            // 经营许可
+            if (!StringUtil.isBlank(buStore.getLicenseTwoUrl()) && !store.getLicenseTwoUrl().equals(buStore.getLicenseTwoUrl())) {
+                String filename = buStore.getLicenseTwoUrl().substring(buStore.getLicenseTwoUrl().lastIndexOf("/") + 1);
+                // 删除旧图片
+                FileFtpUploadUtil.deleteFile("/store", filename);
+            }
+
+
+
+            buStore.setStoreName(store.getStoreName());
+            buStore.setProvince(store.getProvince());
+            buStore.setCity(store.getCity());
+            buStore.setArea(store.getArea());
+            buStore.setAddress(store.getAddress());
+            buStore.setContactName(store.getContactName());
+            buStore.setContactPhone(store.getContactPhone());
+            buStore.setBusinessStart(store.getBusinessStart());
+            buStore.setBusinessEnd(store.getBusinessEnd());
+            buStore.setStoreTypeId(store.getStoreTypeId());
+            buStore.setStoreBelongto(store.getStoreBelongto());
+            buStore.setCommissionRate(store.getCommissionRate());
+            buStore.setPickupStatus(store.getPickupStatus());
+            buStore.setTakeoutStatus(store.getTakeoutStatus());
+            buStore.setStartingPrice(store.getStartingPrice());
+            buStore.setEvaluateStatus(store.getEvaluateStatus());
+            buStore.setDineStatus(store.getDineStatus());
+            buStore.setNewcusFlg(store.getNewcusFlg());
+            buStore.setTakeawayPoint(store.getTakeawayPoint());
+            buStore.setPickupPoint(store.getPickupPoint());
+            buStore.setAutoGo(store.getAutoGo());
+            buStore.setAccountHolder(store.getAccountHolder());
+            buStore.setOpeningBank(store.getOpeningBank());
+            buStore.setAccountNumber(store.getAccountNumber());
+            buStore.setLicenseTwoUrl(store.getLicenseTwoUrl());
+            buStore.setLicenseOneUrl(store.getLicenseOneUrl());
+            buStore.setIconUrl(store.getIconUrl());
+            buStore.setAccountNumber(store.getAccountNumber());
+            buStore.setAccountHolder(store.getAccountHolder());
+            buStore.setOpeningBank(store.getOpeningBank());
+            buStore.setDoneMealTime(store.getDoneMealTime());
+            buStore.setDeliveryType(store.getDeliveryType());
+            buStore.setRiderPrice(store.getRiderPrice());
+            buStore.setAutoDine(store.getAutoDine());
+            buStore.setAutoDineTime(store.getAutoDineTime());
+            
+            // 更新操作
+            boolean rtn = update(buStore);
+            if (!rtn) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("更新失败,请重新尝试!");
+            }else {
+                // 修改店铺安全信息
+                if (file2 != null || file3 != null){
+
+                    BuStoreInfo storeInfoByStoreId = storeInfoManageService.getStoreInfoByStoreId(store.getStoreId());
+
+                    if (storeInfoByStoreId != null){
+                        // 修改
+                        storeInfoByStoreId.setLicenseOneUrl(store.getLicenseOneUrl());
+                        storeInfoByStoreId.setLicenseTwoUrl(store.getLicenseTwoUrl());
+                        storeInfoManageService.update(storeInfoByStoreId);
+                    } else {
+                        // 新增
+                        // 新增店铺安全信息表
+                        BuStoreInfo info = new BuStoreInfo();
+                        info.setStoreId(store.getStoreId());
+                        info.setLicenseOneUrl(store.getLicenseOneUrl());
+                        info.setLicenseTwoUrl(store.getLicenseTwoUrl());
+                        storeInfoManageService.save(info);
+                    }
+                }
+
+                // 修改店长
+                storeUser.setCreateDate(DateUtil.getSqlToday());
+                storeUser.setUserName(store.getContactName());
+                storeUser.setTel(store.getContactPhone());
+                storeUser.setPassword(MD5.encrypt(store.getContactPhone()));
+                storeUser.setUserName(buStore.getContactName());
+                storeUser.setTel(buStore.getContactPhone());
+                storeUser.setPassword(MD5.encrypt(buStore.getContactPhone()));
+
+                storeUserManageService.update(storeUser);
+
+                bean.getRtnBean().setRtnMsg("更新成功");
+            }
+        }
+
+        return bean;
+    }
+}

+ 100 - 0
client-app/src/main/java/com/sapit/client/app/manage/service/store/StoreUserManageService.java

@@ -0,0 +1,100 @@
+package com.sapit.client.app.manage.service.store;
+
+import com.sapit.client.app.persistence.store.StoreUserDao;
+import com.sapit.common.entity.store.BuStoreUser;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.store.StoreUserSearchBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/16 9:25
+ */
+@Service
+@Transactional
+public class StoreUserManageService {
+
+    @Autowired
+    private StoreUserDao storeUserDao;
+
+
+    /**
+     * 方法名称: 获取门店员工
+     * 功能描述:
+     *
+     * 参数说明: [pageControlData, searchBean]
+     * 作   者: liucl
+     * 日   期: 2023/5/16 9:35
+     * @return: java.util.List<com.sapit.common.entity.store.BuStoreUser>
+     **/
+    public List<BuStoreUser> getStoreUserPage(PageControlData pageControlData, StoreUserSearchBean searchBean){
+        return storeUserDao.getStoreUserPage(pageControlData,searchBean);
+    }
+
+
+    /**
+     * 方法名称: 获取门店店长
+     * 功能描述:
+     *
+     * 参数说明: [pageControlData, searchBean]
+     * 作   者: liucl
+     * 日   期: 2023/5/16 9:35
+     * @return: java.util.List<com.sapit.common.entity.store.BuStoreUser>
+     **/
+    public BuStoreUser getStoreManage(StoreUserSearchBean searchBean){
+        return storeUserDao.getStoreManage(searchBean);
+    }
+
+    public boolean getStoreManageByTel(String tel,Long storeId){
+        return storeUserDao.getStoreManageByTel(tel,storeId);
+    }
+
+    /**
+     * 方法名称:门店信息新增
+     * 功能描述:根据条件新增门店的信息
+     * 参数说明:
+     * 作       者:Liucl
+     * 日       期:2023-05-11
+     */
+    public boolean save(BuStoreUser storeUser) {
+        return storeUserDao.save(storeUser);
+    }
+
+    /**
+     * 方法名称:更新门店信息
+     * 功能描述:更新门店信息
+     * 参数说明:
+     * 作    者:Vic
+     * 日    期:2019-05-09
+     */
+    public boolean update(BuStoreUser storeUser) {
+        return storeUserDao.update(storeUser);
+    }
+
+    /**
+     * 方法名称:根据Id获取用户实体
+     * 功能描述:根据Id获取用户实体
+     * 参数说明:
+     * 作    者:韩冰
+     * 日    期:2020-04-15
+     */
+    public BuStoreUser getUserById(Long userId) {
+        return storeUserDao.getUserById(userId);
+    }
+
+    /**
+     * 方法名称:通过主键删除门店员工
+     * 功能描述:通过主键删除门店员工
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-08-08
+     */
+    public boolean deleteStoreUserById(Long id) {
+        return storeUserDao.deleteStoreUserById(id);
+    }
+}

+ 114 - 0
client-app/src/main/java/com/sapit/client/app/manage/store1/controller/StoreManage1Controller.java

@@ -0,0 +1,114 @@
+package com.sapit.client.app.manage.store1.controller;
+
+import com.sapit.client.app.manage.store1.service.StoreManage1Service;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.entity.store.BuStore;
+import com.sapit.common.entity.store.BuStoreArea;
+import com.sapit.common.framwork.AuthToken;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.store.StoreAreaSearchBean;
+import com.sapit.common.search.store.StoreSearchBean;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * New store-list module backed by the *_1 store tables.
+ */
+@RestController
+@RequestMapping(value = "storeManage1", produces = "application/json")
+public class StoreManage1Controller {
+
+    @Autowired
+    private StoreManage1Service storeManage1Service;
+
+    @PostMapping("/getStorePage")
+    @AuthToken(type = "admin")
+    public ResultBean getStorePage(int pageSize, int currentPage, StoreSearchBean searchBean) {
+        ResultBean bean = new ResultBean();
+
+        PageControlData pageControlData = new PageControlData();
+        pageControlData.setPageSize(pageSize);
+        pageControlData.setCurrentPage(currentPage);
+
+        List<BuStore> stores = storeManage1Service.getStorePage(pageControlData, searchBean);
+        bean.setList(stores);
+        bean.setPage(pageControlData);
+        return bean;
+    }
+
+    @PostMapping(value = "/getStoreAreas")
+    @AuthToken(type = "admin")
+    public ResultBean getStoreAreas(StoreAreaSearchBean searchBean) {
+        ResultBean bean = new ResultBean();
+        List<BuStoreArea> storeAreas = storeManage1Service.getStoreAreas(searchBean);
+        bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+        bean.setList(storeAreas);
+        return bean;
+    }
+
+    @PostMapping(value = "/update")
+    @AuthToken(type = "admin")
+    public ResultBean update(BuStore store,
+                             @RequestParam(value = "file1", required = false) MultipartFile file1,
+                             @RequestParam(value = "file2", required = false) MultipartFile file2,
+                             @RequestParam(value = "file3", required = false) MultipartFile file3) {
+        ResultBean bean = new ResultBean();
+        if (store == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+            return bean;
+        }
+        return storeManage1Service.updateStore(store, file1, file2, file3);
+    }
+
+    @PostMapping(value = "/changeStatus")
+    @AuthToken(type = "admin")
+    public ResultBean changeStatus(Long id, Long status) {
+        ResultBean bean = new ResultBean();
+        if (id == null || status == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else if (storeManage1Service.changeStatus(id, status)) {
+            bean.getRtnBean().setRtnCode(ReturnCode.SUCCESS);
+            bean.getRtnBean().setRtnMsg("更新成功!");
+        } else {
+            bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+            bean.getRtnBean().setRtnMsg("门店不存在!");
+        }
+        return bean;
+    }
+
+    @PostMapping(value = "/frozenBatch")
+    @AuthToken(type = "admin")
+    public ResultBean frozenBatch(Long status, String storeIds) {
+        ResultBean bean = new ResultBean();
+        if (status == null || StringUtils.isBlank(storeIds)) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            storeManage1Service.updateStoreStatusBatch(status, storeIds);
+        }
+        return bean;
+    }
+
+    @PostMapping(value = "/pauseBatch")
+    @AuthToken(type = "admin")
+    public ResultBean pauseBatch(Long status, String storeIds) {
+        ResultBean bean = new ResultBean();
+        if (status == null || StringUtils.isBlank(storeIds)) {
+            bean.getRtnBean().setRtnCode(ReturnCode.PARAM_WRONG);
+            bean.getRtnBean().setRtnMsg("参数错误!");
+        } else {
+            storeManage1Service.updateStoreBusinessStatusBatch(status, storeIds);
+        }
+        return bean;
+    }
+}

+ 289 - 0
client-app/src/main/java/com/sapit/client/app/manage/store1/persistence/StoreManage1Dao.java

@@ -0,0 +1,289 @@
+package com.sapit.client.app.manage.store1.persistence;
+
+import com.sapit.common.entity.store.BuStore;
+import com.sapit.common.entity.store.BuStoreArea;
+import com.sapit.common.entity.store.BuStoreInfo;
+import com.sapit.common.constant.Flag;
+import com.sapit.common.constant.StoreBusinessStatus;
+import com.sapit.common.framwork.BaseDao;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.store.StoreSearchBean;
+import com.sapit.common.search.store.StoreAreaSearchBean;
+import com.sapit.common.util.DateUtil;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.ArrayList;
+import java.util.List;
+
+@SuppressWarnings("rawtypes")
+@Repository
+public class StoreManage1Dao extends BaseDao {
+
+    private static final String STORE_TABLE = "bu_store1";
+    private static final String STORE_INFO_TABLE = "bu_store_info1";
+    private static final String STORE_AREA_TABLE = "bu_store_area1";
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    @SuppressWarnings("unchecked")
+    public List<BuStore> getStorePage(PageControlData pageControlData, StoreSearchBean searchBean) {
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("SELECT T.STORE_ID,T.STORE_NAME,T.PROVINCE,T.CITY,T.AREA,T.ADDRESS,T.CONTACT_NAME,T.CONTACT_PHONE,")
+                .append("T.BUSINESS_START,T.BUSINESS_END,T.BUSINESS_STATUS,T.STATUS,A.LICENSE_ONE_URL,A.LICENSE_TWO_URL,")
+                .append("T.ICON_URL,T.STORE_TYPE_ID,T.COMMISSION_RATE,T.PICKUP_STATUS,T.TAKEOUT_STATUS,")
+                .append("T.STARTING_PRICE,T.EVALUATE_STATUS,T.EVALUATE_LEVEL,T.NEWCUS_DISCOUNTS,T.NEWCUS_FLG,T.CREATE_DATE,")
+                .append("T.UPDATE_DATE,T.FULL_DISCOUNTS_STATUS,T.FULL_DISCOUNTS_START_DATE,T.FULL_DISCOUNTS_END_DATE,T.TAKEAWAY_POINT,")
+                .append("T.PICKUP_POINT,T.AUTO_GO,U1.STORE_AREA_NAME as PROVINCE_NAME ,U2.STORE_AREA_NAME AS CITY_NAME,T.ACCOUNT_HOLDER,T.OPENING_BANK, ")
+                .append("T.ACCOUNT_NUMBER,T.DONE_MEAL_TIME,T.DINE_STATUS,T.NEW_STORE_FLG,T.ORDER_VALUE,T.COLLECT_NUM,T.MOON_NUM,T.ORDER_COUNT, T.DELIVERY_TYPE, T.RIDER_PRICE, T.AUTO_DINE, T.AUTO_DINE_TIME,T.STORE_BELONGTO ")
+                .append(" FROM ").append(STORE_TABLE).append(" T LEFT JOIN ").append(STORE_AREA_TABLE).append(" U1 ON T.PROVINCE = U1.STORE_AREA_ID LEFT JOIN ")
+                .append(STORE_INFO_TABLE).append(" A ON T.STORE_ID = A.STORE_ID ")
+                .append(" LEFT JOIN ").append(STORE_AREA_TABLE).append(" U2 ON T.CITY = U2.STORE_AREA_ID WHERE 1 = 1 ")
+                .append(searchBean.getSerchCondition()).append(" ORDER BY T.STORE_ID DESC");
+
+        List<Object> list = this.searchBySql(pageControlData, sql.toString());
+        List<BuStore> stores = new ArrayList<>();
+
+        for (Object item : list) {
+            Object[] obj = (Object[]) item;
+            BuStore store = new BuStore();
+            store.setStoreId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+            store.setStoreName(obj[1] == null ? null : obj[1].toString());
+            store.setProvince(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+            store.setCity(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+            store.setArea(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+            store.setAddress(obj[5] == null ? null : obj[5].toString());
+            store.setContactName(obj[6] == null ? null : obj[6].toString());
+            store.setContactPhone(obj[7] == null ? null : obj[7].toString());
+            store.setBusinessStart(obj[8] == null ? null : obj[8].toString());
+            store.setBusinessEnd(obj[9] == null ? null : obj[9].toString());
+            store.setBusinessStatus(obj[10] == null ? null : Long.valueOf(obj[10].toString()));
+            store.setStatus(obj[11] == null ? null : Long.valueOf(obj[11].toString()));
+            store.setLicenseOneUrl(obj[12] == null ? null : obj[12].toString());
+            store.setLicenseTwoUrl(obj[13] == null ? null : obj[13].toString());
+            store.setIconUrl(obj[14] == null ? null : obj[14].toString());
+            store.setStoreTypeId(obj[15] == null ? null : Long.valueOf(obj[15].toString()));
+            store.setCommissionRate(obj[16] == null ? null : Long.valueOf(obj[16].toString()));
+            store.setPickupStatus(obj[17] == null ? null : Long.valueOf(obj[17].toString()));
+            store.setTakeoutStatus(obj[18] == null ? null : Long.valueOf(obj[18].toString()));
+            store.setStartingPrice(obj[19] == null ? null : Long.valueOf(obj[19].toString()));
+            store.setEvaluateStatus(obj[20] == null ? null : Long.valueOf(obj[20].toString()));
+            store.setEvaluateLevel(obj[21] == null ? null : obj[21].toString());
+            store.setNewcusDiscounts(obj[22] == null ? null : Long.valueOf(obj[22].toString()));
+            store.setNewcusFlg(obj[23] == null ? null : Long.valueOf(obj[23].toString()));
+            store.setCreateDate(obj[24] == null ? null : Timestamp.valueOf(obj[24].toString()));
+            store.setUpdateDate(obj[25] == null ? null : Timestamp.valueOf(obj[25].toString()));
+            store.setFullDiscountsStatus(obj[26] == null ? null : Long.valueOf(obj[26].toString()));
+            store.setFullDiscountsStartDate(obj[27] == null ? null : DateUtil.getDateByString(obj[27].toString(), "yyyy-MM-dd"));
+            store.setFullDiscountsEndDate(obj[28] == null ? null : DateUtil.getDateByString(obj[28].toString(), "yyyy-MM-dd"));
+            store.setTakeawayPoint(obj[29] == null ? null : Long.valueOf(obj[29].toString()));
+            store.setPickupPoint(obj[30] == null ? null : Long.valueOf(obj[30].toString()));
+            store.setAutoGo(obj[31] == null ? null : Long.valueOf(obj[31].toString()));
+            store.setProvinceName(obj[32] == null ? null : obj[32].toString());
+            store.setCityName(obj[33] == null ? null : obj[33].toString());
+            store.setAccountHolder(obj[34] == null ? null : obj[34].toString());
+            store.setOpeningBank(obj[35] == null ? null : obj[35].toString());
+            store.setAccountNumber(obj[36] == null ? null : obj[36].toString());
+            store.setDoneMealTime(obj[37] == null ? null : Long.valueOf(obj[37].toString()));
+            store.setDineStatus(obj[38] == null ? null : Long.valueOf(obj[38].toString()));
+            store.setNewStoreFlg(obj[39] == null ? null : Long.valueOf(obj[39].toString()));
+            store.setOrderValue(obj[40] == null ? null : Float.valueOf(obj[40].toString()));
+            store.setCollectNum(obj[41] == null ? null : Long.valueOf(obj[41].toString()));
+            store.setMoonNum(obj[42] == null ? null : Long.valueOf(obj[42].toString()));
+            store.setSalesCount(obj[43] == null ? null : Long.valueOf(obj[43].toString()));
+            store.setDeliveryType(obj[44] == null ? null : Long.valueOf(obj[44].toString()));
+            store.setRiderPrice(obj[45] == null ? null : Long.valueOf(obj[45].toString()));
+            store.setAutoDine(obj[46] == null ? 0L : Long.valueOf(obj[46].toString()));
+            store.setAutoDineTime(obj[47] == null ? null : Long.valueOf(obj[47].toString()));
+            store.setStoreBelongto(obj[48] == null ? null : Long.valueOf(obj[48].toString()));
+
+            stores.add(store);
+        }
+        return stores;
+    }
+
+    public BuStore getStoreById(Long storeId) {
+        StoreSearchBean searchBean = new StoreSearchBean();
+        searchBean.setStoreId(storeId);
+        List<BuStore> stores = getStorePage(null, searchBean);
+        return stores.isEmpty() ? null : stores.get(0);
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<BuStoreArea> getStoreAreas(StoreAreaSearchBean searchBean) {
+        String sql = "SELECT STORE_AREA_ID,STORE_AREA_NAME,STORE_AREA_LEVEL,CREATE_DATE,STATUS,PID FROM "
+                + STORE_AREA_TABLE + " where 1 = 1 " + searchBean.getSerchCondition() + " order by STORE_AREA_LEVEL ,PID,STORE_AREA_ID ";
+        List<Object> list = this.searchBySql(sql);
+        List<BuStoreArea> areas = new ArrayList<>();
+        for (Object item : list) {
+            Object[] obj = (Object[]) item;
+            BuStoreArea area = new BuStoreArea();
+            area.setStoreAreaId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+            area.setStoreAreaName(obj[1] == null ? null : obj[1].toString());
+            area.setStoreAreaLevel(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+            area.setCreateDate(obj[3] == null ? null : Timestamp.valueOf(obj[3].toString()));
+            area.setStatus(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+            area.setPid(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+            areas.add(area);
+        }
+        return areas;
+    }
+
+    @Transactional
+    public boolean changeStatus(Long id, Long status) {
+        String sql = "update " + STORE_TABLE + " set STATUS = " + status + " where STORE_ID = " + id;
+        return this.executeSql(sql) >= 1;
+    }
+
+    @Transactional
+    public int updateStoreStatusBatch(Long status, String storeIds) {
+        String sql;
+        if (status.equals(Flag.FLAG_NO)) {
+            sql = "update " + STORE_TABLE + " set STATUS = " + StoreBusinessStatus.STATUS_CLOSE + " WHERE STORE_ID IN ( " + storeIds + " ) AND STATUS = " + StoreBusinessStatus.STATUS_VALID;
+        } else {
+            sql = "update " + STORE_TABLE + " set STATUS = " + StoreBusinessStatus.STATUS_VALID + " WHERE STORE_ID IN ( " + storeIds + " ) AND STATUS = " + StoreBusinessStatus.STATUS_CLOSE;
+        }
+        return this.executeSql(sql);
+    }
+
+    @Transactional
+    public int updateStoreBusinessStatusBatch(Long businessStatus, String storeIds) {
+        int successNum;
+        if (businessStatus.equals(Flag.FLAG_YES)) {
+            Date date = new Date();
+            String time = DateUtil.getDateStr(date, "HHmm");
+            String sql = "update " + STORE_TABLE + " set BUSINESS_STATUS = " + StoreBusinessStatus.STATUS_VALID + " where STORE_ID in ( " + storeIds + " ) and BUSINESS_START < " + time + " and BUSINESS_END > " + time;
+            successNum = this.executeSql(sql);
+            sql = "update " + STORE_TABLE + " set BUSINESS_STATUS = " + StoreBusinessStatus.STATUS_CLOSE + " where STORE_ID in ( " + storeIds + " ) and (BUSINESS_START > " + time + " or BUSINESS_END < " + time + ")";
+            this.executeSql(sql);
+        } else {
+            String sql = "update " + STORE_TABLE + " set BUSINESS_STATUS = " + StoreBusinessStatus.STATUS_PAUSE + " WHERE STORE_ID IN ( " + storeIds + " )";
+            successNum = this.executeSql(sql);
+        }
+        return successNum;
+    }
+
+    @Transactional
+    public Long insertStore(BuStore store) {
+        String sql = "INSERT INTO " + STORE_TABLE + " ("
+                + "STORE_NAME,PROVINCE,CITY,AREA,ADDRESS,CONTACT_NAME,CONTACT_PHONE,BUSINESS_START,BUSINESS_END,"
+                + "BUSINESS_STATUS,STATUS,ICON_URL,STORE_TYPE_ID,COMMISSION_RATE,PICKUP_STATUS,TAKEOUT_STATUS,"
+                + "STARTING_PRICE,EVALUATE_STATUS,EVALUATE_LEVEL,NEWCUS_DISCOUNTS,NEWCUS_FLG,CREATE_DATE,"
+                + "FULL_DISCOUNTS_STATUS,TAKEAWAY_POINT,PICKUP_POINT,AUTO_GO,ACCOUNT_HOLDER,OPENING_BANK,"
+                + "ACCOUNT_NUMBER,DONE_MEAL_TIME,DINE_STATUS,NEW_STORE_FLG,ORDER_VALUE,COLLECT_NUM,MOON_NUM,"
+                + "SALES_COUNT,DELIVERY_TYPE,RIDER_PRICE,AUTO_DINE,AUTO_DINE_TIME,STORE_BELONGTO,SORT_WEIGHT"
+                + ") VALUES ("
+                + ":storeName,:province,:city,:area,:address,:contactName,:contactPhone,:businessStart,:businessEnd,"
+                + ":businessStatus,:status,:iconUrl,:storeTypeId,:commissionRate,:pickupStatus,:takeoutStatus,"
+                + ":startingPrice,:evaluateStatus,:evaluateLevel,:newcusDiscounts,:newcusFlg,:createDate,"
+                + ":fullDiscountsStatus,:takeawayPoint,:pickupPoint,:autoGo,:accountHolder,:openingBank,"
+                + ":accountNumber,:doneMealTime,:dineStatus,:newStoreFlg,:orderValue,:collectNum,:moonNum,"
+                + ":salesCount,:deliveryType,:riderPrice,:autoDine,:autoDineTime,:storeBelongto,:sortWeight"
+                + ")";
+        Query query = entityManager.createNativeQuery(sql);
+        bindStoreParams(query, store, true);
+        int count = query.executeUpdate();
+        if (count < 1) {
+            return null;
+        }
+        Object id = entityManager.createNativeQuery("SELECT LAST_INSERT_ID()").getSingleResult();
+        return id == null ? null : Long.valueOf(id.toString());
+    }
+
+    @Transactional
+    public boolean updateStore(BuStore store) {
+        String sql = "UPDATE " + STORE_TABLE + " SET "
+                + "STORE_NAME=:storeName,PROVINCE=:province,CITY=:city,AREA=:area,ADDRESS=:address,"
+                + "CONTACT_NAME=:contactName,CONTACT_PHONE=:contactPhone,BUSINESS_START=:businessStart,BUSINESS_END=:businessEnd,"
+                + "BUSINESS_STATUS=:businessStatus,STATUS=:status,ICON_URL=:iconUrl,STORE_TYPE_ID=:storeTypeId,"
+                + "COMMISSION_RATE=:commissionRate,PICKUP_STATUS=:pickupStatus,TAKEOUT_STATUS=:takeoutStatus,"
+                + "STARTING_PRICE=:startingPrice,EVALUATE_STATUS=:evaluateStatus,EVALUATE_LEVEL=:evaluateLevel,"
+                + "NEWCUS_DISCOUNTS=:newcusDiscounts,NEWCUS_FLG=:newcusFlg,FULL_DISCOUNTS_STATUS=:fullDiscountsStatus,"
+                + "TAKEAWAY_POINT=:takeawayPoint,PICKUP_POINT=:pickupPoint,"
+                + "AUTO_GO=:autoGo,ACCOUNT_HOLDER=:accountHolder,OPENING_BANK=:openingBank,ACCOUNT_NUMBER=:accountNumber,"
+                + "DONE_MEAL_TIME=:doneMealTime,DINE_STATUS=:dineStatus,DELIVERY_TYPE=:deliveryType,RIDER_PRICE=:riderPrice,"
+                + "AUTO_DINE=:autoDine,AUTO_DINE_TIME=:autoDineTime,STORE_BELONGTO=:storeBelongto,"
+                + "NEW_STORE_FLG=:newStoreFlg,ORDER_VALUE=:orderValue,COLLECT_NUM=:collectNum,MOON_NUM=:moonNum,"
+                + "SALES_COUNT=:salesCount,SORT_WEIGHT=:sortWeight "
+                + "WHERE STORE_ID=:storeId";
+        Query query = entityManager.createNativeQuery(sql);
+        bindStoreParams(query, store, false);
+        query.setParameter("storeId", store.getStoreId());
+        return query.executeUpdate() >= 1;
+    }
+
+    @Transactional
+    public void saveOrUpdateStoreInfo(BuStoreInfo info) {
+        String countSql = "SELECT COUNT(*) FROM " + STORE_INFO_TABLE + " WHERE STORE_ID = :storeId";
+        Object count = entityManager.createNativeQuery(countSql)
+                .setParameter("storeId", info.getStoreId())
+                .getSingleResult();
+        if (Long.valueOf(count.toString()) > 0) {
+            entityManager.createNativeQuery("UPDATE " + STORE_INFO_TABLE + " SET LICENSE_ONE_URL=:licenseOneUrl, LICENSE_TWO_URL=:licenseTwoUrl WHERE STORE_ID=:storeId")
+                    .setParameter("licenseOneUrl", info.getLicenseOneUrl())
+                    .setParameter("licenseTwoUrl", info.getLicenseTwoUrl())
+                    .setParameter("storeId", info.getStoreId())
+                    .executeUpdate();
+        } else {
+            entityManager.createNativeQuery("INSERT INTO " + STORE_INFO_TABLE + " (STORE_ID, LICENSE_ONE_URL, LICENSE_TWO_URL) VALUES (:storeId, :licenseOneUrl, :licenseTwoUrl)")
+                    .setParameter("storeId", info.getStoreId())
+                    .setParameter("licenseOneUrl", info.getLicenseOneUrl())
+                    .setParameter("licenseTwoUrl", info.getLicenseTwoUrl())
+                    .executeUpdate();
+        }
+    }
+
+    private void bindStoreParams(Query query, BuStore store, boolean includeCreateDate) {
+        query.setParameter("storeName", store.getStoreName());
+        query.setParameter("province", store.getProvince());
+        query.setParameter("city", store.getCity());
+        query.setParameter("area", store.getArea());
+        query.setParameter("address", store.getAddress());
+        query.setParameter("contactName", store.getContactName());
+        query.setParameter("contactPhone", store.getContactPhone());
+        query.setParameter("businessStart", store.getBusinessStart());
+        query.setParameter("businessEnd", store.getBusinessEnd());
+        query.setParameter("businessStatus", store.getBusinessStatus());
+        query.setParameter("status", store.getStatus());
+        query.setParameter("iconUrl", store.getIconUrl());
+        query.setParameter("storeTypeId", store.getStoreTypeId());
+        query.setParameter("commissionRate", store.getCommissionRate());
+        query.setParameter("pickupStatus", store.getPickupStatus());
+        query.setParameter("takeoutStatus", store.getTakeoutStatus());
+        query.setParameter("startingPrice", store.getStartingPrice());
+        query.setParameter("evaluateStatus", store.getEvaluateStatus());
+        query.setParameter("evaluateLevel", store.getEvaluateLevel());
+        query.setParameter("newcusDiscounts", store.getNewcusDiscounts());
+        query.setParameter("newcusFlg", store.getNewcusFlg());
+        if (includeCreateDate) {
+            query.setParameter("createDate", store.getCreateDate());
+        }
+        query.setParameter("fullDiscountsStatus", store.getFullDiscountsStatus());
+        query.setParameter("takeawayPoint", store.getTakeawayPoint());
+        query.setParameter("pickupPoint", store.getPickupPoint());
+        query.setParameter("autoGo", store.getAutoGo());
+        query.setParameter("accountHolder", store.getAccountHolder());
+        query.setParameter("openingBank", store.getOpeningBank());
+        query.setParameter("accountNumber", store.getAccountNumber());
+        query.setParameter("doneMealTime", store.getDoneMealTime());
+        query.setParameter("dineStatus", store.getDineStatus());
+        query.setParameter("newStoreFlg", store.getNewStoreFlg());
+        query.setParameter("orderValue", store.getOrderValue());
+        query.setParameter("collectNum", store.getCollectNum());
+        query.setParameter("moonNum", store.getMoonNum());
+        query.setParameter("salesCount", store.getSalesCount());
+        query.setParameter("deliveryType", store.getDeliveryType());
+        query.setParameter("riderPrice", store.getRiderPrice());
+        query.setParameter("autoDine", store.getAutoDine());
+        query.setParameter("autoDineTime", store.getAutoDineTime());
+        query.setParameter("storeBelongto", store.getStoreBelongto());
+        query.setParameter("sortWeight", store.getSortWeight());
+    }
+}

+ 183 - 0
client-app/src/main/java/com/sapit/client/app/manage/store1/service/StoreManage1Service.java

@@ -0,0 +1,183 @@
+package com.sapit.client.app.manage.store1.service;
+
+import com.sapit.client.app.manage.service.setting.SettingManageService;
+import com.sapit.client.app.manage.store1.persistence.StoreManage1Dao;
+import com.sapit.common.constant.Flag;
+import com.sapit.common.constant.ReturnCode;
+import com.sapit.common.constant.Status;
+import com.sapit.common.constant.StoreBusinessStatus;
+import com.sapit.common.entity.setting.BuSetting;
+import com.sapit.common.entity.store.BuStore;
+import com.sapit.common.entity.store.BuStoreArea;
+import com.sapit.common.entity.store.BuStoreInfo;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.framwork.ResultBean;
+import com.sapit.common.search.store.StoreAreaSearchBean;
+import com.sapit.common.search.store.StoreSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.FileFtpUploadUtil;
+import com.sapit.common.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@Service
+@Transactional
+public class StoreManage1Service {
+
+    @Autowired
+    private StoreManage1Dao storeManage1Dao;
+
+    @Autowired
+    private SettingManageService settingManageService;
+
+    public List<BuStore> getStorePage(PageControlData pageControlData, StoreSearchBean searchBean) {
+        return storeManage1Dao.getStorePage(pageControlData, searchBean);
+    }
+
+    public List<BuStoreArea> getStoreAreas(StoreAreaSearchBean searchBean) {
+        return storeManage1Dao.getStoreAreas(searchBean);
+    }
+
+    public boolean changeStatus(Long storeId, Long status) {
+        return storeManage1Dao.changeStatus(storeId, status);
+    }
+
+    public int updateStoreStatusBatch(Long status, String storeIds) {
+        return storeManage1Dao.updateStoreStatusBatch(status, storeIds);
+    }
+
+    public int updateStoreBusinessStatusBatch(Long businessStatus, String storeIds) {
+        return storeManage1Dao.updateStoreBusinessStatusBatch(businessStatus, storeIds);
+    }
+
+    public ResultBean updateStore(BuStore store, MultipartFile file1, MultipartFile file2, MultipartFile file3) {
+        ResultBean bean = new ResultBean();
+        BuSetting setting = settingManageService.getSettingInfo();
+
+        if (!uploadImage(bean, file1, 1, store) || !uploadImage(bean, file2, 2, store) || !uploadImage(bean, file3, 3, store)) {
+            return bean;
+        }
+        if (store.getBusinessStart() != null) {
+            store.setBusinessStart(store.getBusinessStart().replace(":", ""));
+        }
+        if (store.getBusinessEnd() != null) {
+            store.setBusinessEnd(store.getBusinessEnd().replace(":", ""));
+        }
+        if (store.getAutoDine() != null && store.getAutoDine().equals(1L) && setting.getDineTime() >= store.getAutoDineTime()) {
+            bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+            bean.getRtnBean().setRtnMsg("自动出餐时间小于系统设置中的可自动出餐时间,请调整!");
+            return bean;
+        }
+
+        if (store.getStoreId() == null) {
+            store.setSortWeight(0L);
+            store.setSalesCount(0L);
+            store.setNewcusDiscounts(0L);
+            store.setAutoGo(1L);
+            store.setStatus(Status.STATUS_VALID);
+            store.setCreateDate(DateUtil.getSqlToday());
+            store.setFullDiscountsStatus(Flag.FLAG_NO);
+            store.setBusinessStatus(StoreBusinessStatus.STATUS_CLOSE);
+            store.setNewStoreFlg(Status.STATUS_VALID);
+            store.setOrderValue(10f);
+            store.setCollectNum(0L);
+            store.setMoonNum(0L);
+
+            Long storeId = storeManage1Dao.insertStore(store);
+            if (storeId == null) {
+                bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+                bean.getRtnBean().setRtnMsg("新增失败,请重试!");
+                return bean;
+            }
+            saveInfo(storeId, store);
+            bean.getRtnBean().setRtnMsg("新增成功");
+            return bean;
+        }
+
+        BuStore oldStore = storeManage1Dao.getStoreById(store.getStoreId());
+        if (oldStore == null) {
+            bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+            bean.getRtnBean().setRtnMsg("门店不存在!");
+            return bean;
+        }
+
+        deleteOldImage(oldStore.getIconUrl(), store.getIconUrl());
+        deleteOldImage(oldStore.getLicenseOneUrl(), store.getLicenseOneUrl());
+        deleteOldImage(oldStore.getLicenseTwoUrl(), store.getLicenseTwoUrl());
+        copyReadonlyValues(oldStore, store);
+
+        if (!storeManage1Dao.updateStore(store)) {
+            bean.getRtnBean().setRtnCode(ReturnCode.FAILED);
+            bean.getRtnBean().setRtnMsg("更新失败,请重试!");
+            return bean;
+        }
+        saveInfo(store.getStoreId(), store);
+        bean.getRtnBean().setRtnMsg("更新成功");
+        return bean;
+    }
+
+    private void saveInfo(Long storeId, BuStore store) {
+        BuStoreInfo info = new BuStoreInfo();
+        info.setStoreId(storeId);
+        info.setLicenseOneUrl(store.getLicenseOneUrl());
+        info.setLicenseTwoUrl(store.getLicenseTwoUrl());
+        storeManage1Dao.saveOrUpdateStoreInfo(info);
+    }
+
+    private void copyReadonlyValues(BuStore source, BuStore target) {
+        target.setBusinessStatus(source.getBusinessStatus());
+        target.setStatus(source.getStatus());
+        target.setNewcusDiscounts(source.getNewcusDiscounts());
+        target.setFullDiscountsStatus(source.getFullDiscountsStatus());
+        target.setNewStoreFlg(source.getNewStoreFlg());
+        target.setOrderValue(source.getOrderValue());
+        target.setCollectNum(source.getCollectNum());
+        target.setMoonNum(source.getMoonNum());
+        target.setSalesCount(source.getSalesCount());
+        target.setSortWeight(source.getSortWeight());
+    }
+
+    private boolean uploadImage(ResultBean bean, MultipartFile file, int type, BuStore store) {
+        if (file == null || file.getOriginalFilename() == null) {
+            return true;
+        }
+        if (file.getSize() > 204800) {
+            bean.getRtnBean().setRtnMsg("图片大小超过200K,请调整清晰度之后再试!");
+            return false;
+        }
+        String originalFilename = file.getOriginalFilename();
+        String imageType = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
+        String filename = DateUtil.getStrToday("yyyyMMddHHmmssSSS") + "." + imageType;
+        try {
+            if (!FileFtpUploadUtil.uploadFile("/store", filename, file.getInputStream())) {
+                bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+                bean.getRtnBean().setRtnMsg("文件上传失败,请重试!");
+                return false;
+            }
+        } catch (Exception e) {
+            bean.getRtnBean().setRtnCode(ReturnCode.SYSTEMERR);
+            bean.getRtnBean().setRtnMsg("文件上传失败,请重试!");
+            return false;
+        }
+        String url = FileFtpUploadUtil.rootURL + "/store/" + filename;
+        if (type == 1) {
+            store.setIconUrl(url);
+        } else if (type == 2) {
+            store.setLicenseOneUrl(url);
+        } else {
+            store.setLicenseTwoUrl(url);
+        }
+        return true;
+    }
+
+    private void deleteOldImage(String oldUrl, String newUrl) {
+        if (!StringUtil.isBlank(oldUrl) && !oldUrl.equals(newUrl)) {
+            String filename = oldUrl.substring(oldUrl.lastIndexOf("/") + 1);
+            FileFtpUploadUtil.deleteFile("/store", filename);
+        }
+    }
+}

+ 377 - 0
client-app/src/main/java/com/sapit/client/app/persistence/goods/EvaluateDao.java

@@ -0,0 +1,377 @@
+package com.sapit.client.app.persistence.goods;
+
+
+import com.sapit.common.bean.mobile.EvaluateBean;
+import com.sapit.common.entity.goods.BuEvaluate;
+import com.sapit.common.framwork.BaseDao;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.goods.BuEvaluateSearchBean;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @version 1.0
+ * @author: liucl
+ * @date: 2023/5/16 19:13
+ */
+@SuppressWarnings("rawtypes")
+@Repository
+public class EvaluateDao extends BaseDao {
+
+    public EvaluateDao() {
+        super.setEntity("BuEvaluate");
+    }
+
+    /**
+     * 方法名称:获取商品评价
+     * 功能描述:获取商品评价(带分页)
+     * 参数说明:
+     * 作	 者:jinw
+     * 日	 期:2026-7-23
+     */
+
+    @SuppressWarnings("unchecked")
+    public List<BuEvaluate> getEvaluateList(PageControlData pageControlData, BuEvaluateSearchBean searchBean) {
+
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("SELECT T.EVALUATE_ID,T.ORDER_ID,T.MEMBER_ID,T.SALES_SCORE,T.GOODS_SCORE,T.PACK_SCORE,T.RIDER_SCORE,")
+                .append("T.CONTENT,T.PICTURE_URL,T.CREATE_DATE,T.STORE_ID,T.REPLY,T.STATUS,T.REPLY_DATE,")
+                .append("W.MEMBER_NAME,S.STORE_NAME,W.HEADIMGURL ")
+                .append(" FROM bu_evaluate T LEFT JOIN bu_member W ON T.MEMBER_ID = W.MEMBER_ID ")
+                .append(" LEFT JOIN bu_store S ON T.STORE_ID = S.STORE_ID ")
+                .append(" WHERE 1=1 AND T.STATUS !=3 AND T.STATUS != 0 ");
+
+        Map<String, Object> params = new HashMap<>();
+
+        if (searchBean.getLevel() != null) {
+            if ("1".equals(searchBean.getLevel())) {
+                sql.append(" and GOODS_SCORE > 3 ");
+            } else if ("2".equals(searchBean.getLevel())) {
+                sql.append(" and GOODS_SCORE = 3 ");
+            } else if ("3".equals(searchBean.getLevel())) {
+                sql.append(" and GOODS_SCORE < 3 ");
+            }
+        }
+
+        if (searchBean.getEvaluateId() != null) {
+            sql.append(" AND T.EVALUATE_ID = :evaluateId ");
+            params.put("evaluateId", searchBean.getEvaluateId());
+        }
+        if (searchBean.getStoreId() != null) {
+            sql.append(" AND T.STORE_ID = :storeId ");
+            params.put("storeId", searchBean.getStoreId());
+        }
+        if (searchBean.getStatus() != null) {
+            sql.append(" AND T.STATUS = :status ");
+            params.put("status", searchBean.getStatus());
+        }
+        if (searchBean.getNoStatus() != null) {
+            sql.append(" AND T.STATUS != :noStatus ");
+            params.put("noStatus", searchBean.getNoStatus());
+        }
+        if (searchBean.getMemberId() != null) {
+            sql.append(" AND T.MEMBER_ID = :memberId ");
+            params.put("memberId", searchBean.getMemberId());
+        }
+        if (searchBean.getOrderId() != null) {
+            sql.append(" AND T.ORDER_ID = :orderId ");
+            params.put("orderId", searchBean.getOrderId());
+        }
+        if (searchBean.getStartDate() != null && !searchBean.getStartDate().isEmpty()) {
+            sql.append(" AND date_format(T.REPLY_DATE,'%Y/%m/%d %H:%i:%s') >= :startDate ");
+            params.put("startDate", searchBean.getStartDate());
+        }
+        if (searchBean.getEndDate() != null && !searchBean.getEndDate().isEmpty()) {
+            sql.append(" AND date_format(T.REPLY_DATE,'%Y/%m/%d %H:%i:%s') <= :endDate ");
+            params.put("endDate", searchBean.getEndDate());
+        }
+
+        sql.append(" order by T.EVALUATE_ID desc");
+
+        List<Object> list = this.searchBySql(pageControlData, sql.toString(), params);
+        List<BuEvaluate> evaluates = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            Object[] obj = (Object[]) list.get(i);
+
+            BuEvaluate evaluate = new BuEvaluate();
+            evaluate.setEvaluateId(obj[0] == null ? null :  Long.valueOf(obj[0].toString()));
+            evaluate.setOrderId(obj[1] == null ? null :  Long.valueOf(obj[1].toString()));
+            evaluate.setMemberId(obj[2] == null ? null :  Long.valueOf(obj[2].toString()));
+            evaluate.setSalesScore(obj[3] == null ? null :  Long.valueOf(obj[3].toString()));
+            evaluate.setGoodsScore(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+            evaluate.setPackScore(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+            evaluate.setRiderScore(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+            evaluate.setContent(obj[7] == null ? null : obj[7].toString());
+            evaluate.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+            evaluate.setCreateDate(obj[9] == null ? null : Timestamp.valueOf(obj[9].toString()));
+            evaluate.setStoreId(obj[10] == null ? null : Long.valueOf(obj[10].toString()));
+            evaluate.setReply(obj[11] == null ? null : obj[11].toString());
+            evaluate.setStatus(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+            evaluate.setReplyDate(obj[13] == null ? null : Timestamp.valueOf(obj[13].toString()));
+            evaluate.setMemberName(obj[14] == null ? null : obj[14].toString());
+            evaluate.setStoreName(obj[15] == null ? null : obj[15].toString());
+            evaluate.setHeadimgurl(obj[16] == null ? null : obj[16].toString());
+            evaluates.add(evaluate);
+        }
+        return evaluates;
+    }
+
+    @Transactional
+    public void deleteEvaluateById(Long id){
+        String sql = "update bu_evaluate set STATUS = 3 where EVALUATE_ID = :id";
+        Map<String, Object> params = new HashMap<>();
+        params.put("id", id);
+        this.executeSql(sql, params);
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<BuEvaluate> getEvaluateListByStoreId(BuEvaluateSearchBean searchBean) {
+
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("SELECT T.EVALUATE_ID,T.ORDER_ID,T.MEMBER_ID,T.SALES_SCORE,T.GOODS_SCORE,T.PACK_SCORE,T.RIDER_SCORE,")
+                .append("T.CONTENT,T.PICTURE_URL,T.CREATE_DATE,T.STORE_ID,T.REPLY,T.STATUS,T.REPLY_DATE,")
+                .append("W.MEMBER_NAME,S.STORE_NAME,T.EVA_DATE,W.HEADIMGURL,A.GOODS_NAME,A.PICTURE_URL AS GOODS_PIC ")
+                .append(" FROM bu_evaluate T LEFT JOIN bu_member W ON T.MEMBER_ID = W.MEMBER_ID ")
+                .append(" LEFT JOIN bu_store S ON T.STORE_ID = S.STORE_ID LEFT JOIN bu_goods A ON T.GOODS_ID = A.GOODS_ID ")
+                .append(" WHERE 1=1 ");
+
+        sql.append(searchBean.getSerchCondition())
+                .append(" order by T.EVA_DATE desc");
+
+        List<Object> list = this.searchBySql(sql.toString());
+        List<BuEvaluate> evaluates = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            Object[] obj = (Object[]) list.get(i);
+
+            BuEvaluate evaluate = new BuEvaluate();
+            evaluate.setEvaluateId(obj[0] == null ? null :  Long.valueOf(obj[0].toString()));
+            evaluate.setOrderId(obj[1] == null ? null :  Long.valueOf(obj[1].toString()));
+            evaluate.setMemberId(obj[2] == null ? null :  Long.valueOf(obj[2].toString()));
+            evaluate.setSalesScore(obj[3] == null ? null :  Long.valueOf(obj[3].toString()));
+            evaluate.setGoodsScore(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+            evaluate.setPackScore(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+            evaluate.setRiderScore(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+            evaluate.setContent(obj[7] == null ? null : obj[7].toString());
+            evaluate.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+            evaluate.setCreateDate(obj[9] == null ? null : Timestamp.valueOf(obj[9].toString()));
+            evaluate.setStoreId(obj[10] == null ? null : Long.valueOf(obj[10].toString()));
+            evaluate.setReply(obj[11] == null ? null : obj[11].toString());
+            evaluate.setStatus(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+            evaluate.setReplyDate(obj[13] == null ? null : Timestamp.valueOf(obj[13].toString()));
+            evaluate.setMemberName(obj[14] == null ? null : obj[14].toString());
+            evaluate.setStoreName(obj[15] == null ? null : obj[15].toString());
+            evaluate.setEvaDate(obj[16] == null ? null : Timestamp.valueOf(obj[16].toString()));
+            evaluate.setHeadimgurl(obj[17] == null ? null : obj[17].toString());
+            evaluate.setGoodsName(obj[18] == null ? null : obj[18].toString());
+            evaluate.setGoodsPic(obj[19] == null ? null : obj[19].toString());
+            evaluates.add(evaluate);
+        }
+        return evaluates;
+    }
+
+    /******************************************************    用户端     *********************************************/
+    /**
+     * 方法名称:获取待评价商品列表
+     * 功能描述:获取待评价商品列表
+     * 参数说明:
+     * 作    者:Ada
+     * 日    期:2021-07-01
+     */
+    public List<BuEvaluate> getNoGoodsEvaList(PageControlData pageControlData,BuEvaluateSearchBean searchBean) {
+
+        StringBuffer sql = new StringBuffer("");
+        sql.append(" SELECT T.EVALUATE_ID,W.GOODS_NAME,T.SALE_PRICE,T.BUY_COUNT,W.PICTURE_URL,S.STORE_NAME,T.CREATE_DATE FROM bu_evaluate T")
+                .append(" LEFT JOIN bu_goods W ON T.GOODS_ID = W.GOODS_ID LEFT JOIN bu_store S on T.STORE_ID = S.STORE_ID ")
+                .append(" WHERE 1=1 " + searchBean.getSerchCondition() + " ORDER BY EVALUATE_ID DESC");
+        List<?> list = this.searchBySql(pageControlData,sql.toString());
+
+        List<BuEvaluate> goodsEvaList = new ArrayList<>();
+
+        for (int i = 0; i < list.size(); i++) {
+            Object[] obj = (Object[]) list.get(i);
+            BuEvaluate bean = new BuEvaluate();
+            bean.setEvaluateId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+            bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+            bean.setSalePrice(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+            bean.setBuyCount(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+            bean.setImgUrl(obj[4] == null ? null : obj[4].toString());
+            bean.setStoreName(obj[5] == null ? null : obj[5].toString());
+            bean.setCreateDate(obj[6] == null ? null : Timestamp.valueOf(obj[6].toString()));
+            goodsEvaList.add(bean);
+        }
+
+        return goodsEvaList;
+    }
+
+
+    /**
+     * 方法名称:评价功能查询评价
+     * 功能描述:评价功能查询评价
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-06-14
+     */
+    public List<EvaluateBean> getMemberEvaluateList(PageControlData pageControlData, BuEvaluateSearchBean searchBean) {
+
+        StringBuffer sql = new StringBuffer("");
+        sql.append(" SELECT T.EVALUATE_ID, T.SALES_SCORE,T.GOODS_SCORE,T.PACK_SCORE,T.RIDER_SCORE,T.CONTENT,T.PICTURE_URL,T.CREATE_DATE,T.STORE_ID,T.REPLY,T.STATUS, ")
+                .append(" T.REPLY_DATE,T.GOODS_ID,T.SALE_PRICE,T.BUY_COUNT,W.ICON_URL,W.STORE_NAME, S.REQUIRE_DATE, S.ORDER_CODE,A.MEMBER_NAME,A.HEADIMGURL,S.ORDER_TYPE,T.EVA_DATE,G.GOODS_NAME,G.PICTURE_URL AS GOODS_PIC ")
+                .append(" FROM bu_evaluate T LEFT JOIN bu_store W ON T.STORE_ID = W.STORE_ID LEFT JOIN bu_order S ON T.ORDER_ID = S.ORDER_ID ")
+                .append(" LEFT JOIN bu_member A on T.MEMBER_ID = A.MEMBER_ID LEFT JOIN bu_goods G on T.GOODS_ID = G.GOODS_ID ")
+                .append(" WHERE 1=1 " + searchBean.getSerchCondition() ).append(" ORDER BY T.EVA_DATE DESC ");
+        List<?> list = this.searchBySql(pageControlData,sql.toString());
+
+        List<EvaluateBean> goodsEvaList = new ArrayList<>();
+
+        for (int i = 0; i < list.size(); i++) {
+            Object[] obj = (Object[]) list.get(i);
+            EvaluateBean bean = new EvaluateBean();
+            bean.setEvaluateId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+            bean.setSalesScore(obj[1] == null ? null : Long.valueOf(obj[1].toString()));
+            bean.setGoodsScore(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+            bean.setPackScore(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+            bean.setRiderScore(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+            bean.setContent(obj[5] == null ? null : obj[5].toString());
+            bean.setPictureUrl(obj[6] == null ? null : obj[6].toString());
+            bean.setCreateDate(obj[7] == null ? null : Timestamp.valueOf(obj[7].toString()));
+            bean.setStoreId(obj[8] == null ? null : Long.valueOf(obj[8].toString()));
+            bean.setReply(obj[9] == null ? null : obj[9].toString());
+            bean.setStatus(obj[10] == null ? null : Long.valueOf(obj[10].toString()));
+            bean.setReplyDate(obj[11] == null ? null : Timestamp.valueOf(obj[11].toString()));
+            bean.setGoodsId(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+            bean.setSalePrice(obj[13] == null ? null : Long.valueOf(obj[13].toString()));
+            bean.setBuyCount(obj[14] == null ? null : Long.valueOf(obj[14].toString()));
+            bean.setIconUrl(obj[15] == null ? null : obj[15].toString());
+            bean.setStoreName(obj[16] == null ? null : obj[16].toString());
+            bean.setRequireDate(obj[17] == null ? null : Timestamp.valueOf(obj[17].toString()));
+            bean.setOrderCode(obj[18] == null ? null : obj[18].toString());
+            bean.setMemberName(obj[19] == null ? null : obj[19].toString());
+            bean.setHeadimgurl(obj[20] == null ? null : obj[20].toString());
+            bean.setOrderType(obj[21] == null ? null : Long.valueOf(obj[21].toString()));
+            bean.setEvaDate(obj[22] == null ? null : Timestamp.valueOf(obj[22].toString()));
+            bean.setGoodsName(obj[23] == null ? null : obj[23].toString());
+            bean.setGoodsPic(obj[24] == null ? null : obj[24].toString());
+
+
+            goodsEvaList.add(bean);
+        }
+
+        return goodsEvaList;
+    }
+
+    /**
+     * 方法名称:删除我的评价
+     * 功能描述:删除我的评价
+     * 参数说明:
+     * 作    者:Liucl
+     * 日    期:2023-06-14
+     */
+    @Transactional
+    public boolean deleteById(Long evaluateId) {
+        String sql = "delete from bu_evaluate where EVALUATE_ID = " + evaluateId;
+        int rtn = this.executeSql(sql);
+
+        if (rtn == 1) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 方法名称:获取商品评价
+     * 功能描述:获取商品评价(带分页)
+     * 参数说明:
+     * 作	 者:Lim
+     * 日	 期:2021-03-25
+     */
+    @SuppressWarnings("unchecked")
+    public List<BuEvaluate> getStoreEvaluateList(PageControlData page, BuEvaluateSearchBean searchBean) {
+
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("SELECT T.EVALUATE_ID,T.ORDER_ID,T.MEMBER_ID,T.SALES_SCORE,T.GOODS_SCORE,T.PACK_SCORE,T.RIDER_SCORE,")
+                .append("T.CONTENT,T.PICTURE_URL,T.CREATE_DATE,T.STORE_ID,T.REPLY,T.STATUS,T.REPLY_DATE,")
+                .append("W.MEMBER_NAME,S.STORE_NAME,T.EVA_DATE,W.HEADIMGURL,A.GOODS_NAME,A.PICTURE_URL AS GOODS_PIC ")
+                .append(" FROM bu_evaluate T LEFT JOIN bu_member W ON T.MEMBER_ID = W.MEMBER_ID ")
+                .append(" LEFT JOIN bu_store S ON T.STORE_ID = S.STORE_ID LEFT JOIN bu_goods A ON T.GOODS_ID = A.GOODS_ID ")
+                .append(" WHERE 1=1 AND T.STATUS !=3 AND T.STATUS != 0 ");
+
+        sql.append(searchBean.getSerchCondition())
+                .append(" order by T.EVA_DATE desc");
+
+        List<Object> list = this.searchBySql(page, sql.toString());
+        List<BuEvaluate> evaluates = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            Object[] obj = (Object[]) list.get(i);
+
+            BuEvaluate evaluate = new BuEvaluate();
+            evaluate.setEvaluateId(obj[0] == null ? null :  Long.valueOf(obj[0].toString()));
+            evaluate.setOrderId(obj[1] == null ? null :  Long.valueOf(obj[1].toString()));
+            evaluate.setMemberId(obj[2] == null ? null :  Long.valueOf(obj[2].toString()));
+            evaluate.setSalesScore(obj[3] == null ? null :  Long.valueOf(obj[3].toString()));
+            evaluate.setGoodsScore(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+            evaluate.setPackScore(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+            evaluate.setRiderScore(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+            evaluate.setContent(obj[7] == null ? null : obj[7].toString());
+            evaluate.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+            evaluate.setCreateDate(obj[9] == null ? null : Timestamp.valueOf(obj[9].toString()));
+            evaluate.setStoreId(obj[10] == null ? null : Long.valueOf(obj[10].toString()));
+            evaluate.setReply(obj[11] == null ? null : obj[11].toString());
+            evaluate.setStatus(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+            evaluate.setReplyDate(obj[13] == null ? null : Timestamp.valueOf(obj[13].toString()));
+            evaluate.setMemberName(obj[14] == null ? null : obj[14].toString());
+            evaluate.setStoreName(obj[15] == null ? null : obj[15].toString());
+            evaluate.setEvaDate(obj[16] == null ? null : Timestamp.valueOf(obj[16].toString()));
+            evaluate.setHeadimgurl(obj[17] == null ? null : obj[17].toString());
+            evaluate.setGoodsName(obj[18] == null ? null : obj[18].toString());
+            evaluate.setGoodsPic(obj[19] == null ? null : obj[19].toString());
+            evaluates.add(evaluate);
+        }
+        return evaluates;
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<BuEvaluate> getEvaluateListForStoreInfo(PageControlData page, BuEvaluateSearchBean searchBean) {
+
+        StringBuilder sql = new StringBuilder();
+
+        sql.append("SELECT T.SALES_SCORE,T.GOODS_SCORE,T.PACK_SCORE,T.RIDER_SCORE,T.CONTENT,T.PICTURE_URL,T.REPLY,T.STATUS,T.REPLY_DATE,W.MEMBER_NAME,T.EVA_DATE,W.HEADIMGURL ")
+                .append(" FROM bu_evaluate T LEFT JOIN bu_member W ON T.MEMBER_ID = W.MEMBER_ID ")
+                .append(" WHERE 1=1 AND T.STATUS !=3 AND T.STATUS != 0 ");
+
+        sql.append(searchBean.getSerchCondition())
+                .append(" order by T.EVA_DATE desc");
+
+        List<Object> list = this.searchBySql(page, sql.toString());
+        List<BuEvaluate> evaluates = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            Object[] obj = (Object[]) list.get(i);
+
+            BuEvaluate evaluate = new BuEvaluate();
+            evaluate.setSalesScore(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+            evaluate.setGoodsScore(obj[1] == null ? null : Long.valueOf(obj[1].toString()));
+            evaluate.setPackScore(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+            evaluate.setRiderScore(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+            evaluate.setContent(obj[4] == null ? null : obj[4].toString());
+            evaluate.setPictureUrl(obj[5] == null ? null : obj[5].toString());
+            evaluate.setReply(obj[6] == null ? null : obj[6].toString());
+            evaluate.setStatus(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+            evaluate.setReplyDate(obj[8] == null ? null : Timestamp.valueOf(obj[8].toString()));
+            evaluate.setMemberName(obj[9] == null ? null : obj[9].toString());
+            evaluate.setEvaDate(obj[10] == null ? null : Timestamp.valueOf(obj[10].toString()));
+            evaluate.setHeadimgurl(obj[11] == null ? null : obj[11].toString());
+            evaluates.add(evaluate);
+        }
+        return evaluates;
+    }
+
+}

+ 992 - 0
client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsDao.java

@@ -0,0 +1,992 @@
+package com.sapit.client.app.persistence.goods;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.common.bean.mobile.GoodsBean;
+import com.sapit.common.bean.mobile.SpecialFoodBean;
+import com.sapit.common.bean.store.StoreGoodsBean;
+import com.sapit.common.bean.store.StoreSpecialGoodsBean;
+import com.sapit.common.bean.storemobile.GoodsInfoBean;
+import com.sapit.common.bean.storemobile.StoreGoodsModelBean;
+import com.sapit.common.bean.storemobile.StoreGoodsPropertyBean;
+import com.sapit.common.entity.goods.BuGoods;
+import com.sapit.common.framwork.BaseDao;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.goods.BuGoodsSearchBean;
+import com.sapit.common.util.DateUtil;
+import com.sapit.common.util.StringUtil;
+
+/**
+ * 类名称:商品表管理Dao
+ * 类描述:处理商品表的各种操作
+ * 作  者:vic
+ * 时  间:2021-03-25
+ */
+@SuppressWarnings("rawtypes")
+@Repository
+public class GoodsDao extends BaseDao{
+	
+	public GoodsDao() {
+		super.setEntity("BuGoods");
+	}
+
+	/**
+	 * 方法名称:获取商品信息
+	 * 功能描述:获取商品信息(带分页)
+	 * 参数说明: 
+	 * 作	 者:jinw
+	 * 日	 期:2026-7-23
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuGoods> getGoodsList(PageControlData pageControlData, BuGoodsSearchBean searchBean) {
+
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID,T.GOODS_NAME,T.GOODS_TYPE_ID,W.GOODS_TYPE_NAME," +
+				"T.RMK,T.PICTURE_URL,T.SALES_COUNT,T.STATUS,T.STORE_ID,S.STORE_NAME")
+				.append(" FROM bu_goods T LEFT JOIN bu_goods_type W ON T.GOODS_TYPE_ID = W.GOODS_TYPE_ID ")
+				.append(" LEFT JOIN bu_store S ON T.STORE_ID = S.STORE_ID")
+				.append(" WHERE 1 = 1 ");
+
+		Map<String, Object> params = new HashMap<>();
+
+		if (searchBean.getGoodsName() != null && !searchBean.getGoodsName().isEmpty()) {
+			sql.append(" AND T.GOODS_NAME LIKE :goodsName ");
+			params.put("goodsName", "%" + searchBean.getGoodsName() + "%");
+		}
+		if (searchBean.getStoreId() != null) {
+			sql.append(" AND T.STORE_ID = :storeId ");
+			params.put("storeId", searchBean.getStoreId());
+		}
+		if (searchBean.getStatus() != null) {
+			sql.append(" AND T.STATUS = :status ");
+			params.put("status", searchBean.getStatus());
+		}
+
+		sql.append(" order by T.SALES_COUNT desc , T.CREATE_DATE DESC");
+
+		List<Object> list = this.searchBySql(pageControlData, sql.toString(), params);
+		List<BuGoods> goodsList = new ArrayList<>();
+		for (int i = 0; i < list.size(); i++) {
+			Object[] obj = (Object[]) list.get(i);
+
+			BuGoods goods = new BuGoods();
+			goods.setGoodsId(obj[0] == null ? null :  Long.valueOf(obj[0].toString()));
+			goods.setGoodsName(obj[1] == null ? null :  obj[1].toString());
+			goods.setGoodsTypeId(obj[2] == null ? null :  Long.valueOf(obj[2].toString()));
+			goods.setGoodsTypeName(obj[3] == null ? null :  obj[3].toString());
+			goods.setRmk(obj[4] == null ? null : obj[4].toString());
+			goods.setPictureUrl(obj[5] == null ? null : obj[5].toString());
+			goods.setSalesCount(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			goods.setStatus(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			goods.setStoreId(obj[8] == null ? null : Long.valueOf(obj[8].toString()));
+			goods.setStoreName(obj[9] == null ? null : obj[9].toString());
+			goodsList.add(goods);
+		}
+		return goodsList;
+	}
+
+	/**
+	 * 方法名称:获取店铺的特价商品信息
+	 * 功能描述:获取店铺的特价商品信息
+	 * 参数说明:
+	 * 作	 者:Vic
+	 * 日	 期:2023-06-19
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuGoods> getSpecialGoodsListByStoreId(Long storeId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID,T.GOODS_NAME,T.GOODS_TYPE_ID,W.GOODS_TYPE_NAME," +
+				"T.RMK,T.PICTURE_URL,T.SALES_COUNT,T.STATUS,T.STORE_ID,S.STORE_NAME")
+				.append(" FROM bu_goods T LEFT JOIN bu_goods_type W ON T.GOODS_TYPE_ID = W.GOODS_TYPE_ID ")
+				.append(" LEFT JOIN bu_store S ON T.STORE_ID = S.STORE_ID")
+				.append(" WHERE 1 = 1 AND (T.SALE_PRICE IS NOT NULL AND T.SALE_PRICE < T.COST_PRICE) ")
+				.append(" AND T.STORE_ID = " + storeId)
+				.append(" order by GOODS_ID desc");
+
+		List<Object> list = this.searchBySql(sql.toString());
+		List<BuGoods> goodsList = new ArrayList<>();
+		for (int i = 0; i < list.size(); i++) {
+			Object[] obj = (Object[]) list.get(i);
+
+			BuGoods goods = new BuGoods();
+			goods.setGoodsId(obj[0] == null ? null :  Long.valueOf(obj[0].toString()));
+			goods.setGoodsName(obj[1] == null ? null :  obj[1].toString());
+			goods.setGoodsTypeId(obj[2] == null ? null :  Long.valueOf(obj[2].toString()));
+			goods.setGoodsTypeName(obj[3] == null ? null :  obj[3].toString());
+			goods.setRmk(obj[4] == null ? null : obj[4].toString());
+			goods.setPictureUrl(obj[5] == null ? null : obj[5].toString());
+			goods.setSalesCount(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			goods.setStatus(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			goods.setStoreId(obj[8] == null ? null : Long.valueOf(obj[8].toString()));
+			goods.setStoreName(obj[9] == null ? null : obj[9].toString());
+			goodsList.add(goods);
+		}
+		return goodsList;
+	}
+	
+	/**
+	 * 方法名称:获取商品信息
+	 * 功能描述:获取商品信息
+	 * 参数说明:
+	 * 作	 者:Lim
+	 * 日	 期:2021-03-25
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuGoods> getGoodsList(BuGoodsSearchBean searchBean) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID,T.GOODS_NAME,T.GOODS_TYPE_ID,W.GOODS_TYPE_NAME," +
+				"T.RMK,T.PICTURE_URL,T.SALES_COUNT,T.STATUS,T.STORE_ID,S.STORE_NAME")
+				.append(" FROM bu_goods T LEFT JOIN bu_goods_type W ON T.GOODS_TYPE_ID = W.GOODS_TYPE_ID ")
+				.append(" LEFT JOIN bu_store S ON T.STORE_ID = S.STORE_ID")
+				.append(" WHERE 1 = 1")
+				.append(searchBean.getSerchCondition())
+				.append(" order by GOODS_ID desc");
+
+		List<Object> list = this.searchBySql(sql.toString());
+		List<BuGoods> goodsList = new ArrayList<>();
+		for (int i = 0; i < list.size(); i++) {
+			Object[] obj = (Object[]) list.get(i);
+
+			BuGoods goods = new BuGoods();
+			goods.setGoodsId(obj[0] == null ? null :  Long.valueOf(obj[0].toString()));
+			goods.setGoodsName(obj[1] == null ? null :  obj[1].toString());
+			goods.setGoodsTypeId(obj[2] == null ? null :  Long.valueOf(obj[2].toString()));
+			goods.setGoodsTypeName(obj[3] == null ? null :  obj[3].toString());
+			goods.setRmk(obj[4] == null ? null : obj[4].toString());
+			goods.setPictureUrl(obj[5] == null ? null : obj[5].toString());
+			goods.setSalesCount(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			goods.setStatus(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			goods.setStoreId(obj[8] == null ? null : Long.valueOf(obj[8].toString()));
+			goods.setStoreName(obj[9] == null ? null : obj[9].toString());
+			goodsList.add(goods);
+		}
+		return goodsList;
+	}
+	
+	/**
+	 * 方法名称:删除下架商品
+	 * 功能描述:删除下架商品
+	 * 参数说明:
+	 * 作	 者:Yangyk
+	 * 日	 期:2024-02-28
+	 */
+	@Transactional
+	public void deleteGoods(Long goodsId) {
+		String sql = "UPDATE bu_goods SET DEL_FLAG = 1 WHERE GOODS_ID = " + goodsId + " AND STATUS = 0";
+		this.executeSql(sql);
+	}
+	
+	/*---------------------------- 以下为用户端调用方法 -----------------------------------*/
+	
+	/**
+	 * 方法名称:根据店铺id获取商品集合
+	 * 功能描述:根据店铺id获取商品集合
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-09-26
+	 */
+	@SuppressWarnings("unchecked")
+	public List<StoreGoodsBean> getGoodsBeanByStoreId(Long storeId, Long flag) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT G.GOODS_ID,G.GOODS_NAME,G.GOODS_TYPE_ID,G.SALES_COUNT,G.SALE_PRICE as GOODS_SALE_PRICE,G.COST_PRICE AS GOODS_COST_PRICE,G.LIMITED_NUM,")
+			.append(" G.MINI_NUM,G.PICTURE_URL,G.NEW_GOODS_FLG,G.SINGLE_FLG,G.STORE_ID,S.MAX_NUM,G.RMK,T.GOODS_TYPE_NAME,")
+			.append(" M.MODEL_ID,M.MODEL_CODE,M.MODEL_NAME,M.COST_PRICE,M.SALE_PRICE,M.PACKING_FEE,T.TYPE,G.STATUS FROM bu_goods G")
+			.append(" LEFT JOIN bu_goods_model M ON G.GOODS_ID = M.GOODS_ID LEFT JOIN bu_store_special_goods S ON G.GOODS_ID = S.GOODS_ID")
+			.append(" LEFT JOIN bu_goods_type T ON G.GOODS_TYPE_ID = T.GOODS_TYPE_ID WHERE G.STORE_ID =")
+			.append(storeId);
+//		if (StringUtils.isNotBlank(goodsName)) {
+//			sql.append(" AND G.GOODS_NAME LIKE '%").append(goodsName).append("%'");
+//		}
+		if (flag == 0L) {
+			sql.append(" AND G.STATUS = 1");
+		}
+		sql.append(" AND G.DEL_FLAG = 0");
+		sql.append(" ORDER BY T.ORDER_KEY DESC, IFNULL(G.NEW_GOODS_FLG, 0) DESC, G.ORDER_KEY DESC");
+		
+		List<Object> objs = this.searchBySql(sql.toString());
+		
+		List<StoreGoodsBean> result = new ArrayList<>();
+		
+		for (Object object : objs) {
+			StoreGoodsBean bean = new StoreGoodsBean();
+			Object[] obj = (Object[])object;
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setGoodsTypeId(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setSalesCount(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setGoodsSalePrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setGoodsCostPrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setLimitedNum(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			bean.setMiniNum(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			bean.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+			bean.setNewGoodsFlg(obj[9] == null ? 0L : Long.valueOf(obj[9].toString()));
+    		bean.setDiscount(String.format("%.1f", (bean.getGoodsSalePrice() * 10d) / bean.getGoodsCostPrice()));
+    		bean.setSingleFlg(obj[10] == null ? 0L : Long.valueOf(obj[10].toString()));
+    		bean.setStoreId(obj[11] == null ? null : Long.valueOf(obj[11].toString()));
+    		bean.setSpecialLimitedNum(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+    		bean.setRmk(obj[13] == null ? null : obj[13].toString());
+    		
+			bean.setGoodsTypeName(obj[14] == null ? null : obj[14].toString());
+			
+			bean.setModelId(obj[15] == null ? null : obj[15].toString());
+			bean.setModelCode(obj[16] == null ? null : obj[16].toString());
+			bean.setModelName(obj[17] == null ? null : obj[17].toString());
+			bean.setCostPrice(obj[18] == null ? null : Long.valueOf(obj[18].toString()));
+			bean.setSalePrice(obj[19] == null ? null : Long.valueOf(obj[19].toString()));
+			bean.setPackingFee(obj[20] == null ? null : Long.valueOf(obj[20].toString()));
+			bean.setGoodsTypeRequireType(obj[21] == null ? null : Long.valueOf(obj[21].toString()));
+			bean.setStatus(obj[22] == null ? null : Long.valueOf(obj[22].toString()));
+
+			result.add(bean);
+			
+		}
+		
+		return result;
+	}
+	
+	/**
+	 * 方法名称:根据查询条件和店铺id集合获取商品
+	 * 功能描述:根据查询条件和店铺id集合获取商品
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-06-01
+	 */
+	@SuppressWarnings("unchecked")
+	public List<SpecialFoodBean> getGoodsByStoreIds(String key, List<Long> storeIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT g.GOODS_ID, g.GOODS_NAME, g.STORE_ID, g.COST_PRICE, g.SALE_PRICE, g.PICTURE_URL ");
+		sql.append("FROM bu_goods g WHERE g.GOODS_NAME LIKE '%" + key + "%' ");
+		if (CollectionUtils.isNotEmpty(storeIds)) {
+			sql.append("AND g.STORE_ID IN ( ");
+    		int index = 0;
+    		for (Long storeId : storeIds) {
+    			sql.append("'" + storeId + "'");
+    			index ++;
+    			if (index != storeIds.size()) {
+    				sql.append(", ");
+    			}
+    		}
+    		sql.append(") ");
+		}
+		sql.append("ORDER BY SALES_COUNT DESC");
+		
+		List<Object> objs = this.searchBySql(sql.toString());
+    	List<SpecialFoodBean> result = new ArrayList<>();
+    	for (Object object : objs) {
+    		Object[] obj = (Object[])object;
+    		SpecialFoodBean bean = new SpecialFoodBean();
+    		bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+    		bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+    		bean.setStoreId(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+    		bean.setCostPrice(obj[3] == null ? 0L : Long.valueOf(obj[3].toString()));
+    		bean.setSalePrice(obj[4] == null ? 0L : Long.valueOf(obj[4].toString()));
+    		bean.setPictureUrl(obj[5] == null ? null : obj[5].toString());
+    		bean.setDiscount(String.format("%.1f", (bean.getSalePrice() * 10d) / bean.getCostPrice()));
+    		result.add(bean);
+    	}
+    	return result;
+	}
+
+
+	/**
+	 * 方法名称:商家页 根据店铺id集合获取商品
+	 * 功能描述:商家页 根据店铺id集合获取商品
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-06-01
+	 */
+	@SuppressWarnings("unchecked")
+	public List<GoodsBean> getBeanByStoreId(Long storeId, String searchValue) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID, T.GOODS_NAME, T.GOODS_TYPE_ID, T.SALES_COUNT, T.SALE_PRICE, T.COST_PRICE, T.LIMITED_NUM, ");
+		sql.append("T.MINI_NUM, T.PICTURE_URL, T.NEW_GOODS_FLG, T.SINGLE_FLG, T.STORE_ID, G.MAX_NUM, T.RMK FROM bu_goods T LEFT JOIN bu_store_special_goods G ON T.GOODS_ID = G.GOODS_ID WHERE T.STATUS = 1 ");
+		if (storeId != null) {
+			sql.append("AND T.STORE_ID = " + storeId + " ");
+		}
+		if (StringUtils.isNotBlank(searchValue)) {
+			sql.append("AND T.GOODS_NAME LIKE '%" + searchValue + "%' ");
+		}
+		sql.append("ORDER BY IFNULL(T.NEW_GOODS_FLG, 0) DESC, T.ORDER_KEY DESC");
+		List<Object> list = this.searchBySql(sql.toString());
+		
+		List<GoodsBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsBean bean = new GoodsBean();
+			
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setGoodsTypeId(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setSalesCount(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setSalePrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setCostPrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setLimitedNum(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			bean.setMiniNum(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			bean.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+			bean.setNewGoodsFlg(obj[9] == null ? 0L : Long.valueOf(obj[9].toString()));
+    		bean.setDiscount(String.format("%.1f", (bean.getSalePrice() * 10d) / bean.getCostPrice()));
+    		bean.setSingleFlg(obj[10] == null ? 0L : Long.valueOf(obj[10].toString()));
+    		bean.setStoreId(obj[11] == null ? null : Long.valueOf(obj[11].toString()));
+    		bean.setSpecialLimitedNum(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+    		bean.setRmk(obj[13] == null ? null : obj[13].toString());
+    		
+			result.add(bean);
+		}
+		return result;
+	}
+	
+	/**
+	 * 方法名称:商家页 根据店铺id集合获取商品
+	 * 功能描述:商家页 根据店铺id集合获取商品
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-06-01
+	 */
+	@SuppressWarnings("unchecked")
+	public List<GoodsBean> getBeanByStoreIdSearch(Long storeId, String searchValue) {
+		
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID, T.GOODS_NAME, T.GOODS_TYPE_ID, T.SALES_COUNT, T.SALE_PRICE, T.COST_PRICE, T.LIMITED_NUM, ");
+		sql.append("T.MINI_NUM, T.PICTURE_URL, T.NEW_GOODS_FLG, T.SINGLE_FLG, T.STORE_ID, G.MAX_NUM, T.RMK FROM bu_goods T LEFT JOIN bu_store_special_goods G ON T.GOODS_ID = G.GOODS_ID WHERE 1 = 1 ");
+		if (storeId != null) {
+			sql.append("AND T.STORE_ID = " + storeId + " ");
+		}
+		if (StringUtils.isNotBlank(searchValue)) {
+			sql.append("AND T.GOODS_NAME LIKE '%" + searchValue + "%' ");
+		}
+		sql.append("ORDER BY IFNULL(T.NEW_GOODS_FLG, 0) DESC, T.ORDER_KEY DESC");
+		List<Object> list = this.searchBySql(sql.toString());
+
+		List<GoodsBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsBean bean = new GoodsBean();
+
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setGoodsTypeId(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setSalesCount(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setSalePrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setCostPrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setLimitedNum(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			bean.setMiniNum(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			bean.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+			bean.setNewGoodsFlg(obj[9] == null ? 0L : Long.valueOf(obj[9].toString()));
+			bean.setDiscount(String.format("%.1f", (bean.getSalePrice() * 10d) / bean.getCostPrice()));
+    		bean.setSingleFlg(obj[10] == null ? 0L : Long.valueOf(obj[10].toString()));
+    		bean.setStoreId(obj[11] == null ? null : Long.valueOf(obj[11].toString()));
+    		bean.setRmk(obj[13] == null ? null : obj[13].toString());
+    		
+			result.add(bean);
+
+    		Long salePrice = obj[4] == null ? null : Long.valueOf(obj[4].toString());
+    		if (bean.getCostPrice() > salePrice) {
+    			GoodsBean goods = new GoodsBean();
+    			goods.setGoodsId(bean.getGoodsId());
+    			goods.setGoodsName(bean.getGoodsName());
+    			goods.setGoodsTypeId(0L);
+    			goods.setSalesCount(bean.getSalesCount());
+    			goods.setSalePrice(salePrice);
+    			goods.setCostPrice(bean.getCostPrice());
+    			goods.setLimitedNum(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+    			goods.setMiniNum(bean.getMiniNum());
+    			goods.setPictureUrl(bean.getPictureUrl());
+    			goods.setNewGoodsFlg(bean.getNewGoodsFlg());
+    			goods.setDiscount(bean.getDiscount());
+    			goods.setSingleFlg(bean.getSingleFlg());
+    			goods.setStoreId(bean.getStoreId());
+    			goods.setRmk(bean.getRmk());
+    			result.add(goods);
+    		}
+
+		}
+		return result;
+	}
+	
+	/**
+	 * 方法名称:获取商品信息
+	 * 功能描述:获取商品信息
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-01
+	 */
+	@SuppressWarnings("unchecked")
+	public BuGoods getGoodsInfoById(Long goodsId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT GOODS_ID, GOODS_NAME, SALE_PRICE, COST_PRICE, LIMITED_NUM, MINI_NUM, STATUS, STORE_ID FROM bu_goods WHERE GOODS_ID = " + goodsId);
+		
+		List<Object> objs = this.searchBySql(sql.toString());
+		if (CollectionUtils.isNotEmpty(objs)) {
+			Object[] obj = (Object[]) objs.get(0);
+			BuGoods goods = new BuGoods();
+			goods.setGoodsId(goodsId);
+			goods.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			goods.setSalePrice(obj[2] == null ? 0L : Long.valueOf(obj[2].toString()));
+			goods.setCostPrice(obj[3] == null ? 0L : Long.valueOf(obj[3].toString()));
+			goods.setLimitedNum(obj[4] == null ? 0L : Long.valueOf(obj[4].toString()));
+			goods.setMiniNum(obj[5] == null ? 0L : Long.valueOf(obj[5].toString()));
+			goods.setStatus(obj[6] == null ? 0L : Long.valueOf(obj[6].toString()));
+			goods.setStoreId(obj[7] == null ? 0L : Long.valueOf(obj[7].toString()));
+			
+			return goods;
+		}
+		return null;
+	}
+	
+	/**
+	 * 方法名称:商家页 根据店铺id集合获取商品
+	 * 功能描述:商家页 根据店铺id集合获取商品
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-06-01
+	 */
+	@SuppressWarnings("unchecked")
+	public List<GoodsBean> getBeanByGoodsIds(List<Long> goodsIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID, T.GOODS_NAME, T.GOODS_TYPE_ID, T.SALES_COUNT, T.SALE_PRICE, T.COST_PRICE, G.MAX_NUM, ");
+		sql.append("T.MINI_NUM, T.PICTURE_URL, T.NEW_GOODS_FLG, T.SINGLE_FLG, T.STORE_ID, T.STATUS FROM bu_goods T LEFT JOIN bu_store_special_goods G ON T.GOODS_ID = G.GOODS_ID  WHERE 1 = 1 ");
+		if (CollectionUtils.isNotEmpty(goodsIds)) {
+			sql.append("AND T.GOODS_ID IN ( ");
+    		int index = 0;
+    		for (Long goodsId : goodsIds) {
+    			sql.append("'" + goodsId + "'");
+    			index ++;
+    			if (index != goodsIds.size()) {
+    				sql.append(", ");
+    			}
+    		}
+    		sql.append(") ");
+		}
+		sql.append("ORDER BY T.NEW_GOODS_FLG DESC");
+		List<Object> list = this.searchBySql(sql.toString());
+
+		List<GoodsBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsBean bean = new GoodsBean();
+
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setGoodsTypeId(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setSalesCount(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setSalePrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setCostPrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setLimitedNum(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			bean.setMiniNum(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			bean.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+			bean.setNewGoodsFlg(obj[9] == null ? 0L : Long.valueOf(obj[9].toString()));
+			bean.setDiscount(String.format("%.1f", (bean.getSalePrice() * 10d) / bean.getCostPrice()));
+    		bean.setSingleFlg(obj[10] == null ? 0L : Long.valueOf(obj[10].toString()));
+    		bean.setStoreId(obj[11] == null ? null : Long.valueOf(obj[11].toString()));
+    		bean.setStatus(obj[12] == null ? 0L : Long.valueOf(obj[12].toString()));
+			result.add(bean);
+
+		}
+		return result;
+	}
+	
+	/**
+	 * 方法名称:获取店铺的单型号商品
+	 * 功能描述:获取店铺的单型号商品
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-07-06
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuGoods> getStoreSingleGoods(Long storeId) {
+		String sql = "select g.GOODS_ID,g.GOODS_NAME,g.COST_PRICE,g.SALE_PRICE,g.PICTURE_URL,m.MODEL_ID from bu_goods g left join bu_goods_model m on g.GOODS_ID = m.GOODS_ID where g.SINGLE_FLG = 1 and g.STORE_ID =" + storeId;
+
+		List<Object> list = this.searchBySql(sql);
+		List<BuGoods> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			BuGoods bean = new BuGoods();
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setCostPrice(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setSalePrice(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setPictureUrl(obj[4] == null ? null : obj[4].toString());
+			bean.setModelId(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			result.add(bean);
+		}
+
+		return result;
+	}
+
+	/*---------------------------- 以下为店铺端调用方法 -----------------------------------*/
+
+	/**
+	 * 方法名称:商家页 根据店铺id集合获取商品
+	 * 功能描述:商家页 根据店铺id集合获取商品
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-04
+	 */
+	@SuppressWarnings("unchecked")
+	public List<GoodsBean> getBeanByStoreIdForStore(Long storeId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID, T.GOODS_NAME, T.GOODS_TYPE_ID, T.SALES_COUNT, T.SALE_PRICE, T.COST_PRICE, T.LIMITED_NUM, ");
+		sql.append("T.MINI_NUM, T.PICTURE_URL, T.NEW_GOODS_FLG, T.SINGLE_FLG, T.STORE_ID, T.STATUS,T.ORDER_KEY FROM bu_goods T WHERE 1 = 1 ");
+		if (storeId != null) {
+			sql.append("AND T.STORE_ID = " + storeId + " ");
+		}
+		sql.append("ORDER BY T.ORDER_KEY DESC");
+		List<Object> list = this.searchBySql(sql.toString());
+
+		List<GoodsBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsBean bean = new GoodsBean();
+
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setGoodsTypeId(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setSalesCount(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setSalePrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setCostPrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setLimitedNum(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			bean.setMiniNum(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			bean.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+			bean.setNewGoodsFlg(obj[9] == null ? 0L : Long.valueOf(obj[9].toString()));
+			bean.setDiscount(String.format("%.1f", (bean.getSalePrice() * 10d) / bean.getCostPrice()));
+			bean.setSingleFlg(obj[10] == null ? 0L : Long.valueOf(obj[10].toString()));
+			bean.setStoreId(obj[11] == null ? null : Long.valueOf(obj[11].toString()));
+			bean.setStatus(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+			bean.setOrderKey(obj[13] == null ? null : Long.valueOf(obj[13].toString()));
+
+			result.add(bean);
+		}
+		return result;
+	}
+
+	/**
+	 * 方法名称:更新商品的销售价格为活动价格
+	 * 功能描述:更新商品的销售价格为活动价格
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-07-04
+	 */
+	@Transactional
+	public void updateGoodsSalesPriceToActivityPriceForStore(Long activityId){
+		String sql = "update bu_goods g set g.SALE_PRICE = (select t.ACTIVITY_PRICE from bu_store_special_goods t where g.GOODS_ID = t.GOODS_ID) "
+				+ " where g.GOODS_ID in (select GOODS_ID from bu_store_special_goods where STORE_SPECIAL_ACTIVITY_ID =" + activityId + ")";
+		this.executeSql(sql);
+	}
+
+	/**
+	 * 方法名称:更新商品的销售价格为商品原价
+	 * 功能描述:更新商品的销售价格为商品原价
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-07-04
+	 */
+	@Transactional
+	public void updateGoodsSalesPriceToCostPriceForStore(Long activityId){
+		String sql = "update bu_goods g set g.SALE_PRICE = g.COST_PRICE where g.GOODS_ID in (select GOODS_ID from bu_store_special_goods where STORE_SPECIAL_ACTIVITY_ID =" +  activityId + ")";
+		this.executeSql(sql);
+	}
+
+
+	/**
+	 * 方法名称:获取商品详细属性
+	 * 功能描述:获取商品详细属性
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-04
+	 */
+	@SuppressWarnings("unchecked")
+	public GoodsInfoBean getGoodsInfoForStore(Long storeId, Long goodsId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID, T.GOODS_NAME, T.GOODS_TYPE_ID, S.GOODS_TYPE_NAME, T.UTILS, T.PICTURE_URL, T.RMK,T.MINI_NUM ")
+				.append(" FROM bu_goods T LEFT JOIN bu_goods_type S ON T.GOODS_TYPE_ID = S.GOODS_TYPE_ID ")
+				.append(" WHERE 1 = 1 ")
+				.append(" AND T.STORE_ID = ")
+				.append(storeId)
+				.append(" AND T.GOODS_ID = ")
+				.append(goodsId);
+
+		List<Object> list = this.searchBySql(sql.toString());
+
+		List<GoodsInfoBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsInfoBean bean = new GoodsInfoBean();
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setGoodsTypeId(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setGoodsTypeName(obj[3] == null ? null : obj[3].toString());
+			bean.setUtils(obj[4] == null ? null : obj[4].toString());
+			bean.setPictureUrl(obj[5] == null ? null : obj[5].toString());
+			bean.setRmk(obj[6] == null ? null : obj[6].toString());
+//			bean.setPropertyId(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+//			bean.setPropertyName(obj[8] == null ? null : obj[8].toString());
+//			bean.setPropertyList(obj[9] == null ? null : obj[9].toString());
+
+			bean.setMiniNum(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			result.add(bean);
+		}
+		GoodsInfoBean bean = null;
+		if (result.size()>0){
+			bean = result.get(0);
+
+			// 查询商品规格
+			StringBuilder sql1 = new StringBuilder();
+			sql1.append("SELECT MODEL_ID, MODEL_NAME, COST_PRICE,PACKING_FEE,SALE_PRICE FROM bu_goods_model WHERE 1 = 1 ")
+					.append(" AND GOODS_ID = ").append(goodsId);
+
+			List<Object> list1 = this.searchBySql(sql1.toString());
+			List<StoreGoodsModelBean> result1 = new ArrayList<>();
+			for (Object object : list1) {
+				Object[] obj = (Object[]) object;
+				StoreGoodsModelBean bean1 = new StoreGoodsModelBean();
+				bean1.setModelId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+				bean1.setModelName(obj[1] == null ? null : obj[1].toString());
+				bean1.setCostPrice(obj[2] == null ? null : Long.parseLong(obj[2].toString()));
+				bean1.setPackingFee(obj[3] == null ? null : Long.parseLong(obj[3].toString()));
+				bean1.setSalePrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+				if (bean1.getCostPrice() != null && bean1.getSalePrice() != null && bean1.getCostPrice() > bean1.getSalePrice()) {
+					bean1.setSpecialFlag(1L);
+				} else {
+					bean1.setSpecialFlag(0L);
+				}
+
+				result1.add(bean1);
+			}
+			if (!result1.isEmpty()){
+				bean.setModelBeanList(result1);
+			}
+			// 查询商品属性
+			StringBuilder sql2 = new StringBuilder();
+			sql2.append("SELECT PROPERTY_ID, PROPERTY_NAME, PROPERTY_LIST FROM bu_goods_property WHERE 1 = 1 ")
+					.append(" AND GOODS_ID = ").append(goodsId);
+
+			List<Object> list2 = this.searchBySql(sql2.toString());
+			List<StoreGoodsPropertyBean> result2 = new ArrayList<>();
+			for (Object object : list2) {
+				Object[] obj = (Object[]) object;
+				StoreGoodsPropertyBean bean2 = new StoreGoodsPropertyBean();
+				bean2.setPropertyId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+				bean2.setPropertyName(obj[1] == null ? null : obj[1].toString());
+				bean2.setPropertyList(obj[2] == null ? null : obj[2].toString());
+				result2.add(bean2);
+			}
+
+			if (!result2.isEmpty()){
+				bean.setPropertyBeanList(result2);
+			}
+		}
+
+		return bean;
+	}
+
+
+	/**
+	 * 方法名称:根据Id获取对象实体
+	 * 功能描述:根据Id获取对象实体
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-05
+	 */
+	public BuGoods getGoodsByIdForStore(Long id){
+		return (BuGoods) findById(BuGoods.class, id);
+	}
+
+	/**
+	 * 方法名称:获取商品最大排序
+	 * 功能描述:获取商品
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-03
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuGoods> getGoodsMaxOrderKeyForStore(Long storeId) {
+		String hql = "from BuGoods where 1=1 and STORE_ID = " + storeId +" ORDER BY ORDER_KEY DESC ";
+		return this.searchByHql(hql);
+	}
+
+	/**
+	 * 方法名称:获取商品最大排序
+	 * 功能描述:获取商品
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-03
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuGoods> getGoodsMoveUpForStore(Long typeId, Long storeId, Long orderKey) {
+
+		String hql = "from BuGoods where 1=1 and GOODS_TYPE_ID = " + typeId + " AND STORE_ID = "+ storeId + "AND ORDER_KEY > "+ orderKey +" ORDER BY ORDER_KEY ASC ";
+		return this.searchByHql(hql);
+	}
+
+	/**
+	 * 方法名称:更新商品状态
+	 * 功能描述:更新商品状态
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-05
+	 */
+	@Transactional
+	public boolean changeStatusForStore(Long id, Long status,Long storeId){
+		String sql = "update bu_goods set STATUS = " + status + " where GOODS_ID = " + id + " AND STORE_ID = " + storeId;
+
+		int rtn = this.executeSql(sql);
+		if (rtn >= 1) {
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * 方法名称:根据分类id查询分类下是否有商品
+	 * 功能描述:根据分类id查询分类下是否有商品
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-05
+	 */
+	public boolean checkTypeIsUsed(Long id, Long storeId) {
+		String sql = "select count(*) from bu_goods WHERE GOODS_TYPE_ID = " + id +" AND STORE_ID = " + storeId;
+		List<?> list = this.searchBySql(sql);
+		boolean rtn = false;
+
+		if (list != null && !list.isEmpty() && Long.valueOf(list.get(0).toString()) > 0) {
+			rtn = true;
+		}
+		return rtn;
+	}
+	
+	/**
+	 * 方法名称:获取店铺的单型号商品
+	 * 功能描述:获取店铺的单型号商品
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-07-06
+	 */
+	@SuppressWarnings("unchecked")
+	public List<StoreSpecialGoodsBean> getStoreSingleGoodsForSpecialForStore(Long storeId, String goodsName, String ids) {
+		String sql = "select g.GOODS_ID,g.GOODS_NAME,g.COST_PRICE,g.SALE_PRICE,g.PICTURE_URL,m.MODEL_ID from bu_goods g left join bu_goods_model m on g.GOODS_ID = m.GOODS_ID" +
+				" left join bu_goods_type t on g.GOODS_TYPE_ID = t.GOODS_TYPE_ID " +
+				" where g.SINGLE_FLG = 1 " +
+				"and g.STORE_ID =" + storeId + " and g.GOODS_ID not in (select a.GOODS_ID from bu_store_special_goods a ) and t.TYPE <> 1";
+
+		if (goodsName != null && !goodsName.equals("")) {
+			sql += " and g.GOODS_NAME like '%" + goodsName + "%'";
+		}
+
+		if (ids != null && !ids.equals("")){
+			sql += " and g.GOODS_ID not in " + ids;
+		}
+
+		List<Object> list = this.searchBySql(sql);
+		List<StoreSpecialGoodsBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			StoreSpecialGoodsBean bean = new StoreSpecialGoodsBean();
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setCostPrice(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setActivityPrice(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setPictureUrl(obj[4] == null ? null : obj[4].toString());
+			bean.setModelId(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			result.add(bean);
+		}
+
+		return result;
+	}
+
+	/**
+	 * 方法名称:获取店铺的单型号商品
+	 * 功能描述:获取店铺的单型号商品
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-07-06
+	 */
+	@SuppressWarnings("unchecked")
+	public List<StoreSpecialGoodsBean> getStoreSingleGoodsForStore(Long storeId, String goodsName, String ids) {
+		String sql = "select g.GOODS_ID,g.GOODS_NAME,g.COST_PRICE,g.SALE_PRICE,g.PICTURE_URL,m.MODEL_ID from bu_goods g left join bu_goods_model m on g.GOODS_ID = m.GOODS_ID where g.SINGLE_FLG = 1 " +
+				"and g.STORE_ID =" + storeId;
+
+		if (goodsName != null && !goodsName.equals("")) {
+			sql += " and g.GOODS_NAME like '%" + goodsName + "%'";
+		}
+
+		List<Object> list = this.searchBySql(sql);
+		List<StoreSpecialGoodsBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			StoreSpecialGoodsBean bean = new StoreSpecialGoodsBean();
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setCostPrice(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setActivityPrice(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setPictureUrl(obj[4] == null ? null : obj[4].toString());
+			bean.setModelId(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			result.add(bean);
+		}
+
+		return result;
+	}
+
+
+	/*---------------------------- 以下为代运营端调用方法 -----------------------------------*/
+	/**
+	 * 方法名称:获取商品信息
+	 * 功能描述:获取商品信息
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-03
+	 */
+	@SuppressWarnings("unchecked")
+	public BuGoods getGoodsByIdForThird(Long goodsId) {
+		String hql = "from BuGoods where 1=1 and GOODS_ID = " + goodsId;
+		List<BuGoods> list = this.searchByHql(hql);
+		if (list != null && !list.isEmpty()) {
+			return list.get(0);
+		}
+		return null;
+	}
+
+	/**
+	 * 方法名称:代运营端 根据分类id获取商品
+	 * 功能描述:代运营端 根据分类id获取商品
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-04
+	 */
+	@SuppressWarnings("unchecked")
+	public List<GoodsBean> getGoodsListByStoreIdForThird(Long storeId,Long goodsTypeId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT T.GOODS_ID, T.GOODS_NAME, T.GOODS_TYPE_ID, T.SALES_COUNT, T.SALE_PRICE, T.COST_PRICE, T.LIMITED_NUM, ");
+		sql.append("T.MINI_NUM, T.PICTURE_URL, T.NEW_GOODS_FLG, T.SINGLE_FLG, T.STORE_ID, T.STATUS, W.MODEL_ID,T.ORDER_KEY,T.RMK")
+				.append(" FROM bu_goods T LEFT JOIN bu_goods_model W ON T.GOODS_ID = W.GOODS_ID WHERE 1 = 1 ");
+		if (storeId != null) {
+			sql.append("AND STORE_ID = " + storeId + " ");
+		}
+		if (goodsTypeId != null) {
+			sql.append("AND GOODS_TYPE_ID = " + goodsTypeId + " ");
+		}
+		sql.append(" AND DEL_FLAG = 0 GROUP BY T.GOODS_ID ORDER BY T.ORDER_KEY DESC");
+		List<Object> list = this.searchBySql(sql.toString());
+
+		List<GoodsBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsBean bean = new GoodsBean();
+
+			bean.setGoodsId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsName(obj[1] == null ? null : obj[1].toString());
+			bean.setGoodsTypeId(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setSalesCount(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setSalePrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setCostPrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setLimitedNum(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			bean.setMiniNum(obj[7] == null ? null : Long.valueOf(obj[7].toString()));
+			bean.setPictureUrl(obj[8] == null ? null : obj[8].toString());
+			bean.setNewGoodsFlg(obj[9] == null ? 0L : Long.valueOf(obj[9].toString()));
+			bean.setDiscount(String.format("%.1f", (bean.getSalePrice() * 10d) / bean.getCostPrice()));
+			bean.setSingleFlg(obj[10] == null ? 0L : Long.valueOf(obj[10].toString()));
+			bean.setStoreId(obj[11] == null ? null : Long.valueOf(obj[11].toString()));
+			bean.setStatus(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+			bean.setModelId(obj[13] == null ? null : obj[13].toString());
+			bean.setOrderKey(obj[14] == null ? null : Long.valueOf(obj[14].toString()));
+			bean.setRmk(obj[15] == null ? null : obj[15].toString());
+
+			result.add(bean);
+		}
+		return result;
+	}
+
+
+	/*---------------------------- 以下为定时器调用方法 -----------------------------------*/
+
+	/**
+	 * 方法名称:将到期的新品更新为老品
+	 * 功能描述:将到期的新品更新为老品
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-01
+	 */
+	@Transactional
+	public void updateGoodsToOldFlgBatch(){
+		String sql = "update bu_goods set NEW_GOODS_FLG = 0 where NEW_GOODS_ENDDATE < current_date and NEW_GOODS_FLG = 1";
+		this.executeSql(sql);
+	}
+	
+	/**
+	 * 方法名称:更新商品的月销量
+	 * 功能描述:更新商品的月销量
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-01
+	 */
+	@Transactional
+	public void updateGoodsMonthsSalesCountBatch(){
+		String date = StringUtil.formatLongDate(DateUtil.addDDToADate(DateUtil.getSqlToday(), -30L));
+		StringBuilder sql = new StringBuilder();
+//		sql.append("UPDATE bu_goods g SET g.SALES_COUNT = IFNULL((SELECT sum(d.BUY_COUNT) FROM bu_order_detail_year d LEFT JOIN bu_order_year o ON d.ORDER_ID = o.ORDER_ID WHERE")
+//			.append(" g.GOODS_ID = d.GOODS_ID and o.CREATE_DATE > '").append(date)
+//			.append("' and d.ORDER_ID in (select ORDER_ID from bu_order_year where status = 60)),0)");
+
+
+		sql.append("UPDATE bu_goods g ");
+		sql.append(" JOIN ( ");
+		sql.append("SELECT ");
+		sql.append("d.GOODS_ID, ");
+		sql.append("SUM( d.BUY_COUNT ) AS total_sales ");
+		sql.append("FROM ");
+		sql.append("bu_order_detail_year d ");
+		sql.append("JOIN ( ");
+		sql.append("SELECT ");
+		sql.append("ORDER_ID ");
+		sql.append("FROM ");
+		sql.append("bu_order_year ");
+		sql.append("WHERE ");
+		sql.append("STATUS = 60 ");
+		sql.append("AND CREATE_DATE > '");
+		sql.append(date).append("') ");
+		sql.append(" o ON d.ORDER_ID = o.ORDER_ID ");
+		sql.append("GROUP BY ");
+		sql.append("d.GOODS_ID ");
+		sql.append(") s ON g.GOODS_ID = s.GOODS_ID ");
+		sql.append("SET g.SALES_COUNT = IFNULL( s.total_sales, 0 );");
+
+		System.out.println("更新商品的月销量sql------------------"+sql.toString());
+
+		this.executeSql(sql.toString());
+	}
+	
+	/**
+	 * 方法名称:更新商品的销售价格为活动价格
+	 * 功能描述:更新商品的销售价格为活动价格
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-06
+	 */
+	@Transactional
+	public void updateGoodsSalesPriceBatch(Long goodsId, Long salePrice){
+		String sql = "update bu_goods set SALE_PRICE = " + salePrice + " where GOODS_ID =" +  goodsId;
+		this.executeSql(sql);
+	}
+	
+	/**
+	 * 方法名称:更新商品的销售价格为商品原价
+	 * 功能描述:更新商品的销售价格为商品原价
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-06
+	 */
+	@Transactional
+	public void updateGoodsSalesPriceBatch(Long goodsId){
+		String sql = "update bu_goods set SALE_PRICE = COST_PRICE where GOODS_ID =" +  goodsId;
+		this.executeSql(sql);
+	}
+	
+}

+ 385 - 0
client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsModelDao.java

@@ -0,0 +1,385 @@
+package com.sapit.client.app.persistence.goods;
+
+import com.sapit.common.bean.mobile.GoodsModelBean;
+import com.sapit.common.bean.mobile.StoreGoodsModelBean;
+import com.sapit.common.entity.goods.BuGoodsModel;
+import com.sapit.common.framwork.BaseDao;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 类名称:商品规格表管理Dao
+ * 类描述:处理商品规格表的各种操作
+ * 
+ * 作  者:vic
+ * 时  间:2021-03-25
+ */
+@SuppressWarnings("rawtypes")
+@Repository
+public class GoodsModelDao extends BaseDao{
+	
+	public GoodsModelDao() {
+		super.setEntity("BuGoodsModel");
+	}
+
+	/*---------------------------- 以下为用户端使用方法 -----------------------------------*/
+	
+    /**
+     * 方法名称: 商家页 获取规格(按商品id集合)
+     * 功能描述: 商家页 获取规格
+     *
+     * 参数说明:
+     * 作   者: Yangyk
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsModelBean> getModelByGoodsIds(List<Long> goodsIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT MODEL_ID, MODEL_CODE, MODEL_NAME, GOODS_ID, COST_PRICE, SALE_PRICE, PACKING_FEE FROM bu_goods_model WHERE 1 = 1 ");
+		if (CollectionUtils.isNotEmpty(goodsIds)) {
+			sql.append("AND GOODS_ID IN ( ");
+    		int index = 0;
+    		for (Long goodsId : goodsIds) {
+    			sql.append("'" + goodsId + "'");
+    			index ++;
+    			if (index != goodsIds.size()) {
+    				sql.append(", ");
+    			}
+    		}
+    		sql.append(") ");
+		}
+		
+		List<Object> list = this.searchBySql(sql.toString());
+		List<GoodsModelBean> result = new ArrayList<>();
+		for (Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsModelBean bean = new GoodsModelBean();
+			bean.setModelId(obj[0] == null ? null : obj[0].toString());
+			bean.setModelCode(obj[1] == null ? null : obj[1].toString());
+			bean.setModelName(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setCostPrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setSalePrice(bean.getCostPrice());
+			bean.setPackingFee(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			
+			result.add(bean);
+			Long salePrice = obj[5] == null ? null : Long.valueOf(obj[5].toString());
+			if (bean.getCostPrice() > salePrice) {
+				GoodsModelBean goods = new GoodsModelBean();
+				goods.setModelId("t" + bean.getModelId());
+				goods.setModelCode(bean.getModelCode());
+				goods.setModelName(bean.getModelName());
+				goods.setGoodsId(bean.getGoodsId());
+				goods.setCostPrice(bean.getCostPrice());
+				goods.setSalePrice(salePrice);
+				goods.setPackingFee(bean.getPackingFee());
+				result.add(goods);
+			}
+
+		}
+		
+		return result;
+	}
+	
+    /**
+     * 方法名称: 商家页 获取规格 不产生虚拟规格
+     * 功能描述: 商家页 获取规格
+     *
+     * 参数说明:
+     * 作   者: Yangyk
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsModelBean> getModelByGoodsIdsForAgain(List<Long> goodsIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT MODEL_ID, MODEL_CODE, MODEL_NAME, GOODS_ID, COST_PRICE, SALE_PRICE, PACKING_FEE FROM bu_goods_model WHERE 1 = 1 ");
+		if (CollectionUtils.isNotEmpty(goodsIds)) {
+			sql.append("AND GOODS_ID IN ( ");
+    		int index = 0;
+    		for (Long goodsId : goodsIds) {
+    			sql.append("'" + goodsId + "'");
+    			index ++;
+    			if (index != goodsIds.size()) {
+    				sql.append(", ");
+    			}
+    		}
+    		sql.append(") ");
+		}
+		
+		List<Object> list = this.searchBySql(sql.toString());
+		List<GoodsModelBean> result = new ArrayList<>();
+		for (Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsModelBean bean = new GoodsModelBean();
+			bean.setModelId(obj[0] == null ? null : obj[0].toString());
+			bean.setModelCode(obj[1] == null ? null : obj[1].toString());
+			bean.setModelName(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setCostPrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setSalePrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setPackingFee(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			
+			result.add(bean);
+		}
+		
+		return result;
+	}
+	
+	/**
+	 * 方法名称:获取商品规格信息
+	 * 功能描述:获取商品规格信息
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-06-06
+	 */
+	@SuppressWarnings("unchecked")
+	public BuGoodsModel getGoodsModelById(Long modelId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT MODEL_ID, MODEL_CODE, MODEL_NAME, GOODS_ID, COST_PRICE, SALE_PRICE, PACKING_FEE FROM bu_goods_model WHERE MODEL_ID = " + modelId);
+		
+		List<Object> list = this.searchBySql(sql.toString());
+		
+		if (CollectionUtils.isNotEmpty(list)) {
+			Object[] obj = (Object[]) list.get(0);
+			BuGoodsModel bean = new BuGoodsModel();
+			bean.setModelId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setModelCode(obj[1] == null ? null : obj[1].toString());
+			bean.setModelName(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setCostPrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setSalePrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setPackingFee(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			
+			return bean;
+		}
+		
+		return null;
+	}
+	
+	@SuppressWarnings("unchecked")
+	public StoreGoodsModelBean getStoreGoodsModelInfo(Long modelId) {
+		String sql = "SELECT m.MODEL_ID,m.MODEL_CODE,m.MODEL_NAME,m.GOODS_ID,m.COST_PRICE AS mCostPrice,m.SALE_PRICE AS mSalePrice,m.PACKING_FEE,g.GOODS_NAME,g.SALE_PRICE,g.COST_PRICE,"
+				+ "g.LIMITED_NUM,g.MINI_NUM,g.STATUS AS gStatus,g.STORE_ID,s.DONE_MEAL_TIME,s.AUTO_GO,s.STATUS,s.BUSINESS_STATUS FROM bu_goods_model m "
+				+ "LEFT JOIN bu_goods g ON m.GOODS_ID = g.GOODS_ID LEFT JOIN bu_store s ON g.STORE_ID = s.STORE_ID WHERE m.MODEL_ID = " + modelId;
+		List<Object> list = this.searchBySql(sql);
+		if (CollectionUtils.isNotEmpty(list)) {
+			Object[] obj = (Object[]) list.get(0);
+			StoreGoodsModelBean bean = new StoreGoodsModelBean();
+			bean.setModelId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setModelCode(obj[1] == null ? null : obj[1].toString());
+			bean.setModelName(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setModelCostPrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setModelSalePrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setPackingFee(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			bean.setGoodsName(obj[7] == null ? null : obj[7].toString());
+			bean.setGoodsSalePrice(obj[8] == null ? null : Long.valueOf(obj[8].toString()));
+			bean.setGoodsCostPrice(obj[9] == null ? null : Long.valueOf(obj[9].toString()));
+			bean.setLimitedNum(obj[10] == null ? null : Long.valueOf(obj[10].toString()));
+			bean.setMiniNum(obj[11] == null ? null : Long.valueOf(obj[11].toString()));
+			bean.setGoodsStatus(obj[12] == null ? null : Long.valueOf(obj[12].toString()));
+			bean.setStoreId(obj[13] == null ? null : Long.valueOf(obj[13].toString()));
+			bean.setDoneMealTime(obj[14] == null ? null : Long.valueOf(obj[14].toString()));
+			bean.setAutoGo(obj[15] == null ? null : Long.valueOf(obj[15].toString()));
+			bean.setStoreStatus(obj[16] == null ? null : Long.valueOf(obj[16].toString()));
+			bean.setBusinessStatus(obj[17] == null ? null : Long.valueOf(obj[17].toString()));
+			return bean;
+		}
+		return null;
+	}
+	
+	/*---------------------------- 以下为店铺端调用方法 -----------------------------------*/
+
+	/**
+	 * 方法名称: 商家页 获取规格(按商品id集合)
+	 * 功能描述: 商家页 获取规格
+	 * 作    者:Liucl
+	 * 日    期:2023-07-04
+	 **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsModelBean> getModelByGoodsIdsForStore(List<Long> goodsIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT MODEL_ID, MODEL_CODE, MODEL_NAME, GOODS_ID, COST_PRICE, SALE_PRICE, PACKING_FEE FROM bu_goods_model WHERE 1 = 1 ");
+		if (CollectionUtils.isNotEmpty(goodsIds)) {
+			sql.append("AND GOODS_ID IN ( ");
+			int index = 0;
+			for (Long goodsId : goodsIds) {
+				sql.append("'" + goodsId + "'");
+				index ++;
+				if (index != goodsIds.size()) {
+					sql.append(", ");
+				}
+			}
+			sql.append(") ");
+		}
+
+		List<Object> list = this.searchBySql(sql.toString());
+		List<GoodsModelBean> result = new ArrayList<>();
+		for (Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsModelBean bean = new GoodsModelBean();
+			bean.setModelId(obj[0] == null ? null : obj[0].toString());
+			bean.setModelCode(obj[1] == null ? null : obj[1].toString());
+			bean.setModelName(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setCostPrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setSalePrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setPackingFee(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+			
+			result.add(bean);
+			Long salePrice = obj[5] == null ? null : Long.valueOf(obj[5].toString());
+			if (bean.getCostPrice() > salePrice) {
+				GoodsModelBean goods = new GoodsModelBean();
+				goods.setModelId("t" + bean.getModelId());
+				goods.setModelCode(bean.getModelCode());
+				goods.setModelName(bean.getModelName());
+				goods.setGoodsId(bean.getGoodsId());
+				goods.setCostPrice(bean.getCostPrice());
+				goods.setSalePrice(salePrice);
+				goods.setPackingFee(bean.getPackingFee());
+				result.add(goods);
+			}
+
+		}
+
+		return result;
+	}
+	
+	/**
+	 * 方法名称:更新商品规格中的销售价格为活动价格
+	 * 功能描述:更新商品规格中的销售价格为活动价格
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-06
+	 */
+	@Transactional
+	public void updateGoodsModelSalesPriceToActivityPriceForStore(Long activityId){
+		String sql = "update bu_goods_model g set g.SALE_PRICE = (select t.ACTIVITY_PRICE from bu_store_special_goods t where g.MODEL_ID = t.MODEL_ID) "
+				+ " where g.MODEL_ID in (select MODEL_ID from bu_store_special_goods where STORE_SPECIAL_ACTIVITY_ID =" + activityId + ")";
+		this.executeSql(sql);
+	}
+	
+	/**
+	 * 方法名称:更新商品规格中的销售价格为规格原价
+	 * 功能描述:更新商品规格中的销售价格为规格原价
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-06
+	 */
+	@Transactional
+	public void updateGoodsModelSalesPriceToCostPriceForStore(Long activityId){
+		String sql = "update bu_goods_model g set g.SALE_PRICE = g.COST_PRICE where g.MODEL_ID in (select MODEL_ID from bu_store_special_goods where STORE_SPECIAL_ACTIVITY_ID =" +  activityId + ")";
+		this.executeSql(sql);
+	}
+
+	/**
+	 * 方法名称:根据Id获取商品规格实体
+	 * 功能描述:根据Id获取商品规格实体
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-05
+	 */
+	public BuGoodsModel getGoodsModelByIdForStore(Long id){
+		return (BuGoodsModel) findById(BuGoodsModel.class, id);
+	}
+
+
+	/**
+	 * 方法名称:根据商品id删除商品规格
+	 * 功能描述:根据商品id删除商品规格
+	 * 参数说明:id 评价id
+	 * 作    者:Liucl
+	 * 日    期:2023-07-05
+	 */
+	@Transactional
+	public boolean deleteGoodsModelByGoodsForStore(Long id) {
+		String sql = "delete from bu_goods_model where GOODS_ID = " + id;
+
+		int rtn = this.executeSql(sql);
+		if (rtn == 1) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/*---------------------------- 以下为代运营端调用方法 -----------------------------------*/
+
+
+	/**
+	 * 方法名称: 商家页 获取规格(按商品id集合)
+	 * 功能描述: 商家页 获取规格
+	 * 作    者:Liucl
+	 * 日    期:2023-07-04
+	 **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsModelBean> getModelByGoodsIdsForThird(List<Long> goodsIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT MODEL_ID, MODEL_CODE, MODEL_NAME, GOODS_ID, COST_PRICE, SALE_PRICE, PACKING_FEE FROM bu_goods_model WHERE 1 = 1 ");
+		if (CollectionUtils.isNotEmpty(goodsIds)) {
+			sql.append("AND GOODS_ID IN ( ");
+			int index = 0;
+			for (Long goodsId : goodsIds) {
+				sql.append("'" + goodsId + "'");
+				index ++;
+				if (index != goodsIds.size()) {
+					sql.append(", ");
+				}
+			}
+			sql.append(") ");
+		}
+
+		List<Object> list = this.searchBySql(sql.toString());
+		List<GoodsModelBean> result = new ArrayList<>();
+		for (Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsModelBean bean = new GoodsModelBean();
+			bean.setModelId(obj[0] == null ? null : obj[0].toString());
+			bean.setModelCode(obj[1] == null ? null : obj[1].toString());
+			bean.setModelName(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setCostPrice(obj[4] == null ? null : Long.valueOf(obj[4].toString()));
+			bean.setSalePrice(obj[5] == null ? null : Long.valueOf(obj[5].toString()));
+			bean.setPackingFee(obj[6] == null ? null : Long.valueOf(obj[6].toString()));
+
+			result.add(bean);
+		}
+
+		return result;
+	}
+	/*---------------------------- 以下为定时器调用方法 -----------------------------------*/
+
+	/**
+	 * 方法名称:更新商品规格中的销售价格为活动价格
+	 * 功能描述:更新商品规格中的销售价格为活动价格
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-06
+	 */
+	@Transactional
+	public void updateGoodsModelSalePriceBatch(Long modelId, Long salePrice){
+		String sql = "update bu_goods_model set SALE_PRICE = " + salePrice + " where MODEL_ID =" +  modelId;
+		this.executeSql(sql);
+	}
+	
+	/**
+	 * 方法名称:更新商品规格中的销售价格为规格原价
+	 * 功能描述:更新商品规格中的销售价格为规格原价
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-06-06
+	 */
+	@Transactional
+	public void updateGoodsModelSalePriceBatch(Long modelId){
+		String sql = "update bu_goods_model set SALE_PRICE = COST_PRICE where MODEL_ID =" +  modelId;
+		this.executeSql(sql);
+	}
+
+	
+}

+ 160 - 0
client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsPropertyDao.java

@@ -0,0 +1,160 @@
+package com.sapit.client.app.persistence.goods;
+
+import com.sapit.common.bean.mobile.GoodsPropertyBean;
+import com.sapit.common.entity.goods.BuGoodsProperty;
+import com.sapit.common.framwork.BaseDao;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@SuppressWarnings("rawtypes")
+@Repository
+public class GoodsPropertyDao extends BaseDao {
+	
+	public GoodsPropertyDao() {
+		super.setEntity("BuGoodsProperty");
+	}
+	
+	/**
+     * 方法名称: 用户端获取商品的口味属性,其他业务不可以调用
+     * 功能描述: 用户端获取商品的口味属性,其他业务不可以调用
+     *
+     * 参数说明:
+     * 作   者: Vic
+     * 日   期: 2023-09-27
+     **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsPropertyBean> getPropertyByStoreId(Long storeId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select P.PROPERTY_ID, P.PROPERTY_NAME, P.PROPERTY_LIST, P.GOODS_ID from bu_goods_property P, bu_goods G where P.GOODS_ID = G.GOODS_ID and G.STATUS = 1 and G.STORE_ID =")
+			.append(storeId);
+		
+		List<Object> list = this.searchBySql(sql.toString());
+		List<GoodsPropertyBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsPropertyBean bean = new GoodsPropertyBean();
+			bean.setPropertyId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setPropertyName(obj[1] == null ? null : obj[1].toString());
+			bean.setPropertyList(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			result.add(bean);
+		}
+		return result;
+	}
+	
+	
+    /**
+     * 方法名称: 商家页 获取属性(按商品id集合)
+     * 功能描述: 商家页 获取属性
+     *
+     * 参数说明:
+     * 作   者: Yangyk
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsPropertyBean> getPropertyByGoodsIds(List<Long> goodsIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT PROPERTY_ID, PROPERTY_NAME, PROPERTY_LIST, GOODS_ID FROM bu_goods_property WHERE 1 = 1 ");
+		if (CollectionUtils.isNotEmpty(goodsIds)) {
+			sql.append("AND GOODS_ID IN ( ");
+    		int index = 0;
+    		for (Long goodsId : goodsIds) {
+    			sql.append("'" + goodsId + "'");
+    			index ++;
+    			if (index != goodsIds.size()) {
+    				sql.append(", ");
+    			}
+    		}
+    		sql.append(") ");
+		}
+		
+		List<Object> list = this.searchBySql(sql.toString());
+		List<GoodsPropertyBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsPropertyBean bean = new GoodsPropertyBean();
+			bean.setPropertyId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setPropertyName(obj[1] == null ? null : obj[1].toString());
+			bean.setPropertyList(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			result.add(bean);
+		}
+		return result;
+	}
+
+	/*------------------------------- 以下为店铺端调用  ---------------------------------------*/
+	/**
+	 * 方法名称: 商家页 获取属性(按商品id集合)
+	 * 功能描述: 商家页 获取属性
+	 *
+	 * 参数说明:
+	 * 作   者: Yangyk
+	 * 日   期: 2023/5/22 13:40
+	 * @return:
+	 **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsPropertyBean> getPropertyByGoodsIdsForStore(List<Long> goodsIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT PROPERTY_ID, PROPERTY_NAME, PROPERTY_LIST, GOODS_ID FROM bu_goods_property WHERE 1 = 1 ");
+		if (CollectionUtils.isNotEmpty(goodsIds)) {
+			sql.append("AND GOODS_ID IN ( ");
+			int index = 0;
+			for (Long goodsId : goodsIds) {
+				sql.append("'" + goodsId + "'");
+				index ++;
+				if (index != goodsIds.size()) {
+					sql.append(", ");
+				}
+			}
+			sql.append(") ");
+		}
+
+		List<Object> list = this.searchBySql(sql.toString());
+		List<GoodsPropertyBean> result = new ArrayList<>();
+		for(Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsPropertyBean bean = new GoodsPropertyBean();
+			bean.setPropertyId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setPropertyName(obj[1] == null ? null : obj[1].toString());
+			bean.setPropertyList(obj[2] == null ? null : obj[2].toString());
+			bean.setGoodsId(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			result.add(bean);
+		}
+		return result;
+	}
+
+	/**
+	 * 方法名称:根据Id获取商品属性实体
+	 * 功能描述:根据Id获取商品属性实体
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-05
+	 */
+	public BuGoodsProperty getGoodsPropertyByIdForStore(Long id){
+		return (BuGoodsProperty) findById(BuGoodsProperty.class, id);
+	}
+
+	/**
+	 * 方法名称:根据商品id删除商品属性
+	 * 功能描述:根据商品id删除商品属性
+	 * 参数说明:id 评价id
+	 * 作    者:Liucl
+	 * 日    期:2023-07-05
+	 */
+	@Transactional
+	public boolean deleteGoodsPropertyByGoodsForStore(Long id) {
+		String sql = "delete from bu_goods_property where GOODS_ID = " + id;
+
+		int rtn = this.executeSql(sql);
+		if (rtn == 1) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+}

+ 87 - 0
client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsStatisticsDao.java

@@ -0,0 +1,87 @@
+package com.sapit.client.app.persistence.goods;
+
+import com.sapit.common.bean.goods.BuGoodsStatisticsBean;
+import com.sapit.common.framwork.BaseDao;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.goods.BuGoodsStatisticsSearchBean;
+import com.sapit.common.util.DateUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@SuppressWarnings("rawtypes")
+@Repository
+public class GoodsStatisticsDao extends BaseDao {
+
+	public GoodsStatisticsDao() {
+		super.setEntity("BuGoodsStatistics");
+	}
+	
+	/**
+	 * 方法名称:商品统计列表
+	 * 功能描述:商品统计列表
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@SuppressWarnings({ "unchecked" })
+	public List<BuGoodsStatisticsBean> page(PageControlData pageControlData, BuGoodsStatisticsSearchBean searchBean) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT a.MARKET_DATE, a.STORE_ID, s.STORE_NAME, a.GOODS_ID, CASE WHEN m.MODEL_NAME = ' ' THEN g.GOODS_NAME ELSE CONCAT( g.GOODS_NAME, '(', m.MODEL_NAME, ')' ) END, a.MODEL_ID, m.MODEL_NAME, SUM(a.ORDER_NUM), ");
+		sql.append("SUM(a.TOTAL), CEILING(SUM(a.AVERAGE_PRICE)/COUNT(a.MODEL_ID)), g.PICTURE_URL, t.GOODS_TYPE_NAME, g.RMK,s.STORE_BELONGTO FROM bu_goods_statistics a LEFT JOIN bu_store s ON a.STORE_ID = s.STORE_ID ");
+		sql.append("LEFT JOIN bu_goods g ON a.GOODS_ID = g.GOODS_ID LEFT JOIN bu_goods_model m ON a.MODEL_ID = m.MODEL_ID LEFT JOIN bu_goods_type t ON g.GOODS_TYPE_ID = t.GOODS_TYPE_ID ");
+		sql.append("WHERE 1 = 1 " + searchBean.getSerchCondition());
+		sql.append(" GROUP BY a.MODEL_ID ORDER BY SUM(a.ORDER_NUM) DESC");
+		
+		List<Object> objs = this.searchBySql(pageControlData, sql.toString());
+		List<BuGoodsStatisticsBean> list = new ArrayList<>();
+		if (CollectionUtils.isNotEmpty(objs)) {
+			
+			for (int i = 0; i < objs.size(); i++) {
+				Object[] obj = (Object[]) objs.get(i);
+				BuGoodsStatisticsBean bean = new BuGoodsStatisticsBean();
+				bean.setMarketDate(null == obj[0] ? null : DateUtil.getDateByString(obj[0].toString(),"yyyy-MM-dd"));
+				bean.setStoreId(null == obj[1] ? null : Long.valueOf(obj[1].toString()));
+				bean.setStoreName(null == obj[2] ? null : obj[2].toString());
+				bean.setGoodsId(null == obj[3] ? null : Long.valueOf(obj[3].toString()));
+				bean.setGoodsName(null == obj[4] ? null : obj[4].toString());
+				bean.setModelId(null == obj[5] ? null : Long.valueOf(obj[5].toString()));
+				bean.setModelName(null == obj[6] ? null : obj[6].toString());
+				bean.setOrderNum(null == obj[7] ? null : Long.valueOf(obj[7].toString()));
+				bean.setTotal(null == obj[8] ? null : Long.valueOf(obj[8].toString()));
+				bean.setAveragePrice(null == obj[9] ? null : Long.valueOf(obj[9].toString()));
+				bean.setImgUrl(null == obj[10] ? null : obj[10].toString());
+				bean.setGoodsTypeName(null == obj[11] ? null : obj[11].toString());
+				bean.setRmk(null == obj[12] ? null : obj[12].toString());
+				bean.setStoreBelongto(obj[13] == null ? 0L : Long.valueOf(obj[13].toString()));
+				list.add(bean);
+			}
+		}
+		return list;
+	}
+	
+	/*---------------------------- 以下为定时器调用方法 -----------------------------------*/
+	
+	/**
+	 * 方法名称:按日期计算商品的销量更新到商品销量表
+	 * 功能描述:按日期计算商品的销量更新到商品销量表
+	 * 参数说明:
+	 * 作    者:Vic
+	 * 日    期:2023-07-20
+	 */
+	@Transactional
+	public void settleGoodsStatisticsBatch(String date){
+		StringBuilder sql = new StringBuilder();
+		sql.append("INSERT INTO bu_goods_statistics (MARKET_DATE,STORE_ID,GOODS_ID,MODEL_ID,ORDER_NUM,TOTAL,AVERAGE_PRICE,CREATE_DATE,UPDATE_DATE)")
+			.append(" SELECT DATE_FORMAT(o.FINISH_DATE,'%Y-%m-%d'),o.STORE_ID,d.GOODS_ID,d.MODEL_ID,sum(d.BUY_COUNT),sum(d.SALES_PRICE),")
+			.append(" ROUND(sum(d.SALES_PRICE)/sum(d.BUY_COUNT),0),CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3) FROM bu_order_detail_year d")
+			.append(" LEFT JOIN bu_order_year o ON d.ORDER_ID = o.ORDER_ID WHERE o.STATUS = 60 AND DATE_FORMAT(o.FINISH_DATE,'%Y-%m-%d')= '")
+			.append(date)
+			.append("' GROUP BY d.MODEL_ID ");
+		
+		this.executeSql(sql.toString());
+	}
+}

+ 207 - 0
client-app/src/main/java/com/sapit/client/app/persistence/goods/GoodsTypeDao.java

@@ -0,0 +1,207 @@
+package com.sapit.client.app.persistence.goods;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sapit.common.bean.mobile.GoodsTypeBean;
+import com.sapit.common.entity.goods.BuGoodsType;
+import com.sapit.common.framwork.BaseDao;
+import com.sapit.common.search.goods.BuGoodsTypeSearchBean;
+
+@SuppressWarnings("rawtypes")
+@Repository
+public class GoodsTypeDao extends BaseDao {
+	
+	public GoodsTypeDao() {
+		super.setEntity("BuGoodsType");
+	}
+	
+    /**
+     * 方法名称: 获取店铺 商品分类列表
+     * 功能描述: 获取店铺 商品分类列表
+     *
+     * 参数说明:
+     * 作   者: Yangyk
+     * 日   期: 2023/5/22 13:40
+     * @return:
+     **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsTypeBean> getGoodsTypeList(Long storeId) {
+		StringBuilder sql = new StringBuilder();
+		
+		sql.append("select 0 as GOODS_TYPE_ID, '天天特价' as GOODS_TYPE_NAME,1 as TYPE from dual where EXISTS(SELECT a.STORE_SPECIAL_ACTIVITY_ID FROM bu_store_special_goods a left join bu_store_special_activity sa on  a.STORE_SPECIAL_ACTIVITY_ID = sa.STORE_SPECIAL_ACTIVITY_ID where sa.STORE_ID = " + storeId
+				+ " AND sa.STATUS = 1 ) UNION (SELECT GOODS_TYPE_ID, GOODS_TYPE_NAME, TYPE FROM bu_goods_type WHERE STORE_ID = " + storeId + " ORDER BY ORDER_KEY DESC)");
+		List<Object> list = this.searchBySql(sql.toString());
+		
+		List<GoodsTypeBean> result = new ArrayList<>();
+		
+		for (Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsTypeBean bean = new GoodsTypeBean();
+			bean.setGoodsTypeId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsTypeName(obj[1] == null ? null : obj[1].toString());
+			bean.setType(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setSpecial(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			result.add(bean);
+		}
+		return result;
+	}
+
+	/*------------------------------------ 店铺端调用  ----------------------------------*/
+
+	/**
+	 * 方法名称:获取商品分类
+	 * 功能描述:获取商品分类
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-03
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuGoodsType> getGoodsTypeForStore(BuGoodsTypeSearchBean searchBean) {
+		String hql = "from BuGoodsType where 1=1" + searchBean.getSerchCondition() +" ORDER BY ORDER_KEY DESC";
+		return this.searchByHql(hql);
+	}
+
+	/**
+	 * 方法名称:获取商品分类最大排序
+	 * 功能描述:获取商品分类
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-03
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuGoodsType> getGoodsTypeMaxOrderKeyForStore(Long storeId) {
+		String hql = "from BuGoodsType where 1=1 and STORE_ID = " + storeId +" ORDER BY ORDER_KEY DESC ";
+		return this.searchByHql(hql);
+	}
+
+	/**
+	 * 方法名称:根据ID查询商品分类实体
+	 * 功能描述:根据ID查询商品分类实体
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-03
+	 */
+	public BuGoodsType getGoodsTypeByIdForStore(Long id){
+		return (BuGoodsType) findById(BuGoodsType.class, id);
+	}
+
+	/**
+	 * 方法名称:根据排序获取上一个商品分类
+	 * 功能描述:获取商品分类
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-07-03
+	 */
+	@SuppressWarnings("unchecked")
+	public BuGoodsType getGoodsTypeLastForStore(BuGoodsTypeSearchBean searchBean) {
+		String hql = "from BuGoodsType where 1=1 " + searchBean.getSerchCondition();
+		List<BuGoodsType> list = this.searchByHql(hql);
+		if (list != null && !list.isEmpty()) {
+			return list.get(0);
+		}
+		return null;
+	}
+
+	/**
+	 * 方法名称: 获取店铺 商品分类列表
+	 * 功能描述: 获取店铺 商品分类列表
+	 * 作    者:Liucl
+	 * 日    期:2023-07-04
+	 * @return:
+	 **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsTypeBean> getGoodsTypeListForStore(Long storeId) {
+		StringBuilder sql = new StringBuilder();
+
+		sql.append("SELECT GOODS_TYPE_ID, GOODS_TYPE_NAME FROM bu_goods_type WHERE STORE_ID = " + storeId + " ORDER BY ORDER_KEY DESC");
+		List<Object> list = this.searchBySql(sql.toString());
+
+		List<GoodsTypeBean> result = new ArrayList<>();
+		for (Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsTypeBean bean = new GoodsTypeBean();
+			bean.setGoodsTypeId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsTypeName(obj[1] == null ? null : obj[1].toString());
+			bean.setSpecial(0L);
+			result.add(bean);
+		}
+		return result;
+	}
+
+	/**
+	 * 方法名称:根据id删除分类
+	 * 功能描述:根据id删除分类
+	 * 参数说明:id 评价id
+	 * 作    者:Liucl
+	 * 日    期:2023-07-05
+	 */
+	@Transactional
+	public boolean deleteByIdForStore(Long id, Long storeId) {
+		String sql = "delete from bu_goods_type where GOODS_TYPE_ID = " + id + " AND STORE_ID = " + storeId;
+
+		int rtn = this.executeSql(sql);
+		if (rtn == 1) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/*----------------------------- 以下为代运营端调用  -----------------------------------------------*/
+
+	/**
+	 * 方法名称: 获取店铺 商品分类列表
+	 * 功能描述: 获取店铺 商品分类列表
+	 * 作    者:Liucl
+	 * 日    期:2023-07-04
+	 * @return:
+	 **/
+	@SuppressWarnings("unchecked")
+	public List<GoodsTypeBean> getGoodsTypeListForThird(Long storeId) {
+		StringBuilder sql = new StringBuilder();
+
+		sql.append("SELECT t.GOODS_TYPE_ID, t.GOODS_TYPE_NAME,count(w.GOODS_ID),t.TYPE FROM bu_goods_type t  LEFT JOIN bu_goods w on t.GOODS_TYPE_ID = w.GOODS_TYPE_ID " +
+				" WHERE t.STORE_ID = " + storeId + " AND w.DEL_FLAG = 0 GROUP BY t.GOODS_TYPE_ID ORDER BY t.ORDER_KEY DESC");
+		List<Object> list = this.searchBySql(sql.toString());
+
+		List<GoodsTypeBean> result = new ArrayList<>();
+		for (Object object : list) {
+			Object[] obj = (Object[]) object;
+			GoodsTypeBean bean = new GoodsTypeBean();
+			bean.setGoodsTypeId(obj[0] == null ? null : Long.valueOf(obj[0].toString()));
+			bean.setGoodsTypeName(obj[1] == null ? null : obj[1].toString());
+			bean.setGoodsCounts(obj[2] == null ? null : Long.valueOf(obj[2].toString()));
+			bean.setType(obj[3] == null ? null : Long.valueOf(obj[3].toString()));
+			bean.setSpecial(0L);
+			result.add(bean);
+		}
+		return result;
+	}
+
+
+
+	/**
+	 * 方法名称:校验店铺是否有必选分类
+	 * 功能描述:校验店铺是否有必选分类
+	 * 参数说明:
+	 * 作    者:Liucl
+	 * 日    期:2023-08-01
+	 */
+	public boolean checkGoodsTypeByType(Long storeId,Long id) {
+		String sql = "select count(*) from bu_goods_type WHERE 1=1 AND TYPE = 1 AND STORE_ID = " + storeId ;
+		if (id != null){
+			sql += " AND GOODS_TYPE_ID <> " + id;
+		}
+		List<?> list = this.searchBySql(sql);
+		boolean rtn = false;
+
+		if (list != null && !list.isEmpty() && Long.valueOf(list.get(0).toString()) < 1) {
+			rtn = true;
+		}
+		return rtn;
+	}
+}

+ 116 - 0
client-app/src/main/java/com/sapit/client/app/persistence/member/ComplaintDao.java

@@ -0,0 +1,116 @@
+package com.sapit.client.app.persistence.member;
+
+import com.sapit.common.bean.member.BuComplaintBean;
+import com.sapit.common.entity.member.BuComplaint;
+import com.sapit.common.framwork.BaseDao;
+import com.sapit.common.framwork.PageControlData;
+import com.sapit.common.search.member.BuComplaintSearchBean;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 投诉反馈表
+ * @author Administrator
+ *
+ */
+@SuppressWarnings("rawtypes")
+@Repository
+public class ComplaintDao extends BaseDao {
+
+	public ComplaintDao() {
+		super.setEntity("BuComplaint");
+	}
+	
+	/**
+	 * 方法名称:获取投诉列表
+	 * 功能描述:获取投诉列表
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuComplaintBean> getComplaintList(PageControlData pageControlData, BuComplaintSearchBean searchBean) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT a.COMPLAINT_ID, a.ORDER_CODE, a.STORE_ID, a.MEMBER_ID, a.TYPE, a.CONTENT, a.IMG_URL, a.REPLY, a.`STATUS`, a.CREATE_DATE, ");
+		sql.append("a.MEMBER_NAME, a.MEMBER_TEL, s.STORE_NAME FROM bu_complaint a LEFT JOIN bu_store s ON a.STORE_ID = s.STORE_ID WHERE 1 = 1" + searchBean.getSerchCondition());
+		List<Object> objs = this.searchBySql(pageControlData, sql.toString());
+		List<BuComplaintBean> result = new ArrayList<>();
+		for(int i = 0; i < objs.size(); i++) {
+			Object[] obj = (Object[]) objs.get(i);
+			BuComplaintBean bean = new BuComplaintBean();
+			bean.setComplaintId(null == obj[0] ? null : Long.valueOf(obj[0].toString()));
+			bean.setOrderCode(null == obj[1] ? null : obj[1].toString());
+			bean.setStoreId(null == obj[2] ? null : Long.valueOf(obj[2].toString()));
+			bean.setMemberId(null == obj[3] ? null : Long.valueOf(obj[3].toString()));
+			bean.setType(null == obj[4] ? null : Long.valueOf(obj[4].toString()));
+			bean.setContent(null == obj[5] ? null : obj[5].toString());
+			bean.setImgUrl(null == obj[6] ? null : obj[6].toString());
+			bean.setReply(null == obj[7] ? null : obj[7].toString());
+			bean.setStatus(null == obj[8] ? null : Long.valueOf(obj[8].toString()));
+			bean.setCreateDate(null == obj[9] ? null : Timestamp.valueOf(obj[9].toString()));
+			bean.setMemberName(null == obj[10] ? null : obj[10].toString());
+			bean.setMemberTel(null == obj[11] ? null : obj[11].toString());
+			bean.setStoreName(null == obj[12] ? null : obj[12].toString());
+			result.add(bean);
+		}
+		return result;
+	}
+	
+	/**
+	 * 方法名称:回复
+	 * 功能描述:回复
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@Transactional
+	public void reply(BuComplaint complaint) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("UPDATE bu_complaint SET REPLY = '" + complaint.getReply() + "' WHERE COMPLAINT_ID = " + complaint.getComplaintId());
+		this.executeSql(sql.toString());
+	}
+
+
+	/****************************************  分割线 用户端   ***********************************************/
+
+	/**
+	 * 方法名称:获取投诉列表
+	 * 功能描述:获取投诉列表
+	 * 参数说明:
+	 * 作    者:Yangyk
+	 * 日    期:2023-05-23
+	 */
+	@SuppressWarnings("unchecked")
+	public List<BuComplaintBean> getMemberComplaintList(PageControlData pageControlData, BuComplaintSearchBean searchBean) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT a.COMPLAINT_ID, a.ORDER_CODE, a.STORE_ID, a.MEMBER_ID, a.TYPE, a.CONTENT, a.IMG_URL, a.REPLY, a.`STATUS`, a.CREATE_DATE, ");
+		sql.append("a.MEMBER_NAME, a.MEMBER_TEL, s.STORE_NAME , a.REPLY_DATE FROM bu_complaint a LEFT JOIN bu_store s ON a.STORE_ID = s.STORE_ID WHERE 1 = 1" + searchBean.getSerchCondition());
+		sql.append(" ORDER BY a.CREATE_DATE DESC ");
+		List<Object> objs = this.searchBySql(pageControlData, sql.toString());
+		List<BuComplaintBean> result = new ArrayList<>();
+		for(int i = 0; i < objs.size(); i++) {
+			Object[] obj = (Object[]) objs.get(i);
+			BuComplaintBean bean = new BuComplaintBean();
+			bean.setComplaintId(null == obj[0] ? null : Long.valueOf(obj[0].toString()));
+			bean.setOrderCode(null == obj[1] ? null : obj[1].toString());
+			bean.setStoreId(null == obj[2] ? null : Long.valueOf(obj[2].toString()));
+			bean.setMemberId(null == obj[3] ? null : Long.valueOf(obj[3].toString()));
+			bean.setType(null == obj[4] ? null : Long.valueOf(obj[4].toString()));
+			bean.setContent(null == obj[5] ? null : obj[5].toString());
+			bean.setImgUrl(null == obj[6] ? null : obj[6].toString());
+			bean.setReply(null == obj[7] ? null : obj[7].toString());
+			bean.setStatus(null == obj[8] ? null : Long.valueOf(obj[8].toString()));
+			bean.setCreateDate(null == obj[9] ? null : Timestamp.valueOf(obj[9].toString()));
+			bean.setMemberName(null == obj[10] ? null : obj[10].toString());
+			bean.setMemberTel(null == obj[11] ? null : obj[11].toString());
+			bean.setStoreName(null == obj[12] ? null : obj[12].toString());
+			bean.setReplyDate(null == obj[13] ? null : Timestamp.valueOf(obj[13].toString()));
+			result.add(bean);
+		}
+		return result;
+	}
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов