瀏覽代碼

【feat】【第一版开发】
1.完善开发设计文档
2.增加代码格式化文件eclipse-codestyle.xml
3.完善sql脚本
4.新增mybatis数据审计字段自动填充插件
5.代码开发

ChenYL 1 年之前
父節點
當前提交
ba04e55170
共有 39 個文件被更改,包括 1788 次插入97 次删除
  1. 12 0
      .idea/eclipseCodeFormatter.xml
  2. 1 1
      .idea/misc.xml
  3. 603 0
      doc/eclipse-codestyle.xml
  4. 45 6
      doc/sql/punch_settle-ddl.sql
  5. 83 35
      doc/技术文档.md
  6. 6 0
      src/main/java/com/punchsettle/server/atomic/entity/PunchInRecord.java
  7. 8 8
      src/main/java/com/punchsettle/server/atomic/entity/PunchInSettlement.java
  8. 2 2
      src/main/java/com/punchsettle/server/atomic/entity/User.java
  9. 56 0
      src/main/java/com/punchsettle/server/atomic/entity/UserClaimRewardRecord.java
  10. 56 0
      src/main/java/com/punchsettle/server/atomic/entity/UserReward.java
  11. 13 0
      src/main/java/com/punchsettle/server/atomic/mapper/UserClaimRewardRecordMapper.java
  12. 13 0
      src/main/java/com/punchsettle/server/atomic/mapper/UserRewardMapper.java
  13. 28 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInRecordService.java
  14. 33 0
      src/main/java/com/punchsettle/server/atomic/service/IPunchInService.java
  15. 18 0
      src/main/java/com/punchsettle/server/atomic/service/IUserClaimRewardRecordService.java
  16. 25 0
      src/main/java/com/punchsettle/server/atomic/service/IUserRewardService.java
  17. 26 0
      src/main/java/com/punchsettle/server/atomic/service/IUserService.java
  18. 54 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInRecordServiceImpl.java
  19. 52 0
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInServiceImpl.java
  20. 31 0
      src/main/java/com/punchsettle/server/atomic/service/impl/UserClaimRewardRecordServiceImpl.java
  21. 39 0
      src/main/java/com/punchsettle/server/atomic/service/impl/UserRewardServiceImpl.java
  22. 42 0
      src/main/java/com/punchsettle/server/atomic/service/impl/UserServiceImpl.java
  23. 46 27
      src/main/java/com/punchsettle/server/core/interceptor/AuthInterceptor.java
  24. 2 1
      src/main/java/com/punchsettle/server/core/interceptor/MybatisAuditDataInterceptor.java
  25. 20 0
      src/main/java/com/punchsettle/server/dto/ClaimRewardDto.java
  26. 50 0
      src/main/java/com/punchsettle/server/dto/PunchInDto.java
  27. 25 0
      src/main/java/com/punchsettle/server/dto/PunchInRecordDto.java
  28. 32 0
      src/main/java/com/punchsettle/server/dto/PunchInRecordQuery.java
  29. 50 0
      src/main/java/com/punchsettle/server/dto/PunchInWithRecordDto.java
  30. 18 0
      src/main/java/com/punchsettle/server/dto/UserRewardDto.java
  31. 26 0
      src/main/java/com/punchsettle/server/service/controller/PunchInController.java
  32. 2 2
      src/main/java/com/punchsettle/server/service/controller/WechatMiniProgramController.java
  33. 39 0
      src/main/java/com/punchsettle/server/service/manager/IPunchInManager.java
  34. 25 0
      src/main/java/com/punchsettle/server/service/manager/IRewardManager.java
  35. 135 0
      src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerImpl.java
  36. 24 0
      src/main/java/com/punchsettle/server/service/manager/impl/RewardManagerImpl.java
  37. 12 14
      src/main/java/com/punchsettle/server/service/manager/impl/WechatMiniProgramManagerImpl.java
  38. 35 0
      src/main/java/com/punchsettle/server/utiis/DateUtils.java
  39. 1 1
      src/main/java/com/punchsettle/server/utiis/UserUtils.java

+ 12 - 0
.idea/eclipseCodeFormatter.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="EclipseCodeFormatterProjectSettings">
+    <option name="projectSpecificProfile">
+      <ProjectSpecificProfile>
+        <option name="formatter" value="ECLIPSE" />
+        <option name="pathToConfigFileJava" value="$PROJECT_DIR$/doc/eclipse-codestyle.xml" />
+        <option name="selectedJavaProfile" value="P3C-CodeStyle" />
+      </ProjectSpecificProfile>
+    </option>
+  </component>
+</project>

+ 1 - 1
.idea/misc.xml

@@ -8,7 +8,7 @@
       </list>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_X" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />
   </component>
 </project>

+ 603 - 0
doc/eclipse-codestyle.xml

@@ -0,0 +1,603 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="12">
+    <profile kind="CodeFormatterProfile" name="P3C-CodeStyle" version="13">
+        <!--可变参数的... Idea没有对应的配置项,强制insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+        <!--枚举值之间 Idea没有对应的配置项,强制insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=Java:SPACE_BEFORE_COMMA-->
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=Java:SPACE_BEFORE_COMMA
+        由于IDEA只有一个SPACE_BEFORE_COMMA选项,所以统一设置 insert_space_before_comma 为 do not insert
+        -->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments"
+                 value="do not insert"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations"
+                 value="do not insert"/>
+        <!--insert_space_before_comma end-->
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=Java:SPACE_AFTER_COMMA_IN_TYPE_ARGUMENTS-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+        <!--IDEA只有一个配置项SPACE_AFTER_COMMA,insert_space_after_comma*统一设置成insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+        <!--insert_space_after_comma end-->
+
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=Java:SPACE_BEFORE_COLON-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=Java:SPACE_AFTER_COLON-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+
+        <!--IDEA不支持配置,默认do not insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+        <!--这个在Eclipse也没有找到配置的地方-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="do not insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_semicolon=Java:SPACE_BEFORE_SEMICOLON
+        程序导入的时候强制将SPACE_BEFORE_SEMICOLON设置为false
+        -->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+
+        <!--SPACE_AFTER_SEMICOLON=true-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
+
+        <!--IDEA不支持配置,do not insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant"
+                 value="do not insert"/>
+        <setting
+                id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration"
+                value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration"
+                 value="do not insert"/>
+
+        <!--IDEA不支持,使用默认-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=Java:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+
+        <!--IDEA不支持配置,使用如下值,两者对应-->
+        <setting
+                id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
+                value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters"
+                 value="do not insert"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters"
+                 value="insert"/>
+        <setting
+                id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
+                value="do not insert"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments"
+                 value="do not insert"/>
+        <setting
+                id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
+                value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters"
+                 value="do not insert"/>
+
+        <!--Java:SPACE_BEFORE_OPENING_ANGLE_BRACKET_IN_TYPE_PARAMETER-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters"
+                 value="do not insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=Java:SPACE_AFTER_CLOSING_ANGLE_BRACKET_IN_TYPE_ARGUMENT-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments"
+                 value="do not insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=Java:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+
+        <!--IDEA使用了对应的配置:Java:SPACE_WITHIN_ARRAY_INITIALIZER_BRACES,但感觉不太好,IDEA默认不插入,Eclipse也使用不插入-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer"
+                 value="do not insert"/>
+
+        <!--use default insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return"
+                 value="insert"/>
+
+        <!--use default do not insert -->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+
+
+        <!--use default insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration"
+                 value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw"
+                 value="insert"/>
+
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=Java:SPACE_BEFORE_SWITCH_LBRACE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=Java:SPACE_BEFORE_CLASS_LBRACE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration"
+                 value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=Java:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=Java:SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer"
+                 value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=Java:SPACE_BEFORE_METHOD_LBRACE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration"
+                 value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=Java:SPACE_AFTER_QUEST-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=Java:SPACE_BEFORE_QUEST-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=Java:SPACE_BEFORE_ANOTATION_PARAMETER_LIST-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation"
+                 value="do not insert"/>
+
+        <!--use default do not insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+        <setting
+                id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
+                value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression"
+                 value="do not insert"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference"
+                 value="do not insert"/>
+
+
+        <!--下面两个对应IDEA中的一个配置Java:SPACE_AROUND_ASSIGNMENT_OPERATORS,使用insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=Java:SPACE_BEFORE_CATCH_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=Java:SPACE_BEFORE_METHOD_CALL_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation"
+                 value="do not insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=Java:SPACE_BEFORE_TRY_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
+
+        <!--下面两个对应IDEA中的一个配置Java:SPACE_AROUND_UNARY_OPERATOR,使用do not insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=Java:SPACE_BEFORE_IF_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=Java:SPACE_BEFORE_WHILE_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=Java:SPACE_AFTER_TYPE_CAST-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="do not insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=Java:SPACE_BEFORE_METHOD_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration"
+                 value="do not insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=Java:SPACE_BEFORE_FOR_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=Java:SPACE_BEFORE_SYNCHRONIZED_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+
+        <!--org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=Java:SPACE_BEFORE_SWITCH_PARENTHESES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+
+        <!--下面两个对应IDEA中的一个配置Java:SPACE_AROUND_LAMBDA_ARROW,使用insert-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
+        <!--SPACE_WITHIN_EMPTY_ARRAY_INITIALIZER_BRACES-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer"
+                 value="do not insert"/>
+
+        <!--Idea -> Wrapping And Braces -> Simple classes in one line -->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="do not insert"/>
+        <!--Idea -> Wrapping And Braces -> Simple method in one line -->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="do not insert"/>
+        <!--因为Idea不支持配置,所以设置为 Idea默认值-->
+
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant"
+                 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="insert"/>
+        <!--Idea可以通过Wrap Always实现 TODO-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
+        <!--Idea -> Wrapping And Braces -> Simple block in one line -> do not select -->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+
+        <!--Idea -> Wrapping And Braces -> try statement -> catch.... (Java:CATCH_ON_NEW_LINE)-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement"
+                 value="do not insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=Java:ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer"
+                 value="do not insert"/>
+        <!--#org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=Java:ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer"
+                 value="do not insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=Java:ELSE_ON_NEW_LINE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=Java:WHILE_ON_NEW_LINE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement"
+                 value="do not insert"/>
+        <!--org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=Java:FINALLY_ON_NEW_LINE-->
+        <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement"
+                 value="do not insert"/>
+
+        <!--comment start-->
+        <setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
+        <!--ENABLE_JAVADOC_FORMATTING-->
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+        <!--org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+        <!--IDEA无对应设置,所以关闭对block comment的格式化 -->
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
+
+        <!--org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=Java:KEEP_FIRST_COLUMN_COMMENT-->
+        <setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+        <!--org.eclipse.jdt.core.formatter.use_on_off_tags=FORMATTER_TAGS_ENABLED-->
+        <setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
+        <!--org.eclipse.jdt.core.formatter.disabling_tag=FORMATTER_OFF_TAG-->
+        <setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
+        <!--org.eclipse.jdt.core.formatter.enabling_tag=FORMATTER_ON_TAG-->
+        <setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
+
+        <!--下面的没有IDEA对应项,在代码里面对IDEA中使用默认值即可,LINE_COMMENT_AT_FIRST_COLUMN BLOCK_COMMENT_AT_FIRST_COLUMN设置为false-->
+        <setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments"
+                 value="false"/>
+
+
+        <setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
+        <!--和IDEA保持一致,注释换行-->
+        <setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
+
+
+        <!--comment end-->
+
+        <!--org.eclipse.jdt.core.formatter.blank_lines_after_imports=Java:BLANK_LINES_AFTER_IMPORTS-->
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+        <!--org.eclipse.jdt.core.formatter.blank_lines_before_imports=Java:BLANK_LINES_BEFORE_IMPORTS-->
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+        <!--org.eclipse.jdt.core.formatter.blank_lines_after_package=Java:BLANK_LINES_AFTER_PACKAGE-->
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+        <!--org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=Java:BLANK_LINES_AROUND_CLASS-->
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+        <!--org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=Java:BLANK_LINES_BEFORE_METHOD_BODY-->
+        <setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+        <!--org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=Java:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+        <!--org.eclipse.jdt.core.formatter.blank_lines_before_field=Java:BLANK_LINES_AROUND_FIELD-->
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+        <!--org.eclipse.jdt.core.formatter.blank_lines_before_method=Java:BLANK_LINES_AROUND_METHOD-->
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+        <!--org.eclipse.jdt.core.formatter.blank_lines_before_package=Java:BLANK_LINES_BEFORE_PACKAGE-->
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+
+        <!--下面IDEA没有对应设置,使用对应值即可-->
+        <setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+
+        <!--org.eclipse.jdt.core.formatter.indentation.size=Java:IndentOptions:INDENT_SIZE-->
+        <setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+        <!--org.eclipse.jdt.core.formatter.continuation_indentation=Java:IndentOptions:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1"/>
+        <!--org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=Java:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+        <!--org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=Java:IndentOptions:SMART_TABS-->
+        <setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+        <!--org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=Java:INDENT_CASE_FROM_SWITCH-->
+        <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
+        <!--KEEP_INDENTS_ON_EMPTY_LINES-->
+        <setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+        <!--org.eclipse.jdt.core.formatter.tabulation.size=Java:IndentOptions:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+        <!--Java:IndentOptions:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+
+
+        <!--下面IDEA没有对应设置,使用对应值即可-->
+        <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header"
+                 value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="1"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header"
+                 value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header"
+                 value="true"/>
+
+
+        <!--Java:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+
+        <!--下面没有对应的IDEA设置,Eclipse先使用对应值-->
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="16"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+
+
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression"
+                 value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="16"/>
+
+        <!--IDEA默认配置在同一行,Eclipse使用对应值即可-->
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration"
+                 value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
+        <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
+
+        <!--Java:BINARY_OPERATION_SIGN_ON_NEXT_LINE-->
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+
+        <!--ASSIGNMENT_WRAP 需要设置为 WRAP_AS_NEEDED  WRAP_AS_NEEDED . Add in jdt.core-3.12,it's not work in previous version -->
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
+
+        <!--IDEA无配置项,Eclipse使用对应值即可-->
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+
+        <!--org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=Java:KEEP_CONTROL_STATEMENT_IN_ONE_LINE-->
+        <setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+        <!--org.eclipse.jdt.core.formatter.compact_else_if=Java:SPECIAL_ELSE_IF_TREATMENT-->
+        <setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+        <!--Java:ALIGN_GROUP_FIELD_DECLARATIONS-->
+        <setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+        <!--Java:<Programmatic>-->
+        <setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+
+        <!--统一为end_of_lint,IDEA默认一致-->
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration"
+                 value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+
+
+        <!--        <setting id="org.eclipse.jdt.core.compiler.source" value="1.8"/>
+                <setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8"/>
+                <setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8"/>
+                        <setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+                                <setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+                                        <setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
+                -->
+        <!--Java:KEEP_SIMPLE_BLOCKS_IN_ONE_LINE-->
+        <setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+
+        <!--Java:CLASS_BRACE_STYLE,统一使用end_of_line TODO-->
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+
+        <!--org.eclipse.jdt.core.formatter.lineSplit=RIGHT_MARGIN-->
+        <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+    </profile>
+</profiles>

+ 45 - 6
doc/sql/punch_settle-ddl.sql

@@ -24,6 +24,7 @@ CREATE TABLE `punch_in_record` (
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
   `punch_in_id` bigint NOT NULL COMMENT '打卡任务表主键',
   `punch_in_time` timestamp NOT NULL COMMENT '打卡时间',
+  `punch_in_status` tinyint NOT NULL DEFAULT '1' COMMENT '打卡状态(1-待打卡,2-完成、3-未完成)',
   `created_by` bigint NOT NULL COMMENT '创建人',
   `creation_time` timestamp NOT NULL COMMENT '创建时间',
   `last_updated_by` bigint NOT NULL COMMENT '最后更新人',
@@ -33,7 +34,6 @@ CREATE TABLE `punch_in_record` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='打卡任务记录表';
 
-
 -- punch_settle.punch_in_record_settlement_rela definition
 
 CREATE TABLE `punch_in_record_settlement_rela` (
@@ -55,9 +55,9 @@ CREATE TABLE `punch_in_record_settlement_rela` (
 CREATE TABLE `punch_in_settlement` (
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
   `user_id` bigint NOT NULL COMMENT '用户表主键',
-  `reward_num` int NOT NULL COMMENT '结算奖励数',
-  `claim_reward_flag` tinyint NOT NULL DEFAULT '0' COMMENT '是否已领取奖励(0-未领取,1-已领取)',
-  `claim_reward_time` timestamp NULL DEFAULT NULL COMMENT '领取奖励时间',
+  `settle_reward_num` int NOT NULL COMMENT '结算奖励数',
+  `before_settle_reward_num` int NOT NULL DEFAULT '0' COMMENT '结算前用户拥有的奖励数',
+  `after_settle_reward_num` int NOT NULL DEFAULT '0' COMMENT '结算后用户拥有的奖励数',
   `settlement_task_id` bigint NOT NULL COMMENT '结算任务表id',
   `settlement_time` timestamp NOT NULL COMMENT '结算时间',
   `notify_id` bigint DEFAULT NULL COMMENT '通知表ID',
@@ -121,7 +121,46 @@ CREATE TABLE `user` (
   `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
   `open_id` varchar(128) NOT NULL COMMENT '微信id',
   `nickname` varchar(100) DEFAULT NULL COMMENT '微信昵称',
-  `avator` varchar(1000) DEFAULT NULL COMMENT '微信头像url',
+  `avatar` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '微信头像url',
+  `reward_num` int NOT NULL DEFAULT '0',
+  `claimed_reward_num` int NOT NULL DEFAULT '0' COMMENT '已领取奖励数',
+  `created_by` bigint NOT NULL COMMENT '创建人',
+  `creation_time` timestamp NOT NULL COMMENT '创建时间',
+  `last_updated_by` bigint NOT NULL COMMENT '最后更新人',
+  `last_update_time` timestamp NOT NULL COMMENT '最后更新时间',
+  `version` bigint NOT NULL DEFAULT '1' COMMENT '版本号',
+  `delete_flag` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标志(0-未删除,1-已删除)',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
+
+
+-- punch_settle.user_reward definition
+
+CREATE TABLE `user_reward` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `user_id` bigint NOT NULL COMMENT '用户表主键',
+  `total_reward_num` int NOT NULL COMMENT '总奖励数',
+  `unclaimed_reward_num` int NOT NULL DEFAULT '0' COMMENT '未领取奖励数',
+  `claimed_reward_num` int NOT NULL DEFAULT '0' COMMENT '已领取奖励数',
+  `created_by` bigint NOT NULL COMMENT '创建人',
+  `creation_time` timestamp NOT NULL COMMENT '创建时间',
+  `last_updated_by` bigint NOT NULL COMMENT '最后更新人',
+  `last_update_time` timestamp NOT NULL COMMENT '最后更新时间',
+  `version` bigint NOT NULL DEFAULT '1' COMMENT '版本号',
+  `delete_flag` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标志(0-未删除,1-已删除)',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT=' 用户奖励数据表';
+
+
+-- punch_settle.user_claim_reward_record definition
+
+CREATE TABLE `user_claim_reward_record` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `user_id` bigint NOT NULL COMMENT '用户表主键',
+  `claim_reward_num` int NOT NULL DEFAULT '0' COMMENT '本次领取奖励数',
+  `claim_reward_time` timestamp NOT NULL COMMENT '领取奖励时间',
+  `before_claim_reward_num` int NOT NULL DEFAULT '0' COMMENT '领取前用户拥有的奖励数',
+  `after_claim_reward_num` int NOT NULL DEFAULT '0' COMMENT '领取后用户拥有的奖励数',
   `created_by` bigint NOT NULL COMMENT '创建人',
   `creation_time` timestamp NOT NULL COMMENT '创建时间',
   `last_updated_by` bigint NOT NULL COMMENT '最后更新人',
@@ -129,4 +168,4 @@ CREATE TABLE `user` (
   `version` bigint NOT NULL DEFAULT '1' COMMENT '版本号',
   `delete_flag` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除标志(0-未删除,1-已删除)',
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='领取奖励记录表';

+ 83 - 35
doc/技术文档.md

@@ -28,10 +28,16 @@ ui设计工具:即时设计
 
 * 打卡任务
 
-  1. 新建任务
-  2. 编辑任务
-  3. 删除任务
-  4. 用户完成任务
+  1. 查询当前用户拥有的打卡任务列表
+  2. 新建任务
+  3. 编辑任务
+  4. 删除任务
+  5. 用户完成任务
+
+* 奖励
+
+  1. 查询当前用户拥有的奖励数
+  2. 领取奖励
 
 * 系统
 
@@ -39,7 +45,7 @@ ui设计工具:即时设计
 
      说明:每日凌晨把昨天完成的任务获得的奖励进行自动统计
 
-  2. 每天自动推送结算通知
+  2. 每天自动推送结算通知(第二版再增加这个功能)
 
      说明:把每日结算结果推送到微信
 
@@ -58,7 +64,7 @@ ui设计工具:即时设计
 | id               | bigint        | 主键                               |
 | open_id          | varchar(128)  | 微信id                             |
 | nickname         | varchar(100)  | 微信昵称                           |
-| avator           | varchar(1000) | 微信头像url                        |
+| avatar           | varchar(1000) | 微信头像url                        |
 | created_by       | bigint        | 创建人                             |
 | creation_time    | timestamp     | 创建时间                           |
 | last_updated_by  | bigint        | 最后更新人                         |
@@ -93,17 +99,18 @@ ui设计工具:即时设计
 
 表名:punch_in_record
 
-| 字段             | 类型      | 描述                               |
-| ---------------- | --------- | ---------------------------------- |
-| id               | bigint    | 主键                               |
-| punch_in_id      | bigint    | 打卡任务表主键                     |
-| punch_in_time    | timestamp | 打卡时间                           |
-| created_by       | bigint    | 创建人                             |
-| creation_time    | timestamp | 创建时间                           |
-| last_updated_by  | bigint    | 最后更信人                         |
-| last_update_time | timestamp | 最后更新时间                       |
-| version          | bigint    | 版本号                             |
-| delete_flag      | tinyint   | 逻辑删除标志(0-未删除,1-已删除) |
+| 字段             | 类型      | 描述                                   |
+| ---------------- | --------- | -------------------------------------- |
+| id               | bigint    | 主键                                   |
+| punch_in_id      | bigint    | 打卡任务表主键                         |
+| punch_in_time    | timestamp | 打卡时间                               |
+| punch_in_status  | tinyint   | 打卡状态(1-待打卡,2-完成、3-未完成) |
+| created_by       | bigint    | 创建人                                 |
+| creation_time    | timestamp | 创建时间                               |
+| last_updated_by  | bigint    | 最后更信人                             |
+| last_update_time | timestamp | 最后更新时间                           |
+| version          | bigint    | 版本号                                 |
+| delete_flag      | tinyint   | 逻辑删除标志(0-未删除,1-已删除)     |
 
 
 
@@ -111,24 +118,24 @@ ui设计工具:即时设计
 
 表名:punch_in_settlement
 
-| 字段               | 类型        | 描述                                                         |
-| ------------------ | ----------- | ------------------------------------------------------------ |
-| id                 | bigint      | 主键                                                         |
-| user_id            | bigint      | 用户表主键                                                   |
-| reward_num         | int         | 结算奖励数                                                   |
-| claim_reward_flag  | tinyint     | 是否已领取奖励(0-未领取,1-已领取)                           |
-| claim_reward_time  | timestamp   | 领取奖励时间                                                 |
-| settlement_task_id | bigint      | 结算任务表id                                                 |
-| settlement_time    | timestamp   | 结算时间                                                     |
-| notify_id          | bigint      | 通知表ID                                                     |
-| notify_status      | varchar(20) | 结算通知状态(fail-通知失败,success-成功通知,pending-待通知) |
-| notify_time        | timestamp   | 结算通知时间                                                 |
-| created_by         | bigint      | 创建人                                                       |
-| creation_time      | timestamp   | 创建时间                                                     |
-| last_updated_by    | bigint      | 最后更信人                                                   |
-| last_update_time   | timestamp   | 最后更新时间                                                 |
-| version            | bigint      | 版本号                                                       |
-| delete_flag        | tinyint     | 逻辑删除标志(0-未删除,1-已删除)                           |
+| 字段                     | 类型        | 描述                                                         |
+| ------------------------ | ----------- | ------------------------------------------------------------ |
+| id                       | bigint      | 主键                                                         |
+| user_id                  | bigint      | 用户表主键                                                   |
+| settle_reward_num        | int         | 结算奖励数                                                   |
+| before_settle_reward_num | int         | 结算前用户拥有的奖励数                                       |
+| after_settle_reward_num  | int         | 结算后用户拥有的奖励数                                       |
+| settlement_task_id       | bigint      | 结算任务表id                                                 |
+| settlement_time          | timestamp   | 结算时间                                                     |
+| notify_id                | bigint      | 通知表ID                                                     |
+| notify_status            | varchar(20) | 结算通知状态(fail-通知失败,success-成功通知,pending-待通知) |
+| notify_time              | timestamp   | 结算通知时间                                                 |
+| created_by               | bigint      | 创建人                                                       |
+| creation_time            | timestamp   | 创建时间                                                     |
+| last_updated_by          | bigint      | 最后更信人                                                   |
+| last_update_time         | timestamp   | 最后更新时间                                                 |
+| version                  | bigint      | 版本号                                                       |
+| delete_flag              | tinyint     | 逻辑删除标志(0-未删除,1-已删除)                           |
 
 
 
@@ -150,6 +157,47 @@ ui设计工具:即时设计
 
 
 
+#### 用户奖励数据表
+
+表名:user_reward
+
+| 字段                 | 类型      | 描述                               |
+| -------------------- | --------- | ---------------------------------- |
+| id                   | bigint    | 主键                               |
+| user_id              | bigint    | 用户表主键                         |
+| total_reward_num     | int       | 总奖励数                           |
+| unclaimed_reward_num | int       | 未领取奖励数                       |
+| claimed_reward_num   | int       | 已领取奖励数                       |
+| created_by           | bigint    | 创建人                             |
+| creation_time        | timestamp | 创建时间                           |
+| last_updated_by      | bigint    | 最后更新人                         |
+| last_update_time     | timestamp | 最后更新时间                       |
+| version              | bigint    | 版本号                             |
+| delete_flag          | tinyint   | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
+#### 领取奖励记录表
+
+表名:user_claim_reward_record
+
+| 字段                    | 类型      | 描述                               |
+| ----------------------- | --------- | ---------------------------------- |
+| id                      | bigint    | 主键                               |
+| user_id                 | bigint    | 用户表主键                         |
+| claim_reward_num        | int       | 本次领取奖励数                     |
+| claim_reward_time       | timestamp | 领取奖励时间                       |
+| before_claim_reward_num | int       | 领取前用户拥有的奖励数             |
+| after_claim_reward_num  | int       | 领取后用户拥有的奖励数             |
+| created_by              | bigint    | 创建人                             |
+| creation_time           | timestamp | 创建时间                           |
+| last_updated_by         | bigint    | 最后更信人                         |
+| last_update_time        | timestamp | 最后更新时间                       |
+| version                 | bigint    | 版本号                             |
+| delete_flag             | tinyint   | 逻辑删除标志(0-未删除,1-已删除) |
+
+
+
 #### 奖励结算定时任务执行记录表
 
 表名:settlement_task

+ 6 - 0
src/main/java/com/punchsettle/server/atomic/entity/PunchInRecord.java

@@ -35,4 +35,10 @@ public class PunchInRecord extends BaseEntity implements Serializable {
      */
     @Column(name = "punch_in_id")
     private Timestamp punchInTime;
+
+    /**
+     * 打卡状态(1-待打卡,2-完成、3-未完成)
+     */
+    @Column(name = "punch_in_status")
+    private Integer punchInStatus;
 }

+ 8 - 8
src/main/java/com/punchsettle/server/atomic/entity/PunchInSettlement.java

@@ -33,20 +33,20 @@ public class PunchInSettlement extends BaseEntity implements Serializable {
     /**
      * 结算奖励数
      */
-    @Column(name = "reward_num")
-    private Integer rewardNum;
+    @Column(name = "settle_reward_num")
+    private Integer settleRewardNum;
 
     /**
-     * 是否已领取奖励(0-未领取,1-已领取)
+     * 结算前用户拥有的奖励数
      */
-    @Column(name = "claim_reward_flag")
-    private Integer claimRewardFlag;
+    @Column(name = "before_settle_reward_num")
+    private Integer beforeSettleRewardNum;
 
     /**
-     * 领取奖励时间
+     * 结算后用户拥有的奖励数
      */
-    @Column(name = "claim_reward_time")
-    private Timestamp claimRewardTime;
+    @Column(name = "after_settle_reward_num")
+    private Integer afterSettleRewardNum;
 
     /**
      * 结算任务表id

+ 2 - 2
src/main/java/com/punchsettle/server/atomic/entity/User.java

@@ -38,6 +38,6 @@ public class User extends BaseEntity implements Serializable {
     /**
      * 微信头像url
      */
-    @Column(name = "avator")
-    private String avator;
+    @Column(name = "avatar")
+    private String avatar;
 }

+ 56 - 0
src/main/java/com/punchsettle/server/atomic/entity/UserClaimRewardRecord.java

@@ -0,0 +1,56 @@
+package com.punchsettle.server.atomic.entity;
+
+import com.punchsettle.server.common.entity.BaseEntity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 领取奖励记录表
+ * @date 2024/11/25 20:44
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "user_claim_reward_record")
+public class UserClaimRewardRecord extends BaseEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3347775963495102677L;
+
+    /**
+     * 用户表主键
+     */
+    @Column(name = "user_id")
+    private Long userId;
+
+    /**
+     * 本次领取奖励数
+     */
+    @Column(name = "claim_reward_num")
+    private Integer claimRewardNum;
+
+    /**
+     * 领取奖励时间
+     */
+    @Column(name = "claim_reward_time")
+    private Timestamp claimRewardTime;
+
+    /**
+     * 领取前用户拥有的奖励数
+     */
+    @Column(name = "before_claim_reward_num")
+    private Integer beforeClaimRewardTime;
+
+    /**
+     * 领取后用户拥有的奖励数
+     */
+    @Column(name = "after_claim_reward_num")
+    private Integer afterClaimRewardNum;
+}

+ 56 - 0
src/main/java/com/punchsettle/server/atomic/entity/UserReward.java

@@ -0,0 +1,56 @@
+package com.punchsettle.server.atomic.entity;
+
+import com.punchsettle.server.common.entity.BaseEntity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户奖励数据表
+ * @date 2024/11/25 20:39
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "user_reward")
+public class UserReward extends BaseEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -4590939776485091913L;
+
+    /**
+     * 用户表主键
+     */
+    @Column(name = "user_id")
+    private Long userId;
+
+    /**
+     * 本次领取奖励数
+     */
+    @Column(name = "claim_reward_num")
+    private Integer claimRewardNum;
+
+    /**
+     * 领取奖励时间
+     */
+    @Column(name = "claim_reward_time")
+    private Timestamp claimRewardTime;
+
+    /**
+     * 领取前用户拥有的奖励数
+     */
+    @Column(name = "before_claim_reward_num")
+    private Integer beforeClaimRewardNum;
+
+    /**
+     * 领取后用户拥有的奖励数
+     */
+    @Column(name = "after_claim_reward_num")
+    private Integer afterClaimRewardNum;
+}

+ 13 - 0
src/main/java/com/punchsettle/server/atomic/mapper/UserClaimRewardRecordMapper.java

@@ -0,0 +1,13 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.UserClaimRewardRecord;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 领取奖励记录表
+ * @date 2024/11/25 20:49
+ */
+public interface UserClaimRewardRecordMapper extends Mapper<UserClaimRewardRecord> {
+}

+ 13 - 0
src/main/java/com/punchsettle/server/atomic/mapper/UserRewardMapper.java

@@ -0,0 +1,13 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.UserReward;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户奖励数据表 mapper
+ * @date 2024/11/25 20:49
+ */
+public interface UserRewardMapper extends Mapper<UserReward> {
+}

+ 28 - 0
src/main/java/com/punchsettle/server/atomic/service/IPunchInRecordService.java

@@ -0,0 +1,28 @@
+package com.punchsettle.server.atomic.service;
+
+import com.punchsettle.server.atomic.entity.PunchInRecord;
+import com.punchsettle.server.dto.PunchInRecordQuery;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡任务记录表 service
+ * @date 2024/11/25 15:33
+ */
+public interface IPunchInRecordService {
+
+    /**
+     * 新增打卡记录
+     * @param record
+     */
+    void insert(PunchInRecord record);
+
+    /**
+     * 根据查询条件查询打卡记录
+     * @param query
+     * @return
+     */
+    List<PunchInRecord> listByCondition(PunchInRecordQuery query);
+}

+ 33 - 0
src/main/java/com/punchsettle/server/atomic/service/IPunchInService.java

@@ -0,0 +1,33 @@
+package com.punchsettle.server.atomic.service;
+
+import com.punchsettle.server.atomic.entity.PunchIn;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡结算任务表 service
+ * @date 2024/11/25 15:04
+ */
+public interface IPunchInService {
+
+    /**
+     * 根据创建人查询所有的打卡结算任务数据
+     * @param createdBy
+     * @return
+     */
+    List<PunchIn> listByCreatedBy(Long createdBy);
+
+    /**
+     * 新增或更新打卡结算任务
+     * @param punchIn
+     */
+    void insertOrUpdate(PunchIn punchIn);
+
+    /**
+     * 根据主键删除打卡结算任务
+     * @param punchInId
+     */
+    void delete(Long punchInId);
+}

+ 18 - 0
src/main/java/com/punchsettle/server/atomic/service/IUserClaimRewardRecordService.java

@@ -0,0 +1,18 @@
+package com.punchsettle.server.atomic.service;
+
+import com.punchsettle.server.atomic.entity.UserClaimRewardRecord;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 领取奖励记录表 service
+ * @date 2024/11/25 22:13
+ */
+public interface IUserClaimRewardRecordService {
+
+    /**
+     * 新增领取奖励记录
+     * @param record
+     */
+    void insert(UserClaimRewardRecord record);
+}

+ 25 - 0
src/main/java/com/punchsettle/server/atomic/service/IUserRewardService.java

@@ -0,0 +1,25 @@
+package com.punchsettle.server.atomic.service;
+
+import com.punchsettle.server.atomic.entity.UserReward;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户奖励数据表 service
+ * @date 2024/11/25 22:10
+ */
+public interface IUserRewardService {
+
+    /**
+     * 根据当前用户获取用户奖励数
+     * @param currentUserId 当前用户id
+     * @return
+     */
+    UserReward getByUserId(Long currentUserId);
+
+    /**
+     * 更新用户奖励数
+     * @param userReward
+     */
+    void updateReward(UserReward userReward);
+}

+ 26 - 0
src/main/java/com/punchsettle/server/atomic/service/IUserService.java

@@ -0,0 +1,26 @@
+package com.punchsettle.server.atomic.service;
+
+import com.punchsettle.server.atomic.entity.User;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户表 service
+ * @date 2024/11/25 12:30
+ */
+public interface IUserService {
+
+    /**
+     * 根据ID查找用户
+     * @param id
+     * @return
+     */
+    User getById(Long id);
+
+    /**
+     * 获取ID获取用户,不存在时新增
+     * @param openId 微信openid
+     * @return
+     */
+    User getAndAdd(String openId);
+}

+ 54 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInRecordServiceImpl.java

@@ -0,0 +1,54 @@
+package com.punchsettle.server.atomic.service.impl;
+
+import com.punchsettle.server.atomic.entity.PunchInRecord;
+import com.punchsettle.server.atomic.mapper.PunchInRecordMapper;
+import com.punchsettle.server.atomic.service.IPunchInRecordService;
+import com.punchsettle.server.dto.PunchInRecordQuery;
+import io.micrometer.common.util.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡任务记录表 service
+ * @date 2024/11/25 15:34
+ */
+@Service
+public class PunchInRecordServiceImpl implements IPunchInRecordService {
+
+    @Autowired
+    private PunchInRecordMapper punchInRecordMapper;
+
+    @Override
+    public void insert(PunchInRecord record) {
+        if (Objects.isNull(record)) {
+            return;
+        }
+
+        punchInRecordMapper.insertSelective(record);
+    }
+
+    @Override
+    public List<PunchInRecord> listByCondition(PunchInRecordQuery query) {
+        if (Objects.isNull(query)) {
+            return List.of();
+        }
+
+        Weekend<PunchInRecord> weekend = Weekend.of(PunchInRecord.class);
+        WeekendCriteria<PunchInRecord, Object> criteria = weekend.weekendCriteria();
+        if (StringUtils.isNotBlank(query.getStartDate()) && StringUtils.isNotBlank(query.getEndDate())) {
+            criteria.andBetween(PunchInRecord::getPunchInTime, query.getStartDate(), query.getEndDate());
+        }
+        if (!CollectionUtils.isEmpty(query.getPunchInIds())) {
+            criteria.andIn(PunchInRecord::getPunchInId, query.getPunchInIds());
+        }
+        return punchInRecordMapper.selectByExample(weekend);
+    }
+}

+ 52 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInServiceImpl.java

@@ -0,0 +1,52 @@
+package com.punchsettle.server.atomic.service.impl;
+
+import com.punchsettle.server.atomic.entity.PunchIn;
+import com.punchsettle.server.atomic.mapper.PunchInMapper;
+import com.punchsettle.server.atomic.service.IPunchInService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡任务表 service
+ * @date 2024/11/25 15:07
+ */
+@Service
+public class PunchInServiceImpl implements IPunchInService {
+
+    @Autowired
+    private PunchInMapper punchInMapper;
+
+    @Override
+    public List<PunchIn> listByCreatedBy(Long createdBy) {
+        if (Objects.isNull(createdBy)) {
+            return List.of();
+        }
+
+        PunchIn query = new PunchIn();
+        query.setCreatedBy(createdBy);
+        return punchInMapper.select(query);
+    }
+
+    @Override
+    public void insertOrUpdate(PunchIn punchIn) {
+        if (Objects.isNull(punchIn)) {
+            return;
+        }
+
+        punchInMapper.save(punchIn);
+    }
+
+    @Override
+    public void delete(Long punchInId) {
+        if (Objects.isNull(punchInId)) {
+            return;
+        }
+
+        punchInMapper.deleteByPrimaryKey(punchInId);
+    }
+}

+ 31 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/UserClaimRewardRecordServiceImpl.java

@@ -0,0 +1,31 @@
+package com.punchsettle.server.atomic.service.impl;
+
+import com.punchsettle.server.atomic.entity.UserClaimRewardRecord;
+import com.punchsettle.server.atomic.mapper.UserClaimRewardRecordMapper;
+import com.punchsettle.server.atomic.service.IUserClaimRewardRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 领取奖励记录表 service
+ * @date 2024/11/25 22:18
+ */
+@Service
+public class UserClaimRewardRecordServiceImpl implements IUserClaimRewardRecordService {
+
+    @Autowired
+    private UserClaimRewardRecordMapper userClaimRewardRecordMapper;
+
+    @Override
+    public void insert(UserClaimRewardRecord record) {
+        if (Objects.isNull(record)) {
+            return;
+        }
+
+        userClaimRewardRecordMapper.insertSelective(record);
+    }
+}

+ 39 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/UserRewardServiceImpl.java

@@ -0,0 +1,39 @@
+package com.punchsettle.server.atomic.service.impl;
+
+import com.punchsettle.server.atomic.entity.UserReward;
+import com.punchsettle.server.atomic.mapper.UserRewardMapper;
+import com.punchsettle.server.atomic.service.IUserRewardService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户奖励数据表 service
+ * @date 2024/11/25 22:14
+ */
+@Service
+public class UserRewardServiceImpl implements IUserRewardService {
+
+    @Autowired
+    private UserRewardMapper userRewardMapper;
+
+    @Override
+    public UserReward getByUserId(Long currentUserId) {
+        if (Objects.isNull(currentUserId)) {
+            return null;
+        }
+        return userRewardMapper.selectByPrimaryKey(currentUserId);
+    }
+
+    @Override
+    public void updateReward(UserReward userReward) {
+        if(Objects.isNull(userReward)) {
+            return;
+        }
+
+        userRewardMapper.save(userReward);
+    }
+}

+ 42 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/UserServiceImpl.java

@@ -0,0 +1,42 @@
+package com.punchsettle.server.atomic.service.impl;
+
+import com.punchsettle.server.atomic.entity.User;
+import com.punchsettle.server.atomic.mapper.UserMapper;
+import com.punchsettle.server.atomic.service.IUserService;
+import io.micrometer.common.util.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户表 service
+ * @date 2024/11/25 12:30
+ */
+@Service
+public class UserServiceImpl implements IUserService {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Override
+    public User getById(Long id) {
+        if (Objects.isNull(id)) {
+            return null;
+        }
+        return userMapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public User getAndAdd(String openId) {
+        if (StringUtils.isBlank(openId)) {
+            return null;
+        }
+
+        User queryUser = new User();
+        queryUser.setOpenId(openId);
+        return userMapper.selectOne(queryUser);
+    }
+}

+ 46 - 27
src/main/java/com/punchsettle/server/core/interceptor/AuthInterceptor.java

@@ -1,48 +1,67 @@
 package com.punchsettle.server.core.interceptor;
 
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.extern.slf4j.Slf4j;
+import java.util.Map;
+import java.util.Objects;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.HandlerInterceptor;
 
+import com.auth0.jwt.interfaces.Claim;
+import com.punchsettle.server.atomic.entity.User;
+import com.punchsettle.server.atomic.service.IUserService;
+import com.punchsettle.server.common.exception.BusinessException;
+import com.punchsettle.server.common.exception.LoginException;
+import com.punchsettle.server.utiis.TokenUtils;
+import com.punchsettle.server.utiis.UserUtils;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+
 /**
+ * @author ChenYL
+ * @version V1.0
  * @className AuthInterceptor
  * @description 登录权限拦截
- * @author ChenYL
  * @date 2023/07/29 16:22
- * @version V1.0
  **/
 @Slf4j
 @Component
 public class AuthInterceptor implements HandlerInterceptor {
 
-//    @Autowired
-//    private IWechatUserService wechatUserService;
+    @Autowired
+    private IUserService userService;
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
-        throws Exception {
-
-        // String token = request.getHeader("Authorization");
-        // if (!StringUtils.hasText(token)) {
-        // throw LoginException.fail("登录校验异常,原因:没有token凭据");
-        // }
-        //
-        // Long userId = null;
-        // try {
-        // Map<String, Claim> verify = TokenUtils.verify(token);
-        // userId = verify.get("userId").asLong();
-        // } catch (Exception e) {
-        // log.error("登录校验异常,token:{}", token, e);
-        // throw LoginException.fail("登录校验异常");
-        // }
-        //
-        // WechatUserDto wechatUserDto = wechatUserService.getById(userId);
-        // if (wechatUserDto == null) {
-        // throw BusinessException.fail("不存在的用户");
-        // }
+            throws Exception {
+
+        // 判断请求头中是否有token
+        String token = request.getHeader("Authorization");
+        if (!StringUtils.hasText(token)) {
+            throw LoginException.fail("登录校验异常,原因:没有token凭据");
+        }
+
+        // token解析获取用户ID
+        Long currentUserId = null;
+        try {
+            Map<String, Claim> verify = TokenUtils.verify(token);
+            currentUserId = verify.get("userId").asLong();
+        } catch (Exception e) {
+            log.error("登录校验异常,token:{}", token, e);
+            throw LoginException.fail("登录校验异常");
+        }
+
+        // 校验系统中是否存在该用户
+        User currentUser = userService.getById(currentUserId);
+        if (Objects.isNull(currentUser)) {
+            throw BusinessException.fail("不存在的用户");
+        }
+
+        // 把用户信息设置如入上下文
+        UserUtils.setCurrentId(currentUser.getId());
 
         return true;
     }

+ 2 - 1
src/main/java/com/punchsettle/server/core/interceptor/MybatisAuditDataInterceptor.java

@@ -43,7 +43,7 @@ public class MybatisAuditDataInterceptor implements Interceptor {
         /**
          * 插入或更新的时候,赋予createBy、updateBy、creationTime、lastUpdateTime值
          */
-        Long currentUserId = Optional.ofNullable(UserUtils.getCurrentId()).orElse(1L);
+        Long currentUserId = Optional.ofNullable(UserUtils.getCurrentUserId()).orElse(1L);
         Timestamp currentTime = new Timestamp(System.currentTimeMillis());
 
         // 识别SQL类型,看是INSERT还是UPDATE
@@ -99,6 +99,7 @@ public class MybatisAuditDataInterceptor implements Interceptor {
         entity.setLastUpdatedBy(currentUserId);
         entity.setLastUpdateTime(currentTime);
         entity.setVersion(1);
+        entity.setDeleteFlag(false);
     }
 
     /**

+ 20 - 0
src/main/java/com/punchsettle/server/dto/ClaimRewardDto.java

@@ -0,0 +1,20 @@
+package com.punchsettle.server.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 领取结算奖励 dto
+ * @date 2024/11/25 19:42
+ */
+@Data
+@EqualsAndHashCode
+public class ClaimRewardDto {
+
+    /**
+     * 领取奖励数
+     */
+    private Integer claimRewardNum;
+}

+ 50 - 0
src/main/java/com/punchsettle/server/dto/PunchInDto.java

@@ -0,0 +1,50 @@
+package com.punchsettle.server.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡结算任务信息 dto
+ * @date 2024/11/25 15:01
+ */
+@Data
+@EqualsAndHashCode
+public class PunchInDto {
+
+    /**
+     * 打卡结算主键
+     */
+    private Long id;
+
+    /**
+     * 版本号
+     */
+    private Integer version;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
+    /**
+     * 奖励倍数
+     */
+    private Integer rewardNum;
+
+    /**
+     * 是否启用周末双倍标志(0-不是,1-是)
+     */
+    private Boolean weekendDoubleFlag;
+
+    /**
+     * 是否启用全勤奖励标志(0-不是,1-是)
+     */
+    private Boolean fullAttendanceFlag;
+
+    /**
+     * 是否归档标志(0-不是,1-是)
+     */
+    private Boolean archiveFlag;
+}

+ 25 - 0
src/main/java/com/punchsettle/server/dto/PunchInRecordDto.java

@@ -0,0 +1,25 @@
+package com.punchsettle.server.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡记录
+ * @date 2024/11/25 16:24
+ */
+@Data
+@EqualsAndHashCode
+public class PunchInRecordDto {
+
+    /**
+     * 打卡日期
+     */
+    private String punchInDate;
+
+    /**
+     * 打卡状态(1-待打卡,2-完成、3-未完成)
+     */
+    private Integer punchInStatus;
+}

+ 32 - 0
src/main/java/com/punchsettle/server/dto/PunchInRecordQuery.java

@@ -0,0 +1,32 @@
+package com.punchsettle.server.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡记录查询 dto
+ * @date 2024/11/25 16:09
+ */
+@Data
+@EqualsAndHashCode
+public class PunchInRecordQuery {
+
+    /**
+     * 打卡任务主键
+     */
+    private List<Long> punchInIds;
+
+    /**
+     * 查询日期范围-开始日期
+     */
+    private String startDate;
+
+    /**
+     * 查询日期范围-结束日期
+     */
+    private String endDate;
+}

+ 50 - 0
src/main/java/com/punchsettle/server/dto/PunchInWithRecordDto.java

@@ -0,0 +1,50 @@
+package com.punchsettle.server.dto;
+
+import java.util.List;
+
+import lombok.Data;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡任务并带有打卡记录信息 dto
+ * @date 2024/11/25 15:41
+ */
+@Data
+public class PunchInWithRecordDto {
+
+    /**
+     * 打卡任务主键
+     */
+    private Long punchInId;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
+    /**
+     * 奖励倍数
+     */
+    private Integer rewardNum;
+
+    /**
+     * 是否启用周末双倍标志(0-不是,1-是)
+     */
+    private Boolean weekendDoubleFlag;
+
+    /**
+     * 是否启用全勤奖励标志(0-不是,1-是)
+     */
+    private Boolean fullAttendanceFlag;
+
+    /**
+     * 是否归档标志(0-不是,1-是)
+     */
+    private Boolean archiveFlag;
+
+    /**
+     * 打卡记录
+     */
+    private List<PunchInRecordDto> punchInRecords;
+}

+ 18 - 0
src/main/java/com/punchsettle/server/dto/UserRewardDto.java

@@ -0,0 +1,18 @@
+package com.punchsettle.server.dto;
+
+import lombok.Data;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2024/11/25 20:55
+ */
+@Data
+public class UserRewardDto {
+
+    /**
+     * 未领取奖励数
+     */
+    private Integer unclaimedRewardNum;
+}

+ 26 - 0
src/main/java/com/punchsettle/server/service/controller/PunchInController.java

@@ -0,0 +1,26 @@
+package com.punchsettle.server.service.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡结算任务
+ * @date 2024/11/25 14:48
+ */
+@RestController
+@RequestMapping("/punchIn")
+public class PunchInController {
+
+    // 查询
+    @GetMapping("/query")
+    public void query() {
+//        return null;
+    }
+//    新建任务
+//    编辑任务
+//    删除任务
+//    用户完成任务
+}

+ 2 - 2
src/main/java/com/punchsettle/server/service/controller/WechatMiniProgramController.java

@@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.RestController;
 public class WechatMiniProgramController {
 
     @Autowired
-    private IWechatMiniProgramManager weChatMiniProgramManager;
+    private IWechatMiniProgramManager wechatMiniProgramManager;
 
     /**
      * 微信小程序登录
@@ -30,6 +30,6 @@ public class WechatMiniProgramController {
      */
     @PostMapping("/login")
     public String login(@RequestBody LoginRequest request) {
-        return weChatMiniProgramManager.login(request);
+        return wechatMiniProgramManager.login(request);
     }
 }

+ 39 - 0
src/main/java/com/punchsettle/server/service/manager/IPunchInManager.java

@@ -0,0 +1,39 @@
+package com.punchsettle.server.service.manager;
+
+import com.punchsettle.server.dto.PunchInDto;
+import com.punchsettle.server.dto.PunchInWithRecordDto;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡结算任务 服务类
+ * @date 2024/11/25 15:00
+ */
+public interface IPunchInManager {
+
+    /**
+     * 查询打卡任务及其打卡记录
+     * @return
+     */
+    List<PunchInWithRecordDto> queryPunchInAndRecord();
+
+    /**
+     * 新增或更新打卡结算任务
+     * @param dto 打卡结算
+     */
+    void saveOrUpdatePunchIn(PunchInDto dto);
+
+    /**
+     * 根据主键删除打卡结算任务
+     * @param punchInId 主键
+     */
+    void deletePunchIn(Long punchInId);
+
+    /**
+     * 完成打卡结算任务插入打卡记录
+     * @param punchInId 主键
+     */
+    void doPunchIn(Long punchInId);
+}

+ 25 - 0
src/main/java/com/punchsettle/server/service/manager/IRewardManager.java

@@ -0,0 +1,25 @@
+package com.punchsettle.server.service.manager;
+
+import com.punchsettle.server.dto.ClaimRewardDto;
+import com.punchsettle.server.dto.UserRewardDto;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 奖励服务类
+ * @date 2024/11/25 20:52
+ */
+public interface IRewardManager {
+
+    /**
+     * 领取奖励
+     * @param dto
+     */
+    void claimReward(ClaimRewardDto dto);
+
+    /**
+     * 查询当前用户拥有的奖励数
+     * @return
+     */
+    UserRewardDto queryReward();
+}

+ 135 - 0
src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerImpl.java

@@ -0,0 +1,135 @@
+package com.punchsettle.server.service.manager.impl;
+
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import com.punchsettle.server.atomic.entity.PunchIn;
+import com.punchsettle.server.atomic.entity.PunchInRecord;
+import com.punchsettle.server.atomic.service.IPunchInRecordService;
+import com.punchsettle.server.atomic.service.IPunchInService;
+import com.punchsettle.server.common.exception.BusinessException;
+import com.punchsettle.server.dto.PunchInDto;
+import com.punchsettle.server.dto.PunchInRecordDto;
+import com.punchsettle.server.dto.PunchInRecordQuery;
+import com.punchsettle.server.dto.PunchInWithRecordDto;
+import com.punchsettle.server.service.manager.IPunchInManager;
+import com.punchsettle.server.utiis.DateUtils;
+import com.punchsettle.server.utiis.UserUtils;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡结算任务 服务类
+ * @date 2024/11/25 15:12
+ */
+@Slf4j
+public class PunchInManagerImpl implements IPunchInManager {
+
+    @Autowired
+    private IPunchInService punchInService;
+
+    @Autowired
+    private IPunchInRecordService punchInRecordService;
+
+    @Override
+    public List<PunchInWithRecordDto> queryPunchInAndRecord() {
+        Long currentUserId = UserUtils.getCurrentUserId();
+        if (Objects.isNull(currentUserId)) {
+            throw BusinessException.fail("无法获取当前用户信息,无法查询打卡任务");
+        }
+        // 查询打卡任务
+        List<PunchIn> punchIns = punchInService.listByCreatedBy(currentUserId);
+        if (CollectionUtils.isEmpty(punchIns)) {
+            log.info("用户:{} 没有查询到生效的打卡任务");
+            return List.of();
+        }
+
+        List<PunchInWithRecordDto> punchInWithRecordDtos = punchIns.stream().map(v -> {
+            PunchInWithRecordDto dto = new PunchInWithRecordDto();
+            BeanUtils.copyProperties(v, dto);
+            dto.setPunchInId(v.getId());
+            return dto;
+        }).collect(Collectors.toList());
+
+        // 获取一周的起始日期范围,找出范围内的打卡记录
+        List<String> weeklyDateRange = DateUtils.getWeeklyDateRangeStr();
+        String startDate = weeklyDateRange.getFirst();
+        String endDate = weeklyDateRange.getLast();
+        // 获取打卡任务ID
+        List<Long> punchInIds = punchIns.stream().map(PunchIn::getId).collect(Collectors.toList());
+
+        PunchInRecordQuery query = new PunchInRecordQuery();
+        query.setPunchInIds(punchInIds);
+        query.setStartDate(startDate);
+        query.setEndDate(endDate);
+        List<PunchInRecord> punchInRecords = punchInRecordService.listByCondition(query);
+
+        // 按打卡任务任务分组
+        Map<Long, List<PunchInRecord>> recordMap =
+            punchInRecords.stream().collect(Collectors.groupingBy(PunchInRecord::getPunchInId));
+        // 构建打卡记录
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        for (PunchInWithRecordDto dto : punchInWithRecordDtos) {
+            List<PunchInRecord> records = Optional.ofNullable(recordMap.get(dto.getPunchInId())).orElse(List.of());
+            Map<Object, Integer> punchInDateMap =
+                records.stream().collect(Collectors.toMap(record -> sdf.format(record.getPunchInTime()),
+                    PunchInRecord::getPunchInStatus, (key1, key2) -> key1));
+            // 构建打卡记录
+            List<PunchInRecordDto> punchInRecordDtoList = weeklyDateRange.stream().map(punchInDate -> {
+                PunchInRecordDto punchInRecordDto = new PunchInRecordDto();
+                Integer punchInStatus = punchInDateMap.get(punchInDate);
+                punchInRecordDto.setPunchInDate(punchInDate);
+                punchInRecordDto.setPunchInStatus(punchInStatus);
+                return punchInRecordDto;
+            }).collect(Collectors.toList());
+
+            dto.setPunchInRecords(punchInRecordDtoList);
+        }
+
+        return punchInWithRecordDtos;
+    }
+
+    @Override
+    public void saveOrUpdatePunchIn(PunchInDto dto) {
+        if (Objects.isNull(dto)) {
+            throw BusinessException.fail("请传入任务信息");
+        }
+        PunchIn punchIn = new PunchIn();
+        BeanUtils.copyProperties(dto, punchIn);
+        punchInService.insertOrUpdate(punchIn);
+    }
+
+    @Override
+    public void deletePunchIn(Long punchInId) {
+        if (Objects.isNull(punchInId)) {
+            throw BusinessException.fail("请传入待删除的任务");
+        }
+        punchInService.delete(punchInId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void doPunchIn(Long punchInId) {
+        if (Objects.isNull(punchInId)) {
+            throw BusinessException.fail("请传入待打卡的任务");
+        }
+
+        // 创建打卡记录
+        PunchInRecord punchInRecord = new PunchInRecord();
+        punchInRecord.setPunchInId(punchInId);
+        punchInRecord.setPunchInTime(new Timestamp(System.currentTimeMillis()));
+        punchInRecordService.insert(punchInRecord);
+    }
+}

+ 24 - 0
src/main/java/com/punchsettle/server/service/manager/impl/RewardManagerImpl.java

@@ -0,0 +1,24 @@
+package com.punchsettle.server.service.manager.impl;
+
+import com.punchsettle.server.dto.ClaimRewardDto;
+import com.punchsettle.server.dto.UserRewardDto;
+import com.punchsettle.server.service.manager.IRewardManager;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 奖励 服务类
+ * @date 2024/11/25 20:59
+ */
+public class RewardManagerImpl implements IRewardManager {
+
+    @Override
+    public void claimReward(ClaimRewardDto dto) {
+
+    }
+
+    @Override
+    public UserRewardDto queryReward() {
+        return null;
+    }
+}

+ 12 - 14
src/main/java/com/punchsettle/server/service/manager/impl/WechatMiniProgramManagerImpl.java

@@ -1,6 +1,8 @@
 package com.punchsettle.server.service.manager.impl;
 
 
+import com.punchsettle.server.atomic.entity.User;
+import com.punchsettle.server.atomic.service.IUserService;
 import com.punchsettle.server.common.exception.BusinessException;
 import com.punchsettle.server.core.config.BizConfig;
 import com.punchsettle.server.constant.CacheConstant;
@@ -28,17 +30,15 @@ public class WechatMiniProgramManagerImpl implements IWechatMiniProgramManager {
     @Autowired
     private WechatMiniProgramFeign wechatMiniProgramFeign;
 
-//    @Autowired
-//    private IWechatUserService wechatUserService;
-
     @Autowired
-    private CacheManager cacheManager;
+    private IUserService userService;
 
     @Autowired
     private BizConfig bizConfig;
 
     @Override
     public String login(LoginRequest request) {
+        // 从微信获取session_key
         Code2SessionRequest code2SessionRequest = new Code2SessionRequest();
         code2SessionRequest.setGrantType("authorization_code");
         code2SessionRequest.setJsCode(request.getCode());
@@ -48,22 +48,20 @@ public class WechatMiniProgramManagerImpl implements IWechatMiniProgramManager {
         }
 
         // 获取用户记录
-//        WechatUser wechatUser = wechatUserService.getAndAdd(loginResponse.getOpenId());
-//        if (wechatUser == null) {
-//            throw BusinessException.fail(String.format("不存在的用户,且无法新增,openid: %s", loginResponse.getOpenId()));
-//        }
+        User user = userService.getAndAdd(loginResponse.getOpenId());
+        if (user == null) {
+            throw BusinessException.fail(String.format("不存在的用户,且无法新增,openid: %s", loginResponse.getOpenId()));
+        }
 
         // 缓存微信用户对应的session_key
-        CacheUtils.put(CacheConstant.WECHAT_MINI_PROGRAM_SESSION_KEY, loginResponse.getOpenId(),
+        CacheUtils.put(CacheConstant.WECHAT_MINI_PROGRAM_SESSION_KEY, user.getId().toString(),
             loginResponse.getSessionKey());
 
-        // 创建token并缓存
+        // 创建token
         Calendar instance = Calendar.getInstance();
         instance.add(Calendar.DATE, bizConfig.getTokenExpire());
-//        String token = TokenUtils.createToken(wechatUser.getId(), instance.getTime());
-//        CacheUtils.put(CacheConstant.SYSTEM_USER_TOKEN, loginResponse.getOpenId(), token);
+        String token = TokenUtils.createToken(user.getId(), instance.getTime());
 
-//        return token;
-        return null;
+        return token;
     }
 }

+ 35 - 0
src/main/java/com/punchsettle/server/utiis/DateUtils.java

@@ -0,0 +1,35 @@
+package com.punchsettle.server.utiis;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 日期工具
+ * @date 2024/11/25 15:51
+ */
+public class DateUtils {
+
+    /**
+     * 获取一周的时间范围
+     * @return 返回日期字符串列表
+     */
+    public static List<String> getWeeklyDateRangeStr() {
+        LocalDate today = LocalDate.now();
+
+        // 获取本周的第一天(假设周一为一周的第一天)
+        LocalDate firstDayOfWeek = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+
+        // 打印本周的所有日期
+        List<String> list = new ArrayList<>(7);
+        for (int i = 0; i < 7; i++) {
+            LocalDate date = firstDayOfWeek.plusDays(i);
+            list.add(date.toString());
+        }
+        return list;
+    }
+}

+ 1 - 1
src/main/java/com/punchsettle/server/utiis/UserUtils.java

@@ -22,7 +22,7 @@ public class UserUtils {
      * 获取当前用户的ID
      * @return
      */
-    public static Long getCurrentId() {
+    public static Long getCurrentUserId() {
         return threadLocal.get();
     }
 }