Explorar o código

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ScreenshotServiceImpl.java
Reiskuchen %!s(int64=5) %!d(string=hai) anos
pai
achega
8bb700d649
Modificáronse 19 ficheiros con 272 adicións e 204 borrados
  1. 41 83
      fhKeeper/.idea/workspace.xml
  2. 8 0
      fhKeeper/formulahousekeeper/.gitignore
  3. 8 7
      fhKeeper/formulahousekeeper/inva_4_tivo/index.html
  4. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java
  5. 3 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java
  6. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java
  7. 36 31
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ScreenshotServiceImpl.java
  8. 43 29
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  9. 12 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ImageReconizeUtil.java
  10. 2 3
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml
  11. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  12. 2 1
      fhKeeper/formulahousekeeper/mywork/home.cpp
  13. 4 0
      fhKeeper/formulahousekeeper/mywork/mainwindow.cpp
  14. 1 2
      fhKeeper/formulahousekeeper/mywork/mainwindow.h
  15. 13 0
      fhKeeper/formulahousekeeper/mywork/mainwindow.ui
  16. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/routes.js
  17. 14 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue
  18. 73 24
      fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue
  19. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

+ 41 - 83
fhKeeper/.idea/workspace.xml

@@ -1,15 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ChangeListManager">
-    <list default="true" id="cb73d8d0-9c49-4c8b-8fdc-51c4a9bc4409" name="Default Changelist" comment="官网修改">
-      <change beforePath="$PROJECT_DIR$/.idea/compiler.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/compiler.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java" beforeDir="false" afterPath="$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java" beforeDir="false" afterPath="$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/CodeGenerator.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml" afterDir="false" />
-    </list>
+    <list default="true" id="cb73d8d0-9c49-4c8b-8fdc-51c4a9bc4409" name="Default Changelist" comment="" />
     <ignored path="$PROJECT_DIR$/formulahousekeeper/target/" />
     <ignored path="$PROJECT_DIR$/formulahousekeeper/management-platform/target/" />
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
@@ -29,8 +21,8 @@
       <file pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="301">
-              <caret line="47" column="34" lean-forward="true" selection-start-line="47" selection-start-column="34" selection-end-line="47" selection-end-column="34" />
+            <state relative-caret-position="228">
+              <caret line="47" column="36" lean-forward="true" selection-start-line="47" selection-start-column="36" selection-end-line="47" selection-end-column="36" />
             </state>
           </provider>
         </entry>
@@ -38,7 +30,7 @@
       <file pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="208">
+            <state relative-caret-position="195">
               <caret line="20" column="16" selection-start-line="20" selection-start-column="16" selection-end-line="20" selection-end-column="16" />
             </state>
           </provider>
@@ -47,8 +39,8 @@
       <file pinned="false" current-in-tab="true">
         <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1031">
-              <caret line="125" column="13" selection-start-line="125" selection-start-column="13" selection-end-line="125" selection-end-column="13" />
+            <state relative-caret-position="306">
+              <caret line="120" column="52" lean-forward="true" selection-start-line="120" selection-start-column="52" selection-end-line="120" selection-end-column="52" />
             </state>
           </provider>
         </entry>
@@ -187,7 +179,7 @@
       <select />
     </treeState>
   </component>
-  <component name="ProjectFrameBounds" extendedState="6">
+  <component name="ProjectFrameBounds" extendedState="7">
     <option name="x" value="200" />
     <option name="y" value="150" />
     <option name="width" value="1190" />
@@ -263,48 +255,6 @@
               <item name="platform" type="462c0819:PsiDirectoryNode" />
               <item name="controller" type="462c0819:PsiDirectoryNode" />
             </path>
-            <path>
-              <item name="fhKeeper" type="b2602c69:ProjectViewProjectNode" />
-              <item name="fhKeeper" type="462c0819:PsiDirectoryNode" />
-              <item name="formulahousekeeper" type="462c0819:PsiDirectoryNode" />
-              <item name="management-platform" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="platform" type="462c0819:PsiDirectoryNode" />
-              <item name="entity" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="fhKeeper" type="b2602c69:ProjectViewProjectNode" />
-              <item name="fhKeeper" type="462c0819:PsiDirectoryNode" />
-              <item name="formulahousekeeper" type="462c0819:PsiDirectoryNode" />
-              <item name="management-platform" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="java" type="462c0819:PsiDirectoryNode" />
-              <item name="platform" type="462c0819:PsiDirectoryNode" />
-              <item name="entity" type="462c0819:PsiDirectoryNode" />
-              <item name="vo" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="fhKeeper" type="b2602c69:ProjectViewProjectNode" />
-              <item name="fhKeeper" type="462c0819:PsiDirectoryNode" />
-              <item name="formulahousekeeper" type="462c0819:PsiDirectoryNode" />
-              <item name="management-platform" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="resources" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="fhKeeper" type="b2602c69:ProjectViewProjectNode" />
-              <item name="fhKeeper" type="462c0819:PsiDirectoryNode" />
-              <item name="formulahousekeeper" type="462c0819:PsiDirectoryNode" />
-              <item name="management-platform" type="462c0819:PsiDirectoryNode" />
-              <item name="src" type="462c0819:PsiDirectoryNode" />
-              <item name="main" type="462c0819:PsiDirectoryNode" />
-              <item name="resources" type="462c0819:PsiDirectoryNode" />
-              <item name="mapper" type="462c0819:PsiDirectoryNode" />
-            </path>
           </expand>
           <select />
         </subPane>
@@ -353,7 +303,7 @@
       </list>
     </option>
   </component>
-  <component name="RunManager" selected="Application.CodeGenerator">
+  <component name="RunManager" selected="Spring Boot.PlatformStartApplication">
     <configuration name="AuthService" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
       <option name="MAIN_CLASS_NAME" value="com.management.platform.util.AuthService" />
       <module name="management-platform" />
@@ -438,8 +388,8 @@
     </list>
     <recent_temporary>
       <list>
-        <item itemvalue="Application.CodeGenerator" />
         <item itemvalue="Spring Boot.PlatformStartApplication" />
+        <item itemvalue="Application.CodeGenerator" />
         <item itemvalue="JUnit.TestApplicationTests.contextLoads" />
         <item itemvalue="JUnit.TestApplicationTests" />
         <item itemvalue="Application.AuthService" />
@@ -466,7 +416,7 @@
       <workItem from="1580712530176" duration="1479000" />
       <workItem from="1580714920655" duration="1048000" />
       <workItem from="1580716496483" duration="548000" />
-      <workItem from="1580802425044" duration="3235000" />
+      <workItem from="1580802425044" duration="6364000" />
     </task>
     <task id="LOCAL-00001" summary="构建">
       <created>1577760711854</created>
@@ -559,7 +509,14 @@
       <option name="project" value="LOCAL" />
       <updated>1580714103728</updated>
     </task>
-    <option name="localTasksCounter" value="14" />
+    <task id="LOCAL-00014" summary="添加公司用户注册的时候,三天试用时间,修改登录逻辑,检测会员是否到期。修改数据库company的字段">
+      <created>1580805783046</created>
+      <option name="number" value="00014" />
+      <option name="presentableId" value="LOCAL-00014" />
+      <option name="project" value="LOCAL" />
+      <updated>1580805783046</updated>
+    </task>
+    <option name="localTasksCounter" value="15" />
     <servers />
   </component>
   <component name="TestHistory">
@@ -586,13 +543,13 @@
     </history-entry>
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="30344000" />
+    <option name="totallyTimeSpent" value="33473000" />
   </component>
   <component name="ToolWindowManager">
-    <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
+    <frame x="-8" y="-8" width="1936" height="1056" extended-state="7" />
     <editor active="true" />
     <layout>
-      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.18923241" />
+      <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.18923241" />
       <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
       <window_info id="Designer" order="2" />
       <window_info id="JRebel" order="3" side_tool="true" />
@@ -603,7 +560,7 @@
       <window_info id="Web" order="8" side_tool="true" />
       <window_info anchor="bottom" id="Message" order="0" />
       <window_info anchor="bottom" id="Find" order="1" weight="0.32890365" />
-      <window_info anchor="bottom" id="Run" order="2" sideWeight="0.49840087" weight="0.37635574" />
+      <window_info anchor="bottom" id="Run" order="2" sideWeight="0.4978678" weight="0.30585682" />
       <window_info anchor="bottom" id="Debug" order="3" weight="0.2978959" />
       <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
       <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
@@ -611,10 +568,10 @@
       <window_info anchor="bottom" id="Spring" order="7" />
       <window_info anchor="bottom" id="Terminal" order="8" />
       <window_info anchor="bottom" id="Docker" order="9" show_stripe_button="false" />
-      <window_info anchor="bottom" id="Event Log" order="10" sideWeight="0.5021322" side_tool="true" visible="true" weight="0.2657267" />
+      <window_info anchor="bottom" id="Event Log" order="10" sideWeight="0.5021322" side_tool="true" weight="0.37635574" />
       <window_info anchor="bottom" id="Java Enterprise" order="11" />
       <window_info anchor="bottom" id="Database Changes" order="12" />
-      <window_info anchor="bottom" id="Version Control" order="13" sideWeight="0.4978678" visible="true" weight="0.2657267" />
+      <window_info anchor="bottom" id="Version Control" order="13" sideWeight="0.4978678" weight="0.2657267" />
       <window_info anchor="bottom" id="JRebel Executor" order="14" sideWeight="0.8566058" weight="0.45071983" />
       <window_info anchor="bottom" id="JRebel Console" order="15" sideWeight="0.50107414" side_tool="true" weight="0.2580288" />
       <window_info anchor="bottom" id="Messages" order="16" sideWeight="0.49946696" weight="0.3286334" />
@@ -622,7 +579,7 @@
       <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
       <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
       <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
-      <window_info anchor="right" id="Maven" order="3" visible="true" weight="0.09328358" />
+      <window_info active="true" anchor="right" id="Maven" order="3" visible="true" weight="0.09328358" />
       <window_info anchor="right" id="Palette" order="4" />
       <window_info anchor="right" id="Capture Analysis" order="5" />
       <window_info anchor="right" id="Maven Projects" order="6" />
@@ -656,7 +613,8 @@
     <MESSAGE value="暂停定时任务" />
     <MESSAGE value="官网修改完成" />
     <MESSAGE value="官网修改" />
-    <option name="LAST_COMMIT_MESSAGE" value="官网修改" />
+    <MESSAGE value="添加公司用户注册的时候,三天试用时间,修改登录逻辑,检测会员是否到期。修改数据库company的字段" />
+    <option name="LAST_COMMIT_MESSAGE" value="添加公司用户注册的时候,三天试用时间,修改登录逻辑,检测会员是否到期。修改数据库company的字段" />
   </component>
   <component name="editorHistoryManager">
     <entry file="file://$PROJECT_DIR$/formulahousekeeper/formulahousekeeper.iml">
@@ -872,38 +830,38 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java">
+    <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ScreenshotVO.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="301">
-          <caret line="47" column="34" lean-forward="true" selection-start-line="47" selection-start-column="34" selection-end-line="47" selection-end-column="34" />
+        <state relative-caret-position="278">
+          <caret line="14" column="31" lean-forward="true" selection-start-line="14" selection-start-column="31" selection-end-line="14" selection-end-column="31" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java">
+    <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="208">
-          <caret line="20" column="16" selection-start-line="20" selection-start-column="16" selection-end-line="20" selection-end-column="16" />
+        <state relative-caret-position="296">
+          <caret line="9" lean-forward="true" selection-start-line="9" selection-end-line="9" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ScreenshotVO.java">
+    <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="278">
-          <caret line="14" column="31" lean-forward="true" selection-start-line="14" selection-start-column="31" selection-end-line="14" selection-end-column="31" />
+        <state relative-caret-position="228">
+          <caret line="47" column="36" lean-forward="true" selection-start-line="47" selection-start-column="36" selection-end-line="47" selection-end-column="36" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java">
+    <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="296">
-          <caret line="9" lean-forward="true" selection-start-line="9" selection-end-line="9" />
+        <state relative-caret-position="195">
+          <caret line="20" column="16" selection-start-line="20" selection-start-column="16" selection-end-line="20" selection-end-column="16" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1031">
-          <caret line="125" column="13" selection-start-line="125" selection-start-column="13" selection-end-line="125" selection-end-column="13" />
+        <state relative-caret-position="306">
+          <caret line="120" column="52" lean-forward="true" selection-start-line="120" selection-start-column="52" selection-end-line="120" selection-end-column="52" />
         </state>
       </provider>
     </entry>

+ 8 - 0
fhKeeper/formulahousekeeper/.gitignore

@@ -23,3 +23,11 @@ gen
 /.idea/modules.xml
 
 target/
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen

+ 8 - 7
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -71,7 +71,7 @@
                         <div class="text-container">
                             <h1>最贴心的工时管理工具</h1>
                             <p class="p-large">工时管家利用图像识别技术,精准判断员工桌面运行软件,可统计员工每天工时分配情况,如工作、娱乐等;领导可通过后台查看员工实时桌面,并对员工异常工作状态做出提醒。</p>
-                            <a class="btn-solid-lg page-scroll" href="./download/WorkTime.exe" download="工时管家">免费下载试用</a>
+                            <a class="btn-solid-lg page-scroll" href="http://worktime.ttkuaiban.com/#/login" download="工时管家">免费试用</a>
                         </div>
                     </div>
                     <div class="col-lg-6 col-xl-7">
@@ -94,10 +94,10 @@
                 <div class="col-lg-6">
                     <div class="text-container">
                         <h2>工时管家客户端</h2>
-                        <p>工时管家客户端会截取保存员工当前桌面,通过图像分析,精准判断员工正在操作的软件,
-                            获知该员工当前的工作状态,如编程、设计、查阅资料、处理文档、玩游戏、听音乐等; 员工通过客户端可查看自己每天的工作时间段,
-                            填写工作日报,对于工时统计的异常情况,可发起异常申请。</p>
-                        <a class="btn-solid-reg page-scroll" href="./download/WorkTime.exe" download="工时管家">去下载</a>
+                        <p>工时管家客户端会截取保存员工当前桌面, 通过图像分析, 精准判断员工正在操作的软件,
+                            获知该员工当前的工作状态, 如编程、设计、查阅资料、处理文档、玩游戏、听音乐等; 员工通过客户端可查看自己每天的工作时间段,
+                            填写工作日报。</p>
+                        <a class="btn-solid-reg page-scroll" href="http://worktime.ttkuaiban.com/#/login" download="工时管家">免费试用</a>
                     </div>
                 </div>
                 <div class="col-lg-6">
@@ -120,8 +120,9 @@
                 <div class="col-lg-6">
                     <div class="text-container">
                         <h3>工时管家管理后台</h3>
-                        <p>领导通过后台可查看通过客户端所截取的员工电脑桌面图像,通过图像识别技术可对员工异常工作状态进行提醒,如玩游戏、听音乐、看影视剧等; 并对每个员工的工时进行分类统计,支持导出报表;领导可查看员工通过客户端所填写的工作日报及异常申请。</p>
-                        <a class="btn-solid-reg page-scroll" href="http://worktime.ttkuaiban.com/#/login" target="_blank">去登录</a>
+                        <p>领导通过后台可查看客户端所截取的员工电脑桌面图像, 通过图像识别技术可对员工异常工作状态进行提醒,如玩游戏、听音乐、看影视剧等;
+                            并对每个员工的工时进行分类统计,支持导出报表;支持项目管理,领导可根据项目,查看每个员工在该项目花费的工时;领导可查看员工通过客户端所填写的工作日报及异常申请。</p>
+                        <a class="btn-solid-reg page-scroll" href="http://worktime.ttkuaiban.com/#/login" target="_blank">免费试用</a>
                     </div>
                 </div>
             </div>

+ 4 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java

@@ -13,8 +13,10 @@ import java.util.List;
  */
 @Component
 public class Constant {
-    public static final String API_KEY = "gtImOYhgcFBzwuT29tB7tM0Z";//百度文字识别apiKey
-    public static final String SECRET_KEY = "RipT5kfF3Zqp7S2vTXPlNcMiYcA76jfq";//百度文字识别secretKey
+//    public static final String API_KEY = "gtImOYhgcFBzwuT29tB7tM0Z";//百度文字识别apiKey
+//    public static final String SECRET_KEY = "RipT5kfF3Zqp7S2vTXPlNcMiYcA76jfq";//百度文字识别secretKey
+    public static final String API_KEY = "UgceK95dGkVbQKicVDU9D6s2";//百度文字识别apiKey
+    public static final String SECRET_KEY = "fGCbfC9CR1v8Pf1u6kG4fM9KEXHgitAA";//百度文字识别secretKey
     public static final Integer UN_HANDLE = 0;//定时任务未处理的状态码
     public static final String PIC_PATH_PREFIX = "";//定时任务未处理的状态码
     public static final String COMMON_SOFTWARE_KEYWORDS = "keyWords";//常用软件关键字

+ 3 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author 吴涛涛
- * @since 2020-02-04
+ * @since 2020-02-05
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -40,8 +40,8 @@ public class Company extends Model<Company> {
     /**
      * 公司规模
      */
-    @TableField("staff_count")
-    private Integer staffCount;
+    @TableField("staff_count_max")
+    private Integer staffCountMax;
 
     /**
      * 会员到期时间
@@ -49,12 +49,6 @@ public class Company extends Model<Company> {
     @TableField("expiration_date")
     private LocalDateTime expirationDate;
 
-    /**
-     * 试用到期时间
-     */
-    @TableField("trial_expiration_time")
-    private LocalDateTime trialExpirationTime;
-
     /**
      * 选择的套餐(单位:/年)
      */

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserVO.java

@@ -2,8 +2,13 @@ package com.management.platform.entity.vo;
 
 import com.management.platform.entity.User;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
 
 @Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
 public class UserVO extends User {
     private String companyName;
+    private Long remainingTime;
 }

+ 36 - 31
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ScreenshotServiceImpl.java

@@ -10,6 +10,7 @@ import com.management.platform.entity.TimeCalculation;
 import com.management.platform.entity.TimeCalculationShow;
 import com.management.platform.entity.vo.ScreenshotVO;
 import com.management.platform.mapper.*;
+import com.management.platform.mapper.PicContentKeywordsMapper;
 import com.management.platform.service.ScreenshotService;
 import com.management.platform.util.*;
 import org.apache.log4j.Logger;
@@ -254,7 +255,7 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
     @Override
     public HttpRespMsg saveAndProcessImage(ScreenshotVO screenshotvo) {
         Map<String, Object> fileMap = UploadFileToFileNameUtil.uploadFile(screenshotvo.getFile(), path);
-        String filePath = (String) fileMap.get("sqlFilePath");
+        String filePath = (String)fileMap.get("sqlFilePath");
         Screenshot screenshot = new Screenshot();
         BeanUtils.copyProperties(screenshotvo, screenshot);
         screenshot.setPicUrl(filePath);
@@ -273,20 +274,24 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
 //        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 //        LocalDateTime l = LocalDateTime.parse("2019-02-03",dateTimeFormatter);
         Map<String, Object> picResultMap = CheckPicUtil.generalPicTextContentMap(path + filePath.substring("/upload/".length()), accessToken);
-        List<String> textContents = (List<String>) picResultMap.get("wordsList");
-        screenshot.setPicContext((String) picResultMap.get("picContent"));
-        Set<Object> members = new HashSet<>();
-        if (redisUtil.existsKey(Constant.COMMON_SOFTWARE_KEYWORDS)) {
-            members = redisUtil.members(Constant.COMMON_SOFTWARE_KEYWORDS);
-        } else {
-            List<PicContentKeywords> picContentKeywords = picContentKeywordsMapper.selectList(null);
-            for (PicContentKeywords keyWord : picContentKeywords) {
-                redisUtil.sSetJsonString("keyWords", keyWord);
-            }
-            //由于存入数据库的对象被序列化成了json字符串,所以从redis里拿方便
-            members = redisUtil.members(Constant.COMMON_SOFTWARE_KEYWORDS);
+        List<String> textContents = new ArrayList<String>();
+        if (picResultMap != null) {
+            textContents = (List<String>) picResultMap.get("wordsList");
+            screenshot.setPicContext((String) picResultMap.get("picContent"));
         }
-        File picFile = new File((String) fileMap.get("newFile"));
+
+//        Set<Object> members = new HashSet<>();
+//        if (redisUtil.existsKey(Constant.COMMON_SOFTWARE_KEYWORDS)) {
+//            members = redisUtil.members(Constant.COMMON_SOFTWARE_KEYWORDS);
+//        } else {
+//            List<PicContentKeywords> picContentKeywords = picContentKeywordsMapper.selectList(null);
+//            for (PicContentKeywords keyWord : picContentKeywords) {
+//                redisUtil.sSetJsonString("keyWords", keyWord);
+//            }
+//            //由于存入数据库的对象被序列化成了json字符串,所以从redis里拿方便
+//            members = redisUtil.members(Constant.COMMON_SOFTWARE_KEYWORDS);
+//        }
+        File picFile = new File((String)fileMap.get("newFile"));
         if (isNovel(textContents)) {
             screenshot.setPicType(6);
         } else if (isDocument(textContents)) {
@@ -304,7 +309,7 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
                 File f = new File(prePath);
                 if (f.exists()) {
                     ImageCompare comp = new ImageCompare();
-                    if (comp.isMoviePlay((String) fileMap.get("newFile"), prePath)) {
+                    if (comp.isMoviePlay((String)fileMap.get("newFile"), prePath)) {
                         screenshot.setPicType(7);
                         //前面那条也更新
                         if (preShot.getPicType() != null && preShot.getPicType() != 7) {
@@ -318,7 +323,7 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
         if (screenshot.getPicType() == null) {
             //默认设置为查资料
             try {
-                String browserName = isBrowser(new File((String) fileMap.get("newFile")));
+                String browserName = isBrowser(new File((String)fileMap.get("newFile")));
                 System.out.println(
                         "找到浏览器==" + browserName
                 );
@@ -339,8 +344,8 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
     @Override
     public HttpRespMsg updateRedisPicContentKeywords() {
         List<PicContentKeywords> picContentKeywords = picContentKeywordsMapper.selectList(null);
-        for (PicContentKeywords keyWord : picContentKeywords) {
-            redisUtil.sSetJsonString("keyWords", keyWord);
+        for (PicContentKeywords  keyWord : picContentKeywords) {
+            redisUtil.sSetJsonString("keyWords",keyWord);
         }
         HttpRespMsg msg = new HttpRespMsg();
         msg.data = redisUtil.members("keyWords");
@@ -418,7 +423,7 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
     }
 
     public static void main(String[] args) throws Exception {
-//        String b = isDevelop(new File("C:\\Users\\seya\\Desktop\\proj.jpg"));
+//        String b = isDevelop(new File("C:\\Users\\seya\\Desktop\\wtt.jpg"));
 //        System.out.println("结果:"+b);
     }
 
@@ -471,7 +476,7 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
                 File[] targetFile = subFolder.listFiles();
                 boolean isMatch = false;
                 for (File targetPic : targetFile) {
-                    System.out.println("targetPic==" + targetPic.getAbsolutePath());
+//                    System.out.println("targetPic==" + targetPic.getAbsolutePath());
                     boolean matchPic = ImageReconizeUtil.isTemplateMatch(pic.getAbsolutePath(), targetPic.getAbsolutePath());
                     if (matchPic) {
                         isMatch = true;
@@ -487,7 +492,7 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
         }
     }
 
-    //判断是否是浏览器
+    //判断是否是开发
     private String isDevelop(File pic) {
         File folder = new File(developFolder);
 //        File folder = new File("C:\\picrecongnize\\develop\\");
@@ -502,7 +507,7 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
             String toolName = null;
             boolean isMatch = false;
             for (File targetPic : files) {
-                System.out.println("targetPic==" + targetPic.getAbsolutePath());
+//                System.out.println("targetPic==" + targetPic.getAbsolutePath());
                 boolean matchPic = ImageReconizeUtil.isTemplateMatch(pic.getAbsolutePath(), targetPic.getAbsolutePath());
                 if (matchPic) {
                     toolName = targetPic.getName();
@@ -549,8 +554,8 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
             int height = img.getHeight();
             int minx = img.getMinX();
             int miny = img.getMinY();
-            System.out.println("width=" + width + ",height=" + height + ".");
-            System.out.println("minx=" + minx + ",miniy=" + miny + ".");
+//            System.out.println("width=" + width + ",height=" + height + ".");
+//            System.out.println("minx=" + minx + ",miniy=" + miny + ".");
             //统计出现最多的一个色值,计算所占比重
             int totalPixl = 0;
             HashMap<Integer, Integer> colorCntMap = new HashMap<Integer, Integer>();
@@ -584,12 +589,12 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
             Integer k2 = (Integer) it.next();
             Integer color1 = sMap.get(k1);
             Integer color2 = sMap.get(k2);
-            System.out.println("kkkk==" + k1 + "," + color1 + "," + k2 + "," + color2);
-            System.out.println("最.." + maxCnt + ", key=" + key);
+//            System.out.println("kkkk==" + k1 + "," + color1 + "," + k2 + "," + color2);
+//            System.out.println("最.." + maxCnt + ", key=" + key);
             rgb[0] = (key & 0xff0000) >> 16;
             rgb[1] = (key & 0xff00) >> 8;
             rgb[2] = (key & 0xff);
-            System.out.println("色值为: " + rgb[0] + ", " + rgb[1] + ", " + rgb[2]);
+//            System.out.println("色值为: " + rgb[0] + ", " + rgb[1] + ", " + rgb[2]);
             //计算比例, 应该不低于50%
             int colorPercent = maxCnt * 100 / totalPixl;
             if (colorPercent < 50) {
@@ -598,8 +603,8 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
                 rgb[0] = (color2 & 0xff0000) >> 16;
                 rgb[1] = (color2 & 0xff00) >> 8;
                 rgb[2] = (color2 & 0xff);
-                System.out.println("二级底色色值为: " + rgb[0] + ", " + rgb[1] + ", " + rgb[2]);
-                System.out.println("二级底色比例==" + secPercent);
+//                System.out.println("二级底色色值为: " + rgb[0] + ", " + rgb[1] + ", " + rgb[2]);
+//                System.out.println("二级底色比例==" + secPercent);
                 colorPercent = (k1 + k2) * 100 / totalPixl;
             }
             System.out.println("总底色比例==" + colorPercent);
@@ -616,9 +621,9 @@ public class ScreenshotServiceImpl extends ServiceImpl<ScreenshotMapper, Screens
                     }
                 }
             }
-            log.info("pureColorBlockCnt===" + pureColorBlockCnt);
+//            log.info("pureColorBlockCnt===" + pureColorBlockCnt);
             int pureColorBlackPercent = pureColorBlockCnt * 100 / totalBlockCnt;
-            log.info("pureColorBlackPercent===" + pureColorBlackPercent);
+//            log.info("pureColorBlackPercent===" + pureColorBlackPercent);
             if (colorPercent < 50 && pureColorBlackPercent < 30) {
                 return true;
             }

+ 43 - 29
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -1,6 +1,7 @@
 package com.management.platform.service.impl;
-import	java.time.LocalDateTime;
-import	java.time.LocalDate;
+
+import java.time.LocalDateTime;
+import java.time.LocalDate;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Company;
@@ -27,6 +28,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
+import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -64,27 +66,27 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             //查看该公司非会员公司,只能允许试用三天,超时不可登录
             Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", userList.get(0).getCompanyId()));
             //公司未办理会员
-            if(null != company.getTrialExpirationTime()){
-                if(0 == company.getSetMeal()){
+            if (null != company.getExpirationDate()) {
+                if (0 == company.getSetMeal()) {
                     //未办理会员
-                    if(company.getTrialExpirationTime().isBefore(LocalDateTime.now())){
-                        httpRespMsg.setError("账号试用已到期,请联系公司负责人开通会员套餐");
+                    if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
+                        httpRespMsg.setError("账号试用已到期,请联系客服。");
                         return httpRespMsg;
                     }
-                }else{
-                    if(company.getExpirationDate().isBefore(LocalDateTime.now())){
-                        if(company.getTrialExpirationTime().isBefore(LocalDateTime.now())) {
-                            httpRespMsg.setError("账号会员已到期,请联系公司负责人续费会员套餐");
-                            return httpRespMsg;
-                        }
+                } else {
+                    if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
+                        httpRespMsg.setError("账号会员已到期,请联系客服。");
+                        return httpRespMsg;
                     }
                 }
             }
             //检测密码正确时
-            UserVO userVO = new UserVO();
+            UserVO userVO = new UserVO().setCompanyName(company.getCompanyName());
             BeanUtils.copyProperties(userList.get(0), userVO);
             //还要多返回一个公司名字
-            userVO.setCompanyName(companyMapper.selectById(userVO.getCompanyId()).getCompanyName());
+            userVO.setPassword("");
+            LocalDateTime remainingTime = company.getExpirationDate() == null ? LocalDateTime.now() : company.getExpirationDate();
+            userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() - LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
             httpRespMsg.data = userVO;
         } else {
             httpRespMsg.setError("密码错误");
@@ -108,24 +110,28 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             //查看该公司非会员公司,只能允许试用三天,超时不可登录
             Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", userList.get(0).getCompanyId()));
             //公司未办理会员
-            if(null != company.getTrialExpirationTime()){
-                if(0 == company.getSetMeal()){
+            if (null != company.getExpirationDate()) {
+                if (0 == company.getSetMeal()) {
                     //未办理会员
-                    if(company.getTrialExpirationTime().isBefore(LocalDateTime.now())){
-                        httpRespMsg.setError("账号试用已到期,请联系公司负责人开通会员套餐");
+                    if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
+                        httpRespMsg.setError("账号试用已到期,请联系客服。");
                         return httpRespMsg;
                     }
-                }else{
-                    if(company.getExpirationDate().isBefore(LocalDateTime.now())){
-                        if(company.getTrialExpirationTime().isBefore(LocalDateTime.now())) {
-                            httpRespMsg.setError("账号会员已到期,请联系公司负责人续费会员套餐");
-                            return httpRespMsg;
-                        }
+                } else {
+                    if (company.getExpirationDate().isBefore(LocalDateTime.now())) {
+                        httpRespMsg.setError("账号会员已到期,请联系客服。");
+                        return httpRespMsg;
                     }
                 }
             }
             //检测密码正确时
-            httpRespMsg.data = userList.get(0);
+            UserVO userVO = new UserVO().setCompanyName(company.getCompanyName());
+            BeanUtils.copyProperties(userList.get(0), userVO);
+            //还要多返回一个公司名字
+            LocalDateTime remainingTime = company.getExpirationDate() == null ? LocalDateTime.now() : company.getExpirationDate();
+            userVO.setRemainingTime(remainingTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() - LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());
+            userVO.setPassword("");
+            httpRespMsg.data = userVO;
         } else {
             httpRespMsg.setError("密码错误");
         }
@@ -220,8 +226,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         } else {
             //首先生成一个新公司,增加会员的试用天数
             Company company = new Company().setCompanyName(companyName)
-                    .setTrialExpirationTime(LocalDateTime.now().plusDays(3));
+                    .setExpirationDate(LocalDateTime.now().plusDays(3));
             companyMapper.insert(company);
+            if (userMapper.selectCount(new QueryWrapper<User>().eq("company_id", company.getId())) >= (companyMapper.selectById(company.getId()).getStaffCountMax())) {
+                httpRespMsg.setError("公司人员已达上限");
+                return httpRespMsg;
+            }
             //然后生成一个负责人
             Long id = SnowFlake.nextId();
             User user = new User()
@@ -265,6 +275,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                                 .setPhone(phone)
                                 .setRole(role)
                                 .setCompanyId(creator.getCompanyId());
+                        if (userMapper.selectCount(new QueryWrapper<User>().eq("company_id", creator.getCompanyId())) >= (companyMapper.selectById(creator.getCompanyId()).getStaffCountMax())) {
+                            httpRespMsg.setError("公司人员已达上限");
+                            return httpRespMsg;
+                        }
                         if (userMapper.insert(user) == 0) {
                             httpRespMsg.setError("操作失败");
                         }
@@ -322,7 +336,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 XSSFCell phoneCell = row.getCell(1);
                 nameCell.setCellType(CellType.STRING);
                 phoneCell.setCellType(CellType.STRING);
-                if("姓名".equals(nameCell.getStringCellValue()) && "手机号".equals(phoneCell.getStringCellValue()) && rowIndex==0){
+                if ("姓名".equals(nameCell.getStringCellValue()) && "手机号".equals(phoneCell.getStringCellValue()) && rowIndex == 0) {
                     continue;
                 }
                 String name = nameCell.getStringCellValue();
@@ -361,10 +375,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             e.printStackTrace();
             httpRespMsg.setError("发生其他错误");
             return httpRespMsg;
-        }finally {
+        } finally {
             //关闭流
             try {
-                if(outputStream != null && inputStream != null){
+                if (outputStream != null && inputStream != null) {
                     outputStream.close();
                     inputStream.close();
                     System.out.println("流已关闭");

+ 12 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ImageReconizeUtil.java

@@ -11,7 +11,7 @@ import static java.lang.Math.E;
 import static org.opencv.imgproc.Imgproc.*;
 
 public class ImageReconizeUtil {
-    public static final double YUZHI = 1*Math.pow(0.1, 11);
+    public static final double YUZHI = 1*Math.pow(0.1, 10);
     static {
         System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
         //注意程序运行的时候需要在VM option添加该行 指明opencv的dll文件所在路径
@@ -103,16 +103,20 @@ public class ImageReconizeUtil {
 //        }
         System.out.println("匹配度=="+matchVal);
         System.out.println("x="+x+", y=" + y);
-        //我们匹配的图像在左上角,考虑到用户可能拖动窗口,但是不应该偏差很大。 这里增加判断标准:坐标需要处在第一象限
-        if (x > templete.width()/2 || y > templete.height()) {
+        //我们匹配的图像在左上角,考虑到用户可能拖动窗口,但是不应该偏差很大。 这里增加判断标准:坐标处在左上方
+        if (x > templete.width()/4 || y > templete.height()/4) {
             System.out.println("坐标非第一象限");
             return 1;
         }
-//        Imgproc.rectangle(templete,new Point(x,y),new Point(x+demo.cols(),y+demo.rows()),new Scalar( 0, 0, 255),2,Imgproc.LINE_AA);
-//        Imgproc.putText(templete,"Match Success",new Point(x,y),Imgproc.FONT_HERSHEY_SCRIPT_COMPLEX, 1.0, new Scalar(0, 255, 0),1,Imgproc.LINE_AA);
-//        // 8 显示结果
-//        HighGui.imshow("模板匹配", templete);
-//        HighGui.waitKey(0);
+
+//        if (Math.abs(matchVal) < YUZHI) {
+//            Imgproc.rectangle(templete,new Point(x,y),new Point(x+demo.cols(),y+demo.rows()),new Scalar( 0, 0, 255),2,Imgproc.LINE_AA);
+//            Imgproc.putText(templete,"Match Success",new Point(x,y),Imgproc.FONT_HERSHEY_SCRIPT_COMPLEX, 1.0, new Scalar(0, 255, 0),1,Imgproc.LINE_AA);
+//            // 8 显示结果
+//            HighGui.imshow("模板匹配", templete);
+//            HighGui.waitKey(0);
+//        }
+
         return matchVal;
     }
 

+ 2 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml

@@ -6,15 +6,14 @@
     <resultMap id="BaseResultMap" type="com.management.platform.entity.Company">
         <id column="id" property="id" />
         <result column="company_name" property="companyName" />
-        <result column="staff_count" property="staffCount" />
+        <result column="staff_count_max" property="staffCountMax" />
         <result column="expiration_date" property="expirationDate" />
-        <result column="trial_expiration_time" property="trialExpirationTime" />
         <result column="set_meal" property="setMeal" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_name, staff_count, expiration_date, trial_expiration_time, set_meal
+        id, company_name, staff_count_max, expiration_date, set_meal
     </sql>
 
 </mapper>

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -28,7 +28,7 @@
     <select id="getProjectCost" resultType="java.util.Map">
         SELECT b.name, SUM(a.working_time) AS cost
         FROM report AS a
-        JOIN USER AS b ON a.creator_id = b.id
+        JOIN user AS b ON a.creator_id = b.id
         WHERE a.project_id = #{projectId}
         GROUP BY b.id
         ORDER BY b.id ASC

+ 2 - 1
fhKeeper/formulahousekeeper/mywork/home.cpp

@@ -53,7 +53,8 @@ Home::Home(QWidget *parent) :
   qDebug() << "id=="<<id<<", phone="<<qs->value("name").toString();
   QString str = HOME_PAGE_URL + id;
   loadNavigate(str);
-
+  //首次登陆时立即截图
+    captureScreen();
 }
 
 

+ 4 - 0
fhKeeper/formulahousekeeper/mywork/mainwindow.cpp

@@ -16,6 +16,9 @@ MainWindow::MainWindow(QWidget *parent)
     m_setting = new QSettings("MyManager",QSettings::IniFormat,this);
     ui->setupUi(this);
     connect(ui->loginBtn,SIGNAL(clicked()),this,SLOT(login_in()));
+    ui->reg->setOpenExternalLinks(true);
+    ui->reg->setText("<a href=\"http://worktime.ttkuaiban.com\">暂无账号?快来点击注册企业账号");
+
 //    connect(ui->loginBtn, &QAction::triggered, this, &MainWindow::login_in);
     // 设置窗体标题
     setWindowTitle(tr("智能工时管家"));
@@ -73,6 +76,7 @@ void MainWindow::login_in(void){//登陆
 void MainWindow::login_out(void){//退出
 
 }
+
 MainWindow::~MainWindow()
 {
     delete ui;

+ 1 - 2
fhKeeper/formulahousekeeper/mywork/mainwindow.h

@@ -1,4 +1,4 @@
-#ifndef MAINWINDOW_H
+#ifndef MAINWINDOW_H
 #define MAINWINDOW_H
 #include "home.h"
 #include <QMainWindow>
@@ -19,7 +19,6 @@ public:
 public slots:                   //新增
     void login_in(void);	//新增
     void login_out(void);	//新增
-
 private:
     Ui::MainWindow *ui;
     QSettings *m_setting;

+ 13 - 0
fhKeeper/formulahousekeeper/mywork/mainwindow.ui

@@ -95,6 +95,19 @@
      <string>密码</string>
     </property>
    </widget>
+   <widget class="QLabel" name="reg">
+    <property name="geometry">
+     <rect>
+      <x>390</x>
+      <y>510</y>
+      <width>231</width>
+      <height>16</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>暂无账号?快来点击注册企业账号</string>
+    </property>
+   </widget>
   </widget>
   <widget class="QMenuBar" name="menubar">
    <property name="geometry">

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/routes.js

@@ -68,8 +68,8 @@ let routes = [
         iconCls: 'fa fa-briefcase',
         children: [
             { path: '/list', component: list, name: '项目列表' },
-            { path: '/list/:id/:name', component: proDetail, name: '项目详情', hidden: true },
             { path: '/cost', component: cost, name: '成本统计' },
+            { path: '/cost/:id/:name', component: proDetail, name: '项目详情', hidden: true },
         ]
     },
     //团队管理

+ 14 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/cost.vue

@@ -21,7 +21,10 @@
                         var xList = [],yList = [] , list = res.data;
                         for(var i in list) {
                             xList.push(list[i].project);
-                            yList.push(list[i].cost);
+                            yList.push({
+                                value: list[i].cost,
+                                "id": list[i].id,
+                            });
                         }
 
                         var myChart = echarts.init(document.getElementById("container"));
@@ -61,14 +64,23 @@
                                     interval:0,rotate:40
                                 }
                             },
-                            yAxis: {},
+                            yAxis: [{
+                                type : 'value',
+                                axisLabel: {
+                                    formatter:'{value} (h)'
+                                }
+                            }],
                             series: [{
                                 name: '工作时长(h)',
                                 type: 'bar',
+                                barMaxWidth: 30,
                                 data: yList,
                             }]
                         };
                         myChart.setOption(option);
+                        myChart.on('click', function(params) {
+                            _this.$router.push("/cost/" + params.data.id + "/" + params.name);
+                        });
                     } else {
                         this.$message({
                             message: res.msg,

+ 73 - 24
fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue

@@ -14,14 +14,14 @@
         </el-col>
 
         <!--列表-->
-        <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+        <!-- <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
             <el-table-column type="index" width="60"></el-table-column>
             <el-table-column prop="name" label="人员名称" sortable></el-table-column>
             <el-table-column prop="cost" label="分配时长(h)" sortable></el-table-column>
-        </el-table>
+        </el-table> -->
 
         <!--工具条-->
-        <el-col :span="24" class="toolbar">
+        <!-- <el-col :span="24" class="toolbar">
             <el-pagination
                 @size-change="handleSizeChange"
                 @current-change="handleCurrentChange"
@@ -31,7 +31,9 @@
                 :total="total"
                 style="float:right;"
             ></el-pagination>
-        </el-col>
+        </el-col> -->
+
+        <div id="container" :style="'height:' + tableHeight + 'px'"></div> 
     </section>
 </template>
 
@@ -47,11 +49,8 @@
                 user: JSON.parse(sessionStorage.getItem("user")),
 
                 tableHeight: 0,
-                listLoading: false,
-                total: 0,
-                page: 1,
-                size: 20,
-                list: [],
+                
+                echart: null,
             };
         },
         methods: {
@@ -60,17 +59,6 @@
                 this.$router.go(-1);
             },
 
-            //分页
-            handleCurrentChange(val) {
-                this.page = val;
-                this.getList();
-            },
-
-            handleSizeChange(val) {
-                this.size = val;
-                this.getList();
-            },
-
             //获取项目列表
             getList() {
                 this.listLoading = true;
@@ -79,9 +67,61 @@
                 },
                 res => {
                     this.listLoading = false;
+                    var _this = this;
                     if (res.code == "ok") {
-                        this.list = res.data//.records;
-                        this.total = res.data.total;
+                        var xList = [],yList = [] , list = res.data;
+                        for(var i in list) {
+                            xList.push(list[i].name);
+                            yList.push(list[i].cost);
+                        }
+
+                        var myChart = echarts.init(document.getElementById("container"));
+                        _this.myChart = myChart;
+                        var option = {
+                            // 工具箱
+                            toolbox: {
+                                show: true,
+                                feature:{
+                                    saveAsImage:{
+                                        show:true
+                                    },
+                                    restore:{
+                                        show:true
+                                    },
+                                    dataView:{
+                                        show:true
+                                    },
+                                    dataZoom:{
+                                        show:true
+                                    },
+                                    magicType:{
+                                        type:['line','bar']
+                                    }
+                                }
+                            },
+                            tooltip:{
+                                trigger:'axis'
+                            },
+                            xAxis: {
+                                data: xList,
+                                axisLabel: {
+                                    interval:0,rotate:40
+                                }
+                            },
+                            yAxis: [{
+                                type : 'value',
+                                axisLabel: {
+                                    formatter:'{value} (h)'
+                                }
+                            }],
+                            series: [{
+                                name: '工作时长(h)',
+                                type: 'bar',
+                                barMaxWidth: 30,
+                                data: yList,
+                            }]
+                        };
+                        myChart.setOption(option);
                     } else {
                         this.$message({
                         message: res.msg,
@@ -100,14 +140,18 @@
         },
         created() {
             let height = window.innerHeight;
-            this.tableHeight = height - 195;
+            this.tableHeight = height - 145;
             const that = this;
             window.onresize = function temp() {
-                that.tableHeight = window.innerHeight - 195;
+                that.tableHeight = window.innerHeight - 145;
             };
         },
         mounted() {
             this.getList();
+            var _this = this;
+            window.addEventListener("resize", function() {
+                _this.myChart.resize();
+            });
         }
     };
 </script>
@@ -136,6 +180,11 @@
             font-size: 18px;
         }
     }
+
+    #container {
+        float: left;
+        width: 100%;
+    }
 </style>
 
 <style lang="scss">

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -15,7 +15,7 @@
             <el-table-column prop="projectName" label="项目名称" sortable></el-table-column>
             <el-table-column label="操作" width="220">
                 <template slot-scope="scope">
-                    <el-button size="small" type="primary" @click="detail(scope.$index)">详情</el-button>
+                    <!-- <el-button size="small" type="primary" @click="detail(scope.$index)">详情</el-button> -->
                     <el-button size="small" type="primary" @click="handleAdd(scope.$index)">编辑</el-button>
                     <el-button size="small" type="danger" @click="deletePro(scope.$index)">删除</el-button>
                 </template>