浏览代码

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

QuYueTing 5 月之前
父节点
当前提交
817560819e
共有 32 个文件被更改,包括 2292 次插入31414 次删除
  1. 4 176
      fhKeeper/formulahousekeeper/ArticleOperation/log/article.log
  2. 1483 31022
      fhKeeper/formulahousekeeper/management-crm/crm.log
  3. 58 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDictController.java
  4. 35 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ContractBonusDetailController.java
  5. 51 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/CompanyDict.java
  6. 96 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ContractBonusDetail.java
  7. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/bo/TransBonusData.java
  8. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ImportBonusTemplateVO.java
  9. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/WorktimeItem.java
  10. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/CompanyDictMapper.java
  11. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ContractBonusDetailMapper.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyDictService.java
  13. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ContractBonusDetailService.java
  14. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDictServiceImpl.java
  15. 57 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractBonusDetailServiceImpl.java
  16. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceExcludeProjectServiceImpl.java
  17. 45 16
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  18. 37 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/converter/ExcelTemplateTransUtil.java
  19. 29 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/converter/StringExcelConverter.java
  20. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  21. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyDictMapper.xml
  22. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ContractBonusDetailMapper.xml
  23. 10 10
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  24. 0 45
      fhKeeper/formulahousekeeper/timesheet/src/common/js/appidConfiguration.js
  25. 3 7
      fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue
  26. 173 61
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  27. 31 7
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  28. 0 45
      fhKeeper/formulahousekeeper/timesheet_h5/src/utils/appidConfiguration.js
  29. 34 4
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  30. 6 8
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/login/index.vue
  31. 2 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue
  32. 10 10
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

+ 4 - 176
fhKeeper/formulahousekeeper/ArticleOperation/log/article.log

@@ -1,176 +1,4 @@
-2024-11-12 14:32:51.481 [main] ERROR o.s.b.SpringApplication - [reportFailure,818] - Application run failed
-org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
-	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218)
-	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176)
-	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171)
-	at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1218)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:329)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:251)
-	at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:214)
-	at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:166)
-	at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:156)
-	at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:93)
-	at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:124)
-	at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:509)
-	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:199)
-	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:166)
-	at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:88)
-	at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
-	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54)
-	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36)
-	at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:108)
-	at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:132)
-	at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:87)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
-	at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240)
-	at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
-	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
-	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)
-	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
-	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
-	at org.springframework.boot.SpringApplicationRunListeners$$Lambda$37/1452442375.accept(Unknown Source)
-	at java.util.ArrayList.forEach(ArrayList.java:1249)
-	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
-	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
-	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
-	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
-	at com.my.bigevent.BigEventApplication.main(BigEventApplication.java:12)
-Caused by: java.nio.charset.MalformedInputException: Input length = 1
-	at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
-	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
-	at java.io.InputStreamReader.read(InputStreamReader.java:184)
-	at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:125)
-	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:183)
-	... 44 common frames omitted
-2024-11-12 14:34:08.746 [main] ERROR o.s.b.SpringApplication - [reportFailure,818] - Application run failed
-org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
-	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218)
-	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176)
-	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171)
-	at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1218)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:329)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:251)
-	at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:214)
-	at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:166)
-	at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:156)
-	at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:93)
-	at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:124)
-	at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:509)
-	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:199)
-	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:166)
-	at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:88)
-	at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
-	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54)
-	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36)
-	at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:108)
-	at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:132)
-	at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:87)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
-	at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240)
-	at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
-	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
-	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)
-	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
-	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
-	at org.springframework.boot.SpringApplicationRunListeners$$Lambda$37/1452442375.accept(Unknown Source)
-	at java.util.ArrayList.forEach(ArrayList.java:1249)
-	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
-	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
-	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
-	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
-	at com.my.bigevent.BigEventApplication.main(BigEventApplication.java:12)
-Caused by: java.nio.charset.MalformedInputException: Input length = 1
-	at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
-	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
-	at java.io.InputStreamReader.read(InputStreamReader.java:184)
-	at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:125)
-	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:183)
-	... 44 common frames omitted
-2024-11-12 14:34:32.513 [main] ERROR o.s.b.SpringApplication - [reportFailure,818] - Application run failed
-org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
-	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218)
-	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176)
-	at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171)
-	at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1218)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:329)
-	at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:251)
-	at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:214)
-	at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:166)
-	at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:156)
-	at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:93)
-	at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:124)
-	at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:509)
-	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:199)
-	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:166)
-	at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:88)
-	at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
-	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54)
-	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36)
-	at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:108)
-	at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:132)
-	at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:87)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
-	at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240)
-	at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
-	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
-	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
-	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:178)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:171)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145)
-	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:133)
-	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
-	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
-	at org.springframework.boot.SpringApplicationRunListeners$$Lambda$37/1667148529.accept(Unknown Source)
-	at java.util.ArrayList.forEach(ArrayList.java:1249)
-	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
-	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
-	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
-	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:344)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
-	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289)
-	at com.my.bigevent.BigEventApplication.main(BigEventApplication.java:12)
-Caused by: java.nio.charset.MalformedInputException: Input length = 1
-	at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
-	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
-	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
-	at java.io.InputStreamReader.read(InputStreamReader.java:184)
-	at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:125)
-	at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:183)
-	... 44 common frames omitted
-2024-11-12 14:34:52.557 [background-preinit] INFO  o.h.v.i.util.Version - [<clinit>,21] - HV000001: Hibernate Validator 6.2.5.Final
-2024-11-12 14:34:52.560 [main] INFO  c.m.b.BigEventApplication - [logStarting,55] - Starting BigEventApplication using Java 1.8.0_45 on Yurk with PID 29304 (D:\WorkSpeace\manHourHousekeeper\fhKeeper\formulahousekeeper\ArticleOperation\target\classes started by 123 in D:\WorkSpeace\manHourHousekeeper\fhKeeper\formulahousekeeper\ArticleOperation)
-2024-11-12 14:34:52.561 [main] INFO  c.m.b.BigEventApplication - [logStartupProfileInfo,632] - No active profile set, falling back to 1 default profile: "default"
-2024-11-12 14:34:53.152 [main] ERROR o.a.c.c.AprLifecycleListener - [log,173] - An incompatible version [1.1.32] of the Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
-2024-11-12 14:34:53.285 [main] INFO  o.a.c.h.Http11NioProtocol - [log,173] - Initializing ProtocolHandler ["http-nio-8091"]
-2024-11-12 14:34:53.286 [main] INFO  o.a.c.c.StandardService - [log,173] - Starting service [Tomcat]
-2024-11-12 14:34:53.286 [main] INFO  o.a.c.c.StandardEngine - [log,173] - Starting Servlet engine: [Apache Tomcat/9.0.83]
-2024-11-12 14:34:53.404 [main] INFO  o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring embedded WebApplicationContext
-2024-11-12 14:34:53.849 [main] INFO  o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-8091"]
-2024-11-12 14:34:53.866 [main] INFO  c.m.b.BigEventApplication - [logStarted,61] - Started BigEventApplication in 1.554 seconds (JVM running for 2.339)
-2024-11-12 14:35:03.671 [http-nio-8091-exec-1] INFO  o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
+2024-11-14 19:33:31.163 [main] INFO  c.m.b.BigEventApplicationTests - [logStarting,55] - Starting BigEventApplicationTests using Java 1.8.0_181 on DESKTOP-0TSN311 with PID 48660 (started by seya in C:\gitproject\manHourHousekeeper\fhKeeper\formulahousekeeper\ArticleOperation)
+2024-11-14 19:33:31.173 [main] INFO  c.m.b.BigEventApplicationTests - [logStartupProfileInfo,632] - No active profile set, falling back to 1 default profile: "default"
+2024-11-14 19:33:31.184 [background-preinit] INFO  o.h.v.i.util.Version - [<clinit>,21] - HV000001: Hibernate Validator 6.2.5.Final
+2024-11-14 19:33:33.948 [main] INFO  c.m.b.BigEventApplicationTests - [logStarted,61] - Started BigEventApplicationTests in 3.171 seconds (JVM running for 4.433)

文件差异内容过多而无法显示
+ 1483 - 31022
fhKeeper/formulahousekeeper/management-crm/crm.log


+ 58 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDictController.java

@@ -0,0 +1,58 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.CompanyDict;
+import com.management.platform.mapper.CompanyDictMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-12-05
+ */
+@RestController
+@RequestMapping("/company-dict")
+public class CompanyDictController {
+
+    @Resource
+    private CompanyDictMapper companyDictMapper;
+
+    //新增保存公司字典
+    @RequestMapping("/save")
+    public HttpRespMsg save(CompanyDict companyDict) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (companyDict.getId() != null) {
+            companyDictMapper.updateById(companyDict);
+        } else {
+            companyDictMapper.insert(companyDict);
+        }
+        return msg;
+    }
+
+    //删除公司字典
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        companyDictMapper.deleteById(id);
+        return msg;
+    }
+
+    //获取字典
+    @RequestMapping("/getAll")
+    public HttpRespMsg getAll(String code, Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(companyDictMapper.selectList(new QueryWrapper<>(new CompanyDict().setCode(code).setCompanyId(companyId))));
+        return msg;
+    }
+
+}
+

+ 35 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ContractBonusDetailController.java

@@ -0,0 +1,35 @@
+package com.management.platform.controller;
+
+import com.management.platform.service.ContractBonusDetailService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/contractBonusDetail")
+public class ContractBonusDetailController {
+    @Resource
+    private ContractBonusDetailService contractBonusDetailService;
+
+    @PostMapping("/transTemplateData")
+    public HttpRespMsg transTemplateData(Integer startDate, Integer endDate,
+           String bonusType, @RequestParam(value = "file") MultipartFile file) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            contractBonusDetailService.transTemplateData(startDate,endDate,bonusType,file);
+        } catch (Exception e) {
+            e.printStackTrace();
+            httpRespMsg.setError(MessageUtils.message("other.error"));
+        }
+        return httpRespMsg;
+    }
+
+
+
+}

+ 51 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/CompanyDict.java

@@ -0,0 +1,51 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-12-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class CompanyDict extends Model<CompanyDict> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 字典key,可以重复
+     */
+    @TableField("code")
+    private String code;
+
+    /**
+     * 字典值
+     */
+    @TableField("value")
+    private String value;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 96 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ContractBonusDetail.java

@@ -0,0 +1,96 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ContractBonusDetail extends Model<ContractBonusDetail> {
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键id
+     */
+    @TableId("id")
+    private Long id;
+
+    /**
+     * 公司表外键
+     */
+    @TableField("company_id")
+    private String company_id;
+
+    /**
+     * 员工id
+     */
+    @TableField("user_id")
+    private String userId;
+
+    /**
+     * 所属合同主体[user表plate1]
+     */
+    @TableField("contract")
+    private String contract;
+
+    /**
+     * 项目id
+     */
+    @TableField("project_id")
+    private int projectId;
+
+    /**
+     * 奖金类型[中文]
+     */
+    @TableField("bonus_type")
+    private String bonusType;
+
+    /**
+     * 奖金金额
+     */
+    @TableField("bonus_value")
+    private BigDecimal bonusValue;
+
+    /**
+     * 总奖金金额
+     */
+    @TableField("total_bonus_value")
+    private BigDecimal totalBonusValue;
+
+    /**
+     * 年月 20240111
+     */
+    @TableField("ym")
+    private int ym;
+
+    /**
+     * 年 2024
+     */
+    @TableField("year")
+    private int year;
+
+    /**
+     * 月 08
+     */
+    @TableField("month")
+    private int month;
+
+    /**
+     * 创建人id
+     */
+    @TableField("create_by")
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+}

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/bo/TransBonusData.java

@@ -0,0 +1,10 @@
+package com.management.platform.entity.bo;
+
+import lombok.Data;
+
+@Data
+public class TransBonusData {
+    private int startDate;
+    private int endDate;
+    private String bonusType;
+}

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ImportBonusTemplateVO.java

@@ -0,0 +1,19 @@
+package com.management.platform.entity.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ImportBonusTemplateVO {
+    /**员工工号*/
+    @ExcelProperty(value = "员工工号")
+    private String jobNumber;
+    /**员工姓名*/
+    @ExcelProperty(value = "员工姓名")
+    private String userName;
+    /**奖金金额*/
+    @ExcelProperty(value = "奖金金额")
+    private BigDecimal bonusValue;
+}

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/WorktimeItem.java

@@ -8,4 +8,6 @@ public class WorktimeItem {
     String endTime;
     String content;
     double time;
+
+    String detail;//工作细项,美莱德新增
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/CompanyDictMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.CompanyDict;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-12-05
+ */
+public interface CompanyDictMapper extends BaseMapper<CompanyDict> {
+
+}

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ContractBonusDetailMapper.java

@@ -0,0 +1,7 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ContractBonusDetail;
+
+public interface ContractBonusDetailMapper extends BaseMapper<ContractBonusDetail> {
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyDictService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.CompanyDict;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-12-05
+ */
+public interface CompanyDictService extends IService<CompanyDict> {
+
+}

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ContractBonusDetailService.java

@@ -0,0 +1,10 @@
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.ContractBonusDetail;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
+
+public interface ContractBonusDetailService extends IService<ContractBonusDetail> {
+    HttpRespMsg transTemplateData(Integer startDate, Integer endDate, String bonusType, MultipartFile file);
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDictServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.CompanyDict;
+import com.management.platform.mapper.CompanyDictMapper;
+import com.management.platform.service.CompanyDictService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-12-05
+ */
+@Service
+public class CompanyDictServiceImpl extends ServiceImpl<CompanyDictMapper, CompanyDict> implements CompanyDictService {
+
+}

+ 57 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractBonusDetailServiceImpl.java

@@ -0,0 +1,57 @@
+package com.management.platform.service.impl;
+
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.entity.ContractBonusDetail;
+import com.management.platform.entity.vo.ImportBonusTemplateVO;
+import com.management.platform.mapper.ContractBonusDetailMapper;
+import com.management.platform.mapper.ReportMapper;
+import com.management.platform.service.ContractBonusDetailService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import com.management.platform.util.converter.ExcelTemplateTransUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+@Service
+public class ContractBonusDetailServiceImpl extends ServiceImpl<ContractBonusDetailMapper, ContractBonusDetail> implements ContractBonusDetailService {
+
+    @Resource
+    private ContractBonusDetailMapper contractBonusDetailMapper;
+
+    @Resource
+    private ReportMapper reportMapper;
+
+    @Override
+    public HttpRespMsg transTemplateData(Integer startDate, Integer endDate, String bonusType, MultipartFile file) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        //解析文件
+        InputStream inputStream = null;
+        try {
+            inputStream = file.getInputStream();
+            List<ImportBonusTemplateVO> importDataList = ExcelTemplateTransUtil
+                    .readExcelConverterObjectList(inputStream, ExcelTypeEnum.XLSX, ImportBonusTemplateVO.class);
+//        System.out.println("=========in==========");
+//        importDataList.forEach(System.out::println);
+
+            inputStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+            httpRespMsg.setError(MessageUtils.message(""));
+        }finally {
+            if(null != inputStream){
+                try {
+                    inputStream.close();
+                } catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+            }
+        }
+        return httpRespMsg;
+    }
+}

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceExcludeProjectServiceImpl.java

@@ -62,7 +62,9 @@ public class FinanceExcludeProjectServiceImpl extends ServiceImpl<FinanceExclude
                 .eq(Project::getCompanyId, user.getCompanyId()));
 
         List<FinanceExcludeProject> resList = financeExcludeProjectMapper
-                .selectList(new LambdaQueryWrapper<FinanceExcludeProject>().eq(FinanceExcludeProject::getUseYM,useYM));
+                .selectList(new LambdaQueryWrapper<FinanceExcludeProject>()
+                        .eq(FinanceExcludeProject::getProjectId,user.getCompanyId())
+                        .eq(FinanceExcludeProject::getUseYM,useYM));
         if(projectCount == resList.size()){
             map.put("isAll",1);
         }else{

+ 45 - 16
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1630,7 +1630,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 delLog.setDeleteUserId(delUserId);
                 delList.add(delLog);
             }
-            reportDeleteService.saveBatch(delList);
+            reportDeleteService.saveOrUpdateBatch(delList);
         }
         return httpRespMsg;
     }
@@ -5257,12 +5257,17 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 //赛元微电子,导入的按照项目审核的模式进行
                                 if (company.getId() == 469) {
                                     report.setState(0);//待审核员审核
-                                    //赛元都是非项目,直接取员工所属部门的主要负责人来审核
-                                    Department department = departmentMapper.selectById(reportCreator.getDepartmentId());
-                                    if (department != null) {
-                                        report.setProjectAuditorId(department.getManagerId());
-                                    }
+                                    //赛元都是非项目,直接取员工所属部门的主要负责人来审核,如果设置了非项目审核人,优先用非项目审核人
+                                    int mode = 0;
+                                    String superiorId = user.getSuperiorId();
+                                    if (superiorId == null) {
+                                        Department department = departmentMapper.selectById(reportCreator.getDepartmentId());
+                                        if (department != null) {
+                                            superiorId = department.getManagerId();
 
+                                        }
+                                    }
+                                    report.setProjectAuditorId(superiorId);
                                     List<AuditWorkflowTimeSetting> auditWorkflowList
                                             = auditWorkflowTimeSettingMapper.selectList(
                                             new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", reportCreator.getDepartmentId()).orderByAsc("seq"));
@@ -5656,12 +5661,32 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 report.setState(0);//待审核
                                 //目前仅支持项目审核人审核的模式,叠加审批流
                                 if (timeType.getReportAuditType() == 0) {
-                                    //设置日报审核人
-                                    List<ProjectAuditor> projectAuditors = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", project.getId()));
-                                    if (projectAuditors.size() > 0) {
-                                        report.setProjectAuditorId(projectAuditors.get(0).getAuditorId());
+                                    int mode = 0;
+                                    if (company.getNonProjectSimple() == 1) {
+                                        //启用了简易模式
+                                        List<ProjectAuditor> pAuditorList = new ArrayList<>();
+                                        if (project.getIsPublic() == 1) {
+                                            //非项目,该员工的部门主要负责人审核
+                                            mode = 1;
+                                            //优先取员工的上级领导
+                                            String superiorId = user.getSuperiorId();
+                                            if (superiorId == null) {
+                                                Integer departmentId = user.getDepartmentId();
+                                                Department department = departmentMapper.selectById(departmentId);
+                                                if (department != null) {
+                                                    superiorId = department.getManagerId();
+                                                }
+                                            }
+                                            report.setProjectAuditorId(superiorId);
+                                        }
+                                    }
+                                    if (mode == 0) {
+                                        //没有设置部门的审核人,按项目日报审核人设置
+                                        List<ProjectAuditor> projectAuditors = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", project.getId()));
+                                        if (projectAuditors.size() > 0) {
+                                            report.setProjectAuditorId(projectAuditors.get(0).getAuditorId());
+                                        }
                                     }
-
                                     List<AuditWorkflowTimeSetting> auditWorkflowList
                                             = auditWorkflowTimeSettingMapper.selectList(
                                             new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", reportCreator.getDepartmentId()).orderByAsc("seq"));
@@ -8264,12 +8289,16 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             if (project.getIsPublic() == 1) {
                                 //非项目,该员工的部门主要负责人审核
                                 mode = 1;
-                                String superiorId = null;
-                                Integer departmentId = user.getDepartmentId();
-                                Department department = departmentMapper.selectById(departmentId);
-                                if (department != null) {
-                                    superiorId = department.getManagerId();
+                                //优先取员工的上级领导
+                                String superiorId = user.getSuperiorId();
+                                if (superiorId == null) {
+                                    Integer departmentId = user.getDepartmentId();
+                                    Department department = departmentMapper.selectById(departmentId);
+                                    if (department != null) {
+                                        superiorId = department.getManagerId();
+                                    }
                                 }
+
                                 if (superiorId != null) {
                                     User superior = userMapper.selectById(superiorId);
                                     if (superior != null) {

+ 37 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/converter/ExcelTemplateTransUtil.java

@@ -0,0 +1,37 @@
+package com.management.platform.util.converter;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import org.springframework.lang.Nullable;
+
+import java.io.InputStream;
+import java.util.List;
+
+public class ExcelTemplateTransUtil {
+    public static <T> List<T> readExcelConverterObjectList(InputStream inputStream, ExcelTypeEnum excelTypeEnum, Class<T> classT){
+        return readExcelWithClassList(inputStream, excelTypeEnum, 1, classT);
+    }
+
+    /**
+     * 读取excel数据到数据对象
+     *
+     * @param inputStream 文件流
+     * @param excelTypeEnum 文件类型Excel的格式(XLS或XLSX)
+     * @param headLineNum 开始读取数据的行
+     * @param classT 转为对象的CLASS
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> readExcelWithClassList(InputStream inputStream, ExcelTypeEnum excelTypeEnum,
+                                                         @Nullable Integer headLineNum, Class<T> classT) {
+        if (headLineNum == null) {
+            headLineNum = 1;
+        }
+        return EasyExcel.read(inputStream).excelType(excelTypeEnum)
+                .registerConverter(new StringExcelConverter())
+                .head(classT)
+                .sheet()
+                .headRowNumber(headLineNum)
+                .doReadSync();
+    }
+}

+ 29 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/converter/StringExcelConverter.java

@@ -0,0 +1,29 @@
+package com.management.platform.util.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+public class StringExcelConverter implements Converter<String> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return String.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return cellData.getStringValue();
+    }
+
+    @Override
+    public CellData convertToExcelData(String value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return new CellData(value);
+    }
+}

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -15,7 +15,7 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.101.180.183:17089/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://47.101.180.183:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     password: P011430@Huoshi*
 

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyDictMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.CompanyDictMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.CompanyDict">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="code" property="code" />
+        <result column="value" property="value" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, code, value
+    </sql>
+
+</mapper>

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ContractBonusDetailMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.management.platform.mapper.ContractBonusDetailMapper">
+
+</mapper>

+ 10 - 10
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -4,17 +4,17 @@ var path = require('path')
 // var ip = '47.101.180.183'
 // var ip = '47.100.37.243'
 // var ip = '192.168.10.2'
-var ip = '192.168.2.3' 
+// var ip = '192.168.2.3' 
 
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 // 1196735749
 module.exports = {
   build: {

+ 0 - 45
fhKeeper/formulahousekeeper/timesheet/src/common/js/appidConfiguration.js

@@ -1,45 +0,0 @@
-/**
- * 各个公司企业微信的配置, 根据域名来解析
- * @path 完整域名
- * @appId 企业微信的appId,针对私有化部署的情况appId就是corpId
- */
-const config = {
-  "worktime.ttkuaiban.com": {
-    // 工时管家
-    path: "https://worktime.ttkuaiban.com",
-    appId: "ww4e237fd6abb635af",
-    agentId: "",
-  },
-  "blue.blovelight.net": {
-    // 蓝光研发
-    path: "http://blue.blovelight.net:2021",
-    appId: "wwb12ec40df8c35139",
-    agentId: "1000075",
-  },
-  "privatewx.ttkuaiban.com": {
-    // 火石闪信-企业微信私有化
-    path: "http://privatewx.ttkuaiban.com",
-    appId: "wwf11426cf618e1703",
-    agentId: "1000069",
-  },
-};
-
-const fixedPath = `/api/corpWXAuth`; // 授权回调页面 (需要拼接)
-const fixedPathAgentId = `/api/corpInsideWXAuth`
-
-export function obtainCorrespondingConfigurationInformation() {
-  const hostname = window.location.hostname; // 获取域名和端口,(不包括http 和 https)
-  const row = config[hostname];
-  const agentId = row.agentId;
-  const appId = row.appId;
-  const tokenUrl = `${row.path}${fixedPath}`;
-  const tokenUrlAgentId = `${row.path}${fixedPathAgentId}`;
-  const authorizationCallback = agentId
-    ? `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${encodeURI(tokenUrlAgentId)}&response_type=code&scope=snsapi_base&state=0&agentid=${agentId}#wechat_redirect`
-    : `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${encodeURI(tokenUrl)}&response_type=code&scope=snsapi_base&state=1#wechat_redirect`;
-  return {
-    appId,
-    tokenUrl,
-    authorizationCallback,
-  };
-}

+ 3 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue

@@ -68,7 +68,6 @@
     import * as dd from 'dingtalk-jsapi';
     import "../permissions.js"
     import WxLogin from "../assets/js/wwLogin.js"
-    import { obtainCorrespondingConfigurationInformation } from '../common/js/appidConfiguration.js'
     export default {
         inject:['reloads'],
         data() {
@@ -361,12 +360,9 @@
             },
             tryAutoLogin() {
                 let href = window.location.href;
-                // var appId = "ww4e237fd6abb635af";//企业微信第三方的SUIT ID
-                // var url = "https://worktime.ttkuaiban.com/api/corpWXAuth";//授权回调页面
-                // var weixinUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri="+encodeURI(url)+"&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
-
-                const config = obtainCorrespondingConfigurationInformation()
-                var weixinUrl = config.authorizationCallback;
+                var appId = "ww4e237fd6abb635af";//企业微信第三方的SUIT ID
+                var url = "https://worktime.ttkuaiban.com/api/corpWXAuth";//授权回调页面
+                var weixinUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri="+encodeURI(url)+"&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
                 window.location.href = weixinUrl;
             },
             tryDingDingUrlRedirect() {

文件差异内容过多而无法显示
+ 173 - 61
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue


+ 31 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -325,6 +325,9 @@
                                                             <p style="display: inline-block;">{{$t('time.duration')}}:
                                                                 <span v-if="item2.reportTimeType == 2" style="margin-right:10px;">{{timeItem.startTime+'-'+timeItem.endTime}}</span>
                                                             {{timeItem.time.toFixed(1)}}h  
+                                                            <span v-if="timeItem.detail" style="margin-left:10px;">细项:
+                                                                {{timeItem.detail}}
+                                                            </span>
                                                             </p>
                                                             <p>{{$t('other.matters')}}:<span v-html="timeItem.content"></span></p>
                                                         </div>
@@ -764,11 +767,6 @@
                                 <el-select v-model="domain.projectId" :placeholder="$t('defaultText.pleaseSelectSnItem')" style="width:200px;" clearable="true"  filterable="true" value-key="id"
                                 @change="selectProject(domain, index)"
                                 :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)" popper-class="projectSelectPopperClass">
-                                    <!-- <el-option v-for="item in fillProjectList" :disabled="item.status!=1 && item.status!=4" :key="item.id" :label="item.projectName + '\u3000' + item.projectCode" :value="item.id">
-                                        <span style="float: left; color: #8492a6; font-size: 13px;">{{ item.projectCode }}</span>
-                                        <span style="float: right;">{{ item.projectName }}</span>
-                                    </el-option> -->
-
                                     <el-option-group v-for="group in integrationProjectList" :key="group.label" :label="group.label">
                                         <el-option v-for="item in group.peojectList" :key="item.id" :label="item.projectName + '\u3000' + item.projectCode" :value="item.id" :disabled="item.status!=1 && item.status!=4">
                                             <span style="float: left; color: #8492a6; font-size: 13px;">{{ item.projectCode }}</span>
@@ -913,6 +911,11 @@
                                     @change="iptChangs()">
                                 </el-time-picker>
                                 </span>
+                                <!--工作细项-->
+                                <el-select v-model="timeItem.detail" :placeholder="$t('defaultText.pleaseChoose')" style="width:200px;margin-left:10px;" filterable="true" v-if="multiOptionData.length>0"
+                                    :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
+                                    <el-option v-for="item in multiOptionData" :key="item.value" :label="item.value" :value="item.value"></el-option>
+                                </el-select>
                             </el-form-item>
                             <el-form-item :label="$t('other.workMatters')" :prop="'domains.' + index + '.worktimeList.'+tIndex+'.content'" 
                             :rules="user.timeType.workContentState == 1 ? { required: true, message: $t('other.tianworkMatters'), trigger: 'blur' } : null">
@@ -2617,8 +2620,8 @@
                 isReminder:true,
                 reportLogCheckDialog:false,
                 deptIdForHasReport:[],
-
-                transferWorkingHoursVisable: false
+                transferWorkingHoursVisable: false,
+                multiOptionData:[],
             };
         },
         watch: {
@@ -2671,6 +2674,7 @@
             this.scrollFunction()
             this.userssHu();
             this.getFirstAndLastDay()
+            this.getMultiOptionData();
             if(this.user.timeType.reportAuditType == 3){
                 this.getAllUsersList()
             }
@@ -2730,6 +2734,26 @@
                     
                 }
             },
+            getMultiOptionData() {
+                this.http.post('/company-dict/getAll ',{companyId: this.user.companyId, code: 'multiOption'},
+                res => {
+                    if (res.code == "ok") {
+                        this.multiOptionData = res.data;
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                    }
+                );
+            },
             showReportTimeLessThanCardTimeList() {
                 this.monthTotalPage = 0,
                 this.tbload = true,

+ 0 - 45
fhKeeper/formulahousekeeper/timesheet_h5/src/utils/appidConfiguration.js

@@ -1,45 +0,0 @@
-/**
- * 各个公司企业微信的配置, 根据域名来解析
- * @path 完整域名
- * @appId 企业微信的appId,针对私有化部署的情况appId就是corpId
- */
-const config = {
-  "mobworktime.ttkuaiban.com": {
-    // 工时管家 
-    path: "http://mobworktime.ttkuaiban.com",
-    appId: "ww4e237fd6abb635af",
-    agentId: "",
-  },
-  "moblue.blovelight.net": {
-    // 蓝光研发 
-    path: "http://moblue.blovelight.net:2021",
-    appId: "wwb12ec40df8c35139",
-    agentId: "1000075",
-  },
-  "mobprivatewx.ttkuaiban.com": {
-    // 火石闪信-企业微信私有化 
-    path: "http://mobprivatewx.ttkuaiban.com",
-    appId: "wwf11426cf618e1703",
-    agentId: "1000069",
-  },
-};
-
-const fixedPath = `/api/corpWXAuth`; // 授权回调页面 (需要拼接)
-const fixedPathAgentId = `/api/corpInsideWXAuth`
-
-export function obtainCorrespondingConfigurationInformation() {
-  const hostname = window.location.hostname; // 获取域名和端口,(不包括http 和 https)
-  const row = config[hostname];
-  const agentId = row.agentId;
-  const appId = row.appId;
-  const tokenUrl = `${row.path}${fixedPath}`;
-  const tokenUrlAgentId = `${row.path}${fixedPathAgentId}`;
-  const authorizationCallback = agentId
-    ? `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${encodeURI(tokenUrlAgentId)}&response_type=code&scope=snsapi_base&state=0&agentid=${agentId}#wechat_redirect`
-    : `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${encodeURI(tokenUrl)}&response_type=code&scope=snsapi_base&state=1#wechat_redirect`;
-  return {
-    appId,
-    tokenUrl,
-    authorizationCallback,
-  };
-}

+ 34 - 4
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -396,7 +396,15 @@
                                 :value="timeItem.endTime" label="结束时间" placeholder="点击选择时间"
                                 :rules="[{ required: true, message: '必填项' }]"
                                 @click="item.canEdit ? showEndDialog(timeItem) : ''" />
-
+                            <van-field v-if="multiOptionData.length>0" readonly :clickable="canEdit" name="multiTimePicker"
+                                :value="timeItem.detail" label="细项" placeholder="点击选择"
+                                :rules="[{ required: true, message: '必填项' }]"
+                                @click="item.canEdit ? showChooseDetail(timeItem) : ''" />
+                            <!-- 工作细项, 美莱德 -->
+                            <van-popup v-model="showMultiOpPicker" position="bottom">
+                                                        <van-picker show-toolbar :columns="multiOptionData" :default-index="1" @confirm="choseMultiOptionPick"
+                                                            @cancel="showMultiOpPicker = false" />
+                                                    </van-popup>
                             <van-field class="form_input" :disabled="!item.canEdit"
                                 style="color:#333;-webkit-text-fill-color:#646566;" v-model="timeItem.content"
                                 name="content" type="textarea" label="工作事项" placeholder="请输入工作事项"
@@ -646,7 +654,7 @@ export default {
             },
             project: [],
             report: {},
-
+            showMultiOpPicker: false,
             loading: false,
             finished: false,
             // isOvertime: false
@@ -659,7 +667,7 @@ export default {
             flgLg: true,
             reportBasecostList: [],
             isWeekend: false,
-
+            multiOptionData:[],
             auditorShow: false,
             auditor: {
                 index: 0,
@@ -1097,6 +1105,14 @@ export default {
                     this.$forceUpdate();
                 }).catch(err => { this.$toast.clear(); });
         },
+        showChooseDetail(timeItem) {
+            this.curWorktime = timeItem;
+            this.showMultiOpPicker=true;
+        },
+        choseMultiOptionPick(value) {
+            this.curWorktime.detail = value;
+            this.showMultiOpPicker = false;
+        },
         showEndDialog(timeItem) {
             this.curWorktime = timeItem;
             this.showWorkEndTime = true;
@@ -1280,6 +1296,7 @@ export default {
             }
             this.setTotalReportHours()
         },
+        
 
         confirmTime(item, field, index) {
             if (field == 0) {
@@ -1447,6 +1464,18 @@ export default {
                 }).catch(err => { this.$toast.clear(); });
             }
         },
+        getMultiOptionData() {
+            this.$axios.post('/company-dict/getAll', { companyId: this.user.companyId,code: 'multiOption' })
+                .then(res => {
+                    if (res.code == "ok") {
+                        var list = res.data;
+                        this.multiOptionData = [];
+                        for (var i in list) {
+                            this.multiOptionData.push(list[i].value);
+                        }
+                    } 
+                }).catch(err => { this.$toast.clear(); });
+        },
         getTimeType() {
             this.$axios.post('/time-type/getCompanyTimeSetting', { companyId: this.user.companyId })
                 .then(res => {
@@ -2866,7 +2895,7 @@ export default {
         
         this.getAllUsersList()
         this.getTimeType();
-
+        this.getMultiOptionData();
         //初始化微信js-sdk参数
         if (this.isCorpWX) {
             this.initWxConfig();
@@ -2881,6 +2910,7 @@ export default {
         if(this.user.timeType.userWithMultiDept) {
             this.getReportDeptList()
         }
+
     },
     beforeDestroy() {
         localStorage.removeItem('formVal')

+ 6 - 8
fhKeeper/formulahousekeeper/timesheet_h5/src/views/login/index.vue

@@ -17,8 +17,7 @@
 
 <script>
     import { constants } from "crypto";
-    import * as dd from 'dingtalk-jsapi'; 
-    import { obtainCorrespondingConfigurationInformation } from '../../utils/appidConfiguration';
+    import * as dd from 'dingtalk-jsapi';
     export default {
         data() {
             return {
@@ -166,18 +165,17 @@
                 }
             },
             tryAutoLogin() {
-                const rowConfig = obtainCorrespondingConfigurationInformation()
                 var appId = "wx749c84daac654e1e";//工时管家公众号
                 var url = "http://mobworktime.ttkuaiban.com/api/wechat/loginByWXCode";//工时管家公众号授权回调页面
-                // if (this.isCorpWX) {
-                    // appId = "ww4e237fd6abb635af"; //企业微信第三方的SUIT ID
-                    // url = "http://worktime.ttkuaiban.com/api/corpWXAuth";//授权回调页面
-                // } 
+                if (this.isCorpWX) {
+                    appId = "ww4e237fd6abb635af"; //企业微信第三方的SUIT ID
+                    url = "http://worktime.ttkuaiban.com/api/corpWXAuth";//授权回调页面
+                } 
 
                 // var appId = "ww4e237fd6abb635af";//企业微信第三方的SUIT ID
                 // var url = "http://worktime.ttkuaiban.com/api/corpWXAuth";//授权回调页面
                 
-                var weixinUrl = this.isCorpWX ? rowConfig.authorizationCallback : "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri="+encodeURI(url)+"&response_type=code&scope=snsapi_base&state=0#wechat_redirect";
+                var weixinUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri="+encodeURI(url)+"&response_type=code&scope=snsapi_base&state=0#wechat_redirect";
                 window.location.href = weixinUrl;
             },
             tryDingDingUrlRedirect() {

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

@@ -176,7 +176,8 @@
                                         <div class="project_time">时长:
                                             <!-- <span v-if="timeItem.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span> -->
                                             <span style="margin-right:10px;">{{ timeItem.startTime + '-' + timeItem.endTime
-                                            }}</span>{{ timeItem.time.toFixed(1) }}h
+                                            }}</span>{{ timeItem.time.toFixed(1) }}h 
+                                            <span style="margin-left:5px;" v-if="timeItem.detail">{{ timeItem.detail }}</span>
                                         </div>
                                         <div class="project_content">事项:<span v-html="timeItem.content"></span></div>
                                     </div>

+ 10 - 10
fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

@@ -5,19 +5,19 @@ const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 const Timestamp = new Date().getTime();
 
 // var ip = '47.101.180.183'
-var ip = '47.100.37.243'
+// var ip = '47.100.37.243'
 // var ip = '192.168.2.8'
 // var ip = '127.0.0.1'
 
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 
 module.exports = {
     runtimeCompiler: true,