Jelajahi Sumber

first commit

xujunwei 7 bulan lalu
melakukan
6a75aea7f3
100 mengubah file dengan 375309 tambahan dan 0 penghapusan
  1. 43 0
      .gitignore
  2. 10 0
      Dockerfile
  3. 29 0
      build_image.sh
  4. 9996 0
      log/mrxu-manager/2025-07-06.0.log
  5. 3619 0
      log/mrxu-manager/2025-07-07.0.log
  6. 96668 0
      log/mrxu-manager/2025-07-11.0.log
  7. 146312 0
      log/mrxu-manager/2025-07-12.0.log
  8. 69182 0
      log/mrxu-manager/application.log
  9. 40502 0
      log/mrxu-manager/error.log
  10. 176 0
      pom.xml
  11. 311 0
      settings.xml
  12. 36 0
      src/main/java/com/mrxu/AdminApplication.java
  13. 163 0
      src/main/java/com/mrxu/admin/MainController.java
  14. 195 0
      src/main/java/com/mrxu/admin/Test.java
  15. 24 0
      src/main/java/com/mrxu/admin/config/FreemarkerConfig.java
  16. 49 0
      src/main/java/com/mrxu/admin/controller/AdminBaseController.java
  17. 132 0
      src/main/java/com/mrxu/admin/controller/base/AttachmentController.java
  18. 124 0
      src/main/java/com/mrxu/admin/controller/base/CmsPageController.java
  19. 85 0
      src/main/java/com/mrxu/admin/controller/base/DicDataController.java
  20. 51 0
      src/main/java/com/mrxu/admin/controller/base/OperateLogController.java
  21. 155 0
      src/main/java/com/mrxu/admin/controller/base/SysDeptController.java
  22. 72 0
      src/main/java/com/mrxu/admin/controller/base/SysMenuController.java
  23. 88 0
      src/main/java/com/mrxu/admin/controller/base/SysPrinterController.java
  24. 118 0
      src/main/java/com/mrxu/admin/controller/base/SysProductController.java
  25. 110 0
      src/main/java/com/mrxu/admin/controller/base/SysRoleController.java
  26. 148 0
      src/main/java/com/mrxu/admin/controller/base/SysUserController.java
  27. 135 0
      src/main/java/com/mrxu/admin/controller/base/TenantController.java
  28. 224 0
      src/main/java/com/mrxu/admin/controller/base/TenantGroupController.java
  29. 55 0
      src/main/java/com/mrxu/admin/controller/base/TenantRegisterController.java
  30. 63 0
      src/main/java/com/mrxu/admin/controller/base/TenantReviewController.java
  31. 213 0
      src/main/java/com/mrxu/admin/controller/base/WxAuthController.java
  32. 55 0
      src/main/java/com/mrxu/admin/controller/base/WxComponentDraftController.java
  33. 83 0
      src/main/java/com/mrxu/admin/controller/base/WxComponentTemplateController.java
  34. 57 0
      src/main/java/com/mrxu/admin/controller/base/WxConfigController.java
  35. 81 0
      src/main/java/com/mrxu/admin/controller/base/WxOrderController.java
  36. 76 0
      src/main/java/com/mrxu/admin/controller/base/WxTemplateMsgController.java
  37. 89 0
      src/main/java/com/mrxu/admin/controller/base/WxTokenController.java
  38. 106 0
      src/main/java/com/mrxu/admin/controller/bbs/BbsArticleController.java
  39. 88 0
      src/main/java/com/mrxu/admin/controller/bbs/BbsClassController.java
  40. 88 0
      src/main/java/com/mrxu/admin/controller/bbs/BbsDiscussController.java
  41. 55 0
      src/main/java/com/mrxu/admin/controller/crm/BalanceRecordController.java
  42. 122 0
      src/main/java/com/mrxu/admin/controller/crm/ContractPayController.java
  43. 115 0
      src/main/java/com/mrxu/admin/controller/crm/ContractPayPlanController.java
  44. 58 0
      src/main/java/com/mrxu/admin/controller/crm/ContractPayReviewController.java
  45. 72 0
      src/main/java/com/mrxu/admin/controller/crm/MemberAddressController.java
  46. 136 0
      src/main/java/com/mrxu/admin/controller/crm/MemberBaseController.java
  47. 131 0
      src/main/java/com/mrxu/admin/controller/crm/MemberContractController.java
  48. 58 0
      src/main/java/com/mrxu/admin/controller/crm/MemberContractReviewController.java
  49. 89 0
      src/main/java/com/mrxu/admin/controller/crm/MemberIndustryController.java
  50. 89 0
      src/main/java/com/mrxu/admin/controller/crm/MemberLevelController.java
  51. 83 0
      src/main/java/com/mrxu/admin/controller/crm/MemberLiaisonController.java
  52. 101 0
      src/main/java/com/mrxu/admin/controller/crm/MemberNicheController.java
  53. 118 0
      src/main/java/com/mrxu/admin/controller/crm/MemberProductController.java
  54. 49 0
      src/main/java/com/mrxu/admin/controller/crm/MemberProductFlowController.java
  55. 106 0
      src/main/java/com/mrxu/admin/controller/crm/MemberSeaController.java
  56. 89 0
      src/main/java/com/mrxu/admin/controller/crm/MemberSourceController.java
  57. 101 0
      src/main/java/com/mrxu/admin/controller/crm/MemberVisitController.java
  58. 82 0
      src/main/java/com/mrxu/admin/controller/crm/OnceCardController.java
  59. 72 0
      src/main/java/com/mrxu/admin/controller/crm/OnceMemberController.java
  60. 72 0
      src/main/java/com/mrxu/admin/controller/crm/OnceRecordController.java
  61. 82 0
      src/main/java/com/mrxu/admin/controller/crm/PayWayController.java
  62. 40 0
      src/main/java/com/mrxu/admin/controller/crm/PointRecordController.java
  63. 69 0
      src/main/java/com/mrxu/admin/controller/crm/RechargeConfigController.java
  64. 89 0
      src/main/java/com/mrxu/admin/controller/crm/RptCrmController.java
  65. 89 0
      src/main/java/com/mrxu/admin/controller/crm/SalesStageController.java
  66. 115 0
      src/main/java/com/mrxu/admin/controller/flow/FlowApiController.java
  67. 76 0
      src/main/java/com/mrxu/admin/controller/flow/FlowApiParamHistoryController.java
  68. 85 0
      src/main/java/com/mrxu/admin/controller/flow/FlowSupplierController.java
  69. 157 0
      src/main/java/com/mrxu/admin/controller/iot/IotDeviceController.java
  70. 40 0
      src/main/java/com/mrxu/admin/controller/iot/IotDeviceHistoryVideoController.java
  71. 70 0
      src/main/java/com/mrxu/admin/controller/iot/IotDeviceRecordPlayController.java
  72. 88 0
      src/main/java/com/mrxu/admin/controller/iot/IotDeviceVideoController.java
  73. 79 0
      src/main/java/com/mrxu/admin/controller/sales/CategoryController.java
  74. 92 0
      src/main/java/com/mrxu/admin/controller/sales/DutyChargeController.java
  75. 86 0
      src/main/java/com/mrxu/admin/controller/sales/DutyDataController.java
  76. 95 0
      src/main/java/com/mrxu/admin/controller/sales/DutyOrderGoodsDoController.java
  77. 88 0
      src/main/java/com/mrxu/admin/controller/sales/DutyOrderGoodsGetController.java
  78. 88 0
      src/main/java/com/mrxu/admin/controller/sales/DutyOrderGoodsPostController.java
  79. 87 0
      src/main/java/com/mrxu/admin/controller/sales/DutyOrderGoodsReviewController.java
  80. 129 0
      src/main/java/com/mrxu/admin/controller/sales/DutyProjectController.java
  81. 88 0
      src/main/java/com/mrxu/admin/controller/sales/DutyProjectItemController.java
  82. 96 0
      src/main/java/com/mrxu/admin/controller/sales/DutyRecordAddController.java
  83. 69 0
      src/main/java/com/mrxu/admin/controller/sales/DutyRecordController.java
  84. 72 0
      src/main/java/com/mrxu/admin/controller/sales/DutyRecordProjectController.java
  85. 107 0
      src/main/java/com/mrxu/admin/controller/sales/DutyRuleItemController.java
  86. 109 0
      src/main/java/com/mrxu/admin/controller/sales/DutyTimeItemController.java
  87. 203 0
      src/main/java/com/mrxu/admin/controller/sales/DutyWorkController.java
  88. 194 0
      src/main/java/com/mrxu/admin/controller/sales/GoodsController.java
  89. 75 0
      src/main/java/com/mrxu/admin/controller/sales/GoodsFlowController.java
  90. 138 0
      src/main/java/com/mrxu/admin/controller/sales/GoodsPackageController.java
  91. 58 0
      src/main/java/com/mrxu/admin/controller/sales/GoodsStockWarnController.java
  92. 75 0
      src/main/java/com/mrxu/admin/controller/sales/HisDrugController.java
  93. 76 0
      src/main/java/com/mrxu/admin/controller/sales/HisPatientController.java
  94. 119 0
      src/main/java/com/mrxu/admin/controller/sales/HisProjectController.java
  95. 106 0
      src/main/java/com/mrxu/admin/controller/sales/ItemOrderCgBackController.java
  96. 129 0
      src/main/java/com/mrxu/admin/controller/sales/ItemOrderCgController.java
  97. 87 0
      src/main/java/com/mrxu/admin/controller/sales/ItemOrderController.java
  98. 80 0
      src/main/java/com/mrxu/admin/controller/sales/ItemOrderDutyController.java
  99. 75 0
      src/main/java/com/mrxu/admin/controller/sales/ItemOrderPayoutController.java
  100. 0 0
      src/main/java/com/mrxu/admin/controller/sales/PayoutClassController.java

+ 43 - 0
.gitignore

@@ -0,0 +1,43 @@
+.gradle
+build/
+!gradle/wrapper/gradle-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+out/
+.shelf/
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+
+### VS Code ###
+.vscode/
+
+### Maven ###
+target/
+
+### logs ###
+logs/
+
+application-local.yml
+application-default.yml
+http-client.private.env.json
+
+*.hprof
+lombok.config

+ 10 - 0
Dockerfile

@@ -0,0 +1,10 @@
+FROM openjdk:8-jdk-alpine
+MAINTAINER jsonxu<215696643@qq.com>
+
+RUN apk add curl tzdata bash \
+    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
+    && echo "Asia/Shanghai" > /etc/timezone \
+    && apk del tzdata
+
+ADD target/mrxu-admin.jar /
+CMD java -jar /mrxu-admin.jar  -Xms400m -Xmx400m --server.port=8080

+ 29 - 0
build_image.sh

@@ -0,0 +1,29 @@
+#!/bin/sh
+project_name="mrxu-admin"
+
+echo "更新${project_name}"
+cd /data/code/${project_name}/
+git pull
+
+mvn install -Dmaven.test.skip=true -Denvironment=dev -U
+retval=$?
+if [ ${retval} -ne 0 ] ; then
+	echo "/data/code/${project_name}/打包失败!"
+	exit 1
+
+else
+	echo "/data/code/${project_name}/打包成功!"
+fi
+
+docker build -f /data/code/${project_name}/Dockerfile  -t ccr.ccs.tencentyun.com/mrxu-prod/${project_name} .
+docker login ccr.ccs.tencentyun.com --username=100022048383 -p=Danchaofan2009
+docker push ccr.ccs.tencentyun.com/mrxu-prod/${project_name}
+
+
+# get image id
+# image_id=$(docker images|grep "${project_name}"|awk '{print $3}')
+# echo "get image is ${image_id}"
+
+# docker tag -t ${image_id} ccr.ccs.tencentyun.com/mrxu-prod/${project_name}
+# docker push ccr.ccs.tencentyun.com/mrxu-prod/${project_name}
+

File diff ditekan karena terlalu besar
+ 9996 - 0
log/mrxu-manager/2025-07-06.0.log


File diff ditekan karena terlalu besar
+ 3619 - 0
log/mrxu-manager/2025-07-07.0.log


File diff ditekan karena terlalu besar
+ 96668 - 0
log/mrxu-manager/2025-07-11.0.log


File diff ditekan karena terlalu besar
+ 146312 - 0
log/mrxu-manager/2025-07-12.0.log


File diff ditekan karena terlalu besar
+ 69182 - 0
log/mrxu-manager/application.log


File diff ditekan karena terlalu besar
+ 40502 - 0
log/mrxu-manager/error.log


+ 176 - 0
pom.xml

@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.mrxu</groupId>
+    <artifactId>mrxu-yolo</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>mrxu-yolo</name>
+    <description>商户模块服务</description>
+
+    <parent>
+        <groupId>com.mrxu</groupId>
+        <artifactId>mrxu-upgrader</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk18on</artifactId>
+            <version>1.76</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>com.mrxu</groupId>
+            <artifactId>framework-boot</artifactId>
+            <exclusions>
+                <!-- spring cloud 引用 web service 客户端
+                <exclusion>
+                    <groupId>org.springframework.cloud</groupId>
+                    <artifactId>spring-cloud-starter-openfeign</artifactId>
+                </exclusion> -->
+            </exclusions>
+        </dependency>
+
+        <!-- framemark -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.mingsoft</groupId>
+            <artifactId>shiro-freemarker-tags</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+
+
+        <!-- 图形验证码 -->
+        <dependency>
+            <groupId>com.github.whvcse</groupId>
+            <artifactId>easy-captcha</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+
+        <!-- shiro -->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+            <version>1.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.crazycake</groupId>
+            <artifactId>shiro-redis</artifactId>
+            <version>3.2.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.mrxu</groupId>
+            <artifactId>mrxu-starter-rocketmq</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.mrxu</groupId>
+            <artifactId>mrxu-starter-redisson</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <!-- mrxu-starter-xxljob -->
+        <dependency>
+            <groupId>com.mrxu</groupId>
+            <artifactId>mrxu-starter-xxljob</artifactId>
+        </dependency>
+
+        <!--测试环境报错-->
+        <dependency>
+            <groupId>org.codehaus.janino</groupId>
+            <artifactId>janino</artifactId>
+            <version>2.6.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jasypt</groupId>
+            <artifactId>jasypt</artifactId>
+            <version>1.9.3</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibabacloud-dysmsapi20170525</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+
+        <!-- Spring Cache是一个框架 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <!--easyexcel导入导出-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
+
+        <!--liteflow https://liteflow.cc/pages/df6982/-->
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>liteflow-spring-boot-starter</artifactId>
+            <version>2.12.4.1</version>
+        </dependency>
+        <!--从2.11.1版本开始,你可以在代码中动态组装EL表达式,包括创建、修改、输出EL表达式-->
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>liteflow-el-builder</artifactId>
+            <version>2.12.4.1</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <finalName>mrxu-yolo</finalName>
+        <plugins>
+            <!-- spring boot 插件 -可打成单独可运行的JAR spring.boot.version 已声明 -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.0.1.RELEASE</version>
+                <configuration>
+                    <mainClass>com.mrxu.AdminApplication</mainClass>
+                    <layout>JAR</layout>
+                    <!-- 如果没有该项配置,devtools不会起作用,即应用不会restart -->
+                    <fork>true</fork>
+                    <addResources>true</addResources>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <!-- 发布插件 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 311 - 0
settings.xml

@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<!--
+ | This is the configuration file for Maven. It can be specified at two levels:
+ |
+ |  1. User Level. This settings.xml file provides configuration for a single user,
+ |                 and is normally provided in ${user.home}/.m2/settings.xml.
+ |
+ |                 NOTE: This location can be overridden with the CLI option:
+ |
+ |                 -s /path/to/user/settings.xml
+ |
+ |  2. Global Level. This settings.xml file provides configuration for all Maven
+ |                 users on a machine (assuming they're all using the same Maven
+ |                 installation). It's normally provided in
+ |                 ${maven.conf}/settings.xml.
+ |
+ |                 NOTE: This location can be overridden with the CLI option:
+ |
+ |                 -gs /path/to/global/settings.xml
+ |
+ | The sections in this sample file are intended to give you a running start at
+ | getting the most out of your Maven installation. Where appropriate, the default
+ | values (values used when the setting is not specified) are provided.
+ |
+ |-->
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+    <!-- localRepository
+     | The path to the local repository maven will use to store artifacts.
+     |
+     | Default: ${user.home}/.m2/repository
+    <localRepository>/path/to/local/repo</localRepository>
+
+    <localRepository>c:/work/repo</localRepository>-->
+
+    <!-- interactiveMode
+     | This will determine whether maven prompts you when it needs input. If set to false,
+     | maven will use a sensible default value, perhaps based on some other setting, for
+     | the parameter in question.
+     |
+     | Default: true
+    <interactiveMode>true</interactiveMode>
+    -->
+
+    <!-- offline
+     | Determines whether maven should attempt to connect to the network when executing a build.
+     | This will have an effect on artifact downloads, artifact deployment, and others.
+     |
+     | Default: false
+    <offline>false</offline>
+    -->
+
+    <!-- pluginGroups
+     | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
+     | when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
+     | "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
+     |-->
+    <pluginGroups>
+        <!-- pluginGroup
+         | Specifies a further group identifier to use for plugin lookup.
+        <pluginGroup>com.your.plugins</pluginGroup>
+        -->
+    </pluginGroups>
+
+    <!-- proxies
+     | This is a list of proxies which can be used on this machine to connect to the network.
+     | Unless otherwise specified (by system property or command-line switch), the first proxy
+     | specification in this list marked as active will be used.
+     |-->
+    <proxies>
+        <!-- proxy
+         | Specification for one proxy, to be used in connecting to the network.
+         |
+        <proxy>
+          <id>optional</id>
+          <active>true</active>
+          <protocol>http</protocol>
+          <username>proxyuser</username>
+          <password>proxypass</password>
+          <host>proxy.host.net</host>
+          <port>80</port>
+          <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
+        </proxy>
+        -->
+    </proxies>
+
+    <!-- servers
+     | This is a list of authentication profiles, keyed by the server-id used within the system.
+     | Authentication profiles can be used whenever maven must make a connection to a remote server.
+     |-->
+    <servers>
+        <!-- server
+         | Specifies the authentication information to use when connecting to a particular server, identified by
+         | a unique name within the system (referred to by the 'id' attribute below).
+         |
+         | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
+         |       used together.
+         |
+        <server>
+          <id>deploymentRepo</id>
+          <username>repouser</username>
+          <password>repopwd</password>
+        </server>
+        -->
+
+        <!-- Another sample, using keys to authenticate.
+        <server>
+          <id>siteServer</id>
+          <privateKey>/path/to/private/key</privateKey>
+          <passphrase>optional; leave empty if not used.</passphrase>
+        </server>
+        -->
+        <server>
+            <id>releases</id>
+            <username>admin</username>
+            <password>zhuzhoutong998</password>
+        </server>
+
+        <server>
+            <id>snapshots</id>
+            <username>admin</username>
+            <password>zhuzhoutong998</password>
+        </server>
+
+        <server>
+            <id>public</id>
+            <username>admin</username>
+            <password>zhuzhoutong998</password>
+        </server>
+    </servers>
+
+    <!-- mirrors
+     | This is a list of mirrors to be used in downloading artifacts from remote repositories.
+     |
+     | It works like this: a POM may declare a repository to use in resolving certain artifacts.
+     | However, this repository may have problems with heavy traffic at times, so people have mirrored
+     | it to several places.
+     |
+     | That repository definition will have a unique id, so we can create a mirror reference for that
+     | repository, to be used as an alternate download site. The mirror site will be the preferred
+     | server for that repository.
+     |-->
+    <mirrors>
+        <mirror>
+            <id>alimaven</id>
+            <name>aliyun maven</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <mirrorOf>central</mirrorOf>
+        </mirror>
+
+        <mirror>
+            <id>ALiYunMaven</id>
+            <mirrorOf>*</mirrorOf>
+            <name>阿里云公共仓库</name>
+            <url>https://maven.aliyun.com/repository/public</url>
+        </mirror>
+    </mirrors>
+
+    <!-- profiles
+     | This is a list of profiles which can be activated in a variety of ways, and which can modify
+     | the build process. Profiles provided in the settings.xml are intended to provide local machine-
+     | specific paths and repository locations which allow the build to work in the local environment.
+     |
+     | For example, if you have an integration testing plugin - like cactus - that needs to know where
+     | your Tomcat instance is installed, you can provide a variable here such that the variable is
+     | dereferenced during the build process to configure the cactus plugin.
+     |
+     | As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
+     | section of this document (settings.xml) - will be discussed later. Another way essentially
+     | relies on the detection of a system property, either matching a particular value for the property,
+     | or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
+     | value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
+     | Finally, the list of active profiles can be specified directly from the command line.
+     |
+     | NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
+     |       repositories, plugin repositories, and free-form properties to be used as configuration
+     |       variables for plugins in the POM.
+     |
+     |-->
+    <profiles>
+        <!-- profile
+         | Specifies a set of introductions to the build process, to be activated using one or more of the
+         | mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/>
+         | or the command line, profiles have to have an ID that is unique.
+         |
+         | An encouraged best practice for profile identification is to use a consistent naming convention
+         | for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.
+         | This will make it more intuitive to understand what the set of introduced profiles is attempting
+         | to accomplish, particularly when you only have a list of profile id's for debug.
+         |
+         | This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.
+        <profile>
+          <id>jdk-1.4</id>
+
+          <activation>
+            <jdk>1.4</jdk>
+          </activation>
+
+          <repositories>
+            <repository>
+              <id>jdk14</id>
+              <name>Repository for JDK 1.4 builds</name>
+              <url>http://www.myhost.com/maven/jdk14</url>
+              <layout>default</layout>
+              <snapshotPolicy>always</snapshotPolicy>
+            </repository>
+          </repositories>
+        </profile>
+        -->
+
+        <!--
+         | Here is another profile, activated by the system property 'target-env' with a value of 'dev',
+         | which provides a specific path to the Tomcat instance. To use this, your plugin configuration
+         | might hypothetically look like:
+         |
+         | ...
+         | <plugin>
+         |   <groupId>org.myco.myplugins</groupId>
+         |   <artifactId>myplugin</artifactId>
+         |
+         |   <configuration>
+         |     <tomcatLocation>${tomcatPath}</tomcatLocation>
+         |   </configuration>
+         | </plugin>
+         | ...
+         |
+         | NOTE: If you just wanted to inject this configuration whenever someone set 'target-env' to
+         |       anything, you could just leave off the <value/> inside the activation-property.
+         |
+        <profile>
+          <id>env-dev</id>
+
+          <activation>
+            <property>
+              <name>target-env</name>
+              <value>dev</value>
+            </property>
+          </activation>
+
+          <properties>
+            <tomcatPath>/path/to/tomcat/instance</tomcatPath>
+          </properties>
+        </profile>
+        -->
+        <profile>
+            <id>nexus</id>
+            <!-- 下载依赖仓库 -->
+            <repositories>
+                <repository>
+                    <id>public</id>
+                    <name>Public Repositories</name>
+                    <url>http://118.25.71.241:8081/nexus/content/groups/public/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </repository>
+            </repositories>
+
+            <!-- 插件依赖仓库 -->
+            <pluginRepositories>
+                <pluginRepository>
+                    <id>public</id>
+                    <name>Public Repositories</name>
+                    <url>http://118.25.71.241:8081/nexus/content/groups/public/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </pluginRepository>
+            </pluginRepositories>
+        </profile>
+    </profiles>
+
+    <!-- activeProfiles
+     | List of profiles that are active for all builds.
+     |
+    <activeProfiles>
+      <activeProfile>alwaysActiveProfile</activeProfile>
+      <activeProfile>anotherAlwaysActiveProfile</activeProfile>
+    </activeProfiles>
+    -->
+    <activeProfiles>
+        <activeProfile>nexus</activeProfile>
+    </activeProfiles>
+</settings>

+ 36 - 0
src/main/java/com/mrxu/AdminApplication.java

@@ -0,0 +1,36 @@
+package com.mrxu;
+
+import com.alibaba.excel.read.listener.PageReadListener;
+import com.mrxu.framework.boot.config.FeignAutoConfiguration;
+import com.mrxu.framework.boot.handle.WebExceptionHandler;
+import com.mrxu.framework.starter.redisson.anno.EnableRedisson;
+import com.mrxu.framework.starter.rocketmq.anno.EnableRocketmq;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+
+@SpringBootApplication
+@WebExceptionHandler.EnableWebExceptionHandler
+@FeignAutoConfiguration.SwaggerConfig.Enable
+@MapperScan(basePackages = {"com.mrxu.*.mapper"})
+@ServletComponentScan("com.mrxu.admin.filter")
+@EnableRocketmq
+@EnableRedisson
+@EnableCaching
+@EnableAsync
+@EnableFeignClients(basePackages = {"com.mrxu.third","com.mrxu.iot.third","com.mrxu.yolo.python"})
+public class AdminApplication {
+
+    public static void main(String[] args) {
+        // Excel导入每次可以导入1万条
+        PageReadListener.BATCH_COUNT = 10000;
+        SpringApplication.run(AdminApplication.class, args);
+    }
+
+}
+

+ 163 - 0
src/main/java/com/mrxu/admin/MainController.java

@@ -0,0 +1,163 @@
+package com.mrxu.admin;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.anno.OperateLogType;
+import com.mrxu.base.dto.LoginDto;
+import com.mrxu.base.entity.SysMenu;
+import com.mrxu.base.entity.Tenant;
+import com.mrxu.base.enums.MenuForFront;
+import com.mrxu.base.model.LoginUserInfo;
+import com.mrxu.base.service.SysProductService;
+import com.mrxu.base.service.SysUserService;
+import com.mrxu.base.service.TenantService;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.wf.captcha.utils.CaptchaUtil;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.authz.annotation.RequiresUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.error.ErrorController;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@Slf4j
+@Api(tags = "商户管理")
+@Controller
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MainController extends AdminBaseController implements ErrorController {
+
+    @Value("${spring.profiles.active}")
+    private String profiles;
+
+    private final SysProductService productService;
+
+    private final TenantService tenantService;
+
+    private final SysUserService userService;
+
+    // 万能验证码
+    private String rightCode = "0add8f2717b0691442d548f1fd277e4f";
+
+    @OperateLogType(name = "登录",type = "login" )
+    @ResponseBody
+    @RequestMapping("/login.json")
+    public ResponseObj<String> login(String username, String password, String code, @RequestParam(defaultValue="false",required=true)Boolean remember, HttpServletRequest request) {
+        log.info("登录用户:{}",username);
+        MrxuAssert.isNotEmpty(username,"请输入账号");
+
+        // 为了方便本地dev环境不校验验证码
+        if(!"dev".equals(profiles)) {
+            MrxuAssert.isTrue(rightCode.equals(code) || CaptchaUtil.ver(code, request),"验证码不正确");
+        }
+
+        SecurityUtils.getSubject().login(new UsernamePasswordToken(username, password, remember));
+        log.info("用户:{}登录成功",username);
+        return success(request.getSession().getId());
+    }
+
+    @OperateLogType(name = "登录",type = "login" )
+    @ResponseBody
+    @PostMapping("/login")
+    public ResponseObj<String> login(@RequestBody LoginDto loginDto, HttpServletRequest request) {
+        SecurityUtils.getSubject().login(new UsernamePasswordToken(loginDto.getUsername(),
+                loginDto.getPassword(), loginDto.getRemember()));
+        return success(request.getSession().getId());
+    }
+
+    @RequiresUser
+    @ResponseBody
+    @GetMapping("/getUserInfo.json")
+    public ResponseObj<LoginUserInfo> getUserInfo() {
+        LoginUserInfo userInfo = userService.getLoginUserInfo(getLoginUser());
+        return success(userInfo);
+    }
+
+    /**
+     * 主页
+     */
+    @RequestMapping({"/", "/index"})
+    public String index(Model model) {
+        List<SysMenu> menus = productService.getUserMenuTree(getLoginUser(), MenuForFront.oldFront);
+        model.addAttribute("menus",menus);
+
+        Tenant tenant = tenantService.getByTenantId(getTenantId());
+        model.addAttribute("tenant",tenant);
+        return "index.html";
+    }
+
+    /**
+     * 登录页
+     */
+    @GetMapping("/login.html")
+    public String login() {
+        return "login.html";
+    }
+
+    /**
+     * logout退出
+     * @return
+     */
+    @GetMapping("/logout")
+    public String logout() {
+        if(SecurityUtils.getSubject() != null) {
+            SecurityUtils.getSubject().logout();
+        }
+        return "redirect:/login.html";
+    }
+
+    @GetMapping("/home.html")
+    public String home() {
+        return "crm/home.html";
+    }
+
+    /**
+     * 图形验证码
+     */
+    @RequestMapping("/assets/captcha")
+    public void captcha(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            CaptchaUtil.out(5, request, response);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 主页弹窗页面
+     */
+    @RequestMapping("/tpl/{name}")
+    public String tpl(@PathVariable("name") String name) {
+        return "index/" + name + ".html";
+    }
+
+    /**
+     * 错误页
+     */
+    @RequestMapping("/error")
+    public String error(HttpServletRequest request) {
+        String code = request.getAttribute("javax.servlet.error.status_code").toString();
+        if("404".equals(code)) {
+            return "error/404.html";
+        }
+        request.setAttribute("message",request.getAttribute("javax.servlet.error.message"));
+        return "error/500.html";
+    }
+
+    // 1 第一次提交修改
+    @Override
+    public String getErrorPath() {
+        return "/error";
+    }
+
+}

+ 195 - 0
src/main/java/com/mrxu/admin/Test.java

@@ -0,0 +1,195 @@
+package com.mrxu.admin;
+
+public class Test {
+
+    private static String font = "icon-accessory:before { content: e6dd}\n" +
+            ".icon-activity:before { content: e6de}\n" +
+            ".icon-activity_fill:before { content: e6df}\n" +
+            ".icon-add:before { content: e6e0}\n" +
+            ".icon-addition_fill:before { content: e6e1}\n" +
+            ".icon-addition:before { content: e6e2}\n" +
+            ".icon-addpeople_fill:before { content: e6e3}\n" +
+            ".icon-addpeople:before { content: e6e4}\n" +
+            ".icon-addressbook_fill:before { content: e6e5}\n" +
+            ".icon-addressbook:before { content: e6e6}\n" +
+            ".icon-barrage_fill:before { content: e6e7}\n" +
+            ".icon-barrage:before { content: e6e8}\n" +
+            ".icon-browse_fill:before { content: e6e9}\n" +
+            ".icon-browse:before { content: e6ea}\n" +
+            ".icon-brush:before { content: e6eb}\n" +
+            ".icon-brush_fill:before { content: e6ec}\n" +
+            ".icon-businesscard_fill:before { content: e6ed}\n" +
+            ".icon-businesscard:before { content: e6ee}\n" +
+            ".icon-camera_fill:before { content: e6ef}\n" +
+            ".icon-camera:before { content: e6f0}\n" +
+            ".icon-clock_fill:before { content: e6f1}\n" +
+            ".icon-clock:before { content: e6f2}\n" +
+            ".icon-close:before { content: e6f3}\n" +
+            ".icon-collection_fill:before { content: e6f4}\n" +
+            ".icon-collection:before { content: e6f5}\n" +
+            ".icon-computer_fill:before { content: e6f6}\n" +
+            ".icon-computer:before { content: e6f7}\n" +
+            ".icon-coordinates_fill:before { content: e6f8}\n" +
+            ".icon-coordinates:before { content: e6f9}\n" +
+            ".icon-coupons_fill:before { content: e6fa}\n" +
+            ".icon-coupons:before { content: e6fb}\n" +
+            ".icon-createtask_fill:before { content: e6fc}\n" +
+            ".icon-createtask:before { content: e6fd}\n" +
+            ".icon-customerservice_fill:before { content: e6fe}\n" +
+            ".icon-customerservice:before { content: e6ff}\n" +
+            ".icon-delete_fill:before { content: e700}\n" +
+            ".icon-delete:before { content: e701}\n" +
+            ".icon-document:before { content: e702}\n" +
+            ".icon-document_fill:before { content: e703}\n" +
+            ".icon-dynamic_fill:before { content: e704}\n" +
+            ".icon-dynamic:before { content: e705}\n" +
+            ".icon-editor:before { content: e706}\n" +
+            ".icon-eit:before { content: e707}\n" +
+            ".icon-emoji_fill:before { content: e708}\n" +
+            ".icon-emoji:before { content: e709}\n" +
+            ".icon-empty:before { content: e70a}\n" +
+            ".icon-empty_fill:before { content: e70b}\n" +
+            ".icon-enter:before { content: e70c}\n" +
+            ".icon-enterinto:before { content: e70d}\n" +
+            ".icon-enterinto_fill:before { content: e70e}\n" +
+            ".icon-feedback_fill:before { content: e70f}\n" +
+            ".icon-feedback:before { content: e710}\n" +
+            ".icon-flag_fill:before { content: e711}\n" +
+            ".icon-flag:before { content: e712}\n" +
+            ".icon-flashlight:before { content: e713}\n" +
+            ".icon-flashlight_fill:before { content: e714}\n" +
+            ".icon-flip:before { content: e715}\n" +
+            ".icon-flip_fill:before { content: e716}\n" +
+            ".icon-fullscreen:before { content: e717}\n" +
+            ".icon-group:before { content: e718}\n" +
+            ".icon-group_fill:before { content: e719}\n" +
+            ".icon-headlines_fill:before { content: e71a}\n" +
+            ".icon-headlines:before { content: e71b}\n" +
+            ".icon-homepage_fill:before { content: e71c}\n" +
+            ".icon-homepage:before { content: e71d}\n" +
+            ".icon-integral_fill:before { content: e71e}\n" +
+            ".icon-integral:before { content: e71f}\n" +
+            ".icon-interactive_fill:before { content: e720}\n" +
+            ".icon-interactive:before { content: e721}\n" +
+            ".icon-keyboard:before { content: e722}\n" +
+            ".icon-label:before { content: e723}\n" +
+            ".icon-label_fill:before { content: e724}\n" +
+            ".icon-like_fill:before { content: e725}\n" +
+            ".icon-like:before { content: e726}\n" +
+            ".icon-live_fill:before { content: e727}\n" +
+            ".icon-live:before { content: e728}\n" +
+            ".icon-lock_fill:before { content: e729}\n" +
+            ".icon-lock:before { content: e72a}\n" +
+            ".icon-mail:before { content: e72b}\n" +
+            ".icon-mail_fill:before { content: e72c}\n" +
+            ".icon-manage_fill:before { content: e72d}\n" +
+            ".icon-manage:before { content: e72e}\n" +
+            ".icon-message:before { content: e72f}\n" +
+            ".icon-message_fill:before { content: e730}\n" +
+            ".icon-mine:before { content: e731}\n" +
+            ".icon-mine_fill:before { content: e732}\n" +
+            ".icon-mobilephone_fill:before { content: e733}\n" +
+            ".icon-mobilephone:before { content: e734}\n" +
+            ".icon-more:before { content: e735}\n" +
+            ".icon-narrow:before { content: e736}\n" +
+            ".icon-offline_fill:before { content: e737}\n" +
+            ".icon-offline:before { content: e738}\n" +
+            ".icon-order_fill:before { content: e739}\n" +
+            ".icon-order:before { content: e73a}\n" +
+            ".icon-other:before { content: e73b}\n" +
+            ".icon-people_fill:before { content: e73c}\n" +
+            ".icon-people:before { content: e73d}\n" +
+            ".icon-picture_fill:before { content: e73e}\n" +
+            ".icon-picture:before { content: e73f}\n" +
+            ".icon-play:before { content: e740}\n" +
+            ".icon-play_fill:before { content: e741}\n" +
+            ".icon-playon_fill:before { content: e742}\n" +
+            ".icon-playon:before { content: e743}\n" +
+            ".icon-praise_fill:before { content: e744}\n" +
+            ".icon-praise:before { content: e745}\n" +
+            ".icon-prompt_fill:before { content: e746}\n" +
+            ".icon-prompt:before { content: e747}\n" +
+            ".icon-qrcode_fill:before { content: e748}\n" +
+            ".icon-qrcode:before { content: e749}\n" +
+            ".icon-redpacket_fill:before { content: e74a}\n" +
+            ".icon-redpacket:before { content: e74b}\n" +
+            ".icon-refresh:before { content: e74c}\n" +
+            ".icon-remind_fill:before { content: e74d}\n" +
+            ".icon-remind:before { content: e74e}\n" +
+            ".icon-return:before { content: e74f}\n" +
+            ".icon-right:before { content: e750}\n" +
+            ".icon-scan:before { content: e751}\n" +
+            ".icon-select_fill:before { content: e752}\n" +
+            ".icon-select:before { content: e753}\n" +
+            ".icon-send:before { content: e754}\n" +
+            ".icon-service_fill:before { content: e755}\n" +
+            ".icon-service:before { content: e756}\n" +
+            ".icon-setup_fill:before { content: e757}\n" +
+            ".icon-setup:before { content: e758}\n" +
+            ".icon-share_fill:before { content: e759}\n" +
+            ".icon-share:before { content: e75a}\n" +
+            ".icon-shielding_fill:before { content: e75b}\n" +
+            ".icon-shielding:before { content: e75c}\n" +
+            ".icon-smallscreen_fill:before { content: e75d}\n" +
+            ".icon-smallscreen:before { content: e75e}\n" +
+            ".icon-stealth_fill:before { content: e75f}\n" +
+            ".icon-stealth:before { content: e760}\n" +
+            ".icon-success_fill:before { content: e761}\n" +
+            ".icon-success:before { content: e762}\n" +
+            ".icon-suspend:before { content: e763}\n" +
+            ".icon-switch:before { content: e764}\n" +
+            ".icon-systemprompt_fill:before { content: e765}\n" +
+            ".icon-systemprompt:before { content: e766}\n" +
+            ".icon-tailor:before { content: e767}\n" +
+            ".icon-task:before { content: e768}\n" +
+            ".icon-task_fill:before { content: e769}\n" +
+            ".icon-tasklist_fill:before { content: e76a}\n" +
+            ".icon-tasklist:before { content: e76b}\n" +
+            ".icon-text:before { content: e76c}\n" +
+            ".icon-time_fill:before { content: e76d}\n" +
+            ".icon-time:before { content: e76e}\n" +
+            ".icon-translation_fill:before { content: e76f}\n" +
+            ".icon-translation:before { content: e770}\n" +
+            ".icon-trash:before { content: e771}\n" +
+            ".icon-trash_fill:before { content: e772}\n" +
+            ".icon-undo:before { content: e773}\n" +
+            ".icon-unlock_fill:before { content: e774}\n" +
+            ".icon-unlock:before { content: e775}\n" +
+            ".icon-video:before { content: e776}\n" +
+            ".icon-video_fill:before { content: e777}\n" +
+            ".icon-warning_fill:before { content: e778}\n" +
+            ".icon-warning:before { content: e779}\n" +
+            ".icon-workbench_fill:before { content: e77a}\n" +
+            ".icon-workbench:before { content: e77b}\n" +
+            ".icon-search:before { content: e77c}\n" +
+            ".icon-searchfill:before { content: e77d}\n" +
+            ".icon-qianniu:before { content: e77e}\n" +
+            ".icon-publishgoods_fill:before { content: e77f}\n" +
+            ".icon-shop_fill:before { content: e780}\n" +
+            ".icon-transaction_fill:before { content: e781}\n" +
+            ".icon-packup:before { content: e782}\n" +
+            ".icon-unfold:before { content: e783}\n" +
+            ".icon-wangwang:before { content: e784}\n" +
+            ".icon-financial_fill:before { content: e785}\n" +
+            ".icon-marketing_fill:before { content: e786}\n" +
+            ".icon-shake:before { content: e787}\n" +
+            ".icon-decoration_fill:before { content: e788}\n" +
+            ".icon-budaidise:before { content: e789}\n" +
+            ".icon-qianniudaidise:before { content: e78a}\n" +
+            ".icon-questions:before { content: e78b}\n" +
+            ".icon-supply:before { content: e78c}\n" +
+            ".icon-tools:before { content: e78d}\n" +
+            ".icon-int:before { content: e78e}\n" +
+            ".icon-commodity:before { content: e78f}\n" +
+            ".icon-zhtn:before { content: e790}";
+
+    public static void main(String[] args) throws Exception {
+        String[] array = font.split(".icon-");
+        StringBuilder sb = new StringBuilder();
+        for(int i=0;i<array.length;i++) {
+            sb.append(",\"mrxu-icon icon-"+array[i].substring(0,array[i].indexOf(":before"))+"\"");
+        }
+        System.out.println(sb.toString());
+    }
+
+}

+ 24 - 0
src/main/java/com/mrxu/admin/config/FreemarkerConfig.java

@@ -0,0 +1,24 @@
+package com.mrxu.admin.config;
+
+import com.mrxu.admin.shiro.ShiroExt;
+import freemarker.template.TemplateModelException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+
+@Configuration
+public class FreemarkerConfig {
+
+    @Autowired
+    private freemarker.template.Configuration configuration;
+
+    @PostConstruct
+    public void init() throws TemplateModelException {
+        configuration.setSharedVariable("so", new ShiroExt());
+        configuration.setSharedVariable("ctxPath","");
+        // 关闭默认的数字格式化,即不添加千位分隔符
+        configuration.setNumberFormat("#");
+    }
+
+}

+ 49 - 0
src/main/java/com/mrxu/admin/controller/AdminBaseController.java

@@ -0,0 +1,49 @@
+package com.mrxu.admin.controller;
+
+import com.mrxu.base.entity.SysUser;
+import com.mrxu.framework.boot.web.BaseController;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+
+
+public class AdminBaseController extends BaseController {
+
+    /**
+     * 获取当前登录的user
+     */
+    public SysUser getLoginUser() {
+        Subject subject = SecurityUtils.getSubject();
+        if (subject == null) return null;
+        Object object = subject.getPrincipal();
+        if (object != null) return (SysUser) object;
+        return null;
+    }
+
+    public String getGroupId() {
+        SysUser loginSysUser = getLoginUser();
+        return loginSysUser.getGroupId();
+    }
+
+    public String getTenantId() {
+        SysUser loginSysUser = getLoginUser();
+        return loginSysUser.getTenantId();
+    }
+
+    public String getUsername() {
+        SysUser loginSysUser = getLoginUser();
+        return loginSysUser.getUsername();
+    }
+
+    public Integer getDeptId() {
+        SysUser loginSysUser = getLoginUser();
+        return loginSysUser.getDeptId();
+    }
+
+    /**
+     * 获取当前登录的userId
+     */
+    public Integer getLoginUserId() {
+        SysUser loginSysUser = getLoginUser();
+        return loginSysUser == null ? null : loginSysUser.getId();
+    }
+}

+ 132 - 0
src/main/java/com/mrxu/admin/controller/base/AttachmentController.java

@@ -0,0 +1,132 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.AttachmentDto;
+import com.mrxu.base.entity.Attachment;
+import com.mrxu.base.service.AttachmentService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.framework.common.util.QiniuService;
+import com.mrxu.framework.common.util.StrFunc;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+@Api(tags = "附件管理")
+@Controller
+@RequestMapping("/base/attachment")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class AttachmentController extends AdminBaseController {
+
+	private final AttachmentService attachmentService;
+	
+	@RequiresPermissions("base:attachment:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "base/attachment.html";
+	}
+	
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<Attachment> page(AttachmentDto queryDto) {
+		queryDto.setCreatePerson(getUsername());
+		PageResult<Attachment> rs = attachmentService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:attachment:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody Attachment bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(attachmentService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:attachment:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(attachmentService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:attachment:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(attachmentService.removeBatch(getTenantId(),ids));
+	}
+
+	@ResponseBody
+	@RequestMapping("/upload.json")
+	public UploadRs upload(MultipartFile file,@RequestParam(defaultValue  = "/" )String dir) throws IOException {
+		String tenantId = "6000";
+		String userName = MrxuConst.defaultPerson;
+		try {
+			tenantId = getTenantId();
+			userName = getUsername();
+		}
+		catch (Exception e) {
+		}
+
+		String fileName = file.getOriginalFilename();
+		String fileExtension = fileName.substring(fileName.lastIndexOf(".")+1);
+		String fileType = Attachment.getType(fileExtension);
+		String filePath = DateFunc.getYear()+"/"+fileType+"/"+ StrFunc.randomString(64)+"."+fileExtension;
+		filePath = QiniuService.upload(file.getBytes(),filePath);
+		Attachment bean = new Attachment();
+		bean.setExtension(fileExtension);
+		bean.setTenantId(tenantId);
+		bean.setName(fileName);
+		bean.setSize(file.getSize());
+		bean.setUrl(QiniuService.url+ "/" + filePath);
+		bean.setTag(dir);
+		bean.setType(fileType);
+		attachmentService.saveOrUpdate(tenantId,bean,userName);
+		return new UploadRs(dir,bean.getUrl());
+	}
+
+	@Data
+	class UploadRs{
+
+		UploadRs(String dir,String location) {
+			this.dir = dir;
+			this.location = location;
+		}
+
+		@ApiModelProperty(value = "状态码")
+		private int code = 0;
+
+		@ApiModelProperty(value = "提示")
+		private String msg = "成功";
+
+		@ApiModelProperty(value = "路径")
+		private String dir;
+
+		@ApiModelProperty(value = "路径")
+		private String location;
+
+
+
+	}
+
+
+}

+ 124 - 0
src/main/java/com/mrxu/admin/controller/base/CmsPageController.java

@@ -0,0 +1,124 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.entity.CmsPage;
+import com.mrxu.base.enums.SysPage;
+import com.mrxu.base.dto.CmsPageDto;
+import com.mrxu.base.service.CmsPageService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.sales.service.DutyProjectClassService;
+import com.mrxu.sales.service.DutyProjectService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "自定义界面管理")
+@Controller
+@RequestMapping("/base/cmsPage")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class CmsPageController extends AdminBaseController {
+
+	private final CmsPageService cmsPageService;
+
+	private final DutyProjectService dutyProjectService;
+	private final DutyProjectClassService projectClassService;
+	
+	@RequiresPermissions("base:cmsPage:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("pageList", SysPage.values());
+		return "base/cmsPage.html";
+	}
+
+	@RequiresPermissions("base:cmsPage:read")
+	@RequestMapping("cmsChooseLink.html")
+	public String cmsChooseLink(Model model) {
+		String tenantId = getTenantId();
+		model.addAttribute("projectClassList",projectClassService.list(tenantId));
+		model.addAttribute("projectList",dutyProjectService.list(tenantId));
+		return "base/cmsChooseLink.html";
+	}
+
+	@RequiresPermissions("base:cmsPage:update")
+	@RequestMapping("cmsPageEdit.html")
+	public String cmsPageEdit(Model model) {
+		String tenantId = getTenantId();
+		if(getParaToInt("id") != null) {
+			CmsPage bean = cmsPageService.getById(tenantId,getParaToInt("id"));
+			model.addAttribute("bean",bean);
+		}
+		else {
+			model.addAttribute("bean",new CmsPage());
+		}
+		return "base/cmsPageEdit.html";
+	}
+
+	@RequiresPermissions("base:cmsPage:update")
+	@ResponseBody
+	@RequestMapping(value = "/save.json")
+	public ResponseObj<CmsPage> save(@Valid CmsPage bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(cmsPageService.save(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:cmsPage:update")
+	@ResponseBody
+	@RequestMapping(value = "/deploy.json")
+	public ResponseObj<Boolean> deploy(Integer id) {
+		String tenantId = getTenantId();
+		return success(cmsPageService.deploy(tenantId,id,getUsername()));
+	}
+
+	@RequiresPermissions("base:cmsPage:update")
+	@RequestMapping(value = "/publish.html")
+	public String publish(Integer id) {
+		String tenantId = getTenantId();
+		cmsPageService.deploy(tenantId,id,getUsername());
+		return "redirect:index.html";
+	}
+
+
+
+	@RequiresPermissions("base:cmsPage:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<CmsPage> page(CmsPageDto queryDto) {
+		PageResult<CmsPage> rs = cmsPageService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:cmsPage:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		return success(cmsPageService.updateStatus(getTenantId(),id,status,getUsername()));
+	}
+
+	@RequiresPermissions("base:cmsPage:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(cmsPageService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:cmsPage:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(cmsPageService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 85 - 0
src/main/java/com/mrxu/admin/controller/base/DicDataController.java

@@ -0,0 +1,85 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.DicDataDto;
+import com.mrxu.base.entity.DicData;
+import com.mrxu.base.service.DicDataService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import io.swagger.annotations.Api;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "字典管理")
+@Controller
+@RequestMapping("/sys/dic")
+public class DicDataController extends AdminBaseController {
+
+    @Autowired
+    private DicDataService dicDataService;
+
+    @RequiresPermissions("sys:dic:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        return "system/dic.html";
+    }
+
+    @RequiresPermissions("sys:dic:read")
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<DicData> page(DicDataDto queryDto) {
+        PageResult<DicData> rs = dicDataService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sys:dic:read")
+    @ResponseBody
+    @RequestMapping("/getById.json")
+    public ResponseObj<DicData> getById(Integer id) {
+        return success(dicDataService.getById(getTenantId(),id));
+    }
+
+    @RequiresPermissions("sys:dic:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Boolean> save(@Valid @RequestBody DicData bean) {
+        if(bean.getStatus() == null) {
+            bean.setStatus(MrxuConst.disable);
+        }
+        return success(dicDataService.saveOrUpdate(getTenantId(),bean,getUsername()));
+    }
+
+    @RequiresPermissions("sys:dic:update")
+    @ResponseBody
+    @RequestMapping("/updateStatus.json")
+    public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+        DicData bean = new DicData();
+        bean.setId(id);
+        bean.setStatus(status);
+        return success(dicDataService.saveOrUpdate(getTenantId(),bean,getUsername()));
+    }
+
+    @RequiresPermissions("sys:dic:remove")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(Integer id) {
+        return success(dicDataService.remove(getTenantId(),id));
+    }
+
+    @RequiresPermissions("sys:dic:remove")
+    @ResponseBody
+    @RequestMapping("/removeBatch.json")
+    public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+        return success(dicDataService.removeBatch(getTenantId(),ids));
+    }
+}

+ 51 - 0
src/main/java/com/mrxu/admin/controller/base/OperateLogController.java

@@ -0,0 +1,51 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.entity.OperateLog;
+import com.mrxu.base.query.OperateLogDto;
+import com.mrxu.base.service.OperateLogService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+
+@Api(tags = "操作日志管理")
+@Controller
+@RequestMapping("/base/operateLog")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class OperateLogController extends AdminBaseController {
+
+	private final OperateLogService operateLogService;
+	
+	@RequiresPermissions("base:operateLog:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "base/operateLog.html";
+	}
+	
+	@RequiresPermissions("base:operateLog:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<OperateLog> page(OperateLogDto queryDto) {
+		PageResult<OperateLog> rs = operateLogService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:operateLog:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody OperateLog bean) {
+		return success(operateLogService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+}

+ 155 - 0
src/main/java/com/mrxu/admin/controller/base/SysDeptController.java

@@ -0,0 +1,155 @@
+package com.mrxu.admin.controller.base;
+
+import com.alibaba.fastjson.JSON;
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.SysDeptDto;
+import com.mrxu.base.dto.SysUserDto;
+import com.mrxu.base.entity.SysDept;
+import com.mrxu.base.entity.SysRole;
+import com.mrxu.base.entity.SysUser;
+import com.mrxu.base.service.SysDeptService;
+import com.mrxu.base.service.SysPrinterService;
+import com.mrxu.base.service.SysRoleService;
+import com.mrxu.base.service.SysUserService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "部门管理")
+@Controller
+@RequestMapping("/sys/dept")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class SysDeptController extends AdminBaseController {
+
+    private final SysDeptService deptApi;
+
+    private final SysRoleService roleApi;
+
+    private final SysUserService userApi;
+
+    private final SysPrinterService printerService;
+
+    @RequiresPermissions("sys:dept:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("printerList",printerService.list(getTenantId()));
+        model.addAttribute("rolesJson", JSON.toJSONString(roleApi.list(getTenantId())));
+        return "system/dept.html";
+    }
+
+    @RequiresPermissions("sys:dept:read")
+    @ResponseBody
+    @RequestMapping("/userPage.json")
+    public LayuiPage<SysUser> userPage(SysUserDto queryDto) {
+        queryDto.setTenantId(getTenantId());
+        PageResult<SysUser> rs = userApi.page(queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sys:dept:update")
+    @ResponseBody
+    @RequestMapping("/saveUser.json")
+    public ResponseObj<Boolean> saveUser(@Valid @RequestBody SysUser sysUser, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        sysUser.setTenantId(getTenantId());
+        if(sysUser.getStatus() == null) {
+            sysUser.setStatus(MrxuConst.disable);
+        }
+        if(sysUser.getId() == null) {
+            sysUser.setCreatePerson(getUsername());
+        }
+        else {
+            sysUser.setUpdatePerson(getUsername());
+        }
+        return success(userApi.saveOrUpdate(sysUser));
+    }
+
+    @RequiresPermissions("sys:dept:update")
+    @ResponseBody
+    @RequestMapping("/updateUserStatus.json")
+    public ResponseObj<Boolean> updateUserStatus(Integer id, Integer status) {
+        return success(userApi.updateStatus(getTenantId(),id,status,getUsername()));
+    }
+
+    @RequiresPermissions("sys:dept:remove")
+    @ResponseBody
+    @RequestMapping("/removeUser.json")
+    public ResponseObj<Boolean> removeUser(Integer id) {
+        return success(userApi.remove(getTenantId(),id));
+    }
+
+    @RequiresPermissions("sys:dept:read")
+    @ResponseBody
+    @RequestMapping("/list.json")
+    public ResponseObj<List<SysDept>> list(@RequestBody SysDeptDto queryDto) {
+        queryDto.setSelfDeptId(getDeptId());
+        return success(deptApi.list(getTenantId(),queryDto));
+    }
+
+    @RequiresPermissions("sys:dept:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Boolean> save(@Valid @RequestBody SysDept sysDept, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        sysDept.setTenantId(getTenantId());
+        if(sysDept.getParentId() == null) {
+            sysDept.setParentId(MrxuConst.zero);
+        }
+        if(sysDept.getId() == null) {
+            sysDept.setCreatePerson(getUsername());
+        }
+        else {
+            sysDept.setUpdatePerson(getUsername());
+        }
+        return success(deptApi.saveOrUpdate(sysDept));
+    }
+
+    @RequiresPermissions("sys:dept:remove")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(Integer id) {
+        return success(deptApi.remove(getTenantId(),id));
+    }
+
+
+    @RequiresPermissions("sys:dept:update")
+    @ResponseBody
+    @RequestMapping("/resetPassword.json")
+    public ResponseObj<Boolean> resetPassword(Integer id) {
+        return success(userApi.resetPassword(getTenantId(),id,getUsername()));
+    }
+
+
+    @RequiresPermissions("sys:dept:read")
+    @ResponseBody
+    @RequestMapping("/newPage.json")
+    public ResponseObj<PageResult<SysUser>> newPage(SysUserDto queryDto) {
+        PageResult<SysUser> rs = userApi.page(queryDto);
+        return success(rs);
+    }
+
+    @RequiresPermissions("sys:dept:read")
+    @ResponseBody
+    @RequestMapping("/roleList.json")
+    public ResponseObj<List<SysRole>> roleList() {
+        return success(roleApi.list(getTenantId()));
+    }
+
+
+
+}

+ 72 - 0
src/main/java/com/mrxu/admin/controller/base/SysMenuController.java

@@ -0,0 +1,72 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.entity.SysMenu;
+import com.mrxu.base.enums.MenuForFront;
+import com.mrxu.base.service.SysMenuService;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+
+@Api(tags = "菜单管理")
+@Controller
+@RequestMapping("/sys/menu")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class SysMenuController extends AdminBaseController {
+
+    private final SysMenuService menuService;
+
+    @RequiresPermissions("sys:menu:read")
+    @RequestMapping("index.html")
+    public String index() {
+        return "system/menu.html";
+    }
+
+    @RequiresPermissions("sys:menu:read")
+    @ResponseBody
+    @RequestMapping("/list.json")
+    public ResponseObj list() {
+        return success(menuService.listForFront(null));
+    }
+
+    @RequiresPermissions("sys:menu:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Boolean> save(@Valid @RequestBody SysMenu menu, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        if(menu.getId() == null) {
+            menu.setCreatePerson(getUsername());
+        }
+        else {
+            menu.setUpdatePerson(getUsername());
+        }
+        return success(menuService.saveOrUpdate(menu));
+    }
+
+    @RequiresPermissions("sys:menu:remove")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(Integer id) {
+        return success(menuService.remove(id));
+    }
+
+
+
+
+    @RequiresPermissions("sys:menu:read")
+    @ResponseBody
+    @RequestMapping("/newList.json")
+    public ResponseObj newList(SysMenu menu) {
+        return success(menuService.listForFront(MenuForFront.newFront,menu));
+    }
+}

+ 88 - 0
src/main/java/com/mrxu/admin/controller/base/SysPrinterController.java

@@ -0,0 +1,88 @@
+package com.mrxu.admin.controller.base;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import com.mrxu.framework.common.MrxuConst;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.base.service.SysPrinterService;
+import com.mrxu.base.entity.SysPrinter;
+import com.mrxu.base.query.SysPrinterDto;
+
+@Api(tags = "打印机管理")
+@Controller
+@RequestMapping("/base/sysPrinter")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class SysPrinterController extends AdminBaseController {
+
+	private final SysPrinterService sysPrinterService;
+	
+	@RequiresPermissions("base:sysPrinter:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "base/sysPrinter.html";
+	}
+	
+	@RequiresPermissions("base:sysPrinter:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<SysPrinter> page(SysPrinterDto queryDto) {
+		PageResult<SysPrinter> rs = sysPrinterService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:sysPrinter:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<SysPrinter> getById(Integer id) {
+		return success(sysPrinterService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:sysPrinter:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody SysPrinter bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		return success(sysPrinterService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:sysPrinter:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		SysPrinter bean = new SysPrinter();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(sysPrinterService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:sysPrinter:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(sysPrinterService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:sysPrinter:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(sysPrinterService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 118 - 0
src/main/java/com/mrxu/admin/controller/base/SysProductController.java

@@ -0,0 +1,118 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.SysProductDto;
+import com.mrxu.base.entity.SysMenu;
+import com.mrxu.base.entity.SysProduct;
+import com.mrxu.base.enums.MenuForFront;
+import com.mrxu.base.service.SysProductService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.List;
+
+@Api(tags = "产品管理")
+@Controller
+@RequestMapping("/sys/product")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class SysProductController extends AdminBaseController {
+
+    private final SysProductService productService;
+
+    @RequiresPermissions("sys:product:read")
+    @RequestMapping("/index.html")
+    public String index(Model model) {
+        return "system/product.html";
+    }
+
+    @RequiresPermissions("sys:product:read")
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<SysProduct> page(SysProductDto queryDto) {
+        PageResult<SysProduct> rs = productService.page(queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sys:product:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Boolean> save(@Valid @RequestBody SysProduct product, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        if(product.getId() == null) {
+            product.setCreatePerson(getUsername());
+            product.setCreateTime(new Date());
+        }
+        else {
+            product.setUpdatePerson(getUsername());
+        }
+        return success(productService.saveOrUpdate(product));
+    }
+
+    @RequiresPermissions("sys:product:update")
+    @ResponseBody
+    @RequestMapping("/updateStatus.json")
+    public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+        return success(productService.updateStatus(id,status,getUsername()));
+    }
+
+    @RequiresPermissions("sys:product:remove")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(Integer id) {
+        return success(productService.remove(id));
+    }
+
+    @RequiresPermissions("sys:product:remove")
+    @ResponseBody
+    @RequestMapping("/removeBatch.json")
+    public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+        return success(productService.removeBatch(ids));
+    }
+
+    @RequiresPermissions("sys:product:read")
+    @ResponseBody
+    @RequestMapping("/getMenuSelect.json")
+    public ResponseObj<List<SysMenu>> getMenuSelect(@RequestParam("productId")Integer productId) {
+        return success(productService.getMenuSelect(productId, MenuForFront.oldFront));
+    }
+
+    @RequiresPermissions("sys:product:update")
+    @ResponseBody
+    @RequestMapping("/updateProductMenu.json")
+    public ResponseObj updateProductMenu(@RequestParam("productId")Integer productId, @RequestBody List<Integer> menuIds) {
+        productService.updateProductMenu(productId,menuIds,getUsername());
+        return success();
+    }
+
+
+    @RequiresPermissions("sys:product:read")
+    @ResponseBody
+    @RequestMapping("/getNewMenuSelect.json")
+    public ResponseObj<List<SysMenu>> getNewMenuSelect(@RequestParam("productId")Integer productId) {
+        return success(productService.getMenuSelect(productId, MenuForFront.newFront));
+    }
+
+    @RequiresPermissions("sys:product:read")
+    @ResponseBody
+    @RequestMapping("/newPage.json")
+    public ResponseObj<PageResult<SysProduct>> newPage(SysProductDto queryDto) {
+        PageResult<SysProduct> rs = productService.page(queryDto);
+        return success(rs);
+    }
+
+}

+ 110 - 0
src/main/java/com/mrxu/admin/controller/base/SysRoleController.java

@@ -0,0 +1,110 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.SysRoleDto;
+import com.mrxu.base.entity.SysMenu;
+import com.mrxu.base.entity.SysRole;
+import com.mrxu.base.enums.MenuForFront;
+import com.mrxu.base.service.SysRoleService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "角色管理")
+@Controller
+@RequestMapping("/sys/role")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class SysRoleController extends AdminBaseController {
+
+    private final SysRoleService roleService;
+
+    @RequiresPermissions("sys:role:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        return "system/role.html";
+    }
+
+    @RequiresPermissions("sys:role:read")
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<SysRole> page(SysRoleDto queryDto) {
+        queryDto.setTenantId(getTenantId());
+        PageResult<SysRole> rs = roleService.page(queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sys:role:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Boolean> save(@Valid @RequestBody SysRole role, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        role.setTenantId(getTenantId());
+        if(role.getId() == null) {
+            role.setCreatePerson(getUsername());
+        }
+        else {
+            role.setUpdatePerson(getUsername());
+        }
+        return success(roleService.saveOrUpdate(role));
+    }
+
+    @RequiresPermissions("sys:role:update")
+    @ResponseBody
+    @RequestMapping("/updateStatus.json")
+    public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+        return success(roleService.updateStatus(getTenantId(),id,status,getUsername()));
+    }
+
+    @RequiresPermissions("sys:role:remove")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(Integer id) {
+        return success(roleService.remove(getTenantId(),id));
+    }
+
+    @RequiresPermissions("sys:role:remove")
+    @ResponseBody
+    @RequestMapping("/removeBatch.json")
+    public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+        return success(roleService.removeBatch(getTenantId(),ids));
+    }
+
+    @RequiresPermissions("sys:role:read")
+    @ResponseBody
+    @RequestMapping("/getRoleMenuNew.json")
+    public ResponseObj<List<SysMenu>> getRoleMenuNew(Integer roleId) {
+        return success(roleService.getRoleMenu(getTenantId(),roleId, MenuForFront.newFront));
+    }
+
+    @RequiresPermissions("sys:role:read")
+    @ResponseBody
+    @RequestMapping("/getRoleMenu.json")
+    public ResponseObj<List<SysMenu>> getRoleMenu(Integer roleId) {
+        return success(roleService.getRoleMenu(getTenantId(),roleId,MenuForFront.oldFront));
+    }
+
+    @RequiresPermissions("sys:role:update")
+    @ResponseBody
+    @RequestMapping("/updateRoleMenu.json")
+    public ResponseObj updateRoleMenu(@RequestParam("roleId")Integer roleId, @RequestBody List<Integer> menuIds) {
+        roleService.updateRoleMenu(getTenantId(),roleId,menuIds,getUsername());
+        return success();
+    }
+
+
+}

+ 148 - 0
src/main/java/com/mrxu/admin/controller/base/SysUserController.java

@@ -0,0 +1,148 @@
+package com.mrxu.admin.controller.base;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.SysUserDto;
+import com.mrxu.base.dto.UpdatePasswordDto;
+import com.mrxu.base.entity.SysUser;
+import com.mrxu.base.service.SysPrinterService;
+import com.mrxu.base.service.SysRoleService;
+import com.mrxu.base.service.SysUserService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.apache.shiro.authz.annotation.RequiresUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.util.StringUtils;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "用户管理")
+@Controller
+@RequestMapping("/sys/user")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class SysUserController extends AdminBaseController {
+
+    private final SysUserService userService;
+
+    private final SysRoleService roleService;
+
+    private final SysPrinterService printerService;
+
+    @RequiresPermissions("sys:user:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("printerList",printerService.list(getTenantId()));
+        model.addAttribute("rolesJson", JSON.toJSONString(roleService.list(getTenantId())));
+        return "system/user.html";
+    }
+
+    @RequiresUser
+    @RequestMapping("selfinfo.html")
+    public String selfInfo(Model model) {
+        model.addAttribute("rolesJson", JSON.toJSONString(roleService.list(getTenantId())));
+        SysUser sysUser = getLoginUser();
+        if(!sysUser.isSuperAdmin() && !getTenantId().equals(getUsername())) {
+            sysUser = userService.getByUsername(getUsername());
+        }
+        model.addAttribute("canEdit",!sysUser.isSuperAdmin() && !getTenantId().equals(getUsername()));
+        model.addAttribute("userInfo", JSONObject.toJSONString(sysUser));
+        return "system/selfinfo.html";
+    }
+
+    @RequiresUser
+    @RequestMapping("getSelf.json")
+    @ResponseBody
+    public ResponseObj<SysUser> getSelf() {
+        SysUser sysUser = getLoginUser();
+        return success(sysUser);
+    }
+
+    @RequiresPermissions({"sys:user:read","sys:dept:read"})
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<SysUser> page(SysUserDto queryDto) {
+        queryDto.setTenantId(getTenantId());
+        PageResult<SysUser> rs = userService.page(queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @ResponseBody
+    @RequestMapping("/list.json")
+    public ResponseObj<List<SysUser>> list(@RequestBody SysUserDto queryDto) {
+        return success(userService.list(getTenantId(),queryDto));
+    }
+
+    @ResponseBody
+    @RequestMapping("/listALL.json")
+    public ResponseObj<List<SysUser>> listALL() {
+        return success(userService.listAll(getTenantId()));
+    }
+
+    @RequiresPermissions("sys:user:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Boolean> save(@Valid @RequestBody SysUser sysUser, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        sysUser.setTenantId(getTenantId());
+        if(sysUser.getStatus() == null) {
+            sysUser.setStatus(MrxuConst.disable);
+        }
+        if(sysUser.getId() == null) {
+            sysUser.setCreatePerson(getUsername());
+        }
+        else {
+            sysUser.setUpdatePerson(getUsername());
+        }
+        return success(userService.saveOrUpdate(sysUser));
+    }
+
+    @RequiresPermissions("sys:user:update")
+    @ResponseBody
+    @RequestMapping("/updateStatus.json")
+    public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+        return success(userService.updateStatus(getTenantId(),id,status,getUsername()));
+    }
+
+
+    @RequiresUser
+    @ResponseBody
+    @RequestMapping("/psw/update.json")
+    public ResponseObj<Boolean> updatePsw(UpdatePasswordDto updatePasswordDto) {
+        if(StringUtils.isEmpty(updatePasswordDto.getUserId())){
+            updatePasswordDto.setUserId(getLoginUserId());
+            updatePasswordDto.setTenantId(getTenantId());
+        }
+        MrxuAssert.isTrue(!getLoginUser().isSuperAdmin(),"超级管理员暂不支持修改密码");
+        MrxuAssert.isTrue(updatePasswordDto.getUserId() != null,"用户登陆信息无效");
+        return success(userService.updatePsw(updatePasswordDto));
+    }
+
+    @RequiresPermissions("sys:user:remove")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(Integer id) {
+        return success(userService.remove(getTenantId(),id));
+    }
+
+    @RequiresPermissions("sys:user:remove")
+    @ResponseBody
+    @RequestMapping("/removeBatch.json")
+    public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+        return success(userService.removeBatch(getTenantId(),ids));
+    }
+
+}

+ 135 - 0
src/main/java/com/mrxu/admin/controller/base/TenantController.java

@@ -0,0 +1,135 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.anno.OperateLogType;
+import com.mrxu.base.dto.SysProductDto;
+import com.mrxu.base.dto.TenantDto;
+import com.mrxu.base.entity.SysMenu;
+import com.mrxu.base.entity.SysProduct;
+import com.mrxu.base.entity.Tenant;
+import com.mrxu.base.entity.TenantGroup;
+import com.mrxu.base.enums.ManagerType;
+import com.mrxu.base.service.*;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "商户管理")
+@Controller
+@RequestMapping("/tenant/tenant")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class TenantController extends AdminBaseController {
+
+    private final TenantGroupService tenantGroupService;
+
+    private final TenantService tenantService;
+
+    private final SysProductService productService;
+
+    private final WxComponentService componentService;
+
+    private final SysUserService userService;
+
+    @RequiresPermissions("sys:tenant:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        List<TenantGroup> groupList = tenantGroupService.list();
+        model.addAttribute("groupList",groupList);
+        model.addAttribute("productList",productService.list());
+        model.addAttribute("managerTypeList", ManagerType.values());
+        return "system/tenant.html";
+    }
+
+    @RequiresPermissions("sys:tenant:read")
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<Tenant> page(TenantDto queryDto) {
+        PageResult<Tenant> rs = tenantService.page(queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @OperateLogType(name = "更新租户",type = "updateTenant")
+    @RequiresPermissions("sys:tenant:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Boolean> save(@Valid @RequestBody Tenant tenant, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        /*if(tenant.getStatus() == null) {
+            tenant.setStatus(MrxuConst.disable);
+        }*/
+        if(tenant.getWxPay() == null) {
+            tenant.setWxPay(MrxuConst.disable);
+        }
+        if(tenant.getId() == null) {
+            tenant.setCreatePerson(getUsername());
+        }
+        else {
+            tenant.setUpdatePerson(getUsername());
+        }
+        return success(tenantService.saveOrUpdate(tenant));
+    }
+
+    @RequiresPermissions("sys:tenant:update")
+    @ResponseBody
+    @RequestMapping("/updateStatus.json")
+    public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+        return success(tenantService.updateStatus(id,status,getUsername()));
+    }
+
+    @RequiresPermissions("sys:tenant:update")
+    @ResponseBody
+    @RequestMapping("/setDefault.json")
+    public ResponseObj<Boolean> setDefault(String tenantId) {
+        tenantService.setDefault(tenantId,getUsername());
+        getLoginUser().setTenantId(tenantId);
+        getLoginUser().setScopeDeptIds(userService.getUserScope(tenantId,true,null,null));
+        return success(true);
+    }
+
+    @RequiresPermissions("sys:tenant:remove")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(Integer id) {
+        return success(tenantService.remove(id));
+    }
+
+    @RequiresPermissions("sys:tenant:remove")
+    @ResponseBody
+    @RequestMapping("/removeBatch.json")
+    public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+        return success(tenantService.removeBatch(ids));
+    }
+
+
+    @RequiresPermissions("sys:tenant:read")
+    @ResponseBody
+    @RequestMapping("/newPage.json")
+    public ResponseObj<PageResult<Tenant>> newPage(TenantDto queryDto) {
+        PageResult<Tenant> rs = tenantService.page(queryDto);
+        return success(rs);
+    }
+
+    @RequiresPermissions("sys:tenant:read")
+    @ResponseBody
+    @RequestMapping("/getProductList.json")
+    public ResponseObj<List<SysProduct>> getProductList() {
+        return success(productService.list());
+    }
+}

File diff ditekan karena terlalu besar
+ 224 - 0
src/main/java/com/mrxu/admin/controller/base/TenantGroupController.java


+ 55 - 0
src/main/java/com/mrxu/admin/controller/base/TenantRegisterController.java

@@ -0,0 +1,55 @@
+package com.mrxu.admin.controller.base;
+
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.query.TenantRegisterDto;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.base.service.TenantRegisterService;
+import com.wf.captcha.utils.CaptchaUtil;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+
+@Api(tags = "租户注册")
+@Controller
+@RequestMapping("/free/tenant")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class TenantRegisterController extends AdminBaseController {
+
+    @Autowired
+    private TenantRegisterService registerService;
+
+    @RequestMapping("register.html")
+    public String index(Model model) {
+        return "base/tenantRegister.html";
+    }
+
+    @RequestMapping("privacyAgreement.html")
+    public String privacyAgreement(Model model) {
+        return "base/privacyAgreement.html";
+    }
+
+    @ResponseBody
+    @RequestMapping("/sendSms.json")
+    public ResponseObj<Object> sendSms(String mobile,String imageCode) {
+        MrxuAssert.isTrue(CaptchaUtil.ver(imageCode, getRequest()),"验证码不正确");
+        registerService.sendSms(mobile);
+        return success();
+    }
+
+    @ResponseBody
+    @RequestMapping("/register.json")
+    public ResponseObj<Object> register(@Valid TenantRegisterDto registerDto) {
+        registerService.register(registerDto);
+        return success();
+    }
+
+
+}

+ 63 - 0
src/main/java/com/mrxu/admin/controller/base/TenantReviewController.java

@@ -0,0 +1,63 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.TenantDto;
+import com.mrxu.base.entity.Tenant;
+import com.mrxu.base.service.TenantRegisterService;
+import com.mrxu.base.service.TenantService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Api(tags = "商户管理")
+@Controller
+@RequestMapping("/tenant/review")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class TenantReviewController extends AdminBaseController {
+
+    @Autowired
+    private TenantService tenantService;
+
+    @Autowired
+    private TenantRegisterService registerService;
+
+    @RequiresPermissions("sys:tenantReview:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        return "system/tenantReview.html";
+    }
+
+    @RequiresPermissions("sys:tenantReview:read")
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<Tenant> page(TenantDto queryDto) {
+        queryDto.setReview(true);
+        PageResult<Tenant> rs = tenantService.page(queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sys:tenantReview:update")
+    @ResponseBody
+    @RequestMapping("/pass.json")
+    public ResponseObj<Boolean> pass(Integer id) {
+        return success(registerService.pass(id,getUsername()));
+    }
+
+    @RequiresPermissions("sys:tenantReview:update")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(Integer id) {
+        return success(registerService.remove(id));
+    }
+
+
+
+}

+ 213 - 0
src/main/java/com/mrxu/admin/controller/base/WxAuthController.java

@@ -0,0 +1,213 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.PrivacySettingDto;
+import com.mrxu.base.dto.WxAuthDto;
+import com.mrxu.base.entity.WxAuth;
+import com.mrxu.base.enums.WxType;
+import com.mrxu.base.service.WxAuthService;
+import com.mrxu.base.service.WxComponentTemplateService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.framework.common.weixin.bean.Template;
+import com.mrxu.framework.common.xcx.bean.InterfaceList;
+import com.mrxu.framework.common.xcx.bean.OwnerSetting;
+import com.mrxu.framework.common.xcx.bean.PrivacySetting;
+import com.mrxu.framework.common.xcx.bean.Setting;
+import com.mrxu.framework.common.xcx.enums.PrivacyVersion;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Api(tags = "微信授权管理")
+@Controller
+@RequestMapping("/base/wxauth")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class WxAuthController extends AdminBaseController {
+
+	private final WxAuthService wxauthApi;
+
+	private final WxComponentTemplateService templateApi;
+	
+	@RequiresPermissions("base:wxauth:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		List<Template> list = templateApi.getTemplateList().getTemplate_list();
+		model.addAttribute("templateList",list);
+		return "base/wxauth.html";
+	}
+
+	// 小程序隐私设置
+	@RequiresPermissions("base:wxauth:update")
+	@RequestMapping("privacySetting.html")
+	public String privacySetting(Model model,@RequestParam String groupId) {
+		PrivacySetting devSetting = wxauthApi.getPrivacySetting(groupId, PrivacyVersion.dev);
+		PrivacySetting prodSetting = wxauthApi.getPrivacySetting(groupId, PrivacyVersion.prod);
+		model.addAttribute("devSetting",devSetting);
+		model.addAttribute("devNeedPrivacyMap",getNeedPrivacyMap(devSetting));
+		model.addAttribute("devSettingDesMap",getSettingDesMap(devSetting));
+		model.addAttribute("prodSetting",prodSetting);
+		model.addAttribute("prodNeedPrivacyMap",getNeedPrivacyMap(prodSetting));
+		model.addAttribute("prodSettingDesMap",getSettingDesMap(prodSetting));
+		model.addAttribute("groupId",groupId);
+		return "base/privacySetting.html";
+	}
+
+	@RequiresPermissions("base:wxauth:update")
+	@ResponseBody
+	@RequestMapping("/privacySettingSave.json")
+	public ResponseObj<Boolean> privacySettingSave(@RequestParam String groupId,
+												   @RequestParam int version,
+												   @RequestParam String [] privacy_keys,
+												   @RequestParam String [] privacy_texts,
+												   OwnerSetting owner_setting) {
+		List<Setting> setting_list = new ArrayList<>();
+		for(int i=0;i<privacy_keys.length;i++) {
+			Setting temp = new Setting();
+			temp.setPrivacy_key(privacy_keys[i]);
+			temp.setPrivacy_text(privacy_texts[i]);
+			setting_list.add(temp);
+		}
+		PrivacyVersion privacy_ver = null;
+		if(version == PrivacyVersion.prod.getVersion()) {
+			privacy_ver = PrivacyVersion.prod;
+		}
+		else if(version == PrivacyVersion.dev.getVersion()) {
+			privacy_ver = PrivacyVersion.dev;
+		}
+
+		PrivacySettingDto dto = new PrivacySettingDto();
+		dto.setPrivacyVer(privacy_ver);
+		dto.setOwnerSetting(owner_setting);
+		dto.setSettingList(setting_list);
+		wxauthApi.privacySettingSave(groupId, dto.getPrivacyVer(), dto.getOwnerSetting(), dto.getSettingList());
+		return success(true);
+	}
+
+	private Map<String,Boolean> getNeedPrivacyMap(PrivacySetting setting) {
+		HashMap<String,Boolean> map = new HashMap<String,Boolean>();
+		for(String key:setting.getPrivacy_list()) {
+			map.put(key,true);
+		}
+		return map;
+	}
+
+	private Map<String,String> getSettingDesMap(PrivacySetting setting) {
+		HashMap<String,String> map = new HashMap<String,String>();
+		for(Setting set:setting.getSetting_list()) {
+			map.put(set.getPrivacy_key(),set.getPrivacy_text());
+		}
+		return map;
+	}
+
+
+	@RequiresPermissions("base:wxauth:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<WxAuth> page(WxAuthDto queryDto) {
+		queryDto.setType(WxType.xcx.getValue());
+		PageResult<WxAuth> rs = wxauthApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:wxauth:read")
+	@ResponseBody
+	@RequestMapping("/xcxInterface.json")
+	public LayuiPage<InterfaceList.Interface> xcxInterface(@RequestParam String groupId) {
+		InterfaceList list = wxauthApi.xcxInterface(groupId);
+		LayuiPage<InterfaceList.Interface> rs = new LayuiPage<InterfaceList.Interface>();
+		rs.setData(list.getInterface_list());
+		return rs;
+	}
+
+	@RequiresPermissions("base:wxauth:update")
+	@ResponseBody
+	@RequestMapping("/apply.json")
+	public ResponseObj<Object> apply(String groupId,String api_name, String content) {
+		wxauthApi.apply(groupId,api_name,content,null,null,null);
+		return success();
+	}
+
+	@RequiresPermissions("base:wxauth:update")
+	@ResponseBody
+	@RequestMapping("/release.json")
+	public ResponseObj<Object> release(String groupId) {
+		wxauthApi.release(groupId,getUsername());
+		return success();
+	}
+
+	@RequiresPermissions("base:wxauth:update")
+	@ResponseBody
+	@RequestMapping("/commit.json")
+	public ResponseObj<Object> commit(String groupId,String templateId) {
+		wxauthApi.commit(groupId,templateId,getUsername());
+		return success();
+	}
+
+	@RequiresPermissions("base:wxauth:update")
+	@ResponseBody
+	@RequestMapping("/submitAudit.json")
+	public ResponseObj<Object> submitAudit(String groupId) {
+		wxauthApi.submitAudit(groupId,getUsername());
+		return success();
+	}
+
+	@RequiresPermissions("base:wxauth:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<WxAuth> getById(Integer id) {
+		return success(wxauthApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:wxauth:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody WxAuth bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(wxauthApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:wxauth:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		WxAuth bean = new WxAuth();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(wxauthApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:wxauth:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(wxauthApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:wxauth:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(wxauthApi.removeBatch(getTenantId(),ids));
+	}
+
+}

File diff ditekan karena terlalu besar
+ 55 - 0
src/main/java/com/mrxu/admin/controller/base/WxComponentDraftController.java


File diff ditekan karena terlalu besar
+ 83 - 0
src/main/java/com/mrxu/admin/controller/base/WxComponentTemplateController.java


+ 57 - 0
src/main/java/com/mrxu/admin/controller/base/WxConfigController.java

@@ -0,0 +1,57 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.entity.WxConfig;
+import com.mrxu.base.enums.WxType;
+import com.mrxu.base.service.WxConfigService;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.validation.Valid;
+
+@Api(tags = "微信配置管理")
+@Controller
+@RequestMapping("/base/wxconfig")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class WxConfigController extends AdminBaseController {
+
+	private final WxConfigService wxconfigApi;
+	
+	@RequiresPermissions("base:wxconfig:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		String tenantId = getTenantId();
+		WxConfig gzh = wxconfigApi.getConfig(tenantId, WxType.gzh);
+		if(gzh == null) {
+			gzh = new WxConfig();
+		}
+		model.addAttribute("gzh",gzh);
+
+		WxConfig xcx = wxconfigApi.getConfig(tenantId, WxType.xcx);
+		if(xcx == null) {
+			xcx = new WxConfig();
+		}
+		model.addAttribute("xcx",xcx);
+		return "base/wxconfig.html";
+	}
+
+	@RequiresPermissions("base:wxconfig:update")
+	@RequestMapping("save.html")
+	public String save(@Valid WxConfig bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		if(bean.getCurrentPay() == null) {
+			bean.setCurrentPay(1);
+		}
+		wxconfigApi.saveOrUpdate(getTenantId(),bean,getUsername());
+		return "redirect:/base/wxconfig/index.html";
+	}
+
+
+}

+ 81 - 0
src/main/java/com/mrxu/admin/controller/base/WxOrderController.java

@@ -0,0 +1,81 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.WxOrderDto;
+import com.mrxu.base.dto.WxRefundDto;
+import com.mrxu.base.entity.WxOrder;
+import com.mrxu.base.entity.WxRefund;
+import com.mrxu.base.enums.OrderSource;
+import com.mrxu.base.service.WxOrderService;
+import com.mrxu.base.service.WxRefundService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.framework.common.util.MrxuId;
+import com.mrxu.framework.common.xcx.enums.TradeState;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+
+@Api(tags = "微信订单管理")
+@Controller
+@RequestMapping("/base/wxOrder")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class WxOrderController extends AdminBaseController {
+
+	private final WxOrderService orderService;
+
+	private final WxRefundService refundService;
+
+	@RequiresPermissions("base:wxOrder:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("stateList", TradeState.values());
+		return "base/wxOrder.html";
+	}
+	
+	@RequiresPermissions("base:wxOrder:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<WxOrder> page(WxOrderDto queryDto) {
+		PageResult<WxOrder> rs = orderService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:wxOrder:read")
+	@ResponseBody
+	@RequestMapping("/refundPage.json")
+	public LayuiPage<WxRefund> refundPage(WxRefundDto queryDto) {
+		PageResult<WxRefund> rs = refundService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:wxOrder:update")
+	@ResponseBody
+	@RequestMapping("/synRefundStatus.json")
+	public ResponseObj<Object> synRefundStatus(String tenantId, String orderNo) {
+		orderService.synRefundStatus(tenantId,orderNo,getUsername());
+		return success();
+	}
+
+	@RequiresPermissions("base:wxOrder:update")
+	@ResponseBody
+	@RequestMapping("/refund.json")
+	public ResponseObj<Boolean> refund(@Valid @RequestBody WxRefund bean, BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		orderService.refund(getTenantId(), MrxuId.getBackOrderNo(),bean.getMoney(),
+				bean.getOrderNo(),bean.getCaption(),getIp(),getUsername());
+		return success(true);
+	}
+
+}

+ 76 - 0
src/main/java/com/mrxu/admin/controller/base/WxTemplateMsgController.java

@@ -0,0 +1,76 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.WxTemplateMsgDto;
+import com.mrxu.base.entity.WxTemplateMsg;
+import com.mrxu.base.service.WxTemplateMsgService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "微信模板消息管理")
+@Controller
+@RequestMapping("/base/wxTemplate")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class WxTemplateMsgController extends AdminBaseController {
+
+	private final WxTemplateMsgService wxTemplateApi;
+	
+	@RequiresPermissions("base:wxTemplate:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "base/wxTemplate.html";
+	}
+	
+	@RequiresPermissions("base:wxTemplate:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<WxTemplateMsg> page(WxTemplateMsgDto queryDto) {
+		PageResult<WxTemplateMsg> rs = wxTemplateApi.page(getGroupId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:wxTemplate:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<WxTemplateMsg> getById(Integer id) {
+		return success(wxTemplateApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:wxTemplate:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody WxTemplateMsg bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(wxTemplateApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:wxTemplate:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(wxTemplateApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:wxTemplate:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(wxTemplateApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 89 - 0
src/main/java/com/mrxu/admin/controller/base/WxTokenController.java

@@ -0,0 +1,89 @@
+package com.mrxu.admin.controller.base;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.dto.WxTokenDto;
+import com.mrxu.base.entity.WxToken;
+import com.mrxu.base.service.WxTokenService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "微信token管理")
+@Controller
+@RequestMapping("/base/wxToken")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class WxTokenController extends AdminBaseController {
+
+	private final WxTokenService wxTokenApi;
+	
+	@RequiresPermissions("base:wxToken:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "base/wxToken.html";
+	}
+	
+	@RequiresPermissions("base:wxToken:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<WxToken> page(WxTokenDto queryDto) {
+		PageResult<WxToken> rs = wxTokenApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("base:wxToken:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<WxToken> getById(Integer id) {
+		return success(wxTokenApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:wxToken:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody WxToken bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(wxTokenApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:wxToken:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		WxToken bean = new WxToken();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(wxTokenApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("base:wxToken:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(wxTokenApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("base:wxToken:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(wxTokenApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 106 - 0
src/main/java/com/mrxu/admin/controller/bbs/BbsArticleController.java

@@ -0,0 +1,106 @@
+package com.mrxu.admin.controller.bbs;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import com.alibaba.fastjson.JSON;
+import com.mrxu.bbs.service.BbsClassService;
+import com.mrxu.framework.common.MrxuConst;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.bbs.service.BbsArticleService;
+import com.mrxu.bbs.entity.BbsArticle;
+import com.mrxu.bbs.query.BbsArticleDto;
+
+@Api(tags = "文章管理")
+@Controller
+@RequestMapping("/bbs/bbsArticle")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class BbsArticleController extends AdminBaseController {
+
+	private final BbsClassService classService;
+
+	private final BbsArticleService bbsArticleService;
+	
+	@RequiresPermissions("bbs:bbsArticle:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("classList",classService.list(getTenantId()));
+		return "bbs/bbsArticle.html";
+	}
+	
+	@RequiresPermissions("bbs:bbsArticle:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<BbsArticle> page(BbsArticleDto queryDto) {
+		PageResult<BbsArticle> rs = bbsArticleService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("bbs:bbsArticle:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<BbsArticle> getById(Integer id) {
+		return success(bbsArticleService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("bbs:bbsArticle:update")
+	@RequestMapping("addOrEdit.html")
+	public String addOrEdit(Integer id,Model model) {
+		BbsArticle bean = null;
+		if(id == null) {
+			bean = new BbsArticle();
+		}
+		else {
+			bean = bbsArticleService.getById(getTenantId(),id);
+		}
+		model.addAttribute("bean",bean);
+		model.addAttribute("beanJson",JSON.toJSONString(bean));
+		model.addAttribute("classList",classService.list(getTenantId()));
+		return "bbs/articleAddOrEdit.html";
+	}
+
+	@RequiresPermissions("bbs:bbsArticle:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody BbsArticle bean) {
+		return success(bbsArticleService.saveOrUpdate(getTenantId(),bean,getLoginUser()));
+	}
+
+	@RequiresPermissions("bbs:bbsArticle:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		BbsArticle bean = new BbsArticle();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(bbsArticleService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("bbs:bbsArticle:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(bbsArticleService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("bbs:bbsArticle:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(bbsArticleService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 88 - 0
src/main/java/com/mrxu/admin/controller/bbs/BbsClassController.java

@@ -0,0 +1,88 @@
+package com.mrxu.admin.controller.bbs;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import com.mrxu.framework.common.MrxuConst;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.bbs.service.BbsClassService;
+import com.mrxu.bbs.entity.BbsClass;
+import com.mrxu.bbs.query.BbsClassDto;
+
+@Api(tags = "文章分类管理")
+@Controller
+@RequestMapping("/bbs/bbsClass")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class BbsClassController extends AdminBaseController {
+
+	private final BbsClassService bbsClassService;
+	
+	@RequiresPermissions("bbs:bbsClass:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "bbs/bbsClass.html";
+	}
+	
+	@RequiresPermissions("bbs:bbsClass:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<BbsClass> page(BbsClassDto queryDto) {
+		PageResult<BbsClass> rs = bbsClassService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("bbs:bbsClass:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<BbsClass> getById(Integer id) {
+		return success(bbsClassService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("bbs:bbsClass:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody BbsClass bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		return success(bbsClassService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("bbs:bbsClass:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		BbsClass bean = new BbsClass();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(bbsClassService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("bbs:bbsClass:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(bbsClassService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("bbs:bbsClass:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(bbsClassService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 88 - 0
src/main/java/com/mrxu/admin/controller/bbs/BbsDiscussController.java

@@ -0,0 +1,88 @@
+package com.mrxu.admin.controller.bbs;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import com.mrxu.framework.common.MrxuConst;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.bbs.service.BbsDiscussService;
+import com.mrxu.bbs.entity.BbsDiscuss;
+import com.mrxu.bbs.query.BbsDiscussDto;
+
+@Api(tags = "评论管理管理")
+@Controller
+@RequestMapping("/bbs/bbsDiscuss")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class BbsDiscussController extends AdminBaseController {
+
+	private final BbsDiscussService bbsDiscussService;
+	
+	@RequiresPermissions("bbs:bbsDiscuss:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "bbs/bbsDiscuss.html";
+	}
+	
+	@RequiresPermissions("bbs:bbsDiscuss:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<BbsDiscuss> page(BbsDiscussDto queryDto) {
+		PageResult<BbsDiscuss> rs = bbsDiscussService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("bbs:bbsDiscuss:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<BbsDiscuss> getById(Integer id) {
+		return success(bbsDiscussService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("bbs:bbsDiscuss:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody BbsDiscuss bean) {
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}*/
+		return success(bbsDiscussService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("bbs:bbsDiscuss:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		BbsDiscuss bean = new BbsDiscuss();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(bbsDiscussService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("bbs:bbsDiscuss:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(bbsDiscussService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("bbs:bbsDiscuss:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(bbsDiscussService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 55 - 0
src/main/java/com/mrxu/admin/controller/crm/BalanceRecordController.java

@@ -0,0 +1,55 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.BalanceRecord;
+import com.mrxu.crm.query.BalanceRecordDto;
+import com.mrxu.crm.service.BalanceRecordService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+
+@Api(tags = "余额流水管理")
+@Controller
+@RequestMapping("/crm/balanceRecord")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class BalanceRecordController extends AdminBaseController {
+
+	private final BalanceRecordService balanceRecordApi;
+	
+	@RequiresPermissions("crm:balanceRecord:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/balanceRecord.html";
+	}
+	
+	@RequiresPermissions("crm:balanceRecord:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<BalanceRecord> page(BalanceRecordDto queryDto) {
+		PageResult<BalanceRecord> rs = balanceRecordApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:balanceRecord:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody BalanceRecord bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(balanceRecordApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+
+}

+ 122 - 0
src/main/java/com/mrxu/admin/controller/crm/ContractPayController.java

@@ -0,0 +1,122 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.ContractPay;
+import com.mrxu.crm.entity.MemberContract;
+import com.mrxu.crm.enums.ContractPayStatusEnum;
+import com.mrxu.crm.query.ContractPayDto;
+import com.mrxu.crm.query.MemberBaseDto;
+import com.mrxu.crm.service.ContractPayService;
+import com.mrxu.crm.service.MemberBaseService;
+import com.mrxu.crm.service.MemberContractService;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "回款管理")
+@Controller
+@RequestMapping("/crm/contractPay")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class ContractPayController extends AdminBaseController {
+
+	private final ContractPayService contractPayApi;
+
+	private final MemberBaseService memberBaseApi;
+
+	private final MemberContractService memberContractApi;
+
+	private final MemberPayWayService payWayApi;
+	
+	@RequiresPermissions("crm:contractPay:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("payWayList", payWayApi.list(getTenantId()));
+		model.addAttribute("contractPayStatusList", ContractPayStatusEnum.values());
+		model.addAttribute("memberList",memberBaseApi.list(getTenantId(),new MemberBaseDto()));
+		return "crm/contractPayIndex.html";
+	}
+	
+	@RequiresPermissions("crm:contractPay:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<ContractPay> page(ContractPayDto queryDto) {
+		PageResult<ContractPay> rs = contractPayApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:contractPay:read")
+	@ResponseBody
+	@RequestMapping("/contractList.json")
+	public ResponseObj<List<MemberContract>> list(String memberId) {
+		return success(memberContractApi.list(getTenantId(),memberId));
+	}
+
+	@RequiresPermissions("crm:contractPay:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<ContractPay> getById(Integer id) {
+		return success(contractPayApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:contractPay:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody ContractPay bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(contractPayApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:contractPay:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		ContractPay bean = new ContractPay();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(contractPayApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:contractPay:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(contractPayApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:contractPay:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(contractPayApi.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("crm:contractPay:update")
+	@ResponseBody
+	@RequestMapping("/toReview.json")
+	public ResponseObj<Boolean> toReview(Integer id) {
+		return success(contractPayApi.toReview(getTenantId(),id,getUsername()));
+	}
+
+	@RequiresPermissions("crm:contractPay:update")
+	@ResponseBody
+	@RequestMapping("/cancelReview.json")
+	public ResponseObj<Boolean> cancelReview(Integer id) {
+		return success(contractPayApi.cancelReview(getTenantId(),id,getUsername()));
+	}
+
+}

+ 115 - 0
src/main/java/com/mrxu/admin/controller/crm/ContractPayPlanController.java

@@ -0,0 +1,115 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.ContractPayPlan;
+import com.mrxu.crm.entity.MemberContract;
+import com.mrxu.crm.enums.ContractPayPlanStatusEnum;
+import com.mrxu.crm.query.ContractPayPlanDto;
+import com.mrxu.crm.query.MemberBaseDto;
+import com.mrxu.crm.service.ContractPayPlanService;
+import com.mrxu.crm.service.MemberBaseService;
+import com.mrxu.crm.service.MemberContractService;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "回款计划管理")
+@Controller
+@RequestMapping("/crm/contractPayPlan")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class ContractPayPlanController extends AdminBaseController {
+
+	private final MemberBaseService memberBaseApi;
+
+	private final ContractPayPlanService contractPayPlanApi;
+
+	private final MemberContractService memberContractApi;
+
+	private final MemberPayWayService payWayApi;
+	
+	@RequiresPermissions("crm:contractPayPlan:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("payWayList", payWayApi.list(getTenantId()));
+		model.addAttribute("memberList",memberBaseApi.list(getTenantId(),new MemberBaseDto()));
+		model.addAttribute("contractPayPlanStatusList", ContractPayPlanStatusEnum.values());
+		return "crm/contractPayPlanIndex.html";
+	}
+	
+	@RequiresPermissions("crm:contractPayPlan:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<ContractPayPlan> page(ContractPayPlanDto queryDto) {
+		PageResult<ContractPayPlan> rs = contractPayPlanApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:contractPayPlan:read")
+	@ResponseBody
+	@RequestMapping("/contractList.json")
+	public ResponseObj<List<MemberContract>> list(String memberId) {
+		return success(memberContractApi.list(getTenantId(),memberId));
+	}
+
+	@RequiresPermissions("crm:contractPayPlan:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<ContractPayPlan> getById(Integer id) {
+		return success(contractPayPlanApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:contractPayPlan:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody ContractPayPlan bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(contractPayPlanApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:contractPayPlan:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		ContractPayPlan bean = new ContractPayPlan();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(contractPayPlanApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:contractPayPlan:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(contractPayPlanApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:contractPayPlan:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(contractPayPlanApi.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("crm:contractPayPlan:update")
+	@ResponseBody
+	@RequestMapping("/surePay.json")
+	public ResponseObj<Boolean> surePay(Integer id,Integer payWayId) {
+		return success(contractPayPlanApi.surePay(getTenantId(),id,payWayId,getUsername()));
+	}
+
+}

+ 58 - 0
src/main/java/com/mrxu/admin/controller/crm/ContractPayReviewController.java

@@ -0,0 +1,58 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.ContractPay;
+import com.mrxu.crm.enums.ContractPayStatusEnum;
+import com.mrxu.crm.query.ContractPayDto;
+import com.mrxu.crm.service.ContractPayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+
+@Api(tags = "合同审核")
+@Controller
+@RequestMapping("/crm/contractPayReview")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class ContractPayReviewController extends AdminBaseController {
+
+    private final ContractPayService contractPayApi;
+
+    @RequiresPermissions("crm:contractPayReview:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        return "crm/contractPayReviewIndex.html";
+    }
+
+    @RequiresPermissions("crm:contractPayReview:read")
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<ContractPay> page(ContractPayDto queryDto) {
+        queryDto.setStatus(String.valueOf(ContractPayStatusEnum.review.getStatus()));
+        PageResult<ContractPay> rs = contractPayApi.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("crm:contractPayReview:update")
+    @ResponseBody
+    @RequestMapping("/pass.json")
+    public ResponseObj<Boolean> pass(Integer id,String reviewMessage) {
+        return success(contractPayApi.pass(getTenantId(),id,reviewMessage,getUsername()));
+    }
+
+    @RequiresPermissions("crm:contractPayReview:update")
+    @ResponseBody
+    @RequestMapping("/refuse.json")
+    public ResponseObj<Boolean> refuse(Integer id,String reviewMessage) {
+        return success(contractPayApi.refuse(getTenantId(),id,reviewMessage,getUsername()));
+    }
+
+}

+ 72 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberAddressController.java

@@ -0,0 +1,72 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberAddress;
+import com.mrxu.crm.query.MemberAddressDto;
+import com.mrxu.crm.service.MemberAddressService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "会员地址管理")
+@Controller
+@RequestMapping("/crm/memberAddress")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberAddressController extends AdminBaseController {
+
+	private final MemberAddressService memberAddressApi;
+	
+	@RequiresPermissions("crm:memberAddress:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/memberAddress.html";
+	}
+	
+	@RequiresPermissions("crm:memberAddress:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberAddress> page(MemberAddressDto queryDto) {
+		PageResult<MemberAddress> rs = memberAddressApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberAddress:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberAddress bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(memberAddressApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberAddress:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberAddressApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberAddress:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberAddressApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 136 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberBaseController.java

@@ -0,0 +1,136 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberBase;
+import com.mrxu.crm.enums.MemberScoreEnum;
+import com.mrxu.crm.enums.NicheTypeEnum;
+import com.mrxu.crm.enums.SaleStepEnum;
+import com.mrxu.crm.enums.VisitWayEnum;
+import com.mrxu.crm.query.MemberBaseDto;
+import com.mrxu.crm.query.MemberBasePageDto;
+import com.mrxu.crm.query.MemberToOtherDto;
+import com.mrxu.crm.service.*;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "会员管理")
+@Controller
+@RequestMapping("/crm/memberBase")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberBaseController extends AdminBaseController {
+
+	private final  MemberBaseService memberBaseApi;
+
+	private final  MemberSourceService memberSourceApi;
+
+	private final  MemberLevelService memberLevelApi;
+
+	private final  MemberIndustryService memberIndustryApi;
+
+	private final  MemberProductService memberProductApi;
+
+	private final MemberPayWayService payWayApi;
+
+	@RequiresPermissions("crm:memberBase:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("memberSourceList", memberSourceApi.list(getTenantId()));
+		model.addAttribute("memberLevelList", memberLevelApi.list(getTenantId()));
+		model.addAttribute("memberIndustryList", memberIndustryApi.list(getTenantId()));
+		return "crm/memberBase.html";
+	}
+
+	@RequiresPermissions("crm:memberBase:read")
+	@RequestMapping("memberInfo.html")
+	public String memberInfo(Model model) {
+		String memberId = getPara("memberId");
+		String tenantId = getTenantId();
+		MemberBase member = memberBaseApi.getByMemberId(tenantId,memberId);
+		MrxuAssert.isNotEmpty(member,"会员不存在");
+		model.addAttribute("member",member);
+		model.addAttribute("visitWayList", VisitWayEnum.values());
+		model.addAttribute("scoreList", MemberScoreEnum.values());
+		model.addAttribute("nicheTypeList", NicheTypeEnum.values());
+		model.addAttribute("saleStepList", SaleStepEnum.values());
+		model.addAttribute("payWayList", payWayApi.list(getTenantId()));
+		model.addAttribute("memberProductList", memberProductApi.list(tenantId));
+		model.addAttribute("memberSourceList", memberSourceApi.list(tenantId));
+		return "crm/memberInfo.html";
+	}
+	
+	@RequiresPermissions("crm:memberBase:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberBase> page(MemberBaseDto queryDto) {
+		PageResult<MemberBase> rs = memberBaseApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberBase:read")
+	@ResponseBody
+	@RequestMapping("/pageNew.json")
+	public LayuiPage<MemberBase> pageNew(MemberBasePageDto queryDto) {
+		PageResult<MemberBase> rs = memberBaseApi.pageNew(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberBase:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberBase bean) {
+		return success(memberBaseApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberBase:update")
+	@ResponseBody
+	@RequestMapping("/toOther.json")
+	public ResponseObj<Boolean> toOther(@Valid @RequestBody MemberToOtherDto bean, BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		memberBaseApi.toOther(getTenantId(),bean,getUsername());
+		return success(true);
+	}
+
+	@RequiresPermissions("crm:memberBase:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		return success(memberBaseApi.updateStatus(getTenantId(),id,status,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberBase:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(String memberId) {
+		return success(memberBaseApi.remove(getTenantId(),memberId));
+	}
+
+	@RequiresPermissions("crm:memberBase:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<String> memberIds) {
+		return success(memberBaseApi.removeBatchByMemberId(getTenantId(),memberIds));
+	}
+
+	@RequiresPermissions("crm:memberBase:remove")
+	@ResponseBody
+	@RequestMapping("/toSea.json")
+	public ResponseObj<Boolean> toSea(@RequestBody List<String> memberIds) {
+		return success(memberBaseApi.toSea(getTenantId(),memberIds,getUsername()));
+	}
+
+}

+ 131 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberContractController.java

@@ -0,0 +1,131 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberContract;
+import com.mrxu.crm.entity.MemberLiaison;
+import com.mrxu.crm.entity.MemberNiche;
+import com.mrxu.crm.enums.ContractStatusEnum;
+import com.mrxu.crm.query.MemberBaseDto;
+import com.mrxu.crm.query.MemberContractDto;
+import com.mrxu.crm.service.*;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "合同管理")
+@Controller
+@RequestMapping("/crm/memberContract")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberContractController extends AdminBaseController {
+
+	private final MemberBaseService memberBaseApi;
+
+	private final MemberLiaisonService memberLiaisonApi;
+
+	private final MemberContractService memberContractApi;
+
+	private final MemberNicheService memberNicheApi;
+
+	private final MemberProductService memberProductApi;
+
+	@RequiresPermissions("crm:memberContract:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("contractStatusList", ContractStatusEnum.values());
+		model.addAttribute("memberList",memberBaseApi.list(getTenantId(),new MemberBaseDto()));
+		// model.addAttribute("memberLiaisonList", memberLiaisonApi.list(getTenantId()));
+		model.addAttribute("memberNicheList", memberNicheApi.list(getTenantId(),null));
+		model.addAttribute("memberProductList", memberProductApi.list(getTenantId()));
+		return "crm/memberContractIndex.html";
+	}
+	
+	@RequiresPermissions("crm:memberContract:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberContract> page(MemberContractDto queryDto) {
+		PageResult<MemberContract> rs = memberContractApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberContract:read")
+	@ResponseBody
+	@RequestMapping("/liaisonList.json")
+	public ResponseObj<List<MemberLiaison>> liaisonList(String memberId) {
+		return success(memberLiaisonApi.list(getTenantId(),memberId));
+	}
+
+	@RequiresPermissions("crm:memberContract:read")
+	@ResponseBody
+	@RequestMapping("/nicheList.json")
+	public ResponseObj<List<MemberNiche>> nicheList(String memberId) {
+		return success(memberNicheApi.list(getTenantId(),memberId));
+	}
+
+	@RequiresPermissions("crm:memberContract:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberContract> getById(Integer id) {
+		return success(memberContractApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberContract:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberContract bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(memberContractApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberContract:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		MemberContract bean = new MemberContract();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(memberContractApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberContract:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberContractApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberContract:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberContractApi.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("crm:memberContract:update")
+	@ResponseBody
+	@RequestMapping("/toReview.json")
+	public ResponseObj<Boolean> toReview(Integer id) {
+		return success(memberContractApi.toReview(getTenantId(),id,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberContract:update")
+	@ResponseBody
+	@RequestMapping("/cancelReview.json")
+	public ResponseObj<Boolean> cancelReview(Integer id) {
+		return success(memberContractApi.cancelReview(getTenantId(),id,getUsername()));
+	}
+
+}

+ 58 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberContractReviewController.java

@@ -0,0 +1,58 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberContract;
+import com.mrxu.crm.enums.ContractStatusEnum;
+import com.mrxu.crm.query.MemberContractDto;
+import com.mrxu.crm.service.MemberContractService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+
+@Api(tags = "合同审核")
+@Controller
+@RequestMapping("/crm/memberContractReview")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberContractReviewController extends AdminBaseController {
+
+    private final MemberContractService memberContractApi;
+
+    @RequiresPermissions("crm:memberContractReview:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        return "crm/memberContractReviewIndex.html";
+    }
+
+    @RequiresPermissions("crm:memberContractReview:read")
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<MemberContract> page(MemberContractDto queryDto) {
+        queryDto.setStatus(String.valueOf(ContractStatusEnum.review.getStatus()));
+        PageResult<MemberContract> rs = memberContractApi.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("crm:memberContractReview:update")
+    @ResponseBody
+    @RequestMapping("/pass.json")
+    public ResponseObj<Boolean> pass(Integer id,String reviewMessage) {
+        return success(memberContractApi.pass(getTenantId(),id,reviewMessage,getUsername()));
+    }
+
+    @RequiresPermissions("crm:memberContractReview:update")
+    @ResponseBody
+    @RequestMapping("/refuse.json")
+    public ResponseObj<Boolean> refuse(Integer id,String reviewMessage) {
+        return success(memberContractApi.refuse(getTenantId(),id,reviewMessage,getUsername()));
+    }
+
+}

+ 89 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberIndustryController.java

@@ -0,0 +1,89 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberIndustry;
+import com.mrxu.crm.query.MemberIndustryDto;
+import com.mrxu.crm.service.MemberIndustryService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "客户行业管理")
+@Controller
+@RequestMapping("/crm/memberIndustry")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberIndustryController extends AdminBaseController {
+
+	private final MemberIndustryService memberIndustryApi;
+	
+	@RequiresPermissions("crm:memberIndustry:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/memberIndustry.html";
+	}
+	
+	@RequiresPermissions("crm:memberIndustry:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberIndustry> page(MemberIndustryDto queryDto) {
+		PageResult<MemberIndustry> rs = memberIndustryApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberIndustry:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberIndustry> getById(Integer id) {
+		return success(memberIndustryApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberIndustry:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberIndustry bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(memberIndustryApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberIndustry:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		MemberIndustry bean = new MemberIndustry();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(memberIndustryApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberIndustry:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberIndustryApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberIndustry:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberIndustryApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 89 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberLevelController.java

@@ -0,0 +1,89 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberLevel;
+import com.mrxu.crm.query.MemberLevelDto;
+import com.mrxu.crm.service.MemberLevelService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "客户类型管理")
+@Controller
+@RequestMapping("/crm/memberLevel")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberLevelController extends AdminBaseController {
+
+	private final MemberLevelService memberLevelApi;
+	
+	@RequiresPermissions("crm:memberLevel:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/memberLevel.html";
+	}
+	
+	@RequiresPermissions("crm:memberLevel:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberLevel> page(MemberLevelDto queryDto) {
+		PageResult<MemberLevel> rs = memberLevelApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberLevel:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberLevel> getById(Integer id) {
+		return success(memberLevelApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberLevel:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberLevel bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(memberLevelApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberLevel:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		MemberLevel bean = new MemberLevel();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(memberLevelApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberLevel:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberLevelApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberLevel:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberLevelApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 83 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberLiaisonController.java

@@ -0,0 +1,83 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberLiaison;
+import com.mrxu.crm.query.MemberBaseDto;
+import com.mrxu.crm.query.MemberLiaisonDto;
+import com.mrxu.crm.service.MemberBaseService;
+import com.mrxu.crm.service.MemberLiaisonService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "联系人管理")
+@Controller
+@RequestMapping("/crm/memberLiaison")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberLiaisonController extends AdminBaseController {
+
+	private final MemberLiaisonService memberLiaisonApi;
+
+	private final MemberBaseService memberBaseApi;
+
+	@RequiresPermissions("crm:memberLiaison:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("memberList",memberBaseApi.list(getTenantId(),new MemberBaseDto()));
+		return "crm/memberLiaisonIndex.html";
+	}
+	
+	@RequiresPermissions("crm:memberLiaison:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberLiaison> page(MemberLiaisonDto queryDto) {
+		String memberId = getPara("memberId");
+		queryDto.setMemberId(memberId);
+		PageResult<MemberLiaison> rs = memberLiaisonApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberLiaison:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberLiaison> getById(Integer id) {
+		return success(memberLiaisonApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberLiaison:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberLiaison bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(memberLiaisonApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberLiaison:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberLiaisonApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberLiaison:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberLiaisonApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 101 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberNicheController.java

@@ -0,0 +1,101 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberNiche;
+import com.mrxu.crm.enums.NicheTypeEnum;
+import com.mrxu.crm.enums.SaleStepEnum;
+import com.mrxu.crm.query.MemberBaseDto;
+import com.mrxu.crm.query.MemberNicheDto;
+import com.mrxu.crm.service.MemberBaseService;
+import com.mrxu.crm.service.MemberNicheService;
+import com.mrxu.crm.service.MemberSourceService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "商机管理")
+@Controller
+@RequestMapping("/crm/memberNiche")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberNicheController extends AdminBaseController {
+
+	private final MemberNicheService memberNicheApi;
+
+	private final MemberSourceService memberSourceApi;
+
+	private final MemberBaseService memberBaseApi;
+	
+	@RequiresPermissions("crm:memberBase:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("nicheTypeList", NicheTypeEnum.values());
+		model.addAttribute("saleStepList", SaleStepEnum.values());
+		model.addAttribute("memberSourceList", memberSourceApi.list(getTenantId()));
+		model.addAttribute("memberList",memberBaseApi.list(getTenantId(),new MemberBaseDto()));
+		return "crm/memberNicheIndex.html";
+	}
+	
+	@RequiresPermissions("crm:memberBase:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberNiche> page(MemberNicheDto queryDto) {
+		String memberId = getPara("memberId");
+		queryDto.setMemberId(memberId);
+		PageResult<MemberNiche> rs = memberNicheApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberBase:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberNiche> getById(Integer id) {
+		return success(memberNicheApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberBase:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberNiche bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(memberNicheApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberBase:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		MemberNiche bean = new MemberNiche();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(memberNicheApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberBase:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberNicheApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberBase:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberNicheApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 118 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberProductController.java

@@ -0,0 +1,118 @@
+package com.mrxu.admin.controller.crm;
+
+import com.alibaba.fastjson.JSON;
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.service.SysRoleService;
+import com.mrxu.crm.entity.MemberProduct;
+import com.mrxu.crm.model.MemberProductStatistics;
+import com.mrxu.crm.model.ProductFlowStatistics;
+import com.mrxu.crm.query.AdjustStockDto;
+import com.mrxu.crm.query.MemberProductDto;
+import com.mrxu.crm.service.MemberProductService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+@Api(tags = "产品管理")
+@Controller
+@RequestMapping("/crm/memberProduct")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberProductController extends AdminBaseController {
+
+	private final MemberProductService memberProductApi;
+
+	private final  SysRoleService roleApi;
+	
+	@RequiresPermissions("crm:memberProduct:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("rolesJson", JSON.toJSONString(roleApi.list(getTenantId())));
+		return "crm/memberProduct.html";
+	}
+	
+	@RequiresPermissions("crm:memberProduct:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberProduct> page(MemberProductDto queryDto) {
+		PageResult<MemberProduct> rs = memberProductApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberProduct:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberProduct> getById(Integer id) {
+		return success(memberProductApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberProduct:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@RequestBody MemberProduct bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}
+		if(bean.getStockEnable() == null) {
+			bean.setStockEnable(0);
+		}
+		return success(memberProductApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberProduct:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		MemberProduct bean = new MemberProduct();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(memberProductApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberProduct:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberProductApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberProduct:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberProductApi.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("crm:memberProduct:remove")
+	@ResponseBody
+	@RequestMapping("/adjustStock.json")
+	public ResponseObj adjustStock(@RequestBody AdjustStockDto dto) {
+		memberProductApi.adjustStock(getTenantId(),dto,getUsername());
+		return success();
+	}
+
+	@RequiresPermissions("crm:memberProduct:statistics")
+	@ResponseBody
+	@RequestMapping("/statistics.json")
+	public ResponseObj<List<MemberProductStatistics>> statistics(Integer type) {
+		return success(memberProductApi.statistics(getTenantId(),type));
+	}
+
+	@RequiresPermissions("crm:memberProduct:statistics")
+	@ResponseBody
+	@RequestMapping("/statisticsPayWay.json")
+	public ResponseObj<List<ProductFlowStatistics>> statisticsPayWay(Integer type) {
+		return success(memberProductApi.statisticsPayWay(getTenantId(),type));
+	}
+
+}

+ 49 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberProductFlowController.java

@@ -0,0 +1,49 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberProductFlow;
+import com.mrxu.crm.query.MemberProductFlowDto;
+import com.mrxu.crm.service.MemberProductFlowService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Api(tags = "产品流水管理")
+@Controller
+@RequestMapping("/crm/memberProductFlow")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberProductFlowController extends AdminBaseController {
+
+	private final MemberProductFlowService memberProductFlowApi;
+	
+	@RequiresPermissions("crm:memberProductFlow:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/memberProductFlow.html";
+	}
+	
+	@RequiresPermissions("crm:memberProductFlow:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberProductFlow> page(MemberProductFlowDto queryDto) {
+		PageResult<MemberProductFlow> rs = memberProductFlowApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberProductFlow:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberProductFlow> getById(Integer id) {
+		return success(memberProductFlowApi.getById(getTenantId(),id));
+	}
+
+
+}

+ 106 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberSeaController.java

@@ -0,0 +1,106 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.CrmSdkConst;
+import com.mrxu.crm.entity.MemberBase;
+import com.mrxu.crm.query.MemberBaseDto;
+import com.mrxu.crm.query.MemberBasePageDto;
+import com.mrxu.crm.query.MemberToOtherDto;
+import com.mrxu.crm.service.MemberBaseService;
+import com.mrxu.crm.service.MemberIndustryService;
+import com.mrxu.crm.service.MemberLevelService;
+import com.mrxu.crm.service.MemberSourceService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "客户公海")
+@Controller
+@RequestMapping("/crm/memberSea")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberSeaController extends AdminBaseController {
+
+    private final MemberBaseService memberBaseApi;
+
+    private final MemberSourceService memberSourceApi;
+
+    private final MemberLevelService memberLevelApi;
+
+    private final MemberIndustryService memberIndustryApi;
+
+    @RequiresPermissions("crm:memberSea:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("memberSourceList", memberSourceApi.list(getTenantId()));
+        model.addAttribute("memberLevelList", memberLevelApi.list(getTenantId()));
+        model.addAttribute("memberIndustryList", memberIndustryApi.list(getTenantId()));
+        model.addAttribute("querySea",true);
+        return "crm/memberBase.html";
+    }
+
+    @RequiresPermissions("crm:memberSea:read")
+    @ResponseBody
+    @RequestMapping("/page.json")
+    public LayuiPage<MemberBase> page(MemberBaseDto queryDto) {
+        queryDto.setQuerySea(true);
+        PageResult<MemberBase> rs = memberBaseApi.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("crm:memberSea:read")
+    @ResponseBody
+    @RequestMapping("/pageNew.json")
+    public LayuiPage<MemberBase> pageNew(MemberBasePageDto queryDto) {
+        queryDto.setQuerySea(true);
+        PageResult<MemberBase> rs = memberBaseApi.pageNew(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("crm:memberSea:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Boolean> save(@Valid @RequestBody MemberBase bean, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        bean.setDeptId(CrmSdkConst.MEMBER_SEA_DEPT_ID);
+        bean.setOwner(CrmSdkConst.MEMBER_SEA_OWNER);
+        return success(memberBaseApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+    }
+
+    @RequiresPermissions("crm:memberSea:update")
+    @ResponseBody
+    @RequestMapping("/toOther.json")
+    public ResponseObj<Boolean> toOther(@Valid @RequestBody MemberToOtherDto bean, BindingResult bindingResult) {
+        MrxuAssert.check(bindingResult);
+        memberBaseApi.toOther(getTenantId(),bean,getUsername());
+        return success(true);
+    }
+
+    @RequiresPermissions("crm:memberSea:remove")
+    @ResponseBody
+    @RequestMapping("/remove.json")
+    public ResponseObj<Boolean> remove(String memberId) {
+        return success(memberBaseApi.remove(getTenantId(),memberId));
+    }
+
+    @RequiresPermissions("crm:memberSea:remove")
+    @ResponseBody
+    @RequestMapping("/removeBatch.json")
+    public ResponseObj<Boolean> removeBatch(@RequestBody List<String> memberIds) {
+        return success(memberBaseApi.removeBatchByMemberId(getTenantId(),memberIds));
+    }
+
+}

+ 89 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberSourceController.java

@@ -0,0 +1,89 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberSource;
+import com.mrxu.crm.query.MemberSourceDto;
+import com.mrxu.crm.service.MemberSourceService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "客户来源管理")
+@Controller
+@RequestMapping("/crm/memberSource")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberSourceController extends AdminBaseController {
+
+	private final MemberSourceService memberSourceApi;
+	
+	@RequiresPermissions("crm:memberSource:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/memberSource.html";
+	}
+	
+	@RequiresPermissions("crm:memberSource:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberSource> page(MemberSourceDto queryDto) {
+		PageResult<MemberSource> rs = memberSourceApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberSource:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberSource> getById(Integer id) {
+		return success(memberSourceApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberSource:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberSource bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(memberSourceApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberSource:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		MemberSource bean = new MemberSource();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(memberSourceApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberSource:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberSourceApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberSource:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberSourceApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 101 - 0
src/main/java/com/mrxu/admin/controller/crm/MemberVisitController.java

@@ -0,0 +1,101 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberVisit;
+import com.mrxu.crm.enums.MemberScoreEnum;
+import com.mrxu.crm.enums.VisitWayEnum;
+import com.mrxu.crm.query.MemberBaseDto;
+import com.mrxu.crm.query.MemberVisitDto;
+import com.mrxu.crm.service.MemberBaseService;
+import com.mrxu.crm.service.MemberContractService;
+import com.mrxu.crm.service.MemberVisitService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "回访管理")
+@Controller
+@RequestMapping("/crm/memberVisit")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class MemberVisitController extends AdminBaseController {
+
+	private final MemberVisitService memberVisitApi;
+
+	private final MemberBaseService memberBaseApi;
+
+	private final MemberContractService memberContractApi;
+	
+	@RequiresPermissions("crm:memberVisit:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("visitWayList", VisitWayEnum.values());
+		model.addAttribute("scoreList", MemberScoreEnum.values());
+		model.addAttribute("memberList",memberBaseApi.list(getTenantId(),new MemberBaseDto()));
+		return "crm/memberVisitIndex.html";
+	}
+	
+	@RequiresPermissions("crm:memberVisit:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberVisit> page(MemberVisitDto queryDto) {
+		PageResult<MemberVisit> rs = memberVisitApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:memberVisit:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<MemberVisit> getById(Integer id) {
+		return success(memberVisitApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberVisit:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberVisit bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(memberVisitApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberVisit:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		MemberVisit bean = new MemberVisit();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(memberVisitApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:memberVisit:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(memberVisitApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:memberVisit:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(memberVisitApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 82 - 0
src/main/java/com/mrxu/admin/controller/crm/OnceCardController.java

@@ -0,0 +1,82 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.OnceCard;
+import com.mrxu.crm.query.OnceCardDto;
+import com.mrxu.crm.service.OnceCardService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "次卡管理")
+@Controller
+@RequestMapping("/crm/onceCard")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class OnceCardController extends AdminBaseController {
+
+	private final OnceCardService onceCardApi;
+	
+	@RequiresPermissions("crm:onceCard:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/onceCard.html";
+	}
+	
+	@RequiresPermissions("crm:onceCard:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<OnceCard> page(OnceCardDto queryDto) {
+		PageResult<OnceCard> rs = onceCardApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:onceCard:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody OnceCard bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(onceCardApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:onceCard:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		OnceCard bean = new OnceCard();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(onceCardApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:onceCard:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(onceCardApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:onceCard:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(onceCardApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 72 - 0
src/main/java/com/mrxu/admin/controller/crm/OnceMemberController.java

@@ -0,0 +1,72 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.OnceMember;
+import com.mrxu.crm.query.OnceMemberDto;
+import com.mrxu.crm.service.OnceMemberService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "会员次卡管理")
+@Controller
+@RequestMapping("/crm/onceMember")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class OnceMemberController extends AdminBaseController {
+
+	private final OnceMemberService onceMemberApi;
+	
+	@RequiresPermissions("crm:onceMember:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/onceMember.html";
+	}
+	
+	@RequiresPermissions("crm:onceMember:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<OnceMember> page(OnceMemberDto queryDto) {
+		PageResult<OnceMember> rs = onceMemberApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:onceMember:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody OnceMember bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(onceMemberApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:onceMember:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(onceMemberApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:onceMember:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(onceMemberApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 72 - 0
src/main/java/com/mrxu/admin/controller/crm/OnceRecordController.java

@@ -0,0 +1,72 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.OnceRecord;
+import com.mrxu.crm.query.OnceRecordDto;
+import com.mrxu.crm.service.OnceRecordService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "次卡流水管理")
+@Controller
+@RequestMapping("/crm/onceRecord")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class OnceRecordController extends AdminBaseController {
+
+	private final OnceRecordService onceRecordApi;
+	
+	@RequiresPermissions("crm:onceRecord:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/onceRecord.html";
+	}
+	
+	@RequiresPermissions("crm:onceRecord:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<OnceRecord> page(OnceRecordDto queryDto) {
+		PageResult<OnceRecord> rs = onceRecordApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:onceRecord:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody OnceRecord bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(onceRecordApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:onceRecord:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(onceRecordApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:onceRecord:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(onceRecordApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 82 - 0
src/main/java/com/mrxu/admin/controller/crm/PayWayController.java

@@ -0,0 +1,82 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.MemberPayWay;
+import com.mrxu.crm.query.PayWayDto;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "收款方式管理")
+@Controller("crmPayWayController")
+@RequestMapping("/crm/payWay")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class PayWayController extends AdminBaseController {
+
+	private final MemberPayWayService payWayApi;
+	
+	@RequiresPermissions("crm:payWay:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/payWay.html";
+	}
+	
+	@RequiresPermissions("crm:payWay:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<MemberPayWay> page(PayWayDto queryDto) {
+		PageResult<MemberPayWay> rs = payWayApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:payWay:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody MemberPayWay bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		return success(payWayApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:payWay:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		MemberPayWay bean = new MemberPayWay();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(payWayApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:payWay:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(payWayApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:payWay:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(payWayApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 40 - 0
src/main/java/com/mrxu/admin/controller/crm/PointRecordController.java

@@ -0,0 +1,40 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.PointRecord;
+import com.mrxu.crm.query.PointRecordDto;
+import com.mrxu.crm.service.PointRecordService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Api(tags = "积分流水管理")
+@Controller
+@RequestMapping("/crm/pointRecord")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class PointRecordController extends AdminBaseController {
+
+	private final PointRecordService pointRecordApi;
+	
+	@RequiresPermissions("crm:pointRecord:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/pointRecord.html";
+	}
+	
+	@RequiresPermissions("crm:pointRecord:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<PointRecord> page(PointRecordDto queryDto) {
+		PageResult<PointRecord> rs = pointRecordApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+}

+ 69 - 0
src/main/java/com/mrxu/admin/controller/crm/RechargeConfigController.java

@@ -0,0 +1,69 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.RechargeConfig;
+import com.mrxu.crm.query.RechargeConfigDto;
+import com.mrxu.crm.service.RechargeConfigService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "充值配置管理")
+@Controller
+@RequestMapping("/crm/rechargeConfig")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class RechargeConfigController extends AdminBaseController {
+
+	private final RechargeConfigService rechargeConfigApi;
+	
+	@RequiresPermissions("crm:rechargeConfig:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/rechargeConfig.html";
+	}
+	
+	@RequiresPermissions("crm:rechargeConfig:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<RechargeConfig> page(RechargeConfigDto queryDto) {
+		PageResult<RechargeConfig> rs = rechargeConfigApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:rechargeConfig:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody RechargeConfig bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		return success(rechargeConfigApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:rechargeConfig:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(rechargeConfigApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:rechargeConfig:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(rechargeConfigApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 89 - 0
src/main/java/com/mrxu/admin/controller/crm/RptCrmController.java

@@ -0,0 +1,89 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.RptCrm;
+import com.mrxu.crm.query.RptCrmDto;
+import com.mrxu.crm.service.RptCrmService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "统计管理")
+@Controller
+@RequestMapping("/crm/rptCrm")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class RptCrmController extends AdminBaseController {
+
+	private final RptCrmService rptCrmApi;
+	
+	@RequiresPermissions("crm:rptCrm:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/rptCrm.html";
+	}
+	
+	@RequiresPermissions("crm:rptCrm:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<RptCrm> page(RptCrmDto queryDto) {
+		PageResult<RptCrm> rs = rptCrmApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:rptCrm:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<RptCrm> getById(Integer id) {
+		return success(rptCrmApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:rptCrm:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody RptCrm bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(rptCrmApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:rptCrm:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		RptCrm bean = new RptCrm();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(rptCrmApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:rptCrm:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(rptCrmApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:rptCrm:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(rptCrmApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 89 - 0
src/main/java/com/mrxu/admin/controller/crm/SalesStageController.java

@@ -0,0 +1,89 @@
+package com.mrxu.admin.controller.crm;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.entity.SalesStage;
+import com.mrxu.crm.query.SalesStageDto;
+import com.mrxu.crm.service.SalesStageService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "销售阶段管理")
+@Controller
+@RequestMapping("/crm/salesStage")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class SalesStageController extends AdminBaseController {
+
+	private final SalesStageService salesStageApi;
+	
+	@RequiresPermissions("crm:salesStage:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "crm/salesStage.html";
+	}
+	
+	@RequiresPermissions("crm:salesStage:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<SalesStage> page(SalesStageDto queryDto) {
+		PageResult<SalesStage> rs = salesStageApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("crm:salesStage:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<SalesStage> getById(Integer id) {
+		return success(salesStageApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:salesStage:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<SalesStage> save(@Valid @RequestBody SalesStage bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(salesStageApi.save(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:salesStage:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<SalesStage> updateStatus(Integer id, Integer status) {
+		SalesStage bean = new SalesStage();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(salesStageApi.save(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("crm:salesStage:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(salesStageApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("crm:salesStage:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(salesStageApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 115 - 0
src/main/java/com/mrxu/admin/controller/flow/FlowApiController.java

@@ -0,0 +1,115 @@
+package com.mrxu.admin.controller.flow;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.flow.bean.ApiDebuggerResult;
+import com.mrxu.flow.entity.FlowApi;
+import com.mrxu.flow.query.FlowApiDto;
+import com.mrxu.flow.query.FlowDebuggerDto;
+import com.mrxu.flow.query.SortEditDto;
+import com.mrxu.flow.service.FlowApiService;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "服务商接口管理")
+@Controller
+@RequestMapping("/flow/api")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class FlowApiController extends AdminBaseController {
+
+	private final FlowApiService apiService;
+	
+	@RequiresPermissions("flow:api:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public ResponseObj<PageResult<FlowApi>> page(FlowApiDto queryDto) {
+		PageResult<FlowApi> rs = apiService.page(getTenantId(),queryDto);
+		return success(rs);
+	}
+
+	@RequiresPermissions("flow:api:read")
+	@ResponseBody
+	@RequestMapping("/simpleList.json")
+	public ResponseObj<List<FlowApi>> simpleList(@RequestBody FlowApiDto queryDto) {
+		return success(apiService.simpleList(getTenantId(),queryDto));
+	}
+
+	@RequiresPermissions("flow:api:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<FlowApi> getById(Integer id) {
+		return success(apiService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("flow:api:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<FlowApi> save(@Valid @RequestBody FlowApi bean) {
+		apiService.saveOrUpdate(getTenantId(),bean,getUsername());
+		// 主要是为了返回新增后的id
+		return success(bean);
+	}
+
+	@RequiresPermissions("flow:api:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		FlowApi bean = new FlowApi();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(apiService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("flow:api:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(apiService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("flow:api:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(apiService.removeBatch(getTenantId(),ids));
+	}
+
+	/**
+	 * 接口调试
+	 * @param dto
+	 * @return
+	 */
+	@RequiresPermissions("flow:api:read")
+	@ResponseBody
+	@PostMapping("/debugger.json")
+	public ResponseObj<ApiDebuggerResult> debugger(@Valid @RequestBody FlowApi dto) {
+		return success(apiService.debugger(dto));
+	}
+
+	@RequiresPermissions("flow:api:update")
+	@ResponseBody
+	@PostMapping("/sortEdit.json")
+	public ResponseObj<Boolean> sortEdit(@Valid @RequestBody SortEditDto dto) {
+		return success(apiService.sortEdit(getTenantId(),dto,getUsername()));
+	}
+
+
+	@RequiresPermissions("flow:api:read")
+	@ResponseBody
+	@PostMapping("/debuggerFlow.json")
+	public ResponseObj<ApiDebuggerResult> debuggerFlow(@Valid @RequestBody FlowDebuggerDto dto) {
+		return success(apiService.debuggerFlow(dto));
+	}
+
+}

+ 76 - 0
src/main/java/com/mrxu/admin/controller/flow/FlowApiParamHistoryController.java

@@ -0,0 +1,76 @@
+package com.mrxu.admin.controller.flow;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.flow.service.FlowApiParamHistoryService;
+import com.mrxu.flow.entity.FlowApiParamHistory;
+import com.mrxu.flow.query.FlowApiParamHistoryDto;
+
+@Api(tags = "接口参数历史管理")
+@Controller
+@RequestMapping("/flow/apiParamHistory")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class FlowApiParamHistoryController extends AdminBaseController {
+
+	private final FlowApiParamHistoryService apiParamHistoryService;
+	
+	@RequiresPermissions("flow:apiParamHistory:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public ResponseObj<PageResult<FlowApiParamHistory>> page(FlowApiParamHistoryDto queryDto) {
+		PageResult<FlowApiParamHistory> rs = apiParamHistoryService.page(getTenantId(),queryDto);
+		return success(rs);
+	}
+
+	@RequiresPermissions("flow:apiParamHistory:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<FlowApiParamHistory> getById(Integer id) {
+		return success(apiParamHistoryService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("flow:apiParamHistory:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody FlowApiParamHistory bean) {
+		return success(apiParamHistoryService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("flow:apiParamHistory:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		FlowApiParamHistory bean = new FlowApiParamHistory();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(apiParamHistoryService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("flow:apiParamHistory:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(apiParamHistoryService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("flow:apiParamHistory:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(apiParamHistoryService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 85 - 0
src/main/java/com/mrxu/admin/controller/flow/FlowSupplierController.java

@@ -0,0 +1,85 @@
+package com.mrxu.admin.controller.flow;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import com.mrxu.base.entity.SysRole;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.flow.service.FlowSupplierService;
+import com.mrxu.flow.entity.FlowSupplier;
+import com.mrxu.flow.query.FlowSupplierDto;
+
+@Api(tags = "服务供应商管理")
+@Controller
+@RequestMapping("/flow/supplier")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class FlowSupplierController extends AdminBaseController {
+
+	private final FlowSupplierService apiSupplierService;
+	
+	@RequiresPermissions("flow:apiSupplier:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public ResponseObj<PageResult<FlowSupplier>> page(FlowSupplierDto queryDto) {
+		PageResult<FlowSupplier> rs = apiSupplierService.page(getTenantId(),queryDto);
+		return success(rs);
+	}
+
+	@RequiresPermissions("flow:apiSupplier:read")
+	@ResponseBody
+	@GetMapping("/list.json")
+	public ResponseObj<List<FlowSupplier>> list() {
+		return success(apiSupplierService.list(getTenantId()));
+	}
+
+	@RequiresPermissions("flow:apiSupplier:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<FlowSupplier> getById(Integer id) {
+		return success(apiSupplierService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("flow:apiSupplier:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody FlowSupplier bean) {
+		return success(apiSupplierService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("flow:apiSupplier:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		FlowSupplier bean = new FlowSupplier();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(apiSupplierService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("flow:apiSupplier:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(apiSupplierService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("flow:apiSupplier:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(apiSupplierService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 157 - 0
src/main/java/com/mrxu/admin/controller/iot/IotDeviceController.java

@@ -0,0 +1,157 @@
+package com.mrxu.admin.controller.iot;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.iot.entity.IotDevice;
+import com.mrxu.iot.entity.IotDeviceChannel;
+import com.mrxu.iot.entity.IotDeviceClass;
+import com.mrxu.iot.query.IotDeviceAddDto;
+import com.mrxu.iot.query.IotDeviceChannelDto;
+import com.mrxu.iot.query.IotDeviceDto;
+import com.mrxu.iot.service.IotDeviceChannelService;
+import com.mrxu.iot.service.IotDeviceClassService;
+import com.mrxu.iot.service.IotDeviceService;
+import com.mrxu.iot.third.request.WvpDevicePageDto;
+import com.mrxu.iot.third.response.WvpDeviceBean;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "设备管理管理")
+@Controller
+@RequestMapping("/iot/iotDevice")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class IotDeviceController extends AdminBaseController {
+
+	private final IotDeviceClassService classService;
+
+	private final IotDeviceService iotDeviceService;
+
+	private final IotDeviceChannelService channelService;
+	
+	@RequiresPermissions("iot:iotDevice:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "iot/iotDevice.html";
+	}
+	
+	@RequiresPermissions("iot:iotDevice:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<IotDevice> page(IotDeviceDto queryDto) {
+		PageResult<IotDevice> rs = iotDeviceService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("iot:iotDevice:read")
+	@ResponseBody
+	@RequestMapping("/classList.json")
+	public ResponseObj<List<IotDeviceClass>> classList() {
+		return success(classService.list(getTenantId(),null));
+	}
+
+	@RequiresPermissions("iot:iotDevice:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<IotDevice> getById(Integer id) {
+		return success(iotDeviceService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("iot:iotDevice:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody IotDevice bean) {
+		return success(iotDeviceService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("iot:iotDevice:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		IotDevice bean = new IotDevice();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(iotDeviceService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("iot:iotDevice:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(String deviceId) {
+		return success(iotDeviceService.removeByDeviceId(getTenantId(),deviceId));
+	}
+
+	@RequiresPermissions("iot:iotDevice:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(iotDeviceService.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("iot:iotDevice:update")
+	@ResponseBody
+	@RequestMapping("/classSave.json")
+	public ResponseObj<Boolean> classSave(@Valid @RequestBody IotDeviceClass bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		MrxuAssert.isFalse(bean.getParentId().equals(bean.getId()),"父节点不能是自己");
+		IotDeviceClass exist = classService.getByKey(getTenantId(),"name",bean.getName());
+		MrxuAssert.isTrue(exist == null || exist.getId().equals(bean.getId()),
+				"【"+bean.getName()+"】已存在");
+		return success(classService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("iot:iotDevice:remove")
+	@ResponseBody
+	@RequestMapping("/removeClass.json")
+	public ResponseObj<Boolean> removeClass(Integer id) {
+		return success(classService.remove(getTenantId(),id));
+	}
+
+
+
+	@RequiresPermissions("iot:iotDevice:read")
+	@ResponseBody
+	@RequestMapping("/iotDevicePage.json")
+	public LayuiPage<WvpDeviceBean> iotDevicePage(WvpDevicePageDto dto) {
+		PageResult<WvpDeviceBean> rs = iotDeviceService.wvpPage(getTenantId(),dto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("iot:iotDevice:read")
+	@ResponseBody
+	@RequestMapping("/iotDeviceAdd.json")
+	public ResponseObj<Boolean> iotDeviceAdd(@RequestBody IotDeviceAddDto dto) {
+		iotDeviceService.iotDeviceAdd(getTenantId(),dto,getUsername());
+		return success(true);
+	}
+
+	@RequiresPermissions("iot:iotDevice:read")
+	@ResponseBody
+	@RequestMapping("/channelPage.json")
+	public LayuiPage<IotDeviceChannel> channelPage(IotDeviceChannelDto queryDto) {
+		PageResult<IotDeviceChannel> rs = channelService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("iot:iotDevice:update")
+	@ResponseBody
+	@RequestMapping("/channelSave.json")
+	public ResponseObj<Boolean> channelSave(@Valid @RequestBody IotDeviceChannel bean) {
+		return success(channelService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+}

+ 40 - 0
src/main/java/com/mrxu/admin/controller/iot/IotDeviceHistoryVideoController.java

@@ -0,0 +1,40 @@
+package com.mrxu.admin.controller.iot;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.iot.service.IotDeviceHistoryVideoService;
+import com.mrxu.iot.third.request.WvpRecordPageDto;
+import com.mrxu.iot.third.response.WvpRecordBean;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Api(tags = "设备历史视频")
+@Controller
+@RequestMapping("/iot/iotDeviceHistoryVideo")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class IotDeviceHistoryVideoController extends AdminBaseController {
+
+	private final IotDeviceHistoryVideoService historyVideoService;
+	
+	@RequiresPermissions("iot:iotDeviceHistoryVideo:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "iot/iotDeviceHistoryVideo.html";
+	}
+	
+	@RequiresPermissions("iot:iotDeviceHistoryVideo:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<WvpRecordBean> page(WvpRecordPageDto dto) {
+		PageResult<WvpRecordBean> rs = historyVideoService.wvpPage(dto);
+		return renderLayuiPage(rs);
+	}
+
+}

+ 70 - 0
src/main/java/com/mrxu/admin/controller/iot/IotDeviceRecordPlayController.java

@@ -0,0 +1,70 @@
+package com.mrxu.admin.controller.iot;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.iot.model.IotDeviceVideoNode;
+import com.mrxu.iot.service.IotDeviceClassService;
+import com.mrxu.iot.service.IotDeviceHistoryVideoService;
+import com.mrxu.iot.third.request.WvpDevicePageDto;
+import com.mrxu.iot.third.request.WvpRecordPageDto;
+import com.mrxu.iot.third.response.StreamContent;
+import com.mrxu.iot.third.response.WvpDeviceBean;
+import com.mrxu.iot.third.response.WvpRecordBean;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+@Api(tags = "视频回放")
+@Controller
+@RequestMapping("/iot/iotDeviceRecordVideoPlay")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class IotDeviceRecordPlayController extends AdminBaseController {
+
+	private final IotDeviceHistoryVideoService historyVideoService;
+
+	private final IotDeviceClassService classService;
+
+	@RequiresPermissions("iot:iotDeviceRecordVideoPlay:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "iot/iotDeviceRecordVideoPlay.html";
+	}
+
+	@RequiresPermissions("iot:iotDeviceRecordVideoPlay:read")
+	@ResponseBody
+	@RequestMapping("/classList.json")
+	public ResponseObj<List<IotDeviceVideoNode>> classList() {
+		return success(classService.deviceVideoNodeList(getTenantId()));
+	}
+
+
+	@RequiresPermissions("iot:iotDeviceRecordVideoPlay:read")
+	@ResponseBody
+	@RequestMapping("/iotDeviceRecordPage.json")
+	public LayuiPage<WvpRecordBean> iotDevicePage(WvpRecordPageDto dto) {
+		PageResult<WvpRecordBean> rs = historyVideoService.wvpPage(dto);
+		return renderLayuiPage(rs);
+	}
+
+
+
+
+	@RequiresPermissions("iot:iotDeviceRecordVideoPlay:read")
+	@ResponseBody
+	@RequestMapping("/play.json")
+	public ResponseObj<StreamContent> play(Integer channelId) {
+		return success(classService.play(getTenantId(),channelId,getUsername()));
+	}
+
+
+
+}

+ 88 - 0
src/main/java/com/mrxu/admin/controller/iot/IotDeviceVideoController.java

@@ -0,0 +1,88 @@
+package com.mrxu.admin.controller.iot;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.iot.model.IotDeviceVideoNode;
+import com.mrxu.iot.service.IotDeviceChannelService;
+import com.mrxu.iot.service.IotDeviceClassService;
+import com.mrxu.iot.third.WvpFeignClient;
+import com.mrxu.iot.third.response.StreamContent;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+@Api(tags = "设备视频")
+@Controller
+@RequestMapping("/iot/iotDeviceVideo")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class IotDeviceVideoController extends AdminBaseController {
+
+	private final WvpFeignClient wvpClient;
+
+	private final IotDeviceClassService classService;
+
+	private final IotDeviceChannelService channelService;
+
+	@RequiresPermissions("iot:iotDeviceVideo:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "iot/iotDeviceVideo.html";
+	}
+
+	@RequiresPermissions("iot:iotDeviceVideo:read")
+	@ResponseBody
+	@RequestMapping("/classList.json")
+	public ResponseObj<List<IotDeviceVideoNode>> classList() {
+		return success(classService.deviceVideoNodeList(getTenantId()));
+	}
+
+	@RequiresPermissions("iot:iotDeviceVideo:read")
+	@ResponseBody
+	@RequestMapping("/play.json")
+	public ResponseObj<StreamContent> play(Integer channelId) {
+		return success(classService.play(getTenantId(),channelId,getUsername()));
+	}
+
+	@RequiresPermissions("iot:iotDeviceVideo:read")
+	@ResponseBody
+	@RequestMapping("/getChannelConfig.json")
+	public ResponseObj<String> getChannelConfig(Integer channelId) {
+		return success(channelService.getById(getTenantId(),channelId).getConfig());
+	}
+
+	@RequiresPermissions("iot:iotDeviceVideo:read")
+	@ResponseBody
+	@RequestMapping("/control.json")
+	public ResponseObj<Object> control(String deviceId
+			, String channelId
+			, String command
+			, int horizonSpeed
+			, int verticalSpeed
+			, int zoomSpeed) {
+		wvpClient.control(deviceId, channelId, command, horizonSpeed, verticalSpeed, zoomSpeed);
+		return success();
+	}
+
+	@RequiresPermissions("iot:iotDeviceVideo:update")
+	@ResponseBody
+	@RequestMapping("/saveAndCommand.json")
+	public ResponseObj<Object> saveAndCommand(String deviceId
+			,String channelId
+			,@RequestParam(required = false) Integer cmdCode
+			,int parameter1
+			,int parameter2
+			,int bindCode2,String config) {
+		channelService.saveAndCommand(getTenantId(),deviceId,channelId,
+				cmdCode,parameter1, parameter2, bindCode2,config,getUsername());
+		return success();
+	}
+
+}

+ 79 - 0
src/main/java/com/mrxu/admin/controller/sales/CategoryController.java

@@ -0,0 +1,79 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.sales.entity.Category;
+import com.mrxu.sales.query.CategoryDto;
+import com.mrxu.sales.service.CategoryService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "业态管理")
+@Controller
+@RequestMapping("/sales/category")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class CategoryController extends AdminBaseController {
+
+	private final CategoryService categoryApi;
+	
+	@RequiresPermissions("sales:category:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "sales/category.html";
+	}
+	
+	@RequiresPermissions("sales:category:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<Category> page(CategoryDto queryDto) {
+		PageResult<Category> rs = categoryApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:category:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody Category bean,BindingResult bindingResult) {
+		MrxuAssert.check(bindingResult);
+		if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}
+		return success(categoryApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:category:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		return success(categoryApi.updateStatus(getTenantId(),id,status,getUsername()));
+	}
+
+	@RequiresPermissions("sales:category:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(categoryApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:category:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(categoryApi.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 92 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyChargeController.java

@@ -0,0 +1,92 @@
+package com.mrxu.admin.controller.sales;
+
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.DutyRecord;
+import com.mrxu.sales.entity.DutyRecordItem;
+import com.mrxu.sales.enums.DutyRecordItemStatus;
+import com.mrxu.sales.enums.DutyRecordStatus;
+import com.mrxu.sales.query.DutyRecordDto;
+import com.mrxu.sales.query.DutyRecordItemChargeDto;
+import com.mrxu.sales.query.DutyRecordItemDto;
+import com.mrxu.sales.service.DutyProjectService;
+import com.mrxu.sales.service.DutyRecordItemService;
+import com.mrxu.sales.service.DutyRecordService;
+import com.mrxu.sales.service.ItemOrderDutyService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Api(tags = "门诊缴费")
+@Controller
+@RequestMapping("/sales/dutyCharge")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyChargeController extends AdminBaseController {
+
+    private final DutyProjectService projectService;
+
+    private final DutyRecordService dutyRecordApi;
+
+    private final DutyRecordItemService recordItemService;
+
+    private final MemberPayWayService payWayService;
+
+    private final ItemOrderDutyService orderDutyService;
+
+    @RequiresPermissions("sales:dutyCharge:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("defaultDate", DateFunc.getToday());
+        model.addAttribute("defaultStatus", DutyRecordStatus.used.getStatus());
+        model.addAttribute("projectList",projectService.list(getTenantId()));
+        model.addAttribute("recordStatusList", DutyRecordStatus.values());
+        model.addAttribute("payWayList",payWayService.list(getTenantId()));
+
+        model.addAttribute("recordItemStatusList", DutyRecordItemStatus.values());
+        return "sales/dutyCharge.html";
+    }
+
+    @RequiresPermissions("sales:dutyCharge:read")
+    @ResponseBody
+    @RequestMapping("/recordPage.json")
+    public LayuiPage<DutyRecord> recordPage(DutyRecordDto queryDto) {
+        PageResult<DutyRecord> rs = dutyRecordApi.charge(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyCharge:read")
+    @ResponseBody
+    @RequestMapping("/recordItemPage.json")
+    public LayuiPage<DutyRecordItem> recordItemPage(DutyRecordItemDto queryDto) {
+        queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+        PageResult<DutyRecordItem> rs = recordItemService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyCharge:update")
+    @ResponseBody
+    @RequestMapping("/charge.json")
+    public ResponseObj<Boolean> charge(@RequestBody DutyRecordItemChargeDto dto) {
+        // 有改价的权限才可以修改实付金额
+        if(!SecurityUtils.getSubject().isPermitted("sales:dutyCharge:changePrice")) {
+            dto.setActualMoney(null);
+        }
+        orderDutyService.createHisOrderAndPay(getTenantId(),dto,getUsername());
+        return success(true);
+    }
+
+
+}

+ 86 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyDataController.java

@@ -0,0 +1,86 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.DutyData;
+import com.mrxu.sales.query.DutyDataDto;
+import com.mrxu.sales.service.DutyDataService;
+import com.mrxu.sales.service.DutyProjectService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+
+@Api(tags = "预约数据管理")
+@Controller
+@RequestMapping("/sales/dutyData")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyDataController extends AdminBaseController {
+
+	private final DutyProjectService projectService;
+
+	private final DutyDataService dutyDataService;
+	
+	@RequiresPermissions("sales:dutyData:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("defaultDate", DateFunc.getToday());
+		model.addAttribute("projectList",projectService.list(getTenantId()));
+		return "sales/dutyData.html";
+	}
+	
+	@RequiresPermissions("sales:dutyData:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<DutyData> page(DutyDataDto queryDto) {
+		PageResult<DutyData> rs = dutyDataService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyData:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<DutyData> getById(Integer id) {
+		return success(dutyDataService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:dutyData:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody DutyData bean) {
+		if(bean.getCanApply() == null) {
+			bean.setCanApply(MrxuConst.disable);
+		}
+		return success(dutyDataService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyData:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		DutyData bean = new DutyData();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(dutyDataService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyData:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(dutyDataService.remove(getTenantId(),id));
+	}
+
+
+}

+ 95 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyOrderGoodsDoController.java

@@ -0,0 +1,95 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.DutyRecordItem;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.enums.ItemOrderDetailType;
+import com.mrxu.sales.enums.ItemOrderStatus;
+import com.mrxu.sales.enums.ItemOrderType;
+import com.mrxu.sales.query.DutyRecordItemDto;
+import com.mrxu.sales.query.DutyRecordItemGoodsGetDto;
+import com.mrxu.sales.query.ItemOrderDto;
+import com.mrxu.sales.service.DutyRecordItemService;
+import com.mrxu.sales.service.ItemOrderDutyService;
+import com.mrxu.sales.service.ItemOrderService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Api(tags = "代煎订单")
+@Controller
+@RequestMapping("/sales/dutyOrderGoodsDo")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyOrderGoodsDoController extends AdminBaseController {
+
+    private final ItemOrderService itemOrderService;
+
+    private final ItemOrderDutyService orderDutyService;
+
+    private final MemberPayWayService payWayService;
+
+    private final DutyRecordItemService recordItemService;
+
+    @RequiresPermissions("sales:dutyOrderGoodsDo:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("defaultDate", DateFunc.getToday());
+        model.addAttribute("defaultStatus", ItemOrderStatus.waitMake.getStatus());
+        model.addAttribute("orderStatusList", ItemOrderStatus.values());
+        model.addAttribute("payWayList",payWayService.list(getTenantId()));
+        return "sales/dutyOrderGoodsDo.html";
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsDo:read")
+    @ResponseBody
+    @RequestMapping("/orderPage.json")
+    public LayuiPage<ItemOrder> orderPage(ItemOrderDto queryDto) {
+        queryDto.setType(ItemOrderType.HIS.getType());
+        PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsDo:read")
+    @ResponseBody
+    @RequestMapping("/recordItemPage.json")
+    public LayuiPage<DutyRecordItem> recordItemPage(DutyRecordItemDto queryDto) {
+        queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+        List<Integer> typeList = new ArrayList<>();
+        typeList.add(ItemOrderDetailType.goods.getType());
+        typeList.add(ItemOrderDetailType.pack.getType());
+        queryDto.setTypes(typeList);
+        PageResult<DutyRecordItem> rs = recordItemService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsDo:update")
+    @ResponseBody
+    @RequestMapping("/doGoods.json")
+    public ResponseObj<Boolean> doGoods(@RequestBody DutyRecordItemGoodsGetDto dto) {
+        orderDutyService.doGoods(getTenantId(),dto.getOrderNo(),dto.getDeviceNo(),getUsername());
+        return success(true);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsDo:update")
+    @ResponseBody
+    @RequestMapping("/doFinish.json")
+    public ResponseObj<Boolean> doFinish(@RequestBody DutyRecordItemGoodsGetDto dto) {
+        orderDutyService.doFinish(getTenantId(),dto.getOrderNo(),getUsername());
+        return success(true);
+    }
+}

+ 88 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyOrderGoodsGetController.java

@@ -0,0 +1,88 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.DutyRecordItem;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.enums.ItemOrderDetailType;
+import com.mrxu.sales.enums.ItemOrderStatus;
+import com.mrxu.sales.enums.ItemOrderType;
+import com.mrxu.sales.query.DutyRecordItemDto;
+import com.mrxu.sales.query.DutyRecordItemGoodsGetDto;
+import com.mrxu.sales.query.ItemOrderDto;
+import com.mrxu.sales.service.DutyRecordItemService;
+import com.mrxu.sales.service.ItemOrderDutyService;
+import com.mrxu.sales.service.ItemOrderService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Api(tags = "药房取药")
+@Controller
+@RequestMapping("/sales/dutyOrderGoodsGet")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyOrderGoodsGetController extends AdminBaseController {
+
+    private final ItemOrderService itemOrderService;
+
+    private final ItemOrderDutyService orderDutyService;
+
+    private final MemberPayWayService payWayService;
+
+    private final DutyRecordItemService recordItemService;
+
+    @RequiresPermissions("sales:dutyOrderGoodsGet:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("defaultDate", DateFunc.getToday());
+        model.addAttribute("defaultStatus", ItemOrderStatus.waitGet.getStatus());
+        model.addAttribute("orderStatusList", ItemOrderStatus.values());
+        model.addAttribute("payWayList",payWayService.list(getTenantId()));
+        return "sales/dutyOrderGoodsGet.html";
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsGet:read")
+    @ResponseBody
+    @RequestMapping("/orderPage.json")
+    public LayuiPage<ItemOrder> orderPage(ItemOrderDto queryDto) {
+        queryDto.setType(ItemOrderType.HIS.getType());
+        PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsGet:read")
+    @ResponseBody
+    @RequestMapping("/recordItemPage.json")
+    public LayuiPage<DutyRecordItem> recordItemPage(DutyRecordItemDto queryDto) {
+        queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+        List<Integer> typeList = new ArrayList<>();
+        typeList.add(ItemOrderDetailType.goods.getType());
+        typeList.add(ItemOrderDetailType.pack.getType());
+        queryDto.setTypes(typeList);
+        PageResult<DutyRecordItem> rs = recordItemService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsGet:update")
+    @ResponseBody
+    @RequestMapping("/getGoods.json")
+    public ResponseObj<Boolean> getGoods(@RequestBody DutyRecordItemGoodsGetDto dto) {
+        orderDutyService.getGoods(getTenantId(),dto,getUsername());
+        return success(true);
+    }
+
+}

+ 88 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyOrderGoodsPostController.java

@@ -0,0 +1,88 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.DutyRecordItem;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.enums.ItemOrderDetailType;
+import com.mrxu.sales.enums.ItemOrderStatus;
+import com.mrxu.sales.enums.ItemOrderType;
+import com.mrxu.sales.query.DutyRecordItemDto;
+import com.mrxu.sales.query.DutyRecordItemGoodsGetDto;
+import com.mrxu.sales.query.ItemOrderDto;
+import com.mrxu.sales.service.DutyRecordItemService;
+import com.mrxu.sales.service.ItemOrderDutyService;
+import com.mrxu.sales.service.ItemOrderService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Api(tags = "配送药品")
+@Controller
+@RequestMapping("/sales/dutyOrderGoodsPost")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyOrderGoodsPostController extends AdminBaseController {
+
+    private final ItemOrderService itemOrderService;
+
+    private final ItemOrderDutyService orderDutyService;
+
+    private final MemberPayWayService payWayService;
+
+    private final DutyRecordItemService recordItemService;
+
+    @RequiresPermissions("sales:dutyOrderGoodsPost:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("defaultDate", DateFunc.getToday());
+        model.addAttribute("defaultStatus", ItemOrderStatus.waitPost.getStatus());
+        model.addAttribute("orderStatusList", ItemOrderStatus.values());
+        model.addAttribute("payWayList",payWayService.list(getTenantId()));
+        return "sales/dutyOrderGoodsPost.html";
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsPost:read")
+    @ResponseBody
+    @RequestMapping("/orderPage.json")
+    public LayuiPage<ItemOrder> orderPage(ItemOrderDto queryDto) {
+        queryDto.setType(ItemOrderType.HIS.getType());
+        PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsPost:read")
+    @ResponseBody
+    @RequestMapping("/recordItemPage.json")
+    public LayuiPage<DutyRecordItem> recordItemPage(DutyRecordItemDto queryDto) {
+        queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+        List<Integer> typeList = new ArrayList<>();
+        typeList.add(ItemOrderDetailType.goods.getType());
+        typeList.add(ItemOrderDetailType.pack.getType());
+        queryDto.setTypes(typeList);
+        PageResult<DutyRecordItem> rs = recordItemService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsPost:update")
+    @ResponseBody
+    @RequestMapping("/postGoods.json")
+    public ResponseObj<Boolean> postGoods(@RequestBody DutyRecordItemGoodsGetDto dto) {
+        orderDutyService.getGoods(getTenantId(),dto,getUsername());
+        return success(true);
+    }
+
+}

+ 87 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyOrderGoodsReviewController.java

@@ -0,0 +1,87 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.DutyRecordItem;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.enums.ItemOrderDetailType;
+import com.mrxu.sales.enums.ItemOrderStatus;
+import com.mrxu.sales.enums.ItemOrderType;
+import com.mrxu.sales.query.DutyRecordItemDto;
+import com.mrxu.sales.query.DutyRecordItemGoodsGetDto;
+import com.mrxu.sales.query.ItemOrderDto;
+import com.mrxu.sales.service.DutyRecordItemService;
+import com.mrxu.sales.service.ItemOrderDutyService;
+import com.mrxu.sales.service.ItemOrderService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Api(tags = "待审核订单")
+@Controller
+@RequestMapping("/sales/dutyOrderGoodsReview")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyOrderGoodsReviewController extends AdminBaseController {
+
+    private final ItemOrderService itemOrderService;
+
+    private final ItemOrderDutyService orderDutyService;
+
+    private final MemberPayWayService payWayService;
+
+    private final DutyRecordItemService recordItemService;
+
+    @RequiresPermissions("sales:dutyOrderGoodsReview:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("defaultDate", DateFunc.getToday());
+        model.addAttribute("defaultStatus", ItemOrderStatus.waitReview.getStatus());
+        model.addAttribute("orderStatusList", ItemOrderStatus.values());
+        model.addAttribute("payWayList",payWayService.list(getTenantId()));
+        return "sales/dutyOrderGoodsReview.html";
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsReview:read")
+    @ResponseBody
+    @RequestMapping("/orderPage.json")
+    public LayuiPage<ItemOrder> orderPage(ItemOrderDto queryDto) {
+        queryDto.setType(ItemOrderType.HIS.getType());
+        PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsReview:read")
+    @ResponseBody
+    @RequestMapping("/recordItemPage.json")
+    public LayuiPage<DutyRecordItem> recordItemPage(DutyRecordItemDto queryDto) {
+        queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+        List<Integer> typeList = new ArrayList<>();
+        typeList.add(ItemOrderDetailType.goods.getType());
+        typeList.add(ItemOrderDetailType.pack.getType());
+        queryDto.setTypes(typeList);
+        PageResult<DutyRecordItem> rs = recordItemService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyOrderGoodsReview:update")
+    @ResponseBody
+    @RequestMapping("/doReviewPass.json")
+    public ResponseObj<Boolean> doReviewPass(@RequestBody DutyRecordItemGoodsGetDto dto) {
+        orderDutyService.doReviewPass(getTenantId(),dto.getOrderNo(),getUsername());
+        return success(true);
+    }
+}

+ 129 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyProjectController.java

@@ -0,0 +1,129 @@
+package com.mrxu.admin.controller.sales;
+
+import com.alibaba.fastjson.JSON;
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.base.service.SysUserService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.DutyProject;
+import com.mrxu.sales.entity.DutyProjectClass;
+import com.mrxu.sales.query.DutyProjectClassDto;
+import com.mrxu.sales.query.DutyProjectDto;
+import com.mrxu.sales.service.DutyProjectClassService;
+import com.mrxu.sales.service.DutyProjectItemService;
+import com.mrxu.sales.service.DutyProjectService;
+import com.mrxu.sales.service.DutyRuleService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "预约项目管理")
+@Controller
+@RequestMapping("/sales/dutyProject")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyProjectController extends AdminBaseController {
+
+	private final DutyProjectClassService classService;
+
+	private final DutyProjectService dutyProjectApi;
+
+	private final DutyRuleService dutyRuleService;
+
+	private final SysUserService userService;
+
+	private final DutyProjectItemService projectItemService;
+	
+	@RequiresPermissions("sales:dutyProject:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("ruleList",dutyRuleService.list(getTenantId()));
+		model.addAttribute("userList",userService.listAll(getTenantId()));
+		model.addAttribute("projectItemList", JSON.toJSONString(projectItemService.list(getTenantId())));
+		return "sales/dutyProject.html";
+	}
+
+	@RequiresPermissions("sales:dutyProject:read")
+	@ResponseBody
+	@RequestMapping("/classPage.json")
+	public LayuiPage<DutyProjectClass> classPage(DutyProjectClassDto queryDto) {
+		PageResult<DutyProjectClass> rs = classService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyProject:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<DutyProject> page(DutyProjectDto queryDto) {
+		PageResult<DutyProject> rs = dutyProjectApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyProject:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<DutyProject> getById(Integer id) {
+		return success(dutyProjectApi.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:dutyProject:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody DutyProject bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		if(bean.getAutoGenerate() == null) {
+			bean.setAutoGenerate(MrxuConst.disable);
+		}
+		if(bean.getVisible() == null) {
+			bean.setVisible(MrxuConst.disable);
+		}
+		if(bean.getHomeService() == null) {
+			bean.setHomeService(MrxuConst.disable);
+		}
+		return success(dutyProjectApi.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyProject:update")
+	@ResponseBody
+	@RequestMapping("/classSave.json")
+	public ResponseObj<Boolean> classSave(@Valid @RequestBody DutyProjectClass bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}
+		return success(classService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyProject:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(dutyProjectApi.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:dutyProject:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+		return success(dutyProjectApi.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("sales:dutyProject:remove")
+	@ResponseBody
+	@RequestMapping("/classRemove.json")
+	public ResponseObj<Boolean> classRemove(Integer id) {
+		return success(classService.remove(getTenantId(),id));
+	}
+
+}

+ 88 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyProjectItemController.java

@@ -0,0 +1,88 @@
+package com.mrxu.admin.controller.sales;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import com.mrxu.framework.common.MrxuConst;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.sales.service.DutyProjectItemService;
+import com.mrxu.sales.entity.DutyProjectItem;
+import com.mrxu.sales.query.DutyProjectItemDto;
+
+@Api(tags = "预约项管理")
+@Controller
+@RequestMapping("/sales/dutyProjectItem")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyProjectItemController extends AdminBaseController {
+
+	private final DutyProjectItemService dutyProjectItemService;
+	
+	@RequiresPermissions("sales:dutyProjectItem:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "sales/dutyProjectItem.html";
+	}
+	
+	@RequiresPermissions("sales:dutyProjectItem:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<DutyProjectItem> page(DutyProjectItemDto queryDto) {
+		PageResult<DutyProjectItem> rs = dutyProjectItemService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyProjectItem:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<DutyProjectItem> getById(Integer id) {
+		return success(dutyProjectItemService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:dutyProjectItem:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody DutyProjectItem bean) {
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}*/
+		return success(dutyProjectItemService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyProjectItem:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		DutyProjectItem bean = new DutyProjectItem();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(dutyProjectItemService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyProjectItem:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(dutyProjectItemService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:dutyProjectItem:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(dutyProjectItemService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 96 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyRecordAddController.java

@@ -0,0 +1,96 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.DutyData;
+import com.mrxu.sales.entity.DutyProject;
+import com.mrxu.sales.entity.DutyRecord;
+import com.mrxu.sales.entity.HisPatient;
+import com.mrxu.sales.enums.ItemOrderSource;
+import com.mrxu.sales.query.DutyProjectDto;
+import com.mrxu.sales.query.DutyProjectOrderDto;
+import com.mrxu.sales.service.*;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "预约挂号")
+@Controller
+@RequestMapping("/sales/dutyRecordAdd")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyRecordAddController extends AdminBaseController {
+
+	private final DutyProjectClassService dutyProjectClassService;
+
+	private final DutyProjectService dutyProjectService;
+
+	private final DutyDataService dutyDataService;
+
+	private final MemberPayWayService payWayService;
+
+	private final DutyHisService dutyHisService;
+
+	private final HisPatientService patientService;
+	
+	@RequiresPermissions("sales:dutyRecordAdd:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("projectClassList",dutyProjectClassService.list(getTenantId()));
+		model.addAttribute("payWayList",payWayService.list(getTenantId()));
+		return "sales/dutyRecordAdd.html";
+	}
+
+	@RequiresPermissions("sales:dutyRecordAdd:read")
+	@ResponseBody
+	@RequestMapping("/projectList.json")
+	public ResponseObj<List<DutyProject>> projectList() {
+		DutyProjectDto dto = new DutyProjectDto();
+		dto.setSize(MrxuConst.MAX_PAGE_SIZE);
+		dto.setStatus(MrxuConst.enable);
+		PageResult<DutyProject> rs = dutyProjectService.page(getTenantId(),dto);
+		return success(rs.getData());
+	}
+
+	@RequiresPermissions("sales:dutyRecordAdd:read")
+	@ResponseBody
+	@RequestMapping("/dataList.json")
+	public ResponseObj<List<DutyData>> dataList() {
+		return success(dutyDataService.list(getTenantId()));
+	}
+
+	@RequiresPermissions("sales:dutyRecordAdd:read")
+	@ResponseBody
+	@RequestMapping("/searchExistPatient.json")
+	public ResponseObj<List<HisPatient>> searchExistPatient(String mobile,String idCard) {
+		return success(patientService.searchPatient(getTenantId(),mobile,idCard));
+	}
+
+	@RequiresPermissions("sales:dutyRecordAdd:read")
+	@ResponseBody
+	@RequestMapping("/getHisPatient.json")
+	public ResponseObj<List<HisPatient>> getHisPatient(String idCard) {
+		return success(patientService.getByIdCard(getTenantId(),idCard,null));
+	}
+
+	@RequiresPermissions("sales:dutyRecordAdd:update")
+	@ResponseBody
+	@RequestMapping("/hisOrder.json")
+	public ResponseObj<DutyRecord> hisOrder(@Valid @RequestBody DutyProjectOrderDto dto) {
+		dto.setSource(ItemOrderSource.portal);
+		return success(dutyHisService.createAndPayRecord(getTenantId(),dto,getUsername()));
+	}
+
+
+}

+ 69 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyRecordController.java

@@ -0,0 +1,69 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.DutyRecord;
+import com.mrxu.sales.entity.DutyRecordItem;
+import com.mrxu.sales.enums.DutyRecordStatus;
+import com.mrxu.sales.query.DutyRecordDto;
+import com.mrxu.sales.query.DutyRecordItemDto;
+import com.mrxu.sales.service.DutyProjectService;
+import com.mrxu.sales.service.DutyRecordItemService;
+import com.mrxu.sales.service.DutyRecordService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Api(tags = "预约记录管理")
+@Controller
+@RequestMapping("/sales/dutyRecord")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyRecordController extends AdminBaseController {
+
+	private final DutyProjectService projectService;
+
+	private final DutyRecordService dutyRecordApi;
+
+	private final DutyRecordItemService recordItemService;
+	
+	@RequiresPermissions("sales:dutyRecord:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("defaultDate", DateFunc.getToday());
+		model.addAttribute("projectList",projectService.list(getTenantId()));
+		model.addAttribute("statusList", DutyRecordStatus.values());
+		return "sales/dutyRecord.html";
+	}
+	
+	@RequiresPermissions("sales:dutyRecord:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<DutyRecord> page(DutyRecordDto queryDto) {
+		PageResult<DutyRecord> rs = dutyRecordApi.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyRecord:read")
+	@ResponseBody
+	@RequestMapping("/recordItemPage.json")
+	public LayuiPage<DutyRecordItem> recordItemPage(DutyRecordItemDto queryDto) {
+		PageResult<DutyRecordItem> rs = recordItemService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyRecord:update")
+	@ResponseBody
+	@RequestMapping("/back.json")
+	public ResponseObj<Boolean> back(Integer id) {
+		return success(dutyRecordApi.back(getTenantId(),id,getUsername()));
+	}
+
+}

+ 72 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyRecordProjectController.java

@@ -0,0 +1,72 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.crm.service.MemberPayWayService;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.DutyRecordItem;
+import com.mrxu.sales.enums.DutyRecordItemStatus;
+import com.mrxu.sales.enums.DutyRecordStatus;
+import com.mrxu.sales.enums.ItemOrderDetailType;
+import com.mrxu.sales.query.DutyRecordItemDto;
+import com.mrxu.sales.service.DutyProjectService;
+import com.mrxu.sales.service.DutyRecordItemService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+
+@Api(tags = "检查项目")
+@Controller
+@RequestMapping("/sales/dutyRecordProject")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyRecordProjectController extends AdminBaseController {
+
+    private final DutyRecordItemService recordItemService;
+
+    private final MemberPayWayService payWayService;
+
+    private final DutyProjectService projectService;
+
+    @RequiresPermissions("sales:dutyRecordProject:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("defaultDate", DateFunc.getToday());
+        model.addAttribute("recordStatusList", DutyRecordStatus.values());
+        model.addAttribute("payWayList",payWayService.list(getTenantId()));
+        model.addAttribute("projectList", projectService.list(getTenantId()));
+
+        model.addAttribute("recordItemStatusList", DutyRecordItemStatus.values());
+        return "sales/dutyRecordProject.html";
+    }
+
+    @RequiresPermissions("sales:dutyRecordProject:read")
+    @ResponseBody
+    @RequestMapping("/recordItemPage.json")
+    public LayuiPage<DutyRecordItem> recordItemPage(DutyRecordItemDto queryDto) {
+        queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+        queryDto.setType(ItemOrderDetailType.project.getType());
+        PageResult<DutyRecordItem> rs = recordItemService.pageMore(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyRecordProject:update")
+    @ResponseBody
+    @RequestMapping("/save.json")
+    public ResponseObj<Object> save(@Valid @RequestBody DutyRecordItem bean) {
+        recordItemService.doProject(getTenantId(),bean,getUsername());
+        return success();
+    }
+
+
+}

+ 107 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyRuleItemController.java

@@ -0,0 +1,107 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.DutyRule;
+import com.mrxu.sales.entity.DutyRuleItem;
+import com.mrxu.sales.query.DutyRuleDto;
+import com.mrxu.sales.query.DutyRuleItemDto;
+import com.mrxu.sales.service.DutyRuleItemService;
+import com.mrxu.sales.service.DutyRuleService;
+import com.mrxu.sales.service.DutyTimeService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "规则项管理")
+@Controller
+@RequestMapping("/sales/dutyRuleItem")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyRuleItemController extends AdminBaseController {
+
+	private final DutyRuleService dutyRuleService;
+
+	private final DutyRuleItemService dutyRuleItemService;
+
+	private final DutyTimeService timeService;
+	
+	@RequiresPermissions("sales:dutyRuleItem:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("timeList",timeService.list(getTenantId()));
+		return "sales/dutyRuleItem.html";
+	}
+	
+	@RequiresPermissions("sales:dutyRuleItem:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<DutyRuleItem> page(DutyRuleItemDto queryDto) {
+		PageResult<DutyRuleItem> rs = dutyRuleItemService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyRuleItem:read")
+	@ResponseBody
+	@RequestMapping("/classPage.json")
+	public LayuiPage<DutyRule> classPage(DutyRuleDto queryDto) {
+		PageResult<DutyRule> rs = dutyRuleService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyRuleItem:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody DutyRuleItem bean) {
+		if(bean.getCanApply() == null) {
+			bean.setCanApply(MrxuConst.disable);
+		}
+		bean.setName(bean.getTypeCaption());
+		return success(dutyRuleItemService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyRuleItem:update")
+	@ResponseBody
+	@RequestMapping("/classSave.json")
+	public ResponseObj<Boolean> classSave(@Valid @RequestBody DutyRule bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		return success(dutyRuleService.saveOrUpdateOnlyRule(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyRuleItem:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(dutyRuleItemService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:dutyRuleItem:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+		return success(dutyRuleItemService.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("sales:dutyRuleItem:remove")
+	@ResponseBody
+	@RequestMapping("/classRemove.json")
+	public ResponseObj<Boolean> classRemove(Integer id) {
+		return success(dutyRuleService.remove(getTenantId(),id));
+	}
+
+
+
+}

+ 109 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyTimeItemController.java

@@ -0,0 +1,109 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.DutyTime;
+import com.mrxu.sales.entity.DutyTimeItem;
+import com.mrxu.sales.query.DutyTimeDto;
+import com.mrxu.sales.query.DutyTimeItemDto;
+import com.mrxu.sales.service.DutyTimeItemService;
+import com.mrxu.sales.service.DutyTimeService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "时间段项管理")
+@Controller
+@RequestMapping("/sales/dutyTimeItem")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyTimeItemController extends AdminBaseController {
+
+	private final DutyTimeService dutyTimeService;
+
+	private final DutyTimeItemService dutyTimeItemService;
+	
+	@RequiresPermissions("sales:dutyTimeItem:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "sales/dutyTimeItem.html";
+	}
+
+	@RequiresPermissions("sales:dutyTimeItem:read")
+	@ResponseBody
+	@RequestMapping("/classPage.json")
+	public LayuiPage<DutyTime> classPage(DutyTimeDto queryDto) {
+		PageResult<DutyTime> rs = dutyTimeService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyTimeItem:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<DutyTimeItem> page(DutyTimeItemDto queryDto) {
+		PageResult<DutyTimeItem> rs = dutyTimeItemService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:dutyTimeItem:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<DutyTimeItem> getById(Integer id) {
+		return success(dutyTimeItemService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:dutyTimeItem:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody DutyTimeItem bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		return success(dutyTimeItemService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyTimeItem:update")
+	@ResponseBody
+	@RequestMapping("/classSave.json")
+	public ResponseObj<Boolean> classSave(@Valid @RequestBody DutyTime bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		return success(dutyTimeService.saveOrUpdateOnlyTime(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:dutyTimeItem:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(dutyTimeItemService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:dutyTimeItem:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+		return success(dutyTimeItemService.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("sales:dutyTimeItem:remove")
+	@ResponseBody
+	@RequestMapping("/classRemove.json")
+	public ResponseObj<Boolean> classRemove(Integer id) {
+		return success(dutyTimeService.remove(getTenantId(),id));
+	}
+
+
+
+}

+ 203 - 0
src/main/java/com/mrxu/admin/controller/sales/DutyWorkController.java

@@ -0,0 +1,203 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.admin.shiro.ShiroProperties;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.DateFunc;
+import com.mrxu.sales.entity.*;
+import com.mrxu.sales.enums.ItemOrderDetailType;
+import com.mrxu.sales.model.GoodsVo;
+import com.mrxu.sales.query.DutyRecordDto;
+import com.mrxu.sales.query.DutyRecordItemAddDto;
+import com.mrxu.sales.query.DutyRecordItemDto;
+import com.mrxu.sales.service.*;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "预约挂号")
+@Controller
+@RequestMapping("/sales/dutyWork")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class DutyWorkController extends AdminBaseController {
+
+    private final DutyRecordService recordService;
+
+    private final DutyRecordItemService itemService;
+
+    private final HisProjectClassService hisProjectClassService;
+
+    private final HisProjectService hisProjectService;
+
+    private final DutyRecordItemService recordItemService;
+
+    private final GoodsClassService goodsClassService;
+
+    private final GoodsService goodsService;
+
+    private final ShiroProperties shiroProperties;
+
+    private final GoodsPackageService packageService;
+
+    private final GoodsPackageDetailService packageDetailService;
+
+    private final GoodsPackageService goodsPackageService;
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @RequestMapping("index.html")
+    public String index(Model model) {
+        model.addAttribute("hisProjectClassList",hisProjectClassService.list(getTenantId()));
+        return "sales/dutyWork.html";
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/recordPage.json")
+    public LayuiPage<DutyRecord> recordPage(DutyRecordDto queryDto) {
+        PageResult<DutyRecord> rs = recordService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    /**
+     * 获取当前登人的病人挂号记录
+     * @return
+     */
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/getMyDutyRecord.json")
+    public ResponseObj<List<DutyRecord>> getMyDutyRecord() {
+        String userName = getUsername();
+        // 超级管理查询所有的
+        if(shiroProperties.getSuperAdmin().equals(userName)) {
+            userName = null;
+        }
+        List<DutyRecord> list = recordService.getMyDutyRecord(getTenantId(), DateFunc.getToday(),userName);
+        return success(list);
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/workRecord.json")
+    public ResponseObj<Boolean> workRecord(Integer id) {
+        return success(recordService.workRecord(getTenantId(),id,getUsername()));
+    }
+
+    // 医生叫号
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/noticeNext.json")
+    public ResponseObj<Object> noticeNext(Integer id) {
+        recordService.noticeNext(getTenantId(),id);
+        return success();
+    }
+
+    // 打印小票
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/printAgain.json")
+    public ResponseObj<Object> printAgain(Integer id) {
+        recordItemService.printAgain(getTenantId(),id,getUsername());
+        return success();
+    }
+
+    // 保存诊断结果
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/addNotes.json")
+    public ResponseObj<Boolean> addNotes(Integer id,String caption,String notes) {
+        return success(recordService.addNotes(getTenantId(),id,caption,notes,getUsername()));
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/addRecordItem.json")
+    public ResponseObj<Boolean> addRecordItem(@Valid @RequestBody DutyRecordItemAddDto bean) {
+        if(bean.getVisible() == null) {
+            bean.setVisible(MrxuConst.disable);
+        }
+        return success(itemService.addRecordItem(getTenantId(),bean,getUsername()));
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/addMyPackageGoods.json")
+    public ResponseObj<Object> addMyPackageGoods(@Valid @RequestBody DutyRecordItemAddDto bean) {
+        goodsPackageService.addMyPackageGoods(getTenantId(),bean,getUsername());
+        return success();
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/removeMyPackageGoods.json")
+    public ResponseObj<Object> removeMyPackageGoods(Integer packageId) {
+        goodsPackageService.removeMyPackage(getTenantId(),packageId,getUsername());
+        return success();
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/hisProjectList.json")
+    public ResponseObj<List<HisProject>> hisProjectList() {
+        return success(hisProjectService.list(getTenantId()));
+    }
+
+    // 处方药模板
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/packageList.json")
+    public ResponseObj<List<GoodsPackage>> packageList() {
+        return success(packageService.list(getTenantId(),getUsername()));
+    }
+
+    // 处方药模板明细
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/packageDetailList.json")
+    public ResponseObj<List<GoodsPackageDetail>> packageDetailList(Integer packageId) {
+        return success(packageDetailService.list(getTenantId(),packageId));
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/recordItemPage.json")
+    public LayuiPage<DutyRecordItem> recordItemPage(DutyRecordItemDto queryDto) {
+        PageResult<DutyRecordItem> rs = recordItemService.page(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/memberPackagePage.json")
+    public LayuiPage<DutyRecordItem> memberPackagePage(DutyRecordItemDto queryDto) {
+        queryDto.setType(ItemOrderDetailType.pack.getType());
+        PageResult<DutyRecordItem> rs = recordItemService.pageMore(getTenantId(),queryDto);
+        return renderLayuiPage(rs);
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/goodsClassList.json")
+    public ResponseObj<List<GoodsClass>> goodsClassList() {
+        return success(goodsClassService.list(getTenantId(),MrxuConst.enable));
+    }
+
+    @RequiresPermissions("sales:dutyWork:read")
+    @ResponseBody
+    @RequestMapping("/goodsList.json")
+    public ResponseObj<List<GoodsVo>> goodsList() {
+        return success(goodsService.fastList(getTenantId(),null));
+    }
+
+}

+ 194 - 0
src/main/java/com/mrxu/admin/controller/sales/GoodsController.java

@@ -0,0 +1,194 @@
+package com.mrxu.admin.controller.sales;
+
+import com.alibaba.fastjson.JSON;
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.sales.entity.Goods;
+import com.mrxu.sales.entity.GoodsClass;
+import com.mrxu.sales.entity.HisDrug;
+import com.mrxu.sales.entity.Supplier;
+import com.mrxu.sales.export.GoodsExport;
+import com.mrxu.sales.query.GoodsDto;
+import com.mrxu.sales.service.GoodsClassService;
+import com.mrxu.sales.service.GoodsService;
+import com.mrxu.sales.service.HisDrugService;
+import com.mrxu.sales.service.SupplierService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Api(tags = "商品管理")
+@Controller
+@RequestMapping("/sales/goods")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class GoodsController extends AdminBaseController {
+
+	private final GoodsClassService classService;
+
+	private final SupplierService supplierService;
+
+	private final GoodsService goodsService;
+
+	private final HisDrugService hisDrugService;
+	
+	@RequiresPermissions("sales:goods:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		List<Supplier> supplierList = supplierService.list(getTenantId());
+		model.addAttribute("supplierJson", JSON.toJSONString(supplierList));
+		model.addAttribute("supplierList",supplierList);
+		return "sales/goods.html";
+	}
+	
+	@RequiresPermissions("sales:goods:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<Goods> page(GoodsDto queryDto) {
+		PageResult<Goods> rs = goodsService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:goods:read")
+	@ResponseBody
+	@RequestMapping("/export.json")
+	public void export(HttpServletResponse response, GoodsDto queryDto) {
+		queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+		export(response,"药品", GoodsExport.class,goodsService.export(getTenantId(),queryDto));
+	}
+
+	@RequiresPermissions("sales:goods:read")
+	@ResponseBody
+	@RequestMapping("/classList.json")
+	public ResponseObj<List<GoodsClass>> classList() {
+		return success(classService.list(getTenantId(),null));
+	}
+
+	@RequiresPermissions("sales:goods:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<Goods> getById(Integer id) {
+		return success(goodsService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:goods:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody Goods bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		if(bean.getSellOut() == null) {
+			bean.setSellOut(MrxuConst.disable);
+		}
+		return success(goodsService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:goods:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		Goods bean = new Goods();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(goodsService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:goods:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(goodsService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:goods:update")
+	@ResponseBody
+	@RequestMapping("/classSave.json")
+	public ResponseObj<Boolean> classSave(@Valid @RequestBody GoodsClass bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		MrxuAssert.isFalse(bean.getParentId().equals(bean.getId()),"父节点不能是自己");
+		GoodsClass exist = classService.getByKey(getTenantId(),"name",bean.getName());
+		MrxuAssert.isTrue(exist == null || exist.getId().equals(bean.getId()),
+				"【"+bean.getName()+"】已存在");
+		return success(classService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:goods:remove")
+	@ResponseBody
+	@RequestMapping("/removeClass.json")
+	public ResponseObj<Boolean> removeClass(Integer id) {
+		return success(classService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:goods:update")
+	@ResponseBody
+	@RequestMapping("/downloadTemplate.json")
+	public void downloadTemplate(HttpServletResponse response) {
+		downloadFile(response,"药品导入模版.xlsx");
+	}
+
+	@RequiresPermissions("sales:goods:update")
+	@ResponseBody
+	@RequestMapping("/importGoods.json")
+	public ResponseObj<Object> importGoods(@RequestParam("file") MultipartFile file) {
+		goodsService.importGoods(getTenantId(),file,getUsername());
+		return success();
+	}
+
+	@RequiresPermissions("sales:goods:update")
+	@ResponseBody
+	@RequestMapping("/getSystemDrug.json")
+	public ResponseObj<HisDrug> getSystemDrug(String barcode) {
+		return success(hisDrugService.getByBarcode(barcode));
+	}
+
+	@RequiresPermissions("sales:goods:update")
+	@ResponseBody
+	@RequestMapping("/batchSet.json")
+	public ResponseObj<Object> batchSet(BigDecimal minStock,BigDecimal maxStock) {
+		goodsService.batchSet(getTenantId(),minStock,maxStock);
+		return success();
+	}
+
+	@RequiresPermissions("sales:goods:update")
+	@ResponseBody
+	@RequestMapping("/stocktaking.json")
+	public ResponseObj<Object> stocktaking(Integer id,BigDecimal newStock) {
+		goodsService.stocktaking(getTenantId(),id,newStock,getUsername());
+		return success();
+	}
+
+
+
+
+	@RequiresPermissions("sales:goods:remove")
+	@ResponseBody
+	@RequestMapping("/updateSupperName.json")
+	public ResponseObj<Object> temp() {
+		List<Goods> list = goodsService.list();
+		for(Goods goods : list) {
+			goods.setSupplierName(supplierService.getNamesByIds(goods.getTenantId(),goods.getSupplierId()));
+			goodsService.updateById(goods);
+		}
+		return success();
+	}
+
+}

+ 75 - 0
src/main/java/com/mrxu/admin/controller/sales/GoodsFlowController.java

@@ -0,0 +1,75 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.GoodsFlow;
+import com.mrxu.sales.enums.GoodsFlowType;
+import com.mrxu.sales.query.GoodsFlowDto;
+import com.mrxu.sales.service.GoodsFlowService;
+import com.mrxu.sales.service.GoodsService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Api(tags = "商品库存流水管理")
+@Controller
+@RequestMapping("/sales/goodsFlow")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class GoodsFlowController extends AdminBaseController {
+
+	private final GoodsService goodsService;
+
+	private final GoodsFlowService goodsFlowService;
+	
+	@RequiresPermissions("sales:goodsFlow:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("goodsList",goodsService.fastList(getTenantId(),null));
+		model.addAttribute("typeList", GoodsFlowType.values());
+		return "sales/goodsFlow.html";
+	}
+	
+	@RequiresPermissions("sales:goodsFlow:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<GoodsFlow> page(GoodsFlowDto queryDto) {
+		PageResult<GoodsFlow> rs = goodsFlowService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:goodsFlow:read")
+	@ResponseBody
+	@RequestMapping("/export.json")
+	public void export(HttpServletResponse response, GoodsFlowDto queryDto) {
+		queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+		PageResult<GoodsFlow> rs = goodsFlowService.page(getTenantId(),queryDto);
+		export(response,"库存流水", GoodsFlow.class,rs.getData());
+	}
+
+	@RequiresPermissions("sales:goodsFlow:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<GoodsFlow> getById(Integer id) {
+		return success(goodsFlowService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:goodsFlow:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody GoodsFlow bean) {
+		return success(goodsFlowService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+}

+ 138 - 0
src/main/java/com/mrxu/admin/controller/sales/GoodsPackageController.java

@@ -0,0 +1,138 @@
+package com.mrxu.admin.controller.sales;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.pinyin.PinyinUtil;
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.GoodsPackage;
+import com.mrxu.sales.entity.GoodsPackageDetail;
+import com.mrxu.sales.export.GoodsPackageExport;
+import com.mrxu.sales.query.GoodsPackageDetailDto;
+import com.mrxu.sales.query.GoodsPackageDto;
+import com.mrxu.sales.service.GoodsPackageDetailService;
+import com.mrxu.sales.service.GoodsPackageService;
+import com.mrxu.sales.service.GoodsService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "套餐管理管理")
+@Controller
+@RequestMapping("/sales/goodsPackage")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class GoodsPackageController extends AdminBaseController {
+
+	private final GoodsService goodsService;
+
+	private final GoodsPackageService packageService;
+
+	private final GoodsPackageDetailService packageDetailService;
+	
+	@RequiresPermissions("sales:goodsPackage:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("goodsList",goodsService.fastList(getTenantId(),null));
+		return "sales/goodsPackage.html";
+	}
+	
+	@RequiresPermissions("sales:goodsPackage:read")
+	@ResponseBody
+	@RequestMapping("/packagePage.json")
+	public LayuiPage<GoodsPackage> packagePage(GoodsPackageDto queryDto) {
+		PageResult<GoodsPackage> rs = packageService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:goodsPackage:update")
+	@ResponseBody
+	@RequestMapping("/packageSave.json")
+	public ResponseObj<Boolean> packageSave(@Valid @RequestBody GoodsPackage bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		if(StrUtil.isNotBlank(bean.getName())) {
+			bean.setPinYin(PinyinUtil.getPinyin(bean.getName()));
+		}
+		if(bean.getId() == null) {
+			bean.setOwner(MrxuConst.defaultSystem);
+		}
+		return success(packageService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:goodsPackage:remove")
+	@ResponseBody
+	@RequestMapping("/packageRemove.json")
+	public ResponseObj<Object> packageRemove(Integer id) {
+		packageService.removeById(getTenantId(),id);
+		return success();
+	}
+
+	@RequiresPermissions("sales:goodsPackage:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<GoodsPackageDetail> page(GoodsPackageDetailDto queryDto) {
+		PageResult<GoodsPackageDetail> rs = packageDetailService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:goodsPackage:read")
+	@ResponseBody
+	@RequestMapping("/export.json")
+	public void export(HttpServletResponse response, GoodsPackageDetailDto queryDto) {
+		queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+		export(response,"处方药", GoodsPackageExport.class,packageDetailService.export(getTenantId(),queryDto));
+	}
+
+	@RequiresPermissions("sales:goodsPackage:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody GoodsPackageDetail bean) {
+		return success(packageDetailService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:goodsPackage:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(packageDetailService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:goodsPackage:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) {
+		return success(packageDetailService.removeBatch(getTenantId(),ids));
+	}
+
+	@RequiresPermissions("sales:goodsPackage:update")
+	@ResponseBody
+	@RequestMapping("/downloadTemplate.json")
+	public void downloadTemplate(HttpServletResponse response) {
+		downloadFile(response,"处方药导入模版.xlsx");
+	}
+
+	@RequiresPermissions("sales:goodsPackage:update")
+	@ResponseBody
+	@RequestMapping("/importData.json")
+	public ResponseObj<Object> importData(@RequestParam("file") MultipartFile file) {
+		packageDetailService.importData(getTenantId(),file,getUsername());
+		return success();
+	}
+
+
+}

+ 58 - 0
src/main/java/com/mrxu/admin/controller/sales/GoodsStockWarnController.java

@@ -0,0 +1,58 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.Goods;
+import com.mrxu.sales.export.GoodsExport;
+import com.mrxu.sales.query.GoodsDto;
+import com.mrxu.sales.service.GoodsClassService;
+import com.mrxu.sales.service.GoodsService;
+import com.mrxu.sales.service.SupplierService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+
+@Api(tags = "商品库存预警")
+@Controller
+@RequestMapping("/sales/goodsStockWarn")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class GoodsStockWarnController extends AdminBaseController {
+
+	private final SupplierService supplierService;
+
+	private final GoodsService goodsService;
+	
+	@RequiresPermissions("sales:goodsStockWarn:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("supplierList",supplierService.list(getTenantId()));
+		return "sales/goodsStockWarn.html";
+	}
+	
+	@RequiresPermissions("sales:goodsStockWarn:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<Goods> page(GoodsDto queryDto) {
+		queryDto.setWarning(true);
+		PageResult<Goods> rs = goodsService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:goodsStockWarn:read")
+	@ResponseBody
+	@RequestMapping("/export.json")
+	public void export(HttpServletResponse response, GoodsDto queryDto) {
+		queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+		export(response,"库存预警药品", GoodsExport.class,goodsService.export(getTenantId(),queryDto));
+	}
+
+}

+ 75 - 0
src/main/java/com/mrxu/admin/controller/sales/HisDrugController.java

@@ -0,0 +1,75 @@
+package com.mrxu.admin.controller.sales;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import com.mrxu.framework.common.MrxuConst;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.sales.service.HisDrugService;
+import com.mrxu.sales.entity.HisDrug;
+import com.mrxu.sales.query.HisDrugDto;
+
+@Api(tags = "药品库管理")
+@Controller
+@RequestMapping("/sales/hisDrug")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class HisDrugController extends AdminBaseController {
+
+	private final HisDrugService hisDrugService;
+	
+	@RequiresPermissions("sales:hisDrug:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "sales/hisDrug.html";
+	}
+	
+	@RequiresPermissions("sales:hisDrug:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<HisDrug> page(HisDrugDto queryDto) {
+		PageResult<HisDrug> rs = hisDrugService.page(null,queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:hisDrug:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<HisDrug> getById(Integer id) {
+		return success(hisDrugService.getById(null,id));
+	}
+
+	@RequiresPermissions("sales:hisDrug:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody HisDrug bean) {
+		return success(hisDrugService.saveOrUpdate(null,bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:hisDrug:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(hisDrugService.remove(null,id));
+	}
+
+	@RequiresPermissions("sales:hisDrug:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(hisDrugService.removeBatch(null,ids));
+	}
+
+}

+ 76 - 0
src/main/java/com/mrxu/admin/controller/sales/HisPatientController.java

@@ -0,0 +1,76 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.sales.entity.HisPatient;
+import com.mrxu.sales.query.HisPatientDto;
+import com.mrxu.sales.service.HisPatientService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "就诊人管理")
+@Controller
+@RequestMapping("/sales/hisPatient")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class HisPatientController extends AdminBaseController {
+
+	private final HisPatientService hisPatientService;
+	
+	@RequiresPermissions("sales:hisPatient:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "sales/hisPatient.html";
+	}
+	
+	@RequiresPermissions("sales:hisPatient:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<HisPatient> page(HisPatientDto queryDto) {
+		PageResult<HisPatient> rs = hisPatientService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:hisPatient:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody HisPatient bean) {
+		return success(hisPatientService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:hisPatient:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		HisPatient bean = new HisPatient();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(hisPatientService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:hisPatient:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(hisPatientService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:hisPatient:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(hisPatientService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 119 - 0
src/main/java/com/mrxu/admin/controller/sales/HisProjectController.java

@@ -0,0 +1,119 @@
+package com.mrxu.admin.controller.sales;
+
+import cn.hutool.extra.pinyin.PinyinUtil;
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.HisProject;
+import com.mrxu.sales.entity.HisProjectClass;
+import com.mrxu.sales.query.HisProjectClassDto;
+import com.mrxu.sales.query.HisProjectDto;
+import com.mrxu.sales.service.HisProjectClassService;
+import com.mrxu.sales.service.HisProjectService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "检查项目管理")
+@Controller
+@RequestMapping("/sales/hisProject")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class HisProjectController extends AdminBaseController {
+
+	private final HisProjectClassService hisProjectClassService;
+
+	private final HisProjectService hisProjectService;
+	
+	@RequiresPermissions("sales:hisProject:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "sales/hisProject.html";
+	}
+
+	@RequiresPermissions("sales:hisProject:read")
+	@ResponseBody
+	@RequestMapping("/classPage.json")
+	public LayuiPage<HisProjectClass> page(HisProjectClassDto queryDto) {
+		PageResult<HisProjectClass> rs = hisProjectClassService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+	
+	@RequiresPermissions("sales:hisProject:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<HisProject> page(HisProjectDto queryDto) {
+		PageResult<HisProject> rs = hisProjectService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:hisProject:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<HisProject> getById(Integer id) {
+		return success(hisProjectService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:hisProject:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody HisProject bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		bean.setNamePinyin(PinyinUtil.getPinyin(bean.getName()));
+		return success(hisProjectService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:hisProject:update")
+	@ResponseBody
+	@RequestMapping("/classSave.json")
+	public ResponseObj<Boolean> classSave(@Valid @RequestBody HisProjectClass bean) {
+		if(bean.getStatus() == null) {
+			bean.setStatus(MrxuConst.disable);
+		}
+		return success(hisProjectClassService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:hisProject:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		HisProject bean = new HisProject();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(hisProjectService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:hisProject:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(hisProjectService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:hisProject:remove")
+	@ResponseBody
+	@RequestMapping("/classRemove.json")
+	public ResponseObj<Boolean> classRemove(Integer id) {
+		return success(hisProjectClassService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:hisProject:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(hisProjectService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 106 - 0
src/main/java/com/mrxu/admin/controller/sales/ItemOrderCgBackController.java

@@ -0,0 +1,106 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.entity.ItemOrderDetail;
+import com.mrxu.sales.enums.ItemOrderStatus;
+import com.mrxu.sales.enums.ItemOrderType;
+import com.mrxu.sales.export.ItemOrderCgExport;
+import com.mrxu.sales.model.GoodsVo;
+import com.mrxu.sales.query.ItemOrderAddDto;
+import com.mrxu.sales.query.ItemOrderDto;
+import com.mrxu.sales.service.*;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "商品采购退货订单管理")
+@Controller
+@RequestMapping("/sales/itemOrderCgBack")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class ItemOrderCgBackController extends AdminBaseController {
+
+	private final ItemOrderService itemOrderService;
+
+	private final ItemOrderDetailService itemDetailService;
+
+	private final ItemOrderCgService itemOrderCgService;
+
+	private final SupplierService supplierService;
+
+	private final GoodsService goodsService;
+
+	@RequiresPermissions("sales:itemOrderCgBack:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("supplierList",supplierService.list(getTenantId()));
+		return "sales/itemOrderCgBack.html";
+	}
+
+	@RequiresPermissions("sales:itemOrderCgBack:update")
+	@RequestMapping("itemOrderCgBackAdd.html")
+	public String add(Model model) {
+		model.addAttribute("supplierList",supplierService.list(getTenantId()));
+		return "sales/itemOrderCgBackAdd.html";
+	}
+
+	@RequiresPermissions("sales:itemOrderCgBack:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<ItemOrder> page(ItemOrderDto queryDto) {
+		queryDto.setType(ItemOrderType.CG_BACK.getType());
+		PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:itemOrderCgBack:read")
+	@ResponseBody
+	@RequestMapping("/export.json")
+	public void export(HttpServletResponse response, ItemOrderDto queryDto) {
+		queryDto.setType(ItemOrderType.CG_BACK.getType());
+		queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+		export(response,"采购订单", ItemOrderCgExport.class,itemOrderService.cgExport(getTenantId(),queryDto));
+	}
+
+	@RequiresPermissions("sales:itemOrderCgBack:read")
+	@ResponseBody
+	@RequestMapping("/detailList.json")
+	public LayuiPage<ItemOrderDetail> detailList(String orderNo) {
+		return renderLayuiList(itemDetailService.list(getTenantId(),orderNo));
+	}
+
+	@RequiresPermissions("sales:itemOrderCgBack:read")
+	@ResponseBody
+	@RequestMapping("/supplierGoodsList.json")
+	public ResponseObj<List<GoodsVo>> supplierGoodsList(Integer supplierId) {
+		supplierId = null;// 不再限制供应商
+		List<GoodsVo> goodsList = goodsService.fastList(getTenantId(),supplierId);
+		return success(goodsList);
+	}
+
+	@RequiresPermissions("sales:itemOrderCgBack:update")
+	@ResponseBody
+	@RequestMapping("/create.json")
+	public ResponseObj<Boolean> create(@Valid @RequestBody ItemOrderAddDto bean) {
+		bean.setStatus(ItemOrderStatus.pay.getStatus());// 默认未支付
+		bean.setType(ItemOrderType.CG_BACK);
+		itemOrderCgService.create(getTenantId(),bean,getUsername());
+		return success(true);
+	}
+
+
+}

+ 129 - 0
src/main/java/com/mrxu/admin/controller/sales/ItemOrderCgController.java

@@ -0,0 +1,129 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.entity.ItemOrderDetail;
+import com.mrxu.sales.enums.ItemOrderStatus;
+import com.mrxu.sales.enums.ItemOrderType;
+import com.mrxu.sales.export.ItemOrderCgExport;
+import com.mrxu.sales.model.GoodsVo;
+import com.mrxu.sales.query.ItemOrderAddDto;
+import com.mrxu.sales.query.ItemOrderDto;
+import com.mrxu.sales.service.*;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "商品采购订单管理")
+@Controller
+@RequestMapping("/sales/itemOrderCg")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class ItemOrderCgController extends AdminBaseController {
+
+	private final ItemOrderService itemOrderService;
+
+	private final ItemOrderDetailService itemDetailService;
+
+	private final ItemOrderCgService itemOrderCgService;
+
+	private final SupplierService supplierService;
+
+	private final GoodsService goodsService;
+
+	@RequiresPermissions("sales:itemOrderCg:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("supplierList",supplierService.list(getTenantId()));
+		return "sales/itemOrderCg.html";
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:update")
+	@RequestMapping("itemOrderCgAdd.html")
+	public String add(Model model) {
+		model.addAttribute("supplierList",supplierService.list(getTenantId()));
+		return "sales/itemOrderCgAdd.html";
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<ItemOrder> page(ItemOrderDto queryDto) {
+		queryDto.setType(ItemOrderType.CG.getType());
+		PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:read")
+	@ResponseBody
+	@RequestMapping("/export.json")
+	public void export(HttpServletResponse response, ItemOrderDto queryDto) {
+		queryDto.setType(ItemOrderType.CG.getType());
+		queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+		export(response,"采购订单", ItemOrderCgExport.class,itemOrderService.cgExport(getTenantId(),queryDto));
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:read")
+	@ResponseBody
+	@RequestMapping("/detailList.json")
+	public LayuiPage<ItemOrderDetail> detailList(String orderNo) {
+		return renderLayuiList(itemDetailService.list(getTenantId(),orderNo));
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:read")
+	@ResponseBody
+	@RequestMapping("/supplierGoodsList.json")
+	public ResponseObj<List<GoodsVo>> supplierGoodsList(Integer supplierId) {
+		supplierId = null;// 不再限制供应商
+		List<GoodsVo> goodsList = goodsService.fastList(getTenantId(),supplierId);
+		return success(goodsList);
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<ItemOrder> getById(Integer id) {
+		return success(itemOrderService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:update")
+	@ResponseBody
+	@RequestMapping("/create.json")
+	public ResponseObj<Boolean> create(@Valid @RequestBody ItemOrderAddDto bean) {
+		bean.setStatus(ItemOrderStatus.create.getStatus());// 默认未支付
+		bean.setType(ItemOrderType.CG);
+		itemOrderCgService.create(getTenantId(),bean,getUsername());
+		return success(true);
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		ItemOrder bean = new ItemOrder();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(itemOrderService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:itemOrderCg:pay")
+	@ResponseBody
+	@RequestMapping("/pay.json")
+	public ResponseObj<Boolean> pay(@RequestBody ItemOrder bean) {
+		return success(itemOrderCgService.pay(getTenantId(),bean.getOrderNo(),bean.getSupportImage(),getUsername()));
+	}
+
+}

+ 87 - 0
src/main/java/com/mrxu/admin/controller/sales/ItemOrderController.java

@@ -0,0 +1,87 @@
+package com.mrxu.admin.controller.sales;
+
+import javax.validation.Valid;
+import java.util.List;
+
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.sales.service.ItemOrderService;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.query.ItemOrderDto;
+
+@Api(tags = "商品订单管理")
+@Controller
+@RequestMapping("/sales/itemOrder")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class ItemOrderController extends AdminBaseController {
+
+	private final ItemOrderService itemOrderService;
+	
+	@RequiresPermissions("sales:itemOrder:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		return "sales/itemOrder.html";
+	}
+	
+	@RequiresPermissions("sales:itemOrder:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<ItemOrder> page(ItemOrderDto queryDto) {
+		PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:itemOrder:read")
+	@ResponseBody
+	@RequestMapping("/getById.json")
+	public ResponseObj<ItemOrder> getById(Integer id) {
+		return success(itemOrderService.getById(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:itemOrder:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody ItemOrder bean) {
+		/*如果有状态请打开,没有请删除if(bean.getStatus() == null) {
+			bean.setStatus(0);
+		}*/
+		return success(itemOrderService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:itemOrder:update")
+	@ResponseBody
+	@RequestMapping("/updateStatus.json")
+	public ResponseObj<Boolean> updateStatus(Integer id, Integer status) {
+		ItemOrder bean = new ItemOrder();
+		bean.setId(id);
+		bean.setStatus(status);
+		return success(itemOrderService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+	@RequiresPermissions("sales:itemOrder:remove")
+	@ResponseBody
+	@RequestMapping("/remove.json")
+	public ResponseObj<Boolean> remove(Integer id) {
+		return success(itemOrderService.remove(getTenantId(),id));
+	}
+
+	@RequiresPermissions("sales:itemOrder:remove")
+	@ResponseBody
+	@RequestMapping("/removeBatch.json")
+	public ResponseObj<Boolean> removeBatch(@RequestBody List<Integer> ids) { 
+		return success(itemOrderService.removeBatch(getTenantId(),ids));
+	}
+
+}

+ 80 - 0
src/main/java/com/mrxu/admin/controller/sales/ItemOrderDutyController.java

@@ -0,0 +1,80 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.entity.ItemOrderDetail;
+import com.mrxu.sales.enums.ItemOrderStatus;
+import com.mrxu.sales.enums.ItemOrderType;
+import com.mrxu.sales.export.ItemOrderDutyExport;
+import com.mrxu.sales.export.ItemOrderPayoutExport;
+import com.mrxu.sales.query.ItemOrderDto;
+import com.mrxu.sales.service.ItemOrderDetailService;
+import com.mrxu.sales.service.ItemOrderDutyService;
+import com.mrxu.sales.service.ItemOrderService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+
+@Api(tags = "门诊订单管理")
+@Controller
+@RequestMapping("/sales/itemOrderDuty")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class ItemOrderDutyController extends AdminBaseController {
+
+	private final ItemOrderService itemOrderService;
+
+	private final ItemOrderDetailService itemDetailService;
+
+	private final ItemOrderDutyService orderDutyService;
+
+	@RequiresPermissions("sales:itemOrderDuty:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("statusList", ItemOrderStatus.values());
+		return "sales/itemOrderDuty.html";
+	}
+
+	@RequiresPermissions("sales:itemOrderDuty:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<ItemOrder> page(ItemOrderDto queryDto) {
+		queryDto.setType(ItemOrderType.HIS.getType());
+		PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:itemOrderDuty:read")
+	@ResponseBody
+	@RequestMapping("/export.json")
+	public void export(HttpServletResponse response, ItemOrderDto queryDto) {
+		queryDto.setType(ItemOrderType.HIS.getType());
+		queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+		export(response,"门诊订单", ItemOrderDutyExport.class,itemOrderService.dutyExport(getTenantId(),queryDto));
+	}
+
+	@RequiresPermissions("sales:itemOrderDuty:read")
+	@ResponseBody
+	@RequestMapping("/detailList.json")
+	public LayuiPage<ItemOrderDetail> detailList(String orderNo) {
+		return renderLayuiList(itemDetailService.list(getTenantId(),orderNo));
+	}
+
+	@RequiresPermissions("sales:itemOrderDuty:update")
+	@ResponseBody
+	@RequestMapping("/back.json")
+	public ResponseObj<Boolean> back(String orderNo) {
+		return success(orderDutyService.back(getTenantId(),orderNo,getUsername()));
+	}
+
+}

+ 75 - 0
src/main/java/com/mrxu/admin/controller/sales/ItemOrderPayoutController.java

@@ -0,0 +1,75 @@
+package com.mrxu.admin.controller.sales;
+
+import com.mrxu.admin.controller.AdminBaseController;
+import com.mrxu.framework.boot.bean.LayuiPage;
+import com.mrxu.framework.boot.bean.PageResult;
+import com.mrxu.framework.boot.bean.ResponseObj;
+import com.mrxu.framework.common.MrxuConst;
+import com.mrxu.sales.entity.ItemOrder;
+import com.mrxu.sales.enums.ItemOrderType;
+import com.mrxu.sales.export.ItemOrderPayoutExport;
+import com.mrxu.sales.query.ItemOrderDto;
+import com.mrxu.sales.service.ItemOrderDetailService;
+import com.mrxu.sales.service.ItemOrderPayoutService;
+import com.mrxu.sales.service.ItemOrderService;
+import com.mrxu.sales.service.PayoutClassService;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Api(tags = "支出订单")
+@Controller
+@RequestMapping("/sales/itemOrderPayout")
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class ItemOrderPayoutController extends AdminBaseController {
+
+	private final ItemOrderService itemOrderService;
+
+	private final ItemOrderPayoutService payoutService;
+
+	private final ItemOrderDetailService itemDetailService;
+
+	private final PayoutClassService payoutClassService;
+
+	@RequiresPermissions("sales:itemOrderPayout:read")
+	@RequestMapping("index.html")
+	public String index(Model model) {
+		model.addAttribute("payoutClassList",payoutClassService.list(getTenantId()));
+		return "sales/itemOrderPayout.html";
+	}
+
+	@RequiresPermissions("sales:itemOrderPayout:read")
+	@ResponseBody
+	@RequestMapping("/page.json")
+	public LayuiPage<ItemOrder> page(ItemOrderDto queryDto) {
+		queryDto.setType(ItemOrderType.PAYOUT.getType());
+		PageResult<ItemOrder> rs = itemOrderService.page(getTenantId(),queryDto);
+		return renderLayuiPage(rs);
+	}
+
+	@RequiresPermissions("sales:itemOrderPayout:read")
+	@ResponseBody
+	@RequestMapping("/export.json")
+	public void export(HttpServletResponse response, ItemOrderDto queryDto) {
+		queryDto.setType(ItemOrderType.PAYOUT.getType());
+		queryDto.setPageSize(MrxuConst.MAX_PAGE_SIZE);
+		export(response,"支出单", ItemOrderPayoutExport.class,itemOrderService.payoutExport(getTenantId(),queryDto));
+	}
+
+	@RequiresPermissions("sales:itemOrderPayout:update")
+	@ResponseBody
+	@RequestMapping("/save.json")
+	public ResponseObj<Boolean> save(@Valid @RequestBody ItemOrder bean) {
+		return success(payoutService.saveOrUpdate(getTenantId(),bean,getUsername()));
+	}
+
+}

+ 0 - 0
src/main/java/com/mrxu/admin/controller/sales/PayoutClassController.java


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini