kkk 2 years ago
parent
commit
ac85707ed8
100 changed files with 15830 additions and 2 deletions
  1. 2 2
      README.md
  2. 9 0
      hkctest
  3. 1 0
      hkctest_base
  4. 84 0
      jsw.iml
  5. 315 0
      pom.xml
  6. 51 0
      src/main/java/com/CreateUser.java
  7. 15 0
      src/main/java/com/common/model/Blog.java
  8. 22 0
      src/main/java/com/common/model/_MappingKit.java
  9. 39 0
      src/main/java/com/common/model/base/BaseBlog.java
  10. 103 0
      src/main/java/com/config/AuthInterceptor.java
  11. 242 0
      src/main/java/com/config/BaseController.java
  12. 7 0
      src/main/java/com/config/Constants.java
  13. 12 0
      src/main/java/com/config/ControllerInterface.java
  14. 152 0
      src/main/java/com/config/LogInterceptor.java
  15. 170 0
      src/main/java/com/config/MyJfinalConfig.java
  16. 48 0
      src/main/java/com/config/SystemConstant.java
  17. 4 0
      src/main/java/com/config/UserInterface.java
  18. 28 0
      src/main/java/com/config/WebSocketHandler.java
  19. 43 0
      src/main/java/com/config/XssHandler.java
  20. 81 0
      src/main/java/com/config/XssHttpServletRequestWrapper.java
  21. 77 0
      src/main/java/com/config/XssInterceptor.java
  22. 1613 0
      src/main/java/com/controller/BookController.java
  23. 437 0
      src/main/java/com/controller/BookDetailController.java
  24. 13 0
      src/main/java/com/controller/BookImportController.java
  25. 309 0
      src/main/java/com/controller/BookPenaltyController.java
  26. 110 0
      src/main/java/com/controller/BookPiciController.java
  27. 46 0
      src/main/java/com/controller/BookTypeController.java
  28. 467 0
      src/main/java/com/controller/BookYubianController.java
  29. 67 0
      src/main/java/com/controller/CardTypeController.java
  30. 333 0
      src/main/java/com/controller/CheckBookController.java
  31. 16 0
      src/main/java/com/controller/DefaultPageController.java
  32. 45 0
      src/main/java/com/controller/DictController.java
  33. 223 0
      src/main/java/com/controller/FileController.java
  34. 101 0
      src/main/java/com/controller/HotBookController.java
  35. 25 0
      src/main/java/com/controller/IndexController.java
  36. 2007 0
      src/main/java/com/controller/JieyueController.java
  37. 152 0
      src/main/java/com/controller/LibraryController.java
  38. 237 0
      src/main/java/com/controller/LoginController.java
  39. 262 0
      src/main/java/com/controller/MenuController.java
  40. 62 0
      src/main/java/com/controller/MoniyonghuController.java
  41. 36 0
      src/main/java/com/controller/OrgBookFieldController.java
  42. 389 0
      src/main/java/com/controller/OrgController.java
  43. 95 0
      src/main/java/com/controller/OrgDeptController.java
  44. 27 0
      src/main/java/com/controller/OrgTypeController.java
  45. 195 0
      src/main/java/com/controller/PageController.java
  46. 895 0
      src/main/java/com/controller/PrintController.java
  47. 79 0
      src/main/java/com/controller/ReaderAuthController.java
  48. 713 0
      src/main/java/com/controller/ReaderController.java
  49. 91 0
      src/main/java/com/controller/RegionController.java
  50. 114 0
      src/main/java/com/controller/RoleController.java
  51. 147 0
      src/main/java/com/controller/SchoolPageController.java
  52. 59 0
      src/main/java/com/controller/SysmkfController.java
  53. 163 0
      src/main/java/com/controller/UserController.java
  54. 91 0
      src/main/java/com/controller/api/GzPlatReportController.java
  55. 424 0
      src/main/java/com/controller/api/InventoryController.java
  56. 689 0
      src/main/java/com/controller/api/JswPlgApiController.java
  57. 472 0
      src/main/java/com/controller/api/ReaderApiController.java
  58. 346 0
      src/main/java/com/controller/api/ReaderReportController.java
  59. 610 0
      src/main/java/com/controller/api/SycController.java
  60. 108 0
      src/main/java/com/controller/intelligentdevice/ReadingWorksController.java
  61. 46 0
      src/main/java/com/controller/librarycatalog/LibraryCatalogController.java
  62. 215 0
      src/main/java/com/controller/log/LogController.java
  63. 40 0
      src/main/java/com/controller/report/CancellationStatisticsController.java
  64. 87 0
      src/main/java/com/controller/report/CirculationStatisticsController.java
  65. 60 0
      src/main/java/com/controller/report/ClassificationStatisticsController.java
  66. 43 0
      src/main/java/com/controller/report/ComprehensiveStatisticsController.java
  67. 96 0
      src/main/java/com/controller/school/LiutongController.java
  68. 20 0
      src/main/java/com/controller/school/SchoolIndexController.java
  69. 14 0
      src/main/java/com/controller/school/SchoolReportController.java
  70. 502 0
      src/main/java/com/controller/school/SynchronizationSchoolInfoController.java
  71. 286 0
      src/main/java/com/controller/screendisplay/ScreenHomeController.java
  72. 177 0
      src/main/java/com/controller/sysconfig/SysConfigController.java
  73. 66 0
      src/main/java/com/enums/LogEnum.java
  74. 62 0
      src/main/java/com/enums/SortEnum.java
  75. 55 0
      src/main/java/com/enums/SourceEnum.java
  76. 35 0
      src/main/java/com/exception/NitifyException.java
  77. 11 0
      src/main/java/com/model/Areatype.java
  78. 11 0
      src/main/java/com/model/BasicArea.java
  79. 11 0
      src/main/java/com/model/Binding.java
  80. 11 0
      src/main/java/com/model/Blog.java
  81. 11 0
      src/main/java/com/model/Book.java
  82. 11 0
      src/main/java/com/model/BookArea.java
  83. 11 0
      src/main/java/com/model/BookDetail.java
  84. 11 0
      src/main/java/com/model/BookDiaobo.java
  85. 11 0
      src/main/java/com/model/BookErrorlocation.java
  86. 11 0
      src/main/java/com/model/BookEvaluation.java
  87. 11 0
      src/main/java/com/model/BookGood.java
  88. 11 0
      src/main/java/com/model/BookHot.java
  89. 11 0
      src/main/java/com/model/BookLocation.java
  90. 11 0
      src/main/java/com/model/BookNew.java
  91. 11 0
      src/main/java/com/model/BookPenalty.java
  92. 11 0
      src/main/java/com/model/BookPlus.java
  93. 11 0
      src/main/java/com/model/BookRecommend.java
  94. 11 0
      src/main/java/com/model/BookShelfplan.java
  95. 11 0
      src/main/java/com/model/BookYubian.java
  96. 11 0
      src/main/java/com/model/BookZhuxiao.java
  97. 11 0
      src/main/java/com/model/Bookpici.java
  98. 11 0
      src/main/java/com/model/Bookplan.java
  99. 11 0
      src/main/java/com/model/Bookplandetail.java
  100. 0 0
      src/main/java/com/model/Bookshelfinfo.java

+ 2 - 2
README.md

@@ -1,3 +1,3 @@
-# jswlibrary_sh
+# jswlibrary
 
-社会图书馆管理系统
+社会图书馆管理系统

+ 9 - 0
hkctest

@@ -0,0 +1,9 @@
+县区端 新增排行榜功能,涉及以下更改:
+1、增加菜单  “排行榜”  /paihangbang/index_cangshupaihang
+2、给县区角色赋予菜单权限
+3、新增代码文件:com.controller.report.PaihangbangController
+     /view/report/cangshupaihang.html
+     /view/report/duzhejieyuepaihang.html
+     /view/report/liutonglvpaihang.html
+     /view/report/shengjunceshupaihang.html
+     /view/report/shengjunjieyuepaihang.html

+ 1 - 0
hkctest_base

@@ -0,0 +1 @@
+主干代码zhugan

+ 84 - 0
jsw.iml

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="web" name="Web">
+      <configuration>
+        <descriptors>
+          <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml" />
+        </descriptors>
+        <webroots>
+          <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
+        </webroots>
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: org.jsoup:com.springsource.org.jsoup:1.5.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.10" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.8" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk16:1.46" level="project" />
+    <orderEntry type="library" name="Maven: com.jfinal:jfinal:3.4" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib-nodep:3.2.5" level="project" />
+    <orderEntry type="library" name="Maven: log4j:log4j:1.2.16" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.44" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.0.29" level="project" />
+    <orderEntry type="library" name="Maven: com.jfinal:cos:2017.5" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.5" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.5" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:javax.servlet-api:4.0.0" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.10.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.3" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.3" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.6.0" level="project" />
+    <orderEntry type="library" name="Maven: it.sauronsoftware.cron4j:cron4j:2.2.5" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.ehcache:ehcache:2.10.6" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: com.microsoft.sqlserver:mssql-jdbc:6.4.0.jre8" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:4.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:3.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.18" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.05" level="project" />
+    <orderEntry type="library" name="Maven: net.sourceforge.jexcelapi:jxl:2.6.12" level="project" />
+    <orderEntry type="library" name="Maven: cn.dreampie:jfinal-captcha:0.1" level="project" />
+    <orderEntry type="library" name="Maven: cn.dreampie:jfinal-utils:0.1" level="project" />
+    <orderEntry type="library" name="Maven: com.google.collections:google-collections:1.0" level="project" />
+    <orderEntry type="library" name="Maven: joda-time:joda-time:2.3" level="project" />
+    <orderEntry type="library" name="Maven: cn.dreampie:jfinal-slf4j:0.1" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: javax:javaee-api:7.0" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: com.sun.mail:javax.mail:1.5.0" level="project" />
+    <orderEntry type="library" scope="PROVIDED" name="Maven: javax.activation:activation:1.1" level="project" />
+    <orderEntry type="library" name="Maven: com.jfinal:jfinal-weixin:2.3" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.ucanaccess:ucanaccess:4.0.4" level="project" />
+    <orderEntry type="library" name="Maven: org.hsqldb:hsqldb:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: com.healthmarketscience.jackcess:jackcess:2.1.11" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
+    <orderEntry type="library" name="Maven: com.baidu.aip:java-sdk:4.11.0" level="project" />
+    <orderEntry type="library" name="Maven: org.json:json:20160810" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-simple:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68.sec10" level="project" />
+    <orderEntry type="library" name="Maven: com.linuxense:javadbf:0.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13" level="project" />
+    <orderEntry type="library" name="Maven: com.itextpdf:itext-asian:5.2.0" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.barcode4j:barcode4j:2.1" level="project" />
+    <orderEntry type="library" name="Maven: avalon-framework:avalon-framework-impl:4.2.0" level="project" />
+    <orderEntry type="library" name="Maven: commons-cli:commons-cli:1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.ant:ant:1.7.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.ant:ant-launcher:1.7.1" level="project" />
+  </component>
+</module>

+ 315 - 0
pom.xml

@@ -0,0 +1,315 @@
+<?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>jsw</groupId>
+  <artifactId>jsw</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>war</packaging>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
+  </properties>
+
+  <!-- 使用阿里 maven 库 -->
+  <repositories>
+    <repository>
+      <id>ali-maven</id>
+      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>true</enabled>
+        <updatePolicy>always</updatePolicy>
+        <checksumPolicy>fail</checksumPolicy>
+      </snapshots>
+    </repository>
+  </repositories>
+
+  <!-- 添加快照版本库,updatePolicy: always、daily、interval、never -->
+  <!-- repositories>
+  <repository>
+         <id>sonatype-nexus-snapshots</id>
+         <name>Sonatype Nexus Snapshots</name>
+         <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+         <releases>
+             <enabled>false</enabled>
+         </releases>
+         <snapshots>
+             <enabled>true</enabled>
+             <updatePolicy>daily</updatePolicy>
+         </snapshots>
+     </repository>
+    </repositories -->
+
+  <dependencies>
+    <dependency>
+      <groupId>org.jsoup</groupId>
+      <artifactId>com.springsource.org.jsoup</artifactId>
+      <version>1.5.2</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+
+    <!-- 调用第三方接口用包 -->
+    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>4.4.10</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.5.8</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16 -->
+    <dependency>
+      <groupId>org.bouncycastle</groupId>
+      <artifactId>bcprov-jdk16</artifactId>
+      <version>1.46</version>
+    </dependency>
+    <!-- 调用第三方接口用包 -->
+
+    <dependency>
+      <groupId>com.jfinal</groupId>
+      <artifactId>jfinal</artifactId>
+      <version>3.4</version>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.16</version>
+    </dependency>
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>5.1.44</version>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>druid</artifactId>
+      <version>1.0.29</version>
+    </dependency>
+    <dependency>
+      <groupId>com.jfinal</groupId>
+      <artifactId>cos</artifactId>
+      <version>2017.5</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.5</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>2.5</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <version>4.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
+    <dependency>
+      <groupId>com.auth0</groupId>
+      <artifactId>java-jwt</artifactId>
+      <version>3.10.3</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.jsonwebtoken</groupId>
+      <artifactId>jjwt</artifactId>
+      <version>0.6.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>it.sauronsoftware.cron4j</groupId>
+      <artifactId>cron4j</artifactId>
+      <version>2.2.5</version>
+    </dependency>
+
+    <dependency>
+      <groupId>net.sf.ehcache</groupId>
+      <artifactId>ehcache</artifactId>
+      <version>2.10.6</version>
+    </dependency>
+      <dependency>
+          <groupId>com.microsoft.sqlserver</groupId>
+          <artifactId>mssql-jdbc</artifactId>
+          <version>6.4.0.jre8</version>
+
+      </dependency>
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi</artifactId>
+      <version>4.0.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi-ooxml</artifactId>
+      <version>4.0.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>net.sourceforge.jexcelapi</groupId>
+      <artifactId>jxl</artifactId>
+      <version>2.6.12</version>
+    </dependency>
+
+    <dependency>
+      <groupId>cn.dreampie</groupId>
+      <artifactId>jfinal-captcha</artifactId>
+      <version>0.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>javax</groupId>
+      <artifactId>javaee-api</artifactId>
+      <version>7.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.jfinal</groupId>
+      <artifactId>jfinal-weixin</artifactId>
+      <version>2.3</version>
+    </dependency>
+    <dependency>
+      <groupId>net.sf.ucanaccess</groupId>
+      <artifactId>ucanaccess</artifactId>
+      <version>4.0.4</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.baidu.aip</groupId>
+      <artifactId>java-sdk</artifactId>
+      <version>4.11.0</version>
+    </dependency>
+
+    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>1.2.68.sec10</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.linuxense</groupId>
+      <artifactId>javadbf</artifactId>
+      <version>0.4.0</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
+    <dependency>
+      <groupId>com.itextpdf</groupId>
+      <artifactId>itextpdf</artifactId>
+      <version>5.5.13</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
+    <dependency>
+      <groupId>com.itextpdf</groupId>
+      <artifactId>itext-asian</artifactId>
+      <version>5.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>net.sf.barcode4j</groupId>
+      <artifactId>barcode4j</artifactId>
+      <version>2.1</version>
+    </dependency>
+
+
+  </dependencies>
+  <build>
+    <defaultGoal>compile</defaultGoal>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.1</version>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-war-plugin</artifactId>
+        <version>2.6</version>
+        <configuration>
+          <warSourceDirectory>src/main/webapp</warSourceDirectory>
+          <failOnMissingWebXml>false</failOnMissingWebXml>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.6</version>
+        <configuration>
+          <encoding>UTF-8</encoding>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <version>3.0.0</version>
+      </plugin>
+    </plugins>
+  </build>
+  <!--<build>
+    <finalName>jswlibrary</finalName>
+    <plugins>
+
+
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <appendAssemblyId>false</appendAssemblyId>
+          <descriptors>
+            <descriptor>package.xml</descriptor>
+          </descriptors>
+          <outputDirectory>${project.build.directory}/dist/</outputDirectory>
+        </configuration>
+        <executions>
+          <execution>
+            <id>make-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.4</version>
+        <configuration>
+          <archive>
+            <manifest>
+              <mainClass>com.config.MyJfinalConfig</mainClass>
+              <classpathPrefix>lib/</classpathPrefix>
+              <addClasspath>true</addClasspath>
+            </manifest>
+            <manifestEntries>
+              &lt;!&ndash; 在 MANIFEST.MF 中生成 Class-Path: resources/ &ndash;&gt;
+              <Class-Path>resources/</Class-Path>
+            </manifestEntries>
+          </archive>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>-->
+</project>

+ 51 - 0
src/main/java/com/CreateUser.java

@@ -0,0 +1,51 @@
+package com;
+
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+import com.jfinal.plugin.activerecord.dialect.SqlServerDialect;
+import com.jfinal.plugin.druid.DruidPlugin;
+import com.model.Menu;
+import com.model.Org;
+import com.model.UserMenu;
+import com.model._MappingKit;
+
+import java.util.Date;
+import java.util.List;
+
+public class CreateUser {
+
+
+    public static Menu userDao = new Menu().dao();
+    public static Org dao = new Org().dao();
+    public static Integer a = 5760;
+
+    public static void main(String args[]){
+        try {
+            PropKit.use("config.txt");
+            String jdbcUtil2 = PropKit.get("jdbcUrl");
+            String username2 = PropKit.get("user");
+            String password2 = PropKit.get("password");
+            DruidPlugin druidPlugin = new DruidPlugin(jdbcUtil2, username2, password2);
+            ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
+            arp.setDialect(new SqlServerDialect());
+            _MappingKit.mapping(arp);
+            druidPlugin.start();
+            arp.start();
+            UserMenu dao = new UserMenu().dao();
+            List<Menu> userlist = userDao.find("select * from t_menu");
+            Date time = new Date();
+            int i= 0;
+            for(Menu menu :userlist){i++;
+                UserMenu bean = new UserMenu();
+                bean.setCreatetime(time).setMenuid(menu.getId()).setOperatorid(1).setUserid(1484).save();
+                System.out.println(i);
+            }
+            System.out.println(" is end");
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+
+}

+ 15 - 0
src/main/java/com/common/model/Blog.java

@@ -0,0 +1,15 @@
+package com.common.model;
+
+import com.common.model.base.BaseBlog;
+
+/**
+ * 本 demo 仅表达最为粗浅的 jfinal 用法,更为有价值的实用的企业级用法
+ * 详见 JFinal 俱乐部: http://jfinal.com/club
+ * 
+ * Blog model.
+ * 数据库字段名建议使用驼峰命名规则,便于与 java 代码保持一致,如字段名: userId
+ */
+@SuppressWarnings("serial")
+public class Blog extends BaseBlog<Blog> {
+	
+}

+ 22 - 0
src/main/java/com/common/model/_MappingKit.java

@@ -0,0 +1,22 @@
+package com.common.model;
+
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+
+/**
+ * Generated by JFinal, do not modify this file.
+ * <pre>
+ * Example:
+ * public void configPlugin(Plugins me) {
+ *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
+ *     _MappingKit.mapping(arp);
+ *     me.add(arp);
+ * }
+ * </pre>
+ */
+public class _MappingKit {
+	
+	public static void mapping(ActiveRecordPlugin arp) {
+		arp.addMapping("blog", "id", Blog.class);
+	}
+}
+

+ 39 - 0
src/main/java/com/common/model/base/BaseBlog.java

@@ -0,0 +1,39 @@
+package com.common.model.base;
+
+import com.jfinal.plugin.activerecord.Model;
+import com.jfinal.plugin.activerecord.IBean;
+
+/**
+ * Generated by JFinal, do not modify this file.
+ */
+@SuppressWarnings({"serial", "unchecked"})
+public abstract class BaseBlog<M extends BaseBlog<M>> extends Model<M> implements IBean {
+
+	public M setId(java.lang.Integer id) {
+		set("id", id);
+		return (M)this;
+	}
+	
+	public java.lang.Integer getId() {
+		return getInt("id");
+	}
+
+	public M setTitle(java.lang.String title) {
+		set("title", title);
+		return (M)this;
+	}
+	
+	public java.lang.String getTitle() {
+		return getStr("title");
+	}
+
+	public M setContent(java.lang.String content) {
+		set("content", content);
+		return (M)this;
+	}
+	
+	public java.lang.String getContent() {
+		return getStr("content");
+	}
+
+}

+ 103 - 0
src/main/java/com/config/AuthInterceptor.java

@@ -0,0 +1,103 @@
+package com.config;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import com.jfinal.kit.PathKit;
+import com.jfinal.kit.PropKit;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.Menu;
+import com.model.OperationLog;
+import com.model.Org;
+import com.model.User;
+import com.service.OrgService;
+import com.utils.CommonUtils;
+import org.apache.commons.io.FileUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class AuthInterceptor implements Interceptor {
+    private static Log log = Log.getLog(AuthInterceptor.class);
+    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+    private OrgService orgService = OrgService.me;
+    public static List<String> noauthlist = initpath();
+    public static List<String> initpath(){
+        List<String> list = new ArrayList<String>();
+        try{
+            list = FileUtils.readLines(new File(PathKit.getRootClassPath()+ File.separatorChar +"noauth.txt"),"utf-8");
+            return list;
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+        return list;
+    }
+
+
+    @Override
+    public void intercept(Invocation invocation) {
+        try{
+
+            String target = invocation.getActionKey();
+
+            if (ignore(target)){
+                invocation.invoke();
+                return;
+            }
+
+            User user = (User)invocation.getController().getSession().getAttribute("userInfo");
+            if(user  == null) {
+                HttpServletRequest httpServletRequest=invocation.getController().getRequest();
+                log.info("非法操作,已被拦截:"+target);
+                if (httpServletRequest.getHeader("x-requested-with") !=null){
+                    Map result = new HashMap();
+                    result.put("code","3");
+                    result.put("msg","长时间没有使用系统,请先重新登录!");
+                    invocation.getController().renderJson(result);
+                }else {
+                    invocation.getController().redirect(PropKit.get("login_page_url"));
+                }
+            }else{
+                Org org = orgService.findById(user.getOrgid());
+                Map map = new HashMap();
+                map.put("orgid",user.getOrgid());
+                map.put("orgname",org.getOrgname());
+                map.put("userid",user.getId());
+                map.put("loginname",user.getRealname());
+                map.put("url",target.toString());
+
+
+                
+
+                map.put("time", format.format(new Date()));
+                log.info("useraction:" + JSONObject.toJSON(map).toString());
+                long time = System.currentTimeMillis();
+                invocation.invoke();
+                log.info("耗时:"+(System.currentTimeMillis()-time)+"ms");
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    private boolean ignore(String target){
+        for (String url :noauthlist){
+            if (url.equals("")){
+                continue;
+            }
+            if (url.endsWith("*") && target.indexOf(url.substring(0,url.length()-2)) !=-1){
+                return true;
+            }
+            if (target.endsWith(url) ){
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 242 - 0
src/main/java/com/config/BaseController.java

@@ -0,0 +1,242 @@
+package com.config;
+
+
+
+
+import com.jfinal.core.Controller;
+import com.jfinal.kit.PropKit;
+import com.jfinal.log.Log;
+
+
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.DbPro;
+import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.plugin.druid.DruidPlugin;
+import com.jfinal.plugin.ehcache.CacheKit;
+import com.jfinal.plugin.ehcache.CacheName;
+import com.tools.JwtUtils;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 提取一些经常的代码,主要用于继承
+ * @author hkc
+ *
+ */
+public class BaseController extends Controller {
+	public Log logger = Log.getLog(BaseController.class);
+	public SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+	public SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+	public SimpleDateFormat format3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+	public final static String VIEW_PATH=PropKit.get("view_path");
+	public final static String BASEVIEWDIR="/skin/"+VIEW_PATH+"/views/";
+	//public static final int PAGESIZE = 20;//每页现实条数
+	public static final int PAGESIZE = Integer.valueOf(PropKit.get("pagesize"));//每页现实条数
+
+	public static final int CODE_AUTH=201;
+
+
+
+	/**
+	 * 将List转换为数组对象
+	 * @param list
+	 * @return
+	 */
+	public static Object[] listToArray(List<Object> list){
+		return list.toArray(new Object[list.size()]);
+	}
+
+	public void success(Object o){
+		Map result = new HashMap();
+		result.put("code",200);
+		result.put("msg","调用成功");
+		result.put("data",o);
+		this.renderJson(result);
+	}
+
+	public void reData(Object o){
+		this.renderJson(o);
+	}
+
+	public void success(int code,String msg,Object o){
+		Map result = new HashMap();
+		result.put("code",code);
+		result.put("msg",msg);
+		result.put("data",o);
+		this.renderJson(result);
+	}
+
+	public void success(int code,String msg,Object[] o,int count){
+		Map result = new HashMap();
+		result.put("code",code);
+		result.put("msg",msg);
+		result.put("count",count);
+		result.put("data",o);
+		this.renderJson(result);
+	}
+
+	public void success(int code,String msg){
+		Map result = new HashMap();
+		result.put("code",code);
+		result.put("msg",msg);
+		this.renderJson(result);
+	}
+
+	public void success(){
+		Map result = new HashMap();
+		result.put("code",200);
+		result.put("msg","操作成功");
+		this.renderJson(result);
+	}
+	public static Map successMap(){
+		Map result = new HashMap();
+		result.put("code",200);
+		result.put("msg","操作成功");
+		return result;
+	}
+	public void fail(int code, String msg){
+		Map result = new HashMap();
+		result.put("code",code);
+		result.put("msg",msg);
+
+		this.renderJson(result);
+	}
+	public static Map failMap(int code, String msg){
+		Map result = new HashMap();
+		result.put("code",code);
+		result.put("msg",msg);
+		return result;
+	}
+	public void fail(){
+		Map result = new HashMap();
+		result.put("code","0");
+		result.put("msg","请求错误");
+		this.renderJson(result);
+	}
+	public void fail_token(){
+		Map result = new HashMap();
+		result.put("code","3");
+		result.put("msg","token验证错误");
+		this.renderJson(result);
+	}
+
+	public Map weixinTokenFail(){
+		Map result = new HashMap();
+		result.put("resCode","301");
+		result.put("resMsg", "权限验证失败");
+		return result;
+	}
+	public Map weixinFail(String msg){
+		Map result = new HashMap();
+		result.put("resCode","-1");
+		if(StringUtils.isEmpty(msg)){
+			msg = "操作失败!";
+		}
+		result.put("resMsg", msg);
+		return result;
+	}
+	public Map weixinSuccess(Object bean){
+		Map result = new HashMap();
+		result.put("resCode","200");
+		result.put("resMsg", bean);
+		return result;
+	}
+
+
+	public void formatDate(List<Record> list, SimpleDateFormat format){
+		for(Record r : list){
+			String[] keys = r.getColumnNames();
+			for(String key : keys){
+				if(r.get(key) instanceof java.util.Date){
+					r.set(key, format.format(r.getDate(key)));
+				}
+				if(r.get(key) instanceof String){
+					if(r.get(key) != null){
+						r.set(key, r.getStr(key).trim());
+					}
+
+				}
+			}
+		}
+	}
+
+
+	private int getOperatorid(String token ){
+		int operatorid = JwtUtils.validateJWTForUserId(token);
+		if(operatorid == 0){
+			fail(3,"token错误");
+		}
+		return operatorid;
+	}
+
+	/**
+	 * 该方法用户微信端根据账号的orgid获取对应的数据源
+	 * @param key
+	 * @return
+	 */
+	public DbPro weixinDb(Object key){
+		int datasourceid =0 ;
+		if(key instanceof Integer){
+			datasourceid = getWxDataSourceid((Integer) key);
+		}else{
+			datasourceid = getWxDataSourceid((String)key);
+			if(datasourceid == 0 ){
+				return null;
+			}
+		}
+		return Db.use("wxdatasource"+datasourceid);
+	}
+
+	@CacheName("WXDATASOURCE")
+	private int getWxDataSourceid(int orgid){
+		return Db.findById("t_wx_datasource","orgid",orgid).getInt("datasourceid");
+	}
+	@CacheName("WXDATASOURCE")
+	private int getWxDataSourceid(String openid){
+		Record record = Db.findById("t_wx_openid_orgid","openid",openid);
+		if(record == null){
+			return 0;
+		}
+		int orgid = record.getInt("orgid");
+		return Db.findById("t_wx_datasource","orgid",orgid).getInt("datasourceid");
+	}
+	/**
+	 * 本地文件(图片、excel等)转换成Base64字符串
+	 *
+	 * @param imgPath
+	 */
+	public static String convertFileToBase64(String imgPath) {
+		byte[] data = null;
+		// 读取图片字节数组
+		try {
+			InputStream in = new FileInputStream(imgPath);
+			//System.out.println("文件大小(字节)="+in.available());
+			data = new byte[in.available()];
+			in.read(data);
+			in.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		// 对字节数组进行Base64编码,得到Base64编码的字符串
+		BASE64Encoder encoder = new BASE64Encoder();
+		String base64Str = encoder.encode(data);
+
+
+		return base64Str;
+	}
+
+
+}

+ 7 - 0
src/main/java/com/config/Constants.java

@@ -0,0 +1,7 @@
+package com.config;
+
+import com.jfinal.kit.PropKit;
+
+public class Constants {
+    public static int PAGESIZE = Integer.valueOf(PropKit.get("pagesize"));
+}

+ 12 - 0
src/main/java/com/config/ControllerInterface.java

@@ -0,0 +1,12 @@
+package com.config;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+public @interface ControllerInterface {
+    String path();
+}

+ 152 - 0
src/main/java/com/config/LogInterceptor.java

@@ -0,0 +1,152 @@
+package com.config;
+
+import com.enums.LogEnum;
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import com.jfinal.core.Injector;
+import com.jfinal.log.Log;
+import com.model.LogDict;
+import com.model.User;
+import com.tools.JwtUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @ClassName LogInterceptor
+ * @Description  日志拦截器
+ * @Author zhangyanwei
+ * @Date 2020/11/16 16:11
+ * @Version 1.0
+ **/
+public class LogInterceptor implements Interceptor {
+    public static Log logger = Log.getLog(LogInterceptor.class);
+    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+    com.model.Log log = new com.model.Log().dao();
+    LogDict logDict = new LogDict().dao();
+
+    @Override
+    public void intercept(Invocation invocation) {
+        try {
+            HttpServletRequest httpServletRequest = invocation.getController().getRequest();
+            System.out.println(httpServletRequest.getRemoteHost());
+            String ip = httpServletRequest.getRemoteAddr();
+            String url = httpServletRequest.getRequestURI();
+
+            Map<String, String[]> params = httpServletRequest.getParameterMap();
+            logger.info("进入日志切面请求url{}"+url);
+            List values = new ArrayList();
+            values.add(url);
+            LogDict record = logDict.findFirst("select   method_name ,oper from t_log_dict where method_path = ?",listToArray(values));
+            int type= type(url);
+            if(null != record) {
+
+                com.model.Log log1 = new com.model.Log();
+                String token = httpServletRequest.getParameter("token");
+
+                User user =getUser(token);
+                log1.setIp(ip);
+                log1.setReqPath(url);
+                String loginname = "";
+                if(user != null) {
+                    log1.setUserId(user.getId().toString());
+                    log1.setCreateName(user.getLoginname());
+                    loginname = user.getLoginname();
+                }
+
+                String des = getDescription(params,loginname,url, record.getMethodName());
+                log1.setReqStatus("200");
+                log1.setDescription(des);
+                log1.setType(type);
+                log1.setLogNo(String.valueOf(UUID.randomUUID()));
+                log1.setOper(record.getOper());
+                log1.setArgs(argsArrayToString(params));
+                log1.save();
+            }
+            invocation.invoke();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+            return;
+        }
+
+    private User getUser(String token) {
+        if (null != token) {
+            int memberid = JwtUtils.validateJWTForUserId(token);
+            User dao = new User().dao();
+            User user = dao.findById(memberid);
+            if (null != user) {
+                return user;
+            }
+
+        }
+        return null;
+    }
+
+
+
+    private String getDescription(Map<String,String[]> params,String  userName,String url,  String methodname) {
+      StringBuffer   buffer = new StringBuffer();
+        Date startTime = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        buffer.append("用户  【"+userName + "】  在").append(sdf.format(startTime) + " <操作了> ");
+        if (params.containsKey("clickType")) {
+            buffer.append("【" + params.get("clickType")[0] + "】");
+            params.remove("clickType");
+        }else if(methodname.equals("修改日志配置")){
+            buffer.append("【日志配置】修改为"+params.get("file_size")+" G");
+        } else {
+            buffer.append("【" + methodname + "】");
+        }
+        for (Map.Entry<String, String[]> entry : params.entrySet()) {
+            // 通过参数名去枚举中查找操作
+            if (!("").equals(LogEnum.getNameByCode(entry.getKey()))) {
+                buffer.append("[").append(LogEnum.getNameByCode(entry.getKey())).append("]:").append(entry.getValue()[0])
+                        .append(",");
+            }
+        }
+      return  buffer.toString();
+    }
+
+
+    /**
+     * 将List转换为数组对象
+     * @param list
+     * @return
+     */
+    public static Object[] listToArray(List<Object> list){
+        return list.toArray(new Object[list.size()]);
+    }
+    public <T> T getBean(Class<T> beanClass, String beanName,HttpServletRequest request) {
+        return (T) Injector.injectBean(beanClass, beanName, request, false);
+    }
+
+    public int type(String methodPath) {
+        int type = 1;
+        // 审计日志 日志备份于恢复
+        if (methodPath.equals("/log/restoreLog") || methodPath.equals("/log/logBak")||methodPath.equals("/log/list")) {
+            type = 2;
+        }
+
+        // 日志统计
+        if (methodPath.equals("/log/statistics")) {
+            type = 2;
+        }
+        // 日志设置
+        if (methodPath.equals("/log/detail") || methodPath.equals("/log/config")) {
+            type = 2;
+        }
+
+        return type;
+    }
+
+
+    private String argsArrayToString(Map<String,String[]> params) {
+        StringBuffer buffer = new StringBuffer();
+        params.keySet().forEach(o->{
+            buffer.append("{").append(o).append("=").append(params.get(o)[0]).append("}");
+        });
+        return buffer.toString();
+    }
+}

+ 170 - 0
src/main/java/com/config/MyJfinalConfig.java

@@ -0,0 +1,170 @@
+package com.config;
+
+import com.controller.ReaderController;
+import com.controller.api.InventoryController;
+import com.controller.log.LogController;
+import com.controller.school.SchoolIndexController;
+import com.jfinal.config.Constants;
+import com.jfinal.config.*;
+import com.jfinal.core.JFinal;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
+import com.jfinal.plugin.cron4j.Cron4jPlugin;
+import com.jfinal.plugin.druid.DruidPlugin;
+import com.jfinal.plugin.ehcache.EhCachePlugin;
+import com.jfinal.template.Engine;
+import com.model._MappingKit;
+
+import com.utils.ClassUtils;
+
+import java.util.*;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+/**
+ * 本 demo 仅表达最为粗浅的 jfinal 用法,更为有价值的实用的企业级用法
+ * 详见 JFinal 俱乐部: http://jfinal.com/club
+ *
+ * API引导式配置
+ */
+public class MyJfinalConfig extends JFinalConfig {
+
+	/**
+	 * 运行此 main 方法可以启动项目,此main方法可以放置在任意的Class类定义中,不一定要放于此
+	 *
+	 * 使用本方法启动过第一次以后,会在开发工具的 debug、run config 中自动生成
+	 * 一条启动配置,可对该自动生成的配置再添加额外的配置项,例如 VM argument 可配置为:
+	 * -XX:PermSize=64M -XX:MaxPermSize=256M
+	 */
+	public static void main(String[] args) {
+		 JFinal.start("src/main/webapp", 80, "/");
+	}
+
+	/**
+	 * 定时器插件
+	 * 在此处添加定时任务
+	 * 时间设置规则 参照jfinal官方文档
+	 * @param me
+	 */
+	private void loderCron4jPlugin(Plugins me){
+		Cron4jPlugin task = new Cron4jPlugin();
+		me.add(task);
+		me.add(new EhCachePlugin(getClass().getClassLoader().getResource("resources/ehcache.xml")));
+	}
+	/**
+	 * 配置常量
+	 */
+	public void configConstant(Constants me) {
+		PropKit.use("config.txt");
+		me.setDevMode(PropKit.getBoolean("devMode", true));
+		me.setMaxPostSize(50240000);
+	}
+
+	/**
+	 * 配置路由
+	 */
+	public void configRoute(Routes me) {
+		try{
+			registAction(me,com.controller.ReaderController.class.getPackage());
+			registAction(me,com.controller.sysconfig.SysConfigController.class.getPackage());
+			registAction(me,com.controller.report.CirculationStatisticsController.class.getPackage());
+			registAction(me,com.controller.screendisplay.ScreenHomeController.class.getPackage());
+			registAction(me,SchoolIndexController.class.getPackage());
+			registAction(me, InventoryController.class.getPackage());
+			registAction(me, LogController.class.getPackage());
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+	}
+
+	private void registAction(Routes me,Package pack) throws Exception{
+		Set<Class<?>> classSet = getClasses(pack);
+		Iterator ite = classSet.iterator();
+		while(ite.hasNext()){
+			Class cls = (Class) ite.next();
+			if(cls.isAnnotationPresent(ControllerInterface.class)){
+				ControllerInterface first = (ControllerInterface)cls.getAnnotation(ControllerInterface.class);
+				me.add(first.path(),cls);
+			}
+		}
+	}
+
+	public void configEngine(Engine me) {
+		me.addSharedFunction("/common/_layout.html"); //教育局-后台模板
+		//me.addSharedFunction("/teachBefore/_beforeLayout.html"); //教育局-前台模板
+		me.addSharedFunction("/common/_paginate.html");
+	}
+
+	/**
+	 * 配置插件
+	 */
+	public void configPlugin(Plugins me) {
+		// 配置 druid 数据库连接池插件
+		DruidPlugin druidPlugin = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
+		me.add(druidPlugin);
+
+		// 配置ActiveRecord插件
+		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
+
+		//配置日志输出
+		//SqlReporter.setLog(true);
+		//arp.setShowSql(true);
+		arp.setDialect(new MysqlDialect());
+
+		// 所有映射在 MappingKit 中自动化搞定
+		_MappingKit.mapping(arp);
+		me.add(arp);
+		loderCron4jPlugin(me);
+	}
+
+	public static DruidPlugin createDruidPlugin() {
+		return new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
+	}
+
+	/**
+	 * 配置全局拦截器
+	 */
+	public void configInterceptor(Interceptors me) {
+
+		me.add(new AuthInterceptor());
+		me.add(new LogInterceptor());
+//		me.add(new XssInterceptor());
+	}
+
+	/**
+	 * 配置处理器
+	 */
+	public void configHandler(Handlers me) {
+	//	me.add(new AuthHandler());
+		me.add(new XssHandler("[%--`~!@#$^&*()=|{}':;',\\\\[\\\\].<>/?~!@#¥……&*()――|{}【】‘;:”“'。,、?]"));
+		me.add(new WebSocketHandler("^/websocket"));
+	}
+
+	private Set<Class<?>> getClasses(Package pack) throws Exception{
+		if(JFinal.me().getConstants().getDevMode() == true){//如果是开发模式,读取WEB-INFO/classes目录下的文件
+			return ClassUtils.getClasses(pack);
+		}
+		//如果不是开发模式,读取mes.jar包中的class
+		Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
+		String packageName = pack.getName();
+		String packageDirName = packageName.replace('.', '/');
+		java.net.URL url = ReaderController.class.getProtectionDomain().getCodeSource()
+				.getLocation();
+		String filePath = java.net.URLDecoder.decode(url.getPath(), "utf-8");
+
+		Enumeration enu = new JarFile(filePath).entries();
+		while(enu.hasMoreElements()){
+			JarEntry element = (JarEntry) enu.nextElement();
+			String name = element.getName();
+			if(name.indexOf(packageDirName)>-1 &&name.toUpperCase().endsWith(".CLASS")){
+				String className = name.substring(packageName.length() + 1, name.length() - 6);
+				classes.add(Class.forName(pack.getName()+"."+className));
+			}
+		}
+		return classes;
+	}
+
+	public void afterJFinalStart() {
+	}
+}

+ 48 - 0
src/main/java/com/config/SystemConstant.java

@@ -0,0 +1,48 @@
+package com.config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 系统级静态变量
+ */
+public class SystemConstant {
+
+    public static Long TOKEN_JWT_LIFE_MINI_APP = 1000 * 60 * 30l;//jwt验证, 小程序token 生命周期,30分钟
+    public static Long TOKEN_JWT_LIFE_APP = 1000 * 60 * 60 * 24 * 30l;//jwt验证, APP程序token 生命周期,一个月
+    public static Long TOKEN_JWT_LIFE_LOCK_DEVICE = 1000 * 60 * 60 * 24 * 365l;//jwt验证, 门禁设备token 生命周期,一年
+
+    public static Integer  SUCCESS_CODE = 1000;
+    public static String  SUCCESS_MESSAGE = "成功";
+
+    public static Integer  SYSTEM_ERROR_CODE = 2000;
+    public static String  SYSTEM_ERROR_MESSAGE = "系统异常";
+
+    public static Integer  SIGN_ERROR_CODE = 2001;
+    public static String  SIGN_ERROR_MESSAGE = "签名异常";
+
+    public static Integer  OVER_TIME_CODE = 2002;
+    public static String  OVER_TIME_MESSAGE = "时间戳超时";
+
+    public static Integer  LOGIN_ERROR_CODE = 2003;
+    public static String   LOGIN_ERROR_MESSAGE = "账号密码不正确";
+
+    /**
+     * token
+     */
+    public static final int RESCODE_REFTOKEN_MSG = 1006;		//刷新TOKEN(有返回数据)
+    public static final int RESCODE_REFTOKEN = 1007;			//刷新TOKEN
+
+    public static final int JWT_ERRCODE_NULL = 4000;			//Token不存在
+    public static final int JWT_ERRCODE_EXPIRE = 4001;			//Token过期
+    public static final int JWT_ERRCODE_FAIL = 4002;			//验证不通过
+
+    /**
+     * JWT
+     */
+    public static final String JWT_SECERT = "8677df7fc3a34e26a61c034d5ec8245d";			//密匙
+
+
+
+
+}

+ 4 - 0
src/main/java/com/config/UserInterface.java

@@ -0,0 +1,4 @@
+package com.config;
+
+public interface UserInterface {
+}

+ 28 - 0
src/main/java/com/config/WebSocketHandler.java

@@ -0,0 +1,28 @@
+package com.config;
+
+import com.jfinal.handler.Handler;
+import com.jfinal.kit.StrKit;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.regex.Pattern;
+
+public class WebSocketHandler extends Handler {
+
+    private Pattern filterUrlRegxPattern;
+
+    public WebSocketHandler(String filterUrlRegx) {
+        if (StrKit.isBlank(filterUrlRegx))
+            throw new IllegalArgumentException("The para filterUrlRegx can not be blank.");
+        filterUrlRegxPattern = Pattern.compile(filterUrlRegx);
+    }
+    @Override
+    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
+        if (filterUrlRegxPattern.matcher(target).find())
+            return ;
+        else
+            next.handle(target, request, response, isHandled);
+
+    }
+
+}

+ 43 - 0
src/main/java/com/config/XssHandler.java

@@ -0,0 +1,43 @@
+package com.config;
+
+import com.jfinal.handler.Handler;
+import org.jsoup.helper.StringUtil;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.regex.Pattern;
+
+/**
+ * 全局xss过滤
+ * @author oycw
+ * @date 创建时间:2017年5月18日 下午1:45:37
+ */
+public class XssHandler extends Handler {
+
+    // 排除的url,使用的target.startsWith匹配的
+    private String excludePattern;
+
+    /**
+     * 忽略列表,使用正则
+
+     */
+    public XssHandler(String excludePattern) {
+        this.excludePattern = excludePattern;
+    }
+
+    @Override
+    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
+
+        Pattern pattern = Pattern.compile(excludePattern);
+        //带.表示非action请求,忽略(其实不太严谨,如果是伪静态,比如.html会被错误地排除);匹配excludePattern的,忽略
+        if (target.indexOf(".") == -1 && !(!StringUtil.isBlank(excludePattern) && pattern.matcher(target).find() ) ){
+            request = new XssHttpServletRequestWrapper(request);
+        }
+        //别忘了
+        next.handle(target, request, response, isHandled);
+
+    }
+
+
+
+}

+ 81 - 0
src/main/java/com/config/XssHttpServletRequestWrapper.java

@@ -0,0 +1,81 @@
+package com.config;
+
+import org.jsoup.Jsoup;
+import org.jsoup.safety.Whitelist;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 重写HttpServletRequestWrapper用于配合XssHandler
+ * @author oycw
+ * @date 创建时间:2017年5月18日 下午1:49:26
+ */
+public class XssHttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper{
+
+    public XssHttpServletRequestWrapper(HttpServletRequest request) {
+        super(request);
+    }
+
+    /**
+     * 重写并过滤getParameter方法
+     */
+    @Override
+    public String getParameter(String name) {
+        return getBasicHtmlandimage(super.getParameter(name));
+
+    }
+
+    /**
+     * 重写并过滤getParameterValues方法
+     */
+    @Override
+    public String[] getParameterValues(String name) {
+        String[] values = super.getParameterValues(name);
+        if (null == values){
+            return null;
+        }
+        for (int i = 0; i < values.length; i++) {
+            values[i] = getBasicHtmlandimage(values[i]);
+        }
+        return values;
+    }
+
+    /**
+     * 重写并过滤getParameterMap方法
+     */
+    @Override
+    public Map<String,String[]> getParameterMap() {
+        @SuppressWarnings("unchecked")
+        Map<String,String[]> paraMap = super.getParameterMap();
+        // 对于paraMap为空的直接return
+        if (null == paraMap || paraMap.isEmpty()) {
+            return paraMap;
+        }
+
+        //super.getParameterMap()不允许任何修改,所以只能做深拷贝
+        Map<String, String[]> paraMapCopy = new HashMap<String, String[]>();
+        //实际上putAll只对基本类型深拷贝有效,如果是自定义类型,则要找其他办法
+        paraMapCopy.putAll(paraMap);
+
+        for (Map.Entry<String, String[]> entry : paraMapCopy.entrySet()) {
+            String[] values     = entry.getValue();
+            if (null == values) {
+                continue;
+            }
+            String[] newValues  = new String[values.length];
+            for (int i = 0; i < values.length; i++) {
+                newValues[i] = getBasicHtmlandimage(values[i]);
+            }
+            entry.setValue(newValues);
+        }
+        return paraMapCopy;
+    }
+
+    private static String getBasicHtmlandimage(String html) {
+        if (html == null)
+            return null;
+        return Jsoup.clean(html, Whitelist.basicWithImages());
+    }
+}

+ 77 - 0
src/main/java/com/config/XssInterceptor.java

@@ -0,0 +1,77 @@
+package com.config;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import com.jfinal.log.Log;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName XssInterceptor
+ * @Description
+ * @Author zhangyanwei
+ * @Date 2020/12/3 10:07
+ * @Version 1.0
+ **/
+public class XssInterceptor implements Interceptor {
+    public static Log logger = Log.getLog(LogInterceptor.class);
+
+    public static final String[] strUrls = new String[] { "%2B", "%20", "%2F", "%3F", "%25", "%23", "%26", "%30", "%27",
+            "%26", "%22", "%28", "%29", "%2a", "%2b", "%2d", "and"
+    };
+
+    /**
+     * 过滤request的关键字
+     */
+    public static final String[] strSqls = new String[] {
+
+            " or ", "exec ", "execute ", "insert ", "select ", "delete ", "update ", "alter", "create ", " count", "\\*",
+            "chr", "asc", "mid", "master", "trunca"
+            + "te ", "declare", "xp_cmdshell", "restore",
+            "backup", "net +user", "net +localgroup +administrators", "netlocalgroup administrators","body.innerHtml","innerHtml",
+            "like'", "table", "from", "grant", "column_name", "group_concat", "information_schema.columns",
+            "table_schema", "union ", "where ", "order ", "join ", "modify",  "--", "into", "substr",
+            "ascii","having","javascript","alert","script","function","location","document","window","onclick","href","->","write","setTimeout","setInterval","</"
+            ,"referrer","<img","src","onerror","prompt","writeln","srcdoc","navigate","setTimeout","setInterval","execScript","URLUnencoded","expr","eval","\"\"\"*/","\f","\b","confir","input"
+            ,"<",">","onfocus","onblur"
+
+    };
+
+    @Override
+    public void intercept(Invocation invocation) {
+        boolean flag = true;
+        HttpServletRequest httpServletRequest = invocation.getController().getRequest();
+        logger.info(httpServletRequest.getRemoteHost());
+        Map<String, String[]> params = httpServletRequest.getParameterMap();
+        for (String string : strSqls) {
+            for (String key : params.keySet()) {
+                for (String val : params.get(key)) {
+                    if (string.equals(val) || val.indexOf(string) != -1 || val.contains(string)) {
+                        flag = false;
+
+                        /*invocation.getController().redirect("/503.html");
+                        return;*/
+                        //flag = false;
+                        // 直接拦截
+                        //invocation.getController().redirect("/503.html");
+                        //flag = false;
+                        //logger.info("xss攻击特殊拦截字符----->"+val+"String--->"+string);
+                    }
+
+                }
+            }
+        }
+            if(flag){
+                invocation.invoke();
+            }else{
+                Map result = new HashMap();
+                result.put("code","333");
+                result.put("msg","输入内容中包含非法字符!");
+                invocation.getController().renderJson(result);
+            }
+
+
+    }
+}

File diff suppressed because it is too large
+ 1613 - 0
src/main/java/com/controller/BookController.java


+ 437 - 0
src/main/java/com/controller/BookDetailController.java

@@ -0,0 +1,437 @@
+package com.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.itextpdf.text.*;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.*;
+import com.jfinal.aop.Before;
+import com.jfinal.aop.Clear;
+import com.jfinal.ext.interceptor.POST;
+import com.jfinal.kit.PathKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.Book;
+import com.model.BookDetail;
+import com.model.BookDiaobo;
+import com.model.BookZhuxiao;
+import com.service.BookDetailService;
+import com.service.SysConfigService;
+import com.tools.ISBNTools;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.krysalis.barcode4j.HumanReadablePlacement;
+import org.krysalis.barcode4j.impl.code128.Code128Bean;
+import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.font.FontRenderContext;
+import java.awt.font.TextAttribute;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.text.AttributedCharacterIterator;
+import java.text.AttributedString;
+import java.util.*;
+import java.util.List;
+
+/**
+ * 图书详细信息操作
+ * 2018-10-23
+ * wush
+ */
+@ControllerInterface(path="/bookDetail")
+public class BookDetailController extends BaseController {
+    BookDetailService service = BookDetailService.me;
+
+
+    SysConfigService sysConfigService =SysConfigService.me;
+
+    public void list(){
+        try{
+            Book bean = getBean(Book.class,"bean");
+            //根据时间排序 timesortd正序 timesorta倒序
+            String timesortd = this.getPara("bean.timesortd");
+            String timesorta = this.getPara("bean.timesorta");
+            String bookstatus = getPara("bookstatus");
+            String status = getPara("status");
+            String startDate = getPara("startDate");
+            String endDate = getPara("endDate");
+
+            String barcode = getPara("barcode");
+            Integer library = getParaToInt("library");
+            String field = this.getPara("field");
+
+
+
+
+            Page<BookDetail> page = service.paginate(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),timesortd,timesorta,bean,  bookstatus,status,library,barcode,startDate,endDate,field);
+            success(page);
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    public void booktotal(){
+        try{
+            Book bean = getBean(Book.class,"bean");
+            //根据时间排序 timesortd正序 timesorta倒序
+            String timesortd = this.getPara("bean.timesortd");
+            String timesorta = this.getPara("bean.timesorta");
+            String bookstatus = getPara("bookstatus");
+            String status = getPara("status");
+
+            String barcode = getPara("barcode");
+            Integer library = getParaToInt("library");
+            success(service.booktotal(bean,  bookstatus,status,library,barcode));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 根据书本id获取馆藏信息
+     */
+    public void findByBookId(){
+        int bookId =this.getParaToInt("bookId", 0);
+        if(bookId == 0){
+            fail();
+        }
+        success(service.findByBookId(bookId));
+    }
+
+    /**
+     * 批量保存信息
+     */
+    public void batchSaveInfo(){
+        String jstr = this.getPara("jsonStr");
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        List<BookDetail> list = JSON.parseArray(jstr,BookDetail.class);
+        service.batchSaveInfo(list,operatorid);
+        success();
+    }
+
+    /**
+     * 根据isbn查询detail列表
+     */
+    public void findDetailListById(){
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String id = getPara("id");
+        success(service.findDetailListById(id,orgid));
+    }
+
+    public void findDetailList(){
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String id = getPara("id");
+        success(service.findDetailList(id,orgid));
+    }
+
+
+    public void deleteById(){
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        int id = getParaToInt("id");
+        service.deleteById(id,orgid);
+        success();
+    }
+
+     public void deleteByDetailId(){
+         int orgid = this.getParaToInt("orgid",0);
+         if(orgid == 0) {
+             fail(1,"请求参数不完整!");
+             return;
+         }
+         int id = getParaToInt("id",0);
+         if(id == 0) {
+             fail(1,"请求参数不完整!");
+             return;
+         }
+         Record record = Db.findFirst("select d.id,d.bookid from t_book_detail d left join t_book b on d.bookid = b.id where d.id = ? and b.orgid=?",id,orgid);
+         if(CommonUtils.isNotNullOrNotEmpty(record)){
+             Db.delete("delete from t_book_detail where id = ?",record.getInt("id"));
+             success();
+         } else {
+             fail(0,"查询不到书籍信息");
+         }
+     }
+
+   public void updatePiciOrLibrary(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        Integer orgid=getParaToInt("orgid");
+        String detailid = this.getPara("detailid");
+        String libraryorpiciid = this.getPara("libraryorpiciid");
+        int type = this.getParaToInt("type");
+        if(1 == type) {
+            Db.update("update t_book_detail set libraryid=? where id = (select * from (select d.id from t_book_detail d inner join t_book b on d.bookid = b.id where d.id = ? and b.orgid = ? ) t)",libraryorpiciid,detailid,orgid);
+        }else if(type == 3){
+            //更改条码
+            Record r = Db.findFirst("SELECT COUNT(*) as num  FROM t_book_detail a INNER JOIN t_book b ON a.bookid = b.id WHERE a.id != ? AND a.barcode = ? AND b.orgid = ? ",detailid,libraryorpiciid,orgid);
+            Integer num = r.getInt("num");
+            if(num>0){
+                success(1,"该条码已存在!");
+                return;
+            }else {
+                Db.update("update t_book_detail set barcode=? where id = (select * from (select d.id from t_book_detail d inner join t_book b on d.bookid = b.id where d.id = ? and b.orgid = ? ) t)",libraryorpiciid,detailid,orgid);
+            }
+        } else {
+            Db.update("update t_book_detail set piciid=? where id = (select * from (select d.id from t_book_detail d inner join t_book b on d.bookid = b.id where d.id = ? and b.orgid = ? ) t)",libraryorpiciid,detailid,orgid);
+        }
+        success();
+    }
+
+    public void bookStatus(){
+
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        Integer orgid=getParaToInt("orgid");
+
+
+        List<String> idList =new ArrayList<String>(Arrays.asList(getParaValues("bookDetailIDList[]")));
+        List<String> bookIDList =new ArrayList<String>(Arrays.asList(getParaValues("bookIDList[]")));
+
+
+        Integer status =getParaToInt("status");
+        String reason = getPara("reason");
+        StringBuffer idsbuf=new StringBuffer();
+        for (String id :idList){
+            idsbuf.append(id).append(",");
+        }
+        idsbuf.append("-1");
+        List<Record> list =service.findNotCancelBook(idsbuf.toString());
+
+        List<String> bookTitleList = new ArrayList<String>();
+
+        for (Record r : list){
+            if (idList.contains(r.getStr("id"))){
+                idList.remove(r.getStr("id"));
+                bookTitleList.add(r.getStr("title"));
+            }
+        }
+
+        idsbuf.setLength(0);
+        for (String id :idList){
+            idsbuf.append(id).append(",");
+        }
+        idsbuf.append("-1");
+
+        service.updateBookDetailStatus(idsbuf.toString(),status,orgid,reason,operatorid);
+        service.updateBookNum(bookIDList);
+
+        success(bookTitleList);
+    }
+
+
+
+
+
+    public void findBookByBarCode(){
+        String barcode = getPara("barcode");
+        Integer orgid=getParaToInt("orgid");
+        barcode= CommonUtils.formatBarcode(barcode,sysConfigService.findOrgSetting(orgid));
+        Record record=service.findBookByBarcode(orgid,barcode);
+        if (record==null){
+            fail(0,"没有找到记录");
+        }else{
+            success(record);
+        }
+    }
+
+    public void updateRFIFByBarCode(){
+        try {
+            Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+            if(info == null){
+                fail_token();
+                return;
+            }
+            int orgid = (int)info.get("orgid");
+            String rfid=getPara("rfid");
+            String barcode = getPara("barcode");
+            service.updateRFIFByBarCode(barcode,rfid,orgid);
+            success();
+        }catch (Exception e){
+            fail(0,e.getMessage());
+        }
+
+    }
+
+
+
+    public void updateBarCode(){
+        String newbarcode=getPara("newbarcode");
+        Integer orgid=getParaToInt("orgid");
+        newbarcode= CommonUtils.formatBarcode(newbarcode,sysConfigService.findOrgSetting(orgid));
+        if (null !=service.bookBarcodeExists(orgid,newbarcode)){
+            fail(0,"新条码已经被使用,请更换条码!");
+            return;
+        }else {
+            Integer bookdetailid=getParaToInt("bookdetailid");
+            service.updateBarCode(newbarcode,bookdetailid);
+            success(newbarcode);
+        }
+    }
+
+    public void batchFindBookInfoByBarcodes(){
+        String barcodes = getPara("barcodes");
+        String tag = getPara("tag");
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+
+        String sql ="select d.rfid,d.id,d.barcode,b.title,l.library,IFNULL((SELECT j.status FROM t_jieyue j WHERE j.bookdetailid=d.id ORDER BY j.id DESC LIMIT 1),1) AS status from t_book b " +
+                "left join t_book_detail d on b.id = d.bookid " +
+                "left join t_library l on d.libraryid=l.id where d.bookstatus=1 and  b.orgid = ? and (d.barcode in ("+barcodes+") or d.rfid in ("+tag+"))";
+
+        logger.debug(sql);
+        List<Record> bookinfoList = Db.find(sql,orgid);
+        success(bookinfoList);
+    }
+
+
+
+    /**
+     * 生成条形码
+     * @param barCode 生成条码码的编号
+     * @throws Exception
+     */
+    private static byte[] genBarCodeJpg(String barCode) throws Exception{
+        Code128Bean bean = new Code128Bean();
+        final int dpi = 250;
+        //样式
+        bean.setModuleWidth(0.21);
+        bean.setBarHeight(7);
+        bean.doQuietZone(false);
+        bean.setQuietZone(2);
+
+        //两边空白区
+        bean.setFontName("Helvetica");
+        bean.setFontSize(3);
+        bean.setMsgPosition(HumanReadablePlacement.HRP_BOTTOM);
+
+        ByteArrayOutputStream out = null;
+        try {
+            out = new ByteArrayOutputStream();
+            BitmapCanvasProvider canvas = new BitmapCanvasProvider(out,
+                    "image/png", dpi, BufferedImage.TYPE_BYTE_BINARY
+                    , true, 0);
+
+            bean.generateBarcode(canvas, barCode);
+            canvas.finish();
+            return out.toByteArray();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (out != null)
+                    out.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 将条形码写入PDF文件
+     * @param pdfFile PDF类型的文件(word等需要转换为PDF)
+     * @param barCode 生成条形码的code
+     * @return
+     * @throws Exception
+     */
+    private File pdfAddControlCode(File pdfFile, String barCode)throws Exception {
+        if(CommonUtils.isNullOrEmpty(barCode)){
+            return pdfFile;
+        }
+
+        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
+        Font titlefont = new Font(bfChinese, 19, Font.NORMAL);
+//        com.itextpdf.text.Font wf = new com.itextpdf.text.Font(false, 19);
+        titlefont.setColor(BaseColor.BLUE);
+
+        InputStream is = new FileInputStream(pdfFile);
+        PdfReader reader = new PdfReader(is);
+
+        File file = File.createTempFile(String.valueOf(System.nanoTime()), ".pdf");
+        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(file));
+
+        //设置文件为只读
+        //stamp.setEncryption(null, OWNER_PASSWORD.getBytes(), 0, PdfWriter.ENCRYPTION_AES_128);
+
+        //PDF文件的总页数
+        //int number_of_pages = reader.getNumberOfPages();
+        //取得第一页
+        com.itextpdf.text.Rectangle rectangle = reader.getPageSize(0);
+        float width = rectangle.getWidth();
+        float height = rectangle.getHeight();
+
+        //是否竖版
+        //boolean direction = height >= width;
+
+        //取得PDF文件的第一页
+        // getOverContent 水印会把正文盖住    getUnderContent 水印会被正文的图片盖住
+        PdfContentByte contentByte = stamp.getOverContent(0);
+
+        PdfGState gs = new PdfGState();
+        gs.setFillOpacity(0.7f);// 设置透明度
+        gs.setStrokeOpacity(0.7f);
+        contentByte.setGState(gs);
+
+        //在第一页加上条形码
+        com.itextpdf.text.Image img = com.itextpdf.text.Image.getInstance(genBarCodeJpg(barCode));
+        img.setAlignment(1);//居中显示
+
+        //显示位置,根据需要调整
+        img.setAbsolutePosition(100, height - 40);
+
+        //显示为原条形码图片大小的比例,百分比
+        img.scalePercent(30);
+
+        contentByte.addImage(img);
+
+        stamp.close();
+        is.close();
+
+        return file;
+    }
+
+}

+ 13 - 0
src/main/java/com/controller/BookImportController.java

@@ -0,0 +1,13 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+
+@ControllerInterface(path="/bookimport")
+public class BookImportController  extends BaseController {
+
+    public void index(){
+        render("/view/book/bookimport.html");
+    }
+
+}

+ 309 - 0
src/main/java/com/controller/BookPenaltyController.java

@@ -0,0 +1,309 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.BookPenalty;
+import com.model.Org;
+import com.model.ReaderWxmsg;
+import com.service.BookPenaltyService;
+import com.service.JieyueService;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+import com.utils.ExcelExportUtil;
+import com.utils.ExcelExportUtil_template;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.*;
+
+/**
+ * 图书丢失
+ * 2018-10-23
+ * wush
+ */
+@ControllerInterface(path="/bookPenalty")
+public class BookPenaltyController extends BaseController {
+    BookPenaltyService service = BookPenaltyService.me;
+    JieyueService jieyueService = JieyueService.me;
+
+
+    public void index() {
+        render("/view/list-manage/bookPenaltyList.html");
+    }
+
+    public void bookPenaltyList(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String queryStr = this.getPara("queryStr");
+        String starttime = this.getPara("startTime");
+//        if(CommonUtils.isNotNullOrNotEmpty(starttime) && !"".equals(starttime)) {
+//
+//        }
+        String endtime = this.getPara("endTime");
+        String type = this.getPara("type");
+        String penaltystatus = this.getPara("penaltystatus");
+        success(service.bookPenaltyList(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),orgid,queryStr,starttime,endtime,type,penaltystatus));
+    }
+
+    public void bookPenaltySumPrice(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String queryStr = this.getPara("queryStr");
+        String starttime = this.getPara("startTime");
+//        if(CommonUtils.isNotNullOrNotEmpty(starttime) && !"".equals(starttime)) {
+//
+//        }
+        String endtime = this.getPara("endTime");
+        String type = this.getPara("type");
+        String penaltystatus = this.getPara("penaltystatus");
+        success(service.bookPenaltySumPrice(orgid,queryStr,starttime,endtime,type,penaltystatus));
+    }
+
+    public void exportBookPenaltyList(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String orgname = new Org().dao().findById(orgid).getOrgname();
+        String queryStr = this.getPara("queryStr");
+        String starttime = this.getPara("startTime");
+        String penaltystatus = this.getPara("penaltystatus");
+//        if(CommonUtils.isNotNullOrNotEmpty(starttime) && !"".equals(starttime)) {
+//
+//        }
+        String endtime = this.getPara("endTime");
+        String type = this.getPara("type");
+        List<Record> list = service.exportBookPenaltyList(orgid,queryStr,starttime,endtime,type,penaltystatus);
+
+
+        List list1 = new ArrayList();
+        for(Record record1:list) {
+            if(CommonUtils.isNotNullOrNotEmpty(record1.get("jieyuetime"))){
+                record1.set("jieyuetime",record1.getStr("jieyuetime").split(" ")[0]);
+            }
+            if(CommonUtils.isNotNullOrNotEmpty(record1.get("createtime"))){
+                record1.set("createtime",record1.getStr("createtime").split(" ")[0]);
+            }
+            if(CommonUtils.isNotNullOrNotEmpty(record1.get("type"))){
+                record1.set("type",record1.getInt("type")==0?"丢书":record1.getInt("type")==1?"损书":record1.getInt("type")==2?"超期":"");
+            }
+            if(CommonUtils.isNotNullOrNotEmpty(record1.get("penaltystatus"))){
+                record1.set("penaltystatus",record1.getInt("penaltystatus")==0?"记账":record1.getInt("penaltystatus")==1?"已交":record1.getInt("penaltystatus")==2?"退还":record1.getInt("penaltystatus")==3?"记账退还":"");
+            }
+            list1.add(record1);
+        }
+
+        String fields[] = {"type","cardnumber","realname","deptname","barcode","title","price","jieyuetime","createtime","penaltyamount","penaltystatus"};
+        ExcelExportUtil_template.exportExcel("图书流通费用记录.xls",this.getResponse(),orgname+"图书流通费用记录",list,fields,2);
+        renderNull();
+    }
+
+    /**
+     * 保存罚款记录
+     */
+    public void save(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+//            fail(3,"token错误");
+//            return;
+        }
+        BookPenalty bean = getBean(BookPenalty.class,"");
+        int jieyueid = bean.getJieyueid();
+        Record record = Db.findById("t_jieyue",jieyueid);
+        if (record.getInt("status") != 0) {
+            success("statusError");
+            return;
+        }
+        if(bean.getType() != 0) {
+            bean.setStatus(null);
+        }
+        int penaltystatus = bean.getInt("penaltystatus");
+        BigDecimal bigDecimal = new BigDecimal(bean.get("penaltyamount").toString());
+        if(bigDecimal.compareTo(BigDecimal.ZERO) <= 0) { //如果金额为0 则将状态修改为已缴纳
+            bean.set("penaltystatus",1);
+        }
+        bean.setCreatetime(new Date());
+        bean.setOperatorid(operatorid);
+        service.saveBookPenalty(bean);
+        if(penaltystatus == 1 &&  new BigDecimal(bean.get("penaltyamount").toString()).compareTo(BigDecimal.ZERO) > 0) {
+            ReaderWxmsg readerWxmsg = new ReaderWxmsg();
+            readerWxmsg.setContent("您已成功缴费"+bean.get("penaltyamount").toString()+"元");
+            readerWxmsg.setReaderid(bean.getReaderid());
+            readerWxmsg.setRelevanceid(bean.getId());
+            readerWxmsg.setMessagetype(3);
+            readerWxmsg.setCreatetime(new Date());
+            readerWxmsg.save();
+        }
+        int day = 0;
+        if(CommonUtils.isNotNullOrNotEmpty(getPara("day"))) {
+            day = getParaToInt("day");
+        }
+
+        BigDecimal amount = new BigDecimal(BigInteger.ZERO);
+        if(CommonUtils.isNotNullOrNotEmpty(getPara("amount"))) {
+            amount = new BigDecimal(getPara("amount"));
+        }
+        if(bean.getType() != 2 && day > 0 && amount.compareTo(BigDecimal.ZERO) > 0) {
+            bean.set("penaltystatus", penaltystatus);
+            bean.setId(null);
+            bean.setPenaltyamount(amount);
+            bean.setType(2);
+            bean.setStatus(null);
+            bean.setRemarks("超期" + day + "天罚款");
+            service.saveBookPenalty(bean);
+        }
+        jieyueService.findOverdueInfo(bean.getReaderid());
+        success();
+    }
+
+
+    /**
+     * 补交
+     */
+    public void bujiao(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String cardnumber = this.getPara("cardnumber");
+        Map map = jieyueService.findReaderInfoAndJieyueListByCardnumber(cardnumber,orgid,true);
+        if(CommonUtils.isNullOrEmpty(map.get("userInfo"))) {
+            success("查询不到读者信息");
+            return;
+        }
+        //查询读者信息
+        if(null != map.get("userInfo")) {
+            Record readerRecord = (Record) map.get("userInfo");
+            if(null != readerRecord.get("id")) {
+                int readerid = readerRecord.getInt("id");
+                Record fakuanRecord = Db.findFirst("select (select sum(penaltyamount) from t_book_penalty where readerid=? and penaltystatus=0 and penaltyamount > 0) allamount,\n" +
+                        "(select sum(penaltyamount) allamount from t_book_penalty where readerid=? and penaltystatus=0 and type=0 and penaltyamount > 0) diushu,\n" +
+                        "(select sum(penaltyamount) allamount from t_book_penalty where readerid=? and penaltystatus=0 and type=1 and penaltyamount > 0) sunshu,\n" +
+                        "(select sum(penaltyamount) allamount from t_book_penalty where readerid=? and penaltystatus=0 and type=2 and penaltyamount > 0) chaoqi",readerid,readerid,readerid,readerid);
+                map.put("fakuanRecord",fakuanRecord);
+                success(map);
+                return;
+            }
+        }
+        success("noinfo");
+    }
+
+    public void saveBujiao(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        String cardnumber = getPara("cardnumber");
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        List<Record> list = Db.find("select p.* from t_book_penalty p INNER JOIN t_reader t on p.readerid = t.id where p.penaltystatus =0 and t.cardnumber =?  and t.orgid = ? ",cardnumber,orgid);
+        batchSave(list);
+        success();
+    }
+
+    public void saveBuhuan(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int lostpenaltyid = getParaToInt("lostpenaltyid");
+        int chaoqistatus = getParaToInt("chaoqistatus");
+        String amount = getPara("amount");
+        int penaltystatus = getParaToInt("penaltystatus");
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        BigDecimal enaltyamount = null;
+        try{
+            enaltyamount = new BigDecimal(amount);
+        } catch (Exception e) {
+            fail(1,"金额异常!");
+            return;
+        }
+        BookPenalty bookPenalty = service.findByid(lostpenaltyid);
+        service.saveBuhuan(bookPenalty,chaoqistatus,penaltystatus,enaltyamount);
+        jieyueService.findOverdueInfo(bookPenalty.getReaderid());
+        success();
+    }
+
+    /**
+     * 缴纳罚款
+     */
+    public void jiaona(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String cardnumber = this.getPara("cardnumber");
+        //查询读者信息
+        Record readerRecord = Db.findFirst("select * from t_reader where cardnumber = ? and orgid=?",cardnumber,orgid);
+        int readerid = readerRecord.get("id");
+        List<Record> list = Db.find("select * from t_book_penalty where readerid=? and penaltystatus =0",readerid);
+        batchSave(list);
+    }
+
+    public void batchSave(List<Record> list){
+        for(Record record : list) {
+            Db.update("update t_book_penalty set penaltystatus = 1 WHERE id = ?",record.getInt("id"));
+            ReaderWxmsg readerWxmsg = new ReaderWxmsg();
+            readerWxmsg.setContent("您已补交罚款"+record.getStr("penaltyamount")+"元");
+            readerWxmsg.setReaderid(record.getInt("readerid"));
+            readerWxmsg.setRelevanceid(record.getInt("id"));
+            readerWxmsg.setMessagetype(3);
+            readerWxmsg.setCreatetime(new Date());
+            readerWxmsg.save();
+        }
+    }
+}

+ 110 - 0
src/main/java/com/controller/BookPiciController.java

@@ -0,0 +1,110 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.aop.Clear;
+import com.jfinal.ext.interceptor.POST;
+import com.jfinal.plugin.activerecord.Db;
+import com.model.BookDetail;
+import com.model.BookPlus;
+import com.model.Bookpici;
+import com.service.BookPiciService;
+import com.tools.JwtUtils;
+import com.validator.BookValidator;
+
+import java.util.Date;
+
+/**
+ * 图书批次
+ * 2018-10-23
+ * zj
+ */
+@ControllerInterface(path="/bookPici")
+public class BookPiciController extends BaseController {
+    BookPiciService service = BookPiciService.me;
+
+
+    public void list(){
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(Db.find("SELECT * from t_bookpici where orgid = ? ORDER BY createtime desc",orgid));
+    }
+
+    public void picilist(){
+        int orgid = this.getParaToInt("orgid",0);
+        String batchname = this.getPara("batchname");
+        String realname = this.getPara("realname");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.paginate(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),orgid,batchname,realname));
+    }
+
+    //增加
+
+    public void addOrUpdate(){
+        //必填信息
+        Bookpici bean = getBean(Bookpici.class,"bean");
+        String token = this.getPara("token");
+        int orgid = this.getParaToInt("bean.orgid");
+        try {
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            service.addOrUpdate(bean,operatorid,orgid);
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    public void delete(){
+        Bookpici bean = getBean(Bookpici.class,"bean");
+        try {
+            if(service.deleteById(bean)){
+                success(200,"操作成功");
+            }else {
+                success(4,"该批次存在书籍,不能删除");
+            }
+
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 根据机构和分类号获取最大书次号
+     */
+    public void findMaxShucihao(){
+        int orgid = this.getParaToInt("orgid",0);
+        String typecode = this.getPara("typecode");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        Long maxshucihao = service.findMaxShucihao(orgid,typecode);
+        success(maxshucihao);
+    }
+
+    /**
+     * 根据类型 查询书次号集合
+     */
+    public void findShucihaoList() {
+        int orgid = this.getParaToInt("orgid",0);
+        String typecode = this.getPara("typecode");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.findShucihaoListByTypeCode(orgid,typecode));
+    }
+
+}

+ 46 - 0
src/main/java/com/controller/BookTypeController.java

@@ -0,0 +1,46 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Db;
+import com.service.BookTypeService;
+
+/**
+ * 五大类
+ * 2018-10-22
+ * zj
+ */
+@ControllerInterface(path="/booktype")
+public class BookTypeController extends BaseController {
+    BookTypeService service = BookTypeService.me;
+    public void index() {
+        render("/view/index/index.html");
+    }
+
+    public void list(){
+        try{
+            String type = this.getPara("type");
+            success(service.paginate(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),type));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 获取22大类数据
+     */
+    public void find22Type(){
+        success(Db.find("select id parentid, name,1 childnode from t_booktype where parentid in ('1','2','3','4','5') and LENGTH(id) = 1"));
+    }
+
+    /**
+     * 根据父节点查询子节点
+     */
+    public void findByParentId(){
+        String parentid = this.getPara("parentid");
+        reData(Db.find("select id,name,if((select count(1) from t_booktype s where s.parentid = p.id)>0,true,false) childnode from t_booktype p where parentid = ?",parentid));
+    }
+
+}

+ 467 - 0
src/main/java/com/controller/BookYubianController.java

@@ -0,0 +1,467 @@
+package com.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.aop.Clear;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.upload.UploadFile;
+import com.model.Book;
+import com.model.BookDetail;
+import com.model.BookPlus;
+import com.model.BookYubian;
+import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
+import com.service.*;
+import com.tools.ISBNTools;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+import com.utils.DateUtils;
+import com.utils.ExcelUtil;
+import com.utils.MarcUtil;
+import com.validator.BookValidator;
+import org.apache.commons.io.FileUtils;
+
+import java.beans.IntrospectionException;
+import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 图书操作
+ * 2018-10-23
+ */
+@ControllerInterface(path="/bookyubian")
+public class BookYubianController extends BaseController {
+
+    BookYubianService yubianService = BookYubianService.me;
+
+    BookTypeService bookTypeService= BookTypeService.me;
+
+    DictService dictService = DictService.me;
+
+    DictExtService dictExtService = DictExtService.me;
+
+
+
+    public void list(){
+        try{
+            BookYubian bean = getBean(BookYubian.class,"bean");
+            //根据时间排序 timesortd正序 timesorta倒序
+            String timesortd = this.getPara("bean.timesortd");
+            String timesorta = this.getPara("bean.timesorta");
+            String bookstatus = getPara("bookstatus");
+            Page<Record> page =  yubianService.paginate(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),timesortd,timesorta,bean,  bookstatus);
+            success(page);
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+
+    }
+
+
+
+    public void upload() {
+        try {
+            String token = this.getPara("token");
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if (operatorid == 0) {
+                fail(3, "token错误");
+                return;
+            }
+            int orgid = getParaToInt("orgid");
+            Record orgRecord = Db.findById("t_org",orgid);
+            SimpleDateFormat datesf = new SimpleDateFormat("yyyy-MM-dd");
+            //List<String> booktypeList=bookTypeService.booktype();
+            Map<String,Integer> dictmap = dictService.dictmap();
+
+            List<Map<String,String>> errorDataList = new ArrayList<Map<String,String>>();
+            UploadFile file =getFile();
+            List<Map<String,String>> bookList= ExcelUtil.readExcel(new FileInputStream(file.getFile()));
+            for (Map<String,String> bookMap : bookList) {
+                try{
+                    BookYubian book=new BookYubian();
+                    book.setOrgid(orgid);
+
+                    book.setIsbn(bookMap.get("ISBN"));
+                    if (book.getIsbn()==null || book.getIsbn().trim().equals("")){
+                        bookMap.put("未导入原因","ISBN不能为空!");
+                        errorDataList.add(bookMap);
+                        continue;
+                    }
+                    book.setTitle(bookMap.get("正题名"));
+                    if (book.getTitle()==null || book.getTitle().trim().equals("")){
+                        bookMap.put("未导入原因","正题名不能为空!");
+                        errorDataList.add(bookMap);
+                        continue;
+                    }
+
+                    book.setBltitle(bookMap.get("并列题名"));
+                    book.setSubtitle(bookMap.get("副题名"));
+                    book.setAuthor(bookMap.get("著者"));
+                    if (book.getTitle()==null || book.getTitle().trim().equals("")){
+                        bookMap.put("未导入原因","著者不能为空!");
+                        errorDataList.add(bookMap);
+                        continue;
+                    }
+                    book.setAuthorworkmodeid(dictmap.get(bookMap.get("著作方式")));
+                    if (book.getAuthorworkmodeid()==null ){
+                       book.setAuthorworkmodeid(7);//默认编著
+                    }
+                    book.setAuthorguobieid(dictmap.get(bookMap.get("国别或朝代")));
+                    if (book.getAuthorguobieid() ==null){
+                        book.setAuthorguobieid(20); //默认中
+                    }
+
+                    book.setPublisher(bookMap.get("出版社"));
+                    book.setPublishaddress(bookMap.get("出版地"));
+                    book.setPublishdate(bookMap.get("出版年月"));
+
+                    book.setEdition(bookMap.get("版本版次"));
+
+                    book.setPrice(new BigDecimal(bookMap.get("定价(元)")));
+                    book.setSizeid(dictmap.get(bookMap.get("尺寸")));
+
+
+                    book.setTypecode(bookMap.get("分类号"));
+                    if (book.getTypecode()==null || book.getTypecode().trim().equals("") /*|| !booktypeList.contains(book.getTypecode())*/){
+                        bookMap.put("未导入原因","分类号不正确!");
+                        errorDataList.add(bookMap);
+                        continue;
+                    }
+                    String typeid= book.getTypecode().substring(0,1);
+                    book.setTypeid(typeid);//22大类ID
+
+                    book.setJuanci(bookMap.get("卷次"));
+                    book.setCeci(bookMap.get("册次"));
+                    book.setBindingid(dictmap.get(bookMap.get("装订")));
+                    if (book.getBindingid() ==null){
+                        book.setBindingid(45);//默认平装
+                    }
+                    if (bookMap.get("页数")!=null && !bookMap.get("页数").equals("")){
+                        book.setTotalpages(Integer.parseInt(bookMap.get("页数")));
+                    }
+
+
+                    book.setOperatorid(operatorid);
+                    book.save();
+
+                    Thread t = new Thread() {
+                        public void run() {
+                            String getUrl = PropKit.get("z3950url")+"/bookyubian/addBookYubian";
+                            Map<String,String> param  = null;
+                            try {
+                                param = CommonUtils.convertBeanToMap(book);
+                            } catch (IntrospectionException e) {
+                                e.printStackTrace();
+                            } catch (IllegalAccessException e) {
+                                e.printStackTrace();
+                            } catch (InvocationTargetException e) {
+                                e.printStackTrace();
+                            }
+                            if (CommonUtils.isNullOrEmpty(param)){
+                                param = new HashMap();
+                            }
+                            param.put("org",orgRecord.getStr("orgname"));
+                            try {
+                                getUrl = CommonUtils.buildUrl(getUrl,param);
+                            } catch (UnsupportedEncodingException e) {
+                                e.printStackTrace();
+                            }
+                            String z3950str = CommonUtils.requestUrl(getUrl);
+                            Map result = (Map)JSON.parse(z3950str);
+                            //上传失败
+                            if (!"200".equals(result.get("code")+"")){
+                                logger.error("上传图书预编数据到z3950失败:"+result.get("msg"));
+                            }
+                        }
+                    };
+                    t.start();
+                }catch (Exception e){
+                    if (e instanceof ParseException){
+                        bookMap.put("未导入原因","日期格式不正确");
+                    }else  if (e.getMessage().indexOf("Duplicate") !=-1){
+                            bookMap.put("未导入原因","重复数据!");
+                    }else{
+                        bookMap.put("未导入原因",e.getMessage());
+                    }
+                    errorDataList.add(bookMap);
+                }
+            }
+            String filename="";
+            if (errorDataList.size()>0){
+                filename="图书未导入列表"+ DateUtils.getNowTimeNo()+".xls";
+                File targetFile =new File(getRequest().getRealPath("upload")+ File.separator+filename);
+                ExcelUtil.writeExcel(targetFile,errorDataList,"图书未导入列表");
+            }
+            success(filename);
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail(0,e.getMessage());
+        }
+    }
+
+    public void uploadMarc() {
+        List errorDataList = new ArrayList();
+        String filename = "importfail"+CommonUtils.getUUID()+".xls";
+        File targetFile =new File(getRequest().getRealPath("upload")+"/"+filename);
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if (operatorid == 0) {
+            fail(3, "token错误");
+            return;
+        }
+        int orgid = getParaToInt("orgid");
+        Record orgRecord = Db.findById("t_org",orgid);
+        Map<String,String> dictExtMap = dictExtService.dictExtMap();
+        UploadFile file =getFile();
+        List<String> bookLineStrList = null;
+        try {
+            bookLineStrList = FileUtils.readLines(file.getFile(),"GBK");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        Map<String,Integer> guobieMap = dictService.dictnametokey(1);
+        Map<String,Integer> workmodeidMap = dictService.dictnametokey(0);
+        Map<String,Integer> sizeidMap = dictService.dictnametokey(3);
+        Map<String,Integer> languageidMap = dictService.dictnametokey(4);
+        Map<String,Integer> bindingidMap = dictService.dictnametokey(5);
+        List<Record> expRecordList = Db.find("select CONCAT(fieldid,subfieldid) exp,sysfield formname from t_sysmkf where formname is not null");
+        for (String book : bookLineStrList){
+            BookYubian bookYubian = new BookYubian();
+            try {
+                List<Map<String,String>> list = MarcUtil.showMarc(book.getBytes("GBK"));
+                Record marcRecord = MarcUtil.mapToRecord(list.get(0),expRecordList);
+                marcRecord.set("totalpages",Integer.parseInt(marcRecord.getStr("totalpages").replace(",","")));
+                bookYubian.put(marcRecord);
+
+                if(CommonUtils.isNotNullOrNotEmpty(bookYubian.get("workmodeid"))) {
+                    if(CommonUtils.isNullOrEmpty(workmodeidMap.get(bookYubian.get("workmodeid")))) {
+                        String errorInfo = bookYubian.get("workmodeid");
+                        bookYubian.put("errorInfo", errorInfo + "著作方式的值不正确");
+                        throw new Exception();
+                    }
+                    int zzfsid = workmodeidMap.get(bookYubian.get("workmodeid"));
+                    if (zzfsid == 0) {
+                        String errorInfo = bookYubian.get("workmodeid");
+                        bookYubian.put("errorInfo", errorInfo + "著作方式的值不正确");
+                        throw new Exception();
+                    } else {
+                        bookYubian.set("workmodeid",zzfsid);
+                    }
+                }
+
+                if(CommonUtils.isNotNullOrNotEmpty(bookYubian.get("guobie"))) {
+                    if(CommonUtils.isNullOrEmpty(guobieMap.get(bookYubian.get("guobie")))) {
+                        String errorInfo = bookYubian.get("guobie");
+                        bookYubian.put("errorInfo", errorInfo + "国别的值不正确");
+                        throw new Exception();
+                    }
+                    int zzfsid = guobieMap.get(bookYubian.get("guobie"));
+                    if (zzfsid == 0) {
+                        String errorInfo = bookYubian.get("guobie");
+                        bookYubian.put("errorInfo", errorInfo + "国别的值不正确");
+                        throw new Exception();
+                    } else {
+                        bookYubian.set("guobie",zzfsid);
+                    }
+                }
+
+                if(CommonUtils.isNotNullOrNotEmpty(bookYubian.get("sizeid"))) {
+                    if(CommonUtils.isNullOrEmpty(sizeidMap.get(bookYubian.get("sizeid")))) {
+                        String errorInfo = bookYubian.get("sizeid");
+                        bookYubian.put("errorInfo", errorInfo + "尺寸的值不正确");
+                        throw new Exception();
+                    }
+                    int zzfsid = sizeidMap.get(bookYubian.get("sizeid"));
+                    if (zzfsid == 0) {
+                        String errorInfo = bookYubian.get("sizeid");
+                        bookYubian.put("errorInfo", errorInfo + "尺寸的值不正确");
+                        throw new Exception();
+                    } else {
+                        bookYubian.set("sizeid",zzfsid);
+                    }
+                }
+
+                if(CommonUtils.isNotNullOrNotEmpty(bookYubian.get("languageid"))) {
+                    if(CommonUtils.isNullOrEmpty(languageidMap.get(bookYubian.get("languageid")))) {
+                        String errorInfo = bookYubian.get("languageid");
+                        bookYubian.put("errorInfo", errorInfo + "语种的值不正确");
+                        throw new Exception();
+                    }
+                    int zzfsid = languageidMap.get(bookYubian.get("languageid"));
+                    if (zzfsid == 0) {
+                        String errorInfo = bookYubian.get("languageid");
+                        bookYubian.put("errorInfo", errorInfo + "语种的值不正确");
+                        throw new Exception();
+                    } else {
+                        bookYubian.set("languageid",zzfsid);
+                    }
+                }
+
+                if(CommonUtils.isNotNullOrNotEmpty(bookYubian.get("bindingid"))) {
+                    if(CommonUtils.isNullOrEmpty(bindingidMap.get(bookYubian.get("bindingid")))) {
+                        String errorInfo = bookYubian.get("bindingid");
+                        bookYubian.put("errorInfo", errorInfo + "装订形式的值不正确");
+                        throw new Exception();
+                    }
+                    int zzfsid = bindingidMap.get(bookYubian.get("bindingid"));
+                    if (zzfsid == 0) {
+                        String errorInfo = bookYubian.get("bindingid");
+                        bookYubian.put("errorInfo", errorInfo + "装订形式的值不正确");
+                        throw new Exception();
+                    } else {
+                        bookYubian.set("bindingid",zzfsid);
+                    }
+                }
+
+                bookYubian = (BookYubian)CommonUtils.checkedAtImport(bookYubian,dictExtMap);
+                if(CommonUtils.isNullOrEmpty(bookYubian.get("errorInfo"))) {
+                    throw new Exception();
+                }
+                bookYubian.set("orgid",orgid);
+                if(CommonUtils.isNullOrEmpty(bookYubian.getIsbn()) && CommonUtils.isNullOrEmpty(bookYubian.getTitle())) {
+                    bookYubian.put("errorInfo", "ISBN或正题名不能为空");
+                    throw new Exception();
+                } else {
+                    bookYubian.save();
+
+                    BookYubian finalBookYubian = bookYubian;
+                    Thread t = new Thread() {
+                        public void run() {
+                            String getUrl = PropKit.get("z3950url")+"/bookyubian/addBookYubian";
+                            Map<String,String> param  = null;
+                            try {
+                                param = CommonUtils.convertBeanToMap(finalBookYubian);
+                            } catch (IntrospectionException e) {
+                                e.printStackTrace();
+                            } catch (IllegalAccessException e) {
+                                e.printStackTrace();
+                            } catch (InvocationTargetException e) {
+                                e.printStackTrace();
+                            }
+                            if (CommonUtils.isNullOrEmpty(param)){
+                                param = new HashMap();
+                            }
+                            param.put("org",orgRecord.getStr("orgname"));
+                            try {
+                                getUrl = CommonUtils.buildUrl(getUrl,param);
+                            } catch (UnsupportedEncodingException e) {
+                                e.printStackTrace();
+                            }
+                            String z3950str = CommonUtils.requestUrl(getUrl);
+                            Map result = (Map)JSON.parse(z3950str);
+                            //上传失败
+                            if (!"200".equals(result.get("code")+"")){
+                                logger.error("上传图书预编数据到z3950失败:"+result.get("msg"));
+                            }
+                        }
+                    };
+                    t.start();
+
+
+                }
+            } catch (Exception e) {
+                Map errorInfoMap = new LinkedHashMap();
+                errorInfoMap.put("22大类","");
+                errorInfoMap.put("分类号",bookYubian.get("typecode"));
+                errorInfoMap.put("书次号",bookYubian.get("shucihao"));
+                errorInfoMap.put("复本数","");
+                errorInfoMap.put("ISBN",bookYubian.get("ISBN"));
+                errorInfoMap.put("正题名",bookYubian.get("title"));
+                errorInfoMap.put("出版社",bookYubian.get("publisher"));
+                errorInfoMap.put("主题词",bookYubian.get("keyword"));
+                errorInfoMap.put("版本版次",bookYubian.get("version"));
+                errorInfoMap.put("作者",bookYubian.get("author"));
+                errorInfoMap.put("国别或朝代",bookYubian.get("guobieid"));
+                errorInfoMap.put("索书号",bookYubian.get("bookno"));
+                errorInfoMap.put("出版地",bookYubian.get("publishaddress"));
+                errorInfoMap.put("定价",bookYubian.get("price"));
+                errorInfoMap.put("图书新增来源","");
+                errorInfoMap.put("错误原因",bookYubian.get("errorInfo"));
+                errorDataList.add(errorInfoMap);
+            }
+        }
+        if(errorDataList.size() > 0) {
+            ExcelUtil.writeExcel(targetFile, errorDataList, "图书未导入列表");
+            success(filename);
+        }else {
+            success("导入成功");
+        }
+    }
+
+    public void delete(){
+        try{
+
+            String[] bookIDList= getParaValues("bookIDList[]");
+            for (String id : bookIDList){
+                yubianService.deleteByID(Integer.parseInt(id));
+            }
+            success();
+        }catch (Exception e){
+            fail();
+        }
+    }
+
+
+    public void findBookInfo(){
+        success(yubianService.findBookYubianByID(getParaToInt("id")));
+    }
+
+    public void saveOrUpdate(){
+        try{
+            BookYubian bookYubian=getBean(BookYubian.class,"bean");
+            if (bookYubian.getTypeid() ==null){
+                bookYubian.setTypeid(bookYubian.getTypecode().substring(0,1));
+            }
+            yubianService.saveOrUpdate(bookYubian);
+
+            Record orgRecord = Db.findById("t_org",bookYubian.getOrgid());
+            Thread t = new Thread() {
+                public void run() {
+                    String getUrl = PropKit.get("z3950url")+"/bookyubian/addBookYubian";
+                    Map<String,String> param  = null;
+                    try {
+                        param = CommonUtils.convertBeanToMap(bookYubian);
+                    } catch (IntrospectionException e) {
+                        e.printStackTrace();
+                    } catch (IllegalAccessException e) {
+                        e.printStackTrace();
+                    } catch (InvocationTargetException e) {
+                        e.printStackTrace();
+                    }
+                    if (CommonUtils.isNullOrEmpty(param)){
+                        param = new HashMap();
+                    }
+                    param.put("org",orgRecord.getStr("orgname"));
+                    try {
+                        getUrl = CommonUtils.buildUrl(getUrl,param);
+                    } catch (UnsupportedEncodingException e) {
+                        e.printStackTrace();
+                    }
+                    String z3950str = CommonUtils.requestUrl(getUrl);
+                    Map result = (Map)JSON.parse(z3950str);
+                    //上传失败
+                    if (!"200".equals(result.get("code")+"")){
+                        logger.error("上传图书预编数据到z3950失败:"+result.get("msg"));
+                    }
+                }
+            };
+            t.start();
+
+            success();
+        }catch (Exception e){
+            fail();
+        }
+    }
+
+
+}

+ 67 - 0
src/main/java/com/controller/CardTypeController.java

@@ -0,0 +1,67 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.model.Cardtype;
+import com.model.Jieyue;
+import com.service.CardTypeService;
+import com.service.JieyueService;
+import com.tools.JwtUtils;
+import com.validator.CardTypeValidator;
+import com.validator.JieyueValidator;
+
+/**
+ * 读者卡类型
+ * 2018-10-22
+ * zj
+ */
+@ControllerInterface(path="/cardtype")
+public class CardTypeController extends BaseController {
+    CardTypeService service = CardTypeService.me;
+    public void index() {
+        render("/view/index/index.html");
+    }
+
+    public void list(){
+        try{
+            Cardtype bean = getBean(Cardtype.class,"bean");
+            success(service.paginate(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),bean));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    public void getById(){
+        int id =this.getParaToInt("bean.id", 0);
+        if(id == 0){
+            fail();
+            return;
+        }
+        success(service.findById(id));
+    }
+
+    @Before(CardTypeValidator.class)
+    public void addOrUpdate(){
+        Cardtype bean = getBean(Cardtype.class,"bean");
+        String token = this.getPara("token");
+        try {
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            service.addOrUpdate(bean,operatorid);
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    public void delete(){
+        int id =this.getParaToInt("bean.id");
+        service.deleteById(this.getParaToInt("bean.id", 0));
+        success();
+    }
+
+}

+ 333 - 0
src/main/java/com/controller/CheckBookController.java

@@ -0,0 +1,333 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.upload.UploadFile;
+import com.model.Book;
+import com.model.BookZhuxiao;
+import com.service.BookService;
+import com.utils.CommonUtils;
+import com.utils.ExcelExportUtil;
+import com.utils.ExcelUtil;
+import org.apache.poi.ss.usermodel.*;
+
+import java.io.*;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 图书盘查
+ * 2018-10-23
+ * zj
+ */
+@ControllerInterface(path="/checkBook")
+public class CheckBookController extends BaseController {
+    public Log logger = Log.getLog(CheckBookController.class);
+    BookService service = BookService.me;
+
+    /**
+     * 用户上传txt文件,读取文件后获取里面所有条码,并且查出所有上传条码以外的图书列表
+     */
+    public void findListByUploadFiles(){
+        List<UploadFile> list = getFiles();
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        for(UploadFile uploadFile : list) {
+            List<Record> barcodeList = new ArrayList();
+            String fileext = uploadFile.getOriginalFileName().substring(uploadFile.getOriginalFileName().lastIndexOf(".")+1);
+            FileReader reader = null;//定义一个fileReader对象,用来初始化BufferedReader
+            try {
+                if(fileext.equals("txt")){
+                    reader = new FileReader(uploadFile.getFile());
+                    BufferedReader bReader = new BufferedReader(reader);//new一个BufferedReader对象,将文件内容读取到缓存
+                    String s = "";
+                    while ((s =bReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格
+                        if(s.length() > 20) {
+                            fail(0,"条码异常!");
+                            return;
+                        }
+                        Record record = new Record();
+                        record.set("barcode",s);
+                        record.set("orgid",orgid);
+                        barcodeList.add(record);
+                    }
+                    bReader.close();
+                } else if (fileext.equals("xls")){
+                    List<String> lit = readExcel(new FileInputStream(uploadFile.getFile()));
+                    for(String str : lit){
+                        Record record = new Record();
+                        record.set("barcode",str);
+                        record.set("orgid",orgid);
+                        barcodeList.add(record);
+                    }
+                } else if (fileext.equals("xlsx")){
+                    List<String> lit = readExcel(new FileInputStream(uploadFile.getFile()));
+                    for(String str : lit){
+                        Record record = new Record();
+                        record.set("barcode",str);
+                        record.set("orgid",orgid);
+                        barcodeList.add(record);
+                    }
+                }
+                Db.batchSave("t_temp_bookinfo",barcodeList,1000);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        success();
+    }
+
+    public void findList(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        String select = "SELECT isbn,title,author,publisher,c.barcode,a.bookno";
+        StringBuilder where = new StringBuilder(" FROM t_book a INNER JOIN t_book_detail c ON a.id = c.bookid LEFT JOIN ( SELECT * FROM t_temp_bookinfo WHERE orgid =? ) t ON c.barcode = t.barcode WHERE a.orgid =? AND t.barcode IS NULL ");
+        List<Object> paramList =new ArrayList<Object>();
+        paramList.add(orgid);
+        paramList.add(orgid);
+        String orderby = getPara("orderby");
+        if(CommonUtils.isNotNullOrNotEmpty(orderby)){
+            where.append(orderby);
+        }
+        Page page = Db.paginate(getParaToInt("pageNumber",1),getParaToInt("pageSize",10),select,where.toString(),CommonUtils.listToArray(paramList));
+        success(page);
+    }
+
+    public void findZhuxiaoCount(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        success(Db.findFirst("SELECT count(*) ct FROM t_book a INNER JOIN t_book_detail c ON a.id = c.bookid WHERE a.orgid =? and barcode not in (select barcode from t_temp_bookinfo where orgid = ?)",orgid,orgid));
+    }
+    /**
+     * 用户上传txt文件,读取文件后获取里面所有条码,并且查出所有上传条码以外的图书列表
+     * 注销上述列表的所有图书
+     */
+    public void batchZhuxiao(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        Calendar calendar = Calendar.getInstance();
+        List<BookZhuxiao> list = new ArrayList<>();
+        List<Record> list1 = Db.find("SELECT c.id,a.id bookid FROM t_book a INNER JOIN t_book_detail c ON a.id = c.bookid WHERE a.orgid =? and barcode not in (select barcode from t_temp_bookinfo where orgid = ?)",orgid,orgid);
+        for(Record record : list1) {
+            BookZhuxiao bookZhuxiao = new BookZhuxiao();
+            bookZhuxiao.setOrgid(orgid);
+            bookZhuxiao.setBookdetailid(record.getInt("id"));
+            bookZhuxiao.setBookid(record.getInt("bookid"));
+            bookZhuxiao.setFlag(0);
+            bookZhuxiao.setReason("盘点注销");
+            bookZhuxiao.setStatus(0);
+            bookZhuxiao.setCreatetime(calendar.getTime());
+            list.add(bookZhuxiao);
+        }
+        Db.batchSave(list,1000);
+        int count = Db.update("update t_book_detail set `status` = 3,destroytime=? where id in (select * from (SELECT c.id FROM t_book a INNER JOIN t_book_detail c ON a.id = c.bookid WHERE a.orgid =? and barcode not in (select barcode from t_temp_bookinfo where orgid = ?)) t)",new Date(),orgid,orgid);
+        Db.delete("delete from t_temp_bookinfo where orgid = ?",orgid);
+        success(count);
+    }
+
+
+    /**
+     * 用户上传txt文件,读取文件后获取里面所有条码,并且根据条码查出图书列表
+     */
+    public void findListByUploadFilesEx(){
+        List<UploadFile> list = getFiles();
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        for(UploadFile uploadFile : list) {
+            List<Record> barcodeList = new ArrayList();
+            try {
+                String fileext = uploadFile.getOriginalFileName().substring(uploadFile.getOriginalFileName().lastIndexOf(".")+1);
+                if(fileext.equals("txt")){
+                    FileReader reader = null;//定义一个fileReader对象,用来初始化BufferedReader
+                    reader = new FileReader(uploadFile.getFile());
+                    BufferedReader bReader = new BufferedReader(reader);//new一个BufferedReader对象,将文件内容读取到缓存
+                    String s = "";
+                    while ((s =bReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格
+                        if(s.length() > 20) {
+                            fail(0,"条码异常!");
+                            return;
+                        }
+                        Record record = new Record();
+                        record.set("barcode",s);
+                        record.set("orgid",orgid);
+                        barcodeList.add(record);
+                    }
+                    bReader.close();
+                } else if (fileext.equals("xls")){
+                    List<String> lit = readExcel(new FileInputStream(uploadFile.getFile()));
+                    for(String str : lit){
+                        Record record = new Record();
+                        record.set("barcode",str);
+                        record.set("orgid",orgid);
+                        barcodeList.add(record);
+                    }
+                } else if (fileext.equals("xlsx")){
+                    List<String> lit = readExcel(new FileInputStream(uploadFile.getFile()));
+                    for(String str : lit){
+                        Record record = new Record();
+                        record.set("barcode",str);
+                        record.set("orgid",orgid);
+                        barcodeList.add(record);
+                    }
+                }
+                Db.batchSave("t_temp_bookinfo",barcodeList,1000);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        success();
+    }
+
+    public void findListEx(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        String select = "select * ";
+        StringBuilder where = new StringBuilder(" from ( SELECT isbn,title,author,publisher,d.barcode,b.bookno from t_temp_bookinfo t inner join t_book_detail d on t.barcode = d.barcode left join t_book b on d.bookid = b.id where t.orgid= ? and b.orgid = ? group by d.barcode ) t ");
+        List<Object> paramList =new ArrayList<Object>();
+        paramList.add(orgid);
+        paramList.add(orgid);
+        String orderby = getPara("orderby");
+        if(CommonUtils.isNotNullOrNotEmpty(orderby)){
+            where.append(orderby);
+        }
+        Page page = Db.paginate(getParaToInt("pageNumber",1),getParaToInt("pageSize",10),select,where.toString(),CommonUtils.listToArray(paramList));
+        success(page);
+    }
+
+    public void findZhuxiaoCountEx(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        success(Db.findFirst("SELECT count(*) ct FROM t_book a INNER JOIN t_book_detail c ON a.id = c.bookid WHERE a.orgid =? and barcode in (select barcode from t_temp_bookinfo where orgid = ?)",orgid,orgid));
+    }
+
+    /**
+     * 用户上传txt文件,读取文件后获取里面所有条码 并注销
+     */
+    public void batchZhuxiaoEx(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        Calendar calendar = Calendar.getInstance();
+        List<BookZhuxiao> list = new ArrayList<>();
+        List<Record> list1 = Db.find("SELECT c.id,a.id bookid FROM t_book a INNER JOIN t_book_detail c ON a.id = c.bookid WHERE a.orgid =? and barcode in (select barcode from t_temp_bookinfo where orgid = ?)",orgid,orgid);
+        for(Record record : list1) {
+            BookZhuxiao bookZhuxiao = new BookZhuxiao();
+            bookZhuxiao.setOrgid(orgid);
+            bookZhuxiao.setBookdetailid(record.getInt("id"));
+            bookZhuxiao.setBookid(record.getInt("bookid"));
+            bookZhuxiao.setFlag(0);
+            bookZhuxiao.setReason("盘点注销");
+            bookZhuxiao.setStatus(0);
+            bookZhuxiao.setCreatetime(calendar.getTime());
+            list.add(bookZhuxiao);
+        }
+        Db.batchSave(list,1000);
+        int count = Db.update("update t_book_detail set `status` = 3,destroytime=? where id in (select * from (SELECT c.id FROM t_book a INNER JOIN t_book_detail c ON a.id = c.bookid WHERE a.orgid =? and barcode in (select barcode from t_temp_bookinfo where orgid = ?)) t)",new Date(),orgid,orgid);
+        Db.delete("delete from t_temp_bookinfo where orgid = ?",orgid);
+        success(count);
+    }
+
+    public List<String> readExcel(InputStream in){
+        List<String> dataList = new ArrayList();
+        try{
+            // 获得工作簿
+            Workbook workbook = WorkbookFactory.create(in);
+            // 获得工作表个数
+            int sheetCount = workbook.getNumberOfSheets();
+            // 遍历工作表
+            for (int i = 0; i < sheetCount; i++)
+            {
+                Sheet sheet = workbook.getSheetAt(i);
+                // 获得行数
+                int rows = sheet.getLastRowNum() + 1;
+                // 读取数据
+                for (int rownum = 0; rownum < rows; rownum++)
+                {
+                    String info = "";;
+                    Row r = sheet.getRow(rownum);
+                    if(r ==null) continue;
+                    boolean flag = false; //行数据全部为空,不继续读
+                    for (int col = 0; col < sheet.getRow(0).getLastCellNum(); col++)
+                    {
+                        Cell cell = r.getCell(col);
+                        if(cell !=null){
+                            String value = getCellValue(cell);
+                            if (!"".equals(value.trim())){
+                                flag=true;
+                            }
+                            info = value;
+                        }
+                    }
+                    if (flag){
+                        dataList.add(info);
+                    }
+                }
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dataList;
+    }
+
+    public String getCellValue(Cell cell){
+        if(cell.getCellType() == CellType.NUMERIC){
+            short format = cell.getCellStyle().getDataFormat();
+            SimpleDateFormat sdf = null;
+            if(format == 14 || format == 31 || format == 57 || format == 58){
+                //日期
+                sdf = new SimpleDateFormat("yyyy-MM-dd");
+            }else if (format == 20 || format == 32) {
+                //时间
+                sdf = new SimpleDateFormat("HH:mm");
+            }else { // 不是日期格式
+                NumberFormat nf = NumberFormat.getInstance();
+                String s = nf.format(cell.getNumericCellValue());
+                if (s.indexOf(",") >= 0) {
+                    s = s.replace(",", "");
+                }
+                return s;
+            }
+            double value = cell.getNumericCellValue();
+            Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
+            return sdf.format(date);
+        } else if (cell.getCellType() == CellType.BOOLEAN){
+            return cell.getBooleanCellValue()+"";
+        }else {
+            return cell.getStringCellValue();
+        }
+
+    }
+}

+ 16 - 0
src/main/java/com/controller/DefaultPageController.java

@@ -0,0 +1,16 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.kit.PropKit;
+import com.service.BookTypeService;
+
+@ControllerInterface(path="/")
+public class DefaultPageController extends BaseController {
+
+    public void index() {
+        render(PropKit.get("login_page_url"));
+    }
+
+
+}

+ 45 - 0
src/main/java/com/controller/DictController.java

@@ -0,0 +1,45 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.model.Dict;
+import com.service.DictService;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@ControllerInterface(path="/dict")
+public class DictController extends BaseController {
+
+    DictService service =DictService.me;
+
+    public void list(){
+        Integer type= getParaToInt("type");
+        success(service.list(type));
+    }
+
+    public void findDict(){
+        Map map = new HashMap();
+        List<Dict> list0 = service.list(0);
+        List<Dict> list1 = service.list(1);
+        List<Dict> list2 = service.list(2);
+        List<Dict> list3 = service.list(3);
+        List<Dict> list4 = service.list(4);
+        List<Dict> list5 = service.list(5);
+        List<Dict> list6 = service.list(6);
+        List<Dict> list7 = service.list(7);
+        List<Dict> list8 = service.list(8);
+        map.put("list0",list0);
+        map.put("list1",list1);
+        map.put("list2",list2);
+        map.put("list3",list3);
+        map.put("list4",list4);
+        map.put("list5",list5);
+        map.put("list6",list6);
+        map.put("list7",list7);
+        map.put("list8",list8);
+        success(map);
+    }
+}

+ 223 - 0
src/main/java/com/controller/FileController.java

@@ -0,0 +1,223 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.aop.Clear;
+import com.jfinal.log.Log;
+import com.jfinal.upload.UploadFile;
+import com.model.Book;
+import com.model.BookDetail;
+import com.model.BookPlus;
+import com.service.BookService;
+import com.tools.JwtUtils;
+import com.validator.BookValidator;
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@ControllerInterface(path="/file")
+public class FileController extends BaseController {
+
+    Log log =Log.getLog(this.getClass().getName());
+
+    public void index() {
+        render("/filedemo.html");
+    }
+
+    java.text.SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+    static String file_ext_str = ".xls,.xlsx,.doc,.docx,.pdf,.jpg,.png,.gif,.jpeg,.iso";
+
+    public void uploadImage(){
+        try{
+            UploadFile file =getFile();
+
+            String filename = file.getFileName();
+            String ext = filename.substring(filename.lastIndexOf("."));
+            if(file_ext_str.indexOf(ext) == -1){
+                fail(1,"文件格式不正确,支持的文件类型为:"+file_ext_str);
+                return;
+            }
+            Map<String,String> map = new HashMap<String,String>();
+
+            Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+            if(info == null){
+                fail_token();
+                return;
+            }
+            int orgid = (int)info.get("orgid");
+            String dirpath = orgid +"/"+info.get("userid")+"/"+sf.format(new Date());
+            String path ="/"+dirpath + "/" + file.getFileName();
+            File targetFile =new File(getRequest().getRealPath("upload")+path);
+            if (targetFile.exists()){
+                FileUtils.forceDelete(targetFile);
+            }
+            FileUtils.moveFile(file.getFile(), targetFile);
+            map.put("src", "/"+"upload"+ path);
+            map.put("title",file.getFileName());
+            success(200,"调用成功",map);
+        }catch (Exception e) {
+            fail();
+        }
+    }
+
+    public void layuiUploadImage(){
+        try{
+            UploadFile file =getFile();
+            String filename = file.getFileName();
+            String ext = filename.substring(filename.lastIndexOf("."));
+            if(file_ext_str.indexOf(ext) == -1){
+                fail(1,"文件格式不正确,支持的文件类型为:"+file_ext_str);
+                return;
+            }
+            Map<String,String> map = new HashMap<String,String>();
+
+            Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+            if(info == null){
+                fail_token();
+                return;
+            }
+            int orgid = (int)info.get("orgid");
+            String dirpath = orgid +"/"+info.get("userid")+"/"+sf.format(new Date());
+            String path ="/"+dirpath + "/" + file.getFileName();
+            File targetFile =new File(getRequest().getRealPath("upload")+path);
+            if (targetFile.exists()){
+                FileUtils.forceDelete(targetFile);
+            }
+            FileUtils.moveFile(file.getFile(), targetFile);
+            map.put("src", "/"+"upload"+ path);
+            map.put("title",file.getFileName());
+            success(0,"",map);
+        }catch (Exception e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    public void uploadJPGBase64Str(){
+        try{
+            Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+            if(info == null){
+                fail_token();
+                return;
+            }
+            int orgid = (int)info.get("orgid");
+            File file = new File(getRequest().getRealPath("upload")+"/"+System.currentTimeMillis()+".jpg");
+            String photoBase64Str = getPara("PhotoBase64Str");
+            byte[] b=Base64.getDecoder().decode(photoBase64Str);
+            FileOutputStream fileOutputStream=   new FileOutputStream(file);
+            fileOutputStream.write(b);
+            fileOutputStream.close();
+
+            String dirpath = orgid +"/"+ sf.format(new Date()) + "/"+System.currentTimeMillis();
+            String path =getRequest().getRealPath("upload")+"/"+dirpath+"/"+ file.getName();
+            FileUtils.moveFile(file,new File(path));
+            Map<String, String> map = new HashMap();
+            map.put("url","/"+"upload/"+dirpath+"/"+file.getName());
+            map.put("filename", file.getName());
+            success(map);
+        }catch (Exception e) {
+            fail();
+        }
+    }
+
+    public void uploadSingleFile(){
+        try{
+            Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+            if(info == null){
+                fail_token();
+                return;
+            }
+            int orgid = (int)info.get("orgid");
+            UploadFile file = getFile();
+            String filename = file.getFileName();
+            String ext = filename.substring(filename.lastIndexOf("."));
+            if(file_ext_str.indexOf(ext) == -1){
+                fail(1,"文件格式不正确,支持的文件类型为:"+file_ext_str);
+                return;
+            }
+            String dirpath = orgid +"/"+ sf.format(new Date()) + "/"+System.currentTimeMillis();
+            String path =getRequest().getRealPath("upload")+"/"+dirpath+"/"+ file.getOriginalFileName();
+            FileUtils.moveFile(file.getFile(),new File(path));
+            Map<String, String> map = new HashMap();
+            map.put("url","/"+"upload/"+dirpath+"/"+file.getOriginalFileName());
+            map.put("filename", file.getOriginalFileName());
+            success(map);
+        }catch (Exception e) {
+            fail();
+        }
+    }
+
+    public void uploadMultipleFile(){
+        try{
+            Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+            if(info == null){
+                fail_token();
+                return;
+            }
+            int orgid = (int)info.get("orgid");
+            List<UploadFile> fileList = getFiles();
+            List<String> upfileList = new ArrayList<String>();
+            for (UploadFile file : fileList) {
+                String filename = file.getFileName();
+                String ext = filename.substring(filename.lastIndexOf("."));
+                if(file_ext_str.indexOf(ext) == -1){
+                    fail(1,"文件格式不正确,支持的文件类型为:"+file_ext_str);
+                    return;
+                }
+                String path ="/" + orgid+"/"+sf.format(new Date()) + "/"+System.currentTimeMillis() + file.getFileName();
+                File targetFile =new File(getRequest().getRealPath("upload")+path);
+                FileUtils.moveFile(file.getFile(), targetFile);
+                upfileList.add(path);
+            }
+            success(upfileList);
+        }catch (Exception e) {
+            fail(0,e.getMessage());
+        }
+    }
+
+    public void downloadFile(){
+        try {
+            String filename =getPara("filename");
+            if(filename.indexOf(".") == -1){
+                fail(0,"文件名不符合规范");
+                return;
+            }
+            String[] subfilename = filename.split("\\.");
+            if((filename.indexOf("/")>-1 && filename.indexOf("template/")==-1) || filename.indexOf("../")>-1 || subfilename.length != 2 || (!"xls".equals(subfilename[1]) && !"xlsx".equals(subfilename[1]))){
+                fail(0,"文件名不符合规范");
+                return;
+            }
+            String path =getRequest().getRealPath("upload")+File.separatorChar+  filename;
+            log.debug(path);
+            File targetFile =new File(path);
+            log.debug("is exists="+targetFile.exists());
+            renderFile(targetFile);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail(0,e.getMessage());
+        }
+    }
+
+    @Clear
+    public void downloadChromeSetupFile(){
+        try {
+            String filename =getPara("filename");
+            String path =getRequest().getRealPath("upload")+"/template/ChromeSetup.exe";
+            log.debug(path);
+            File targetFile =new File(path);
+            log.debug("is exists="+targetFile.exists());
+            renderFile(targetFile);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail(0,e.getMessage());
+        }
+    }
+}

+ 101 - 0
src/main/java/com/controller/HotBookController.java

@@ -0,0 +1,101 @@
+package com.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.plugin.ehcache.CacheInterceptor;
+import com.jfinal.plugin.ehcache.CacheName;
+import com.jfinal.plugin.ehcache.EvictInterceptor;
+import com.model.BookHot;
+import com.model.Org;
+import com.model.User;
+import com.service.HotBookService;
+import com.service.OrgService;
+import com.tools.JwtUtils;
+import com.validator.BookValidator;
+import com.validator.HotBookValidator;
+
+import java.util.List;
+
+/**
+ * 图书操作
+ * 2018-10-23
+ * zj
+ */
+@ControllerInterface(path="/hotBook")
+public class HotBookController extends BaseController {
+    HotBookService service = HotBookService.me;
+    OrgService orgService = OrgService.me;
+    public void index() {
+        render("/view/hotbook/hotbook.html");
+    }
+
+    @Before(CacheInterceptor.class)
+    @CacheName("hotBookList")
+    public void list(){
+        try{
+            User user= getSessionAttr("userInfo");
+            int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+
+            int schooltype=getParaToInt("schooltype");
+            String booktypeid=getPara("booktypeid");
+
+            List<Org> orgList =orgService.findAllParentOrg(user.getOrgid());
+            success(service.paginate(orgList,schooltype,booktypeid,this.getParaToInt("pageNumber"),this.getParaToInt("pageSize")));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    public void getById(){
+        int id =this.getParaToInt("bean.id", 0);
+        if(id == 0){
+            fail();
+            return;
+        }
+        success(service.findById(id));
+    }
+    //增加
+    @Before({HotBookValidator.class,EvictInterceptor.class})
+    @CacheName("hotBookList")
+    public void addOrUpdate(){ 
+        //必填信息
+        BookHot bean = getBean(BookHot.class,"bean");
+
+
+        try {
+            User user= getSessionAttr("userInfo");
+            int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+            if(operatorid == 0){
+                 fail(3,"token错误");
+                 return;
+            }
+            bean.setOrgid(user.getOrgid());
+            service.addOrUpdate(bean,operatorid);
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    @Before({HotBookValidator.class,EvictInterceptor.class})
+    @CacheName("hotBookList")
+    public void delete(){
+        try{
+            String rolejson = getPara("hotbok");
+            List<BookHot> bookHotList=  JSON.parseArray(rolejson, BookHot.class);
+            service.deleteHotBook(bookHotList);
+
+        }catch (Exception e) {
+            e.printStackTrace();
+            fail();
+        }
+        success();
+    }
+}

+ 25 - 0
src/main/java/com/controller/IndexController.java

@@ -0,0 +1,25 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.model.Book;
+import com.model.BookDetail;
+import com.model.BookPlus;
+import com.service.BookService;
+import com.tools.JwtUtils;
+import com.validator.BookValidator;
+
+/**
+ * 图书操作
+ * 2018-10-23
+ * zj
+ */
+@ControllerInterface(path="/index")
+public class IndexController extends BaseController {
+
+    /*public void areaSum() {
+        render("/view/base-state/areaSum.html");
+    }*/
+
+}

File diff suppressed because it is too large
+ 2007 - 0
src/main/java/com/controller/JieyueController.java


+ 152 - 0
src/main/java/com/controller/LibraryController.java

@@ -0,0 +1,152 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.kit.PathKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.*;
+import com.service.LibraryService;
+import com.service.OrgService;
+import com.tools.JwtUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.BorderStyle;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.text.DecimalFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 藏书室信息表
+ * 2018-10-19
+ * zj
+ */
+@ControllerInterface(path="/library")
+public class LibraryController extends BaseController {
+    LibraryService service = LibraryService.me;
+    OrgService orgService = OrgService.me;
+    public void index() {
+        render("/view/sysconfig/library.html");
+    }
+
+
+
+
+
+
+
+
+    public void list(){
+        String token = this.getPara("token");
+        try {
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            Library bean = getBean(Library.class,"bean");
+            success(service.paginate(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),bean));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+
+    }
+    public void getById(){
+        int id =this.getParaToInt("bean.id", 0);
+        if(id == 0){
+            fail();
+            return;
+        }
+        success(service.findById(id));
+    }
+    //增加或修改
+    public void addOrUpdate(){
+        Library bean = getBean(Library.class,"bean");
+        String token = this.getPara("token");
+        try {
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            service.addOrUpdate(bean,operatorid);
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    //删除
+    public void delete(){
+        int id =this.getParaToInt("id");
+        try{
+            service.deleteById(id);
+        }catch (Exception e){
+            fail(0,e.getMessage());
+            return;
+        }
+        success();
+    }
+    public void ajaxlibrarylist(){
+        int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+        success(service.librarylistforselect(orgid));
+    }
+
+
+
+
+
+    public void findLibraryListByLibraryType(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        Map userinfo = JwtUtils.validateJWTForMap(token);
+        int orgid = (Integer) userinfo.get("orgid");
+        Integer libraryType = getParaToInt("libraryType",0);
+        List list = Db.find("select * from t_library where orgid = ? and libraryType = ?",orgid,libraryType);
+        success(list);
+    }
+    public void librayclocklist(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int libraryid = this.getParaToInt("libraryid");
+        Page<Record> page = Db.paginate(getParaToInt("pageNumber",1),getParaToInt("pageSize", 10),
+                "select a.createtime,b.cardnumber,b.realname,l.library ","from t_library_clock a " +
+                        "inner join t_reader b on a.readerid = b.id " +
+                        "inner join t_library l on l.id=a.libraryid where a.libraryid =? order by createtime desc",libraryid);
+        success(page);
+    }
+
+    public void addlibrayclock(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        String cardno = this.getPara("cardno");
+        int libraryid = getParaToInt("libraryid");
+        Record reader = Db.findFirst("select * from t_reader where cardnumber=? or readcardcode=?", cardno,cardno);
+        if(reader == null){
+            fail(1,"读者不存在!");
+            return;
+        }
+        LibraryClock lc = new LibraryClock();
+        lc.setOrgid(reader.get("orgid")).setReaderid(reader.getInt("id")).setCreatetime(new Date()).setLibraryid(libraryid).save();
+        success();
+    }
+}

+ 237 - 0
src/main/java/com/controller/LoginController.java

@@ -0,0 +1,237 @@
+package com.controller;
+
+import com.config.AuthInterceptor;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.captcha.CaptchaRender;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.Org;
+import com.model.User;
+import com.service.OrgService;
+import com.service.UserService;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+import java.net.URL;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Clear(AuthInterceptor.class)
+@ControllerInterface(path="/auth")
+public class LoginController extends BaseController {
+    static Logger logger = Logger.getLogger(LoginController.class);
+
+    public static final Map<String, Object> userLoginErrorInfoMap = new HashMap<>();
+    UserService service = UserService.me;
+    OrgService orgService = OrgService.me;
+    Org orgDao = new Org().dao();
+    public void index() {
+        render("/view/index/index.html");
+    }
+
+
+
+    public void login(){
+
+        String username = this.getPara("loginname");
+        String password = this.getPara("password");
+        String imgcode = this.getPara("imgcode");
+        String type = this.getPara("type");
+        if(CommonUtils.isNullOrEmpty(type)){
+            success(1,"请求错误!");
+            return;
+        }
+        if(!CaptchaRender.validate(this,imgcode)) {
+            success(1,"图形验证码错误!");
+            return;
+        }
+        if(CommonUtils.isNotNullOrNotEmpty(userLoginErrorInfoMap.get(username))){
+            Record record = (Record)userLoginErrorInfoMap.get(username);
+            int num = record.getInt("number");
+            long time = System.currentTimeMillis() - record.getLong("datetime");
+            if(time >= 5* 60 * 1000){
+                userLoginErrorInfoMap.remove(username);
+            }
+            /*if(num >= 5 && time < 5* 60 * 1000){
+                success(1,"账号已被锁定,请五分钟后再试!");
+                return;
+            }*/
+        }
+        password = CommonUtils.getMD5String(CommonUtils.getMD5String(password));
+        User user = service.findByNamePassword(username,password,type);
+        //用于黔南州单点登录时绑定用户的ssocode
+        if(null == user && CommonUtils.isNotNullOrNotEmpty(getPara("personId"))){
+            if(type.equals("school")) {
+                type = "teach";
+            } else {
+                type = "school";
+            }
+            user = service.findByNamePassword(username,password,type);
+        }
+        if(user == null) {
+            int num = 1;
+            if(CommonUtils.isNullOrEmpty(userLoginErrorInfoMap.get(username))){
+                Record record = new Record();
+                record.set("datetime",System.currentTimeMillis());
+                record.set("number",num);
+                userLoginErrorInfoMap.put(username,record);
+            } else {
+                Record record = (Record)userLoginErrorInfoMap.get(username);
+                num = record.getInt("number");
+                num ++;
+                record.set("datetime",System.currentTimeMillis());
+                record.set("number",num);
+                userLoginErrorInfoMap.put(username,record);
+            }
+            if(num == 1){
+                success(1,"用户名密码错误!");
+            } else if(num == 5) {
+                success(1,"账号已被锁定五分钟!");
+            } else {
+                success(1,"用户名密码连续错误"+num+"次!连续错误五次账号将锁定五分钟!");
+            }
+            return;
+        } else if(user.getStatus() == 0){
+            success(1,"该用户已注销!");
+            return;
+        } else if(user.getStatus() == 2){
+            success(1,"该用户已停用!");
+            return;
+        } else if (user.getInt("orgstatus") == 2){
+            success(1,"该用户审核不通过!");
+            return;
+        } else if (user.getInt("orgstatus") == 0){
+            success(1,"该用户未审核!");
+            return;
+        } else if (user.getInt("isclose") == 1){
+            success(1,"该机构!");
+            return;
+        }
+        userLoginErrorInfoMap.remove(username);
+        if(user.get("rffectivetime") != null) {
+            Calendar today = Calendar.getInstance();
+            Calendar last = Calendar.getInstance();
+
+            last.setTime(user.getDate("rffectivetime"));
+            if (today.after(last)) {
+
+                fail(100,"您的服务已过期,请联系客服:073185157311");
+                return;
+            }
+        }
+
+        //用于黔南州单点登录时绑定用户的ssocode
+        if(CommonUtils.isNotNullOrNotEmpty(getPara("personId"))){
+            Db.update("update t_user set ssocode = ? where id = ?",getPara("personId"),user.getId());
+        }
+        user.setPassword(null);
+        //登录成功,生成jwt的token
+        Map info = new HashMap();
+        info.put("orgid",user.getOrgid());
+        info.put("orgname",user.get("orgname"));
+        info.put("userid",user.get("id"));
+        info.put("facedevicetype", user.get("facedevicetype"));
+
+        String token = JwtUtils.createJWT(user.getId()+"",info,1000*60*500);
+        user.remove("password").put("token",token);
+        user.put("view_path",VIEW_PATH);
+        String schoolids = orgService.getSchoolForSql(user.getId());
+        this.setSessionAttr("schoolids", schoolids);
+        this.setSessionAttr("userInfo",user);
+        user.setAddress(PropKit.get("channelType"));
+         //加载当前机构下面的学校
+
+        //判断是否要到期提醒
+        Org org = orgDao.findById(user.getOrgid());
+
+        String msg = "";
+        Date lastdate = user.get("rffectivetime") != null ? user.getDate("rffectivetime"): null;
+        if(lastdate != null){
+            Calendar today = Calendar.getInstance();
+            Calendar last = Calendar.getInstance();
+            last.setTime(lastdate);
+            last.add(Calendar.DATE, -30);
+            if(today.after(last)){
+                msg+="您的系统服务将于"+format1.format(lastdate)+"到期,请及时联系客服续费!";
+            }
+        }
+        user.put("warn", msg);
+        user.put("banben", PropKit.get("banben"));
+
+        success(user);
+        User userbak = user;
+
+    }
+
+    public void orgLogo(){
+
+        try {
+            Integer orgid = this.getParaToInt("orgid");
+            success(orgService.orgLogo(orgid));
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        }
+
+    }
+
+    public void logout(){
+        removeSessionAttr("schoolids");
+        removeSessionAttr("userInfo");
+        //System.out.println(this.getRequest().getRequestURL()+"/"+ PropKit.get("login_page_url"));
+        //redirect(this.getRequest().getRequestURL()+"/"+ PropKit.get("login_page_url"));
+        URL url = null;
+        try {
+            url = new URL(getRequest().getRequestURL().toString());
+            String path =url.getProtocol()+"://"+url.getHost()+":"+url.getPort()+PropKit.get("login_page_url");
+            redirect(path);
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        }
+
+    }
+
+    /**
+     * 图形验证码生成
+     */
+    public void validateImg(){
+        CaptchaRender captcha = new CaptchaRender();
+        render(captcha);
+    }
+
+    public void welangduSignIn(){
+        String custCode = getPara("custCode");
+        String readerCode = getPara("readerCode");
+        if(CommonUtils.isNullOrEmpty(custCode)) {
+            fail(1,"字段custCode不能为空");
+            return;
+        }
+        if(CommonUtils.isNullOrEmpty(readerCode)) {
+            fail(1,"字段readerCode不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select r.realname,sex,d.deptname from t_reader r left join t_reading_info ri on r.orgid = ri.orgid left join t_org_dept d on r.orgdeptid = d.id where ri.custCode = ? and r.cardnumber = ?",custCode,readerCode);
+        if(CommonUtils.isNullOrEmpty(record)) {
+            success(0,"未获取到读者信息");
+        } else {
+            success(record);
+        }
+    }
+
+    public void getMessageVersion(){
+        if(CommonUtils.isNullOrEmpty(PropKit.get("messageversion"))){
+            success(0);
+        } else {
+            success(PropKit.get("messageversion"));
+        }
+    }
+}

+ 262 - 0
src/main/java/com/controller/MenuController.java

@@ -0,0 +1,262 @@
+package com.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.kit.PropKit;
+import com.model.Menu;
+import com.model.RoleMenu;
+import com.model.User;
+import com.model.UserMenu;
+import com.service.MenuService;
+import com.tools.JwtUtils;
+
+import java.util.*;
+
+@ControllerInterface(path="/menu")
+public class MenuController extends BaseController {
+
+    MenuService service = MenuService.me;
+
+    public void index() {
+        render("/view/userrole/menu.html");
+    }
+
+
+    public void menurole() {
+        render("/view/userrole/menurole.html");
+    }
+
+    public void findMenuByRole(){
+        int roleid =getParaToInt("roleid");
+        success(service.findMenuByRole(roleid));
+    }
+
+    public void findMenuByUser(){
+        int userid =getParaToInt("userid");
+        List<Menu> menuList=service.findMenuByUser(userid);
+        List<Map<String,Object>> resutList =new ArrayList<Map<String,Object>>();
+        for (Menu menu: menuList) {
+            if (menu.getPid().equals(0)){
+                Map<String,Object> menuMap=new LinkedHashMap<String, Object>();
+                menuMap.put("id",menu.getId().toString());
+                menuMap.put("pid",menu.getPid().toString());
+                menuMap.put("url",menu.getUrl());
+                menuMap.put("imgurl",menu.getImgurl());
+                menuMap.put("menuname",menu.getMenuname());
+                menuMap.put("orderno",menu.getOrderno());
+                menuMap.put("submenu",buildSubMenu(menuList,menu.getId()));
+                resutList.add(menuMap);
+            }
+        }
+        success(resutList);
+    }
+
+    private List<Map<String,Object>>  buildSubMenu(List<Menu> menuList,Integer id){
+        List<Map<String,Object>> submenuList = new ArrayList<Map<String,Object>>();
+        for (Menu menu: menuList) {
+            if (menu.getPid().equals(id)){
+                if(PropKit.get("banben").equals("blue.txt") && PropKit.use("/channel/blue.txt").get("grepmenuidstr").indexOf(menu.getId()+",") > -1) {
+                    continue;
+                }
+                Map<String,Object> menuMap=new LinkedHashMap<String, Object>();
+                menuMap.put("id",menu.getId().toString());
+                menuMap.put("pid",menu.getPid().toString());
+                menuMap.put("url",menu.getUrl());
+                menuMap.put("imgurl",menu.getImgurl());
+                menuMap.put("menuname",menu.getMenuname());
+                menuMap.put("menuname",menu.getMenuname());
+                menuMap.put("submenu",buildSubMenu(menuList,menu.getId()));
+                submenuList.add(menuMap);
+            }
+        }
+        return submenuList;
+    }
+
+    public void findMenuByLoginUser(){
+        User user= getSessionAttr("userInfo");
+        int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+        if(operatorid == 0) {
+            fail(3,"token错误");
+            return;
+        }
+        success(service.findMenuByUser(user.getId()));
+    }
+
+    public void findMenuByUserID(){
+        User user= getSessionAttr("userInfo");
+        int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int userid =getParaToInt("userid");
+        success(service.findMenuByUser(userid));
+    }
+
+    public void findMenuNoRole(){
+        int roleid =getParaToInt("roleid");
+        success(service.findMenuNoRole(roleid));
+    }
+
+    public void findMenu(){
+        int roleid =1;
+        success(service.findMenu());
+    }
+
+    public void addOrUpdate(){
+        Menu bean = getBean(Menu.class,"bean");
+        try {
+            Menu menu=service.addOrUpdate(bean);
+            success(menu);
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    public void deleteMenu() {
+        try {
+            int operatorid = 0;
+            int menuid = getParaToInt("menuid");
+            List<Menu> subMenuList =service.findSubMenu(menuid);
+            if(subMenuList.size() >0) {
+                    throw new Exception("需要先删除子菜单!");
+            }
+            service.delete(menuid);
+            success();
+        }catch(Exception e){
+            fail(0,e.getMessage());
+        }
+    }
+
+    public void saveUserMenu(){
+        try{
+
+            User user= getSessionAttr("userInfo");
+            int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+
+            int userid = getParaToInt("userid");
+            String rolejson = getPara("menu");
+            List<Menu> menuList=  JSON.parseArray(rolejson, Menu.class);
+            List<UserMenu> userMenuList = new ArrayList<UserMenu>();
+            List<Integer> menuidList = new ArrayList<Integer>();
+            for (Menu menu : menuList){
+                if (menuidList.contains(menu.getId())){
+                    continue;
+                }
+                menuidList.add(menu.getId());
+                //授权子菜单,将父菜单也授权
+                if (!menu.getPid().equals(0) && !menuidList.contains(menu.getPid())){
+                    UserMenu userMenu  =new UserMenu();
+                    userMenu.setUserid(userid);
+                    userMenu.setMenuid(menu.getPid());
+                    userMenu.setOperatorid(operatorid);
+                    userMenu.setCreatetime(new Date());
+                    userMenuList.add(userMenu);
+                    menuidList.add(menu.getPid());
+                }
+                UserMenu userMenu  =new UserMenu();
+                userMenu.setUserid(userid);
+                userMenu.setMenuid(menu.getId());
+                userMenu.setOperatorid(operatorid);
+                userMenuList.add(userMenu);
+            }
+            service.delUserMenu(userid);
+            service.saveUserMenu(userMenuList);
+            success();
+        }catch (Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    public void saveRoleMenu(){
+        try{
+
+            User user= getSessionAttr("userInfo");
+            int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+
+            int roleid = getParaToInt("roleid");
+            String rolejson = getPara("menu");
+            List<Menu> menuList=  JSON.parseArray(rolejson, Menu.class);
+            List<RoleMenu> roleMenuList = new ArrayList<RoleMenu>();
+            for (Menu menu : menuList){
+                //授权子菜单,将父菜单也授权
+                if (!menu.getPid().equals(0) &&  null ==  service.findParentMenuByRole(menu.getPid(),roleid)){
+                    RoleMenu roleMenu = new RoleMenu();
+                    roleMenu.setRoleid(roleid);
+                    roleMenu.setMenuid(menu.getPid());
+                    roleMenu.setOperatorid(operatorid);
+                    roleMenu.setCreatetime(new Date());
+                    roleMenu.save();
+                }
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleid(roleid);
+                roleMenu.setMenuid(menu.getId());
+                roleMenu.setOperatorid(operatorid);
+                roleMenuList.add(roleMenu);
+            }
+            service.saveRoleMenu(roleMenuList);
+            success();
+        }catch (Exception e){
+            fail();
+        }
+    }
+
+    public void deleteRoleMenu(){
+        try{
+            int roleid = getParaToInt("roleid");
+            String rolejson = getPara("menu");
+            List<Menu> menuList=  JSON.parseArray(rolejson, Menu.class);
+            List<RoleMenu> roleMenuList = new ArrayList<RoleMenu>();
+            for (Menu menu : menuList){
+                RoleMenu roleMenu = new RoleMenu();
+                roleMenu.setRoleid(roleid);
+                roleMenu.setMenuid(menu.getId());
+                roleMenuList.add(roleMenu);
+
+                //删除父菜单,把子菜单一起删除
+                List<Menu> subMenuList= service.findSubMenu(menu.getId());
+                for (Menu subMenu : subMenuList){
+                    roleMenu = new RoleMenu();
+                    roleMenu.setRoleid(roleid);
+                    roleMenu.setMenuid(subMenu.getId());
+                    roleMenuList.add(roleMenu);
+                }
+            }
+            service.delRoleMenu(roleMenuList);
+
+            success();
+        }catch (Exception e){
+            fail();
+        }
+
+    }
+
+
+    public void hasAuth(){
+        String token=getPara("token");
+        String url =getPara("url");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        if (!service.userHasMenuAuth(operatorid,url)){
+            fail(4,"没有此功能权限!");
+            return;
+        }
+        success();
+    }
+
+
+}

+ 62 - 0
src/main/java/com/controller/MoniyonghuController.java

@@ -0,0 +1,62 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.captcha.CaptchaRender;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.User;
+import com.service.OrgService;
+import com.service.UserService;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@ControllerInterface(path ="/moniyonghu")
+public class MoniyonghuController extends BaseController {
+    private static OrgService orgService = OrgService.me;
+    private static UserService userService = UserService.me;
+    public void index(){
+        render("/view/userrole/moniyonghu.html");
+    }
+    public void moni(){
+        String loginname = this.getPara("loginname");
+        String type = this.getPara("type");
+        User user = userService.findByNamePassword(loginname,type);
+        if(user == null) {
+            success(1,"用户名密码错误!");
+            return;
+        } else if(user.getStatus() == 0){
+            success(1,"该用户已注销!");
+            return;
+        } else if(user.getStatus() == 2){
+            success(1,"该用户已停用!");
+            return;
+        } else if (user.getInt("orgstatus") == 2){
+            success(1,"该用户审核不通过!");
+            return;
+        } else if (user.getInt("orgstatus") == 0){
+            success(1,"该用户未审核!");
+            return;
+        }
+
+        user.setPassword(null);
+        //登录成功,生成jwt的token
+        Map info = new HashMap();
+        info.put("orgid",user.getOrgid());
+        info.put("orgname",user.get("orgname"));
+        info.put("userid",user.get("id"));
+        String token = JwtUtils.createJWT(user.getId()+"",info,1000*60*500);
+        user.remove("password").put("token",token);
+        user.put("view_path",VIEW_PATH);
+        String schoolids = orgService.getSchoolForSql(user.getId());
+        this.setSessionAttr("schoolids", schoolids);
+        this.setSessionAttr("userInfo",user);
+        user.setAddress(PropKit.get("channelType"));
+        //加载当前机构下面的学校
+        success(user);
+    }
+}

+ 36 - 0
src/main/java/com/controller/OrgBookFieldController.java

@@ -0,0 +1,36 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.aop.Clear;
+import com.model.Book;
+import com.model.BookDetail;
+import com.model.BookPlus;
+import com.service.BookService;
+import com.service.BookYubianService;
+import com.service.OrgBookFieldService;
+import com.tools.JwtUtils;
+import com.validator.BookValidator;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 图书操作
+ * 2018-10-23
+ * wush
+ */
+@ControllerInterface(path="/orgBookField")
+public class OrgBookFieldController extends BaseController {
+    OrgBookFieldService service = OrgBookFieldService.me;
+    public void getById(){
+        int id = this.getParaToInt("orgid", 0);
+        if(id == 0){
+            fail();
+        }
+        success(service.findById(id));
+    }
+}

+ 389 - 0
src/main/java/com/controller/OrgController.java

@@ -0,0 +1,389 @@
+package com.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.aop.Clear;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.IAtom;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.upload.UploadFile;
+import com.model.*;
+import com.service.OrgService;
+import com.service.ReaderService;
+import com.service.UserService;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+import com.utils.DateUtils;
+import com.utils.ExcelUtil;
+import com.validator.OrgValidator;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.*;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.sql.SQLException;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 机构
+ * 2018-10-16
+ * zj
+ */
+@ControllerInterface(path="/org")
+public class OrgController extends BaseController {
+    User userDao = new User().dao();
+    Org dao = new Org().dao();
+    OrgService service = OrgService.me;
+    OrgSetting orgSettingDao = new OrgSetting().dao();
+    UserService userService = UserService.me;
+
+    //本单位信息
+    public void thisUnit(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            if(orgid == null){
+                orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            }
+            success(service.thisUnit(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+
+    public void getById(){
+        int id =this.getParaToInt("bean.id", 0);
+        if(id == 0){
+            fail();
+            return;
+        }
+        Org org = service.findById(id);
+        org.put("banben",PropKit.get("banben"));
+        success(org);
+    }
+
+
+    //删除
+    public void delete(){
+
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int id = getParaToInt("id");
+        Org org = service.findById(id);
+
+        User currentUser=userService.findById(operatorid);
+
+        if(currentUser.getOrgid().intValue() != org.getParentid().intValue()) {
+            fail(5,"没有权限注销用户");
+            return;
+        } else {
+            service.deleteById(this.getParaToInt("id", 0));
+            success();
+        }
+    }
+
+    //密码重置,传入t_user表id,从列表中获取
+
+    public void passWordReset(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int id = getParaToInt("fid");
+        Org org = service.findById(id);
+        //select ifnull(LOCATE((select orgid from t_user where id =3093 ),parentcodes),0) checkFlag from t_org o inner join t_user u on u.orgid = o.id where u.id = 318
+
+        User currentUser=userService.findById(operatorid);
+        if(currentUser.getOrgid().intValue() != org.getParentid().intValue()) { // 如果被重置密码的部门跟当前登录人的部门不一样 则不允许重置密码
+            fail(5,"没有权限重置密码");
+            return;
+        } else {
+            String password = CommonUtils.getMD5String(CommonUtils.getMD5String(PropKit.get("initPassword")));
+            service.passWordReset(password,id);
+            success(PropKit.get("initPassword"));
+        }
+    }
+    //机构模糊查询
+    public void fuzzyFindOrg(){
+        try {
+            Integer orgid = this.getParaToInt("orgid");
+            String content = this.getPara("content");
+            Integer schoolcategoryid = this.getParaToInt("schoolcategoryid");
+            success(service.fuzzyFindOrg(orgid,content,schoolcategoryid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    //测试用
+    public void getSchoolForSql(){
+        String token = this.getPara("token");
+        try {
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            success(service.getSchoolForSql(operatorid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+
+    public void orgreport(){
+        Integer orgid = this.getParaToInt("orgid");
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        success(service.orgreport(orgid));
+    }
+
+    public void uploadorginfopage(){
+        render("/view/uploadorginfo/uploadorginfopage.html");
+    }
+
+    public void uploadorginfo(){
+        UploadFile file = getFile();
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0) {
+            fail(0,"权限异常");
+            return;
+        }
+        User user = (User)getSession().getAttribute("userInfo");
+        Integer parentorgid = user.getOrgid();
+        if(CommonUtils.isNullOrEmpty(parentorgid)){
+            fail(0,"父级机构id不能为空");
+            return;
+        }
+        List<Map<String,String>> errorDataList = new ArrayList<Map<String,String>>();
+        try {
+            List<Map<String,String>> orgList= readExcel(new FileInputStream(file.getFile()));
+            for(Map map : orgList) {
+                if (CommonUtils.isNullOrEmpty(map.get("org"))){
+                    map.put("未导入原因","org不能为空!");
+                    errorDataList.add(map);
+                    continue;
+                }
+                if (CommonUtils.isNullOrEmpty(map.get("school"))){
+                    map.put("未导入原因","school不能为空!");
+                    errorDataList.add(map);
+                    continue;
+                }
+                if (CommonUtils.isNullOrEmpty(map.get("schoolcategoryid"))){
+                    map.put("未导入原因","schoolcategoryid不能为空!");
+                    errorDataList.add(map);
+                    continue;
+                }
+                if (CommonUtils.isNullOrEmpty(map.get("areatypeid"))){
+                    map.put("未导入原因","areatypeid不能为空!");
+                    errorDataList.add(map);
+                    continue;
+                }
+                List<Record> list = Db.find("select * from t_org where orgname = ? and parentid = ?",map.get("org")+"教育局",parentorgid);
+                try{
+                    if(list.size() > 0) {
+                        Record record = list.get(0);
+                        zuzhuang(record.getInt("id"),map.get("school").toString(),
+                                Integer.parseInt(map.get("areatypeid").toString()),
+                                Integer.parseInt(map.get("schoolcategoryid").toString()));
+                    } else {
+                        Org org = zuzhuang(parentorgid,map.get("org")+"教育局",
+                                Integer.parseInt(map.get("areatypeid").toString()),
+                                Integer.parseInt(map.get("schoolcategoryid").toString()));
+
+                        zuzhuang(org.getId(),map.get("school").toString(),
+                                Integer.parseInt(map.get("areatypeid").toString()),
+                                Integer.parseInt(map.get("schoolcategoryid").toString()));
+                    }
+                }catch (Exception e) {
+                    e.printStackTrace();
+                    map.put("未导入原因",e.getMessage());
+                    errorDataList.add(map);
+                }
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+        String filename="";
+        if (errorDataList.size()>0){
+            filename="未导入列表"+ DateUtils.getNowTimeNo()+".xls";
+            File targetFile =new File(getRequest().getRealPath("upload")+ File.separator+filename);
+            ExcelUtil.writeExcel(targetFile,errorDataList,"未导入列表");
+        }
+        success(filename);
+    }
+
+    public Org zuzhuang(int uOrgid,String orgname,int areatypeid,int schoolcategoryid){
+        Org bean = new Org();
+        bean.setOrgname(orgname);
+        Org o = dao.findById(uOrgid);
+        if(CommonUtils.isNotNullOrNotEmpty(o)){
+            String parentcodes = o.getParentcodes();
+            String p = parentcodes+uOrgid+",";
+            bean.setParentid(uOrgid).setParentcodes(p);
+
+            if(o.getOrgtypeid() < 3){
+                bean.setOrgtypeid(o.getOrgtypeid()+1);
+            } else {
+                bean.setOrgtypeid(5);
+            }
+        }else {
+            bean.setParentid(0).setParentcodes("0");
+        }
+        bean.setStatus(1);
+        if (bean.getOrgtypeid()==5) {
+            bean.setAreatypeid(areatypeid).setSchoolcategoryid(schoolcategoryid);
+        }
+        bean.setCreatetime(new Date()).setOperatorid(99999).save();
+        //创建一个新机构的同时,生成一个所创建机构的超级管理员账号 t_user
+        User user = new User();
+        //初始密码123456
+        user.setIsadmin(1).setStatus(1).setRealname(bean.getOrgname()).setPhone(bean.getLinkphone()).setPassword(CommonUtils.getMD5String(CommonUtils.getMD5String(PropKit.get("initPassword")))).setOrgid(bean.getId()).setOperatorid(99999).setCreatetime(new Date()).save();
+
+        RoleUser roleUser = new RoleUser();
+        roleUser.setRoleid(bean.getOrgtypeid().equals(1)?2:bean.getOrgtypeid().equals(2)?3:bean.getOrgtypeid().equals(3)?4:bean.getOrgtypeid().equals(5)?5:-1);
+        roleUser.setUserid(user.getId());
+        roleUser.setCreatetime(new Date());
+        roleUser.setOperatorid(99999);
+        roleUser.save();
+
+        String orgids = ReaderService.codeAddOne(bean.getId(),6);
+        String cardnumber = (orgids+user.getId()).trim();
+        Db.update("update t_user set code = ?,loginname = ? where id = ? ",cardnumber,cardnumber,user.getId());
+
+        if (bean.getOrgtypeid()==5){
+            new Library().setOrgid(bean.getId()).setOperatorid(bean.getOperatorid()).setLibrary("基本书库").setCreatetime(new Date()).save();
+            new Library().setOrgid(bean.getId()).setOperatorid(bean.getOperatorid()).setLibrary("教师书库").setCreatetime(new Date()).save();
+            new Library().setOrgid(bean.getId()).setOperatorid(bean.getOperatorid()).setLibrary("工具书库").setCreatetime(new Date()).save();
+
+            new OrgSetting().setOrgid(bean.getId()).setTstiaoxinmaweishu(8).setQktiaoxingmaweishu(7).setJieshuzhengweishu(6).save();
+
+            OrgBookField orgBookField = new OrgBookField();
+            orgBookField.setOrgid(bean.getId()).setKeyword(0).setEdition(0).setOtherauthor(0).setNewsource(0)
+                    .setBltitle(0).setSubtitle(0).setWorkmode(0).setGuobie(0).setSize(0).setLanguage(0).setBinding(0)
+                    .setCongshuming(0).setCongshuauthor(0).save();
+        }
+        logger.info("创建机构完成 orgname:"+bean.getOrgname());
+        return bean;
+    }
+
+    public List<Map<String,String>> readExcel(InputStream in){
+        List<Map<String,String>> dataList = new ArrayList<Map<String,String>>();
+        try{
+            // 获得工作簿
+            Workbook workbook = WorkbookFactory.create(in);
+            // 获得工作表个数
+            int sheetCount = workbook.getNumberOfSheets();
+            // 遍历工作表
+            for (int i = 0; i < sheetCount; i++)
+            {
+                Sheet sheet = workbook.getSheetAt(i);
+                // 获得行数
+                int rows = sheet.getLastRowNum() + 1;
+                // 读取数据
+                for (int rownum = 1; rownum < rows; rownum++)                {
+                    Map<String,String> rowMap = new LinkedHashMap<String, String>();
+                    Row r = sheet.getRow(rownum);
+                    if(r ==null) continue;
+                    boolean flag = false; //行数据全部为空,不继续读
+                    for (int col = 0; col < sheet.getRow(2).getLastCellNum(); col++)
+                    {
+                        Cell cell = r.getCell(col);
+                        if(cell !=null){
+                            String value = getCellValue(cell);
+                            if (!"".equals(value.trim())){
+                                flag=true;
+                            }
+                            rowMap.put(getCellValue(sheet.getRow(0).getCell(col)),value);
+                        }else {
+                            rowMap.put(getCellValue(sheet.getRow(0).getCell(col)),"");
+                        }
+
+                    }
+                    if (flag){
+                        dataList.add(rowMap);
+                    }
+                }
+            }
+        }catch (Exception e) {
+        }
+        return dataList;
+    }
+
+    public String getCellValue(Cell cell){
+        if(cell.getCellType() == CellType.NUMERIC){
+            short format = cell.getCellStyle().getDataFormat();
+            SimpleDateFormat sdf = null;
+            if(format == 14 || format == 31 || format == 57 || format == 58){
+                //日期
+                sdf = new SimpleDateFormat("yyyy-MM-dd");
+            }else if (format == 20 || format == 32) {
+                //时间
+                sdf = new SimpleDateFormat("HH:mm");
+            }else { // 不是日期格式
+                NumberFormat nf = NumberFormat.getInstance();
+                String s = nf.format(cell.getNumericCellValue());
+                if (s.indexOf(",") >= 0) {
+                    s = s.replace(",", "");
+                }
+                return s;
+            }
+            double value = cell.getNumericCellValue();
+            Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
+            return sdf.format(date);
+        } else if (cell.getCellType() == CellType.BOOLEAN){
+            return cell.getBooleanCellValue()+"";
+        }else {
+            return cell.getStringCellValue();
+        }
+
+    }
+
+    //用于单独同步机构信息
+    @Clear
+    public void sycorginfo(){
+        List<Record> list = Db.find("select id from t_org where orgtypeid = 2 and status = 1");
+        logger.info("开始同步机构信息"+list.size());
+        for(Record record:list) {
+            SimpleDateFormat format3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Org org = dao.findById(record.getInt("id"));
+            logger.info("org:"+org.toJson());
+            Map map = new HashMap();
+            map.put("orgid",org.getId().toString());
+            map.put("orgname",org.getOrgname());
+            map.put("status",org.getStatus().toString());
+            map.put("plattype","1");
+            map.put("orgtypeid",org.getOrgtypeid().toString());
+            map.put("parentid", org.getParentid().toString());
+            map.put("parentcodes",org.getParentcodes());
+            if(CommonUtils.isNotNullOrNotEmpty(org.getRffectivetime())){
+                map.put("rffectivetime",format3.format(org.getRffectivetime()));
+            }
+            if(CommonUtils.isNotNullOrNotEmpty(org.getCreatetime())){
+                map.put("orgcreatetime",format3.format(org.getCreatetime()));
+            }
+            HttpKit.get(PropKit.get("createOrgLogServiceUrl"), map);
+        }
+        success();
+    }
+
+}

+ 95 - 0
src/main/java/com/controller/OrgDeptController.java

@@ -0,0 +1,95 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Page;
+import com.model.Org;
+import com.model.OrgDept;
+import com.service.OrgDeptService;
+import com.service.OrgService;
+import com.tools.JwtUtils;
+import com.validator.OrgDeptValidator;
+import com.validator.OrgValidator;
+
+/**
+ * 部门
+ * 2018-10-17
+ * zj
+ */
+@ControllerInterface(path="/orgdept")
+public class OrgDeptController extends BaseController {
+
+    OrgDeptService service = OrgDeptService.me;
+
+    public void index() {
+        render("/view/reader/readerdept.html");
+    }
+    public void importFace() {
+        int id = getParaToInt("id");
+        render("/view/reader/importFace.html");
+    }
+
+    //查询列表
+    public void list(){
+        try{
+            OrgDept bean = getBean(OrgDept.class,"bean");
+            success(service.list(bean));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    public void getById(){
+        int id =this.getParaToInt("bean.id", 0);
+        if(id == 0){
+            fail();
+        }
+        success(service.findById(id));
+    }
+    //增加或修改
+    @Before(OrgDeptValidator.class)
+    public void addOrUpdate(){
+        OrgDept bean = getBean(OrgDept.class,"bean");
+        String token = this.getPara("token");
+        try {
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            service.addOrUpdate(bean,operatorid);
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    //删除
+    public void delete(){
+        int id =this.getParaToInt("bean.id");
+        boolean b = service.isJunior(id);
+        if(b){
+            fail(0,"请确保该部门已无下级部门和读者");
+            return;
+        }else {
+            service.deleteById(id);
+            success();
+        }
+    }
+
+    /**
+     * 部门下拉选
+     */
+    public void deptList(){
+        try{
+            int orgid = this.getParaToInt("orgid");
+            success(service.deptList(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+}

+ 27 - 0
src/main/java/com/controller/OrgTypeController.java

@@ -0,0 +1,27 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.service.OrgTypeService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 机构类型
+ * 2018-10-17
+ * zj
+ */
+@ControllerInterface(path="/orgtype")
+public class OrgTypeController extends BaseController {
+
+    OrgTypeService service = OrgTypeService.me;
+    public void index() {
+        render("/view/index/index.html");
+    }
+
+    public void selectType(){
+        Map map = service.selectType();
+        success(map);
+    }
+}

+ 195 - 0
src/main/java/com/controller/PageController.java

@@ -0,0 +1,195 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.model.Org;
+import com.model.User;
+import com.service.OrgService;
+import com.service.UserService;
+import com.tools.JwtUtils;
+import com.validator.UserValidator;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+@ControllerInterface(path="/page")
+public class PageController extends BaseController {
+
+    OrgService orgService = OrgService.me;
+    /**
+     * 访问路径test/index
+     * 跳转路径view/index/index.html
+     */
+    /*--------------------------教育局后台管理-------------------*/
+//登录
+    /*public void teachLogin() {
+        render("/teachLogin.html");
+    }
+    public void schoolLogin() {
+        render("/schoolLogin.html");
+    }*/
+//基本概况
+    public void areaSum() {
+        render("/view/base-state/areaSum.html");
+    }
+    public void schoolData() {
+        render("/view/base-state/schoolData.html");
+    }
+    public void schoolRegister() {render("/view/base-state/schoolRegister.html");}
+    //学校数据统计子菜单
+    public void sumRegister() {
+        render("/view/base-state/data-child/sumRegister.html");
+    }
+    public void flowRecord() {
+        render("/view/base-state/data-child/flowRecord.html");
+    }
+    public void addBook() {
+        render("/view/base-state/data-child/addBook.html");
+    }
+    public void removeBook() {render("/view/base-state/data-child/removeBook.html");}
+    public void libBookDetail() {render("/view/base-state/data-child/libBookDetail.html");}
+    public void libJournalDetail() {render("/view/base-state/data-child/libJournalDetail.html");}
+//标准管理
+    public void allNorm() {
+    render("/view/norm-manage/allNorm.html");
+}
+    public void hideBookNorm() {
+        render("/view/norm-manage/hideBookNorm.html");
+    }
+    public void hideSortNorm() {
+        render("/view/norm-manage/hideSortNorm.html");
+    }
+    public void libNorm() {
+        render("/view/norm-manage/libNorm.html");
+    }
+    public void nickNorm() {
+        render("/view/norm-manage/nickNorm.html");
+    }
+//查询统计
+    public void libQuery() {render("/view/query-stats/libQuery.html");}
+    public void readerQueryState() {
+        Integer orgid = this.getParaToInt("orgid");
+        User user =getSessionAttr("userInfo");
+        if (orgid==null){
+            orgid=user.getOrgid();
+        }
+        Org org =orgService.findById(orgid);
+        if (org.getOrgtypeid().equals(3)){
+            render("/view/query-stats/readerQuerySchool.html");
+        }else {
+            render("/view/query-stats/readerQueryState.html");
+        }
+    }
+    public void readerQueryCity() {render("/view/query-stats/readerQueryCity.html");}
+    public void readerQuerySchool() {render("/view/query-stats/readerQuerySchool.html");}
+    public void readerQuery() {render("/view/query-stats/readerQuery.html");}
+    public void libNumberStats() {
+        Integer orgid = this.getParaToInt("orgid");
+        User user =getSessionAttr("userInfo");
+        if (orgid==null){
+            orgid=user.getOrgid();
+        }
+        Org org =orgService.findById(orgid);
+        if (org.getOrgtypeid().equals(3)){
+            render("/view/query-stats/libNumberStats.html");
+        }else {
+            render("/view/query-stats/libNumberStatsreport.html");
+        }
+    }
+    public void libNumberStatsState() {render("/view/query-stats/libNumberStatsState.html");}
+    public void libNumberStatsCity() {render("/view/query-stats/libNumberStatsCity.html");}
+    public void libSortSort() {render("/view/query-stats/libSortSort.html");}
+    public void libSortSortState() {
+        Integer orgid = this.getParaToInt("orgid");
+        User user =getSessionAttr("userInfo");
+        if (orgid==null){
+            orgid=user.getOrgid();
+        }
+        Org org =orgService.findById(orgid);
+        if (org.getOrgtypeid().equals(3)){
+            render("/view/query-stats/libSortSort.html");
+        }else {
+            render("/view/query-stats/libSortSortState.html");
+        }
+    }
+    public void libSortSortCity() {render("/view/query-stats/libSortSortCity.html");}
+    public void libSortDetail() {render("/view/query-stats/libSortDetail.html");}
+    public void libFlowStats() {
+        Integer orgid = this.getParaToInt("orgid");
+        User user =getSessionAttr("userInfo");
+        if (orgid==null){
+            orgid=user.getOrgid();
+        }
+        Org org =orgService.findById(orgid);
+        if (org.getOrgtypeid().equals(5)){
+            render("/view/query-stats/libFlowStats.html");
+        }else {
+            render("/view/query-stats/libFlowStatsreport.html");
+        }
+    }
+    public void libFlowStatsR() {render("/view/query-stats/libFlowStatsR.html");}
+
+    public void libFlowStatsState() {render("/view/query-stats/libFlowStatsState.html");}
+    public void libFlowStatsCity() {render("/view/query-stats/libFlowStatsCity.html");}
+
+    public void libChange() {
+        Integer orgid = this.getParaToInt("orgid");
+        User user =getSessionAttr("userInfo");
+        if (orgid==null){
+            orgid=user.getOrgid();
+        }
+        Org org =orgService.findById(orgid);
+        if (org.getOrgtypeid().equals(5)){
+            render("/view/query-stats/libChangeStats.html");
+        }else {
+            render("/view/query-stats/libChange.html");
+        }
+
+    }
+
+    public void libChangeCity() {render("/view/query-stats/libChangeCity.html");}
+    public void libChangeStats() {render("/view/query-stats/libChangeStats.html");}
+    public void addStats() {render("/view/query-stats/addStats.html");}
+    public void addStatsState() {
+        Integer orgid = this.getParaToInt("orgid");
+        User user =getSessionAttr("userInfo");
+        if (orgid==null){
+            orgid=user.getOrgid();
+        }
+        Org org =orgService.findById(orgid);
+        if (org.getOrgtypeid().equals(3)){
+            render("/view/query-stats/addStats.html");
+        }else {
+            render("/view/query-stats/addStatsState.html");
+        }
+
+    }
+    public void addStatsCity() {render("/view/query-stats/addStatsCity.html");}
+    public void bookRecommendList() {render("/view/query-stats/bookRecommendList.html");}
+
+    public void bookRecommendReviewList(){
+        render("/view/query-stats/bookRecommendReviewList.html");
+    }
+    //子菜单
+    public void readerDetail() {render("/view/query-stats/child/readerDetail.html");}
+//网站管理
+    public void newbookList() {
+    render("/view/web-manage/newbookList.html");
+}
+    public void noticeTell() {
+        render("/view/web-manage/noticeTell.html");
+    }
+
+    public void standardreport() {
+        render("/view/query-stats/standardreport.html");
+    }
+
+    public void standardbooktypereport() {
+        render("/view/query-stats/standardbooktypereport.html");
+    }
+
+    public void thisUnit(){
+        render("/view/base-state/thisUnit.html");
+    }
+}

+ 895 - 0
src/main/java/com/controller/PrintController.java

@@ -0,0 +1,895 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.Org;
+import com.model.User;
+import com.service.PrintService;
+import com.utils.CommonUtils;
+import com.utils.ExcelExportUtil;
+import com.utils.ExcelExportUtil_template;
+import jxl.Workbook;
+import jxl.write.Label;
+import jxl.write.WritableSheet;
+import jxl.write.WritableWorkbook;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.OutputStream;
+import java.math.BigInteger;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 常见打印菜单中的功能
+ */
+@ControllerInterface(path="print")
+public class PrintController extends BaseController {
+    private PrintService service = PrintService.me;
+    Org orgDao = new Org().dao();
+
+
+    /**
+     * 书本式目录打印
+     */
+    public void shubenshimuludayin(){
+        render("/view/print/shubenshimuludayin.html");
+    }
+    public void shubenshimuludayin_list(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            int libraryid = this.getParaToInt("libraryid", 0);
+            if(libraryid >0){
+                param.put("libraryid", libraryid);
+            }
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isNotBlank(starttime)) {
+                param.put("starttime", starttime);
+            }
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            int pageNumber = 1;
+            if (this.getParaToInt("pageNumber", 0) > 0) {
+                pageNumber = getParaToInt("pageNumber");
+            }
+            String field = this.getPara("field");
+            if(StringUtils.isNotBlank(field)){
+                if(field.indexOf("order by bookno desc") > -1) {
+                    //param.put("field", "order by typecode,concat(typeid,shucihao),juanci desc");
+                    param.put("field", "order by typecode desc ,shucihao desc,juanci desc,ceci desc");
+                } else if(field.indexOf("order by bookno asc") > -1){
+                    param.put("field", "order by typecode,shucihao,juanci,ceci");
+                } else if(field.indexOf("order by title desc") > -1) {
+                    param.put("field", "order by title desc");
+                } else if(field.indexOf("order by title asc") > -1){
+                    param.put("field", "order by title asc");
+                } else {
+                    param.put("field", field);
+                }
+            }else {
+                param.put("field", "order by typecode,shucihao,juanci");
+                //param.put("field", "order by typecode,concat(typeid,shucihao),juanci asc");
+            }
+            String bookno = this.getPara("bookno");
+            if(StringUtils.isNotBlank(bookno)){
+                param.put("bookno", bookno);
+            }
+            int pageSize = this.getParaToInt("pageSize", PAGESIZE);
+            Page<Record> page = service.shubenshimuludayin_page(orgid,param,pageNumber,pageSize);
+            success(page);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+
+    }
+
+
+    public void shubenshimuludayin_list_print(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            int libraryid = this.getParaToInt("libraryid", 0);
+            if(libraryid >0){
+                param.put("libraryid", libraryid);
+            }
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isNotBlank(starttime)) {
+                param.put("starttime", starttime);
+            }
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            int pageNumber = 1;
+            if (this.getParaToInt("pageNumber", 0) > 0) {
+                pageNumber = getParaToInt("pageNumber");
+            }
+            String field = this.getPara("field");
+            if(StringUtils.isNotBlank(field)){
+                /*if(field.indexOf("null") > -1) {
+                    param.put("field", "order by typecode,shucihao,p.juanci asc");
+                } else {
+                    param.put("field", field);
+                }*/
+                if(field.indexOf("order by bookno desc") > -1) {
+                    //param.put("field", "order by typecode,concat(typeid,shucihao),juanci desc");
+                    param.put("field", "order by typecode desc ,shucihao desc,juanci desc,ceci desc");
+                } else if(field.indexOf("order by bookno asc") > -1){
+                    param.put("field", "order by typecode,shucihao,juanci,ceci asc");
+                } else if(field.indexOf("order by title desc") > -1) {
+                    param.put("field", "order by title desc");
+                } else if(field.indexOf("order by title asc") > -1){
+                    param.put("field", "order by title asc");
+                } else {
+                    param.put("field", field);
+                }
+            }else {
+                param.put("field", "order by typecode,shucihao,p.juanci,p.ceci");
+            }
+            String bookno = this.getPara("bookno");
+            if(StringUtils.isNotBlank(bookno)){
+                param.put("bookno", bookno);
+            }
+            int pageSize = this.getParaToInt("pageSize", PAGESIZE);
+            List<Record> page = service.shubenshimuludayin_list_print(orgid,param);
+            success(page);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+
+    }
+
+    public void shubenshimuludayin_export(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            int libraryid = this.getParaToInt("libraryid", 0);
+            if(libraryid >0){
+                param.put("libraryid", libraryid);
+            }
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isNotBlank(starttime)) {
+                param.put("starttime", starttime);
+            }
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            String bookno = this.getPara("bookno");
+            if(StringUtils.isNotBlank(bookno)){
+                param.put("bookno", bookno);
+            }
+            String field = this.getPara("field");
+            if(StringUtils.isNotBlank(field)){
+                /*if(field.indexOf("null") > -1) {
+                    param.put("field", "order by typecode,concat(typeid,shucihao),p.juanci asc");
+                } else {
+                    param.put("field", field);
+                }*/
+                if(field.indexOf("order by bookno desc") > -1) {
+                    //param.put("field", "order by typecode,concat(typeid,shucihao),juanci desc");
+                    param.put("field", "order by typecode desc ,shucihao desc,juanci desc,ceci desc");
+                } else if(field.indexOf("order by bookno asc") > -1){
+                    param.put("field", "order by typecode,shucihao,juanci,ceci asc");
+                } else if(field.indexOf("order by title desc") > -1) {
+                    param.put("field", "order by title desc");
+                } else if(field.indexOf("order by title asc") > -1){
+                    param.put("field", "order by title asc");
+                } else {
+                    param.put("field", field);
+                }
+            }else {
+                param.put("field", "order by typecode,shucihao,p.juanci,p.ceci asc");
+            }
+            List list = service.shubenshimuludayin_export(orgid,param);
+            LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
+            headMap.put("bookno", "索书号");
+            headMap.put("title", "正题名");
+            headMap.put("author", "著者");
+            headMap.put("publisher", "出版社");
+            headMap.put("price", "定价(元)");
+            headMap.put("booknum", "复本数");
+            headMap.put("library", "馆藏地");
+            headMap.put("isbn", "ISBN");
+            headMap.put("edition", "版本版次");
+            headMap.put("totalpages", "页数");
+
+            try {
+                ExcelExportUtil.listToExcel(list,headMap, "书本式目录打印", this.getResponse());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+        renderNull();
+    }
+
+    /**
+     * 图书注销报表
+     */
+    public void tushuzhuxiaobaobiao(){
+        render("/view/print/tushuzhuxiaobaobiao.html");
+    }
+    public void tushuzhuxiaobaobiao_list(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isBlank(starttime)) {
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.DATE, -365);
+                starttime = format1.format(now.getTime());
+            }
+            param.put("starttime", starttime);
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            int pageNumber = this.getParaToInt("pageNumber", 1);
+            Page<Record> page = service.tushuzhuxiaobaobiao_page(orgid,param,pageNumber,this.getParaToInt("pageSize",PAGESIZE));
+//            if(page.getList() != null && page.getList().size()>0){
+//                for(Record record : page.getList()){
+//                    if(record.get("createtime") != null) {
+//                        record.set("createtime", format1.format(record.getDate("createtime")));
+//                    }
+//                }
+//            }
+            success(page);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+    }
+
+    public void tushuzhuxiaobaobiao_list_print(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isBlank(starttime)) {
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.DATE, -365);
+                starttime = format1.format(now.getTime());
+            }
+            param.put("starttime", starttime);
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            List<Record> page = service.tushuzhuxiaobaobiao_list_print(orgid,param);
+            success(page);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+    }
+    /**
+     * 图书注销报表金额合计
+     */
+    public void tushuzhuxiaobaobiao_totalprice(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isBlank(starttime)) {
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.DATE, -365);
+                starttime = format1.format(now.getTime());
+            }
+            param.put("starttime", starttime);
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            success(service.tushuzhuxiaobaobiao_totalprice(orgid,param));
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+    }
+
+    public void tushuzhuxiaobaobiao_export(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            String orgname = new Org().dao().findById(orgid).getOrgname();
+
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isBlank(starttime)) {
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.DATE, -365);
+                starttime = format1.format(now.getTime());
+            }
+            param.put("starttime", starttime);
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            List list = service.tushuzhuxiaobaobiao_export(orgid,param);
+            /*LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
+            headMap.put("barcode", "图书条码");
+            headMap.put("title", "正题名");
+            headMap.put("author", "著者");
+            headMap.put("publisher", "出版社");
+            headMap.put("bookno", "索书号");
+            headMap.put("price", "定价(元)");
+            headMap.put("library", "馆藏地");
+            headMap.put("reason", "注销原因");
+            headMap.put("createtime", "注销日期");
+            //headMap.put("realname", "操作员");*/
+            String fields[] = {"barcode","isbn","title","author","publisher","publishdate","bookno","price","library","reason","createtime"};
+            ExcelExportUtil_template.exportExcel("图书注销清单.xls",this.getResponse(),orgname+"图书注销清单",list,fields,2);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+        renderNull();
+    }
+
+    public void tushuzhuxiaobaobiao_forup_export(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            String orgname = new Org().dao().findById(orgid).getOrgname();
+
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isBlank(starttime)) {
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.DATE, -365);
+                starttime = format1.format(now.getTime());
+            }
+            param.put("starttime", starttime);
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            String select = "select d.barcode,b.title,b.author,b.isbn,b.publisher,b.bookno,b.publishdate,b.typecode,b.price,l.library,z.reason," +
+                    "DATE_FORMAT(z.createtime,'%Y-%m-%d') as createtime,u.realname ";
+            StringBuilder where = new StringBuilder("from t_book_zhuxiao z inner join t_book_detail d on z.bookdetailid=d.id " +
+                    "inner join t_book b on b.id=z.bookid left join t_user u on u.id=z.operatorid " +
+                    "inner join t_library l on l.id=d.libraryid where z.status = 0 AND z.flag = 0 AND z.orgid=? ");
+            List values = new ArrayList();
+            values.add(orgid);
+            if(param.get("starttime") != null && !"".equals(param.get("starttime"))){
+                where.append(" and z.createtime>=str_to_date('"+param.get("starttime")+" 00:00:00','%Y-%m-%d %H:%i:%S')");
+            }
+            if(param.get("endtime") != null && !"".equals(param.get("endtime"))){
+                where.append(" and z.createtime <= str_to_date('"+param.get("endtime")+" 23:59:59','%Y-%m-%d %H:%i:%S')");
+            }
+            String sql = select+where.toString();
+            List<Record> list = Db.find(sql,CommonUtils.listToArray(values));
+
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
+            SimpleDateFormat format2 = new SimpleDateFormat("yyyy.MM");
+            for(int i=1;i<=list.size();i++){
+                Record r  = list.get(i-1);
+                r.set("xuhao",i);
+                r.set("zhuxiaotype","");
+                r.set("num",1);
+                String publishdate = r.getStr("publishdate");
+                try{
+                    Date d = format2.parse(publishdate);
+                    r.set("publishdate", format.format(d));
+                }catch(Exception e){
+                    r.set("publishdate","未知");
+                }
+                String isbn = r.getStr("isbn");
+                try{
+                    isbn = isbn.replaceAll("-","");
+                    if(isbn.length() == 13 || isbn.length() == 10){
+                        r.set("isbn",isbn);
+                    }else{
+                        r.set("isbn", "未知");
+                    }
+                }catch(Exception e){
+                    r.set("isbn","未知");
+                }
+            }
+            /*LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
+            headMap.put("barcode", "图书条码");
+            headMap.put("title", "正题名");
+            headMap.put("author", "著者");
+            headMap.put("publisher", "出版社");
+            headMap.put("bookno", "索书号");
+            headMap.put("price", "定价(元)");
+            headMap.put("library", "馆藏地");
+            headMap.put("reason", "注销原因");
+            headMap.put("createtime", "注销日期");
+            //headMap.put("realname", "操作员");*/
+            String fields[] = {"xuhao","title","author","publisher","publishdate","isbn","typecode","num","zhuxiaotype"};
+            ExcelExportUtil_template.exportExcel("馆藏清查模板.xls",this.getResponse(),"附件2\n" +
+                    "馆藏清查导入说明:\n" +
+                    "1、红色标记的列表列名是必填项\n" +
+                    "2、出版日期字段值格式为:yyyy-MM,如:2014-09;如果年代久远,无法填写,则需填入“未知”;\n" +
+                    "3、书号(ISBN)字段值格式为10位isbn编码或13位978开头的图书号;如果年代久远,无法填写,则需填入“未知”;\n" +
+                    "4、图书分类:分类号即中图分类号,通常在图书的CIP页可以找到,如G792;\n" +
+                    "5、清理类别为下拉选择项:只有三个值,即非法,不适宜,外观差、无保存价值",list,fields,4);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+        renderNull();
+    }
+
+    /**
+     * 图书个别登记簿
+     */
+    public void tushugebiedengjibu(){
+        render("/view/print/tushugebiedengjibu.html");
+    }
+    public void tushugebiedengjibu_list(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            String starttime = this.getPara("startDate");
+            if(StringUtils.isNotBlank(starttime)){
+                param.put("starttime", starttime);
+            }
+            String endtime = this.getPara("endDate");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            String guancangId = this.getPara("guancangId");
+            if(StringUtils.isNotBlank(guancangId)){
+                param.put("guancangId", guancangId);
+            }
+//            int pageNumber = 1;
+//            if (this.getParaToInt("pageNumber", 0) > 0) {
+//                pageNumber = getParaToInt("pageNumber");
+//            }
+
+            Page<Record> page = service.tushugebiedengjibu_page(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),orgid,param);
+            if(page.getList() != null && page.getList().size()>0){
+                for(Record record : page.getList()){
+                    if(record.get("createtime") != null) {
+                        record.set("createtime", format1.format(record.getDate("createtime")));
+                    }
+
+                }
+            }
+            success(page);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+
+    }
+    //图书个别登记薄打印
+    public void tushugebiedengjibu_list_print(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+//            String starttime = this.getPara("starttime");
+//            if (StringUtils.isBlank(starttime)) {
+//                Calendar now = Calendar.getInstance();
+//                now.add(Calendar.DATE, -365);
+//                starttime = format1.format(now.getTime());
+//            }
+//            param.put("starttime", starttime);
+//            String endtime = this.getPara("endtime");
+//            if(StringUtils.isNotBlank(endtime)){
+//                param.put("endtime", endtime);
+//            }
+            String guancangId = this.getPara("guancangId");
+            if(StringUtils.isNotBlank(guancangId)){
+                param.put("guancangId", guancangId);
+            }
+//            int pageNumber = 1;
+//            if (this.getParaToInt("pageNumber", 0) > 0) {
+//                pageNumber = getParaToInt("pageNumber");
+//            }
+
+            List<Record> page = service.tushugebiedengjibu_list_print(orgid,param);
+
+            success(page);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+
+    }
+    public void tushugebiedengjibu_export(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            String orgname = orgDao.findById(orgid).getOrgname();
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isNotBlank(starttime)) {
+                param.put("starttime", starttime);
+            }
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            String guancangId = this.getPara("guancangId");
+            if(StringUtils.isNotBlank(guancangId)){
+                param.put("guancangId", guancangId);
+            }
+            List list = service.tushugebiedengjibu_export(orgid,param);
+            /*LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
+            headMap.put("createtime", "日期");
+            headMap.put("barcode", "图书条码");
+            headMap.put("title", "正题名");
+            headMap.put("author", "著者");
+            headMap.put("publisher", "出版社");
+            headMap.put("publishdate", "出版年月");
+            headMap.put("newsource", "图书来源");
+            headMap.put("totalpages", "页数");
+            headMap.put("price", "定价(元)");
+            headMap.put("fuzhu", "附注");*/
+
+//            String fields[] = {"createtime","bookno","title","author","publisher","publishdate","newsource","totalpages","price","fuzhu"};
+            String fields[] = {"createtime","barcode","title","author","edition","newsource","price"};
+            ExcelExportUtil_template.exportExcel_2007("图书个别登记薄.xlsx",this.getResponse(),orgname+"图书个别登记簿",list,fields,2);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+        renderNull();
+    }
+    /**
+     * 图书总括登记簿
+     */
+        public void tushuzongkuodengjibu(){
+        render("/view/print/tushuzongkuodengjibu.html");
+    }
+    public void tushuzongkuodengjibu_list(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isBlank(starttime)) {
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.DATE, -365);
+                starttime = format1.format(now.getTime());
+            }
+            param.put("starttime", starttime);
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+
+            List<Record> result = service.tushuzongkuodengjibu_list(orgid,param);
+
+            Page page = new Page(result, 1, 10000, 1, result.size());
+            success(page);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+    }
+
+    public void tushuzongkuodengjibu_list_print(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isBlank(starttime)) {
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.DATE, -365);
+                starttime = format1.format(now.getTime());
+            }
+            param.put("starttime", starttime);
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+
+            List<Record> list = service.tushuzongkuodengjibu_list(orgid,param);
+
+            success(list);
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+    }
+    public void tushuzongkuodengjibu_export(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+            String orgname = new Org().dao().findById(orgid).getOrgname();
+            Map param = new HashMap();
+            String starttime = this.getPara("starttime");
+            if (StringUtils.isBlank(starttime)) {
+                Calendar now = Calendar.getInstance();
+                now.add(Calendar.DATE, -365);
+                starttime = format1.format(now.getTime());
+            }
+            param.put("starttime", starttime);
+            String endtime = this.getPara("endtime");
+            if(StringUtils.isNotBlank(endtime)){
+                param.put("endtime", endtime);
+            }
+            List list = service.tushuzongkuodengjibu_list(orgid,param);
+            String fields[] = {"createtime","batchname","zongzhongshu","zongceshu","totalprice","type1_cs","type1_zs","type2_cs","type2_zs",
+                    "type3_cs","type3_zs","type4_cs","type4_zs","type5_cs","type5_zs",};
+            ExcelExportUtil_template.exportExcel("图书总括登记薄.xls",this.getResponse(),orgname+"图书总括登记薄",list,fields,3);
+
+
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+        renderNull();
+    }
+    private <T> void fillSheet(
+            WritableSheet sheet,
+            List<T> list,
+            LinkedHashMap<String,String> fieldMap,
+            int firstIndex,
+            int lastIndex
+    )throws Exception{
+
+        //定义存放英文字段名和中文字段名的数组
+        String[] enFields=new String[fieldMap.size()];
+        String[] cnFields=new String[fieldMap.size()];
+
+        //填充数组
+        int count=0;
+        for(Map.Entry<String,String> entry:fieldMap.entrySet()){
+            enFields[count]=entry.getKey();
+            cnFields[count]=entry.getValue();
+            count++;
+        }
+        sheet.addCell(new Label(5,0,"A马列主义毛泽东思想"));
+        sheet.addCell(new Label(7,0,"B 哲学、宗教"));
+        sheet.addCell(new Label(9,0,"C-K 社会科学"));
+        sheet.addCell(new Label(11,0,"N-X 自然科学"));
+        sheet.addCell(new Label(13,0,"Z 综合性图书"));
+        //填充表头
+        for(int i=0;i<cnFields.length;i++){
+            if(i<5){
+                sheet.addCell(new Label(i,0,cnFields[i]));
+            }else{
+                sheet.addCell(new Label(i,1,cnFields[i]));
+            }
+
+        }
+
+        sheet.mergeCells(0,0,0,1);
+        sheet.mergeCells(1,0,1,1);
+        sheet.mergeCells(2,0,2,1);
+        sheet.mergeCells(3,0,3,1);
+        sheet.mergeCells(4,0,4,1);
+        sheet.mergeCells(5,0,6,0);
+        sheet.mergeCells(7,0,8,0);
+        sheet.mergeCells(9,0,10,0);
+        sheet.mergeCells(11,0,12,0);
+        sheet.mergeCells(13,0,14,0);
+        //填充内容
+        int rowNo=2;
+        for(int index=firstIndex;index<=lastIndex;index++){
+            //获取单个对象
+            T item=list.get(index);
+            for(int i=0;i<enFields.length;i++){
+                Object objValue=ExcelExportUtil.getFieldValueByNameSequence(enFields[i], item);
+                String fieldValue=objValue==null ? "" : objValue.toString();
+                Label label =new Label(i,rowNo,fieldValue);
+                sheet.addCell(label);
+            }
+
+            rowNo++;
+        }
+
+        //设置自动列宽
+        ExcelExportUtil.setColumnAutoSize(sheet, 5);
+    }
+
+
+    public void book_export(){
+        try {
+            Map param = new HashMap();
+            param.put("isbn",getPara("isbn"));
+            param.put("orgid",getPara("orgid"));
+            param.put("typeid",getPara("typeid"));
+            param.put("title",getPara("title"));
+            param.put("author",getPara("author"));
+            param.put("publisher",getPara("publisher"));
+            param.put("bookno",getPara("bookno"));
+            param.put("bookstatus",getPara("bookstatus"));
+            List<Record> list = service.book_export(param);
+
+            LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
+            headMap.put("isbn", "ISBN");
+            headMap.put("title", "正题名");
+            headMap.put("author", "著者");
+            headMap.put("publisher", "出版社");
+            headMap.put("publishaddress", "出版地");
+            headMap.put("price", "定价(元)");
+            headMap.put("bookno", "索书号");
+            headMap.put("booknum", "复本数");
+            try {
+                ExcelExportUtil.listToExcel(list,headMap, "馆藏图书清单", this.getResponse());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            success();
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+    }
+
+    public void periodical_export(){
+        try {
+            int orgid = ((User) this.getSessionAttr("userInfo")).getOrgid();
+
+            Map param = new HashMap();
+
+            if(CommonUtils.isNotNullOrNotEmpty(getPara("issnorkanming"))){
+                param.put("issnorkanming",getPara("issnorkanming"));
+            }
+            if(CommonUtils.isNotNullOrNotEmpty(getPara("chubanpinlv"))) {
+                param.put("chubanpinlv",getPara("chubanpinlv"));
+            }
+            if(CommonUtils.isNotNullOrNotEmpty(getPara("issn")) && !"null".equals(getPara("issn"))) {
+                param.put("issn",getPara("issn"));
+            }
+            param.put("orgid",getPara("orgid"));
+
+            List<Record> list = service.periodical_export(orgid,param);
+
+            LinkedHashMap<String, String> headMap = new LinkedHashMap<String, String>();
+            headMap.put("kanming", "刊名");
+            headMap.put("bianjibu", "编辑部");
+            headMap.put("issn", "ISSN");
+            headMap.put("tongyikanhao", "统一刊号");
+            headMap.put("youfadaihao", "邮发代号");
+            headMap.put("chubanpinlv", "出版频率");
+            headMap.put("bookno", "索刊号");
+            headMap.put("niandu", "年度");
+            headMap.put("qizhiqi", "起止期");
+            headMap.put("price", "价格");
+            headMap.put("num", "复本数");
+            try {
+                ExcelExportUtil.listToExcel(list,headMap, "馆藏期刊清单", this.getResponse());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            success();
+        }catch(Exception e){
+            logger.error("",e);
+            fail();
+        }
+    }
+
+    public void mulukadayinPage(){
+        render("/view/print/mulukadayin.html");
+    }
+
+    public void mulukadayin(){
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String title = getPara("title");
+        String isbn = getPara("isbn");
+        String bookno = getPara("bookno");
+        String publisher = getPara("publisher");
+        //String title = getPara("title");
+        String typecode = getPara("typecode");
+
+        int pageNumber = 1;
+        if (this.getParaToInt("pageNumber", 0) > 0) {
+            pageNumber = getParaToInt("pageNumber");
+        }
+        int pageSize = this.getParaToInt("pageSize", PAGESIZE);
+        Page<Record> page = service.mulukadayin(orgid,title,isbn,bookno,publisher,typecode,pageNumber,pageSize);
+
+        Record r = Db.findFirst("SELECT * FROM t_org_setting WHERE orgid = ?",orgid);
+        List reList = new ArrayList();
+        for(Record record : page.getList()) {
+            int id = record.getInt("id");
+            List<Record> recordList = Db.find("SELECT cast(REPLACE(b.barcode,(select ifnull(tstiaoxingmaqianzhui,'') from t_org_setting where orgid = a.orgid), '') as UNSIGNED INTEGER) barcode FROM t_book a INNER JOIN t_book_detail b ON a.id = b.bookid where bookid=? order by barcode asc",id);
+            List<Record> detailList = barcodeOrder(recordList,r);
+            record.set("barcodeList",detailList);
+            reList.add(record);
+        }
+        success(page);
+    }
+
+    public void mulukadayin_all(){
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String title = getPara("title");
+        String isbn = getPara("isbn");
+        String bookno = getPara("bookno");
+        String publisher = getPara("publisher");
+        String typecode = getPara("typecode");
+        List<Record> list= service.mulukadayin(orgid,title,isbn,bookno,publisher,typecode);
+        Record r = Db.findFirst("SELECT * FROM t_org_setting WHERE orgid = ?",orgid);
+        List reList = new ArrayList();
+        for(Record record : list) {
+            int id = record.getInt("id");
+            List<Record> recordList = Db.find("SELECT cast(REPLACE(b.barcode,(select ifnull(tstiaoxingmaqianzhui,'') from t_org_setting where orgid = a.orgid), '') as UNSIGNED INTEGER) barcode FROM t_book a INNER JOIN t_book_detail b ON a.id = b.bookid where bookid=? order by barcode asc",id);
+            List<Record> detailList = barcodeOrder(recordList,r);
+            record.set("barcodeList",detailList);
+            reList.add(record);
+        }
+        success(reList);
+    }
+
+    private List barcodeOrder(List<Record> barcodeList,Record settingRecord){
+        String tstiaoxingmaqianzhui = settingRecord.getStr("tstiaoxingmaqianzhui");
+        if(CommonUtils.isNullOrEmpty(tstiaoxingmaqianzhui)) {
+            tstiaoxingmaqianzhui = "";
+        }
+        int tstiaoxinmaweishu = settingRecord.getInt("tstiaoxinmaweishu");
+        List reList = new ArrayList();
+        StringBuffer barcodeStr = new StringBuffer();
+        BigInteger check = BigInteger.ZERO;
+        for (int i = 0; i < barcodeList.size(); i ++) {
+            BigInteger start = (barcodeList.get(i)).get("barcode");
+            if(i == 0) {
+                check = start;
+            }
+            if(barcodeList.size() > i+1) {
+                BigInteger next = (barcodeList.get(i+1)).get("barcode");
+                //如果下个条码-1 等于当前条码 则说明是连续的。
+                if(check.compareTo(next.subtract(BigInteger.ONE)) == 0) {
+                    check = next;
+                    if ("".equals(barcodeStr.toString())) {
+                        barcodeStr.append(formatBarcode(start, tstiaoxinmaweishu, tstiaoxingmaqianzhui));
+                    }
+                } else {
+                    if ("".equals(barcodeStr.toString())) {
+                        barcodeStr.append(formatBarcode(start, tstiaoxinmaweishu, tstiaoxingmaqianzhui));
+                    }else {
+                        barcodeStr.append("-").append(formatBarcode(check, tstiaoxinmaweishu, tstiaoxingmaqianzhui));
+                    }
+                    reList.add(barcodeStr.toString());
+                    barcodeStr = new StringBuffer();
+                    check = next;
+                }
+            } else {
+                if(barcodeList.size() == 1) {
+                    barcodeStr.append(formatBarcode(start, tstiaoxinmaweishu, tstiaoxingmaqianzhui));
+                    reList.add(barcodeStr.toString());
+                    barcodeStr = new StringBuffer();
+                }else{
+                    if ("".equals(barcodeStr.toString())) {
+                        barcodeStr.append(formatBarcode(start, tstiaoxinmaweishu, tstiaoxingmaqianzhui));
+                    }else {
+                        barcodeStr.append("-").append(formatBarcode(check, tstiaoxinmaweishu, tstiaoxingmaqianzhui));
+                    }
+                    reList.add(barcodeStr.toString());
+                }
+            }
+        }
+        return reList;
+    }
+
+    public String formatBarcode(BigInteger bi, int tiaomaweishu, String tiaomaqianzui){
+        if(CommonUtils.isNullOrEmpty(tiaomaqianzui)){
+            tiaomaqianzui = "";
+        }
+        String barcode = bi+"";
+        String zerostr = "0000000000000000000000000000";
+        int bulingcount = tiaomaweishu - barcode.length();
+        if(bulingcount>=0) {
+            String tempStr = zerostr.substring(0,bulingcount);
+            return tiaomaqianzui + tempStr + barcode;
+        }else {
+            return "";
+        }
+    }
+
+
+}

+ 79 - 0
src/main/java/com/controller/ReaderAuthController.java

@@ -0,0 +1,79 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.model.BooktypeAuth;
+import com.model.ReaderAuth;
+import com.service.ReaderAuthService;
+import com.tools.JwtUtils;
+
+@ControllerInterface(path="/readerauth")
+public class ReaderAuthController extends BaseController {
+    ReaderAuthService service = ReaderAuthService.me;
+
+    public void index() {
+        render("/view/reader/readerauth.html");
+    }
+
+    public void list(){
+        Integer orgid = getParaToInt("bean.orgid");
+        success(service.list(orgid));
+    }
+    public void getById(){
+        int id =this.getParaToInt("bean.id", 0);
+        if(id == 0){
+            fail();
+        }
+        success(service.findById(id));
+    }
+
+    public void addOrUpdate(){
+        ReaderAuth bean = getBean(ReaderAuth.class,"bean");
+        String token = this.getPara("token");
+        try {
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            service.addOrUpdate(bean,operatorid);
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail(0,e.getMessage());
+        }
+    }
+
+
+    public void delete(){
+        Integer id = getParaToInt("id");
+        service.deleteById(id);
+        success();
+    }
+
+
+    public void booktypeauth(){
+        int orgid=getParaToInt("orgid",0);
+        success(service.findBooktypeAuth(orgid));
+    }
+
+
+    public void saveOrUpdateBookTypeAuth(){
+        BooktypeAuth booktypeAuth=getBean(BooktypeAuth.class,"bean");
+        if (booktypeAuth.getId()==null){
+            booktypeAuth.save();
+        }else {
+            booktypeAuth.update();
+        }
+        success();
+    }
+
+    public void findBookTypeAuthByIDS(){
+        String booktypeauthids=getPara("booktypeauthid");
+        if (booktypeauthids==""){
+            fail();
+            return;
+        }
+        success(service.findBooktypeAuthByIds(booktypeauthids));
+    }
+}

+ 713 - 0
src/main/java/com/controller/ReaderController.java

@@ -0,0 +1,713 @@
+package com.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.upload.UploadFile;
+import com.model.*;
+import com.model.Reader;
+import com.service.*;
+import com.tools.JwtUtils;
+import com.utils.*;
+import com.validator.ReaderValidator;
+import org.apache.commons.io.FileUtils;
+import org.apache.poi.ss.usermodel.*;
+
+import java.io.*;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@ControllerInterface(path="/reader")
+public class ReaderController extends BaseController {
+    ReaderService service = ReaderService.me;
+    EquipmentFace equipmentFaceDao = new EquipmentFace().dao();
+    DictService dictService = DictService.me;
+    OrgDept orgDeptDao = new OrgDept().dao();
+    OrgDeptService orgDeptService = OrgDeptService.me;
+    ReaderAuth readerAuthDao = new ReaderAuth().dao();
+    ReaderAuthService readerAuthService= ReaderAuthService.me;
+
+    SysConfigService sysConfigService=SysConfigService.me;
+
+    public void index() {
+        render("/view/reader/reader.html");
+    }
+
+    public void curdate(){
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        success(sdf.format(new Date()));
+    }
+
+    public void readerauthdate(){
+        int year = getParaToInt("year");
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.YEAR, year);
+        success(DateUtils.getTimeToDay(cal.getTime()));
+    }
+
+    public void list(){
+        Reader bean = getBean(Reader.class,"bean");
+        String deptname = getPara("deptname");
+        success(service.paginate(this.getParaToInt("pageNumber"),getParaToInt("pageSize"),bean,deptname));
+    }
+    public void getById(){
+        int id =this.getParaToInt("bean.id", 0);
+        if(id == 0){
+            fail();
+            return;
+        }
+        success(service.findById(id));
+    }
+    //增加或修改
+    @Before(ReaderValidator.class)
+    public void addOrUpdate(){
+
+        Reader reader = getBean(Reader.class,"bean");
+        String token = this.getPara("token");
+        try {
+            Map userinfo = JwtUtils.validateJWTForMap(token);
+            int orgid = (Integer) userinfo.get("orgid");
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            if(service.findReaderByCardNumber(reader.getCardnumber(),reader.getId(),reader.getOrgid())){
+                logger.info("读者证号重复!");
+                fail(1,"读者证号重复");
+                return;
+            }
+            OrgSetting orgSetting = sysConfigService.findOrgSetting(reader.getOrgid());
+            //reader.setCardnumber(CommonUtils.formatCardnumber(reader.getCardnumber(),orgSetting));
+            //reader.setCardnumber()
+            service.addOrUpdate(reader,operatorid);
+
+            new Thread(){
+                public void run(){
+                    List<EquipmentFace> list = equipmentFaceDao.find("select * from t_equipment_face where orgid=? ",orgid);
+                    for(EquipmentFace bean : list){
+                        try {
+                            OrgDept orgDept = orgDeptDao.findById(reader.getOrgdeptid());
+
+                            String orgname = "";
+                            String auth = "";
+                            if(orgDept != null){
+                                orgname = orgDept.getDeptname();
+                                //ReaderAuth readerAuth = readerAuthDao.findById(orgDept.getReaderauthid());
+                                //auth = "可借"+readerAuth.getJieyueshuliang()+"本";
+                            }
+                            String msgid = orgid + bean.getDeviceNo() + System.currentTimeMillis();
+                            Map map = new HashMap();
+                            map.put("msgType", "registerPersonInfo");
+                            map.put("msgID", msgid);
+                            map.put("deviceNo", bean.getDeviceNo());
+                            map.put("personInfoCount", "1");
+                            List<Map> l = new ArrayList();
+                            Map m = new HashMap();
+                            l.add(m);
+                            map.put("personInfoData", l);
+                            m.put("operateType", "0");
+                            m.put("idNumber", orgid + "_" + reader.getId());
+                            m.put("name", orgname+","+reader.getRealname());
+                            m.put("sex", reader.getSex());
+                            m.put("priority", "0");
+                            m.put("validDateStart","2020_01_01");
+                            m.put("validDateEnd","2060_01_01");
+                            m.put("registerPhoto1", reader.getFaceimage().substring(22));
+                            m.put("registerPhotoID1", reader.getId());
+                            m.put("voiceSpecialMode", "2");
+                            m.put("displaySpecialMode", "1");
+                            //System.out.println("想设备注册:"+JSON.toJSONString(map));
+
+
+                        }catch(Exception e){
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }.start();
+
+
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail(0,e.getMessage());
+        }
+    }
+
+    public void registReaderToFaceDevice(int orgid,Reader reader){
+
+
+
+
+    }
+    public void faceSearch(){
+        try {
+            String token = this.getPara("token");
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if (operatorid == 0) {
+                fail(3, "token错误");
+                return;
+            }
+            String orgid =getPara("orgid");
+            String json= FaceUtil.search(getPara("FaceBaseStr64").substring(22),orgid);
+            success(json);
+        }catch (Exception e){
+            fail();
+        }
+    }
+
+    //删除
+    public void delete(){
+        int id =this.getParaToInt("bean.id");
+        service.deleteById(this.getParaToInt("bean.id", 0));
+        success();
+    }
+    //下拉选
+    public void selectType(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        Map map = service.selectType(operatorid);
+        success(map);
+    }
+
+    /**
+     * 批量修改读者权限
+     */
+    public void resetrole(){
+        String[] ids=getParaValues("idlist[]");
+        int roleid = this.getParaToInt("roleid");
+        int orgid = this.getParaToInt("orgid");
+        for (String id : ids){
+            Db.update("update t_reader set readerauthid = ? where id = ? and orgid = ?",roleid,id,orgid);
+        }
+        success();
+    }
+
+    /**
+     * 批量修改读者部门
+     */
+    public void resetdept(){
+        String[] ids=getParaValues("idlist[]");
+        int deptid = this.getParaToInt("deptid");
+        int orgid = this.getParaToInt("orgid");
+        for (String id : ids){
+            Db.update("update t_reader set orgdeptid = ? where id = ? and orgid = ?",deptid,id,orgid);
+        }
+        success();
+    }
+
+    /**
+     * 批量修改读者权限
+     */
+    public void batchresetReaderStatus(){
+        String token = this.getPara("token");
+        Map userinfo = JwtUtils.validateJWTForMap(token);
+        int orgid = (Integer) userinfo.get("orgid");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        String cardnumberstr = this.getPara("cardnumberstr");
+        String cardnumbers[] = cardnumberstr.split(",");
+        //String resetroleselecttoreader = this.getPara("resetroleselecttoreader");
+        String errorinfo = "";
+        int status = getParaToInt("status", 1);
+        for(String cardnumber : cardnumbers) {
+            try {
+                if (CommonUtils.isNullOrEmpty(cardnumber)) {
+                    continue;
+                }
+                Db.update("update t_reader set status=? where orgid=? and (cardnumber=? or readcardcode=?) ",status, orgid, cardnumber, cardnumber);
+            /*Record record = Db.findFirst("select * from t_reader where orgid = ? and cardnumber =? ",orgid,cardnumber);
+            if(CommonUtils.isNullOrEmpty(record)){
+                errorinfo+=cardnumber+" ";
+                continue;
+            }*/
+                //Db.update("update t_reader set readerauthid = ? where id = ?",resetroleselecttoreader,record.getInt("id"));
+            }catch(Exception e){
+                e.printStackTrace();
+            }
+        }
+        success(errorinfo);
+
+    }
+
+
+    //注销或停用
+    public void status(){
+        String[] ids=getParaValues("idlist[]");
+        int status = this.getParaToInt("status");
+        for (String id : ids){
+            service.status(Integer.parseInt(id),status);
+        }
+        success();
+    }
+
+    //更新失效日期
+    public void updatelosedate(){
+        String[] ids=getParaValues("idlist[]");
+        String lostdate = this.getPara("lostdate");
+        service.updatelosedate(ids,lostdate);
+        success();
+    }
+
+    //重置密码
+    public void resetStatus(){
+        int id =this.getParaToInt("id");
+        service.resetStatus(this.getParaToInt("id", 0));
+        success();
+    }
+
+    public void readerAccessImport(){
+        success(PropKit.use("config.txt").getBoolean("ReaderAccessImport"));
+    }
+
+    public void upload(){
+        try{
+            String token = this.getPara("token");
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            int orgid = getParaToInt("orgid");
+
+
+            Map<String,Integer> dictMap=dictService.dictmap();
+            Map<String,Integer>  readerAuthMap=readerAuthService.findReaderAuthByName(orgid);
+            List<OrgDept> orgDeptList=orgDeptService.findOrgDept(orgid);
+
+            OrgSetting orgSetting=sysConfigService.findOrgSetting(orgid);
+
+            UploadFile file =getFile();
+            List<Map<String,String>> errorDataList = new ArrayList<Map<String,String>>();
+
+            List<Map<String,String>> readerList=null;
+
+            if ("Excel".equals(getPara("ImportType"))){
+                readerList=  ExcelUtil.readExcel(new FileInputStream(file.getFile()));
+            }else if ("Access".equals(getPara("ImportType"))){
+                readerList=  AccessUtil.getAccessData(file.getFile().getAbsolutePath());
+            }else if ("Foxpro".equals(getPara("ImportType"))){
+                readerList= FoxproUtil.getFoxProData(file.getFile().getAbsolutePath());
+            }else {
+                fail(0,"错误的导入方式!");
+                return;
+            }
+
+            Set<String> cardNumberSet =new HashSet<String>();
+            StringBuffer cards = new StringBuffer();
+            for (Map<String,String> readermap:readerList){
+                if (readermap.get("读者证号") ==null || readermap.get("读者证号").trim().equals("")){
+                    fail(0,"读者证号不能为空!");
+                    return;
+                }
+                while (orgSetting !=null &&orgSetting.getJieshuzhengweishu() !=null && readermap.get("读者证号").length()<orgSetting.getJieshuzhengweishu()){
+                    readermap.put("读者证号","0"+readermap.get("读者证号"));
+                }
+                if (orgSetting !=null && orgSetting.getJieshuzhengqianzhui() !=null && !orgSetting.getJieshuzhengqianzhui().equals("")){
+                    readermap.put("读者证号",orgSetting.getJieshuzhengqianzhui()+readermap.get("读者证号"));
+                }
+                int size = cardNumberSet.size();
+                cardNumberSet.add(readermap.get("读者证号"));
+                if(size == cardNumberSet.size()){
+                    cards = cards.append(readermap.get("读者证号")).append(" ");
+                }
+            }
+            if (cardNumberSet.size() != readerList.size()){
+                fail(0,"上传文件内读者证号重复!"+cards.toString());
+                return;
+            }
+
+            List<Record> list = service.findReaderByCardNumber(cardNumberSet,orgid);
+            if (list.size()>0){
+                StringBuffer cards1 = new StringBuffer();
+                for(Record record : list){
+                    cards1 = cards1.append(record.getStr("cardnumber")).append(" ");
+                }
+                fail(0,cards1 + "读者证号重复!不能导入");
+                return;
+            }
+
+
+            for (Map<String,String> readermap: readerList) {
+                try{
+                    Reader reader=new Reader();
+                    reader.setOrgid(orgid); //所属机构
+                    reader.setReadertypeid(dictMap.get(readermap.get("读者类型")));
+                    if (reader.getReadertypeid() ==null){
+                        readermap.put("未导入原因","读者类型不正确!");
+                        errorDataList.add(readermap);
+                        continue;
+                    }
+
+                    reader.setCardnumber(readermap.get("读者证号")); //'借书证号'
+                    if(reader.getCardnumber()==null || reader.getCardnumber().trim().equals("")){
+                        readermap.put("未导入原因","读者证号不能为空!");
+                        errorDataList.add(readermap);
+                        continue;
+                    }
+
+
+
+                    reader.setRealname(readermap.get("姓名")); // 真实姓名
+                    reader.setSex(readermap.get("性别"));
+                    reader.setPassword(CommonUtils.getMD5String(CommonUtils.getMD5String(PropKit.get("initPassword"))));
+
+                    for (OrgDept orgDept : orgDeptList){
+                        if (orgDept.getDeptname().equals(readermap.get("所属部门/班级"))){
+                            reader.setOrgdeptid(orgDept.getId());
+                            break;
+                        }
+                    }
+                    if (reader.getOrgdeptid()==null){
+                        readermap.put("未导入原因","所属部门/班级不正确!");
+                        OrgDept orgDept = new OrgDept();
+                        orgDept.setDeptname(readermap.get("所属部门/班级")).setOrgid(orgid).save();
+                        reader.setOrgdeptid(orgDept.getId());
+                        //errorDataList.add(readermap);
+                        orgDeptList=orgDeptService.findOrgDept(orgid);
+                        //continue;
+                    }
+
+                    reader.setReaderauthid(readerAuthMap.get(readermap.get("借阅权限")));
+                    if(reader.getReaderauthid() ==null){
+                        readermap.put("未导入原因","借阅权限不正确!");
+                        errorDataList.add(readermap);
+                        continue;
+                    }
+
+                    if (readermap.get("失效日期") !=null ){
+                        reader.setLosedate(DateUtils.getSimpleDateFormat("yyyy-MM-dd").parse(readermap.get("失效日期")));
+                    }
+
+                    reader.setCertificatetypeid(dictMap.get(readermap.get("有效证件"))); //证件类型id
+                    reader.setCertificate(readermap.get("证件号码"));
+                    if (readermap.get("出生日期") !=null && !readermap.get("出生日期").equals("")){
+                        reader.setBirthday(DateUtils.getSimpleDateFormat("yyyy-MM-dd").parse(readermap.get("出生日期")));
+                    }
+
+                    reader.setPhone(readermap.get("联系电话"));
+                    reader.setEmail(readermap.get("'邮箱'"));
+                    reader.setCreatetime(new Date());
+                    reader.setOperatorid(operatorid);
+                    reader.setStatus(1);
+
+                    reader.save();
+                    Map map = new HashMap();
+                    map.put("orgid",reader.getOrgid()+"");
+                    map.put("realname",reader.getRealname());
+                    map.put("sex",reader.getSex());
+                    if(CommonUtils.isNotNullOrNotEmpty(reader.getBirthday())){
+                        map.put("birthday",format3.format(reader.getBirthday()));
+                    }
+                    map.put("readertypeid",reader.getReadertypeid()+"");
+                    map.put("createtime",format3.format(reader.getCreatetime()));
+                    Thread t = new Thread() {
+                        public void run() {
+                            HttpKit.get(PropKit.get("addReaderServiceUrl"), map);
+                        }
+                    };
+                    t.start();
+                }catch (Exception e){
+                    e.printStackTrace();
+                    if (e instanceof ParseException){
+                        readermap.put("未导入原因","日期格式不正确");
+                    }else{
+                        readermap.put("未导入原因",e.getMessage());
+                    }
+                    errorDataList.add(readermap);
+                }
+            }
+            String filename="";
+            if (errorDataList.size()>0){
+                filename="读者未导入列表"+ DateUtils.getNowTimeNo()+".xls";
+                File targetFile =new File(getRequest().getRealPath("upload")+ File.separator+filename);
+                ExcelUtil.writeExcel(targetFile,errorDataList,"读者未导入列表");
+            }
+            success(filename);
+        }catch (Exception e){
+            e.printStackTrace();
+            fail(0,e.getMessage());
+        }
+    }
+
+
+    public void export(){
+        String path =getRequest().getRealPath("upload")+"/template/读者信息导入模板.xls";
+        try{
+            File targetFile =new File(path);
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(targetFile));
+            Sheet sheet = workbook.getSheetAt(0);
+
+            Reader bean = getBean(Reader.class,"bean");
+            List<Record> readerList=service.export(bean);
+            int rowindex=3;
+            for (Record reader :readerList){
+                Row row =sheet.getRow(rowindex);
+                if (row==null){
+                    row = sheet.createRow(rowindex);
+                }
+                row.createCell(0).setCellValue(reader.getStr("cardtypename"));
+                row.createCell(1).setCellValue(reader.getStr("cardnumber"));
+                row.createCell(2).setCellValue(reader.getStr("realname"));
+                row.createCell(3).setCellValue(reader.getStr("sex"));
+                row.createCell(4).setCellValue(reader.getStr("deptname"));
+                row.createCell(5).setCellValue(reader.getStr("authname"));
+                row.createCell(6).setCellValue(reader.getStr("losedate")==null?"":reader.getStr("losedate").split(" ")[0]);
+                row.createCell(7).setCellValue(reader.getStr("certificatetypename"));
+                row.createCell(8).setCellValue(reader.getStr("certificate"));
+                rowindex++;
+            }
+            File tempFile =File.createTempFile("读者信息"+DateUtils.getSimpleDateFormat("yyyy-MM-dd").format(new Date()),".xls", new File(getRequest().getRealPath("upload")));
+            FileOutputStream outputStream=new FileOutputStream(tempFile);
+            workbook.write(outputStream);
+            outputStream.close();
+            workbook.close();
+            renderFile(tempFile);
+
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try{
+                        Thread.sleep(100*60);
+                        tempFile.delete();
+                    }catch (Exception e){
+                    }
+                }
+            }).start();
+        }catch (Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+
+    public void readerBioKey(){
+        Integer orgid = getParaToInt("orgid");
+        success(service.findBioKey(orgid));
+    }
+
+    public void uploadreaderinfopage(){
+        render("/view/uploadorginfo/uploadreaderinfopage.html");
+    }
+
+    public void uploadreaderinfo(){
+        UploadFile file = getFile();
+        String token = this.getPara("token");
+        Integer operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0) {
+            fail(0,"权限异常");
+            return;
+        }
+        User user = (User)getSession().getAttribute("userInfo");
+        Integer orgid = user.getOrgid();
+        if(CommonUtils.isNullOrEmpty(orgid)){
+            fail(0,"orgid不能为空");
+            return;
+        }
+
+        Record orgrecord = Db.findById("t_org",orgid);
+        if(CommonUtils.isNullOrEmpty(orgrecord)){
+            fail(0,"获取不到机构信息");
+            return;
+        }
+        Calendar calendar = Calendar.getInstance();
+        Calendar lostCalendar = Calendar.getInstance();
+        lostCalendar.add(Calendar.YEAR,3);
+        Record readerAuthRecord = Db.findFirst("select * from t_reader_auth where orgid = ? order by jieyueshuliang asc",orgid);
+        List<Map<String,String>> errorDataList = new ArrayList<Map<String,String>>();
+        try {
+            List<Map<String,String>> readerList= readExcel(new FileInputStream(file.getFile()));
+            for(Map map : readerList) {
+                if (CommonUtils.isNullOrEmpty(map.get("所属用户"))){
+                    map.put("未导入原因","所属用户不能为空!");
+                    errorDataList.add(map);
+                    continue;
+                }
+                if (CommonUtils.isNullOrEmpty(map.get("班级/部门"))){
+                    map.put("未导入原因","班级/部门不能为空!");
+                    errorDataList.add(map);
+                    continue;
+                }
+                if (CommonUtils.isNullOrEmpty(map.get("卡序列号"))){
+                    map.put("未导入原因","卡序列号不能为空!");
+                    errorDataList.add(map);
+                    continue;
+                }
+                Reader reader = new Reader();
+                String cardnumber = map.get("卡序列号").toString();
+//                long valueTen = Long.parseLong(cardnumber);
+                //将其转换为十六进制并输出
+//                char a[] = Long.toHexString(valueTen).toUpperCase().toCharArray();
+                try{
+//                    cardnumber = ""+a[6]+a[7]+a[4]+a[5]+a[2]+a[3]+a[0]+a[1];
+                    cardnumber = CommonUtils.toHexFormat(cardnumber,8);
+                    Record readerre = Db.findFirst("select id from t_reader where orgid = ? and (cardnumber = ? or readcardcode = ?)",orgid,cardnumber,cardnumber);
+                    if(CommonUtils.isNotNullOrNotEmpty(readerre)){
+                        map.put("未导入原因","读者重复!"+cardnumber);
+                        errorDataList.add(map);
+                        continue;
+                    }
+                }catch (Exception e) {
+                    logger.info("条码转换异常",e);
+                    map.put("未导入原因","条码转换异常!");
+                    errorDataList.add(map);
+                    continue;
+                }
+                reader.setOrgid(orgid);
+                String className = map.get("班级/部门").toString();
+                String replaceClassName = map.get("班级/部门").toString();
+                if(className.indexOf("C") == 0){
+                    replaceClassName = replaceClassName.replace("C","初");
+                } else if(className.indexOf("G") == 0){
+                    replaceClassName = replaceClassName.replace("G","高");
+                } else {
+                    replaceClassName = "默认部门";
+                }
+                Record orgdeptRecord = Db.findFirst("select * from t_org_dept where (deptname = ? or deptname = ?) and orgid = ?",replaceClassName,className,orgid);
+                if(CommonUtils.isNullOrEmpty(orgdeptRecord)) {
+                    replaceClassName = "默认部门";
+                    orgdeptRecord = Db.findFirst("select * from t_org_dept where (deptname = ? or deptname = ?) and orgid = ?",replaceClassName,className,orgid);
+                }
+                if(CommonUtils.isNullOrEmpty(orgdeptRecord)){
+                    OrgDept newRecord = new OrgDept();
+                    newRecord.set("deptname","默认部门");
+                    newRecord.set("orgid",orgid);
+                    newRecord.set("readerauthid",0); //机构暂无默认权限
+                    newRecord.set("createtime",new Date());
+                    newRecord.set("operatorid",0);
+                    newRecord.save();
+                    reader.setOrgdeptid(newRecord.getId());
+                } else {
+                    reader.setOrgdeptid(orgdeptRecord.getInt("id"));
+                }
+                reader.setCardnumber(cardnumber);
+                reader.setRealname(map.get("所属用户").toString());
+                reader.setPassword(cardnumber);
+                reader.setReadcardcode(cardnumber);
+                reader.setCreatetime(calendar.getTime());
+                reader.setLosedate(lostCalendar.getTime());
+                reader.setStatus(1);
+                reader.setReadertypeid(62);
+                reader.setReaderauthid(readerAuthRecord.getInt("id"));
+                reader.setOverdue(0);
+                reader.save();
+
+                Map dateplatMap = new HashMap();
+                dateplatMap.put("orgid",reader.getOrgid()+"");
+                dateplatMap.put("realname",reader.getRealname());
+                dateplatMap.put("sex",reader.getSex());
+                if(CommonUtils.isNotNullOrNotEmpty(reader.getBirthday())){
+                    dateplatMap.put("birthday",format3.format(reader.getBirthday()));
+                }
+                dateplatMap.put("readertypeid",reader.getReadertypeid()+"");
+                dateplatMap.put("createtime",format3.format(reader.getCreatetime()));
+                Thread t = new Thread() {
+                    public void run() {
+                        HttpKit.get(PropKit.get("addReaderServiceUrl"), dateplatMap);
+                    }
+                };
+                t.start();
+//                logger.info("读者保存成功 realname:"+reader.getRealname()+"  cardnumber:"+reader.getCardnumber());
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+        String filename="";
+        if (errorDataList.size()>0){
+            filename="未导入列表"+ DateUtils.getNowTimeNo()+".xls";
+            File targetFile =new File(getRequest().getRealPath("upload")+ File.separator+filename);
+            ExcelUtil.writeExcel(targetFile,errorDataList,"未导入列表");
+        }
+        success(filename);
+    }
+
+
+    public List<Map<String,String>> readExcel(InputStream in){
+        List<Map<String,String>> dataList = new ArrayList<Map<String,String>>();
+        try{
+            // 获得工作簿
+            Workbook workbook = WorkbookFactory.create(in);
+            // 获得工作表个数
+            int sheetCount = workbook.getNumberOfSheets();
+            // 遍历工作表
+            for (int i = 0; i < sheetCount; i++)
+            {
+                Sheet sheet = workbook.getSheetAt(i);
+                // 获得行数
+                int rows = sheet.getLastRowNum() + 1;
+                // 读取数据
+                for (int rownum = 1; rownum < rows; rownum++)                {
+                    Map<String,String> rowMap = new LinkedHashMap<String, String>();
+                    Row r = sheet.getRow(rownum);
+                    if(r ==null) continue;
+                    boolean flag = false; //行数据全部为空,不继续读
+                    for (int col = 0; col < sheet.getRow(2).getLastCellNum(); col++)
+                    {
+                        Cell cell = r.getCell(col);
+                        if(cell !=null){
+                            String value = getCellValue(cell);
+                            if (!"".equals(value.trim())){
+                                flag=true;
+                            }
+                            rowMap.put(getCellValue(sheet.getRow(0).getCell(col)),value);
+                        }else {
+                            rowMap.put(getCellValue(sheet.getRow(0).getCell(col)),"");
+                        }
+
+                    }
+                    if (flag){
+                        dataList.add(rowMap);
+                    }
+                }
+            }
+        }catch (Exception e) {
+        }
+        return dataList;
+    }
+
+    public String getCellValue(Cell cell){
+        if(cell.getCellType() == CellType.NUMERIC){
+            short format = cell.getCellStyle().getDataFormat();
+            SimpleDateFormat sdf = null;
+            if(format == 14 || format == 31 || format == 57 || format == 58){
+                //日期
+                sdf = new SimpleDateFormat("yyyy-MM-dd");
+            }else if (format == 20 || format == 32) {
+                //时间
+                sdf = new SimpleDateFormat("HH:mm");
+            }else { // 不是日期格式
+                NumberFormat nf = NumberFormat.getInstance();
+                String s = nf.format(cell.getNumericCellValue());
+                if (s.indexOf(",") >= 0) {
+                    s = s.replace(",", "");
+                }
+                return s;
+            }
+            double value = cell.getNumericCellValue();
+            Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
+            return sdf.format(date);
+        } else if (cell.getCellType() == CellType.BOOLEAN){
+            return cell.getBooleanCellValue()+"";
+        }else {
+            return cell.getStringCellValue();
+        }
+
+    }
+
+
+}

+ 91 - 0
src/main/java/com/controller/RegionController.java

@@ -0,0 +1,91 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.service.RegionService;
+import com.tools.JwtUtils;
+
+import java.util.Map;
+
+/**
+ * 区域汇总统计
+ */
+@ControllerInterface(path="/region")
+public class RegionController extends BaseController {
+
+    RegionService service = RegionService.me;
+    public void index() {
+        render("/view/index/index.html");
+    }
+
+    /**
+     * 汇总统计
+     */
+    public void summaryList(){
+        String token = this.getPara("token");
+        try {
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+            if(info == null){
+                fail_token();
+                return;
+            }
+            int orgid = (int)info.get("orgid");
+            String schoolids = this.getSessionAttr("schoolids");
+            success(service.summaryList(schoolids,orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+    /**
+     * 今日简报
+     */
+    public void dayBriefingList(){
+        String token = this.getPara("token");
+        try{
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+            if(info == null){
+                fail_token();
+                return;
+            }
+            int orgid = (int)info.get("orgid");
+            String schoolids = this.getSessionAttr("schoolids");
+            success(service.dayBriefingList(schoolids,orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 流通统计
+     */
+    public void circulationList(){
+        String token = this.getPara("token");
+        String ksrq = this.getPara("ksrq");
+        String jsrq = this.getPara("jsrq");
+        try{
+            int operatorid = JwtUtils.validateJWTForUserId(token);
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            String schoolids = this.getSessionAttr("schoolids");
+            success(service.circulationList(schoolids,ksrq,jsrq));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+}

+ 114 - 0
src/main/java/com/controller/RoleController.java

@@ -0,0 +1,114 @@
+package com.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.kit.HttpKit;
+import com.model.Role;
+import com.model.RoleUser;
+import com.model.User;
+import com.service.RoleService;
+import com.service.UserService;
+import com.tools.JwtUtils;
+import com.validator.UserValidator;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@ControllerInterface(path="/role")
+public class RoleController extends BaseController {
+
+    RoleService service = RoleService.me;
+
+    public void index() {
+        render("/view/userrole/role.html");
+    }
+
+    public void viewUserRole(){
+        int userid =getParaToInt("userid");
+        render("/view/userrole/viewuserrole.html");
+    }
+
+    public void findRoleByUser(){
+        int userid =getParaToInt("userid");
+        success(service.findRoleByUser(userid));
+    }
+
+    public void findNoOwnerRoleByUser(){
+        int userid =getParaToInt("userid");
+        success(service.findNoOwnerRoleByUser(userid));
+    }
+
+    public void addUserRole(){
+        try{
+            int userid = getParaToInt("userid");
+            String rolejson = getPara("role");
+            List<Role> roleList=  JSON.parseArray(rolejson, Role.class);
+            List<RoleUser> roleUserList =new ArrayList<RoleUser>();
+            for (Role role : roleList) {
+                RoleUser roleUser = new RoleUser();
+                roleUser.setUserid(userid);
+                roleUser.setRoleid(role.getId());
+                roleUserList.add(roleUser);
+            }
+            service.addUserRole(roleUserList);
+            success();
+        }catch (Exception e){
+            fail();
+        }
+    }
+
+    public void delUserRole(){
+        try {
+            int id = getParaToInt("id");
+            service.delUserRole(id);
+            success();
+        }catch (Exception e) {
+            fail();
+        }
+    }
+
+
+
+    public void findRole(){
+        success(service.findRole());
+    }
+
+
+
+    public void addOrUpdate(){
+        Role role = getBean(Role.class,"bean");
+        User user= getSessionAttr("userInfo");
+        int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        role.setOperatorid(operatorid).setOrgid(user.getOrgid());
+        service.addOrUpdate(role);
+        success();
+    }
+
+
+    public void delRole(){
+        try {
+            int id = getParaToInt("id");
+
+            if (service.roleHaveUser(id)){
+                throw new Exception("请先删除该角色关联的用户");
+            }
+            if (service.roleHaveMenu(id)){
+                throw new Exception("请先删除该角色关联的菜单");
+            }
+            service.delRole(id);
+            success();
+        }catch (Exception e) {
+            fail(0,e.getMessage());
+        }
+    }
+
+
+}

+ 147 - 0
src/main/java/com/controller/SchoolPageController.java

@@ -0,0 +1,147 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.model.Org;
+import com.model.User;
+import com.service.OrgService;
+import com.service.UserService;
+import com.tools.JwtUtils;
+import com.validator.UserValidator;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+
+@ControllerInterface(path="/list-manage")
+public class SchoolPageController extends BaseController {
+    OrgService orgService = OrgService.me;
+    //编目管理
+    public void bookBackData() {render("/view/list-manage/bookBackData.html");}
+    public void addBookList() {render("/view/list-manage/addBookList.html");}
+
+    public void editBookList() {render("/view/library/editBookList.html");}
+
+    public void journalBackData() {
+        render("/view/list-manage/journalBackData.html");
+    }
+    public void bookpici() {
+        render("/view/list-manage/bookpici.html");
+    }
+    public void bookList() {
+        render("/view/list-manage/bookList.html");
+    }
+    public void bookMarkPrint() {
+        render("/view/list-manage/bookMarkPrint.html");
+    }
+    public void journalMarkPrint() {
+        render("/view/list-manage/journalMarkPrint.html");
+    }
+    public void bookShelf() {
+        render("/view/list-manage/bookShelf.html");
+    }
+    public void listCount() {
+        render("/view/list-manage/listCount.html");
+    }
+
+    public void bookBaseInfo(){render("/view/list-manage/bookBaseInfo.html");};
+
+    //流通管理
+    public void jieYueRecord() {
+        render("/view/flow-manage/jieYueRecord.html");
+    }
+    public void jieYueTotal() {
+        render("/view/flow-manage/jieYueTotal.html");
+    }
+    public void dailyBorrowing() {
+        render("/view/flow-manage/dailyBorrowing.html");
+    }
+    public void libraryClock() {
+        render("/view/sysconfig/libraryclock.html");
+    }
+
+    public void rfidbarcode() {
+        render("/view/flow-manage/rfidbarcode.html");
+    }
+
+    public void dailyBorrowing_rfid() {
+        render("/view/flow-manage/dailyBorrowing_rfid.html");
+    }
+
+    public void dailyBorrowing_rfidandface(){
+        render("/view/flow-manage/dailyBorrowing_rfidandface.html");
+    }
+
+    public void dailyBorrowing_face() {
+        int facedevicetype = getParaToInt("facedevicetype", 0);
+        if(facedevicetype == 0) {
+            render("/view/flow-manage/dailyBorrowing_face.html");
+        }else{
+            render("/view/flow-manage/dailyBorrowing_aiface.html");
+        }
+    }
+
+    public void loseBookList() {
+        render("/view/flow-manage/loseBookList.html");
+    }
+    public void damageBookList() {
+        render("/view/flow-manage/damageBookList.html");
+    }
+    public void jieYueRecordQ() {
+        render("/view/flow-manage/jieYueRecordQ.html");
+    }
+    public void loseBook() {
+        render("/view/flow-manage/loseBook.html");
+    }
+
+    public void damagedBook() {
+        render("/view/flow-manage/damagedBook.html");
+    }
+
+    public void removeBook() {
+        render("/view/library/removeBook.html");
+    }
+
+    public void barCodeChangeBook() {
+        render("/view/library/barCodeChangeBook.html");
+    }
+
+    public void libraryBookChange() {
+        render("/view/library/librayBookChange.html");
+    }
+
+    public void libraryBookPlan() {
+        render("/view/library/librayBookPlan.html");
+    }
+
+    public void cancelBook() {
+        render("/view/library/cancelBook.html");
+    }
+
+    //报表统计
+    public void bookLendingRanking() {
+        render("/view/report/bookLendingRanking.html");
+    }
+    public void bookTypeLendingRanking() {
+        render("/view/report/bookTypeLendingRanking.html");
+    }
+    public void readerLendingRanking() {
+        render("/view/report/readerLendingRanking.html");
+    }
+    public void deptLendingRanking() {
+        render("/view/report/deptLendingRanking.html");
+    }
+    public void bookCancellationStatistics() {
+        render("/view/report/bookCancellationStatistics.html");
+    }
+    public void bookClassificationStatistics() {
+        render("/view/report/bookClassificationStatistics.html");
+    }
+    public void basicStatistics() {
+        render("/view/report/basicStatistics.html");
+    }
+
+
+
+}

+ 59 - 0
src/main/java/com/controller/SysmkfController.java

@@ -0,0 +1,59 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * marc字段设置
+ */
+@ControllerInterface(path="/sysmkf")
+public class SysmkfController extends BaseController {
+
+    public void index() {
+        render("/view/list-manage/sysmkf.html");
+    }
+
+    public void findListByOrgid(){
+        String token = this.getPara("token");
+        Map userinfo = JwtUtils.validateJWTForMap(token);
+        if(userinfo == null){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = (Integer) userinfo.get("orgid");
+        List<Record> list = Db.find("select id,fieldid,subfieldid,cnfield from t_sysmkf where orgid = ?",orgid);
+        if(CommonUtils.isNullOrEmpty(list) || list.size() == 0){
+            list = Db.find("select * from t_sysmkf where orgid = 121001");
+            for(Record record : list) {
+                record.remove("id");
+                record.set("orgid",orgid);
+                Db.save("t_sysmkf",record);
+            }
+            list = Db.find("select id,fieldid,subfieldid,cnfield from t_sysmkf where orgid = ?",orgid);
+        }
+        success(list);
+    }
+
+    public void updateSysmkfInfo(){
+        String token = this.getPara("token");
+        Map userinfo = JwtUtils.validateJWTForMap(token);
+        if(userinfo == null){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = (Integer) userinfo.get("orgid");
+        Integer id = getParaToInt("id",0);
+        String subfieldid = getPara("subfieldid","");
+        String fieldid = getPara("fieldid","");
+        Db.update("update t_sysmkf set fieldid=?,subfieldid=? where id = ? and orgid = ?",fieldid,subfieldid,id,orgid);
+        success();
+    }
+
+}

+ 163 - 0
src/main/java/com/controller/UserController.java

@@ -0,0 +1,163 @@
+package com.controller;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.kit.PropKit;
+import com.model.User;
+import com.service.UserService;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+import com.validator.UserValidator;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+@ControllerInterface(path="/user")
+public class UserController extends BaseController {
+    UserService service = UserService.me;
+
+    public void index() {
+        render("/view/userrole/user.html");
+    }
+
+    public void password(){
+        render("/view/userrole/password.html");
+    }
+
+
+    public void list(){
+        User bean = getBean(User.class,"bean");
+        int pageNumber=  this.getParaToInt("pageNumber");
+
+
+        User user= getSessionAttr("userInfo");
+        int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        bean.setOrgid(user.getOrgid());
+
+        success(service.paginate(pageNumber,this.getParaToInt("pageSize"),bean));
+    }
+
+
+    public void getById(){
+        int id =this.getParaToInt("bean.id", 0);
+        if(id == 0){
+            fail();
+        }
+        success(service.findById(id));
+    }
+
+
+    //增加或修改
+    @Before(UserValidator.class)
+    public void addOrUpdate(){
+        try {
+            User user= getSessionAttr("userInfo");
+            int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+
+            User bean = getBean(User.class,"bean");
+            if(bean.getId() ==null) {
+//                if (null !=service.verifyLoginCode(bean.getCode(),user.getOrgid())){
+//                    throw new Exception("已经存在当前工号的用户");
+//                }
+                if (null !=service.verifyLoginName(bean.getLoginname(),user.getOrgid())){
+                    throw new Exception("已经存在当前登录名的用户");
+                }
+                if(CommonUtils.isNullOrEmpty(bean.getPassword())) {
+                    bean.setPassword(PropKit.get("initPassword"));
+                }
+            } else {
+                bean.remove("password");
+            }
+            bean.setOrgid(user.getOrgid());
+            service.addOrUpdate(bean,operatorid);
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail(0,e.getMessage());
+        }
+    }
+    //删除
+    public void delete(){
+        try{
+            int id =this.getParaToInt("id");
+            User user =service.findById(id);
+            if (user.getIsadmin().equals(1)){
+                throw new Exception("超级管理员不能删除!");
+            }
+            service.deleteById(user.getId());
+            success();
+        }catch (Exception e){
+            fail(0,e.getMessage());
+        }
+
+    }
+    //下拉选
+    public void selectType(){
+        Map map = service.selectType();
+        success(map);
+    }
+
+    /**
+     * 用户自己修改密码
+     */
+    public void repasswd(){
+        String password = this.getPara("password");
+        String oldPassword = this.getPara("oldPassword");
+        String token = this.getCookie("token");
+        int userid = 0;
+        if(StringUtils.isEmpty(token)){
+            token = this.getPara("token");
+            userid = JwtUtils.validateJWTForUserId(token);
+        }
+        if(userid == 0){
+            fail_token();
+            return;
+        }
+        oldPassword = CommonUtils.getMD5String(CommonUtils.getMD5String(oldPassword));
+        User bean = service.findById(userid);
+        if(!oldPassword.equals(bean.get("password"))){
+            fail(1, "当前密码错误");return;
+        }
+        if(StringUtils.isEmpty(password)){
+            fail(2,"新密码不能为空");return;
+        }
+        String reg= "(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z].{7,15}";
+        if(!password.matches(reg)){
+            fail(2,"您的密码复杂度太低(必须包含字母、数字且长度为8-15位)");return;
+        }
+        bean.setPassword(CommonUtils.getMD5String(CommonUtils.getMD5String(password)));
+        bean.update();
+        success();
+    }
+
+    public void resetpassword(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        //select ifnull(LOCATE((select orgid from t_user where id =3093 ),parentcodes),0) checkFlag from t_org o inner join t_user u on u.orgid = o.id where u.id = 318
+        User bean=service.findById(getParaToInt("userid"));
+
+        User currentUser=service.findById(operatorid);
+        if(currentUser.getOrgid().intValue() != bean.getOrgid().intValue()) { // 如果被重置密码的部门跟当前登录人的部门不一样 则不允许重置密码
+            fail(5,"没有权限重置密码");
+            return;
+        } else {
+            bean.setPassword(CommonUtils.getMD5String(CommonUtils.getMD5String(PropKit.get("initPassword"))));
+            bean.update();
+            success(PropKit.get("initPassword"));
+        }
+    }
+
+}

+ 91 - 0
src/main/java/com/controller/api/GzPlatReportController.java

@@ -0,0 +1,91 @@
+package com.controller.api;
+
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.PropKit;
+import com.jfinal.log.Log;
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.DbKit;
+import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.plugin.activerecord.dialect.SqlServerDialect;
+import com.jfinal.plugin.druid.DruidPlugin;
+import com.utils.CommonUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Clear
+@ControllerInterface(path="/api/gzplatReport")
+public class GzPlatReportController extends BaseController {
+    public Log logger = Log.getLog(GzPlatReportController.class);
+
+    public void report(){
+//        Calendar calendar = Calendar.getInstance();
+//        String datepara = getPara("datepara");
+//        String datestr = "";
+//        if(CommonUtils.isNullOrEmpty(datepara)){
+//            int day_of_month = calendar.get(Calendar.DAY_OF_MONTH);
+//            if(day_of_month != 1){
+//                return;
+//            }
+//            calendar.add(Calendar.MONTH,-1);
+//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+//            datestr = sdf.format(calendar.getTime());
+//        } else {
+//            datestr = datepara;
+//        }
+//
+//        boolean check = true;
+//        String areacode = PropKit.get("areacode","");
+//        if(!areacode.equals("gzplat")){
+//            check = false;
+//        }
+//        String jdbcUtil = "jdbc:mysql://121.37.166.0/library?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull";
+//        String username =  "root";
+//        String password = "eZ4HnKwvAFIbSFCN";
+//        DruidPlugin c3p0Plugin = new DruidPlugin(jdbcUtil, username, password);
+//
+//        DbKit.removeConfig("gzplatdb");
+//        c3p0Plugin.stop();
+//        ActiveRecordPlugin arp = new ActiveRecordPlugin("gzplatdb", c3p0Plugin);
+//        arp.setDialect(new SqlServerDialect());
+//        c3p0Plugin.start();
+//        arp.start();
+//
+//        List<Record> list = Db.find("select o.id orgid,o.orgname,(select orgname from t_org where id = o.parentid) areaname ,(select orgname from t_org where id = (select parentid from t_org where id = o.parentid)) cityname,o.schoolcategoryid from t_org o where orgtypeid = 5 and isclose= 0 and status = 1");
+//        for(Record record : list) {
+//            int orgid = record.getInt("orgid");
+//            Record checkRecord = Db.use("gzplatdb").findFirst("select * from t_gzplat_report where orgid = ? and reporttime =?",orgid,datestr);
+//            if(CommonUtils.isNotNullOrNotEmpty(checkRecord)){
+//                if(!check){
+//                    Db.use("gzplatdb").deleteById("t_gzplat_report",checkRecord.getInt("id"));
+//                } else {
+//                    continue;
+//                }
+//            }
+//            Record studentNumberRecord = Db.findFirst("select count(*) studentnumber from t_reader where orgid = ? and status = 1",orgid);
+//            record.setColumns(studentNumberRecord);
+//            Record classNumberRecord = Db.findFirst("select count(*) classnumber from t_org_dept where orgid = ?",orgid);
+//            record.setColumns(classNumberRecord);
+//            Record bookNumberRecord = Db.findFirst("select count(*) booknumber from t_book_detail d left join t_book b on d.bookid=b.id where b.orgid = ? and d.bookstatus = 1 and d.status < 3",orgid);
+//            record.setColumns(bookNumberRecord);
+//            Record jieyueRecord = Db.findFirst("select count(*) jieyuenumber from t_jieyue j where j.orgid = ? and DATE_FORMAT(j.createtime,'%Y-%m') =?",orgid,datestr);
+//            record.setColumns(jieyueRecord);
+//            record.set("createtime",new Date());
+//            record.set("reporttime",datestr);
+//            Db.use("gzplatdb").save("t_gzplat_report",record);
+//        }
+        success();
+    }
+
+    public void findList(){
+        String datepara = getPara("datepara");
+        List relist = Db.find("select * from t_gzplat_report where reporttime = ?",datepara);
+        success(relist);
+    }
+}

+ 424 - 0
src/main/java/com/controller/api/InventoryController.java

@@ -0,0 +1,424 @@
+package com.controller.api;
+
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.upload.UploadFile;
+import com.model.*;
+import com.utils.*;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.math.BigDecimal;
+import java.security.PublicKey;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Clear
+@ControllerInterface(path="/api/inventory")
+public class InventoryController extends BaseController {
+
+//    public void signin(){
+//        Integer orgid = getParaToInt("orgid");
+//        String secret = getHeader("secret");
+//
+//        try {
+//            String key = AESUtil.Encrypt("121007", PropKit.get(orgid.toString()));
+//            System.err.println(key);
+//            String rsakey = RSAUtil.encrypt(key,PropKit.get("publickey"));
+//            System.err.println(rsakey);
+//
+//            String dersakey = RSAUtil.decrypt(rsakey,PropKit.get("privatekey"));
+//            System.err.println(dersakey);
+//            String dekey = AESUtil.Decrypt(dersakey,PropKit.get(orgid.toString()));
+//            System.err.println(dekey);
+//            success();
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//    }
+
+    public void getRFIDInfo(){
+        Integer type = getParaToInt("type");
+        if(CommonUtils.isNullOrEmpty(type)){
+            fail(1,"类型不能为空,1:图书 2:层架标签");
+            return;
+        }
+        String rfid = getPara("rfid");
+        if(CommonUtils.isNullOrEmpty(rfid)){
+            fail(1,"rfid不能为空");
+            return;
+        }
+        Integer orgid = getParaToInt("orgid");
+        if(type == 1){
+            success(Db.findFirst("select b.title,b.bookno,b.publisher,d.barcode,d.rfid,d.bookshelfinfoStr from t_book_detail d left join t_book b on d.bookid = b.id where b.orgid = ? and d.rfid=?",orgid,rfid));
+        } else if(type == 2) {
+            success(Db.findFirst("select * from t_bookshelfinfo where orgid = ? and rfid = ?",orgid,rfid));
+        } else {
+            success();
+        }
+    }
+
+    public void bindRFID(){
+        Integer orgid = getParaToInt("orgid");
+        Integer type = getParaToInt("type");
+        if(CommonUtils.isNullOrEmpty(type)){
+            fail(1,"类型不能为空1:绑定 2:取消绑定");
+            return;
+        }
+        String bookshelfId = getPara("bookshelfId");
+        if(CommonUtils.isNullOrEmpty(bookshelfId)){
+            fail(1,"bookshelfId不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_bookshelfinfo where rfid=? and orgid=?",bookshelfId,orgid);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(1,"查询不到层架标签信息");
+            return;
+        }
+        String bookshelfinfoStr = record.getStr("location");
+        String rfidstr = getPara("rfidstr");
+        if(CommonUtils.isNullOrEmpty(rfidstr)){
+            fail(1,"rfidstr不能为空");
+            return;
+        }
+        String rfids[] = rfidstr.split(",");
+        List errorList = new ArrayList();
+        for(String rfid_book : rfids) {
+            if("".equals(rfid_book)){
+                continue;
+            }
+            Record bookRecord = Db.findFirst("select d.id,d.bookshelfinfoid,b.title,b.bookno from t_book_detail d left join t_book b on d.bookid = b.id where b.orgid=? and d.rfid=?",orgid,rfid_book);
+            if(type == 1){
+                Db.update("update t_book_detail set bookshelfinfoid=?,bookshelfinfoStr=? where id=?",record.getInt("id"),bookshelfinfoStr,bookRecord.getInt("id"));
+            } else if(type == 2) {
+                Db.update("update t_book_detail set bookshelfinfoid=null,bookshelfinfoStr=null where id=?",bookRecord.getInt("id"));
+            }
+        }
+        success();
+    }
+
+    public void findBookListByBookshelfId(){
+        Integer orgid = getParaToInt("orgid");
+        String bookshelfId = getPara("bookshelfId");
+        if(CommonUtils.isNullOrEmpty(bookshelfId)){
+            fail(1,"bookshelfId不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_bookshelfinfo where rfid=? and orgid=?",bookshelfId,orgid);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(1,"查询不到层架标签信息");
+            return;
+        }
+        List list = Db.find("select b.title,b.bookno,b.publisher,d.barcode,d.rfid,d.bookshelfinfoStr from t_book_detail d left join t_book b on d.bookid = b.id where b.orgid = ? and d.bookshelfinfoid=?",orgid,record.getInt("id"));
+        success(list);
+    }
+
+    public void updateBookshelf(){
+        Integer orgid = getParaToInt("orgid");
+        String oldBookshelfId = getPara("oldBookshelfId");
+        if(CommonUtils.isNullOrEmpty(oldBookshelfId)){
+            fail(1,"oldBookshelfId不能为空");
+            return;
+        }
+        Record oldrecord = Db.findFirst("select * from t_bookshelfinfo where rfid=? and orgid=?",oldBookshelfId,orgid);
+        if(CommonUtils.isNullOrEmpty(oldrecord)){
+            fail(1,"查询不到层架标签信息");
+            return;
+        }
+
+        String bookshelfId = getPara("bookshelfId");
+        if(CommonUtils.isNullOrEmpty(bookshelfId)){
+            fail(1,"bookshelfId不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_bookshelfinfo where rfid=? and orgid=?",bookshelfId,orgid);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(1,"查询不到层架标签信息");
+            return;
+        }
+
+        Db.update("update t_book_detail set bookshelfinfoid = ?,bookshelfinfoStr=? where id in (select * from (select id from t_book_detail where bookshelfinfoid = ?) t)",record.getInt("id"),record.getStr("location"),oldrecord.getInt("id"));
+        success();
+    }
+
+    public void getLowerShelfPlanList(){
+        Integer orgid = getParaToInt("orgid");
+        List list = Db.find("select * from t_shelfplan where orgid = ? and status = 0",orgid);
+        success(list);
+    }
+
+    public void getPlanToBookInfoList(){
+        Integer orgid = getParaToInt("orgid");
+        Integer planid = getParaToInt("planid");
+        if(CommonUtils.isNullOrEmpty(planid)){
+            fail(1,"下架计划id不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_shelfplan where id=? and orgid=?",planid,orgid);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(1,"查询不到下架计划信息");
+            return;
+        }
+
+        List list = Db.find("select b.title,b.bookno,b.publisher,d.barcode,d.rfid,d.bookshelfinfoStr from t_book_detail d left join t_book b on d.bookid = b.id left join t_book_shelfplan s on d.id = s.bookdetailid where b.orgid = ? and s.shelfplanid = ? ",orgid,planid);
+        success(list);
+    }
+
+    public void bookLowerShelf(){
+        Integer orgid = getParaToInt("orgid");
+        String rfidstr = getPara("rfidstr");
+        String planid = getPara("planid");
+        if(CommonUtils.isNullOrEmpty(planid)){
+            fail(1,"下架计划id不能为空");
+            return;
+        }
+        if(CommonUtils.isNullOrEmpty(rfidstr)){
+            fail(1,"rfidstr不能为空");
+            return;
+        }
+        String rfids[] = rfidstr.split(",");
+        for(String rfid : rfids) {
+            if("".equals(rfid)){
+                continue;
+            }
+            Record bookdetailRecord = Db.findFirst("select d.id from t_book_detail d left join t_book b on d.bookid = b.id where rfid = ? and orgid = ?",rfid,orgid);
+            Db.update("update t_book_detail set bookstatus = 0 where id =?",bookdetailRecord.getInt("id"));
+            Db.update("update t_book_shelfplan set status =1 where shelfplanid = ? and bookdetailid=?",planid,bookdetailRecord.getInt("id"));
+            List list = Db.find("select * from t_book_shelfplan where status != 1 and shelfplanid = ?",planid);
+            if(list.size() == 0){
+                Db.update("update t_shelfplan set status = 1 where id=? and orgid = ?",planid,orgid);
+            }
+        }
+        success();
+    }
+
+    @Clear
+    public void uploadBookInfo(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(0,"orgid不能为空");
+            return;
+        }
+        String filename = getPara("filename");
+        if(CommonUtils.isNullOrEmpty(filename)){
+            fail(0,"文件名称不能为空");
+            return;
+        }
+        List<Map<String,String>> errorList = new ArrayList();
+        Map checkMap = null;
+        Calendar calendar = Calendar.getInstance();
+        Record defaultLibraryRecord = Db.findFirst("select id from t_library where orgid = ? order by defaultlibrary desc ",orgid);
+        if(CommonUtils.isNullOrEmpty(defaultLibraryRecord)){
+            Library library = new Library();
+            library.setOrgid(orgid);
+            library.setLibrary("书库");
+            library.setDefaultlibrary(1);
+            library.setCreatetime(calendar.getTime());
+            library.setIsopen(1);
+            library.setArea(BigDecimal.TEN);
+            library.save();
+            defaultLibraryRecord = library.toRecord();
+        }
+        Record piciRecord = Db.findFirst("select id from t_bookpici where orgid = ? order by id desc",orgid);
+        if(CommonUtils.isNullOrEmpty(piciRecord)){
+            Bookpici bookpici = new Bookpici();
+            bookpici.setOrgid(orgid);
+            bookpici.setDictid(52);
+            bookpici.setBatchname("默认批次");
+            bookpici.setCreatetime(calendar.getTime());
+            bookpici.setOperatorid(1);
+            bookpici.save();
+            piciRecord = bookpici.toRecord();
+        }
+        String path =getRequest().getRealPath("upload")+"/"+filename;
+        List<Map<String,String>> bookList= null;
+        try {
+            bookList = ExcelUtil.readExcel(new FileInputStream(new File(path)));
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+        if(bookList.size() == 0){
+            fail(0,"文件路径错误或读取不到数据");
+            return;
+        }
+        for(Map<String,String> map : bookList) {
+            try {
+                checkMap = map;
+                Book book = new Book();
+                book.setOrgid(orgid);
+                String typecode = map.get("book_vcfl");
+                book.setTypeid(typecode.substring(0,1));
+                book.setTypecode(typecode);
+
+                int shucihao = 0;
+                Record shucihaoRecord = Db.findFirst("select shucihao from t_book where orgid = ? and typecode = ? order by shucihao desc",orgid,typecode);
+                if(CommonUtils.isNotNullOrNotEmpty(shucihaoRecord)){
+                    shucihao = shucihaoRecord.getInt("shucihao");
+                }
+                book.setShucihao(shucihao);
+                String bookno = typecode+"/"+shucihao;
+//                int booknum = Integer.parseInt(map.get("册数"));
+                book.setBooknum(1);
+                book.setIsbn(map.get("book_vcisbn"));
+                book.setTitle(map.get("book_vcmc"));
+                book.setPublisher(map.get("book_vccbs"));
+                book.setAuthor(map.get("book_vczz"));
+                book.setPublishdate(map.get("book_dcbrq"));
+                book.setBookno(bookno);
+//                book.setPublishaddress(map.get("出版地"));
+                if(CommonUtils.isNullOrEmpty(map.get("book_fdj"))){
+                    book.setPrice(new BigDecimal(map.get("book_fdj")));
+                }
+                book.setCreatetime(calendar.getTime());
+                book.setOperatorid(1);
+                Record checkBookRecord = Db.findFirst("select id from t_book where orgid = ? and isbn=? and title = ? and publisher = ? and author = ? and bookno = ?", book.getOrgid(), book.getIsbn(), book.getTitle(), book.getPublisher(), book.getAuthor(), book.getBookno());
+                if (CommonUtils.isNullOrEmpty(checkBookRecord)) {
+//                    book.setBooknum(booknum);
+                    book.save();
+                    BookPlus bookPlus = new BookPlus();
+                    bookPlus.setBookid(book.getId());
+//                    bookPlus.setSubtitle(map.get("副题名"));
+//                    try{
+//                        bookPlus.setTotalpages(Integer.parseInt(map.get("页数").replace("页", "").replace("*", "")));
+//                    }catch (Exception e) {
+//
+//                    }
+//                    bookPlus.setCongshuming(map.get("丛编名"));
+                    bookPlus.save();
+
+                    String barcode = map.get("book_vcid");
+                    String zerostr = "0000000000000000000000000000";
+                    barcode = zerostr.substring(0,6-barcode.length())+barcode;
+                    BookDetail bookDetail = new BookDetail();
+                    bookDetail.setBookid(book.getId());
+                    bookDetail.setLibraryid(defaultLibraryRecord.getInt("id"));
+                    bookDetail.setPiciid(piciRecord.getInt("id"));
+                    bookDetail.setBarcode(barcode);
+                    bookDetail.setStatus(0);
+                    bookDetail.setBookstatus(1);
+                    bookDetail.setShangjiatime(calendar.getTime());
+                    bookDetail.setPutindate(calendar.getTime());
+                    bookDetail.setCreatetime(calendar.getTime());
+                    bookDetail.setOperatorid(1);
+                    bookDetail.save();
+                } else {
+                    Db.update("update t_book set booknum = booknum + 1 where id = ?",checkBookRecord.getInt("id"));
+                    String barcode = map.get("book_vcid");
+                    String zerostr = "0000000000000000000000000000";
+                    barcode = zerostr.substring(0,6-barcode.length())+barcode;
+                    BookDetail bookDetail = new BookDetail();
+                    bookDetail.setBookid(book.getId());
+                    bookDetail.setLibraryid(defaultLibraryRecord.getInt("id"));
+                    bookDetail.setPiciid(piciRecord.getInt("id"));
+                    bookDetail.setBarcode(barcode);
+                    bookDetail.setStatus(0);
+                    bookDetail.setBookstatus(1);
+                    bookDetail.setShangjiatime(calendar.getTime());
+                    bookDetail.setPutindate(calendar.getTime());
+                    bookDetail.setCreatetime(calendar.getTime());
+                    bookDetail.setOperatorid(1);
+                    bookDetail.save();
+                }
+                Thread.sleep(50);
+//                System.err.println("导入完成数据:" + map.toString());
+//                logger.info("导入完成数据:" + map.toString());
+            }catch (Exception e) {
+                errorList.add(checkMap);
+                e.printStackTrace();
+            }
+        }
+        logger.info("图书未导入数量:"+ errorList.size());
+//        String exfilename="";
+//        if (errorList.size()>0){
+//            exfilename="/图书未导入列表"+ DateUtils.getNowTimeNo()+".xls";
+//            File targetFile =new File(getRequest().getRealPath("upload")+exfilename);
+//            ExcelUtil.writeExcel(targetFile,errorList,"图书未导入列表");
+//        }
+        success(errorList);
+    }
+
+    public void dateformat(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(0,"orgid不能为空");
+            return;
+        }
+        Calendar calendar = Calendar.getInstance();
+        Record defaultLibraryRecord = Db.findFirst("select id from t_library where orgid = ? order by defaultlibrary desc ",orgid);
+        if(CommonUtils.isNullOrEmpty(defaultLibraryRecord)){
+            Library library = new Library();
+            library.setOrgid(orgid);
+            library.setLibrary("图书馆");
+            library.setDefaultlibrary(1);
+            library.setCreatetime(calendar.getTime());
+            library.setIsopen(1);
+            library.setArea(BigDecimal.TEN);
+            library.save();
+            defaultLibraryRecord = library.toRecord();
+        }
+        Record piciRecord = Db.findFirst("select id from t_bookpici where orgid = ? order by id desc",orgid);
+        if(CommonUtils.isNullOrEmpty(piciRecord)){
+            Bookpici bookpici = new Bookpici();
+            bookpici.setOrgid(orgid);
+            bookpici.setDictid(52);
+            bookpici.setBatchname("默认批次");
+            bookpici.setCreatetime(calendar.getTime());
+            bookpici.setOperatorid(1);
+            bookpici.save();
+            piciRecord = bookpici.toRecord();
+        }
+        List<Record> cengjiabiaoqianList = CommonUtils.getDbPro("sqlserver4").find("select top 100 * from sm");
+        for (Record record : cengjiabiaoqianList) {
+            Book book = new Book();
+            book.setOrgid(orgid);
+            book.setShucihao(1);
+            book.setTypeid(record.getStr("flh"));
+            book.setTypecode(record.getStr(""));
+            List<Record> bookdetailList = Db.find("select * from scxx where kzh=?",record.getInt("kzh"));
+            book.setBooknum(bookdetailList.size());
+            book.setIsbn(record.getStr("isbn"));
+            book.setTitle(record.getStr("sm"));
+            book.setPublisher(record.getStr("cbs"));
+            book.setKeyword(record.getStr("ztc"));
+            book.setEdition(record.getStr("bc"));
+            book.setAuthor(record.getStr("zzmc"));
+            book.setPublishdate(record.getStr("cbn"));
+//            book.setBookno(map.get("索书号"));
+            book.setPublishaddress(record.getStr("cbd"));
+            book.setPrice(record.getBigDecimal("jg"));
+            book.setCreatetime(record.getDate("bmrq"));
+            book.setOperatorid(1);
+            book.save();
+            BookPlus bookPlus = new BookPlus();
+            bookPlus.setBookid(book.getId());
+            bookPlus.setFuzhu(record.getStr("fz"));
+            bookPlus.setTotalpages(record.getInt("ym"));
+            bookPlus.setCongshuming(record.getStr("csm"));
+            bookPlus.setCongshuauthor(record.getStr("cszz"));
+            bookPlus.save();
+            for (Record detailRecord : bookdetailList){
+                BookDetail bookDetail = new BookDetail();
+                bookDetail.setBookid(book.getId());
+                bookDetail.setLibraryid(defaultLibraryRecord.getInt("id"));
+                bookDetail.setPiciid(piciRecord.getInt("id"));
+                bookDetail.setBarcode(detailRecord.getStr("tmh"));
+                bookDetail.setStatus(0);
+                bookDetail.setBookstatus(1);
+                bookDetail.setShangjiatime(detailRecord.getDate("rkrq"));
+                bookDetail.setPutindate(record.getDate("bmrq"));
+                bookDetail.setCreatetime(record.getDate("bmrq"));
+                bookDetail.setOperatorid(1);
+                bookDetail.save();
+            }
+        }
+        success();
+    }
+}

+ 689 - 0
src/main/java/com/controller/api/JswPlgApiController.java

@@ -0,0 +1,689 @@
+package com.controller.api;
+
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.jfinal.upload.UploadFile;
+import com.model.BookDetail;
+import com.model.Jieyue;
+import com.model.Reader;
+import com.utils.CommonUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.*;
+
+@Clear
+@ControllerInterface(path="/api/jswplg")
+public class JswPlgApiController extends BaseController {
+    BookDetail bookDetailDao = new BookDetail().dao();
+    Reader readerDao = new Reader().dao();
+    public void queryBookInfo(){
+        try{
+            Record resultRecord = new Record();
+            String orgid = getPara("orgid");
+            String bookId = getPara("rfid");
+            Record record = Db.findFirst("select d.`status`,d.barcode,d.rfid,b.title,b.author,b.isbn,b.price,b.bookno,b.keyword," +
+                    "(select library from t_library where id = d.libraryid) library,b.publisher " +
+                    "from t_book b inner join t_book_detail d on b.id = d.bookid where b.orgid = ? and d.rfid =?",orgid,bookId);
+            if(CommonUtils.isNullOrEmpty(record)) {
+                fail(0,"查询不到书籍信息,请联系图书管理员");
+                return ;
+            }
+            int status = record.getInt("status");
+
+            resultRecord.set("status",status);
+            resultRecord.set("rfid",(CommonUtils.isNotNullOrNotEmpty(record.get("rfid"))?record.get("rfid"):""));
+            resultRecord.set("title",(CommonUtils.isNotNullOrNotEmpty(record.get("title"))?record.get("title"):""));
+            resultRecord.set("author",(CommonUtils.isNotNullOrNotEmpty(record.get("author"))?record.get("author"):""));
+            resultRecord.set("isbn",(CommonUtils.isNotNullOrNotEmpty(record.get("isbn"))?record.get("isbn"):""));
+            resultRecord.set("price",(CommonUtils.isNotNullOrNotEmpty(record.get("price"))?record.get("price"):""));
+            resultRecord.set("bookno",(CommonUtils.isNotNullOrNotEmpty(record.get("bookno"))?record.get("bookno"):""));
+            resultRecord.set("library",(CommonUtils.isNotNullOrNotEmpty(record.get("library"))?record.get("library"):""));
+            resultRecord.set("publisher",(CommonUtils.isNotNullOrNotEmpty(record.get("publisher"))?record.get("publisher"):""));
+            resultRecord.set("keyword",(CommonUtils.isNotNullOrNotEmpty(record.get("keyword"))?record.get("keyword"):""));
+            resultRecord.set("barcode",(CommonUtils.isNotNullOrNotEmpty(record.get("barcode"))?record.get("barcode"):""));
+            Record jieyueTimeRecord = Db.findFirst("select j.createtime,j.duetime from t_jieyue j left join t_book_detail d on j.bookdetailid = d.id " +
+                    "where d.rfid = ? and j.orgid = ? order by j.id desc",bookId,orgid);
+            if(CommonUtils.isNotNullOrNotEmpty(jieyueTimeRecord)) {
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                resultRecord.set("duetime",simpleDateFormat.format(jieyueTimeRecord.getDate("duetime")));
+                resultRecord.set("createtime",simpleDateFormat.format(jieyueTimeRecord.getDate("createtime")));
+            }
+            /*if(status == 1){
+                success(0,"该书已借出,不能借阅",resultRecord);
+                return;
+            }else if(status == 2){
+                success(1,"该书已被预约,不能借阅",resultRecord);
+                return;
+            }else if(status == 3){
+                success(1,"该书已被注销,不能借阅",resultRecord);
+                return;
+            }else if(status > 0){
+                success(1,"该书状态异常,不能借阅",resultRecord);
+                return;
+            }*/
+            //int status = CommonUtils.isNotNullOrNotEmpty(record.get("status"))?record.getInt("status"):9;
+
+
+
+            success(resultRecord);
+        }catch(Exception e){
+            fail(1,"数据异常");
+            return;
+        }
+    }
+    /**
+     * 漂流贵图书上架
+     */
+    public void shangjia(){
+        int orgid = getParaToInt("orgid", 0);
+        int libraryid = getParaToInt("libraryid", 0);
+        String rfid = getPara("rfid");
+        String sql = "select d.id, barcode,title,author,publisher from t_book_detail d inner join t_book b on d.bookid=b.id where rfid=? and b.orgid=? ";
+        Record res = Db.findFirst(sql,rfid,orgid);
+        bookDetailDao.findById(res.getInt("id")).setShangjiatime(new Date()).setLibraryid(libraryid).update();
+        res.set("msg","上架成功");
+        success(res);
+    }
+
+    /**
+     * 漂流贵图书下架
+     */
+    public void xiajia(){
+        int orgid = getParaToInt("orgid", 0);
+        String rfid = getPara("rfid");
+        Record library = Db.findFirst("select id from t_library where orgid=?", orgid);
+        String sql = "select d.id,barcode,title,author,publisher from t_book_detail d inner join t_book b on d.bookid=b.id where rfid=? and b.orgid=? ";
+        Record res = Db.findFirst(sql,rfid,orgid);
+        bookDetailDao.findById(res.getInt("id")).setLibraryid(library.getInt("id")).update();
+        res.set("msg","下架成功");
+        success(res);
+
+    }
+    public void findCuihuanList(){
+        try {
+            int orgid = getParaToInt("orgid",0);
+            StringBuffer where = new StringBuffer("select * from (select b.title,d.barcode,DATE_FORMAT(j.duetime,'%Y-%m-%d') duetime,DATE_FORMAT(j.createtime,'%Y-%m-%d') createtime,od.deptname,r.realname,r.cardnumber,(to_days(now()) - to_days(duetime)) days,b.price from t_jieyue j ");
+            where.append(" inner join t_book_detail d on j.bookdetailid = d.id ");
+            where.append(" inner join t_book b on d.bookid = b.id ");
+            where.append(" inner join t_org o on j.orgid = o.id ");
+            where.append(" inner join t_reader r on j.readerid = r.id ");
+            where.append(" inner join t_org_dept od on r.orgdeptid = od.id");
+            where.append(" where j.isoverdue = 1 and j.flag = 0 and j.status = 0 and j.orgid = ? ");
+            where.append(" ) t order by days limit 0,200");
+            success(Db.find(where.toString(), orgid));
+        }catch(Exception e){
+            fail();
+        }
+    }
+    public void xinshutongbao(){
+        try{
+            int orgid = getParaToInt("orgid",0);
+            success(Db.find("select title,author,bookno from t_book where orgid=? order by createtime desc limit 0,100",orgid));
+        }catch(Exception e){
+            fail();
+        }
+
+    }
+    public void rementushu(){
+        try{
+            int orgid = getParaToInt("orgid");
+            String sql = "select * from (" +
+                    "select b.title,b.author,b.bookno,count(j.id) num from t_jieyue j inner join t_book_detail bd on bd.id=j.bookdetailid " +
+                    "inner join t_book b on b.id=bd.bookid" +
+                    " where j.orgid=? group by b.title) table1 order by num desc limit 0,100";
+            List<Record> list = Db.find(sql,orgid);
+            success(list);
+        }catch(Exception e){
+            fail();
+        }
+
+
+    }
+    public void downReaderHeader(){
+        int readerid = getParaToInt("readerid",0);
+        if(readerid == 0){
+            fail();
+            return;
+        }
+        Reader reader = readerDao.findById(readerid);
+        if(reader == null){
+            fail();
+            return;
+        }
+        Map map = new HashMap();
+        if(StringUtils.isNotBlank(reader.getReadcardcode())){
+            map.put("cardnumber", reader.getReadcardcode());
+        }else {
+            map.put("cardnumber", reader.getCardnumber());
+        }
+        String flag = "jpg";
+        String base64 = reader.getHeadimgurl();
+        if(StringUtils.isNotBlank(base64)) {
+            base64 = base64.replace("data:image/", "");
+            flag = base64.substring(0, base64.indexOf(";"));
+            map.put("flag", flag);
+            base64 = reader.getHeadimgurl().replace("data:image/" + flag + ";base64,", "");
+            map.put("base64", base64);
+        }
+        success(map);
+
+    }
+
+    public void uploadTongbuTxt(){
+        try{
+            UploadFile file =getFile();
+            String orgid = getPara("orgid");
+            if(StringUtils.isBlank(orgid)){
+                fail();
+                return;
+            }
+            System.out.println("orgid:"+orgid);
+            File image = file.getFile();
+            System.out.println("txt:"+image.getPath());
+            String sb = FileUtils.readFileToString(file.getFile(), "UTF-8");
+            System.out.println(sb);
+            Map result = new HashMap();
+            result.put("code",200);
+            result.put("msg","调用成功");
+            if(StringUtils.isNotBlank(sb)){
+                List<Reader> readerList = readerDao.find("select id, cardnumber, readcardcode from t_reader where orgid=? and (headimgurl is null or headimgurl='') and " +
+                        "(cardnumber in ("+sb.substring(1)+") or readcardcode in ("+sb.substring(1)+")) ",orgid);
+                StringBuilder resStr = new StringBuilder();
+                Map<String, String> map = new HashMap<>();
+                for(Reader r : readerList){
+                    if(r.getCardnumber() != null && map.get(r.getCardnumber()) == null){
+                        resStr.append(","+r.getCardnumber());
+                        map.put(r.getCardnumber(),"");
+                    }
+                    if(r.getReadcardcode() != null && map.get(r.getReadcardcode()) == null){
+                        resStr.append(","+r.getReadcardcode());
+                        map.put(r.getReadcardcode(),"");
+                    }
+                }
+                if(StringUtils.isNotBlank(resStr)){
+                    result.put("data1",resStr.substring(1));
+                }
+                List<Reader> readerList2 = readerDao.find("select id from t_reader where orgid=? and (headimgurl is not null or headimgurl='') and " +
+                        "(cardnumber not in ("+sb.substring(1)+") and readcardcode not in ("+sb.substring(1)+")) ",orgid);
+                StringBuilder resStr2 = new StringBuilder();
+                for(Reader r : readerList2){
+                    resStr2.append(","+r.getId());
+                }
+                if(StringUtils.isNotBlank(resStr2)){
+                    result.put("data2",resStr2.substring(1));
+                }
+            }else{
+                List<Reader> readerList2 = readerDao.find("select id from t_reader where orgid=? and headimgurl is not null",orgid);
+                StringBuilder resStr2 = new StringBuilder();
+                for(Reader r : readerList2){
+                    resStr2.append(","+r.getId());
+                }
+                if(StringUtils.isNotBlank(resStr2)){
+                    result.put("data2",resStr2.substring(1));
+                }
+            }
+
+
+
+
+
+            this.renderJson(result);
+
+        }catch(Exception e){
+            e.printStackTrace();fail();
+        }
+    }
+    public void uploadHeaderImg(){
+        try{
+            UploadFile file =getFile();
+            String orgid = getPara("orgid");
+            String cardnumber = getPara("cardnumber");
+            if(StringUtils.isBlank(orgid) || StringUtils.isBlank(cardnumber)){
+                fail();
+                return;
+            }
+
+            File image = file.getFile();
+            System.out.println("图片地址:"+image.getPath());
+            String flag = image.getName().substring(image.getName().lastIndexOf(".")+1);
+            Reader reader = readerDao.findFirst("select * from t_reader where  orgid=? and (cardnumber=? or readcardcode=?)", orgid, cardnumber,cardnumber);
+            if(reader == null){
+                System.out.println("读者不存在");
+                fail();
+                return;
+            }
+            String base64 = convertFileToBase64(image.getPath());
+            reader.setHeadimgurl("data:image/"+flag+";base64,"+base64).update();
+            success();
+        }catch(Exception e){
+            e.printStackTrace();fail();
+        }
+    }
+    public void myjieyue(){
+        try{
+            String orgid = getPara("orgid");
+            String readerCardId = getPara("cardnumber");
+            String sql = "select r.id, r.cardnumber,r.realname,status,losedate from t_reader r where orgid=? and (r.readcardcode = ? or r.cardnumber = ?)";
+            Record record = Db.findFirst(sql,orgid,readerCardId,readerCardId);
+            if(CommonUtils.isNotNullOrNotEmpty(record)){
+                Timestamp losedate = record.get("losedate");
+                long currentTime = System.currentTimeMillis();
+                if(currentTime>losedate.getTime()) { //如果当前时间大于有效期 则说明已过期
+                    fail(0,"读者证已过期");
+                    return ;
+                }
+                int readerStatus = record.get("status");
+                if(readerStatus != 1) {
+                    fail(0,"读者证状态异常");
+                    return ;
+                }
+                List<Record> list = Db.find("select j.createtime,j.duetime,j.isoverdue,b.title,b.author,d.barcode from t_jieyue j inner join t_book_detail d on d.id=j.bookdetailid " +
+                        "inner join t_book b on b.id=d.bookid  where j.readerid=? and j.status=0 ", record.getInt("id"));
+                if(list !=null && list.size()>0){
+                    for(Record r : list){
+                        if(r.get("createtime") != null){
+                            r.set("createtime", format1.format(r.getDate("createtime")));
+                        }
+                        if(r.get("duetime") != null){
+                            r.set("duetime", format1.format(r.getDate("duetime")));
+                        }
+                    }
+                }
+                success(list);
+            } else {
+                fail(0,"读者信息为空");
+                return;
+            }
+        }catch(Exception e){
+            fail(1,"数据异常");
+            return;
+        }
+
+    }
+    public void queryReaderInfo(){
+        try{
+            Record resultRecord = new Record();
+            String orgid = getPara("orgid");
+            String readerCardId = getPara("cardnumber");
+            String sql = "select r.*,a.jieyueshuliang,a.name typename," +
+                    "(select count(*) from t_jieyue where status = 0 and readerid = r.id) yijienumber," +
+                    "(select count(*) from t_jieyue where status = 0 and isoverdue = 1 and readerid = r.id) overduenumber " +
+                    "from t_reader r inner join t_reader_auth a on r.readerauthid = a.id where r.orgid=? and (r.readcardcode = ? or r.cardnumber = ?)";
+            Record record = Db.findFirst(sql,orgid,readerCardId,readerCardId);
+            if(CommonUtils.isNotNullOrNotEmpty(record)){
+                Timestamp losedate = record.get("losedate");
+                long currentTime = System.currentTimeMillis();
+                if(currentTime>losedate.getTime()) { //如果当前时间大于有效期 则说明已过期
+                    fail(0,"读者证已过期");
+                    return ;
+                }
+                int readerStatus = record.get("status");
+                if(readerStatus != 1) {
+                    fail(0,"读者证状态异常");
+                    return ;
+                }
+
+                Record authRecord = Db.findFirst("select a.* from t_reader r inner join t_reader_auth a on r.readerauthid=a.id where (r.readcardcode='" + readerCardId + "' or r.cardnumber ='" + readerCardId + "') and r.orgid=?",orgid);
+                if(CommonUtils.isNullOrEmpty(authRecord)) {
+                    fail(0,"权限异常");
+                    return ;
+                }
+                int shifounengchaoqijieshu = authRecord.get("shifounengchaoqijieshu");
+                int shifounengqiankuanjieshu = authRecord.get("shifounengqiankuanjieshu");
+                int jieyueshuliang = authRecord.get("jieyueshuliang");
+                if(1 == shifounengchaoqijieshu) {
+                    if(null != record.get("overdue")) {
+                        int overdue = record.get("overdue");
+                        if (1 == overdue) {
+                            fail(0,"超期不允许借书");
+                            return ;
+                        }
+                    }
+                }
+                if(1 == shifounengqiankuanjieshu) {
+                    Record qiankuanRecord = Db.findFirst("select count(1) qiankuannum from t_book_penalty p inner join t_reader r on p.readerid = r.id where penaltystatus = 0 and penaltyamount > 0 and (r.readcardcode = ? or r.cardnumber = ?)",readerCardId,readerCardId);
+                    int qiankuannum = qiankuanRecord.getInt("qiankuannum");
+                    if (qiankuannum > 0) {
+                        fail(0,"欠款不允许借书");
+                        return ;
+                    }
+                }
+                int overduenumber = record.getInt("overduenumber");
+                int yijienumber = record.getInt("yijienumber");
+
+                if (yijienumber > jieyueshuliang) {
+                    fail(0,"已超过可借数量");
+                    return ;
+                }
+                resultRecord.set("yijienumber",yijienumber); //当前借书数量
+                resultRecord.set("overduenumber",overduenumber); //超期图书数量
+                resultRecord.set("readerCardId",readerCardId); //读者证号,不可以为空
+                resultRecord.set("realname",record.getStr("realname")); //读者名字
+                resultRecord.set("jieyueshuliang",jieyueshuliang);
+                /*if(jieyueshuliang - yijienumber > 0) {
+                    resultRecord.set("jieyueshuliang",jieyueshuliang); //允许最大借书数
+                } else {
+                    resultRecord.set("jieyueshuliang",0); //允许最大借书数
+                }*/
+                resultRecord.set("typename",record.getStr("typename"));
+                resultRecord.set("losedate",record.getStr("losedate").substring(0,10));
+
+                List<Record> jieyueBarcodeList = Db.find("select d.rfid from t_jieyue j left join t_book_detail d on " +
+                        " j.bookdetailid = d.id left join t_reader r on j.readerid = r.id where j.status = 0 and " +
+                        " (r.readcardcode = ? or r.cardnumber = ?) and j.orgid = ?",readerCardId,readerCardId,orgid);
+
+                resultRecord.set("jieyueBarcodeList",jieyueBarcodeList);
+                if(jieyueshuliang - yijienumber < 0) {
+                    fail(0,"已超过可借数量");
+                    return ;
+                    //resultRecord.set("reinfo","已超过可借数量");
+                } else {
+                    resultRecord.set("reinfo","查询成功");
+                }
+            } else {
+                fail(0,"读者信息为空");
+                return;
+            }
+            success(resultRecord);
+        }catch(Exception e){
+            fail(1,"数据异常");
+        }
+
+    }
+    public void queryReaderInfo_jieyuelist(){
+        try{
+            Record resultRecord = new Record();
+            String orgid = getPara("orgid");
+            String readerCardId = getPara("cardnumber");
+            String sql = "select r.cardnumber,r.realname,status,losedate from t_reader r where orgid=? and (r.readcardcode = ? or r.cardnumber = ?)";
+            Record record = Db.findFirst(sql,orgid,readerCardId,readerCardId);
+            if(CommonUtils.isNotNullOrNotEmpty(record)){
+                Timestamp losedate = record.get("losedate");
+                long currentTime = System.currentTimeMillis();
+                if(currentTime>losedate.getTime()) { //如果当前时间大于有效期 则说明已过期
+                    fail(0,"读者证已过期");
+                    return ;
+                }
+                int readerStatus = record.get("status");
+                if(readerStatus != 1) {
+                    fail(0,"读者证状态异常");
+                    return ;
+                }
+                success(record);
+            } else {
+                fail(0,"读者信息为空");
+                return;
+            }
+        }catch(Exception e){
+            fail(1,"数据异常");
+            return;
+        }
+
+    }
+    public void jiansuo(){
+        try{
+            String text = getPara("text");
+            String orgid = getPara("orgid");
+            int libraryid = getParaToInt("libraryid",0);
+            try{
+                if(StringUtils.isBlank(text)){
+                    success(new Page());
+                }
+
+                List values = new ArrayList();
+                values.add(orgid);
+                values.add("%"+text+"%");
+                String where = "";
+
+                where = "from t_book b inner join t_book_detail e on e.bookid=b.id where orgid=? and title like ?";
+                if(libraryid>0){
+                    where+=" and libraryid=?";
+                    values.add(libraryid);
+                }
+
+
+                Page<Record> page = Db.paginate(getParaToInt("pageNumber", 1),getParaToInt("pageSize", 10),
+                        "select b.id,title,author,publisher,bookno,(select count(id) from t_book_detail d where d.bookid = b.id and d.status=0) as zaiguan," +
+                                "(select count(id) from t_book_detail d where d.bookid = b.id ) as totalnum ",
+                        where, listToArray(values));
+                success(page);
+            }catch(Exception e){
+                e.printStackTrace();
+                success(new Page());
+            }
+        }catch(Exception e){
+            fail(1,"数据异常");
+            return;
+        }
+
+    }
+    public void bindReader(){
+        String cardnumber = getPara("cardnumber");
+        String code = getPara("code");
+        int orgid = getParaToInt("orgid", 0);
+        if(StringUtils.isBlank(cardnumber) || StringUtils.isBlank(code) || orgid == 0){
+            fail(1,"参数不完整");
+            return;
+        }
+        Reader reader = readerDao.findFirst("select id from t_reader where cardnumber=? and password=? and orgid=?",cardnumber,code,orgid);
+        if(reader == null){
+            fail(1,"读者证号或确认码错误");
+            return ;
+        }
+        success();
+    }
+    public void borrowBooks(){
+        try{
+            Record resultRecord = new Record();
+
+            String orgid = getPara("orgid");
+            String libraryid = getPara("libraryid");
+            String readerCardId = getPara("cardnumber");
+            String bookrfid = getPara("rfid");
+            String equipmentid = getPara("equipmentid");
+            Record readerRecord = Db.findFirst("select id,cardnumber from t_reader where (readcardcode = ? or cardnumber = ?) and orgid=?",readerCardId,readerCardId,orgid);
+            Record bookRecord = Db.findFirst("select b.title,b.price,d.id,d.barcode,b.author ,d.status,d.rfid from t_book b inner join t_book_detail d on b.id = d.bookid where (d.rfid =? or d.barcode=?) and b.orgid=?",bookrfid,bookrfid,orgid);
+            resultRecord.set("barcode", "");
+            resultRecord.set("author", "");
+            resultRecord.set("title", "");
+            if(CommonUtils.isNullOrEmpty(bookRecord)) {
+
+                resultRecord.set("reinfo","查询不到书籍信息");
+                success(2,"查询不到书籍信息",resultRecord);
+                return ;
+            }
+            resultRecord.set("title",bookRecord.getStr("title"));
+            resultRecord.set("author", bookRecord.get("author"));
+            resultRecord.set("barcode", bookRecord.get("barcode"));
+            if(CommonUtils.isNullOrEmpty(readerRecord)) {
+                resultRecord.set("reinfo","查询不到读者信息");
+                success(2,"查询不到读者信息",resultRecord);
+                return ;
+            }
+
+            int status = bookRecord.getInt("status");
+            if(status == 1){
+                resultRecord.set("reinfo","该书已借出");
+                success(2,"该书已借出",resultRecord);
+                return;
+            }else if(status == 2){
+                resultRecord.set("reinfo","该书已被预约");
+                success(2,"该书已被预约",resultRecord);
+                return;
+            }else if(status == 3){
+                resultRecord.set("reinfo","该书已被注销");
+                success(2,"该书已被注销",resultRecord);
+                return;
+            }else if(status > 0){
+                resultRecord.set("reinfo","该书状态异常,不能借阅");
+                success(2,"该书状态异常,不能借阅",resultRecord);
+                return;
+            }
+            try {
+                Record authRecord = Db.findFirst("select a.* from t_reader r left join t_reader_auth a on r.readerauthid=a.id where r.readcardcode='" + readerCardId + "' or r.cardnumber ='" + readerCardId + "' and r.orgid=?",orgid);
+                int jieyuetianshu = authRecord.getInt("jieyuetianshu");
+
+                int jieyueshuliang = authRecord.getInt("jieyueshuliang");
+                Record jieyueCountRecord = Db.findFirst("select count(*) count from t_jieyue where status = 0 and readerid =?",readerRecord.getInt("id"));
+                if(jieyueCountRecord.getInt("count") > jieyueshuliang) {
+                    String currentDate = format1.format(new Date());
+                    System.err.println(currentDate);
+                    Db.update("update t_jieyue set exceed = ? where status = 0 and readerid =?",currentDate,readerRecord.getInt("id"));
+                    Db.update("update t_reader set status = 3 where id = ? and status = 1",readerRecord.getInt("id"));
+                    //resultRecord.set("reinfo","达到借书量上限,借书失败");
+                    //fail(0,"达到借书量上限,借书失败");
+                    // return;
+                }
+
+
+
+                Calendar calendar = Calendar.getInstance();
+                Jieyue jieyue = new Jieyue();
+                jieyue.setReaderid(readerRecord.get("id"));
+                jieyue.setOrgid(Integer.valueOf(orgid));
+                jieyue.setBookdetailid(bookRecord.get("id"));
+                jieyue.setFlag(0);
+                jieyue.setStatus(0);
+                jieyue.setJieyuetype(2);
+                jieyue.setLibraryid(Integer.parseInt(libraryid));
+                if(CommonUtils.isNotNullOrNotEmpty(equipmentid)){
+                    jieyue.setEquipmentid(Integer.parseInt(equipmentid));
+                }
+                jieyue.setContinuenum(0);
+                jieyue.setCreatetime(calendar.getTime());
+                calendar.add(Calendar.DATE, jieyuetianshu);
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                String datestr = sdf.format(calendar.getTime());
+                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                jieyue.setDuetime(sdf2.parse(datestr + " 23:59:59"));
+                jieyue.setOperatorid(999999);
+                jieyue.save();
+                Db.update("update t_book_detail set status = 1,jieyuenums = ifnull(jieyuenums,0)+1 where id = ?", bookRecord.getInt("id"));
+
+
+                resultRecord.set("rfid",bookRecord.getStr("rfid"));
+
+                resultRecord.set("price",bookRecord.getStr("price"));
+                resultRecord.set("readerCardId",readerCardId);
+                resultRecord.set("returntime",sdf2.parse(datestr + " 23:59:59"));
+                resultRecord.set("reinfo","借书成功");
+            } catch (ParseException e) {
+                fail(0,"借书异常");
+                e.printStackTrace();
+                return;
+            }
+            success(resultRecord);
+        }catch(Exception e){
+            fail(1,"数据异常");
+            return;
+        }
+
+    }
+
+    public void returnBooks(){
+        try {
+            Record resultRecord = new Record();
+            String orgid = getPara("orgid");
+            String libraryid = getPara("libraryid");
+            String bookrfid = getPara("rfid");
+            Record bookRecord = Db.findFirst("select b.bookno,b.title,b.author,b.price,d.id,d.barcode,d.rfid from t_book b inner join t_book_detail d on b.id = d.bookid where d.rfid =? and b.orgid=?", bookrfid, orgid);
+            resultRecord.set("barcode", "");
+            resultRecord.set("author", "");
+            resultRecord.set("title", "");
+            if (CommonUtils.isNullOrEmpty(bookRecord)) {
+                resultRecord.set("reinfo","查询不到书籍信息");
+                success(resultRecord);
+                return;
+            }
+            resultRecord.set("barcode", bookRecord.get("barcode"));
+            resultRecord.set("author", bookRecord.get("author"));
+            resultRecord.set("title", bookRecord.get("title"));
+            Record jieyueRecord = Db.findFirst("select * from t_jieyue where bookdetailid = ? and status=0 ORDER BY createtime desc", bookRecord.getInt("id"));
+            if (CommonUtils.isNullOrEmpty(jieyueRecord)) {
+                resultRecord.set("reinfo","查询不到借阅信息");
+                success(2,"查询不到借阅信息",resultRecord);
+                return;
+            }
+            Record authRecord = Db.findFirst("select a.* from t_reader r left join t_reader_auth a on r.readerauthid=a.id where r.id='" + jieyueRecord.getInt("readerid") + "'");
+            if (CommonUtils.isNullOrEmpty(authRecord)) {
+                resultRecord.set("reinfo","查询不到读者权限信息");
+                success(2,"查询不到读者权限信息",resultRecord);
+                return;
+            }
+
+            Record library = Db.findFirst("select library from t_library where id = ? ", libraryid);
+            if (CommonUtils.isNullOrEmpty(library)) {
+                resultRecord.set("reinfo","查询不到馆藏地信息");
+                success(2,"查询不到馆藏地信息",resultRecord);
+                return;
+            }
+            Integer isoverdue = jieyueRecord.getInt("isoverdue");
+            BigDecimal amount = new BigDecimal(0);
+            //已超期
+            if (CommonUtils.isNotNullOrNotEmpty(isoverdue) && 1 == isoverdue) {
+                Timestamp duetime = jieyueRecord.get("duetime");
+                LocalDateTime dueDate = duetime.toLocalDateTime();
+                BigDecimal chaoqifakuan = authRecord.getBigDecimal("chaoqifakuan");
+                BigDecimal chaoqifakuanxiane = authRecord.getBigDecimal("chaoqifakuanxiane");
+                Duration duration = Duration.between(LocalDateTime.now(), dueDate);
+                long days = duration.toDays(); //超期的天数
+                amount = chaoqifakuan.multiply(new BigDecimal(days));
+                //判断是否大于超期限额
+                if (amount.compareTo(chaoqifakuanxiane) > 0 && chaoqifakuanxiane.compareTo(BigDecimal.ZERO) != 0) {
+                    amount = chaoqifakuanxiane;
+                }
+                //标记为超期
+                jieyueRecord.set("isoverdue", 1);
+                //保存罚款记录
+                Record penalty = new Record();
+                penalty.set("orgid", orgid);
+                penalty.set("readerid", jieyueRecord.get("readerid"));
+                penalty.set("bookdetailid", bookRecord.get("id"));
+                penalty.set("jieyueid", jieyueRecord.get("id"));
+                penalty.set("penaltystatus", 0);
+                penalty.set("penaltyamount", amount);
+                penalty.set("flag", 0);
+                penalty.set("type", 2);
+                Db.save("t_book_penalty", penalty);
+            } else {
+                jieyueRecord.set("isoverdue", 2);
+            }
+            jieyueRecord.set("status", 1);
+            jieyueRecord.set("returntime", new Date());
+            jieyueRecord.set("returnuserid", jieyueRecord.get("readerid"));
+            //更新借阅记录
+            Db.update("t_jieyue", jieyueRecord);
+            //修改续借状态
+            Db.update("update t_jieyue set continuenum=0 where readerid = ? and bookdetailid=?", jieyueRecord.get("readerid"), bookRecord.getStr("id"));
+
+            //更新图书详情
+            Db.update("update t_book_detail set status = 0 where status=1 and id = ?", bookRecord.getStr("id"));
+            resultRecord.set("rfid", bookRecord.get("rfid"));
+
+            resultRecord.set("bookno", bookRecord.get("bookno"));
+
+            resultRecord.set("library", library.get("library"));
+            resultRecord.set("readerid", jieyueRecord.get("readerid"));
+            resultRecord.set("amount", amount);
+            resultRecord.set("reinfo", "还书成功");
+            success(resultRecord);
+        }catch(Exception e){
+            fail(1,"数据异常");
+            return;
+        }
+    }
+
+}

+ 472 - 0
src/main/java/com/controller/api/ReaderApiController.java

@@ -0,0 +1,472 @@
+package com.controller.api;
+
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Before;
+import com.jfinal.aop.Clear;
+import com.jfinal.ext.interceptor.POST;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.OrgDept;
+import com.model.Reader;
+import com.tools.ISBNTools;
+import com.utils.CommonUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.text.ParseException;
+import java.util.*;
+
+@Clear
+@ControllerInterface(path="/api/reader")
+public class ReaderApiController extends BaseController {
+    @Before(POST.class)
+    public void createReader(){
+        getFile();
+        String secret = getPara("secret");
+        if(CommonUtils.isNullOrEmpty(secret)){
+            fail(0,"secret不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_org where orgsecret=?",secret);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(0,"secret错误");
+            return;
+        }
+        Reader reader = new Reader();
+        Integer readertypeid = getParaToInt("readertypeid",62);//读者权限: 62 学生 63 老师 64 其他
+        reader.setReadertypeid(readertypeid);
+        String cardnumber = getPara("cardnumber");
+        if(CommonUtils.isNullOrEmpty(cardnumber)){
+            fail(0,"cardnumber不能为空");
+            return;
+        }
+        Record readerRecord = Db.findFirst("select * from t_reader where orgid = ? and cardnumber = ?",record.getInt("id"),cardnumber);
+        if(CommonUtils.isNotNullOrNotEmpty(readerRecord)){
+            fail(0,"读者证号重复");
+            return;
+        }
+        reader.setCardnumber(cardnumber);
+        reader.setOrgid(record.getInt("id"));
+        String orgdeptname = getPara("orgdeptname"); //所属班级/部门名称
+        if(CommonUtils.isNullOrEmpty(orgdeptname)){
+            fail(0,"orgdeptname不能为空");
+            return;
+        }
+        try {
+            orgdeptname = URLDecoder.decode(orgdeptname, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        Record orgdeptRecord = Db.findFirst("select id from t_org_dept where orgid = ? and deptname = ? ",record.getInt("id"),orgdeptname);
+        if(CommonUtils.isNullOrEmpty(orgdeptRecord)){
+            Record readAuthRecord = Db.findFirst("select id from t_reader_auth where orgid = ? order by jieyuetianshu asc limit 1",record.getInt("id"));
+            if(CommonUtils.isNullOrEmpty(readAuthRecord)){
+                fail(0,"该学校没有创建借阅权限");
+                return;
+            }
+            OrgDept orgDept = new OrgDept();
+            orgDept.setMemo("第三方系统同步数据创建").setReaderauthid(readAuthRecord.getInt("id")).setDeptname(orgdeptname).setOrgid(record.getInt("id")).setCreatetime(new Date()).save();
+            orgdeptRecord = orgDept.toRecord();
+        }
+        reader.setOrgdeptid(orgdeptRecord.getInt("id"));
+        String realname = getPara("realname");
+        if(CommonUtils.isNullOrEmpty(realname)){
+            fail(0,"realname不能为空");
+            return;
+        }
+        try {
+            realname = URLDecoder.decode(realname, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        reader.setRealname(realname);
+        String sex = getPara("sex");
+        if(CommonUtils.isNullOrEmpty(sex)){
+            fail(0,"sex不能为空");
+            return;
+        }
+        try {
+            sex = URLDecoder.decode(sex, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        if (!sex.equals("男") && !sex.equals("女")){
+            fail(0,"性别错误");
+            return;
+        }
+        reader.setSex(sex);
+        String authname = getPara("authname");
+        if(CommonUtils.isNullOrEmpty(authname)){
+            fail(0,"authname不能为空");
+            return;
+        }
+        try {
+            authname = URLDecoder.decode(authname, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        Record authRecord = Db.findFirst("select id from t_reader_auth where orgid = ? and name = ? ",record.getInt("id"),authname);
+        if(CommonUtils.isNullOrEmpty(authRecord)){
+            fail(0,"查询不到权限信息");
+            return;
+        }
+        reader.setReaderauthid(authRecord.getInt("id"));
+        Integer certificatetype = getParaToInt("certificatetype");//证件类型 58 身份证 59 驾驶证 60 学生证 61 护照
+        if(CommonUtils.isNotNullOrNotEmpty(certificatetype)){
+            if(certificatetype != 58 && certificatetype != 59 && certificatetype != 60 && certificatetype != 61){
+                fail(0,"证件类型错误");
+                return;
+            }
+            reader.setCertificatetypeid(certificatetype);
+        }
+        String certificate = getPara("certificate");
+        if(CommonUtils.isNotNullOrNotEmpty(certificate)){
+            reader.setCertificate(certificate);
+        }
+        Calendar calendar = Calendar.getInstance();
+
+        String memo = getPara("memo");
+        if(CommonUtils.isNotNullOrNotEmpty(memo)){
+            reader.setMemo(memo);
+        }
+        String createtime = getPara("createtime");
+        if(CommonUtils.isNotNullOrNotEmpty(createtime)){
+            try {
+                Date createdate = format1.parse(createtime);
+                reader.setCreatetime(createdate);
+            } catch (ParseException e) {
+                fail(0,"办证时间格式错误,正确格式:yyyy-MM-dd");
+                e.printStackTrace();
+                return;
+            }
+        } else {
+            reader.setCreatetime(new Date());
+        }
+        String losedatestr = getPara("losedate");
+        if(CommonUtils.isNotNullOrNotEmpty(losedatestr)){
+            try {
+                Date losedate = format1.parse(losedatestr);
+                reader.setLosedate(losedate);
+            } catch (ParseException e) {
+                fail(0,"失效时间格式错误,正确格式:yyyy-MM-dd");
+                e.printStackTrace();
+                return;
+            }
+        } else {
+            calendar.add(Calendar.YEAR,3);
+            reader.setLosedate(calendar.getTime());
+        }
+        reader.setStatus(1);
+        reader.save();
+
+        Map dateplatMap = new HashMap();
+        dateplatMap.put("orgid",reader.getOrgid()+"");
+        dateplatMap.put("realname",reader.getRealname());
+        dateplatMap.put("sex",reader.getSex());
+        if(CommonUtils.isNotNullOrNotEmpty(reader.getBirthday())){
+            dateplatMap.put("birthday",format3.format(reader.getBirthday()));
+        }
+        dateplatMap.put("readertypeid",reader.getReadertypeid()+"");
+        dateplatMap.put("createtime",format3.format(reader.getCreatetime()));
+        Thread t = new Thread() {
+            public void run() {
+                HttpKit.get(PropKit.get("addReaderServiceUrl"), dateplatMap);
+            }
+        };
+        t.start();
+        success();
+    }
+
+    /**
+     * 查询读者信息
+     */
+    public void findReaderInfo(){
+        String secret = getPara("secret");
+        if(CommonUtils.isNullOrEmpty(secret)){
+            fail(0,"secret不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_org where orgsecret=?",secret);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(0,"secret错误");
+            return;
+        }
+        String cardnumber = getPara("cardnumber");
+        if(CommonUtils.isNullOrEmpty(cardnumber)){
+            fail(0,"cardnumber不能为空");
+            return;
+        }
+        Record  readerRecord = Db.findFirst("select r.realname,r.cardnumber,r.sex,o.orgname,d.deptname from t_reader r left join t_org o on r.orgid = o.id left join t_org_dept d on r.orgdeptid = d.id where r.cardnumber = ? and r.orgid = ?",cardnumber,record.getInt("id"));
+        success(readerRecord);
+    }
+
+    /**
+     * 查询读者借阅记录
+     */
+    public void libraryRecords(){
+        String secret = getPara("secret");
+        if(CommonUtils.isNullOrEmpty(secret)){
+            fail(0,"secret不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_org where orgsecret=?",secret);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(0,"secret错误");
+            return;
+        }
+        String cardnumber = getPara("cardnumber");
+        if(CommonUtils.isNullOrEmpty(cardnumber)){
+            fail(0,"cardnumber不能为空");
+            return;
+        }
+        String title = getPara("title");
+        String starttimestamp = getPara("starttimestamp");
+        String starttime = "";
+        String endtime = "";
+        if(CommonUtils.isNotNullOrNotEmpty(starttimestamp)){
+            starttime = format1.format(new Date(Long.parseLong(starttimestamp)));
+        }
+        String endtimestamp = getPara("endtimestamp");
+        if(CommonUtils.isNotNullOrNotEmpty(endtimestamp)){
+            endtime = format1.format(new Date(Long.parseLong(endtimestamp)));
+        }
+        String select = "select b.title,b.author,b.publisher,b.isbn,b.typecode,j.status,DATE_FORMAT(j.createtime,'%Y-%m-%d') AS createtime ,DATE_FORMAT(j.returntime,'%Y-%m-%d') AS returntime,j.isoverdue ";
+        StringBuffer where = new StringBuffer("from t_jieyue j left join t_reader r on j.readerid = r.id left join t_book_detail d on j.bookdetailid = d.id left join t_book b on d.bookid = b.id where r.orgid = ? and r.cardnumber = ? and j.status in (0,1,2) and j.flag = 0");
+        List param = new ArrayList();
+        param.add(record.getInt("id"));
+        param.add(cardnumber);
+        if(CommonUtils.isNotNullOrNotEmpty(title)){
+            try {
+                title = URLDecoder.decode(title,"UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+                fail(0,"参数错误");
+                return;
+            }
+            where.append(" and b.title like ?");
+            param.add("%"+title+"%");
+        }
+        if(CommonUtils.isNotNullOrNotEmpty(starttime)){
+            where.append(" and j.createtime >= ?");
+            param.add(starttime);
+        }
+        if(CommonUtils.isNotNullOrNotEmpty(endtime)){
+            where.append(" and j.createtime <= ?");
+            param.add(endtime);
+        }
+        where.append(" order by createtime desc");
+        Page page = Db.paginate(this.getParaToInt("pageNumber",1),this.getParaToInt("pageSize",10),select,where.toString(),CommonUtils.listToArray(param));
+        success(page);
+    }
+
+    /**
+     * 查询读者当前再借记录
+     */
+    public void borrowingRecords(){
+        String secret = getPara("secret");
+        if(CommonUtils.isNullOrEmpty(secret)){
+            fail(0,"secret不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_org where orgsecret=?",secret);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(0,"secret错误");
+            return;
+        }
+        String cardnumber = getPara("cardnumber");
+        if(CommonUtils.isNullOrEmpty(cardnumber)){
+            fail(0,"cardnumber不能为空");
+            return;
+        }
+        String title = getPara("title");
+        String starttimestamp = getPara("starttimestamp");
+        String starttime = "";
+        String endtime = "";
+        if(CommonUtils.isNotNullOrNotEmpty(starttimestamp)){
+            starttime = format1.format(new Date(Long.parseLong(starttimestamp)));
+        }
+        String endtimestamp = getPara("endtimestamp");
+        if(CommonUtils.isNotNullOrNotEmpty(endtimestamp)){
+            endtime = format1.format(new Date(Long.parseLong(endtimestamp)));
+        }
+        String select = "select b.title,b.author,b.publisher,b.isbn,b.typecode,DATE_FORMAT(j.createtime,'%Y-%m-%d') AS createtime ,DATE_FORMAT(j.returntime,'%Y-%m-%d') AS returntime,j.isoverdue ";
+        StringBuffer where = new StringBuffer("from t_jieyue j left join t_reader r on j.readerid = r.id left join t_book_detail d on j.bookdetailid = d.id left join t_book b on d.bookid = b.id where r.orgid = ? and r.cardnumber = ? and j.status =0 and j.flag = 0");
+        List param = new ArrayList();
+        param.add(record.getInt("id"));
+        param.add(cardnumber);
+        if(CommonUtils.isNotNullOrNotEmpty(title)){
+            try {
+                title = URLDecoder.decode(title,"UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+                fail(0,"参数错误");
+                return;
+            }
+            where.append(" and b.title like ?");
+            param.add("%"+title+"%");
+        }
+        if(CommonUtils.isNotNullOrNotEmpty(starttime)){
+            where.append(" and j.createtime >= ?");
+            param.add(starttime);
+        }
+        if(CommonUtils.isNotNullOrNotEmpty(endtime)){
+            where.append(" and j.createtime <= ?");
+            param.add(endtime);
+        }
+        where.append(" order by j.createtime desc");
+        Page page = Db.paginate(this.getParaToInt("pageNumber",1),this.getParaToInt("pageSize",10),select,where.toString(),CommonUtils.listToArray(param));
+        success(page);
+    }
+
+    /**
+     * 借阅权限
+     */
+    public void findReaderAuth(){
+        String secret = getPara("secret");
+        if(CommonUtils.isNullOrEmpty(secret)){
+            fail(0,"secret不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_org where orgsecret=?",secret);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(0,"secret错误");
+            return;
+        }
+        String cardnumber = getPara("cardnumber");
+        if(CommonUtils.isNullOrEmpty(cardnumber)){
+            fail(0,"cardnumber不能为空");
+            return;
+        }
+        Record readerAuthRecord = Db.findFirst("select name,jieyuetianshu,jieyueshuliang,xujiecishu,a.xujietianshu from t_reader_auth a left join t_reader r on a.id = r.readerauthid where r.orgid = ? and r.cardnumber = ?",record.getInt("id"),cardnumber);
+        success(readerAuthRecord);
+    }
+
+    /**
+     * 馆藏查询
+     */
+    public void queryBookInfo(){
+        String secret = getPara("secret");
+        if(CommonUtils.isNullOrEmpty(secret)){
+            fail(0,"secret不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_org where orgsecret=?",secret);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(0,"secret错误");
+            return;
+        }
+        int orgid = record.getInt("id");
+        String isbn = getPara("isbn");
+        String title = getPara("title");
+        String publisher = getPara("publisher");
+        String author = getPara("author");
+
+        String select = "SELECT   a.bookno, typecode,    isbn, title, publisher, edition, author, " +
+                "publishdate,  publishaddress,  barcode, status, bookstatus,otherauthor, totalpages, d.library ";
+        StringBuilder where = new StringBuilder(" from t_book a left JOIN t_book_plus b ON a.id = b.bookid " +
+                " inner JOIN t_book_detail c on a.id=c.bookid" +
+                " inner JOIN t_library d  ON c.libraryid = d.id " +
+                " where a.orgid =? ");
+
+        List<Object> paramList =new ArrayList<Object>();
+        paramList.add(orgid);
+        if(CommonUtils.isNotNullOrNotEmpty(title)){
+            try {
+                title = URLDecoder.decode(title,"UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+                fail(0,"参数错误");
+                return;
+            }
+            where.append(" and title like ? ");
+            paramList.add("%"+title+"%");
+        }
+        if(CommonUtils.isNotNullOrNotEmpty(publisher)){
+            try {
+                publisher = URLDecoder.decode(publisher,"UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+                fail(0,"参数错误");
+                return;
+            }
+            where.append(" and publisher like ? ");
+            paramList.add("%"+publisher+"%");
+        }
+        if(CommonUtils.isNotNullOrNotEmpty(author)){
+            try {
+                author = URLDecoder.decode(author,"UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+                fail(0,"参数错误");
+                return;
+            }
+            where.append(" and author like ? ");
+            paramList.add("%"+author+"%");
+        }
+
+        if (CommonUtils.isNotNullOrNotEmpty(isbn)){
+            where.append(" and isbn =? ");
+            paramList.add(ISBNTools.fmtisbn(isbn));
+        }
+
+        Page page =  Db.paginate(this.getParaToInt("pageNumber",1),this.getParaToInt("pageSize",10),select,where.toString(),paramList.toArray(new Object[0]));
+        success(page);
+    }
+
+    public void hotTop100(){
+        String secret = getPara("secret");
+        if(CommonUtils.isNullOrEmpty(secret)){
+            fail(0,"secret不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_org where orgsecret=?",secret);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(0,"secret错误");
+            return;
+        }
+        int orgid = record.getInt("id");
+        List list = Db.find("SELECT   bookno, typecode,    isbn, title, publisher, edition, author,publishdate,  publishaddress,  barcode, status, bookstatus,jieyuenums from t_book_detail d left join t_book b on d.bookid = b.id where orgid = ? order by jieyuenums desc limit 100",orgid);
+        success(list);
+    }
+
+
+    public void updateCardNumber(){
+        String secret = getPara("secret");
+        if(CommonUtils.isNullOrEmpty(secret)){
+            fail(0,"secret不能为空");
+            return;
+        }
+        Record record = Db.findFirst("select * from t_org where orgsecret=?",secret);
+        if(CommonUtils.isNullOrEmpty(record)){
+            fail(0,"secret错误");
+            return;
+        }
+        String oldCardNumber = getPara("oldCardNumber");
+        if(CommonUtils.isNullOrEmpty(oldCardNumber)){
+            fail(0,"oldCardNumber不能为空");
+            return;
+        }
+        String cardNumber = getPara("cardNumber");
+        if(CommonUtils.isNullOrEmpty(cardNumber)){
+            fail(0,"cardNumber不能为空");
+            return;
+        }
+        Record checkRecord = Db.findFirst("select count(*) ct from t_reader where  (cardnumber = ? or readcardcode = ?) and orgid = ?",cardNumber,cardNumber,record.getInt("id"));
+        if(checkRecord.getInt("ct")>0) {
+            fail(0,"新的读者证号重复");
+            return;
+        }
+        int count = Db.update("update t_reader set cardnumber = ?,readcardcode = ? where (cardnumber = ? or readcardcode = ?) and orgid = ?",cardNumber,cardNumber,oldCardNumber,oldCardNumber,record.getInt("id"));
+        if(count == 0) {
+            fail(0,"修改失败,查询不到读者信息");
+        } else {
+            success();
+        }
+    }
+}

+ 346 - 0
src/main/java/com/controller/api/ReaderReportController.java

@@ -0,0 +1,346 @@
+package com.controller.api;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.utils.CommonUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Clear
+@ControllerInterface(path="/api/readerreport")
+public class ReaderReportController extends BaseController {
+    public SimpleDateFormat format0 = new SimpleDateFormat("yyyy-MM-dd");
+
+    public void findorgname(){
+        int orgid = getParaToInt("orgid");
+        Record record = Db.findFirst("select orgname from t_org where id = ?",orgid);
+        success(record);
+    }
+    public void duzhepaihang(){
+        String startmonth = getPara("startmonth");
+        String endmonth = getPara("endmonth");
+        if(StringUtils.isBlank(startmonth)){
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.MONTH,-1);
+            startmonth = format0.format(calendar.getTime());
+        }
+        if(StringUtils.isBlank(endmonth)){
+            endmonth = format0.format(new Date());
+        }
+        int orgid = getParaToInt("orgid");
+        int pageSize = getParaToInt("pageSize", 10);
+        String sql = "select * from (\n" +
+                "select r.realname,d.deptname,count(j.id) num from t_jieyue j inner join t_reader r on r.id=j.readerid\n" +
+                "inner join t_org_dept d on d.id=r.orgdeptid\n" +
+                " where r.orgid=? and j.createtime>=? and j.createtime<=? group by r.realname) table1 order by num desc limit 0,?";
+        List<Record> list = Db.find(sql,orgid,startmonth+" 00:00:00",endmonth+" 23:59:59",pageSize);
+        System.out.println(sql);
+        success(list);
+    }
+    public void shujipaihang(){
+        String startmonth = getPara("startmonth");
+        String endmonth = getPara("endmonth");
+        if(StringUtils.isBlank(startmonth)){
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.MONTH,-1);
+            startmonth = format0.format(calendar.getTime());
+        }
+        if(StringUtils.isBlank(endmonth)){
+            endmonth = format0.format(new Date());
+        }
+        int pageSize = getParaToInt("pageSize", 10);
+        int orgid = getParaToInt("orgid");
+        String sql = "select * from (\n" +
+                "select b.title,b.author,count(j.id) num from t_jieyue j inner join t_book_detail bd on bd.id=j.bookdetailid\n" +
+                "inner join t_book b on b.id=bd.bookid\n" +
+                " where j.orgid=? and j.createtime>=? and j.createtime<=? group by b.title) table1 order by num desc limit 0,?";
+        List<Record> list = Db.find(sql,orgid,startmonth+" 00:00:00",endmonth+" 23:59:59",pageSize);
+        System.out.println(sql);
+        success(list);
+    }
+    public void fenlei(){
+        String startmonth = getPara("startmonth");
+        String endmonth = getPara("endmonth");
+        if(StringUtils.isBlank(startmonth)){
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.MONTH,-1);
+            startmonth = format0.format(calendar.getTime());
+        }
+        if(StringUtils.isBlank(endmonth)){
+            endmonth = format0.format(new Date());
+        }
+        int pageSize = getParaToInt("pageSize", 10);
+        int orgid = getParaToInt("orgid");
+        String sql = "select * from (" +
+                " select t.`name`,count(j.id) num from t_jieyue j inner join t_book_detail d on j.bookdetailid=d.id inner join t_book b on b.id=d.bookid\n" +
+                " INNER join t_booktype t on t.id=b.typeid where j.orgid=? and j.createtime>=? and j.createtime<=? group by t.name " +
+                ")table1 order by num  limit 0,?";
+        List<Record> list = Db.find(sql,orgid,startmonth+" 00:00:00",endmonth+" 23:59:59",pageSize);
+        Record totlalrecord = Db.findFirst(" select count(j.id) num from t_jieyue j where j.orgid=? " +
+                "and j.createtime>=? and j.createtime<=? ",orgid, startmonth+" 00:00:00", endmonth+" 23:59:59" );
+        long total = totlalrecord.getLong("num");
+        Map result = new HashMap<>();
+        result.put("list", list);
+        result.put("total", total);
+        String str1,str2,str3;
+        if(list.size()>0){
+            Record r = list.get(list.size()-1);
+            double a = r.getLong("num").longValue()*100d/total;
+            str1 = "最受欢迎的图书是<span style=\"color:#fd883a\">"+r.getStr("name")+"</span>类,占阅读总量的<span style=\"color:#fd883a\">"+String.format("%.2f", a)+"%</span>";
+        }else{
+            str1 = "";
+        }
+        if(list.size()>1){
+            Record r = list.get(list.size()-2);
+            double a = r.getLong("num").longValue()*100d/total;
+            str2 = "第二热门图书是<span style=\"color:#fd883a\">"+r.getStr("name")+"</span>类,占阅读总量的<span style=\"color:#fd883a\">"+String.format("%.2f", a)+"%</span>";
+        }else{
+            str2 = "";
+        }
+        if(list.size()>2){
+            Record r = list.get(list.size()-3);
+            double a = r.getLong("num").longValue()*100d/total;
+            str3 = "第三热门图书是<span style=\"color:#fd883a\">"+r.getStr("name")+"</span>类,占阅读总量的<span style=\"color:#fd883a\">"+String.format("%.2f", a)+"%</span>";
+        }else{
+            str3 = "";
+        }
+
+
+        result.put("str1", str1);
+        result.put("str2", str2);
+        result.put("str3", str3);
+        success(result);
+    }
+
+    public void nianjijieyuefenxi() {
+        String startmonth = getPara("startmonth");
+        String endmonth = getPara("endmonth");
+        if(StringUtils.isBlank(startmonth)){
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.MONTH,-1);
+            startmonth = format0.format(calendar.getTime());
+        }
+        if(StringUtils.isBlank(endmonth)){
+            endmonth = format0.format(new Date());
+        }
+        int orgid = getParaToInt("orgid");
+        Record orgRecord = Db.findById("t_org", orgid);
+        if (CommonUtils.isNullOrEmpty(orgRecord)) {
+            fail(0, "查询不到机构信息");
+            return;
+        }
+        if (CommonUtils.isNullOrEmpty(orgRecord.get("orgtypeid"))) {
+            fail(0, "机构类型不明确");
+            return;
+        }
+        if (CommonUtils.isNullOrEmpty(orgRecord.get("schoolcategoryid"))) {
+            fail(0, "学校类别不明确,请在学校信息里设置学校类别");
+            return;
+        }
+        if (orgRecord.getInt("orgtypeid") != 5) {
+            fail(0, "机构类型不正确");
+            return;
+        }
+        List<Double> sortList = new ArrayList<>();
+        Map<Double,String> map = new HashMap<>();
+        List reList = new ArrayList();
+        String typeid = "";
+        int schoolcategoryid = orgRecord.getInt("schoolcategoryid");
+        Record record = new Record();
+        if (schoolcategoryid == 1 || schoolcategoryid == 3 || schoolcategoryid == 6) {
+            record.set("gradename", "1-2年级");
+            Record zongjieyueRecord = Db.findFirst("select count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (1,2)", orgid,  startmonth,endmonth);
+            int zongjieyue = zongjieyueRecord.getInt("ct");
+            record.set("zongjieyue", zongjieyue);
+            if (zongjieyue == 0) {
+                record.set("pinjunjieyue", "0");
+                sortList.add(0d);
+                map.put(0d,record.getStr("gradename"));
+            } else {
+                Record readerRecord = Db.findFirst("select count(*) ct from t_reader r left join t_org_dept od on r.orgdeptid = od.id where r.orgid = ? and od.grade in (1,2)", orgid);
+                DecimalFormat df = new DecimalFormat("0.00");
+                String pinjunjieyue = df.format((float) zongjieyue / readerRecord.getInt("ct"));
+                record.set("pinjunjieyue", pinjunjieyue);
+                sortList.add((double) zongjieyue / readerRecord.getInt("ct"));
+                map.put((double) zongjieyue / readerRecord.getInt("ct"),record.getStr("gradename"));
+            }
+            Record zuixihuantushuleibieRecord = Db.findFirst("select typeid from (\n" +
+                    "select b.typeid,count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id left join t_book_detail d on j.bookdetailid = d.id \n" +
+                    "left join t_book b on d.bookid = b.id where j.orgid = ? and j.createtime >=? and j.createtime <=?  and od.grade in (1,2)\n" +
+                    "group by b.typeid  \n" +
+                    ") t order by ct desc", orgid, startmonth,endmonth);
+            if (CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord) && CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord.get("typeid"))) {
+                typeid = zuixihuantushuleibieRecord.getStr("typeid");
+                Record typeinfoRecord = Db.findFirst("select * from t_booktype where id = ?", typeid);
+                record.set("zuixihuantushuleibie", CommonUtils.isNotNullOrNotEmpty(typeinfoRecord.get("name")) ? typeinfoRecord.getStr("name") : "");
+
+                Record leibiejieyueliangRecord = Db.findFirst("select count(*) ct from t_book_detail d left join t_book b on d.bookid = b.id  where orgid = ? and typeid = ?", orgid, typeid);
+                record.set("leibiejieyueliang", leibiejieyueliangRecord.getInt("ct"));
+            } else {
+                record.set("zuixihuantushuleibie", "");
+                record.set("leibiejieyueliang", 0);
+            }
+            reList.add(record);
+
+            record = new Record();
+            record.set("gradename", "3-4年级");
+            zongjieyueRecord = Db.findFirst("select count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (3,4)", orgid,  startmonth,endmonth);
+            zongjieyue = zongjieyueRecord.getInt("ct");
+            record.set("zongjieyue", zongjieyue);
+            if (zongjieyue == 0) {
+                record.set("pinjunjieyue", "0");
+                record.set("pinjunjieyue", "0");
+                sortList.add(0d);
+            } else {
+                Record readerRecord = Db.findFirst("select count(*) ct from t_reader r left join t_org_dept od on r.orgdeptid = od.id where r.orgid = ? and od.grade in (3,4)", orgid);
+                DecimalFormat df = new DecimalFormat("0.00");
+                String pinjunjieyue = df.format((float) zongjieyue / readerRecord.getInt("ct"));
+                record.set("pinjunjieyue", pinjunjieyue);
+                sortList.add((double) zongjieyue / readerRecord.getInt("ct"));
+                map.put((double) zongjieyue / readerRecord.getInt("ct"),record.getStr("gradename"));
+            }
+            zuixihuantushuleibieRecord = Db.findFirst("select typeid from (\n" +
+                    "select b.typeid,count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id left join t_book_detail d on j.bookdetailid = d.id \n" +
+                    "left join t_book b on d.bookid = b.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (3,4)\n" +
+                    "group by b.typeid  \n" +
+                    ") t order by ct desc", orgid, startmonth,endmonth);
+            if (CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord) && CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord.get("typeid"))) {
+                typeid = zuixihuantushuleibieRecord.getStr("typeid");
+                Record typeinfoRecord = Db.findFirst("select * from t_booktype where id = ?", typeid);
+                record.set("zuixihuantushuleibie", CommonUtils.isNotNullOrNotEmpty(typeinfoRecord.get("name")) ? typeinfoRecord.getStr("name") : "");
+
+                Record leibiejieyueliangRecord = Db.findFirst("select count(*) ct from t_book_detail d left join t_book b on d.bookid = b.id  where orgid = ? and typeid = ?", orgid, typeid);
+                record.set("leibiejieyueliang", leibiejieyueliangRecord.getInt("ct"));
+            } else {
+                record.set("zuixihuantushuleibie", "");
+                record.set("leibiejieyueliang", 0);
+            }
+            reList.add(record);
+
+            record = new Record();
+            record.set("gradename", "5-6年级");
+            zongjieyueRecord = Db.findFirst("select count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (5,6)", orgid,  startmonth,endmonth);
+            zongjieyue = zongjieyueRecord.getInt("ct");
+            record.set("zongjieyue", zongjieyue);
+            if (zongjieyue == 0) {
+                record.set("pinjunjieyue", "0");
+                record.set("pinjunjieyue", "0");
+                sortList.add(0d);
+            } else {
+                Record readerRecord = Db.findFirst("select count(*) ct from t_reader r left join t_org_dept od on r.orgdeptid = od.id where r.orgid = ? and od.grade in (5,6)", orgid);
+                DecimalFormat df = new DecimalFormat("0.00");
+                String pinjunjieyue = df.format((float) zongjieyue / readerRecord.getInt("ct"));
+                record.set("pinjunjieyue", pinjunjieyue);
+                sortList.add((double) zongjieyue / readerRecord.getInt("ct"));
+                map.put((double) zongjieyue / readerRecord.getInt("ct"),record.getStr("gradename"));
+            }
+            zuixihuantushuleibieRecord = Db.findFirst("select typeid from (\n" +
+                    "select b.typeid,count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id left join t_book_detail d on j.bookdetailid = d.id \n" +
+                    "left join t_book b on d.bookid = b.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (5,6)\n" +
+                    "group by b.typeid  \n" +
+                    ") t order by ct desc", orgid,  startmonth,endmonth);
+            if (CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord) && CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord.get("typeid"))) {
+                typeid = zuixihuantushuleibieRecord.getStr("typeid");
+                Record typeinfoRecord = Db.findFirst("select * from t_booktype where id = ?", typeid);
+                record.set("zuixihuantushuleibie", CommonUtils.isNotNullOrNotEmpty(typeinfoRecord.get("name")) ? typeinfoRecord.getStr("name") : "");
+
+                Record leibiejieyueliangRecord = Db.findFirst("select count(*) ct from t_book_detail d left join t_book b on d.bookid = b.id  where orgid = ? and typeid = ?", orgid, typeid);
+                record.set("leibiejieyueliang", leibiejieyueliangRecord.getInt("ct"));
+            } else {
+                record.set("zuixihuantushuleibie", "");
+                record.set("leibiejieyueliang", 0);
+            }
+            reList.add(record);
+        }
+
+        if (schoolcategoryid == 2 || schoolcategoryid == 5 || schoolcategoryid == 6) {
+            record = new Record();
+            record.set("gradename", "初中");
+            Record zongjieyueRecord = Db.findFirst("select count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (7,8,9)", orgid,  startmonth,endmonth);
+            int zongjieyue = zongjieyueRecord.getInt("ct");
+            record.set("zongjieyue", zongjieyue);
+            if (zongjieyue == 0) {
+                record.set("pinjunjieyue", "0");
+                record.set("pinjunjieyue", "0");
+                sortList.add(0d);
+            } else {
+                Record readerRecord = Db.findFirst("select count(*) ct from t_reader r left join t_org_dept od on r.orgdeptid = od.id where r.orgid = ? and od.grade in (7,8,9)", orgid);
+                DecimalFormat df = new DecimalFormat("0.00");
+                String pinjunjieyue = df.format((float) zongjieyue / readerRecord.getInt("ct"));
+                record.set("pinjunjieyue", pinjunjieyue);
+                sortList.add((double) zongjieyue / readerRecord.getInt("ct"));
+                map.put((double) zongjieyue / readerRecord.getInt("ct"),record.getStr("gradename"));
+            }
+            Record zuixihuantushuleibieRecord = Db.findFirst("select typeid from (\n" +
+                    "select b.typeid,count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id left join t_book_detail d on j.bookdetailid = d.id \n" +
+                    "left join t_book b on d.bookid = b.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (7,8,9)\n" +
+                    "group by b.typeid  \n" +
+                    ") t order by ct desc", orgid,  startmonth,endmonth);
+            if (CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord) && CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord.get("typeid"))) {
+                typeid = zuixihuantushuleibieRecord.getStr("typeid");
+                Record typeinfoRecord = Db.findFirst("select * from t_booktype where id = ?", typeid);
+                record.set("zuixihuantushuleibie", CommonUtils.isNotNullOrNotEmpty(typeinfoRecord.get("name")) ? typeinfoRecord.getStr("name") : "");
+
+                Record leibiejieyueliangRecord = Db.findFirst("select count(*) ct from t_book_detail d left join t_book b on d.bookid = b.id  where orgid = ? and typeid = ?", orgid, typeid);
+                record.set("leibiejieyueliang", leibiejieyueliangRecord.getInt("ct"));
+            } else {
+                record.set("zuixihuantushuleibie", "");
+                record.set("leibiejieyueliang", 0);
+            }
+            reList.add(record);
+        }
+
+        if (schoolcategoryid == 4 || schoolcategoryid == 5 || schoolcategoryid == 6) {
+            record = new Record();
+            record.set("gradename", "高中");
+            Record zongjieyueRecord = Db.findFirst("select count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (10,11,12)", orgid,  startmonth,endmonth);
+            int zongjieyue = zongjieyueRecord.getInt("ct");
+            record.set("zongjieyue", zongjieyue);
+            if (zongjieyue == 0) {
+                record.set("pinjunjieyue", "0");
+                record.set("pinjunjieyue", "0");
+                sortList.add(0d);
+            } else {
+                Record readerRecord = Db.findFirst("select count(*) ct from t_reader r left join t_org_dept od on r.orgdeptid = od.id where r.orgid = ? and od.grade in (10,11,12)", orgid);
+                DecimalFormat df = new DecimalFormat("0.00");
+                String pinjunjieyue = df.format((float) zongjieyue / readerRecord.getInt("ct"));
+                record.set("pinjunjieyue", pinjunjieyue);
+                sortList.add((double) zongjieyue / readerRecord.getInt("ct"));
+                map.put((double) zongjieyue / readerRecord.getInt("ct"),record.getStr("gradename"));
+            }
+            Record zuixihuantushuleibieRecord = Db.findFirst("select typeid from (\n" +
+                    "select b.typeid,count(*) ct from t_jieyue j left join t_reader r on j.readerid = r.id left join t_org_dept od on r.orgdeptid = od.id left join t_book_detail d on j.bookdetailid = d.id \n" +
+                    "left join t_book b on d.bookid = b.id where j.orgid = ? and j.createtime >=? and j.createtime <=? and od.grade in (10,11,12)\n" +
+                    "group by b.typeid  \n" +
+                    ") t order by ct desc", orgid,  startmonth,endmonth);
+            if (CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord) && CommonUtils.isNotNullOrNotEmpty(zuixihuantushuleibieRecord.get("typeid"))) {
+                typeid = zuixihuantushuleibieRecord.getStr("typeid");
+                Record typeinfoRecord = Db.findFirst("select * from t_booktype where id = ?", typeid);
+                record.set("zuixihuantushuleibie", CommonUtils.isNotNullOrNotEmpty(typeinfoRecord.get("name")) ? typeinfoRecord.getStr("name") : "");
+
+                Record leibiejieyueliangRecord = Db.findFirst("select count(*) ct from t_book_detail d left join t_book b on d.bookid = b.id  where orgid = ? and typeid = ?", orgid, typeid);
+                record.set("leibiejieyueliang", leibiejieyueliangRecord.getInt("ct"));
+            } else {
+                record.set("zuixihuantushuleibie", "");
+                record.set("leibiejieyueliang", 0);
+            }
+            reList.add(record);
+        }
+        Map reMap = new HashMap();
+        reMap.put("datalist",reList);
+        String reinfo = "";
+        if(schoolcategoryid != 2 && schoolcategoryid != 4 && sortList.get(sortList.size()-1).compareTo(sortList.get(0)) != 0){
+            Collections.sort(sortList);
+            reinfo = "* "+map.get(sortList.get(sortList.size()-1))+"同学读书热情最高,"+map.get(sortList.get(0))+"同学读书热情有待提高";
+        }
+        reMap.put("reinfo",reinfo);
+
+        success(reMap);
+    }
+}

File diff suppressed because it is too large
+ 610 - 0
src/main/java/com/controller/api/SycController.java


+ 108 - 0
src/main/java/com/controller/intelligentdevice/ReadingWorksController.java

@@ -0,0 +1,108 @@
+package com.controller.intelligentdevice;
+
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.service.intelligentdevice.EquipmentService;
+import com.service.intelligentdevice.ReadingWorksService;
+import com.tools.JwtUtils;
+
+import java.util.List;
+import java.util.Map;
+
+@ControllerInterface(path="/readingWorks")
+public class ReadingWorksController extends BaseController {
+    ReadingWorksService service = ReadingWorksService.me;
+    public void index() {
+        render("/view/intelligentdevice/readingWorksList.html");
+    }
+
+    public void findReadingWorksList(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        int orgid = this.getParaToInt("orgid",0);
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        Integer equipmentid = getParaToInt("equipmentid");
+        String readerName = getPara("readerName");
+        String title = getPara("title");
+        String starttime = getPara("starttime");
+        String endtime = getPara("endtime");
+        Page page = service.findReadingWorksList(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),equipmentid,orgid,readerName,title,starttime,endtime);
+        List<Record> list = page.getList();
+        for(Record record : list) {
+            record.set("serverFileName",PropKit.get("readignroombaseurl")+record.get("serverFileName"));
+        }
+        success(page);
+    }
+
+
+    public void report(){
+        render("/view/intelligentdevice/readingReport.html");
+    }
+
+    public void biokey(){
+        render("/view/intelligentdevice/biokey.html");
+    }
+
+    public void readingbookTop20 (){
+        Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+        if(info == null){
+            fail_token();
+            return;
+        }
+        int orgid = (int)info.get("orgid");
+        String begindate =getPara("begindate");
+        String enddate =getPara("enddate")+" 23:59:59";
+
+        success(service.readingbookTop20(begindate,enddate,orgid));
+    }
+
+    public void readingreaderTop20 (){
+        Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+        if(info == null){
+            fail_token();
+            return;
+        }
+        int orgid = (int)info.get("orgid");
+        String begindate =getPara("begindate");
+        String enddate =getPara("enddate")+" 23:59:59";
+        success(service.readingreaderTop20(begindate,enddate,orgid));
+    }
+
+    public void readingresourceTop20 (){
+        Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+        if(info == null){
+            fail_token();
+            return;
+        }
+        int orgid = (int)info.get("orgid");
+        String begindate =getPara("begindate");
+        String enddate =getPara("enddate") +" 23:59:59";
+
+        success(service.readingresourceTop20(begindate,enddate,orgid));
+    }
+
+    public void readingReprotData (){
+        Map info = JwtUtils.validateJWTForMap(this.getPara("token"));
+        if(info == null){
+            fail_token();
+            return;
+        }
+        int orgid = (int)info.get("orgid");
+        String begindate =getPara("begindate");
+        String enddate =getPara("enddate")+" 23:59:59";
+
+        success(service.readingReprotData(begindate,enddate,orgid));
+    }
+
+}

+ 46 - 0
src/main/java/com/controller/librarycatalog/LibraryCatalogController.java

@@ -0,0 +1,46 @@
+package com.controller.librarycatalog;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.Book;
+import com.service.BookService;
+import com.utils.CommonUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@ControllerInterface(path="/libraryCatalog")
+public class LibraryCatalogController extends BaseController {
+
+    BookService service = BookService.me;
+
+    /**
+     * 馆藏查询接口
+     */
+    public void findBookList(){
+        Book bean = getBean(Book.class,"");
+        success(service.paginate(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize"),this.getParaToInt("pageSize",PAGESIZE),null,bean,  "1","",null,null));
+    }
+
+    /**
+     * 查询详情接口
+     */
+    public void findBookDetailList(){
+        if(CommonUtils.isNullOrEmpty(getPara("orgid")) || CommonUtils.isNullOrEmpty(getPara("bookid"))) {
+            fail(1,"参数不能为空");
+            return;
+        }
+        int orgid = getParaToInt("orgid");
+        int bookid = getParaToInt("bookid");
+        Record record = Db.findFirst("select title,author,publisher,publishdate from t_book where id = ? and orgid = ?",bookid,orgid);
+        List list = Db.find("select barcode,l.library,status from t_book_detail d left join t_library l on d.libraryid = l.id where bookid = ?",bookid);
+        Map map = new HashMap();
+        map.put("bookinfo",record);
+        map.put("bookDetailList",list);
+        success(map);
+    }
+}

+ 215 - 0
src/main/java/com/controller/log/LogController.java

@@ -0,0 +1,215 @@
+package com.controller.log;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.enums.SortEnum;
+import com.exception.NitifyException;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.Log;
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName LogController
+ * @Description 日志管理控制器
+ * @Author zhangyanwei
+ * @Date 2020/11/24 15:36
+ * @Version 1.0
+ **/
+@ControllerInterface(path="/log")
+public class LogController extends BaseController {
+    Log log = new Log().dao();
+    public void index(){
+        render("/log/list.html");
+    }
+    public void  list() throws NitifyException {
+        try {
+            int type = getParaToInt("type", 0);
+            String oper = getPara("oper");
+            String create_name = getPara("create_name");
+            String lever = getPara("lever");
+            String startTime = getPara("startTime");
+            String sort = getPara("sort");
+            int limit = getParaToInt("limit");
+            int pageNum = getParaToInt("page");
+
+            List values = new ArrayList();
+            String select = "select t1.ip,t1.log_no,t1.description,t1.oper,t1.start_time,t1.req_status, t1.id,t2.lever,t1.create_name ,t1.type ";
+            StringBuilder sb = new StringBuilder(" from log t1 left join t_log_dict t2  on t1.req_path  = t2.method_path where 1=1");
+            if (type > 0) {
+                sb.append(" and t1.type=?");
+                values.add(type);
+            } else {
+                sb.append(" and t1.type=?");
+                values.add(1);
+            }
+
+            if (startTime != null && !startTime.equals("")) {
+                String[] times = startTime.split(" - ");
+                sb.append(" and t1.start_time >= ?  and  t1.start_time <= ?");
+                values.add(times[0] + " 00:00");
+                values.add(times[1] + " 23:59");
+            }
+            if (oper != null && !oper.equals("")) {
+                if(oper.length()>10){
+                    fail(1,"请求参数不合法!");
+                    return;
+                }
+                sb.append(" and t1.oper=?");
+                values.add(oper);
+            }
+            if (lever != null && !lever.equals("")) {
+                sb.append(" and t2.lever=?");
+                values.add(lever);
+            }
+
+
+            if (StringUtils.isNotBlank(create_name) && !create_name.equals("")) {
+                sb.append(" and t1.create_name like ? ");
+                values.add("%" + create_name + "%");
+            }
+
+            if (sort != null && !create_name.equals("")) {
+                sb.append(" order by " + SortEnum.getCodeByName(sort));
+            } else {
+                sb.append(" order by  t1.id desc ");
+            }
+            System.out.println("日志审计SQL" + select + sb.toString());
+            Page<Record> page = Db.paginate(pageNum, limit,
+                    select, sb.toString(), listToArray(values));
+
+            success(page);
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new NitifyException(500,"参数错误");
+        }
+    }
+
+    /**
+     * 日志统计
+     */
+    public void  sindex(){
+        render("/log/log_statistics.html");
+    }
+    public void statistics() throws Exception{
+        Page<Record> page = new Page<>();
+        try {
+
+
+            String create_name = getPara("create_name");
+            String oper = getPara("oper");
+            String startTime = getPara("startTime");
+
+            String toTime="";
+            String condition ="";
+            List<Object> args=new ArrayList<>();
+            if (startTime != null && !"".equals(startTime)) {
+
+                String[] times = startTime.split(" - ");
+                if(Integer.valueOf(times[0].split("-")[0]) > 2021 && Integer.valueOf(times[0].split("-")[0]) < 1970 && Integer.valueOf(times[1].split("-")[0]) > 2021&&Integer.valueOf(times[1].split("-")[0]) < 1970){
+                    throw new NitifyException(500,"参数错误");
+                }
+
+                if(Integer.valueOf(times[0].split("-")[1]) > 12 && Integer.valueOf(times[0].split("-")[1]) <1 && Integer.valueOf(times[1].split("-")[1]) > 12&&Integer.valueOf(times[1].split("-")[1]) < 1){
+                    throw new NitifyException(500,"参数错误");
+                }
+                condition += " between ?  and ?";
+                args.add(times[0]+ " 00:00");
+                args.add(times[1] + " 23:59");
+                args.add(times[0] + " 00:00");
+                args.add(times[1] + " 23:59");
+                toTime = "CONCAT('" + times[0] + "',' -- ','" + times[1] + "')";
+
+            } else {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                condition += " between ?  and ?";
+                args.add(sdf.format(new Date()) + " 00:00");
+                args.add(sdf.format(new Date()) + " 23:59");
+                args.add(sdf.format(new Date()) + " 00:00");
+                args.add(sdf.format(new Date()) + " 23:59");
+                toTime = "CONCAT('" + sdf.format(new Date()) + "',' -- ','" + sdf.format(new Date()) + "')";
+            }
+
+            //操作
+
+
+            if (oper != null && !"".equals(oper)) {
+                if(oper.length()>10){
+                    fail(1,"请求参数不合法!");
+                    return;
+                }
+                oper = " and oper ='" +oper+ "'";
+            }else{
+                oper = "";
+            }
+
+            if (create_name != null && !"".equals(create_name)) {
+                create_name = " and create_name like '%" + create_name + "%'";
+
+            }else{
+                create_name ="";
+            }
+            String sql = " from (select " + toTime + " as toTime, tb3.oper,tb3.successCount,0 as failCount  from (select oper,ifnull(count(1),0) successCount from 	(select * from log where 1=1 and  start_time " + condition + oper + create_name + " and req_status=200  ) tb2 GROUP BY tb2.oper) tb3 " +
+
+                         " union all " +
+
+                         " select " + toTime + " as toTime, tb4.oper,0 as successCount,ifnull(tb4.failCount,0)failCount  from (select oper,ifnull(count(1),0) failCount from 	(select * from log where 1=1 and  start_time  " + condition + oper + create_name + " and req_status=500  ) tb2 GROUP BY tb2.oper) tb4 )temp ";
+
+            //日志统计
+            System.out.println("日志统计 --> 时间查询" + sql);
+            page = Db.paginate(1,10,
+                    "select  * ",sql,listToArray(args));
+            success(page);
+        }catch (Exception e){
+            throw new NitifyException(500,"参数错误");
+        }
+
+    }
+
+
+    /**
+     * 日志备份
+     */
+    public void logBak() {
+        Db.update("truncate log_bak");
+        int status = 0;
+        status = Db.update("replace into log_bak(select * from log)");
+        success();
+    }
+
+    // 日志恢复
+
+    public void restoreLog() {
+        int status = 0;
+        status = Db.update( "replace into log(select * from log_bak where date(start_time)<date(date_sub(now(),INTERVAL 6 MONTH)))");
+        success();
+    }
+
+    /**
+     * 日志配置
+     */
+
+    public void  cindex(){
+        render("/log/log_config.html");
+    }
+    public void config() {
+        int file_size =  getParaToInt("file_size");
+        int count = Db.update( "update message_config set file_size = "+file_size);
+        success();
+    }
+
+    /**
+     * 日志配置查看详情
+     */
+
+    public void detail() {
+         Record record = Db.findFirst("select file_size from message_config limit 1");
+         success(record);
+    }
+}

+ 40 - 0
src/main/java/com/controller/report/CancellationStatisticsController.java

@@ -0,0 +1,40 @@
+package com.controller.report;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.service.report.CancellationStatisticsService;
+
+@ControllerInterface(path="/cancellationStatistics")
+public class CancellationStatisticsController extends BaseController {
+    CancellationStatisticsService service = CancellationStatisticsService.me;
+
+    public void bookCancellationStatistics() {
+
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String kssj = this.getPara("kssj");
+        String jssj = this.getPara("jssj");
+        String reason = this.getPara("reason");
+        success(service.bookCancellationStatistics(orgid,kssj,jssj,reason));
+    }
+
+    /*
+    柱状图
+    * */
+    public void bookCancellationStatistics_z() {
+
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String kssj = this.getPara("kssj");
+        String jssj = this.getPara("jssj");
+        String reason = this.getPara("reason");
+        success(service.bookCancellationStatistics_z(orgid,kssj,jssj,reason));
+    }
+}

+ 87 - 0
src/main/java/com/controller/report/CirculationStatisticsController.java

@@ -0,0 +1,87 @@
+package com.controller.report;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Page;
+import com.service.report.CirculationStatisticsService;
+
+/**
+ * 图书流通统计
+ */
+@ControllerInterface(path="/circulationStatistics")
+public class CirculationStatisticsController extends BaseController {
+    CirculationStatisticsService service = CirculationStatisticsService.me;
+
+    /**
+     * 图书借阅排行
+     */
+    public void bookLendingRanking() {
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String kssj = this.getPara("kssj");
+        String jssj = this.getPara("jssj");
+        Integer topnum = this.getParaToInt("topnum");
+        success(service.bookLendingRanking(this.getParaToInt("pageNumber",1),this.getParaToInt("pageSize",10),orgid,kssj,jssj,topnum));
+    }
+
+    /**
+     * 图书分类借阅排行
+     */
+    public void bookTypeLendingRanking() {
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String kssj = this.getPara("kssj");
+        String jssj = this.getPara("jssj");
+        success(service.bookTypeLendingRanking(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize",10),orgid,kssj,jssj));
+    }
+
+    /**
+     * 读者借阅排行
+     */
+    public void readerLendingRanking() {
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String kssj = this.getPara("kssj");
+        String jssj = this.getPara("jssj");
+        Integer topnum = this.getParaToInt("topnum");
+        Integer dept = this.getParaToInt("dept");
+        Integer readerType = this.getParaToInt("readerType");
+        success(service.readerLendingRanking(this.getParaToInt("pageNumber",1),this.getParaToInt("pageSize",10),orgid,kssj,jssj,topnum,dept,readerType));
+    }
+    /**
+     * 部门借阅排行
+     */
+    public void deptLendingRanking() {
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String kssj = this.getPara("kssj");
+        String jssj = this.getPara("jssj");
+        success(service.deptLendingRanking(this.getParaToInt("pageNumber"),this.getParaToInt("pageSize",10),orgid,kssj,jssj));
+    }
+    /**
+     * 部门人均借阅排行
+     */
+    public void deptPercapitaLendingRanking() {
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        String kssj = this.getPara("kssj");
+        String jssj = this.getPara("jssj");
+        success(service.deptPercapitaLendingRanking(orgid,kssj,jssj));
+    }
+}

+ 60 - 0
src/main/java/com/controller/report/ClassificationStatisticsController.java

@@ -0,0 +1,60 @@
+package com.controller.report;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.service.report.CancellationStatisticsService;
+import com.service.report.ClassificationStatisticsService;
+
+@ControllerInterface(path="/classificationStatistics")
+public class ClassificationStatisticsController extends BaseController {
+    ClassificationStatisticsService service = ClassificationStatisticsService.me;
+
+    /**
+     * 22大类
+     */
+    public void bookClassificationStatistics() {
+
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.bookClassificationStatistics(orgid));
+    }
+
+    public void bookClassificationStatistics_z() {
+
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.bookClassificationStatistics_z(orgid));
+    }
+    /**
+     * 合计
+     */
+    public void bookTotalClassificationStatistics() {
+
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.bookTotalClassificationStatistics(orgid));
+    }
+    /**
+     * 五大类
+     */
+    public void bookFiveClassificationStatistics() {
+
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.bookFiveClassificationStatistics(orgid));
+    }
+
+}

+ 43 - 0
src/main/java/com/controller/report/ComprehensiveStatisticsController.java

@@ -0,0 +1,43 @@
+package com.controller.report;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.service.report.CancellationStatisticsService;
+import com.service.report.ComprehensiveStatisticsService;
+
+@ControllerInterface(path="/comprehensiveStatistics")
+public class ComprehensiveStatisticsController extends BaseController {
+    ComprehensiveStatisticsService service = ComprehensiveStatisticsService.me;
+
+    /**
+     * 基本统计
+     */
+    public void basicStatistics() {
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.basicStatistics(orgid));
+    }
+    public void briefingToday() {
+        int orgid = this.getParaToInt("orgid");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.briefingToday(orgid));
+    }
+    public void circulationStatistics() {
+        int orgid = this.getParaToInt("orgid");
+        String kssj = this.getPara("kssj");
+        String jssj = this.getPara("jssj");
+        if(orgid == 0) {
+            fail(1,"请求参数不完整!");
+            return;
+        }
+        success(service.circulationStatistics(orgid,kssj,jssj));
+    }
+
+}

+ 96 - 0
src/main/java/com/controller/school/LiutongController.java

@@ -0,0 +1,96 @@
+package com.controller.school;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Page;
+import com.jfinal.plugin.activerecord.Record;
+import com.utils.CommonUtils;
+import com.utils.DateUtils;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+@ControllerInterface(path="/liutong")
+public class LiutongController extends BaseController {
+    @Clear
+    public void index(){
+        render("/schoolweb/jieyuepaihang.html");
+    }
+
+    public void teachliutongPage(){
+        render("/view/query-stats/liutongList.html");
+    }
+
+    @Clear
+    public void getpaihanglist(){
+        try{
+            int paihang = PropKit.getInt("paihang");
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.MONTH, -12);
+            String begindate = getPara("begindate", DateUtils.getSimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()));
+            String enddate = getPara("enddate", DateUtils.getSimpleDateFormat("yyyy-MM-dd").format(new Date()));
+
+            String select = "SELECT a.orgid,d.orgname,COUNT(a.id) AS NUM,IFNULL(round(COUNT(a.id)/d.students),0) as shenjun FROM t_jieyue a INNER JOIN t_book_detail b ON a.bookdetailid=b.id \n" +
+                    "INNER JOIN t_book c ON b.bookid =c.id \n" +
+                    "INNER JOIN t_org d  ON a.orgid=d.id \n" +
+                    "WHERE b.status !=3 AND  b.bookstatus = 1  AND d.orgtypeid=5  and  a.createtime>=? and a.createtime <=? \n" +
+                    "GROUP BY a.orgid,d.orgname\n" +
+                    "ORDER BY NUM DESC LIMIT "+paihang;
+            List<Record> back = Db.find(select,begindate,enddate);
+            for(Record r :back){
+                Record test = Db.findFirst("select round("+r.getStr("NUM")+"/COUNT(b.id)*100,2) as jyl from t_book a INNER JOIN t_book_detail b on b.bookid = a.id where b.status !=3 AND  b.bookstatus = 1 and a.orgid='"+r.getStr("orgid")+"'");
+                r.set("jyl",test.getStr("jyl"));
+            }
+            success(back);
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    public void getliutonglist(){
+        try{
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.MONTH, -12);
+            String begindate = getPara("begindate", DateUtils.getSimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()));
+            String enddate = getPara("enddate", DateUtils.getSimpleDateFormat("yyyy-MM-dd").format(new Date()));
+            int orgid = this.getParaToInt("orgid",0);
+            if(orgid == 0) {
+                fail(1,"请求参数不完整!");
+                return;
+            }
+
+            String select = "SELECT * ";
+            StringBuffer where = new StringBuffer(" from (SELECT a.orgid,d.orgname,COUNT(a.id) AS NUM,IFNULL(round(COUNT(a.id)/d.students),0) as shenjun \n"+
+                    "FROM t_jieyue a INNER JOIN t_book_detail b ON a.bookdetailid=b.id\n" +
+                    "INNER JOIN t_book c ON b.bookid =c.id \n" +
+                    "INNER JOIN t_org d  ON a.orgid=d.id \n" +
+                    "WHERE b.status !=3 AND  b.bookstatus = 1  AND d.orgtypeid=5 and d.parentcodes like ? \n");
+            List wherelist = new ArrayList();
+            wherelist.add("%"+orgid+"%");
+            if(CommonUtils.isNotNullOrNotEmpty(begindate)){
+                where.append(" and a.createtime> ? \n");wherelist.add(begindate);
+            }
+
+            if(CommonUtils.isNotNullOrNotEmpty(enddate)){
+                where.append(" and a.createtime<= ? \n");wherelist.add(enddate+" 23:59:59");
+            }
+            where.append(" GROUP BY a.orgid,d.orgname order by NUM desc) as temp");
+            Page backpage = Db.paginate(this.getParaToInt("pageNumber",1), this.getParaToInt("pageSize",10),select, where.toString(),CommonUtils.listToArray(wherelist));
+            List<Record> back = backpage.getList();
+            for(Record r :back){
+                Record test = Db.findFirst("select round("+r.getStr("NUM")+"/COUNT(b.id)*100,2) as jyl from t_book a INNER JOIN t_book_detail b on b.bookid = a.id where b.status !=3 AND  b.bookstatus = 1 and a.orgid='"+r.getStr("orgid")+"'");
+                r.set("jyl",test.getStr("jyl")+"%");
+            }
+            success(backpage);
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+}

+ 20 - 0
src/main/java/com/controller/school/SchoolIndexController.java

@@ -0,0 +1,20 @@
+package com.controller.school;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.kit.PropKit;
+
+@ControllerInterface(path="/schoolindex")
+public class SchoolIndexController extends BaseController {
+    public void index(){
+        //String filename = PropKit.use("banben.txt").get("banben");
+        render(BASEVIEWDIR + "index.html");
+    }
+
+    @Clear
+    public void getbiaoti(){
+        String test = PropKit.get("JGName");
+        success(test);
+    }
+}

+ 14 - 0
src/main/java/com/controller/school/SchoolReportController.java

@@ -0,0 +1,14 @@
+package com.controller.school;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+
+@ControllerInterface(path="/school/report")
+public class SchoolReportController extends BaseController {
+    public void zonghezhibiaotongji(){
+        render(BASEVIEWDIR+"report/zonghezhibiaotongji.html");
+    }
+    public void zonghezhibiaotongji_data(){
+
+    }
+}

+ 502 - 0
src/main/java/com/controller/school/SynchronizationSchoolInfoController.java

@@ -0,0 +1,502 @@
+package com.controller.school;
+
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.*;
+import com.service.*;
+import com.tools.ISBNTools;
+import com.utils.CommonUtils;
+import com.utils.ExcelUtil;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 该类用于平时同步单独的学校提供的各种数据到系统里面
+ * 学校数据转换
+ */
+@ControllerInterface(path="/synschoolinfo")
+public class SynchronizationSchoolInfoController extends BaseController {
+
+    OrgDeptService orgDeptService = OrgDeptService.me;
+    ReaderAuthService readerAuthService= ReaderAuthService.me;
+    BookService bookService = BookService.me;
+    BookPiciService bookpiciService = BookPiciService.me;
+    LibraryService libraryService = LibraryService.me;
+    SysConfigService sysConfigService = SysConfigService.me;
+
+    @Clear
+    public void updateFile(){
+        int orgid = 121236;
+        File root = new File("d://121236");
+        File[] files = root.listFiles();
+        for(File file:files){
+            String filenamestr = file.getName();
+            System.err.println(filenamestr.indexOf("."));
+            String filename = filenamestr.substring(0,filenamestr.indexOf("."));
+            String str[] = filename.split("_");
+            if(str.length!=3){
+                System.err.println("文件名称错误");
+                continue;
+            }
+            String newfilename = str[2]+"_"+str[1]+filenamestr.substring(filenamestr.indexOf("."));
+            File newfile=new File(file.getParent()+File.separator+newfilename);
+            if(file.renameTo(newfile)) {
+                System.out.println("重命名成功!");
+            }else {
+                System.out.println("重命名失败!新文件名已存在");
+            }
+
+            Record record = Db.findFirst("select * from t_org_dept where orgid = ? and deptname = ?",orgid,str[1]);
+            if(CommonUtils.isNullOrEmpty(record)){
+                Record newRecord = new Record();
+                newRecord.set("deptname",str[1]);
+                newRecord.set("orgid",orgid);
+                newRecord.set("readerauthid",0); //机构暂无默认权限
+                newRecord.set("createtime",new Date());
+                newRecord.set("operatorid",0);
+                Db.save("t_org_dept", newRecord);
+                System.err.println("创建班级成功 班级名称:"+str[1]);
+            }
+        }
+        success();
+    }
+
+    /**
+     * 湖南省株洲县第五中学数据同步 读者信息同步
+     */
+    @Clear
+    public void zhuzhoudiwu_readerinfo(){
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        String filename = getPara("filename");
+        if(CommonUtils.isNullOrEmpty(filename)){
+            fail(0,"filename不能为空");
+            return;
+        }
+//        List<OrgDept> orgDeptList=orgDeptService.findOrgDept(orgid);
+        Map<String,Integer> readerAuthMap=readerAuthService.findReaderAuthByName(orgid);
+
+        try {
+            logger.info("开始同步 湖南省株洲县第五中学 读者信息 ");
+            // 读取文件的输入流
+            InputStream fis = new FileInputStream(getRequest().getServletContext().getRealPath("upload")+"/"+filename);
+//            InputStream fis = new FileInputStream("d://" + filename);
+            List<Map<String,String>> list = ExcelUtil.readExcel(fis);
+
+            for(Map<String,String> map : list){
+                try{
+                    long starttime = Calendar.getInstance().getTimeInMillis();
+                    Reader reader = new Reader();
+                    reader.setOrgid(orgid);
+                    Record deptRecord = Db.findFirst("select id from t_org_dept where orgid = ? and deptname = ?",orgid,map.get("班级").trim());
+                    if (CommonUtils.isNullOrEmpty(deptRecord)){
+                        OrgDept orgDept = new OrgDept();
+                        orgDept.setDeptname(map.get("班级").trim()).setOrgid(orgid).save();
+                        reader.setOrgdeptid(orgDept.getId());
+                    } else {
+                        reader.setOrgdeptid(deptRecord.getInt("id"));
+                    }
+                    String cardnumber = map.get("编码").trim().replace("*","");
+                    reader.setCardnumber(cardnumber);
+                    reader.setRealname(map.get("姓名").trim());
+                    reader.setPassword("123456");
+                    reader.setReadcardcode(cardnumber);
+                    reader.setSex(map.get("性别").trim());
+                    reader.setReaderauthid(readerAuthMap.get(map.get("读者类型").trim()));
+                    if(reader.getReaderauthid() ==null){
+                        logger.info(orgid+" 权限名称:"+map.get("读者类型").trim()+" 未导入原因:借阅权限不正确!");
+                        continue;
+                    }
+                    reader.setOverdue(0);
+                    reader.setMemo(cardnumber);
+                    if(map.get("读者类型").trim().equals("教师")){
+                        reader.setReaderauthid(625);
+                    } else {
+                        reader.setReaderauthid(626);
+                    }
+                    reader.setReadertypeid(62);
+                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(simpleDateFormat.parse(map.get("办证日期")));
+                    reader.setCreatetime(calendar.getTime());
+                    calendar.add(Calendar.YEAR,3);
+                    reader.setLosedate(calendar.getTime());
+                    if(map.get("读者类型").trim().equals("教师")){
+                        calendar.add(Calendar.YEAR,30);
+                        reader.setLosedate(calendar.getTime());
+                    }
+                    if(map.get("状态").trim().equals("正常")){
+                        reader.setStatus(1);
+                    } else {
+                        reader.setStatus(2);
+                    }
+                    reader.setMemo(map.toString());
+                    reader.save();
+
+                    long endtime = Calendar.getInstance().getTimeInMillis();
+                    long times = endtime- starttime;
+                    logger.info("同步读者数据中 该条数据总耗时:"+times);
+                }catch (Exception e){
+                    logger.info("读者转化异常 orgid:"+ orgid +" 读者证号:"+map.get("编码"));
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        success();
+    }
+
+    /**
+     * 湖南省株洲县第五中学数据同步 书籍信息同步
+     */
+    @Clear
+    public void zhuzhoudiwu_bookinfo(){
+        logger.info("开始同步 湖南省株洲县第五中学 书籍信息 ");
+        Integer orgid = getParaToInt("orgid",0);
+        if(orgid == 0){
+            fail(0,"orgid不能为空");
+            return;
+        }
+        Record orgRecord = Db.findById("t_org",orgid);
+        if(CommonUtils.isNullOrEmpty(orgRecord)){
+            fail(0,"查询不到机构信息");
+            return;
+        }
+        String filename = getPara("filename");
+        if(CommonUtils.isNullOrEmpty(filename)){
+            fail(0,"filename不能为空");
+            return;
+        }
+
+        OrgSetting orgSetting = sysConfigService.findOrgSetting(orgid);
+        if(null == orgSetting) {
+            fail(1,"数据异常!");
+            return;
+        }
+        Record userRecord = Db.findFirst("select * from t_user where isadmin = 1 and orgid = ?",orgid);
+        int operatorid = userRecord.getInt("id");
+        try {
+            InputStream fis = new FileInputStream(getRequest().getServletContext().getRealPath("upload")+"/"+filename);
+            long starttime = Calendar.getInstance().getTimeInMillis();
+            List<Map<String,String>> bookList= ExcelUtil.readExcel(fis);
+            long endtime = Calendar.getInstance().getTimeInMillis();
+            long times = endtime- starttime;
+            logger.info("读取文件总耗时:"+times);
+            logger.info("书籍总数量:"+bookList.size());
+
+            Thread.sleep(5000);
+            for (Map<String,String> bookMap : bookList) {
+                try{
+                    StringBuffer bookno = new StringBuffer();
+                    Book book=new Book();
+                    book.setOrgid(orgid);
+                    String typecode= bookMap.get("分类号");
+                    if(CommonUtils.isNullOrEmpty(typecode)){
+                        typecode = "0";
+                    }
+                    book.setBooknum(0);
+                    book.setOperatorid(operatorid);
+                    book.setTypecode(typecode);
+                    bookno.append(typecode);
+                    book.setTypeid(typecode);//22大类ID
+                    //book.setTypecommonid()  //通俗分类id
+                    book.setShucihao(1);
+                    bookno.append("/").append(CommonUtils.isNotNullOrNotEmpty(bookMap.get("书次号"))?bookMap.get("书次号"):"0");
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("原始条形码"))){
+                        book.setIsbn(ISBNTools.fmtisbn(bookMap.get("原始条形码")));
+                    }
+                    book.setTitle(bookMap.get("书籍名称"));
+                    book.setPublisher(bookMap.get("出版社名"));
+                    book.setEdition(bookMap.get("书籍版次"));
+                    book.setAuthor(bookMap.get("作者信息"));
+                    book.setPublishdate(bookMap.get("出版日期"));
+                    book.setPublishaddress(bookMap.get("出版地点"));
+                    book.setMemo(bookMap.get("内容简介"));
+                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("入库时间"))){
+                        book.setCreatetime(simpleDateFormat.parse(bookMap.get("入库时间")));
+                    } else {
+                        book.setCreatetime(new Date());
+                    }
+                    book.setOperatorid(operatorid);
+
+                    if(CommonUtils.isNullOrEmpty(bookMap.get("书籍价格"))){
+                        try{
+                            book.setPrice(new BigDecimal(bookMap.get("书籍价格")));
+                        }catch (Exception e) {
+                            logger.info("书籍价格异常"+bookMap.get("书籍价格"));
+                        }
+                    }
+//                    book.setOperatorid(operatorid);
+                    BookPlus bookPlus = new BookPlus();
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("书籍页码"))) {
+                        try{
+                            bookPlus.setTotalpages(Integer.parseInt(bookMap.get("书籍页码")));
+                        }catch (Exception e) {
+                            logger.info("页数格式异常");
+                        }
+                    }
+                    int bindingid = 0;
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("装订形式"))){
+                        if(bookMap.get("装订形式").equals("平装")){
+                            bindingid = 45;
+                        } else if(bookMap.get("装订形式").equals("精装")){
+                            bindingid = 46;
+                        } else if(bookMap.get("装订形式").equals("套装")){
+                            bindingid = 47;
+                        }
+                    }
+                    if (bindingid != 0){
+                        bookPlus.setBindingid(bindingid);
+                    }
+
+                    book.setBookno(bookno.toString().toUpperCase());
+                    BookDetail bookDetail = new BookDetail();
+
+                    bookDetail.setLibraryid(1702);
+                    bookDetail.setPiciid(258);
+
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("入库时间"))){
+                        bookDetail.setShangjiatime(simpleDateFormat.parse(bookMap.get("入库时间")));
+                    }
+
+                    String barcode = bookMap.get("书籍条形码");
+                    int count = bookService.findByBarcode(orgid,barcode);
+                    if (count > 0) {
+                        barcode = "CF_"+barcode;
+                    }
+                    int check = 0;
+                    Book checkBook = bookService.findBookByBooknoTitle(book.getOrgid(),book.getBookno(),book.getTitle(),book.getIsbn(),book.getPublisher(),book.getAuthor());
+                    if(CommonUtils.isNotNullOrNotEmpty(checkBook)){
+                        book = checkBook;
+                        check = 1;
+                    }
+                    bookDetail.setBarcode(barcode);
+                    bookDetail.setBookstatus(1);
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("在馆状态")) && "在馆".equals(bookMap.get("在馆状态"))){
+                        bookDetail.setStatus(0);
+                    } else {
+                        bookDetail.setStatus(1);
+                    }
+                    bookDetail.setCreatetime(new Date());
+                    bookDetail.setOperatorid(operatorid);
+                    if(0 == check) {
+                        book.save();
+                        bookPlus.setBookid(book.getId());
+                        bookPlus.save();
+                    } else {
+                        book.update();
+                    }
+                    bookDetail.setBookid(book.getId());
+                    bookDetail.save();
+                    Db.update("update t_book set booknum = booknum +1 where id = ?",book.getId());
+                }catch (Exception e){
+                    e.printStackTrace();
+                    logger.info("导入失败");
+                }
+            }
+            success();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Clear
+    public void updateprice_zhuzhoudiwu(){
+        logger.info("开始同步 湖南省株洲县第五中学 书籍信息 ");
+        String filename = getPara("filename");
+        if(CommonUtils.isNullOrEmpty(filename)){
+            fail(0,"filename不能为空");
+            return;
+        }
+
+        try {
+            System.err.println(getRequest().getServletContext().getRealPath("upload"));
+            InputStream fis = new FileInputStream(getRequest().getServletContext().getRealPath("upload")+"/"+filename);
+            long starttime = Calendar.getInstance().getTimeInMillis();
+            List<Map<String,String>> bookList= ExcelUtil.readExcel(fis);
+            long endtime = Calendar.getInstance().getTimeInMillis();
+            long times = endtime- starttime;
+            logger.info("读取文件总耗时:"+times);
+            logger.info("书籍总数量:"+bookList.size());
+
+            for (Map<String,String> bookMap : bookList) {
+                try{
+                    logger.info(bookMap.toString());
+                    StringBuffer bookno = new StringBuffer();
+                    Book book=new Book();
+                    String typecode= bookMap.get("分类号");
+                    if(CommonUtils.isNullOrEmpty(typecode)){
+                        typecode = "0";
+                    }
+                    book.setBooknum(0);
+                    book.setTypecode(typecode);
+                    bookno.append(typecode);
+                    book.setTypeid(typecode);//22大类ID
+                    book.setShucihao(1);
+                    bookno.append("/").append(CommonUtils.isNotNullOrNotEmpty(bookMap.get("书次号"))?bookMap.get("书次号"):"0");
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("原始条形码"))){
+                        book.setIsbn(ISBNTools.fmtisbn(bookMap.get("原始条形码")));
+                    }
+                    book.setTitle(bookMap.get("书籍名称"));
+                    book.setPublisher(bookMap.get("出版社名"));
+                    book.setEdition(bookMap.get("书籍版次"));
+                    book.setAuthor(bookMap.get("作者信息"));
+                    book.setPublishdate(bookMap.get("出版日期"));
+                    book.setPublishaddress(bookMap.get("出版地点"));
+                    book.setMemo(bookMap.get("内容简介"));
+                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("入库时间"))){
+                        book.setCreatetime(simpleDateFormat.parse(bookMap.get("入库时间")));
+                    } else {
+                        book.setCreatetime(new Date());
+                    }
+
+                    if(CommonUtils.isNotNullOrNotEmpty(bookMap.get("书籍价格"))){
+                        try{
+                            book.setPrice(new BigDecimal(bookMap.get("书籍价格")));
+                        }catch (Exception e) {
+                            logger.info("书籍价格异常"+bookMap.get("书籍价格"));
+                        }
+                    }
+                    Record record = Db.findFirst("select * from t_book where orgid = 121258 and price is null and isbn = ? and publisher = ? and author = ? and publishdate = ?",CommonUtils.isNotNullOrNotEmpty(book.getIsbn())?book.getIsbn():null,CommonUtils.isNotNullOrNotEmpty(book.getPublisher())?book.getPublisher():"",CommonUtils.isNotNullOrNotEmpty(book.getAuthor())?book.getAuthor():"",CommonUtils.isNotNullOrNotEmpty(book.getPublishdate())?book.getPublishdate():"");
+                    if(CommonUtils.isNullOrEmpty(record)) {
+                        record = Db.findFirst("select * from t_book where orgid = 121258 and price is null and (title = ? or title = ?) and publisher = ? and author = ? and publishdate = ?",CommonUtils.isNotNullOrNotEmpty(book.getTitle())?book.getTitle():null,"",CommonUtils.isNotNullOrNotEmpty(book.getPublisher())?book.getPublisher():"",CommonUtils.isNotNullOrNotEmpty(book.getAuthor())?book.getAuthor():"",CommonUtils.isNotNullOrNotEmpty(book.getPublishdate())?book.getPublishdate():"");
+                    }
+                    if(CommonUtils.isNotNullOrNotEmpty(record)){
+                        Db.update("update t_book set price = ? where orgid = 121258 and id = ?",book.getPrice(),record.getInt("id"));
+                        logger.info("修改成功"+record.getInt("id"));
+                    } else {
+                        logger.info("查询不到数据 break");
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                    logger.info("导入失败");
+                }
+            }
+            success();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 湖南省株洲县第五中学数据同步 流通记录同步
+     */
+    @Clear
+    public void zhuzhoudiwu_liutonginfo() {
+        Integer orgid = getParaToInt("orgid", 0);
+        if (orgid == 0) {
+            fail(0, "orgid不能为空");
+            return;
+        }
+        Record orgRecord = Db.findById("t_org", orgid);
+        if (CommonUtils.isNullOrEmpty(orgRecord)) {
+            fail(0, "查询不到机构信息");
+            return;
+        }
+        String filename = getPara("filename");
+        if (CommonUtils.isNullOrEmpty(filename)) {
+            fail(0, "filename不能为空");
+            return;
+        }
+        Record userRecord = Db.findFirst("select * from t_user where isadmin = 1 and orgid = ?", orgid);
+        int operatorid = userRecord.getInt("id");
+        InputStream fis = null;
+        try {
+//            fis = new FileInputStream("d://" + filename);
+            fis = new FileInputStream(getRequest().getServletContext().getRealPath("upload")+"/"+filename);
+            logger.info("开始同步 湖南省株洲县第五中学 书籍信息 ");
+
+            long starttime = Calendar.getInstance().getTimeInMillis();
+            List<Map<String,String>> list= ExcelUtil.readExcel(fis);
+            long endtime = Calendar.getInstance().getTimeInMillis();
+            long times = endtime- starttime;
+            logger.info("读取文件总耗时:"+times);
+            logger.info("书籍总数量:"+list.size());
+            Thread.sleep(5000);
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+            for (Map<String, String> map : list) {
+                try{
+                    String cardnumber = map.get("读者编码").trim().replace("*","");
+                    String realname = map.get("读者姓名").trim().replace("*","");
+                    Record readerRecord = Db.findFirst("select id from t_reader where orgid = ? and realname = ? and cardnumber = ?",orgid,realname,cardnumber);
+                    int readerid = 1011;
+                    if(CommonUtils.isNotNullOrNotEmpty(readerRecord)){
+                        readerid = readerRecord.getInt("id");
+                    }
+
+                    String barcode = map.get("图书编码").trim();
+                    String bookname = map.get("图书名称").trim();
+                    String price = map.get("图书价格").trim();
+                    Record bookDetailRecord = Db.findFirst("select d.id from t_book_detail d left join t_book b on d.bookid = b.id where b.orgid = ? and d.barcode = ? and b.title = ?",orgid,barcode,bookname);
+                    int bookdetailid = 1011;
+                    if(CommonUtils.isNotNullOrNotEmpty(bookDetailRecord)){
+                        bookdetailid = bookDetailRecord.getInt("id");
+                    }
+//                    Record bookRecord = Db.findFirst("select id from t_book b where b.orgid = ? b.bookname = ? and price = ?",orgid,bookname,price);
+//                    int bookid = 1011;
+//                    if(CommonUtils.isNotNullOrNotEmpty(bookRecord)){
+//                        bookid = bookRecord.getInt("id");
+//                    }
+//                    Calendar calendar = Calendar.getInstance();
+                    Jieyue jieyue = new Jieyue();
+                    jieyue.setReaderid(readerid);
+                    jieyue.setOrgid(orgid);
+                    jieyue.setBookdetailid(bookdetailid);
+                    jieyue.setFlag(0);
+                    String sql = "update t_book_detail set jieyuenums = ifnull(jieyuenums,0)+1";
+                    if(CommonUtils.isNullOrEmpty(map.get("归还时间").trim())){
+                        jieyue.setStatus(0); //状态:0:借阅中,1:已归还 2:已丢失
+                        sql = sql + ",status = 1";
+                    } else {
+                        jieyue.setStatus(1); //状态:0:借阅中,1:已归还 2:已丢失
+                        jieyue.setReturntime(simpleDateFormat.parse(map.get("归还时间").trim()));
+                    }
+                    sql = sql + "  where id = ?";
+                    jieyue.setContinuenum(0);
+                    Date jieyueDate = simpleDateFormat.parse(map.get("借阅时间").trim());
+                    jieyue.setCreatetime(jieyueDate);
+                    Date duetime = simpleDateFormat.parse(map.get("应归还时间").trim());
+                    try {
+                        jieyue.setDuetime(sdf2.parse(sdf.format(duetime) + " 23:59:59"));
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                    }
+                    jieyue.setOperatorid(operatorid);
+                    Db.update(sql,bookdetailid);
+                    jieyue.save();
+                }catch (Exception e){
+                    e.printStackTrace();
+                    logger.info("导入失败");
+                }
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        success();
+    }
+}

+ 286 - 0
src/main/java/com/controller/screendisplay/ScreenHomeController.java

@@ -0,0 +1,286 @@
+package com.controller.screendisplay;
+
+import com.config.AuthInterceptor;
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.aop.Clear;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.service.screendisplay.ScreenHomeService;
+import com.utils.CommonUtils;
+
+import java.util.List;
+
+/**
+ * 大屏幕首页
+ * 2019-05-05
+ * chenworgTypeNumber
+ */
+@ControllerInterface(path="/screen")
+@Clear(AuthInterceptor.class)
+public class ScreenHomeController extends BaseController {
+    ScreenHomeService service = ScreenHomeService.me;
+
+    public void teach() {
+        render("/screen/teach.html");
+    }
+
+    public void school() {
+        render("/screen/school.html");
+    }
+
+    public void modular() {
+        render("/screen/modular.html");
+    }
+
+    /**
+     * 学校书刊数量展示
+     */
+    public void schoolHomeCount(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.schoolHomeCount(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 学校今日简报
+     */
+    public void schoolTodayReport(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.schoolTodayReport(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 学校新书、好书推荐
+     */
+    public void schoolBookRecommend(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            Integer flag = this.getParaToInt("flag",0);
+            success(service.schoolBookRecommend(orgid,flag));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 超期催还列表
+     */
+    public void overdueList(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.overdueList(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 图书借阅排行
+     */
+    public void borrowRank(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.borrowRank(orgid,this.getParaToInt("pageNumber"),this.getParaToInt("pageSize")));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 读者借阅排行
+     */
+    public void readerBorrowRank(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.readerBorrowRank(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 学校优秀集体
+     */
+    public void excellentDept(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.excellentDept(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 学校智能设备监控
+     */
+    public void schoolWisdomMonitor(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.schoolWisdomMonitor(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 教育局首页数量
+     */
+    public void orgHomeCount(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.orgHomeCount(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 教育局今日简报
+     */
+    public void orgTodayReport(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.orgTodayReport(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 优秀读者
+     */
+    public void excellentReaders(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.excellentReaders(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 教育局图书借阅排行
+     */
+    public void orgBorrowRank(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.orgBorrowRank(orgid,this.getParaToInt("pageNumber"),this.getParaToInt("pageSize")));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 教育局流通排行
+     */
+    public void circulateRank(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.circulateRank(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 教育局智能设备排行
+     */
+    public void orgWisdomRank(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.orgWisdomRank(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 教育局分类数量统计
+     */
+    public void orgTypeNumber(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            success(service.orgTypeNumber(orgid));
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 查询机构展示的模块列表
+     */
+    public void showModular(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            List<Record> list = Db.find("select div_id divId from t_modular_org o,t_screen_modular m where o.modular_id = m.id and o.org_id = ?",orgid);
+            success(list);
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * 查询模块列表
+     */
+    public void findModulars(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            Record org = Db.findFirst("select orgtypeid from t_org o where o.id = ?",orgid);
+            //查询教育局
+            Integer type = 1;
+            if (5 == org.getInt("orgtypeid")){
+                //查询学校
+                type = 2;
+            }
+            List<Record> list = Db.find("select m.*,(SELECT COUNT(1) FROM t_modular_org o WHERE o.modular_id = m.id AND o.org_id = ?) isShow from t_screen_modular m where m.type = ?",orgid,type);
+            success(list);
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    public void bindModulars(){
+        try{
+            Integer orgid = this.getParaToInt("orgid");
+            Db.delete("delete from t_modular_org where org_id = ?",orgid);
+            String ids[] = this.getParaValues("ids[]");
+            if (CommonUtils.isNotNullOrNotEmpty(ids)){
+                for (String id : ids){
+                    Record record = new Record();
+                    record.set("modular_id",id);
+                    record.set("org_id",orgid);
+                    Db.save("t_modular_org","id",record);
+                }
+            }
+            success();
+        }catch(Exception e){
+            e.printStackTrace();
+            fail();
+        }
+    }
+}

+ 177 - 0
src/main/java/com/controller/sysconfig/SysConfigController.java

@@ -0,0 +1,177 @@
+package com.controller.sysconfig;
+
+import com.config.BaseController;
+import com.config.ControllerInterface;
+import com.jfinal.kit.PropKit;
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Record;
+import com.model.OrgBookField;
+import com.model.OrgSetting;
+import com.model.User;
+import com.service.SysConfigService;
+import com.tools.JwtUtils;
+import com.utils.CommonUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@ControllerInterface(path="/sysconfig")
+public class SysConfigController extends BaseController {
+    SysConfigService sysConfigService = SysConfigService.me;
+
+    public void index() {
+        render("/view/sysconfig/sysconfig.html");
+    }
+
+    public void synchronizedData(){
+        render("/view/sysconfig/synchronizedData.html");
+    }
+
+    public void synchronizedInfo_web(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+
+        User user= getSessionAttr("userInfo");
+        if(CommonUtils.isNullOrEmpty(user)) {
+            fail(1,"非法操作");
+            return;
+        }
+
+        String parentorgid = this.getPara("parentorgid");
+        if(CommonUtils.isNullOrEmpty(parentorgid)){
+            fail(1,"parentorgid不能为空");
+            return;
+        }
+
+        success();
+    }
+
+    public void synchronizedInfo_offLine(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        Integer currentOrgid = getParaToInt("currentOrgid",0);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        User user= getSessionAttr("userInfo");
+        if(CommonUtils.isNullOrEmpty(user)) {
+            fail(1,"非法操作");
+            return;
+        }
+        String parentorgid = this.getPara("parentorgid");
+        if(CommonUtils.isNullOrEmpty(parentorgid) && currentOrgid == 0){
+            fail(1,"parentorgid不能为空");
+            return;
+        }
+        if(currentOrgid != 0) {
+            Record record = Db.findById("t_org",currentOrgid);
+            if(CommonUtils.isNullOrEmpty(record)) {
+                fail(1,"查询不到需要同步到的机构信息");
+                return;
+            }
+        }
+
+        success();
+    }
+
+    public void verificationShucihaoByOrgid(){
+        String token = this.getPara("token");
+        int operatorid = JwtUtils.validateJWTForUserId(token);
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        User user= getSessionAttr("userInfo");
+        if(CommonUtils.isNullOrEmpty(user)) {
+            fail(1,"非法操作");
+            return;
+        }
+        Integer orgid = this.getParaToInt("orgid");
+        if(CommonUtils.isNullOrEmpty(orgid)){
+            fail(1,"orgid不能为空");
+            return;
+        }
+        List<Record> list = Db.find("select id,bookno from t_book where orgid = ?",orgid);
+        for(Record record : list) {
+            String bookno = record.getStr("bookno");
+            if(CommonUtils.isNullOrEmpty(bookno) || bookno.indexOf("/") == -1 ||  (bookno.indexOf("/") > bookno.indexOf(":") && bookno.indexOf(":")>-1)){
+                continue;
+            }
+            try {
+                String shucihaostr = "";
+                if(bookno.indexOf("-",3)>-1 && bookno.indexOf("/") < bookno.indexOf("-",3)){
+                    shucihaostr = bookno.substring(bookno.indexOf("/")+1,bookno.indexOf("-",3));
+                } else if(bookno.indexOf(":")>-1){
+                    shucihaostr = bookno.substring(bookno.indexOf("/")+1,bookno.indexOf(":"));
+                } else {
+                    shucihaostr = bookno.substring(bookno.indexOf("/")+1);
+                }
+                Integer shucihao = Integer.parseInt(shucihaostr);
+                record.set("shucihao",shucihao);
+            }catch (Exception e){
+                logger.info("书次号转换异常,bookno:"+bookno+" id:"+record.getInt("id"));
+                continue;
+            }
+        }
+        Db.batchUpdate("t_book",list,1000);
+        success();
+    }
+
+    public void addOrUpdate(){
+        try{
+            User user= getSessionAttr("userInfo");
+            int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+            if(operatorid == 0){
+                fail(3,"token错误");
+                return;
+            }
+            OrgBookField orgBookField=getBean(OrgBookField.class,"bean");
+            OrgSetting orgSetting = getBean(OrgSetting.class,"bean");
+
+            orgBookField.setOrgid(user.getOrgid());
+            orgSetting.setOrgid(user.getOrgid());
+            orgSetting.setStatus(1);
+            if(orgSetting.getUsername() != null){
+                orgSetting.setUsername(orgSetting.getUsername().trim());
+            }
+            if(orgSetting.getPassword() != null){
+                orgSetting.setPassword(orgSetting.getPassword().trim());
+            }
+
+            sysConfigService.addOrUpdate(orgBookField,orgSetting);
+        }catch (Exception e){
+            fail(0,e.getMessage());
+        }
+
+        success();
+    }
+
+
+    public void findSysConfig(){
+        User user= getSessionAttr("userInfo");
+        int operatorid = JwtUtils.validateJWTForUserId(user.get("token").toString());
+        if(operatorid == 0){
+            fail(3,"token错误");
+            return;
+        }
+        OrgBookField orgBookField=sysConfigService.findOrgBookField(user.getOrgid());
+        OrgSetting orgSetting = sysConfigService.findOrgSetting(user.getOrgid());
+        Map<String,Object> result = new HashMap<String, Object>();
+        result.put("OrgBookField",orgBookField);
+        result.put("OrgSetting",orgSetting);
+        success(result);
+    }
+
+    public void findSelect(){
+        List<Record> list = Db.find("select id,orgname from t_org where orgtypeid = 1 order by id asc");
+        success(list);
+    }
+
+
+}

+ 66 - 0
src/main/java/com/enums/LogEnum.java

@@ -0,0 +1,66 @@
+package com.enums;
+
+/**
+ * @ClassName LogEnum
+ * @Description  日志枚举
+ * @Author zhangyanwei
+ * @Date 2020/11/24 16:11
+ * @Version 1.0
+ **/
+public enum LogEnum {
+	lever("lever","级别为"),
+	time("start_time","操作时间:"),
+	sort("sort","功能排序"),
+	oper("oper","功能类别"),
+	ip("ip","ip"),
+	sercher("sercher","查询"),
+	logbak("logbak","日志备份"),
+	logstore("logstore","日志恢复");
+	private String code;
+	private String decription;
+
+	public String getCode() {
+		return code;
+	}
+
+	private LogEnum(String code, String decription) {
+		this.code = code;
+		this.decription = decription;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getDecription() {
+		return decription;
+	}
+
+	public void setDecription(String decription) {
+		this.decription = decription;
+	}
+	
+	public static String  getNameByCode(String code){
+		if(code == null){
+			return "";
+		}
+		for(LogEnum enums : LogEnum.values()){
+			if(code.equals(enums.getCode())){
+				return  enums.getDecription();
+			}
+		}
+		return "";
+	}
+	
+	public static String  getCodeByName(String name){
+		if(name == null){
+			return "";
+		}
+		for(LogEnum enums : LogEnum.values()){
+			if(name.equals(enums.getDecription())){
+				return  enums.code;
+			}
+		}
+		return "";
+	}
+}

+ 62 - 0
src/main/java/com/enums/SortEnum.java

@@ -0,0 +1,62 @@
+package com.enums;
+
+public enum SortEnum {
+	TIME_ASC("t1.start_time asc","按时间升序"),
+	TIME_DEAC("t1.start_time desc","按时间降序"),
+	USRR_NAME_ASC("t1.create_name asc","按用户名升序"),
+	USER_NAME_DESC("t1.create_name desc","按用户名降序"),
+    OPER_ASC(" CONVERT(t1.oper USING gbk)COLLATE gbk_chinese_ci asc","按操作类型升序"),
+    OPER_DESC(" CONVERT(t1.oper USING gbk)COLLATE gbk_chinese_ci desc","按操作类型降序");
+	private  String  code;
+	
+	private  String  name;
+
+	private SortEnum(String code, String name) {
+		this.code = code;
+		this.name = name;
+	}
+	
+	public static String  getNameByCode(String code){
+		if(code == null){
+			return "";
+		}
+		for(SortEnum enums : SortEnum.values()){
+			if(code.equals(enums.getCode())){
+				return  enums.getName();
+			}
+		}
+		return "";
+	}
+	
+	public static String  getCodeByName(String name){
+		if(name == null){
+			return "";
+		}
+		for(SortEnum enums : SortEnum.values()){
+			if(name.equals(enums.getName())){
+				return  enums.code;
+			}
+		}
+		return "";
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	
+
+	
+}

+ 55 - 0
src/main/java/com/enums/SourceEnum.java

@@ -0,0 +1,55 @@
+package com.enums;
+
+public enum SourceEnum {
+    czy(15,"业务"),
+    pzy(16,"配置"),
+    sjy(17,"审计");
+
+    private int code;
+    private String decription;
+
+    public int getCode() {
+        return code;
+    }
+
+    private SourceEnum(int code, String decription) {
+        this.code = code;
+        this.decription = decription;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getDecription() {
+        return decription;
+    }
+
+    public void setDecription(String decription) {
+        this.decription = decription;
+    }
+
+    public static String  getNameByCode(int code){
+        if(code == 0){
+            return "";
+        }
+        for(SourceEnum enums : SourceEnum.values()){
+            if(code == enums.getCode()){
+                return  enums.getDecription();
+            }
+        }
+        return "";
+    }
+
+    public static int  getCodeByName(String name){
+        if(name == null){
+            return 0;
+        }
+        for(SourceEnum enums : SourceEnum.values()){
+            if(name.equals(enums.getDecription())){
+                return  enums.code;
+            }
+        }
+        return 0 ;
+    }
+}

+ 35 - 0
src/main/java/com/exception/NitifyException.java

@@ -0,0 +1,35 @@
+package com.exception;
+
+/**
+ * @ClassName NitifyException
+ * @Description
+ * @Author zhangyanwei
+ * @Date 2020/12/3 17:25
+ * @Version 1.0
+ **/
+public class NitifyException extends Exception {
+    private static final long serialVersionUID = 1L;
+    private Integer code;
+    private String message;
+
+    public NitifyException(Integer code, String message) {
+        this.message = message;
+        this.code = code;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 11 - 0
src/main/java/com/model/Areatype.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseAreatype;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class Areatype extends BaseAreatype<Areatype> {
+	
+}

+ 11 - 0
src/main/java/com/model/BasicArea.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBasicArea;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BasicArea extends BaseBasicArea<BasicArea> {
+
+}

+ 11 - 0
src/main/java/com/model/Binding.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBinding;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class Binding extends BaseBinding<Binding> {
+	
+}

+ 11 - 0
src/main/java/com/model/Blog.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBlog;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class Blog extends BaseBlog<Blog> {
+	
+}

+ 11 - 0
src/main/java/com/model/Book.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBook;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class Book extends BaseBook<Book> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookArea.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookArea;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookArea extends BaseBookArea<BookArea> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookDetail.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookDetail;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookDetail extends BaseBookDetail<BookDetail> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookDiaobo.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookDiaobo;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookDiaobo extends BaseBookDiaobo<BookDiaobo> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookErrorlocation.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookErrorlocation;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookErrorlocation extends BaseBookErrorlocation<BookErrorlocation> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookEvaluation.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookEvaluation;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookEvaluation extends BaseBookEvaluation<BookEvaluation> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookGood.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookGood;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookGood extends BaseBookGood<BookGood> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookHot.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookHot;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookHot extends BaseBookHot<BookHot> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookLocation.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookLocation;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookLocation extends BaseBookLocation<BookLocation> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookNew.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookNew;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookNew extends BaseBookNew<BookNew> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookPenalty.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookPenalty;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookPenalty extends BaseBookPenalty<BookPenalty> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookPlus.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookPlus;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookPlus extends BaseBookPlus<BookPlus> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookRecommend.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookRecommend;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookRecommend extends BaseBookRecommend<BookRecommend> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookShelfplan.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookShelfplan;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookShelfplan extends BaseBookShelfplan<BookShelfplan> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookYubian.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookYubian;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookYubian extends BaseBookYubian<BookYubian> {
+	
+}

+ 11 - 0
src/main/java/com/model/BookZhuxiao.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookZhuxiao;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class BookZhuxiao extends BaseBookZhuxiao<BookZhuxiao> {
+	
+}

+ 11 - 0
src/main/java/com/model/Bookpici.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookpici;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class Bookpici extends BaseBookpici<Bookpici> {
+	
+}

+ 11 - 0
src/main/java/com/model/Bookplan.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookplan;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class Bookplan extends BaseBookplan<Bookplan> {
+	
+}

+ 11 - 0
src/main/java/com/model/Bookplandetail.java

@@ -0,0 +1,11 @@
+package com.model;
+
+import com.model.base.BaseBookplandetail;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class Bookplandetail extends BaseBookplandetail<Bookplandetail> {
+	
+}

+ 0 - 0
src/main/java/com/model/Bookshelfinfo.java


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