瀏覽代碼

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

cs 2 年之前
父節點
當前提交
3345b40d7c
共有 18 個文件被更改,包括 1003 次插入729 次删除
  1. 3 2
      fhKeeper/formulahousekeeper/inva_4_tivo/index.html
  2. 91 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectDocumentController.java
  3. 66 49
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectDocumentTemplateController.java
  4. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProDocumentTemDetail.java
  5. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectDocument.java
  6. 55 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  7. 22 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseItemMapper.xml
  9. 5 2
      fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue
  10. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  11. 6 10
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  12. 4 2
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  13. 二進制
      fhKeeper/formulahousekeeper/timesheet_h5/src/assets/img/null.png
  14. 2 2
      fhKeeper/formulahousekeeper/timesheet_h5/src/main.js
  15. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  16. 488 448
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/index.vue
  17. 243 195
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue
  18. 2 1
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

+ 3 - 2
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -771,8 +771,9 @@
 
         function check(){
             let str = window.location.href
-            if(str.indexOf('360') > 1) {
-                $('#tilA').attr('href', 'http://worktime.ttkuaiban.com/#/register?form=360')
+            if(str.indexOf('from') > 1) {
+				let strUrl = window.location.href.split('?')[1]
+                $('#tilA').attr('href', `http://worktime.ttkuaiban.com/#/register?${strUrl}`)
             } else {
                 $('#tilA').attr('href', 'http://worktime.ttkuaiban.com/#/register')
             }

+ 91 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectDocumentController.java

@@ -1,16 +1,13 @@
 package com.management.platform.controller;
 
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.constant.Constant;
-import com.management.platform.entity.PdfFile;
-import com.management.platform.entity.ProjectDocfolder;
-import com.management.platform.entity.ProjectDocument;
-import com.management.platform.entity.User;
-import com.management.platform.mapper.PdfFileMapper;
-import com.management.platform.mapper.ProjectDocfolderMapper;
-import com.management.platform.mapper.ProjectDocumentMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectDocumentService;
 import com.management.platform.util.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,12 +24,11 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.time.LocalDateTime;
+import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -57,6 +53,10 @@ public class ProjectDocumentController {
     @Resource
     private ProjectDocfolderMapper projectDocfolderMapper;
     @Resource
+    private ProDocumentTemDetailMapper proDocumentTemDetailMapper;
+    @Resource
+    private ProjectDocumentTemplateMapper projectDocumentTemplateMapper;
+    @Resource
     private PdfFileMapper pdfFileMapper;
     @Value("${upload.path}")
     private String uploadPath;
@@ -315,5 +315,84 @@ public class ProjectDocumentController {
         msg.data=map;
         return msg;
     }
+
+    @RequestMapping("/getSubList")
+    public HttpRespMsg getSubList(Integer projectId, Integer parentFid){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        List<ProjectDocument> documentList = projectDocumentMapper.selectList(new QueryWrapper<ProjectDocument>().eq("project_id", projectId).eq("is_folder", 1).eq("is_deleted", 0));
+        List<ProjectDocument> firstHierarchy;
+        List<ProjectDocument> sub;
+        if(parentFid==null){
+            firstHierarchy = documentList.stream().filter(dl -> dl.getFolderId() == null).collect(Collectors.toList());
+        }else {
+            firstHierarchy = documentList.stream().filter(dl -> dl.getFolderId() != null && dl.getFolderId().equals(parentFid)).collect(Collectors.toList());
+        }
+        sub = getSub(firstHierarchy, documentList);
+        sub.forEach(s->{
+            s.setLabel(s.getDocumentName());
+        });
+        httpRespMsg.setData(sub);
+        return httpRespMsg;
+    }
+
+    public List<ProjectDocument> getSub(List<ProjectDocument> firstHierarchy,List<ProjectDocument> documentList){
+        for (ProjectDocument projectDocument : firstHierarchy) {
+            List<ProjectDocument> collect = documentList.stream().filter(dl -> dl.getFolderId() != null && dl.getFolderId().equals(projectDocument.getId())).collect(Collectors.toList());
+            List<ProjectDocument> sub = getSub(collect, documentList);
+            sub.forEach(s->{
+                s.setLabel(s.getDocumentName());
+            });
+            projectDocument.setChildren(sub);
+        }
+        return firstHierarchy;
+    }
+
+
+    @RequestMapping("/buildWithTemplate")
+    public HttpRespMsg buildWithTemplate(Integer templateId,Integer projectId){
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<ProDocumentTemDetail> proDocumentTemDetailList = proDocumentTemDetailMapper.selectList(new QueryWrapper<ProDocumentTemDetail>().eq("template_id", templateId));
+        List<ProDocumentTemDetail> collect = proDocumentTemDetailList.stream().filter(pl -> pl.getParentId() == null).collect(Collectors.toList());
+        List<ProDocumentTemDetail> details = proDocumentTemDetailList.stream().filter(p -> p.getParentId() == null).collect(Collectors.toList());
+        List<ProjectDocument> list=new ArrayList<>();
+        details.forEach(dl->{
+            ProjectDocument projectDocument=new ProjectDocument();
+            projectDocument.setDocumentName(dl.getName());
+            projectDocument.setLabel(dl.getName());
+            projectDocument.setIsFolder(1);
+            projectDocument.setIndate(LocalDateTime.now());
+            projectDocument.setProjectId(projectId);
+            projectDocument.setIsDeleted(0);
+            projectDocument.setCreatorId(user.getId());
+            projectDocument.setCreatorName(user.getName());
+            projectDocument.setProDocumentTemDetailId(dl.getId());
+            list.add(projectDocument);
+        });
+        projectDocumentService.saveBatch(list);
+        getParentFolders(list,proDocumentTemDetailList,projectId,user);
+        return new HttpRespMsg();
+    }
+    public void getParentFolders(List<ProjectDocument> projectDocumentList,List<ProDocumentTemDetail> proDocumentTemDetailList,Integer projectId,User user){
+        List<ProjectDocument> list=new ArrayList<>();
+        for (ProjectDocument projectDocument : projectDocumentList) {
+            List<ProDocumentTemDetail> collect = proDocumentTemDetailList.stream().filter(pd -> pd.getParentId() != null && pd.getParentId().equals(projectDocument.getProDocumentTemDetailId())).collect(Collectors.toList());
+            collect.forEach(c->{
+                ProjectDocument item=new ProjectDocument();
+                item.setDocumentName(c.getName());
+                item.setLabel(c.getName());
+                item.setIsFolder(1);
+                item.setIndate(LocalDateTime.now());
+                item.setProjectId(projectId);
+                item.setIsDeleted(0);
+                item.setCreatorId(user.getId());
+                item.setCreatorName(user.getName());
+                item.setProDocumentTemDetailId(c.getId());
+                item.setFolderId(projectDocument.getProDocumentTemDetailId());
+                list.add(item);
+            });
+            projectDocumentService.saveBatch(list);
+            getParentFolders(list,proDocumentTemDetailList,projectId,user);
+        }
+    }
 }
 

+ 66 - 49
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectDocumentTemplateController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.management.platform.entity.ProDocumentTemDetail;
 import com.management.platform.entity.ProjectDocument;
 import com.management.platform.entity.ProjectDocumentTemplate;
@@ -22,10 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -55,68 +53,85 @@ public class ProjectDocumentTemplateController {
     public HttpRespMsg list(){
       HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        List<ProjectDocumentTemplate> documentTemplateList = projectDocumentTemplateService.list(new QueryWrapper<ProjectDocumentTemplate>().eq("company_id", companyId));
+        List<ProjectDocumentTemplate> documentTemplateList = projectDocumentTemplateService.list(new QueryWrapper<ProjectDocumentTemplate>().eq("company_id", companyId).orderByDesc("id"));
         List<Integer> collect = documentTemplateList.stream().map(ProjectDocumentTemplate::getId).distinct().collect(Collectors.toList());
         collect.add(-1);
         List<ProDocumentTemDetail> proDocumentTemDetails = proDocumentTemDetailService.list(new QueryWrapper<ProDocumentTemDetail>().in("template_id", collect));
         documentTemplateList.forEach(dl->{
             List<ProDocumentTemDetail> details = proDocumentTemDetails.stream().filter(p -> p.getTemplateId().equals(dl.getId())).collect(Collectors.toList());
-            List<ProDocumentTemDetail> parentFolders = getParentFolders(details);
-            dl.setProDocumentTemDetailList(parentFolders);
+            List<ProDocumentTemDetail> rootDirectory = proDocumentTemDetails.stream().filter(pt -> pt.getParentId() == null&&pt.getTemplateId().equals(dl.getId())).collect(Collectors.toList());
+            getParentFolders(rootDirectory,details);
+            dl.setProDocumentTemDetailList(rootDirectory);
         });
         httpRespMsg.setData(documentTemplateList);
         System.out.println(documentTemplateList);
         return httpRespMsg;
     }
 
-    public List<ProDocumentTemDetail> getParentFolders(List<ProDocumentTemDetail> proDocumentTemDetails){
+    public List<ProDocumentTemDetail> getParentFolders(List<ProDocumentTemDetail> rootDirectory,List<ProDocumentTemDetail> proDocumentTemDetails){
         //过滤出一级文件夹
-        List<ProDocumentTemDetail> rootDirectory = proDocumentTemDetails.stream().filter(pt -> pt.getParentId() == null).collect(Collectors.toList());
         rootDirectory.forEach(rd->{
+            rd.setLabel(rd.getName());
             List<ProDocumentTemDetail> documentTemDetails = proDocumentTemDetails.stream().filter(pl -> pl.getParentId() != null && pl.getParentId().equals(rd.getId())).collect(Collectors.toList());
             rd.setChildren(documentTemDetails);
-            getParentFolders(documentTemDetails);
-;
+            getParentFolders(documentTemDetails,proDocumentTemDetails);
         });
-        return rootDirectory;
+        return proDocumentTemDetails;
     }
 
     @RequestMapping("/addTemplate")
-    public HttpRespMsg addTemplate(String documentString,String name ,Integer creWithPro){
-        JSONArray jsonArray = JSONArray.parseArray(documentString);
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        if(jsonArray!=null&&jsonArray.size()>0){
-            Integer projectId = jsonArray.getJSONObject(0).getInteger("projectId");
-            List<ProjectDocument> list = projectDocumentMapper.selectList(new QueryWrapper<ProjectDocument>().eq("project_id", projectId).eq("is_folder",1).eq("is_deleted",0));
-            ProjectDocumentTemplate projectDocumentTemplate=new ProjectDocumentTemplate();
-            projectDocumentTemplate.setCompanyId(companyId);
-            projectDocumentTemplate.setCreWithPro(creWithPro);
-            projectDocumentTemplate.setName(name);
-            projectDocumentTemplateService.save(projectDocumentTemplate);
-            List<ProDocumentTemDetail> detailList = getSubordinateFolders(jsonArray, projectDocumentTemplate.getId(), list);
-            proDocumentTemDetailService.saveOrUpdateBatch(detailList);
+    public HttpRespMsg addTemplate(String documentString,String name ,Integer creWithPro,Integer id){
+        if(id==null){
+            JSONArray jsonArray = JSONArray.parseArray(documentString);
+            Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+            if(jsonArray!=null&&jsonArray.size()>0){
+                ProjectDocumentTemplate projectDocumentTemplate=new ProjectDocumentTemplate();
+                projectDocumentTemplate.setCompanyId(companyId);
+                projectDocumentTemplate.setCreWithPro(creWithPro);
+                projectDocumentTemplate.setName(name);
+                projectDocumentTemplateService.save(projectDocumentTemplate);
+                //模板第一层
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    JSONObject jsonObject = jsonArray.getJSONObject(i);
+                    JSONArray children = jsonObject.getJSONArray("children");
+                    ProDocumentTemDetail proDocumentTemDetail=new ProDocumentTemDetail();
+                    proDocumentTemDetail.setName(jsonObject.getString("label"));
+                    proDocumentTemDetail.setTemplateId(projectDocumentTemplate.getId());
+                    proDocumentTemDetailService.save(proDocumentTemDetail);
+                    List<ProDocumentTemDetail> subordinateFolders = getSubordinateFolders(proDocumentTemDetail, children, projectDocumentTemplate.getId());
+                    proDocumentTemDetailService.saveBatch(subordinateFolders);
+                }
+
+            }
+        }else {
+            proDocumentTemDetailService.remove(new QueryWrapper<ProDocumentTemDetail>().eq("template_id",id));
+            JSONArray jsonArray = JSONArray.parseArray(documentString);
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject jsonObject = jsonArray.getJSONObject(i);
+                ProDocumentTemDetail p=new ProDocumentTemDetail();
+                p.setTemplateId(id);
+                p.setName(jsonObject.getString("name")==null?jsonObject.getString("label"):jsonObject.getString("name"));
+                proDocumentTemDetailService.save(p);
+                JSONArray children = jsonObject.getJSONArray("children");
+                getChildren(children,id, p.getId());
+            }
         }
         return new HttpRespMsg();
     }
 
-    public List<ProDocumentTemDetail> getSubordinateFolders(JSONArray jsonArray,Integer templateId,List<ProjectDocument> allList){
+    public List<ProDocumentTemDetail> getSubordinateFolders(ProDocumentTemDetail proDocumentTemDetail,JSONArray children,Integer templateId){
         List<ProDocumentTemDetail> proDocumentTemDetailList=new ArrayList<>();
-        for (int i = 0; i < jsonArray.size(); i++) {
-            JSONObject jsonObject = jsonArray.getJSONObject(i);
-            ProDocumentTemDetail proDocumentTemDetail=new ProDocumentTemDetail();
-            proDocumentTemDetail.setName(jsonObject.getString("documentName"));
-            proDocumentTemDetail.setTemplateId(templateId);
-            proDocumentTemDetailService.saveOrUpdate(proDocumentTemDetail);
-            proDocumentTemDetailList.add(proDocumentTemDetail);
-            List<ProjectDocument> collect = allList.stream().filter(l ->l.getFolderId()!=null&& l.getFolderId().equals(jsonObject.get("id"))).collect(Collectors.toList());
-            if(collect.size()>0){
-                List<ProDocumentTemDetail> subordinateFolders = getSubordinateFolders(JSONArray.parseArray(JSON.toJSONString(collect)), templateId, allList);
-                subordinateFolders.forEach(sf->{
-                    sf.setParentId(proDocumentTemDetail.getId());
-                    proDocumentTemDetailService.saveOrUpdate(sf);
-                });
+            for (int i = 0; i < children.size(); i++) {
+                JSONObject jsonObject1 = children.getJSONObject(i);
+                ProDocumentTemDetail proDocumentTemDetail1=new ProDocumentTemDetail();
+                proDocumentTemDetail1.setName(jsonObject1.getString("label"));
+                proDocumentTemDetail1.setTemplateId(templateId);
+                proDocumentTemDetail1.setParentId(proDocumentTemDetail.getId());
+                JSONArray children1 = jsonObject1.getJSONArray("children");
+                proDocumentTemDetailService.save(proDocumentTemDetail1);
+                List<ProDocumentTemDetail> subordinateFolders = getSubordinateFolders(proDocumentTemDetail1, children1, templateId);
+                proDocumentTemDetailList.addAll(subordinateFolders);
             }
-        }
         return proDocumentTemDetailList;
     }
 
@@ -133,15 +148,17 @@ public class ProjectDocumentTemplateController {
         }
         return httpRespMsg;
     }
-
-    @RequestMapping("/update")
-    public HttpRespMsg update(ProjectDocumentTemplate projectDocumentTemplate){
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
-        if(!projectDocumentTemplateService.updateById(projectDocumentTemplate)){
-            httpRespMsg.setError("验证失败");
-            return httpRespMsg;
+    public void getChildren(JSONArray list,Integer templateId,Integer parentId){
+        for (int i = 0; i < list.size(); i++) {
+            JSONObject jsonObject = list.getJSONObject(i);
+            ProDocumentTemDetail p=new ProDocumentTemDetail();
+            p.setTemplateId(templateId);
+            p.setName(jsonObject.getString("name")==null?jsonObject.getString("label"):jsonObject.getString("name"));
+            p.setParentId(parentId);
+            proDocumentTemDetailService.save(p);
+            JSONArray children = jsonObject.getJSONArray("children");
+            getChildren(children,templateId, p.getId());
         }
-        return httpRespMsg;
     }
 
 }

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProDocumentTemDetail.java

@@ -41,6 +41,9 @@ public class ProDocumentTemDetail extends Model<ProDocumentTemDetail> {
     @TableField(exist =  false)
     private List<ProDocumentTemDetail> children;
 
+    @TableField(exist = false)
+    private String label;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
@@ -102,6 +103,15 @@ public class ProjectDocument extends Model<ProjectDocument> {
     @TableField("is_folder")
     private Integer isFolder;
 
+    @TableField(exist = false)
+    private List<ProjectDocument> children;
+
+    @TableField(exist = false)
+    private String label;
+
+    @TableField(exist = false)
+    private Integer proDocumentTemDetailId;
+
 
     @Override
     protected Serializable pkVal() {

+ 55 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -205,6 +205,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     private ExpenseSheetMapper expenseSheetMapper;
     @Resource
     private ExpenseTypeMapper expenseTypeMapper;
+    @Resource
+    private ProjectDocumentService projectDocumentService;
+    @Resource
+    private ProDocumentTemDetailMapper proDocumentTemDetailMapper;
+    @Resource
+    private ProjectDocumentTemplateMapper projectDocumentTemplateMapper;
 
     @Resource
     private HttpServletResponse response;
@@ -676,6 +682,28 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     operationRecord.setContent(MessageUtils.message("Template.creatProject"));
                     operationRecord.setCompanyId(user.getCompanyId());
                     operationRecordService.save(operationRecord);
+                    //随着存在随着项目创建而创建的文件中心模板
+                    List<ProjectDocumentTemplate> templateList = projectDocumentTemplateMapper.selectList(new QueryWrapper<ProjectDocumentTemplate>().eq("company_id", companyId).eq("cre_with_pro", 1));
+                    List<Integer> collect = templateList.stream().map(ProjectDocumentTemplate::getId).distinct().collect(Collectors.toList());
+                    collect.add(-1);
+                    List<ProDocumentTemDetail> proDocumentTemDetailList = proDocumentTemDetailMapper.selectList(new QueryWrapper<ProDocumentTemDetail>().in("template_id", collect));
+                    List<ProDocumentTemDetail> details = proDocumentTemDetailList.stream().filter(p -> p.getParentId() == null).collect(Collectors.toList());
+                    List<ProjectDocument> list=new ArrayList<>();
+                    details.forEach(dl->{
+                        ProjectDocument projectDocument=new ProjectDocument();
+                        projectDocument.setDocumentName(dl.getName());
+                        projectDocument.setLabel(dl.getName());
+                        projectDocument.setIsFolder(1);
+                        projectDocument.setIndate(LocalDateTime.now());
+                        projectDocument.setProjectId(project.getId());
+                        projectDocument.setIsDeleted(0);
+                        projectDocument.setCreatorId(project.getCreatorId());
+                        projectDocument.setCreatorName(user.getName());
+                        projectDocument.setProDocumentTemDetailId(dl.getId());
+                        list.add(projectDocument);
+                    });
+                    projectDocumentService.saveBatch(list);
+                    getParentFolders(list,proDocumentTemDetailList,project,user);
                 }
             }
         } else {
@@ -2177,10 +2205,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             for (ExpenseMainType expenseMainType : expenseMainTypes) {
                 Map<String,Object> item=new HashMap<>();
                 item.put("type",expenseMainType.getId());
-                List<ExpenseSheet> sheetList = expenseSheetList.stream().filter(es -> es.getType().equals(expenseMainType.getId())).collect(Collectors.toList());
+                List<ExpenseSheet> sheetList = expenseSheetList.stream().filter(es ->es.getType()!=null&&es.getType().equals(expenseMainType.getId())).collect(Collectors.toList());
                 List<Integer> collect = sheetList.stream().map(ExpenseSheet::getId).distinct().collect(Collectors.toList());
                 collect.add(-1);
                 double sum = expenseItemList.stream().filter(el -> collect.contains(el.getExpenseId())&&el.getProjectId()!=null&&el.getProjectId().equals(map.get("id"))).mapToDouble(el -> el.getAmount()==null?0:el.getAmount()).sum();
+                sum = Double.parseDouble(df.format(sum));
                 item.put("amount",sum);
                 itemList.add(item);
                 map.put(expenseMainType.getName(),sum);
@@ -2253,10 +2282,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             for (ExpenseMainType expenseMainType : expenseMainTypes) {
                 Map<String,Object> it=new HashMap<>();
                 it.put("type",expenseMainType.getId());
-                List<ExpenseSheet> sheetList = expenseSheetList.stream().filter(es -> es.getType().equals(expenseMainType.getId())).collect(Collectors.toList());
+                List<ExpenseSheet> sheetList = expenseSheetList.stream().filter(es ->es.getType()!=null&& es.getType().equals(expenseMainType.getId())).collect(Collectors.toList());
                 List<Integer> collect = sheetList.stream().map(ExpenseSheet::getId).distinct().collect(Collectors.toList());
                 collect.add(-1);
                 double sum = expenseItemList.stream().filter(el -> collect.contains(el.getExpenseId())&&el.getProjectId()!=null&&el.getProjectId().equals(item.get("id"))).mapToDouble(el -> el.getAmount()==null?0:el.getAmount()).sum();
+                sum = Double.parseDouble(df.format(sum));
                 it.put("amount",sum);
                 data.add(String.valueOf(sum));
                 bigDecimal=bigDecimal.add(new BigDecimal(sum));
@@ -10086,4 +10116,27 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         httpRespMsg.data =  pathPrefix + fileName+".xlsx";
         return httpRespMsg;
     }
+
+    public void getParentFolders(List<ProjectDocument> projectDocumentList,List<ProDocumentTemDetail> proDocumentTemDetailList,Project project,User user){
+        List<ProjectDocument> list=new ArrayList<>();
+        for (ProjectDocument projectDocument : projectDocumentList) {
+            List<ProDocumentTemDetail> collect = proDocumentTemDetailList.stream().filter(pd -> pd.getParentId() != null && pd.getParentId().equals(projectDocument.getProDocumentTemDetailId())).collect(Collectors.toList());
+            collect.forEach(c->{
+                ProjectDocument item=new ProjectDocument();
+                item.setDocumentName(c.getName());
+                item.setLabel(c.getName());
+                item.setIsFolder(1);
+                item.setIndate(LocalDateTime.now());
+                item.setProjectId(project.getId());
+                item.setIsDeleted(0);
+                item.setCreatorId(project.getCreatorId());
+                item.setCreatorName(user.getName());
+                item.setProDocumentTemDetailId(c.getId());
+                item.setFolderId(projectDocument.getProDocumentTemDetailId());
+                list.add(item);
+            });
+            projectDocumentService.saveBatch(list);
+            getParentFolders(list,proDocumentTemDetailList,project,user);
+        }
+    }
 }

+ 22 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4464,6 +4464,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     index++;
                     //审核流程显示
                     List<ReportLogDetail> detailList = logDetails.stream().filter(log -> log.getReportId().equals((Integer) map.get("id"))).collect(Collectors.toList());
+                    List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
                     if (detailList.size() > 0) {
                         StringBuilder sb = new StringBuilder();
                         boolean isFirst = true;
@@ -4473,7 +4474,27 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 operateDate = operateDate.plusSeconds(offsetSeconds);
                             }
                             String time = dtf.format(operateDate);
-                            String msg = time+" " + audit.getMsg();
+                            String msg= "";
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(audit.getOperatorId())).findFirst();
+                                if(first.isPresent()){
+                                    if(audit.getMsg().contains("提交了")){
+                                        int i = audit.getMsg().indexOf("提");
+                                        String substring = audit.getMsg().substring(0, i + 1);
+                                        msg = time+" " + audit.getMsg().replaceAll(substring,"$userName"+first.get().getCorpwxUserid()+"$");
+                                    }else if(audit.getMsg().contains("审核通过了")){
+                                        int i = audit.getMsg().indexOf("审");
+                                        String substring = audit.getMsg().substring(0, i + 1);
+                                        msg = time+" " + audit.getMsg().replaceAll(substring,"$userName"+first.get().getCorpwxUserid()+"$");
+                                    }else if(audit.getMsg().contains("驳回了")) {
+                                        int i = audit.getMsg().indexOf("驳");
+                                        String substring = audit.getMsg().substring(0, i + 1);
+                                        msg = time+" " + audit.getMsg().replaceAll(substring,"$userName"+first.get().getCorpwxUserid()+"$");
+                                    }
+                                }
+                            }else {
+                                msg = time+" " + audit.getMsg();
+                            }
                             if (!isFirst) {
                                 sb.append("->");
                             } else {

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

@@ -46,7 +46,7 @@
         from expense_item a left join expense_sheet b on a.expense_id = b.id
         left join user on user.id = b.owner_id
         left join department on department.department_id = user.department_id
-        where a.project_id = #{projectId}
+        where a.project_id = #{projectId} order by a.happen_date desc
     </select>
 
     <select id="selectExpenseByProject" resultType="java.lang.Double">

+ 5 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/Register.vue

@@ -139,8 +139,11 @@
                             return;
                         }
                         let formObj = this.ruleForm
-                        if(window.location.href.indexOf('360') > 1) {
-                            formObj.from = '360'
+                        if(this.$route.query != {}) {
+                            formObj = {
+                                ...this.$route.query,
+                                ...formObj
+                            }
                         }
                         var _this = this;
                         this.logining = true;

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

@@ -978,7 +978,7 @@
                 <el-table-column prop="expenseType" :label="$t('costtype')"></el-table-column>
                 <el-table-column prop="invoiceType" :label="$t('ppertype')">
                   <template slot-scope="scope">
-                    {{scope.row.invoiceType == 0 ? '增值税专用发票' : '增值税普通发票'}}
+                    {{scope.row.invoiceType == null?'':(scope.row.invoiceType == 0 ? '增值税专用发票' : '增值税普通发票')}}
                   </template>
                 </el-table-column>
                 <el-table-column prop="amount" :label="$t('amountof')+'('+ $t('tax') +')'"   align="right">

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

@@ -819,11 +819,6 @@
         <!-- 子项目列表 -->
         <el-dialog :title="$t('listofsubitems')" show-header="false" v-if="subProjectVisible" :visible.sync="subProjectVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-table :data="subProjectList" highlight-current-row  height="400" style="width: 100%;">
-            <!-- <el-table-column type="index" width="60" label="序号">
-                <template slot-scope="scope" >
-                        {{scope.$index+1+(page-1)*size}}
-                    </template>
-            </el-table-column> -->
             <el-table-column width="120" :label="$t('subprojectno')" prop="code"></el-table-column>
             <el-table-column prop="name" :label="$t('names')" ></el-table-column>
             <el-table-column :label="$t('operation')" width="220">
@@ -3649,8 +3644,9 @@ a {
                 if (subProject == null) {
                     this.temaddForm = {projectId: this.currentProject.id, level:1}
                 } else {
-                    subProject.status=subProject.status==true?1:0
-                    this.temaddForm = JSON.parse(JSON.stringify(subProject));
+                    let aac = JSON.parse(JSON.stringify(subProject))
+                    aac.status=aac.status==true?1:0
+                    this.temaddForm = JSON.parse(JSON.stringify(aac));
                 }
                 this.addSubProject = true;
             },
@@ -3663,10 +3659,10 @@ a {
                 },
                 res => {
                     if (res.code == "ok") {
-                        this.subProjectList = res.data;
-                        for(let i = 0; i < this.subProjectList.length; i++){
-                            this.subProjectList[i].status=this.subProjectList[i].status==1?true:false
+                        for(let i = 0; i < res.data.length; i++){
+                            res.data[i].status=res.data[i].status==1?true:false
                         }
+                        this.subProjectList = res.data
                     } else {
                         this.$message({
                         message: res.msg,

+ 4 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -120,7 +120,7 @@
                                         <el-tooltip v-if="progressItem.auditState == 2" :content="$t('state.notThrough')" effect="light" placement="top">
                                         <i  class="iconfont firerock-iconshenhebohui"></i>
                                         </el-tooltip>
-                                        </span>
+                                        </span> 
                                 </p>
                                 <p v-if="item.taskId != null">{{$t('other.task')}}:{{item.taskName}}</p>
                                 <p v-if="item.groupId">
@@ -128,7 +128,9 @@
                                     <!-- 阶段 -->
                                     <span v-if="item.stage != null" style="margin-left:10px;"> {{$t('other.inputStage')}}:{{item.stage}}</span>
                                 </p>
-                                <p><span v-if="item.multiWorktime==1">{{ $t('other.project') }}</span>{{$t('time.duration')}}:{{item.time.toFixed(1)}}h <span class="propsbtn" v-if="item.isOvertime === 1">
+                                <p><span v-if="item.multiWorktime==1">{{ $t('other.project') }}</span>{{$t('time.duration')}}:
+                                    <span v-if="item.startTime">{{ item.startTime + '-' + item.endTime }}</span>
+                                    {{item.time.toFixed(1)}}h <span class="propsbtn" v-if="item.isOvertime === 1">
                                     <el-tag type="danger" size="mini" style="margin-left: 65px">{{ $t('other.WorkOvertime') }}<span v-if="item.overtimeHours">{{item.overtimeHours.toFixed(1)}}{{$t('time.hour')}}</span></el-tag></span>
                                 </p>
                                 <div v-if="item.multiWorktime==0">

二進制
fhKeeper/formulahousekeeper/timesheet_h5/src/assets/img/null.png


+ 2 - 2
fhKeeper/formulahousekeeper/timesheet_h5/src/main.js

@@ -19,14 +19,14 @@ Picker , Dialog , NumberKeyboard , Sticky , Skeleton ,
 Panel , Divider , List , pullRefresh , SwipeCell, Checkbox, 
 Search, Slider,Stepper,Tag, Calendar, Row, Col, RadioGroup, Radio, 
 Loading ,DropdownMenu, DropdownItem, Button, ActionSheet, PullRefresh,Tabbar,
-TabbarItem,Uploader,Collapse, CollapseItem} from 'vant';
+TabbarItem,Uploader,Collapse, CollapseItem,Empty} from 'vant';
 
 Vue.use(Form).use(Toast).use(Grid).use(GridItem).use(DatetimePicker)
 .use(Picker).use(Dialog).use(NumberKeyboard).use(Sticky).use(Skeleton)
 .use(Panel).use(Divider).use(List).use(pullRefresh).use(SwipeCell)
 .use(Checkbox).use(Search).use(Slider).use(Stepper).use(Tag).use(Calendar).use(RadioGroup).use(Radio)
 .use(Row).use(Col).use(Loading).use(DropdownMenu).use(DropdownItem).use(Button).use(ActionSheet)
-.use(PullRefresh).use(Tabbar).use(TabbarItem).use(Popover).use(Uploader).use(Collapse).use(CollapseItem);
+.use(PullRefresh).use(Tabbar).use(TabbarItem).use(Popover).use(Uploader).use(Collapse).use(CollapseItem).use(Empty);
 
 // rem
 import "amfe-flexible";

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

@@ -501,7 +501,7 @@ import timetoolVue from '../timetool/timetool.vue';
                     searchList: []
                 },
                 // vacationTime: {},
-                // totalReportHours: 0,
+                totalReportHours: 0,
                 // leftDataList:[],
                 // rightDataList:[],
             };

File diff suppressed because it is too large
+ 488 - 448
fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/index.vue


+ 243 - 195
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

@@ -1,201 +1,229 @@
 <template>
     <div>
-        <van-nav-bar title="查看日报" left-text="返回" @click-left="back" fixed left-arrow/>
-        
+        <van-nav-bar title="查看日报" left-text="返回" @click-left="back" fixed left-arrow />
+
         <div class="login_form">
             <van-sticky :offset-top="46">
-            <van-field readonly clickable name="datetimePicker" :value="nowTime" label="时间选择" placeholder="点击选择时间" @click="showPicker = true"/>
+                <van-field readonly clickable name="datetimePicker" :value="nowTime" label="时间选择" placeholder="点击选择时间"
+                    @click="showPicker = true" />
             </van-sticky>
             <van-popup v-model="showPicker" position="bottom">
-                <van-datetime-picker v-model="currentDate" type="date" :min-date="minDate" :max-date="maxDate" @confirm="changeTime" @cancel="showPicker = false"/>
+                <van-datetime-picker v-model="currentDate" type="date" :min-date="minDate" :max-date="maxDate"
+                    @confirm="changeTime" @cancel="showPicker = false" />
             </van-popup>
-            <van-skeleton  :v-if="report.length!=0" v-for="(item,index) in report" title avatar :row="3" :loading="false" :key="index">
+            <van-skeleton :v-if="report.length != 0" v-for="(item, index) in report" title avatar :row="3" :loading="false"
+                :key="index">
                 <van-panel class="one_report" :title="item.name" :status="statusTxt[item.state]">
                     <template #header>
                         <div class="van-cell van-panel__header">
                             <div class="van-cell__title">
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item.name'></ww-open-data></span>
-                                <span v-else>{{item.name}}</span>
+                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName'
+                                        :openid='item.name'></ww-open-data></span>
+                                <span v-else>{{ item.name }}</span>
                             </div>
                             <div class="van-cell__value van-panel__header-value">
-                                <span>{{statusTxt[item.state]}}</span>
+                                <span>{{ statusTxt[item.state] }}</span>
                             </div>
                         </div>
                     </template>
                     <div class="form_text">
                         <span style="margin-right:20px;margin-left:5px;font-size:14px;">
                             总填报:
-                            <span>{{parseFloat(item.reportTime).toFixed(1)}}h</span>
+                            <span>{{ parseFloat(item.reportTime).toFixed(1) }}h</span>
                         </span>
                     </div>
-                    <div v-for="(item1,index1) in item.data" class="one_report_data" :key="index1">
-                        <div class="project_title" style="font-weight:bold;">项目:{{item1.project}} <span :style="'color:'+statusColor[item1.state]">[
-                            <span v-if="item1.state==0">
-                            <span v-if="item1.isDeptAudit==0">
-                                <span v-if="item1.projectAuditState==0">
-                                    待项目审核人<span v-if="item1.projectAuditorName != null">(
-                                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item1.projectAuditorName'></ww-open-data></span>
-                                        <span v-else>{{item1.projectAuditorName}}</span>
-                                    )</span>审核
+                    <div v-for="(item1, index1) in item.data" class="one_report_data" :key="index1">
+                        <div class="project_title" style="font-weight:bold;">项目:{{ item1.project }} <span
+                                :style="'color:' + statusColor[item1.state]">[
+                                <span v-if="item1.state == 0">
+                                    <span v-if="item1.isDeptAudit == 0">
+                                        <span v-if="item1.projectAuditState == 0">
+                                            待项目审核人<span v-if="item1.projectAuditorName != null">(
+                                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName'
+                                                        :openid='item1.projectAuditorName'></ww-open-data></span>
+                                                <span v-else>{{ item1.projectAuditorName }}</span>
+                                                )</span>审核
+                                        </span>
+                                        <span style="color:#32CD32;" v-else-if="item1.projectAuditState == 1">
+                                            项目审核人<span v-if="item1.projectAuditorName != null">(
+                                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName'
+                                                        :openid='item1.projectAuditorName'></ww-open-data></span>
+                                                <span v-else>{{ item1.projectAuditorName }}</span>
+                                                )</span>审核通过
+                                        </span>
+                                    </span>
+                                    <span v-else-if="item1.isDeptAudit == 1">
+                                        待
+                                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName'
+                                                :openid='item1.auditDeptName'></ww-open-data></span>
+                                        <span v-else>{{ item1.auditDeptName }}</span>
+                                        审核
+                                    </span>
                                 </span>
-                                <span style="color:#32CD32;" v-else-if="item1.projectAuditState==1">
-                                    项目审核人<span v-if="item1.projectAuditorName != null">(
-                                        <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='item1.projectAuditorName'></ww-open-data></span>
-                                        <span v-else>{{item1.projectAuditorName}}</span>
-                                    )</span>审核通过
+                                <span v-else>
+                                    {{ statusTxt[item1.state] }}
                                 </span>
-                            </span>
-                            <span v-else-if="item1.isDeptAudit==1">
-                                待
-                                <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='departmentName' :openid='item1.auditDeptName'></ww-open-data></span>
-                                <span v-else>{{item1.auditDeptName}}</span>
-                                审核
-                            </span>
-                            </span>
-                            <span v-else>
-                                {{statusTxt[item1.state]}}
-                            </span>
-                            <!-- {{statusTxt[item1.state]}} -->
+                                <!-- {{statusTxt[item1.state]}} -->
 
-                            ] </span></div>
-                        <div style="color:red;" v-if="item1.state ==2&&item1.rejectReason!=null">原因:{{item1.rejectReason}}</div>
-                        <div class="project_title" v-if="item1.subProjectName != null" >子项目:{{item1.subProjectName}}</div>
-                        <div class="project_title" v-if="user.company.packageProject==1&&item1.groupName != null" >任务分组:{{item1.groupName}}</div>
-                        <div class="project_title" v-if="user.company.packageProject==1&&item1.stage != '-'" >投入阶段:{{item1.stage}}</div>
+                                ] </span></div>
+                        <div style="color:red;" v-if="item1.state == 2 && item1.rejectReason != null">原因:{{
+                            item1.rejectReason }}
+                        </div>
+                        <div class="project_title" v-if="item1.subProjectName != null">子项目:{{ item1.subProjectName }}</div>
+                        <div class="project_title" v-if="user.company.packageProject == 1 && item1.groupName != null">
+                            任务分组:{{ item1.groupName }}</div>
+                        <div class="project_title" v-if="user.company.packageProject == 1 && item1.stage != '-'">
+                            投入阶段:{{ item1.stage }}</div>
                         <!--自定义维度 -->
-                        <div class="project_title" v-if="user.timeType.customDegreeActive == 1" >{{user.timeType.customDegreeName}}:{{item1.degreeName}}</div>
-                        <div class="project_title" v-if="user.timeType.customDataActive == 1" >{{user.timeType.customDataName}}:{{item1.customData}}</div>
-                        <div class="project_title" v-if="user.timeType.customTextActive == 1" >{{user.timeType.customTextName}}:{{item1.customText}}</div>
+                        <div class="project_title" v-if="user.timeType.customDegreeActive == 1">
+                            {{ user.timeType.customDegreeName }}:{{ item1.degreeName }}</div>
+                        <div class="project_title" v-if="user.timeType.customDataActive == 1">
+                            {{ user.timeType.customDataName }}:{{ item1.customData }}</div>
+                        <div class="project_title" v-if="user.timeType.customTextActive == 1">
+                            {{ user.timeType.customTextName }}:{{ item1.customText }}</div>
                         <div class="project_title" v-if="user.company.packageEngineering == 1">
                             专业进度:
-                            <span style="margin-right:10px;" v-for="progressItem in item1.professionProgress" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%) 
+                            <span style="margin-right:10px;" v-for="progressItem in item1.professionProgress"
+                                :key="progressItem.id">{{ progressItem.professionName }}({{ progressItem.progress }}%)
                             </span>
                         </div>
-                        
-                        <div class="project_title" v-if="item1.taskId" >任务:{{item1.taskName}}</div>
+
+                        <div class="project_title" v-if="item1.taskId">任务:{{ item1.taskName }}</div>
                         <!--根据类型选择使用的模板 -->
                         <div v-if="item1.multiWorktime == 0">
                             <div class="project_time">时长:
-                                <span v-if="item1.reportTimeType == 0" style="margin-right:10px;">{{fullDayTxt[item1.timeType]}}</span>
-                                <span v-if="item1.reportTimeType == 2" style="margin-right:10px;">{{item1.startTime+'-'+item1.endTime}}</span>{{item1.time.toFixed(1)}}h
-                                <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div>
+                                <span v-if="item1.reportTimeType == 0" style="margin-right:10px;">{{
+                                    fullDayTxt[item1.timeType] }}</span>
+                                <span v-if="item1.reportTimeType == 2" style="margin-right:10px;">{{ item1.startTime + '-' +
+                                    item1.endTime }}</span>{{ item1.time.toFixed(1) }}h
+                                <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{
+                                    item1.overtimeHours.toFixed(1) }}h</span></div>
                             </div>
                             <div class="project_content">事项:<span v-html="item1.content"></span></div>
-                            
+
                         </div>
                         <div v-if="item1.multiWorktime == 1">
-                            <div>项目时长:<span style="margin-right:10px;">{{item1.time.toFixed(1)}}h</span> <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{item1.overtimeHours.toFixed(1)}}h</span></div></div>
-                            <div style="position:relative;border:#ccc 0.5px solid;padding:3px;margin:5px 0px;" v-for="(timeItem, index) in item1.worktimeList" :key="index" >
+                            <div>项目时长:<span style="margin-right:10px;">{{ item1.time.toFixed(1) }}h</span>
+                                <div class="button" v-if="item1.isOvertime == 1">加班<span v-if="item1.overtimeHours">{{
+                                    item1.overtimeHours.toFixed(1) }}h</span></div>
+                            </div>
+                            <div style="position:relative;border:#ccc 0.5px solid;padding:3px;margin:5px 0px;"
+                                v-for="(timeItem, index) in item1.worktimeList" :key="index">
                                 <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 style="margin-right:10px;">{{ timeItem.startTime + '-' + timeItem.endTime
+                                    }}</span>{{ timeItem.time.toFixed(1) }}h
                                 </div>
                                 <div class="project_content">事项:<span v-html="timeItem.content"></span></div>
                             </div>
                         </div>
                         <div style="padding:5px;text-align:center;" v-if="item1.pics != null && item1.pics.length > 0">
-                            <span v-for="(p, index) in item1.pics"  :key="p" style="margin-right:10px;">
-                            <img  :src="p" style="width:80px; height:80px;" @click="showLargeImg(item1.pics, index)"/>
+                            <span v-for="(p, index) in item1.pics" :key="p" style="margin-right:10px;">
+                                <img :src="p" style="width:80px; height:80px;" @click="showLargeImg(item1.pics, index)" />
                             </span>
                         </div>
                         <van-divider />
                     </div>
-                    <van-popup v-model="imgShow" position="bottom" closeable >
-                        <van-swipe class="my-swipe"  indicator-color="white">
-                        <van-swipe-item v-for="(picItem, index) in tmpPics" :key="index">
-                            <img :src="picItem" style="width:100%;" />
-                        </van-swipe-item>
+                    <van-popup v-model="imgShow" position="bottom" closeable>
+                        <van-swipe class="my-swipe" indicator-color="white">
+                            <van-swipe-item v-for="(picItem, index) in tmpPics" :key="index">
+                                <img :src="picItem" style="width:100%;" />
+                            </van-swipe-item>
                         </van-swipe>
                     </van-popup>
 
                     <!-- 编辑 -->
                     <div slot="footer" class="foot">
-                        <van-button size="small" type="primary" @click="editor(item)" v-if="item.id == user.id && (item.state == 2 || item.state == 3)">编辑日报</van-button>
+                        <van-button size="small" type="primary" @click="editor(item)"
+                            v-if="item.id == user.id && (item.state == 2 || item.state == 3)">编辑日报</van-button>
                     </div>
                 </van-panel>
             </van-skeleton>
+            <van-empty v-if="report.length == 0" description="暂无日报">
+                <van-button round type="primary" class="bottom-button" @click="toWriteReport()">去填写</van-button>
+            </van-empty>
         </div>
     </div>
 </template>
 
 <script>
-    export default {
-        data() {
-            return {
-                tmpPics:[],
-                imgShow: false,
-                hasWaiting: false,
-                state: 0,
-                statusColor:['orange','green','red'],
-                user: JSON.parse(localStorage.userInfo),
-                minDate: new Date(2010, 0, 1),
-                maxDate: new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()),
-                currentDate: new Date(),
-                nowTime: this.format(new Date(new Date()),"yyyy-MM-dd"),
-                showPicker: false,
-                report: [],
-                fullDayTxt:['全天','上午','下午'],
-                statusTxt:["待审核", "已通过", "已驳回", "待提交"],
-            };
+export default {
+    data() {
+        return {
+            tmpPics: [],
+            imgShow: false,
+            hasWaiting: false,
+            state: 0,
+            statusColor: ['orange', 'green', 'red'],
+            user: JSON.parse(localStorage.userInfo),
+            minDate: new Date(2010, 0, 1),
+            maxDate: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()),
+            currentDate: new Date(),
+            nowTime: this.format(new Date(new Date()), "yyyy-MM-dd"),
+            showPicker: false,
+            report: [],
+            fullDayTxt: ['全天', '上午', '下午'],
+            statusTxt: ["待审核", "已通过", "已驳回", "待提交"],
+        };
+    },
+    created() {
+    },
+    methods: {
+        showLargeImg(item, index) {
+            this.imgShow = true;
+            this.tmpPics = item;
         },
-        created() {
-        },
-        methods: {
-            showLargeImg(item, index) {
-                this.imgShow = true;
-                this.tmpPics = item;
-            },
 
-            // 返回
-            back() {
-                history.back();
-            },
+        // 返回
+        back() {
+            history.back();
+        },
 
-             // 时间转换
-            format(date, pattern) {
-                pattern = pattern || "yyyy-MM-dd";
-                var _this = this;
-                return pattern.replace(/([yMdhsm])(\1*)/g, function ($0) {
-                    switch ($0.charAt(0)) {
-                        case 'y': return _this.padding(date.getFullYear(), $0.length);
-                        case 'M': return _this.padding(date.getMonth() + 1, $0.length);
-                        case 'd': return _this.padding(date.getDate(), $0.length);
-                        case 'w': return date.getDay() + 1;
-                        case 'h': return _this.padding(date.getHours(), $0.length);
-                        case 'm': return _this.padding(date.getMinutes(), $0.length);
-                        case 's': return _this.padding(date.getSeconds(), $0.length);
-                    }
-                });
-            },
+        // 时间转换
+        format(date, pattern) {
+            pattern = pattern || "yyyy-MM-dd";
+            var _this = this;
+            return pattern.replace(/([yMdhsm])(\1*)/g, function ($0) {
+                switch ($0.charAt(0)) {
+                    case 'y': return _this.padding(date.getFullYear(), $0.length);
+                    case 'M': return _this.padding(date.getMonth() + 1, $0.length);
+                    case 'd': return _this.padding(date.getDate(), $0.length);
+                    case 'w': return date.getDay() + 1;
+                    case 'h': return _this.padding(date.getHours(), $0.length);
+                    case 'm': return _this.padding(date.getMinutes(), $0.length);
+                    case 's': return _this.padding(date.getSeconds(), $0.length);
+                }
+            });
+        },
 
-            padding(s, len) {
-                var len = len - (s + '').length;
-                for (var i = 0; i < len; i++) { s = '0' + s; }
-                return s;
-            },
+        padding(s, len) {
+            var len = len - (s + '').length;
+            for (var i = 0; i < len; i++) { s = '0' + s; }
+            return s;
+        },
 
-            // 改变时间
-            changeTime(time) {
-                this.nowTime = this.format(new Date(time),"yyyy-MM-dd");
-                this.currentDate = time;
-                this.showPicker = false;
-                this.getReport();
-            },
+        // 改变时间
+        changeTime(time) {
+            this.nowTime = this.format(new Date(time), "yyyy-MM-dd");
+            this.currentDate = time;
+            this.showPicker = false;
+            this.getReport();
+        },
 
-            // 获取日报
-            getReport() {
-                this.hasWaiting = false;
-                const toast = this.$toast.loading({
-                    forbidClick: true,
-                    duration: 0
-                });
-                this.$axios.post("/report/getReportList", {date: this.nowTime})
+        // 获取日报
+        getReport() {
+            this.hasWaiting = false;
+            const toast = this.$toast.loading({
+                forbidClick: true,
+                duration: 0
+            });
+            this.$axios.post("/report/getReportList", { date: this.nowTime })
                 .then(res => {
-                    if(res.code == "ok") {
+                    if (res.code == "ok") {
                         this.$toast.clear();
                         this.report = res.data;
                         //计算状态
-                        for (var i=0;i<this.report.length; i++) {
+                        for (var i = 0; i < this.report.length; i++) {
                             var item = this.report[i];
                             if (item.state == 0) {
                                 this.hasWaiting = true;
@@ -203,84 +231,104 @@
                         }
                     } else {
                         this.$toast.clear();
-                        this.$toast.fail('获取失败:'+res.msg);
+                        this.$toast.fail('获取失败:' + res.msg);
                     }
-                }).catch(err=> {this.$toast.clear();});
-            },
-            // 点击编辑
-            editor(item) {
-                console.log(item, '编辑')
-                this.$router.push({
-                    path:'/edit',
-                    query: {
-                        date: this.nowTime
-                    }
-                });
-            }
+                }).catch(err => { this.$toast.clear(); });
         },
-        mounted() {
-            if (sessionStorage.targetDate != null) {
-                this.nowTime = sessionStorage.targetDate;
-                sessionStorage.removeItem('targetDate');
-            }
-            this.getReport();
+        // 点击编辑
+        editor(item) {
+            console.log(item, '编辑')
+            this.$router.push({
+                path: '/edit',
+                query: {
+                    date: this.nowTime
+                }
+            });
+        },
+        // 去填写日报
+        toWriteReport() {
+            this.$router.push({
+                path: '/edit',
+                query: {
+                    date: this.nowTime
+                }
+            });
+        }
+    },
+    mounted() {
+        if (sessionStorage.targetDate != null) {
+            this.nowTime = sessionStorage.targetDate;
+            sessionStorage.removeItem('targetDate');
         }
-    };
+        this.getReport();
+    }
+};
 </script>
 
 <style lang="less" scoped>
-    .login_form {
-        margin-top: 46px;
-    }
+.login_form {
+    margin-top: 46px;
+}
 
-    .one_report {
-        margin-bottom: 15px;
-        font-size:14px;
-    }
+.one_report {
+    margin-bottom: 15px;
+    font-size: 14px;
+}
 
-    .form_text {
-        margin: 15px 0 15px;
-        padding: 0 12px;
-    }
-    
-    .form_btn {
-        text-align: right;
-    }
+.form_text {
+    margin: 15px 0 15px;
+    padding: 0 12px;
+}
 
-    .form_btn button {
-        margin-left: 10px;
-    }
+.form_btn {
+    text-align: right;
+}
 
-    .one_report_data {
-        margin-bottom: 10px;
-        padding: 0 22px;
-        div {
-            line-height: 30px;
-        }
+.form_btn button {
+    margin-left: 10px;
+}
+
+.one_report_data {
+    margin-bottom: 10px;
+    padding: 0 22px;
+
+    div {
+        line-height: 30px;
     }
+}
 </style>
 <style lang="less">
-    .van-nav-bar .van-icon , .van-nav-bar__text {
-        color: #20a0ff;
-    }
-    .button {
-        float: right;
-        width: 80px;
-        height: 25px;
-        line-height: 25px;
-        text-align: center;
-        border: 1px solid red;
-        color: red;
-        box-sizing: border-box;
-        border-radius: 10px;
-        font-size: 14px;
-        display: flex;
-        justify-content: center;
-        align-items: center;
-    }
-    .foot {
-        width: 100%;
-        display: flex;
-        justify-content: end;
-    }
+.van-nav-bar .van-icon,
+.van-nav-bar__text {
+    color: #20a0ff;
+}
+
+.button {
+    float: right;
+    width: 80px;
+    height: 25px;
+    line-height: 25px;
+    text-align: center;
+    border: 1px solid red;
+    color: red;
+    box-sizing: border-box;
+    border-radius: 10px;
+    font-size: 14px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+
+.foot {
+    width: 100%;
+    display: flex;
+    justify-content: end;
+}
+
+.bottom-button {
+    width: 160px;
+    height: 40px;
+    background-color: rgb(53, 130, 245);
+    border-color: rgb(53, 130, 245);
+}
 </style>

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

@@ -4,7 +4,8 @@ const path = require('path');
 const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 const Timestamp = new Date().getTime();
 
-var ip = '47.101.180.183'
+// var ip = '47.101.180.183'
+var ip = '47.100.37.243'
 // var ip = '192.168.2.7'
 // var ip = '127.0.0.1'