Pārlūkot izejas kodu

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper into master

# Conflicts:
#	fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
seyason 2 gadi atpakaļ
vecāks
revīzija
ba7a9ac522

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -85,8 +85,8 @@ public class ProjectController {
     public HttpRespMsg getProjectPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword,
                                       @RequestParam(required = false, defaultValue = "1") Integer searchField,
                                       Integer projectId, //可以直接传projectId来进行匹配
-                                      Integer status, Integer category,Integer projectMainId,Integer deptId, String sortProp, Integer sortOrder,String inchagerId) {
-        return projectService.getProjectPage(pageIndex, pageSize, keyword,searchField, status, category, projectId,projectMainId,deptId, sortProp, sortOrder,inchagerId, request);
+                                      Integer status, Integer category,Integer projectMainId,Integer deptId, String sortProp, Integer sortOrder,String inchagerId,String participation) {
+        return projectService.getProjectPage(pageIndex, pageSize, keyword,searchField, status, category, projectId,projectMainId,deptId, sortProp, sortOrder,inchagerId,participation, request);
     }
 
     @RequestMapping("/saveBatchAccoDegrees")

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -21,7 +21,7 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getProjectList(Integer forReport, HttpServletRequest request);
 
     HttpRespMsg getProjectPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField,
-                               Integer status, Integer category, Integer projectId,Integer projectMainId,Integer deptId, String sortProp, Integer sortOrder,String inchagerId, HttpServletRequest request);
+                               Integer status, Integer category, Integer projectId,Integer projectMainId,Integer deptId, String sortProp, Integer sortOrder,String inchagerId,String participation, HttpServletRequest request);
 
     HttpRespMsg editProject(Integer id, String name, String code, String[] userIds, String inchargerId,
                             Integer isPublic,

+ 17 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -203,7 +203,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     //分页获取项目列表
     @Override
     public HttpRespMsg getProjectPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField,
-                                      Integer status, Integer category, Integer projectId,Integer projectMainId,Integer deptId,  String sortProp, Integer sortOrder,String inchagerId, HttpServletRequest request) {
+                                      Integer status, Integer category, Integer projectId,Integer projectMainId,Integer deptId,  String sortProp, Integer sortOrder,String inchagerId,String participation, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             //通过公司id获取该公司所有的项目列表
@@ -254,6 +254,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if(!StringUtils.isEmpty(inchagerId)){
                 queryWrapper.eq("incharger_id",inchagerId);
             }
+            if(!StringUtils.isEmpty(participation)){
+                List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().eq("user_id", participation).select("project_id"));
+                if(participationList.size()>0){
+                    List<Integer> collect = participationList.stream().map(Participation::getProjectId).collect(Collectors.toList());
+                    queryWrapper.in("id",collect);
+                }
+            }
             if (status != null && status != 0) {
                 queryWrapper.eq("status", status);
             }
@@ -3892,7 +3899,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             userId = user.getId();
         }
         List<HashMap<String, Object>> list = projectMapper.getExportData(user.getCompanyId(), userId);
-        HttpRespMsg projectPage = getProjectPage(null, null, null, null, null, null, null, null,null, null, null,null, request);
+        HttpRespMsg projectPage = getProjectPage(null, null, null, null, null, null, null, null,null, null, null,null,null, request);
         List<ProjectKeyNodesSetting> projectKeyNodesSettingList = projectKeyNodesSettingMapper.selectList(new QueryWrapper<ProjectKeyNodesSetting>().eq("company_id", user.getCompanyId()));
         Map<String,Object> resultMap= (Map<String, Object>) projectPage.data;
         List<ProjectVO> projectVOList= (List<ProjectVO>) resultMap.get("records");
@@ -5121,6 +5128,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<LeaveSheet> leaveSheetList = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>().eq("company_id", targetUser.getCompanyId()));
         List<TimelinessRateVO> resultList=new ArrayList<>();
         for (User user : userList){
+            List<Map<String,Object>> dataList=new ArrayList<>();
             long days =dateTimeList.size();
             List<LeaveSheet> leaveSheets = leaveSheetList.stream().filter(ls -> ls.getOwnerId().equals(user.getId())
                     &&(ls.getStartDate().isAfter(ChronoLocalDate.from(sDate))||ls.getStartDate().isEqual(ChronoLocalDate.from(sDate)))
@@ -5148,6 +5156,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             LocalDate createDate = LocalDate.parse(String.valueOf(date));
                             return createDate.isEqual(localDateTime.toLocalDate());
                         })){
+                            Map<String,Object> map=new HashMap<>();
+                            map.put(localDateTime.toLocalDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),"请假");
+                            dataList.add(map);
                             days++;
                         }
                     }
@@ -5170,7 +5181,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
 
             }
-            List<Map<String,Object>> dataList=new ArrayList<>();
             if(mapList!=null){
                 int num=0;
                 for (Map<String, Object> map : mapList) {
@@ -5199,9 +5209,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                     if(createTimeDate.isBefore(createDate)||createTimeDate.isEqual(createDate)){
                         num++;
-                        objectMap.put(createTimeDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),"及时");
-                        dataList.add(objectMap);
+                        objectMap.put((LocalDate.parse(String.valueOf(date)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))),"及时/提交时间"+createTimeDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                    }else {
+                        objectMap.put((LocalDate.parse(String.valueOf(date)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))),"不及时/提交时间"+createTimeDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                     }
+                    dataList.add(objectMap);
                 }
                 timelinessRateVO.setDataList(dataList);
                 BigDecimal bigDecimal=new BigDecimal(num);

+ 46 - 31
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -47,6 +47,9 @@ import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 /**
@@ -62,7 +65,7 @@ import java.util.stream.Collectors;
 public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> implements ReportService {
 //    @Resource
 //    AsyncTaskExecutor asyncTaskExecutor;//注入线程池对象
-
+    private final static Executor executor = Executors.newFixedThreadPool(3);//启用多线程
     @Value("${wx.template_report_pass}")
     public String TEMPLATE_REPORT_PASS;
     @Value("${wx.template_report_reject}")
@@ -3993,7 +3996,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             return msg;
         }
         ThirdPartyInterface thirdPartyInterface = thirdPartyInterfaceList.get(0);
-        List<ReportLog> reportLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("company_id", thirdPartyInterface.getCompanyId()).orderByAsc("operate_date"));
+        List<ReportLog> reportLogList = reportLogMapper.selectList(new QueryWrapper<ReportLog>().eq("company_id", thirdPartyInterface.getCompanyId()).ge("operate_date",openDate.atTime(LocalTime.now())).orderByAsc("operate_date"));
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", thirdPartyInterface.getCompanyId()));
         if(LocalDateTime.now().isAfter(thirdPartyInterface.getExpireTime())){
             msg.setError("token过期失效");
@@ -4001,37 +4004,49 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         if(token.equals(thirdPartyInterface.getToken())){
             List<HashMap<String, Object>> allReportByDate = reportMapper.getAllReportByDate(startDate,thirdPartyInterface.getCompanyId(), null, endDate, null, 1, null);
+            final CountDownLatch latch=new CountDownLatch(allReportByDate.size());
             for (HashMap<String, Object> map : allReportByDate) {
-                java.sql.Date sqlCreateDate= (java.sql.Date) map.get("createDate");
-                java.sql.Timestamp sqlProjectAuditTime= (Timestamp) map.get("projectAuditTime");
-                java.sql.Timestamp sqlTime= (Timestamp) map.get("time");
-                if(sqlCreateDate!=null){
-                    LocalDate createDate = sqlCreateDate.toLocalDate();
-                    map.put("createDate",df.format(createDate));
-                }
-                if(sqlProjectAuditTime!=null){
-                    LocalDateTime projectAuditTime = sqlProjectAuditTime.toLocalDateTime();
-                    map.put("projectAuditTime",projectAuditTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-                }
-                if(sqlTime!=null){
-                    LocalDateTime time = sqlTime.toLocalDateTime();
-                    map.put("time",time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-                }
-                List<ReportLog> item=new ArrayList<>();
-                Integer reportId = (Integer) map.get("id");
-                for (ReportLog reportLog : reportLogList) {
-                    List<String> list = Arrays.asList(reportLog.getReportIds().split(","));
-                    reportLog.setCreatorName(!userList.stream().filter(
-                            ul->ul.getId().equals(reportLog.getCreatorId())).findFirst().isPresent()?"":userList.stream().filter(
-                            ul->ul.getId().equals(reportLog.getCreatorId())).findFirst().get().getName());
-                    reportLog.setOperateName(!userList.stream().filter(
-                            ul->ul.getId().equals(reportLog.getOperatorId())).findFirst().isPresent()?"":userList.stream().filter(
-                            ul->ul.getId().equals(reportLog.getOperatorId())).findFirst().get().getName());
-                    if(list.contains(String.valueOf(reportId))&&!reportLog.getMsg().contains("提交")){
-                         item.add(reportLog);
+                executor.execute(new Runnable() {
+                    @Override
+                    public void run() {
+                        java.sql.Date sqlCreateDate= (java.sql.Date) map.get("createDate");
+                        java.sql.Timestamp sqlProjectAuditTime= (Timestamp) map.get("projectAuditTime");
+                        java.sql.Timestamp sqlTime= (Timestamp) map.get("time");
+                        if(sqlCreateDate!=null){
+                            LocalDate createDate = sqlCreateDate.toLocalDate();
+                            map.put("createDate",df.format(createDate));
+                        }
+                        if(sqlProjectAuditTime!=null){
+                            LocalDateTime projectAuditTime = sqlProjectAuditTime.toLocalDateTime();
+                            map.put("projectAuditTime",projectAuditTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        }
+                        if(sqlTime!=null){
+                            LocalDateTime time = sqlTime.toLocalDateTime();
+                            map.put("time",time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        }
+                        List<ReportLog> item=new ArrayList<>();
+                        Integer reportId = (Integer) map.get("id");
+                        for (ReportLog reportLog : reportLogList) {
+                            List<String> list = Arrays.asList(reportLog.getReportIds().split(","));
+                            reportLog.setCreatorName(!userList.stream().filter(
+                                    ul->ul.getId().equals(reportLog.getCreatorId())).findFirst().isPresent()?"":userList.stream().filter(
+                                    ul->ul.getId().equals(reportLog.getCreatorId())).findFirst().get().getName());
+                            reportLog.setOperateName(!userList.stream().filter(
+                                    ul->ul.getId().equals(reportLog.getOperatorId())).findFirst().isPresent()?"":userList.stream().filter(
+                                    ul->ul.getId().equals(reportLog.getOperatorId())).findFirst().get().getName());
+                            if(list.contains(String.valueOf(reportId))&&!reportLog.getMsg().contains("提交")){
+                                item.add(reportLog);
+                            }
+                        }
+                        map.put("checkLog",item);
+                        latch.countDown();
                     }
-                }
-                map.put("checkLog",item);
+                });
+            }
+            try {
+                latch.await();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
             }
             msg.data=allReportByDate;
         }

+ 19 - 54
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -237,61 +237,26 @@ public class TimingTask {
     @Scheduled(cron = "0 10 2 ? * *")
     private void autoApprove() {
         if (isDev) return;
-        List<Company> list = companyMapper.selectList(new QueryWrapper<Company>());
-        List<CompanyDingding> companyDingdingList = companyDingdingService.list();
-        List<WxCorpInfo> wxCorpInfoList = wxCorpInfoService.list();
-        for (Company company : list) {
-            TimeType timeType = timeTypeMapper.selectById(company.getId());
-            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()));
-            if(timeType.getReportAutoApprove()==1){
-                Integer reportAutoApproveDays = timeType.getReportAutoApproveDays();
-                if(reportAutoApproveDays==null){
-                    continue;
-                }
-                LocalDate localDate = LocalDate.now().minusDays(reportAutoApproveDays);
-                List<Report> reports = reportMapper.selectList(new QueryWrapper<Report>().eq("company_id", company.getId()).eq("state", 0).le("create_time", localDate.atTime(LocalTime.now())));
-                for (Report report : reports) {
-                    report.setState(1);
-                    //项目审核的状态修改成已审核
-                    report.setProjectAuditState(1);
-                    report.setReportAutoApprove(1);
-                    reportMapper.updateById(report);
-                    /*Optional<User> first = userList.stream().filter(u -> u.getId().equals(report.getCreatorId())).findFirst();
-                    if(first.isPresent()){
-                        Optional<CompanyDingding> optional = companyDingdingList.stream().filter(cm -> cm.getCompanyId().equals(company.getId())).findFirst();
-                        if(optional.isPresent()){
-                            companyDingdingService.sendReportApproveMsg(company.getId(),optional.get().getAgentId(),"自动审核","",LocalDate.now(),first.get().getDingdingUserid());
-                        }
-                        Optional<WxCorpInfo> corpInfo = wxCorpInfoList.stream().filter(wx -> wx.getCompanyId().equals(company.getId())).findFirst();
-                        if(corpInfo.isPresent()){
-                            JSONObject json=new JSONObject();
-                            JSONArray dataJson=new JSONArray();
-                            JSONObject item=new JSONObject();
-                            item.put("key","审核人");
-                            item.put("value","自动审核");
-                            dataJson.add(item);
-                            if(timeType.getNeedEvaluate()==1){
-                                JSONObject item1=new JSONObject();
-                                item1.put("key","评价");
-                                item1.put("value",StringUtils.isEmpty(report.getEvaluate())?"":report.getEvaluate());
-                                dataJson.add(item1);
-                                json.put("template_id","tty9TkCAAAWoUyhGnXRCZuhkgCqw_Uow");
-                            }else {
-                                json.put("template_id","tty9TkCAAANpvEtLrkPUGeOEd1-U7W2w");
-                            }
-                            JSONObject item2=new JSONObject();
-                            item2.put("key","日期");
-                            item2.put("value",report.getCreateDate());
-                            dataJson.add(item2);
-                            json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
-                            json.put("content_item",dataJson);
-                            wxCorpInfoService.sendWXCorpTemplateMsg(corpInfo.get(),first.get().getCorpwxUserid(),json);
-                        }
-                    }*/
-                }
+        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("report_auto_approve", 1));
+        if(timeTypeList.size()<=0){
+            return;
+        }
+        for (TimeType timeType : timeTypeList) {
+            Integer companyId = timeType.getCompanyId();
+            Integer reportAutoApproveDays = timeType.getReportAutoApproveDays();
+            if(reportAutoApproveDays==null){
+                continue;
+            }
+            LocalDate localDate = LocalDate.now().minusDays(reportAutoApproveDays);
+            List<Report> reports = reportMapper.selectList(new QueryWrapper<Report>().eq("state", 0).eq("company_id",companyId).le("create_time", localDate.atTime(LocalTime.now())));
+            for (Report report : reports) {
+                report.setState(1);
+                //项目审核的状态修改成已审核
+                report.setProjectAuditState(1);
+                report.setReportAutoApprove(1);
+                reportMapper.updateById(report);
             }
         }
-
     }
 
     //每周日晚上11点 企业微信同步一次本月的考勤打卡记录
@@ -447,7 +412,7 @@ public class TimingTask {
         String str = dt.format(now);
         String date = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(localDate);
         List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().isNotNull("alert_time")
-                .eq("alert_time", str));
+                .ge("alert_time", str));
         typeList.forEach(t->{
             if (str.equals(t.getAlertTime())) {
                 //发送推送提醒

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

@@ -8,19 +8,22 @@ spring:
   servlet:
     multipart:
       # 配置上传文件的大小设置
+
       # Single file max size  即单个文件大小
       max-file-size: 100MB
       max-request-size: 100MB
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://47.101.180.183:3306/man_bk?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     password: HuoshiDB@2022
     hikari:
-      maximum-pool-size: 10
-      minimum-idle: 3
-      max-lifetime: 30000
+      maximum-pool-size: 60
+      minimum-idle: 10
+      max-lifetime: 180000
+      # 数据库连接超时时间,默认30秒,即30000
+      connection-timeout: 60000
       connection-test-query: SELECT 1
   #######redis配置######
     # redis
@@ -126,7 +129,7 @@ referer:
     - mldworktime.ttkuaiban.com
     - gs.farben.com.cn
     - 47.101.180.183
-excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*
+excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/error,/testClient,/corpWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*,/report/getReportListByToken
 
 #企业微信相关参数
 suitId: ww4e237fd6abb635af

+ 6 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -637,10 +637,11 @@
     </select>
 
     <select id="getUserReportTimelinessRate" resultType="java.util.Map">
-        select `user`.name as userName,report.create_date as createDate,report.create_time as createTime from report
-        left join `user` on `user`.id=report.creator_id
-        where report.company_id=#{companyId}
-        and report.create_date between #{startDate} and #{endDate}
-        group by user.id,report.create_date
+        select `user`.name as userName,rl.create_date as createDate,MIN(rl.operate_date )as createTime from report_log rl
+        left join `user` on `user`.id=rl.operator_id
+        where rl.company_id=#{companyId}
+        and rl.create_date between  #{startDate} and #{endDate}
+        and rl.msg like '%提交了%'
+        group by user.id,rl.create_date
     </select>
 </mapper>

+ 21 - 2
fhKeeper/formulahousekeeper/timesheet/src/App.vue

@@ -4,7 +4,7 @@
 			<!-- <keep-alive>
                 <router-view v-if='$route.meta != null && $route.meta.keepAlive'/>
             </keep-alive> -->
-            <router-view />
+            <router-view v-if="isRouterAlive"/>
 		</transition>
 	</div>
 </template>
@@ -12,7 +12,26 @@
 <script>
     export default {
         name: 'app',
-        components: {}
+        components: {},
+        //父组件中返回要传给下级的数据
+	  	provide() {
+	    	return {
+	     		reloads: this.reloads,
+    		}
+	  	},
+		data(){
+			return{
+				isRouterAlive:true
+			}
+		},
+		methods:{
+			reloads(){
+				this.isRouterAlive = false
+				this.$nextTick(() => {
+					this.isRouterAlive = true
+				})
+			}
+		}
     }
 </script>
 

+ 50 - 5
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.js

@@ -30,15 +30,26 @@ export default {
   },
     // 角色
     role: {
-
+      ordinaryEmployees: 'Ordinary employees', // 普通员工
+      superAdministrator: 'Super Administrator', // 超级管理员
+      systemAdministrator: 'System Administrator', // 系统管理员
+      companyTop: 'Company top', // 公司高层
+      financialAdministrator: 'Financial Administrator', // 财务管理员
+      projectManager: 'Project Manager', // 项目管理员
+      companyLeadership: 'Company leadership', // 公司领导
     },
     // 状态
     state: {
-  
+      states: 'state', // 状态
+      notApproved: 'Not approved', // 审批未通过
+      ThereIsAnewTask: 'There is a new task', // 有新任务啦
+      TheresBeen: 'There been an update on the mission', // 任务有新进展
+      approvedProject: 'Approved project daily review', // 项目日报审核通过
     },
     // 有关时间中文
     time: {
-  
+      dueDate: 'Due date', // 到期日期
+      times: 'time', // 时间
     },
     // 所有表头
     headerTop: {
@@ -46,15 +57,49 @@ export default {
     },
     // 选择框/输入框的默认文字  例如:请选择XXX
     defaultText: {
-  
+      pleaseEnterTheOldPassword: 'Please enter the old password', // 请输入原密码
+      pleaseEnterTheNewPassword: 'Please enter the new password', // 请输入新密码
+      PleaseEnterYourName: 'Please enter your name', // 请输入姓名
+      PleaseEnterYourPhone: 'Please enter your phone', // 请输入手机号
+    },
+    // 选择框/输入框前面的文字 例如:<el-form-item label="新密码" prop="newPassword">
+    lable: {
+      originalPassword: 'original password', // 原密码
+      newPassword: 'new password', // 新密码
+      name: 'name', // 姓名
+      phone: 'phone', // 手机号
+    },
+    // title文字信息
+    title: {
+      modifyTheInformation: 'Modify the information', // 修改信息
     },
     // 按钮里面的文字
     btn: {
-  
+      cancel: 'cancel', // 取消
+      submit: 'ok', // 提交
     },
     // 文字链接 例如:新增项目 等
     textLink: {
   
     },
+    // 其他 
+    other: {
+      customerService: 'Customer service', // 咨询客服
+      sweepWeChatYards: 'Sweep WeChat yards', // 微信扫码
+      messageCenter: 'message center', // 消息中心
+      messageContent: 'message content', // 消息内容
+      unread: 'unread', // 未读
+      read: 'read', // 已读
+      changeThePassword: 'Change the password', // 修改密码
+      launchTheLogin: 'launch the login', // 退出登录
+      confirmExit: 'Confirm exit', // 确定退出吗?
+      prompts: 'prompt', // 提示
+      expired: 'expired', // 已过期
+    },
+    // 提示
+    message: {
+      logAganin: 'Modify the success Please log in again', // 修改成功请重新登录
+      modifyTheSuccess: 'Modify the success', // 修改成功
+    },
   ...enLocale
 }

+ 7 - 2
fhKeeper/formulahousekeeper/timesheet/src/i18n/index.js

@@ -1,21 +1,26 @@
 import Vue from 'vue'
 import VueI18n from 'vue-i18n'
 import locale from 'element-ui/lib/locale'
+import elementEn from 'element-ui/lib/locale/lang/en'; // element-ui 英语语言包
+import elementZh from 'element-ui/lib/locale/lang/zh-CN'; // element-ui 中文语言包
 import zh from './zh'
 import en from './en'
 Vue.use(VueI18n)
 const messages = {
   en: {
     ...en,
+    ...elementEn
   },
   zh: {
     ...zh,
+    ...elementZh
   }
 };
 const i18n = new VueI18n({
   locale: localStorage.lang || 'zh',
   messages,
 });
-// locale.i18n((key, value) => i18n.t(key, value))
-i18n: (key, value) => i18n.t(key, value)
+locale.i18n((key, value) => i18n.t(key, value))
+// i18n: (key, value) => i18n.t(key, value)
+
 export default i18n;

+ 51 - 5
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.js

@@ -30,15 +30,26 @@ export default {
   },
   // 角色
   role: {
-
+    ordinaryEmployees: '普通员工',
+    superAdministrator: '超级管理员',
+    systemAdministrator: '系统管理员', 
+    companyTop: '公司高层', 
+    financialAdministrator: '财务管理员', 
+    projectManager: '项目管理员', 
+    companyLeadership: '公司领导', 
   },
   // 状态
   state: {
-
+    states: '状态',
+    notApproved: '审批未通过',
+    ThereIsAnewTask: '有新任务啦',
+    TheresBeen: '任务有新进展',
+    approvedProject: '项目日报审核通过',
   },
   // 有关时间中文
   time: {
-
+    dueDate: '到期日期',
+    times: '时间'
   },
   // 所有表头
   headerTop: {
@@ -46,15 +57,50 @@ export default {
   },
   // 选择框/输入框的默认文字  例如:请选择XXX
   defaultText: {
-
+    pleaseEnterTheOldPassword: '请输入原密码',
+    pleaseEnterTheNewPassword: '请输入新密码',
+    PleaseEnterYourName: '请输入姓名',
+    PleaseEnterYourPhone: '请输入手机号'
+    
+  },
+  // 选择框/输入框前面的文字 例如:<el-form-item label="新密码" prop="newPassword">
+  lable: {
+    originalPassword: '原密码',
+    newPassword: '新密码',
+    name: '姓名',
+    phone: '手机号'
+  },
+  // title文字信息
+  title: {
+    modifyTheInformation: '修改信息',
   },
   // 按钮里面的文字
   btn: {
-
+    cancel: '取消', // 取消
+    submit: '提交', // 提交
   },
   // 文字链接 例如:新增项目 等
   textLink: {
 
+  },
+  // 其他 
+  other: {
+    customerService: '咨询客服',
+    sweepWeChatYards: '微信扫码',
+    messageCenter: '消息中心',
+    messageContent: '消息内容',
+    unread: '未读',
+    read: '已读',
+    changeThePassword: '修改密码',
+    launchTheLogin: '退出登录',
+    confirmExit: '确定退出吗?',
+    prompts: '提示',
+    expired: '已过期'
+  },
+  // 提示
+  message: {
+    logAganin: '修改成功,请重新登录',
+    modifyTheSuccess: '修改成功',
   },
   ...zhLocale
 }

+ 68 - 43
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -24,18 +24,18 @@
                     <el-dropdown-menu slot="dropdown">
                         <el-dropdown-item divided  command="zh">中文</el-dropdown-item>
                         <el-dropdown-item divided  command="en">English</el-dropdown-item>
-                    </el-dropdown-menu>
+                    </el-dropdown-menu> 
                 </el-dropdown> -->
 
                 <el-dropdown trigger="hover" style="margin-right:30px;">
                     <span class="el-dropdown-link userinfo-inner">
                         <i class="el-icon-user" style="font-size:18px" ></i>
-                        咨询客服
+                        {{$t('other.customerService')}}
                     </span> 
                     <el-dropdown-menu slot="dropdown">
                         <el-dropdown-item >
                             <div>
-                            <div>微信扫码</div>
+                            <div>{{$t('other.sweepWeChatYards')}}</div>
                             <img
                             style="width: 120px; height: 120px"
                             src="../assets/image/code.jpg" />
@@ -44,26 +44,26 @@
                     </el-dropdown-menu>
                 </el-dropdown> 
                     
-                到期日期:{{remainingTime}}
+                {{$t('time.dueDate')}}:{{remainingTime}}
                 <el-badge class="itemNew" :value="num" :hidden="num == 0">
                     <i class="el-icon-message-solid" style="font-size:24px" v-popover:popover1 @click="drawer = true"></i>
                 </el-badge>
-                <el-drawer title="消息中心" :visible.sync="drawer" direction="rtl" :with-header="false" size="35%">
+                <el-drawer :title="$t('other.messageCenter')" :visible.sync="drawer" direction="rtl" :with-header="false" size="35%">
                     <el-table :data="popoverData" :height="tableHeight" size="small">
-                        <el-table-column property="type" label="消息内容" align="left">
+                        <el-table-column property="type" :label="$t('other.messageContent')" align="left">
                             <template slot-scope="scope">
                                 <el-link type="primary" :underline="false" @click="locationHerf(scope.row.id,scope.row.content, scope.row.type)">
                                     <span style="font-size:13px;">{{scope.row.msg==null?msgTypeTxt[scope.row.type]:scope.row.msg}}</span>
                                 </el-link>
                             </template> 
                         </el-table-column>
-                        <el-table-column property="type" label="状态" align="center" width="60">
+                        <el-table-column property="type" :label="$t('state.states')" align="center" width="60">
                             <template slot-scope="scope">
-                                <span v-if="scope.row.checked == 0" style="color:red">未读</span>
-                                <span v-else style="color:green">已读</span>
+                                <span v-if="scope.row.checked == 0" style="color:red">{{$t('other.unread')}}</span>
+                                <span v-else style="color:green">{{$t('other.read')}}</span>
                             </template>
                         </el-table-column>
-                        <el-table-column property="time" label="时间" align="center" width="120"></el-table-column>
+                        <el-table-column property="time" :label="$t('time.times')" align="center" width="120"></el-table-column>
                     </el-table>
                 </el-drawer>                
                 <el-dropdown trigger="hover" style="margin-left:10px;">
@@ -74,9 +74,9 @@
                     <el-dropdown-menu slot="dropdown">
                         <!-- <el-dropdown-item disabled ><span style="font-size:12px;"><i class="el-icon-view" ></i>{{roleArray[user.role]}}</span></el-dropdown-item> -->
                         <el-dropdown-item disabled ><span style="font-size:12px;"><i class="el-icon-view" ></i>{{user.roleName}}</span></el-dropdown-item>
-                        <el-dropdown-item @click.native="reset">修改密码</el-dropdown-item>
+                        <el-dropdown-item @click.native="reset">{{$t('other.changeThePassword')}}</el-dropdown-item>
                         <!-- <el-dropdown-item @click.native="editInfoOpen">修改信息</el-dropdown-item> -->
-                        <el-dropdown-item divided @click.native="logout">退出登录</el-dropdown-item>
+                        <el-dropdown-item divided @click.native="logout">{{$t('other.launchTheLogin')}}</el-dropdown-item>
                     </el-dropdown-menu>
                 </el-dropdown>
             </el-col>
@@ -92,17 +92,26 @@
                             <template slot="title"> 
                                 <i :class="item.iconCls"></i>
                                 <!-- <span class="itemName">{{item.name}}</span> -->
-                                <span class="itemName">{{$t(item.meta.text)}}</span>
+                                <span class="itemName bosx" v-if="$t(item.meta.text).length < 16">{{$t(item.meta.text)}}</span>
+                                <el-tooltip class="itemName bosx"  v-if="$t(item.meta.text).length > 16" effect="dark" :content="$t(item.meta.text)" placement="top">
+                                    <span>{{$t(item.meta.text)}}</span>
+                                </el-tooltip>
                             </template>
                             <el-menu-item v-for="child in item.children" :index="child.path" :key="child.path" v-if="!child.hidden"><i :class="child.iconCls"></i>
                                 <!-- {{child.name}} -->
-                                {{$t(child.meta.text)}}
+                                <span class="bosx" v-if="$t(child.meta.text).length < 16">{{$t(child.meta.text)}}</span>
+                                <el-tooltip class="bosx"  v-if="$t(child.meta.text).length > 16" effect="dark" :content="$t(child.meta.text)" placement="top">
+                                    <span>{{$t(child.meta.text)}}</span>
+                                </el-tooltip>
                             </el-menu-item>
                         </el-submenu>
                         <el-menu-item v-if="item.leaf && item.children.length > 0" :index="item.children[0].path">
                             <i :class="item.iconCls"></i> 
                             <!-- {{item.children[0].name}} -->
-                            {{$t(item.meta.text)}}
+                            <span class="bosx" v-if="$t(item.meta.text).length < 16">{{$t(item.meta.text)}}</span>
+                            <el-tooltip class="itemName bosx"  v-if="$t(item.meta.text).length > 16" effect="dark" :content="$t(item.meta.text)" placement="top">
+                                <span>{{$t(item.meta.text)}}</span>
+                            </el-tooltip>
                             <!-- {{$t('navigation.reports')}} -->
                             <!-- this.$t('navigation.reports')  // js-->
                         </el-menu-item>
@@ -145,36 +154,36 @@
                 </div>
 
                 <!--修改密码-->
-                <el-dialog title="修改密码" width='450px' v-if="editPassWord" :visible.sync="editPassWord" :close-on-click-modal="false" customClass="customWidth">
-                    <el-form :model="addForm" label-width="80px" :rules="passRule" ref="addForm">
-                        <el-form-item label="原密码" prop="originPassword">
-                            <el-input v-model="addForm.originPassword" autocomplete="off" placeholder="请输入原密码" show-password></el-input>
+                <el-dialog :title="$t('other.changeThePassword')" width='450px' v-if="editPassWord" :visible.sync="editPassWord" :close-on-click-modal="false" customClass="customWidth">
+                    <el-form :model="addForm" label-width="auto" :rules="passRule" ref="addForm">
+                        <el-form-item :label="$t('lable.originalPassword')" prop="originPassword">
+                            <el-input v-model="addForm.originPassword" autocomplete="off" :placeholder="$t('defaultText.pleaseEnterTheOldPassword')" show-password></el-input>
                         </el-form-item>
-                        <el-form-item label="新密码" prop="newPassword">
-                            <el-input v-model="addForm.newPassword" autocomplete="off" placeholder="请输入新密码" show-password></el-input>
+                        <el-form-item :label="$t('lable.newPassword')" prop="newPassword">
+                            <el-input v-model="addForm.newPassword" autocomplete="off" :placeholder="$t('defaultText.pleaseEnterTheNewPassword')" show-password></el-input>
                         </el-form-item>
                     </el-form>
                     <div slot="footer" class="dialog-footer">
-                        <el-button @click.native="editPassWord = false">取消</el-button>
-                        <el-button type="primary" @click.native="resetPwd" :loading="editLoading">提交</el-button>
+                        <el-button @click.native="editPassWord = false">{{$t('btn.cancel')}}</el-button>
+                        <el-button type="primary" @click.native="resetPwd" :loading="editLoading">{{$t('btn.submit')}}</el-button>
                     </div>
                 </el-dialog>
 
                 <!--修改信息-->
-                <el-dialog title="修改信息" width='450px' v-if="editInformation" :visible.sync="editInformation" :close-on-click-modal="false" customClass="customWidth">
-                    <el-form :model="editInfoForm" label-width="80px" :rules="passRule" ref="editInfoForm">
-                        <el-form-item label="姓名" prop="username">
-                            <el-input v-model="editInfoForm.username" autocomplete="off" placeholder="请输入姓名"></el-input>
+                <el-dialog :title="$t('lable.modifyTheInformation')" width='450px' v-if="editInformation" :visible.sync="editInformation" :close-on-click-modal="false" customClass="customWidth">
+                    <el-form :model="editInfoForm" label-width="auto" :rules="passRule" ref="editInfoForm">
+                        <el-form-item :label="$t('lable.name')" prop="username">
+                            <el-input v-model="editInfoForm.username" autocomplete="off" :placeholder="$t('defaultText.PleaseEnterYourName')"></el-input>
                         </el-form-item>
                     </el-form>
-                    <el-form :model="editInfoForm" label-width="80px" :rules="passRule" ref="editInfoForm">
-                        <el-form-item label="手机号" prop="mobile">
-                        <el-input v-model="editInfoForm.mobile" autocomplete="off" placeholder="请输入手机号" :disabled="true"></el-input>
+                    <el-form :model="editInfoForm" label-width="auto" :rules="passRule" ref="editInfoForm">
+                        <el-form-item :label="$t('lable.phone')" prop="mobile">
+                        <el-input v-model="editInfoForm.mobile" autocomplete="off" :placeholder="$t('defaultText.PleaseEnterYourPhone')" :disabled="true"></el-input>
                         </el-form-item>
                     </el-form>
                     <div slot="footer" class="dialog-footer">
-                        <el-button @click.native="editInformation = false">取消</el-button>
-                        <el-button type="primary" @click.native="editInfo" :loading="editLoading2">提交</el-button>
+                        <el-button @click.native="editInformation = false">{{$t('btn.cancel')}}</el-button>
+                        <el-button type="primary" @click.native="editInfo" :loading="editLoading2">{{$t('btn.submit')}}</el-button>
                     </div>
                 </el-dialog>
             </section>
@@ -185,15 +194,19 @@
 <script>
     import util from "../common/js/util";
     export default {
+        // 引用 app.vue reloads 方法
+        inject:['reloads'],
         data() {
             return {
-                roleArray:["普通员工","超级管理员", "系统管理员", "公司高层","财务管理员", "项目管理员","公司领导"],
+                // roleArray:["普通员工","超级管理员", "系统管理员", "公司高层","财务管理员", "项目管理员","公司领导"],
+                roleArray:[this.$t('role.ordinaryEmployees'),this.$t('role.superAdministrator'),this.$t('role.systemAdministrator'),this.$t('role.companyTop'),this.$t('role.financialAdministrator'),this.$t('role.projectManager'),this.$t('role.companyLeadership')],
                 helpImg: '../assets/image/userHead.png',
                 user: sessionStorage.getItem("user"),
                 collapsed: sessionStorage.collapsed!=null?(sessionStorage.collapsed=='true'?true:false):false,
                 sysUserName: "",
                 menu: [],
-                msgTypeTxt:["审批未通过","有新任务啦","任务有新进展","项目日报审核通过"],
+                // msgTypeTxt:["审批未通过","有新任务啦","任务有新进展","项目日报审核通过"],
+                msgTypeTxt:[this.$t('state.notApproved'),this.$t('state.ThereIsAnewTask'),this.$t('state.TheresBeen'),this.$t('state.approvedProject')],
                 editInformation: false,
                 editPassWord: false,
                 editLoading: false,
@@ -210,9 +223,9 @@
                     companyName: ""
                 },
                 passRule: {
-                    originPassword: [{ required: true, message: "请输入原密码", trigger: "blur" }],
-                    newPassword: [{ required: true, message: "请输入新密码", trigger: "blur" }],
-                    username: [{ required: true, message: "请输入姓名", trigger: "blur" }]
+                    originPassword: [{ required: true, message: this.$t('defaultText.pleaseEnterTheOldPassword'), trigger: "blur" }],
+                    newPassword: [{ required: true, message: this.$t('defaultText.pleaseEnterTheNewPassword'), trigger: "blur" }],
+                    username: [{ required: true, message: this.$t('defaultText.PleaseEnterYourName'), trigger: "blur" }]
                 },
 
                 //时间
@@ -233,6 +246,7 @@
 
             // 中英文切换
             langChange(command) {
+                let flg = this.language
                 this.$i18n.locale = command
                 localStorage.setItem("lang", command)
                 if(command == 'en') {
@@ -240,15 +254,18 @@
                 } else if (command == 'zh') {
                     this.language = '中文'
                 }
+                if(flg != this.language) {
+                    this.reloads()
+                }
             },
             
             //退出登录
             logout: function() {
                 var _this = this;
-                this.$confirm("确认退出吗?", "提示", {
+                this.$confirm(this.$t('other.confirmExit') + '?', this.$t('other.prompts'), {
                     //type: 'warning'
-                    confirmButtonText: '确定',
-                    cancelButtonText: '取消',
+                    confirmButtonText: this.$t('btn.submit'),
+                    cancelButtonText: this.$t('btn.cancel'),
                 }).then(() => {
                     sessionStorage.removeItem("user");
                     location.reload();
@@ -296,7 +313,7 @@
                         this.editInformation = false;
                         if (res.code == "ok") {
                             this.$message({
-                            message: "修改成功",
+                            message: this.$t('message.modifyTheSuccess'),
                             type: "success"
                             });
                             //读取并覆盖session storage
@@ -340,7 +357,8 @@
                             this.editPassWord = false;
                             if (res.code == "ok") {
                                 this.$message({
-                                message: "修改成功,请重新登录",
+                                // message: "修改成功,请重新登录",
+                                message: this.$t('message.logAganin'),
                                 type: "success"
                                 });
                                 this.$router.push("/login");
@@ -470,7 +488,7 @@
                 if(this.user.remainingTime != "" && this.user.remainingTime != 0) {
                     this.remainingTime = util.formatDate.format(new Date(new Date().getTime() + this.user.remainingTime), "yyyy-MM-dd")
                 } else {
-                    this.remainingTime = "已过期";
+                    this.remainingTime = this.$t('other.expired');
                     clearInterval(this.timer);
                 }
             } else {
@@ -664,4 +682,11 @@
     .isRead {
         color: #999 !important;
     }
+    .bosx {
+        width: 110px;
+        display: inline-block;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+    }
 </style>

+ 0 - 20
src/main/java/com/management/platform/service/impl/ExpenseTypeServiceImpl.java

@@ -1,20 +0,0 @@
-package com.management.platform.service.impl;
-
-import com.management.platform.entity.ExpenseType;
-import com.management.platform.mapper.ExpenseTypeMapper;
-import com.management.platform.service.ExpenseTypeService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- *  服务实现类
- * </p>
- *
- * @author Seyason
- * @since 2022-07-28
- */
-@Service
-public class ExpenseTypeServiceImpl extends ServiceImpl<ExpenseTypeMapper, ExpenseType> implements ExpenseTypeService {
-
-}