Browse Source

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

Lijy 2 years ago
parent
commit
98b8d75698
42 changed files with 2037 additions and 2020 deletions
  1. 42 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyController.java
  2. 154 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseMainTypeController.java
  3. 15 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseTypeController.java
  4. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProDocumentTemDetailController.java
  5. 123 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectDocumentTemplateController.java
  6. 6 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  7. 2 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  8. 27 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  9. 13 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java
  10. 42 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseMainType.java
  11. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseSheet.java
  12. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseType.java
  13. 50 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProDocumentTemDetail.java
  14. 53 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectDocumentTemplate.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ExpenseMainTypeMapper.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProDocumentTemDetailMapper.java
  17. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectDocumentTemplateMapper.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExpenseMainTypeService.java
  19. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProDocumentTemDetailService.java
  20. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectDocumentTemplateService.java
  21. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  22. 163 69
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  23. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseMainTypeServiceImpl.java
  24. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  25. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProDocumentTemDetailServiceImpl.java
  26. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectDocumentTemplateServiceImpl.java
  27. 105 68
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  28. 32 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  29. 26 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  30. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyMapper.xml
  31. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseMainTypeMapper.xml
  32. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProDocumentTemDetailMapper.xml
  33. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectDocumentTemplateMapper.xml
  34. 602 1799
      fhKeeper/formulahousekeeper/ops-platform/octopus.log
  35. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  36. 66 3
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  37. 203 29
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  38. 1 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  39. 3 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  40. 2 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/cost/cost.vue
  41. 27 3
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  42. 30 5
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/index.vue

+ 42 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyController.java

@@ -4,16 +4,15 @@ package com.management.platform.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.constant.Constant;
 import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.*;
-import com.management.platform.mapper.CompanyDingdingMapper;
-import com.management.platform.mapper.CompanyMapper;
-import com.management.platform.mapper.ContactSyncLogMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.CompanyService;
 import com.management.platform.service.CompanyService;
 import com.management.platform.service.DingDingService;
 import com.management.platform.service.DingDingService;
+import com.management.platform.service.ExpenseMainTypeService;
 import com.management.platform.service.ExpenseTypeService;
 import com.management.platform.service.ExpenseTypeService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.MessageUtils;
 import com.taobao.api.ApiException;
 import com.taobao.api.ApiException;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
@@ -51,6 +50,8 @@ public class CompanyController {
     private ContactSyncLogMapper contactSyncLogMapper;
     private ContactSyncLogMapper contactSyncLogMapper;
     @Resource
     @Resource
     private CompanyMapper companyMapper;
     private CompanyMapper companyMapper;
+    @Resource
+    private ExpenseMainTypeService expenseMainTypeService;
 
 
     public static final HashMap<String, Long> syncLog = new HashMap();
     public static final HashMap<String, Long> syncLog = new HashMap();
 
 
@@ -190,18 +191,32 @@ public class CompanyController {
         //outsource.add("其他外包费");
         //outsource.add("其他外包费");
         outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
         outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
         List<ExpenseType> expenseTypeList=new ArrayList<>();
         List<ExpenseType> expenseTypeList=new ArrayList<>();
+        List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
+        ExpenseMainType expenseMainType=new ExpenseMainType();
+        expenseMainType.setName("一般费用");
+        expenseMainType.setCompanyId(user.getCompanyId());
+        ExpenseMainType expenseMainType1=new ExpenseMainType();
+        expenseMainType1.setName("差旅费用");
+        expenseMainType1.setCompanyId(user.getCompanyId());
+        ExpenseMainType expenseMainType2=new ExpenseMainType();
+        expenseMainType2.setName("外包费用");
+        expenseMainType2.setCompanyId(user.getCompanyId());
+        expenseMainTypes.add(expenseMainType);
+        expenseMainTypes.add(expenseMainType1);
+        expenseMainTypes.add(expenseMainType2);
+        expenseMainTypeService.saveBatch(expenseMainTypes);
         for (String expenseType : expenseTypes) {
         for (String expenseType : expenseTypes) {
             ExpenseType item=new ExpenseType();
             ExpenseType item=new ExpenseType();
             item.setCompanyId(user.getCompanyId());
             item.setCompanyId(user.getCompanyId());
             item.setTypeName(expenseType);
             item.setTypeName(expenseType);
             if(commonly.contains(expenseType)){
             if(commonly.contains(expenseType)){
-                item.setMainType(0);
+                item.setMainType(expenseMainType.getId());
             }
             }
             if(travel.contains(expenseType)){
             if(travel.contains(expenseType)){
-                item.setMainType(1);
+                item.setMainType(expenseMainType1.getId());
             }
             }
             if(outsource.contains(expenseType)){
             if(outsource.contains(expenseType)){
-                item.setMainType(2);
+                item.setMainType(expenseMainType2.getId());
             }
             }
             expenseTypeList.add(item);
             expenseTypeList.add(item);
         }
         }
@@ -213,5 +228,25 @@ public class CompanyController {
         return httpRespMsg;
         return httpRespMsg;
     }
     }
 
 
+    @RequestMapping("/editCompanyName")
+    public HttpRespMsg editCompanyName(String name,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("token");
+        User user = userMapper.selectById(token);
+        if (StringUtils.isBlank(name)){
+            msg.setError("公司名称不可为空");
+            return msg;
+        }
+        if ("超级管理员".equals(user.getRoleName())){
+            Company company = companyMapper.selectById(user.getCompanyId());
+            company.setCompanyName(name);
+            companyMapper.updateById(company);
+            msg.msg = "修改成功";
+        }else {
+            msg.setError("无权修改");
+        }
+        return msg;
+    }
+
 }
 }
 
 

+ 154 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseMainTypeController.java

@@ -0,0 +1,154 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.CompanyMapper;
+import com.management.platform.mapper.ExpenseSheetMapper;
+import com.management.platform.mapper.ExpenseTypeMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpenseMainTypeService;
+import com.management.platform.service.ExpenseSheetService;
+import com.management.platform.service.ExpenseTypeService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-06
+ */
+@RestController
+@RequestMapping("/expense-main-type")
+public class ExpenseMainTypeController {
+
+    @Autowired
+    private ExpenseMainTypeService expenseMainTypeService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ExpenseTypeMapper expenseTypeMapper;
+    @Resource
+    private ExpenseSheetMapper expenseSheetMapper;
+    @Resource
+    private CompanyMapper companyMapper;
+    @Resource
+    private ExpenseSheetService expenseSheetService;
+    @Resource
+    private ExpenseTypeService expenseTypeService;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<ExpenseMainType> expenseMainTypes = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", user.getCompanyId()));
+        httpRespMsg.data=expenseMainTypes;
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ExpenseMainType setting) {
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getName())) {
+            //msg.setError("名称不能为空");
+            msg.setError(MessageUtils.message("Company.nullNameError"));
+            return msg;
+        }
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int count = expenseMainTypeService.count(new QueryWrapper<ExpenseMainType>().eq("name", setting.getName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("Company.nameRepeat"));
+            } else {
+                expenseMainTypeService.save(setting);
+                msg.data = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", setting.getCompanyId()));
+            }
+        } else {
+            int num = expenseMainTypeService.count(new QueryWrapper<ExpenseMainType>().eq("company_id", setting.getCompanyId()));
+            if(num>=10){
+                msg.setError("已有类型上限为10");
+                return msg;
+            }
+            int count = expenseMainTypeService.count(new QueryWrapper<ExpenseMainType>().eq("name", setting.getName())
+                    .eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                //msg.setError("该名称已存在");
+                msg.setError(MessageUtils.message("Company.nameRepeat"));
+            } else {
+                expenseMainTypeService.updateById(setting);
+                msg.data = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", setting.getCompanyId()));
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        ExpenseMainType expenseMainType = expenseMainTypeService.getById(id);
+        Integer count = expenseTypeMapper.selectCount(new QueryWrapper<ExpenseType>().eq("main_type", expenseMainType.getId()));
+        Integer count1 = expenseSheetMapper.selectCount(new QueryWrapper<ExpenseSheet>().eq("type", expenseMainType.getId()));
+        if (count > 0||count1>0) {
+            httpRespMsg.setError("当前费用类型[" + expenseMainType.getName() + "]已被使用");
+            return httpRespMsg;
+        }
+        expenseMainType.deleteById(id);
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/dataBuild")
+    public HttpRespMsg dataBuild(){
+        List<Company> companyList = companyMapper.selectList(null);
+        for (Company company : companyList) {
+            List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
+            ExpenseMainType expenseMainType=new ExpenseMainType();
+            expenseMainType.setName("一般费用");
+            expenseMainType.setCompanyId(company.getId());
+            ExpenseMainType expenseMainType1=new ExpenseMainType();
+            expenseMainType1.setName("差旅费用");
+            expenseMainType1.setCompanyId(company.getId());
+            ExpenseMainType expenseMainType2=new ExpenseMainType();
+            expenseMainType2.setName("外包费用");
+            expenseMainType2.setCompanyId(company.getId());
+            expenseMainTypes.add(expenseMainType);
+            expenseMainTypes.add(expenseMainType1);
+            expenseMainTypes.add(expenseMainType2);
+            expenseMainTypeService.saveBatch(expenseMainTypes);
+            List<ExpenseType> expenseTypeList = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id", company.getId()).eq("main_type", 10));
+            expenseTypeList.forEach(et->{
+                et.setMainType(expenseMainType.getId());
+            });
+            List<ExpenseSheet> expenseSheetList = expenseSheetMapper.selectList(new QueryWrapper<ExpenseSheet>().eq("company_id", company.getId()).eq("type", 10));
+            expenseSheetList.forEach(es->{
+                es.setType(expenseMainType.getId());
+            });
+            if(expenseSheetList.size()>0){
+                expenseSheetService.updateBatchById(expenseSheetList);
+            }
+            if(expenseTypeList.size()>0){
+                expenseTypeService.updateBatchById(expenseTypeList);
+            }
+        }
+        return new HttpRespMsg();
+    }
+
+}
+

+ 15 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseTypeController.java

@@ -3,11 +3,13 @@ package com.management.platform.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.ExpenseItem;
 import com.management.platform.entity.ExpenseItem;
+import com.management.platform.entity.ExpenseMainType;
 import com.management.platform.entity.ExpenseType;
 import com.management.platform.entity.ExpenseType;
 import com.management.platform.entity.User;
 import com.management.platform.entity.User;
 import com.management.platform.mapper.ExpenseItemMapper;
 import com.management.platform.mapper.ExpenseItemMapper;
 import com.management.platform.mapper.ExpenseTypeMapper;
 import com.management.platform.mapper.ExpenseTypeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpenseMainTypeService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.MessageUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.util.StringUtils;
@@ -16,6 +18,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Optional;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -36,12 +40,22 @@ public class ExpenseTypeController {
     private HttpServletRequest request;
     private HttpServletRequest request;
     @Resource
     @Resource
     private ExpenseItemMapper expenseItemMapper;
     private ExpenseItemMapper expenseItemMapper;
+    @Resource
+    private ExpenseMainTypeService expenseMainTypeService;
 
 
     @RequestMapping("/getList")
     @RequestMapping("/getList")
     public HttpRespMsg getList() {
     public HttpRespMsg getList() {
         User user = userMapper.selectById(request.getHeader("token"));
         User user = userMapper.selectById(request.getHeader("token"));
         HttpRespMsg msg = new HttpRespMsg();
         HttpRespMsg msg = new HttpRespMsg();
-        msg.data=expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id",user.getCompanyId()).orderByDesc("main_type"));
+        List<ExpenseType> expenseTypeList = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id", user.getCompanyId()).orderByAsc("main_type"));
+        List<ExpenseMainType> expenseMainTypes = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", user.getCompanyId()).or().eq("is_system",1));
+        expenseTypeList.forEach(re->{
+            Optional<ExpenseMainType> first = expenseMainTypes.stream().filter(et -> et.getId().equals(re.getMainType())).findFirst();
+            if(first.isPresent()){
+                re.setExpenseMainTypeName(first.get().getName());
+            }
+        });
+        msg.data=expenseTypeList;
         return msg;
         return msg;
     }
     }
 
 

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProDocumentTemDetailController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+@RestController
+@RequestMapping("/pro-document-tem-detail")
+public class ProDocumentTemDetailController {
+
+}
+

+ 123 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectDocumentTemplateController.java

@@ -0,0 +1,123 @@
+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.entity.ProDocumentTemDetail;
+import com.management.platform.entity.ProjectDocument;
+import com.management.platform.entity.ProjectDocumentTemplate;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.ProDocumentTemDetailMapper;
+import com.management.platform.mapper.ProjectDocumentMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProDocumentTemDetailService;
+import com.management.platform.service.ProjectDocumentTemplateService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+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.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+@RestController
+@RequestMapping("/project-document-template")
+public class ProjectDocumentTemplateController {
+
+    @Resource
+    private ProjectDocumentTemplateService projectDocumentTemplateService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectDocumentMapper projectDocumentMapper;
+    @Resource
+    private ProDocumentTemDetailService proDocumentTemDetailService;
+
+    @RequestMapping("/list")
+    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<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);
+        });
+        httpRespMsg.setData(documentTemplateList);
+        return httpRespMsg;
+    }
+
+    public List<ProDocumentTemDetail> getParentFolders(List<ProDocumentTemDetail> proDocumentTemDetails){
+        //过滤出一级文件夹
+        List<ProDocumentTemDetail> rootDirectory = proDocumentTemDetails.stream().filter(pt -> pt.getParentId() == null).collect(Collectors.toList());
+        rootDirectory.forEach(rd->{
+            List<ProDocumentTemDetail> documentTemDetails = proDocumentTemDetails.stream().filter(pl -> pl.getParentId() != null && pl.getParentId().equals(rd.getId())).collect(Collectors.toList());
+            rd.setChildren(documentTemDetails);
+            getParentFolders(documentTemDetails);
+;
+        });
+        return rootDirectory;
+    }
+
+    @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);
+        }
+        return new HttpRespMsg();
+    }
+
+    public List<ProDocumentTemDetail> getSubordinateFolders(JSONArray jsonArray,Integer templateId,List<ProjectDocument> allList){
+        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);
+                });
+            }
+        }
+        return proDocumentTemDetailList;
+    }
+
+}
+

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

@@ -907,7 +907,7 @@ public class ReportController {
             }
             }
         }
         }
 
 
-        /*if(company.getId()==862){
+/*        if(company.getId()==862){
             Collection<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
             Collection<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
             List<Project> targetProjectList = projectList.stream().filter(pl -> projectIds.contains(pl.getId())).collect(Collectors.toList());
             List<Project> targetProjectList = projectList.stream().filter(pl -> projectIds.contains(pl.getId())).collect(Collectors.toList());
             String creatorId = reportList.get(0).getCreatorId();
             String creatorId = reportList.get(0).getCreatorId();
@@ -935,7 +935,7 @@ public class ReportController {
                     expenseDetail.put("company","FONE");
                     expenseDetail.put("company","FONE");
                     expenseDetail.put("department","DEFAULT");
                     expenseDetail.put("department","DEFAULT");
                     expenseDetail.put("project",first.get().getProjectCode());
                     expenseDetail.put("project",first.get().getProjectCode());
-                    expenseDetail.put("expenseItem","default");
+                    expenseDetail.put("expenseItem","DEFAULT");
                     expenseDetail.put("amount",report.getWorkingTime());
                     expenseDetail.put("amount",report.getWorkingTime());
                     expenseDetails.add(expenseDetail);
                     expenseDetails.add(expenseDetail);
                 }
                 }
@@ -962,6 +962,10 @@ public class ReportController {
                     HttpRespMsg httpRespMsg=new HttpRespMsg();
                     HttpRespMsg httpRespMsg=new HttpRespMsg();
                     httpRespMsg.setError("当前项目预算不足,无法填报");
                     httpRespMsg.setError("当前项目预算不足,无法填报");
                     return httpRespMsg;
                     return httpRespMsg;
+                }else if(json.getIntValue("status")==14002){
+                    HttpRespMsg httpRespMsg=new HttpRespMsg();
+                    httpRespMsg.setError("未找到预算控制单元:"+json.getString("message"));
+                    return httpRespMsg;
                 }
                 }
             }
             }
         }*/
         }*/

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

@@ -143,8 +143,8 @@ public class UserController {
     @RequestMapping("/insertCompany")
     @RequestMapping("/insertCompany")
     public HttpRespMsg insertCompany(
     public HttpRespMsg insertCompany(
             @RequestParam String companyName, @RequestParam String name, @RequestParam String phone,
             @RequestParam String companyName, @RequestParam String name, @RequestParam String phone,
-            String vcode, String password, @RequestParam(required = false, defaultValue = "2") Integer type) {
-        return userService.insertCompany(companyName, name, phone, vcode, password, type);
+            String vcode, String password, @RequestParam(required = false, defaultValue = "2") Integer type, String from) {
+        return userService.insertCompany(companyName, name, phone, vcode, password, type, from);
     }
     }
 
 
     /**
     /**
@@ -278,7 +278,6 @@ public class UserController {
      */
      */
     @RequestMapping("/areaData")
     @RequestMapping("/areaData")
     public HttpRespMsg areaData(HttpServletRequest request){
     public HttpRespMsg areaData(HttpServletRequest request){
-        HttpRespMsg httpRespMsg=new HttpRespMsg();
         String token = request.getHeader("token");
         String token = request.getHeader("token");
         return userService.areaData(token);
         return userService.areaData(token);
     }
     }

+ 27 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -119,6 +119,8 @@ public class WeiXinCorpController {
     @Resource
     @Resource
     HttpServletRequest request;
     HttpServletRequest request;
     @Resource
     @Resource
+    ExpenseMainTypeService expenseMainTypeService;
+    @Resource
     private SysRoleMapper sysRoleMapper;
     private SysRoleMapper sysRoleMapper;
     @Resource
     @Resource
     private ParticipationMapper participationMapper;
     private ParticipationMapper participationMapper;
@@ -1320,6 +1322,8 @@ public class WeiXinCorpController {
                                 .setExpirationDate(LocalDateTime.now().plusDays(15));
                                 .setExpirationDate(LocalDateTime.now().plusDays(15));
                         company.setPackageProject(1);
                         company.setPackageProject(1);
                         company.setPackageExpense(1);
                         company.setPackageExpense(1);
+                        //设置来源
+                        company.setRegFrom("企业微信");
                         companyMapper.insert(company);
                         companyMapper.insert(company);
                         //生成项目的成本基线默认条目
                         //生成项目的成本基线默认条目
                         String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
                         String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
@@ -1373,18 +1377,32 @@ public class WeiXinCorpController {
                         outsource.add("其他外包费");
                         outsource.add("其他外包费");
                         //outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
                         //outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
                         List<ExpenseType> expenseTypeList=new ArrayList<>();
                         List<ExpenseType> expenseTypeList=new ArrayList<>();
+                        List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
+                        ExpenseMainType expenseMainType=new ExpenseMainType();
+                        expenseMainType.setName("一般费用");
+                        expenseMainType.setCompanyId(company.getId());
+                        ExpenseMainType expenseMainType1=new ExpenseMainType();
+                        expenseMainType1.setName("差旅费用");
+                        expenseMainType1.setCompanyId(company.getId());
+                        ExpenseMainType expenseMainType2=new ExpenseMainType();
+                        expenseMainType2.setName("外包费用");
+                        expenseMainType2.setCompanyId(company.getId());
+                        expenseMainTypes.add(expenseMainType);
+                        expenseMainTypes.add(expenseMainType1);
+                        expenseMainTypes.add(expenseMainType2);
+                        expenseMainTypeService.saveBatch(expenseMainTypes);
                         for (String expenseType : expenseTypes) {
                         for (String expenseType : expenseTypes) {
                             ExpenseType item=new ExpenseType();
                             ExpenseType item=new ExpenseType();
                             item.setCompanyId(company.getId());
                             item.setCompanyId(company.getId());
                             item.setTypeName(expenseType);
                             item.setTypeName(expenseType);
                             if(commonly.contains(expenseType)){
                             if(commonly.contains(expenseType)){
-                                item.setMainType(0);
+                                item.setMainType(expenseMainType.getId());
                             }
                             }
                             if(travel.contains(expenseType)){
                             if(travel.contains(expenseType)){
-                                item.setMainType(1);
+                                item.setMainType(expenseMainType1.getId());
                             }
                             }
                             if(outsource.contains(expenseType)){
                             if(outsource.contains(expenseType)){
-                                item.setMainType(2);
+                                item.setMainType(expenseMainType2.getId());
                             }
                             }
                             expenseTypeList.add(item);
                             expenseTypeList.add(item);
                         }
                         }
@@ -1525,7 +1543,7 @@ public class WeiXinCorpController {
                                 newCompany.setPackageProvider(0);//供应商模块
                                 newCompany.setPackageProvider(0);//供应商模块
                                 break;
                                 break;
                             //建筑版
                             //建筑版
-                            case "spd04f1b0582a0fe19":
+                            case "sp29bdb884f4a78392":
                                 newCompany.setPackageProject(1);//项目协作平台
                                 newCompany.setPackageProject(1);//项目协作平台
                                 newCompany.setPackageOa(0);//OA平台;请假,出差等
                                 newCompany.setPackageOa(0);//OA平台;请假,出差等
                                 newCompany.setPackageExpense(1);//费用报销
                                 newCompany.setPackageExpense(1);//费用报销
@@ -1534,7 +1552,7 @@ public class WeiXinCorpController {
                                 newCompany.setPackageProvider(0);//供应商模块
                                 newCompany.setPackageProvider(0);//供应商模块
                                 break;
                                 break;
                             //旗舰版
                             //旗舰版
-                            case "specf7090ca7757870":
+                            case "sp852fec2d1198957a":
                                 newCompany.setPackageProject(1);//项目协作平台
                                 newCompany.setPackageProject(1);//项目协作平台
                                 newCompany.setPackageOa(1);//OA平台;请假,出差等
                                 newCompany.setPackageOa(1);//OA平台;请假,出差等
                                 newCompany.setPackageExpense(1);//费用报销
                                 newCompany.setPackageExpense(1);//费用报销
@@ -3422,7 +3440,7 @@ public class WeiXinCorpController {
                     newCompany.setPackageProvider(0);//供应商模块
                     newCompany.setPackageProvider(0);//供应商模块
                     break;
                     break;
                 //建筑版
                 //建筑版
-                case "spd04f1b0582a0fe19":
+                case "sp29bdb884f4a78392":
                     newCompany.setPackageProject(1);//项目协作平台
                     newCompany.setPackageProject(1);//项目协作平台
                     newCompany.setPackageOa(0);//OA平台;请假,出差等
                     newCompany.setPackageOa(0);//OA平台;请假,出差等
                     newCompany.setPackageExpense(1);//费用报销
                     newCompany.setPackageExpense(1);//费用报销
@@ -3431,7 +3449,7 @@ public class WeiXinCorpController {
                     newCompany.setPackageProvider(0);//供应商模块
                     newCompany.setPackageProvider(0);//供应商模块
                     break;
                     break;
                 //旗舰版
                 //旗舰版
-                case "specf7090ca7757870":
+                case "sp852fec2d1198957a":
                     newCompany.setPackageProject(1);//项目协作平台
                     newCompany.setPackageProject(1);//项目协作平台
                     newCompany.setPackageOa(1);//OA平台;请假,出差等
                     newCompany.setPackageOa(1);//OA平台;请假,出差等
                     newCompany.setPackageExpense(1);//费用报销
                     newCompany.setPackageExpense(1);//费用报销
@@ -3489,6 +3507,8 @@ public class WeiXinCorpController {
                     Company company = new Company().setCompanyName(wxCorpInfo.getCorpName())
                     Company company = new Company().setCompanyName(wxCorpInfo.getCorpName())
                             .setExpirationDate(LocalDateTime.now().plusDays(15));
                             .setExpirationDate(LocalDateTime.now().plusDays(15));
                     company.setPackageWorktime(1);
                     company.setPackageWorktime(1);
+                    //设置来源
+                    company.setRegFrom("企业微信");
                     companyMapper.insert(company);
                     companyMapper.insert(company);
                     wxCorpInfo.setCompanyId(company.getId());
                     wxCorpInfo.setCompanyId(company.getId());
                     wxCorpInfoMapper.updateById(wxCorpInfo);
                     wxCorpInfoMapper.updateById(wxCorpInfo);

+ 13 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Company.java

@@ -16,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  * </p>
  *
  *
  * @author Seyason
  * @author Seyason
- * @since 2022-09-15
+ * @since 2023-04-10
  */
  */
 @Data
 @Data
 @EqualsAndHashCode(callSuper = false)
 @EqualsAndHashCode(callSuper = false)
@@ -127,6 +127,18 @@ public class Company extends Model<Company> {
     @TableField("is_international")
     @TableField("is_international")
     private Integer isInternational;
     private Integer isInternational;
 
 
+    /**
+     * 创建日期
+     */
+    @TableField("create_date")
+    private LocalDateTime createDate;
+
+    /**
+     * 注册来源
+     */
+    @TableField("reg_from")
+    private String regFrom;
+
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {

+ 42 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseMainType.java

@@ -0,0 +1,42 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ExpenseMainType extends Model<ExpenseMainType> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("name")
+    private String name;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -109,6 +109,9 @@ public class ExpenseSheet extends Model<ExpenseSheet> {
     @TableField(exist = false)
     @TableField(exist = false)
     private List<ExpenseItem> invoiceList;
     private List<ExpenseItem> invoiceList;
 
 
+    @TableField(exist = false)
+    private String expenseMainTypeName;
+
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {
         return this.id;
         return this.id;

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

@@ -46,6 +46,9 @@ public class ExpenseType extends Model<ExpenseType> {
     @TableField("company_id")
     @TableField("company_id")
     private Integer companyId;
     private Integer companyId;
 
 
+    @TableField(exist = false)
+    private String expenseMainTypeName;
+
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {

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

@@ -0,0 +1,50 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProDocumentTemDetail extends Model<ProDocumentTemDetail> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("template_id")
+    private Integer templateId;
+
+    @TableField("name")
+    private String name;
+
+    @TableField("parent_id")
+    private Integer parentId;
+
+    @TableField(exist =  false)
+    private List<ProDocumentTemDetail> children;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 53 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectDocumentTemplate.java

@@ -0,0 +1,53 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectDocumentTemplate extends Model<ProjectDocumentTemplate> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("name")
+    private String name;
+
+    /**
+     * 是否随项目创建 0-否 1-是
+     */
+    @TableField("cre_with_pro")
+    private Integer creWithPro;
+
+    @TableField(exist = false)
+    private List<ProDocumentTemDetail> proDocumentTemDetailList;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ExpenseMainType;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-06
+ */
+public interface ExpenseMainTypeMapper extends BaseMapper<ExpenseMainType> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProDocumentTemDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+public interface ProDocumentTemDetailMapper extends BaseMapper<ProDocumentTemDetail> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectDocumentTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+public interface ProjectDocumentTemplateMapper extends BaseMapper<ProjectDocumentTemplate> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ExpenseMainType;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-06
+ */
+public interface ExpenseMainTypeService extends IService<ExpenseMainType> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProDocumentTemDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+public interface ProDocumentTemDetailService extends IService<ProDocumentTemDetail> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectDocumentTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+public interface ProjectDocumentTemplateService extends IService<ProjectDocumentTemplate> {
+
+}

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

@@ -30,7 +30,7 @@ public interface UserService extends IService<User> {
 
 
     HttpRespMsg editPassword(String originPassword, String newPassword, HttpServletRequest request);
     HttpRespMsg editPassword(String originPassword, String newPassword, HttpServletRequest request);
 
 
-    HttpRespMsg insertCompany(String companyName, String name, String phone, String vcode, String pwd, Integer type);
+    HttpRespMsg insertCompany(String companyName, String name, String phone, String vcode, String pwd, Integer type, String from);
 
 
     HttpRespMsg insertUser(String id, String name, String phone, Integer roleId, Double monthCost, Double cost, Integer departmentId,
     HttpRespMsg insertUser(String id, String name, String phone, Integer roleId, Double monthCost, Double cost, Integer departmentId,
                            Integer salaryType, String costApplyDate, String position, String certJson,
                            Integer salaryType, String costApplyDate, String position, String certJson,

+ 163 - 69
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -62,6 +62,8 @@ public class DingDingServiceImpl implements DingDingService {
     TempDuserMapper tempDuserMapper;
     TempDuserMapper tempDuserMapper;
     @Resource
     @Resource
     TempDuserService tempDuserService;
     TempDuserService tempDuserService;
+    @Resource
+    ExpenseMainTypeService expenseMainTypeService;
 
 
     public static String PRE_AUTH_CODE = null;
     public static String PRE_AUTH_CODE = null;
     public static long expireTime = 0L;
     public static long expireTime = 0L;
@@ -178,6 +180,8 @@ public class DingDingServiceImpl implements DingDingService {
                 company.setPackageExpense(1);
                 company.setPackageExpense(1);
                 company.setPackageCustomer(1);
                 company.setPackageCustomer(1);
                 company.setPackageOa(1);
                 company.setPackageOa(1);
+                //设置来源
+                company.setRegFrom("钉钉");
                 companyMapper.insert(company);
                 companyMapper.insert(company);
                 dingding.setCompanyId(company.getId());
                 dingding.setCompanyId(company.getId());
                 companyDingdingMapper.updateById(dingding);
                 companyDingdingMapper.updateById(dingding);
@@ -240,18 +244,32 @@ public class DingDingServiceImpl implements DingDingService {
                 outsource.add(MessageUtils.message("entry.labourCost"));
                 outsource.add(MessageUtils.message("entry.labourCost"));
                 outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
                 outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
                 List<ExpenseType> expenseTypeList=new ArrayList<>();
                 List<ExpenseType> expenseTypeList=new ArrayList<>();
+                List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
+                ExpenseMainType expenseMainType=new ExpenseMainType();
+                expenseMainType.setName("一般费用");
+                expenseMainType.setCompanyId(company.getId());
+                ExpenseMainType expenseMainType1=new ExpenseMainType();
+                expenseMainType1.setName("差旅费用");
+                expenseMainType1.setCompanyId(company.getId());
+                ExpenseMainType expenseMainType2=new ExpenseMainType();
+                expenseMainType2.setName("外包费用");
+                expenseMainType2.setCompanyId(company.getId());
+                expenseMainTypes.add(expenseMainType);
+                expenseMainTypes.add(expenseMainType1);
+                expenseMainTypes.add(expenseMainType2);
+                expenseMainTypeService.saveBatch(expenseMainTypes);
                 for (String expenseType : expenseTypes) {
                 for (String expenseType : expenseTypes) {
                     ExpenseType item=new ExpenseType();
                     ExpenseType item=new ExpenseType();
                     item.setCompanyId(company.getId());
                     item.setCompanyId(company.getId());
                     item.setTypeName(expenseType);
                     item.setTypeName(expenseType);
                     if(commonly.contains(expenseType)){
                     if(commonly.contains(expenseType)){
-                        item.setMainType(0);
+                        item.setMainType(expenseMainType.getId());
                     }
                     }
                     if(travel.contains(expenseType)){
                     if(travel.contains(expenseType)){
-                        item.setMainType(1);
+                        item.setMainType(expenseMainType1.getId());
                     }
                     }
                     if(outsource.contains(expenseType)){
                     if(outsource.contains(expenseType)){
-                        item.setMainType(2);
+                        item.setMainType(expenseMainType2.getId());
                     }
                     }
                     expenseTypeList.add(item);
                     expenseTypeList.add(item);
                 }
                 }
@@ -361,6 +379,8 @@ public class DingDingServiceImpl implements DingDingService {
             company.setPackageExpense(1);
             company.setPackageExpense(1);
             company.setPackageCustomer(1);
             company.setPackageCustomer(1);
             company.setPackageOa(1);
             company.setPackageOa(1);
+            //设置来源
+            company.setRegFrom("钉钉");
             companyMapper.insert(company);
             companyMapper.insert(company);
 
 
             //生成工作时长
             //生成工作时长
@@ -378,73 +398,80 @@ public class DingDingServiceImpl implements DingDingService {
                 setting.setCompanyId(company.getId());
                 setting.setCompanyId(company.getId());
                 projectBasecostSettingMapper.insert(setting);
                 projectBasecostSettingMapper.insert(setting);
             }
             }
-            //直接授权默认人员
-            User user = userMapper.selectList(new QueryWrapper<User>().eq("company_id", company.getId()).eq("is_active", 1)).get(0);
-            //todo: 生成初始测试项目及任务
-            Project project=new Project();
-            project.setCompanyId(company.getId());
-            project.setInchargerId(user.getId());
-            project.setInchargerName(user.getName());
-            project.setCreatorId(user.getId());
-            project.setCreatorName(user.getName());
-            project.setCreateDate(LocalDate.now());
-            project.setProjectCode("example");
-            project.setProjectName("示例项目");
-            //设置为公共项目,这样测试的用户都能填报
-            project.setIsPublic(1);
-            projectMapper.insert(project);
-            //todo: 生成初始项目相关日报审核人
-            ProjectAuditor projectAuditor=new ProjectAuditor();
-            projectAuditor.setAuditorId(user.getId());
-            projectAuditor.setAuditorName(user.getName());
-            projectAuditor.setProjectId(project.getId());
-            projectAuditorMapper.insert(projectAuditor);
-            //todo: 生成项目报表服务默认条目
-            Integer[] arrayInteger=new Integer[]{1,2,3,4,7};
-            for (Integer integerItem : arrayInteger) {
-                CompanyReport companyReport=new CompanyReport();
-                companyReport.setCompanyId(company.getId());
-                companyReport.setReportFormId(integerItem);
-                companyReportMapper.insert(companyReport);
+            //生成费用报销默认条目
+            String[] expenseTypes = Constant.EXPENSE_TYPES;
+            List<String> commonly = new ArrayList<>();
+            //commonly.add("材料费");
+            commonly.add(MessageUtils.message("entry.materialCost"));
+            //commonly.add("办公用品");
+            commonly.add(MessageUtils.message("entry.workCost"));
+            //commonly.add("培训费");
+            commonly.add(MessageUtils.message("entry.trainCost"));
+            //commonly.add("打印费");
+            commonly.add(MessageUtils.message("entry.printCost"));
+            //commonly.add("快递费");
+            commonly.add(MessageUtils.message("entry.expressCost"));
+            //commonly.add("制作费");
+            commonly.add(MessageUtils.message("entry.makeCost"));
+            //commonly.add("律师费");
+            commonly.add(MessageUtils.message("entry.lawyerCost"));
+            //commonly.add("水费");
+            commonly.add(MessageUtils.message("entry.waterCost"));
+            //commonly.add("电费");
+            commonly.add(MessageUtils.message("entry.electricCost"));
+            //commonly.add("团建费");
+            commonly.add(MessageUtils.message("entry.leagueCost"));
+            //commonly.add("其他");
+            commonly.add(MessageUtils.message("entry.other"));
+            List<String> travel  = new ArrayList<>();
+//                travel.add("城市间交通费");
+//                travel.add("住宿费");
+//                travel.add("伙食补助费");
+//                travel.add("市内交通费");
+//                travel.add("其他差旅费");
+            travel.add(MessageUtils.message("entry.cityTrafficCost"));
+            travel.add(MessageUtils.message("entry.liveCost"));
+            travel.add(MessageUtils.message("entry.eatCost"));
+            travel.add(MessageUtils.message("entry.insideCityCost"));
+            travel.add(MessageUtils.message("entry.otherLiveTraCost"));
+            List<String> outsource = new ArrayList<>();
+//                outsource.add("项目外包费");
+//                outsource.add("劳务外包费");
+//                outsource.add("其他外包费");
+            outsource.add(MessageUtils.message("entry.projectCost"));
+            outsource.add(MessageUtils.message("entry.labourCost"));
+            outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
+            List<ExpenseType> expenseTypeList=new ArrayList<>();
+            List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
+            ExpenseMainType expenseMainType=new ExpenseMainType();
+            expenseMainType.setName("一般费用");
+            expenseMainType.setCompanyId(company.getId());
+            ExpenseMainType expenseMainType1=new ExpenseMainType();
+            expenseMainType1.setName("差旅费用");
+            expenseMainType1.setCompanyId(company.getId());
+            ExpenseMainType expenseMainType2=new ExpenseMainType();
+            expenseMainType2.setName("外包费用");
+            expenseMainType2.setCompanyId(company.getId());
+            expenseMainTypes.add(expenseMainType);
+            expenseMainTypes.add(expenseMainType1);
+            expenseMainTypes.add(expenseMainType2);
+            expenseMainTypeService.saveBatch(expenseMainTypes);
+            for (String expenseType : expenseTypes) {
+                ExpenseType item=new ExpenseType();
+                item.setCompanyId(company.getId());
+                item.setTypeName(expenseType);
+                if(commonly.contains(expenseType)){
+                    item.setMainType(expenseMainType.getId());
+                }
+                if(travel.contains(expenseType)){
+                    item.setMainType(expenseMainType1.getId());
+                }
+                if(outsource.contains(expenseType)){
+                    item.setMainType(expenseMainType2.getId());
+                }
+                expenseTypeList.add(item);
             }
             }
-            //todo: 生成初始项目相关示例任务分组/任务阶段以及示例任务
-            TaskGroup taskGroup = new TaskGroup();
-            taskGroup.setProjectId(project.getId())
-                    .setInchargerId(user.getId())
-                    .setName("项目阶段");
-            taskGroupMapper.insert(taskGroup);
-            Stages stage = new Stages();
-            stage.setGroupId(taskGroup.getId());
-            stage.setSequence(1);
-            stage.setProjectId(project.getId());
-            stage.setStagesName("工作开展");
-            stagesMapper.insert(stage);
-            Task task=new Task();
-            Integer oneDayHours = 8;
-            task.setCreateDate(LocalDate.now());
-            task.setProjectId(project.getId());
-            task.setCompanyId(company.getId());
-            task.setCreaterId(user.getId());
-            task.setCreaterName(user.getName());
-            task.setCreatorColor(user.getColor());
-            task.setExecutorId(user.getId());
-            task.setExecutorColor(user.getColor());
-            task.setExecutorName(user.getName());
-            task.setPlanHours(oneDayHours);
-            task.setStagesId(stage.getId());
-            task.setGroupId(taskGroup.getId());
-            task.setSeq(0);
-            task.setName("示例任务");
-            taskMapper.insert(task);
-            //任务执行人表也要插入,不然会导致编辑任务的时候执行人为空
-            TaskExecutor executor = new TaskExecutor();
-            executor.setTaskId(task.getId());
-            executor.setPlanHours(oneDayHours);
-            executor.setProjectId(project.getId());
-            executor.setExecutorId(user.getId());
-            executor.setExecutorColor(user.getColor());
-            executor.setExecutorName(user.getName());
-            taskExecutorMapper.insert(executor);
+            expenseTypeService.saveBatch(expenseTypeList);
         }
         }
         //钉钉企业外部关系表
         //钉钉企业外部关系表
         CompanyDingding dingding = new CompanyDingding();
         CompanyDingding dingding = new CompanyDingding();
@@ -487,6 +514,73 @@ public class DingDingServiceImpl implements DingDingService {
 
 
                 //获取授权的部门
                 //获取授权的部门
                 getAuthedDeptsAndUsers(dingding, accessToken);
                 getAuthedDeptsAndUsers(dingding, accessToken);
+                //直接授权默认人员
+                User targetUser = userMapper.selectById(id.toString());
+                //todo: 生成初始测试项目及任务
+                Project project=new Project();
+                project.setCompanyId(company.getId());
+                project.setInchargerId(targetUser.getId());
+                project.setInchargerName(targetUser.getName());
+                project.setCreatorId(targetUser.getId());
+                project.setCreatorName(targetUser.getName());
+                project.setCreateDate(LocalDate.now());
+                project.setProjectCode("example");
+                project.setProjectName("示例项目");
+                //设置为公共项目,这样测试的用户都能填报
+                project.setIsPublic(1);
+                projectMapper.insert(project);
+                //todo: 生成初始项目相关日报审核人
+                ProjectAuditor projectAuditor=new ProjectAuditor();
+                projectAuditor.setAuditorId(targetUser.getId());
+                projectAuditor.setAuditorName(targetUser.getName());
+                projectAuditor.setProjectId(project.getId());
+                projectAuditorMapper.insert(projectAuditor);
+                //todo: 生成项目报表服务默认条目
+                Integer[] arrayInteger=new Integer[]{1,2,3,4,7};
+                for (Integer integerItem : arrayInteger) {
+                    CompanyReport companyReport=new CompanyReport();
+                    companyReport.setCompanyId(company.getId());
+                    companyReport.setReportFormId(integerItem);
+                    companyReportMapper.insert(companyReport);
+                }
+                //todo: 生成初始项目相关示例任务分组/任务阶段以及示例任务
+                TaskGroup taskGroup = new TaskGroup();
+                taskGroup.setProjectId(project.getId())
+                        .setInchargerId(targetUser.getId())
+                        .setName("项目阶段");
+                taskGroupMapper.insert(taskGroup);
+                Stages stage = new Stages();
+                stage.setGroupId(taskGroup.getId());
+                stage.setSequence(1);
+                stage.setProjectId(project.getId());
+                stage.setStagesName("工作开展");
+                stagesMapper.insert(stage);
+                Task task=new Task();
+                Integer oneDayHours = 8;
+                task.setCreateDate(LocalDate.now());
+                task.setProjectId(project.getId());
+                task.setCompanyId(company.getId());
+                task.setCreaterId(targetUser.getId());
+                task.setCreaterName(targetUser.getName());
+                task.setCreatorColor(targetUser.getColor());
+                task.setExecutorId(targetUser.getId());
+                task.setExecutorColor(targetUser.getColor());
+                task.setExecutorName(targetUser.getName());
+                task.setPlanHours(oneDayHours);
+                task.setStagesId(stage.getId());
+                task.setGroupId(taskGroup.getId());
+                task.setSeq(0);
+                task.setName("示例任务");
+                taskMapper.insert(task);
+                //任务执行人表也要插入,不然会导致编辑任务的时候执行人为空
+                TaskExecutor executor = new TaskExecutor();
+                executor.setTaskId(task.getId());
+                executor.setPlanHours(oneDayHours);
+                executor.setProjectId(project.getId());
+                executor.setExecutorId(targetUser.getId());
+                executor.setExecutorColor(targetUser.getColor());
+                executor.setExecutorName(targetUser.getName());
+                taskExecutorMapper.insert(executor);
             } else {
             } else {
                 System.out.println("AccessToken为空,无法获取部门列表");
                 System.out.println("AccessToken为空,无法获取部门列表");
             }
             }

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ExpenseMainType;
+import com.management.platform.mapper.ExpenseMainTypeMapper;
+import com.management.platform.service.ExpenseMainTypeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-06
+ */
+@Service
+public class ExpenseMainTypeServiceImpl extends ServiceImpl<ExpenseMainTypeMapper, ExpenseMainType> implements ExpenseMainTypeService {
+
+}

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -85,6 +85,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     private SysRoleFunctionMapper sysRoleFunctionMapper;
     private SysRoleFunctionMapper sysRoleFunctionMapper;
     @Resource
     @Resource
     private ExcelExportService excelExportService;
     private ExcelExportService excelExportService;
+    @Resource
+    private ExpenseMainTypeService expenseMainTypeService;
     public static final String[] sheetTypes = {"一般费用","差旅费","外包费用"};
     public static final String[] sheetTypes = {"一般费用","差旅费","外包费用"};
     @Override
     @Override
     public HttpRespMsg add(ExpenseSheet sheet, String items, String userId) {
     public HttpRespMsg add(ExpenseSheet sheet, String items, String userId) {
@@ -233,6 +235,13 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         IPage<ExpenseSheet> listIPager = expenseSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
         IPage<ExpenseSheet> listIPager = expenseSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
                 queryWrapper);
                 queryWrapper);
         List<ExpenseSheet> records = listIPager.getRecords();
         List<ExpenseSheet> records = listIPager.getRecords();
+        List<ExpenseMainType> expenseMainTypes = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", sheet.getCompanyId()).or().eq("is_system",1));
+        records.forEach(re->{
+            Optional<ExpenseMainType> first = expenseMainTypes.stream().filter(et -> et.getId().equals(re.getType())).findFirst();
+            if(first.isPresent()){
+                re.setExpenseMainTypeName(first.get().getName());
+            }
+        });
         Long total = listIPager.getTotal();
         Long total = listIPager.getTotal();
         Map<String, Object> map = new HashMap<>();
         Map<String, Object> map = new HashMap<>();
         map.put("records", records);
         map.put("records", records);

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProDocumentTemDetail;
+import com.management.platform.mapper.ProDocumentTemDetailMapper;
+import com.management.platform.service.ProDocumentTemDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+@Service
+public class ProDocumentTemDetailServiceImpl extends ServiceImpl<ProDocumentTemDetailMapper, ProDocumentTemDetail> implements ProDocumentTemDetailService {
+
+}

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectDocumentTemplate;
+import com.management.platform.mapper.ProjectDocumentTemplateMapper;
+import com.management.platform.service.ProjectDocumentTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-04-07
+ */
+@Service
+public class ProjectDocumentTemplateServiceImpl extends ServiceImpl<ProjectDocumentTemplateMapper, ProjectDocumentTemplate> implements ProjectDocumentTemplateService {
+
+}

+ 105 - 68
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -539,6 +539,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
                 }
             }
             }
         }
         }
+        boolean inchargerChanged = false;
+        String oldInchargerId = null;
         if (id == null) {
         if (id == null) {
             //新增项目
             //新增项目
             if (name == null) {
             if (name == null) {
@@ -684,6 +686,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 httpRespMsg.setError(MessageUtils.message("project.submitFailByNoRepeat"));
                 httpRespMsg.setError(MessageUtils.message("project.submitFailByNoRepeat"));
             } else {
             } else {
                 Project project = projectMapper.selectById(id);
                 Project project = projectMapper.selectById(id);
+                if (inchargerId != null && !inchargerId.equals(project.getInchargerId())) {
+                    inchargerChanged = true;
+                    oldInchargerId = project.getInchargerId();
+                }
                 Project p = new Project();
                 Project p = new Project();
                 p.setProjectName(name).setId(id).setCompanyId(companyId).setProjectCode(code).setInchargerId(inchargerId)
                 p.setProjectName(name).setId(id).setCompanyId(companyId).setProjectCode(code).setInchargerId(inchargerId)
                         .setLevel(level)
                         .setLevel(level)
@@ -931,59 +937,73 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                     }
                 }
                 }
             } else {
             } else {
-                //提取变化的部分
-                List<ProjectAuditor> oldAuditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", id));
-                List<ProjectAuditor> newList = new ArrayList<>();
-                String firstAuditorId = null;
-                if (auditorIds.size() > 0) {
-                    firstAuditorId = auditorIds.get(0);
-                    List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", auditorIds));
-                    System.out.println("有auditor===");
-                    List<User> newUserList = userList.stream()
-                                .filter(u->!oldAuditorList.stream().anyMatch(old->old.getAuditorId().equals(u.getId())))
-                                .collect(Collectors.toList());
-                    if (newUserList.size() > 0) {
-                        for (User u : newUserList) {
-                            ProjectAuditor a = new ProjectAuditor();
-                            a.setProjectId(id);
-                            a.setAuditorId(u.getId());
-                            a.setAuditorName(u.getName());
-                            newList.add(a);
-                        }
-                        projectAuditorService.saveBatch(newList);
-                    }
-                    //检查有没有需要删除的
-                    List<ProjectAuditor> deleteList = oldAuditorList.stream()
-                            .filter(old->!userList.stream().anyMatch(u->u.getId().equals(old.getAuditorId())))
-                            .collect(Collectors.toList());
-
-                    if (deleteList.size() > 0) {
-                        projectAuditorService.removeByIds(deleteList.stream().map(ProjectAuditor::getId).collect(Collectors.toList()));
-                    }
-                    if (newList.size() == 0 && deleteList.size() == oldAuditorList.size()) {
-                        //全部被删除了的情况,保留项目负责人
-                        if (!StringUtils.isEmpty(inchargerId)) {
-                            ProjectAuditor auditor = new ProjectAuditor();
-                            auditor.setProjectId(id);
-                            auditor.setAuditorId(inchargerId);
-                            auditor.setAuditorName(userMapper.selectById(inchargerId).getName());
-                            projectAuditorMapper.insert(auditor);
-                        }
-                    }
-                    //检查日报,如果有删除的审核人的正在审核的日报,要更新审核人为当前的第一个人
-                    Report updateItem = new Report();
-                    if (deleteList.size() > 0 && firstAuditorId != null) {
-                        updateItem.setProjectAuditorId(firstAuditorId);
-                        List<String> collect = deleteList.stream().map(ProjectAuditor::getAuditorId).collect(Collectors.toList());
+                //针对reportAuditType=2(先任务分组负责人审核再项目经理审核的情况),如果项目经理变更,需要把老项目经理负责的日报变成新项目经理负责
+                if (timeType.getReportAuditType() == 2) {
+                    if (inchargerChanged && oldInchargerId != null) {
+                        Report updateItem = new Report();
+                        updateItem.setProjectAuditorId(inchargerId);
                         reportMapper.update(updateItem, new QueryWrapper<Report>()
                         reportMapper.update(updateItem, new QueryWrapper<Report>()
                                 .eq("company_id", companyId)
                                 .eq("company_id", companyId)
-                                .in("project_auditor_id", collect)
+                                .eq("project_auditor_id", oldInchargerId)
                                 .eq("state", 0)
                                 .eq("state", 0)
+                                .eq("group_audit_state", 1)//任务分组已审核,当前是项目经理审核
                                 .eq("project_id", id));
                                 .eq("project_id", id));
                     }
                     }
                 } else {
                 } else {
-                    //清空
-                    projectAuditorMapper.delete(new QueryWrapper<ProjectAuditor>().eq("project_id", id));
+                    //其他审核情况,提取变化的部分
+                    List<ProjectAuditor> oldAuditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", id));
+                    List<ProjectAuditor> newList = new ArrayList<>();
+                    String firstAuditorId = null;
+                    if (auditorIds.size() > 0) {
+                        firstAuditorId = auditorIds.get(0);
+                        List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", auditorIds));
+                        System.out.println("有auditor===");
+                        List<User> newUserList = userList.stream()
+                                .filter(u->!oldAuditorList.stream().anyMatch(old->old.getAuditorId().equals(u.getId())))
+                                .collect(Collectors.toList());
+                        if (newUserList.size() > 0) {
+                            for (User u : newUserList) {
+                                ProjectAuditor a = new ProjectAuditor();
+                                a.setProjectId(id);
+                                a.setAuditorId(u.getId());
+                                a.setAuditorName(u.getName());
+                                newList.add(a);
+                            }
+                            projectAuditorService.saveBatch(newList);
+                        }
+                        //检查有没有需要删除的
+                        List<ProjectAuditor> deleteList = oldAuditorList.stream()
+                                .filter(old->!userList.stream().anyMatch(u->u.getId().equals(old.getAuditorId())))
+                                .collect(Collectors.toList());
+
+                        if (deleteList.size() > 0) {
+                            projectAuditorService.removeByIds(deleteList.stream().map(ProjectAuditor::getId).collect(Collectors.toList()));
+                        }
+                        if (newList.size() == 0 && deleteList.size() == oldAuditorList.size()) {
+                            //全部被删除了的情况,保留项目负责人
+                            if (!StringUtils.isEmpty(inchargerId)) {
+                                ProjectAuditor auditor = new ProjectAuditor();
+                                auditor.setProjectId(id);
+                                auditor.setAuditorId(inchargerId);
+                                auditor.setAuditorName(userMapper.selectById(inchargerId).getName());
+                                projectAuditorMapper.insert(auditor);
+                            }
+                        }
+                        //检查日报,如果有删除的审核人的正在审核的日报,要更新审核人为当前的第一个人
+                        Report updateItem = new Report();
+                        if (deleteList.size() > 0 && firstAuditorId != null) {
+                            updateItem.setProjectAuditorId(firstAuditorId);
+                            List<String> collect = deleteList.stream().map(ProjectAuditor::getAuditorId).collect(Collectors.toList());
+                            reportMapper.update(updateItem, new QueryWrapper<Report>()
+                                    .eq("company_id", companyId)
+                                    .in("project_auditor_id", collect)
+                                    .eq("state", 0)
+                                    .eq("project_id", id));
+                        }
+                    } else {
+                        //清空
+                        projectAuditorMapper.delete(new QueryWrapper<ProjectAuditor>().eq("project_id", id));
+                    }
                 }
                 }
             }
             }
         }
         }
@@ -7989,6 +8009,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg batchExchangeIncharger(String projectIds, String inchargerId, HttpServletRequest request) {
     public HttpRespMsg batchExchangeIncharger(String projectIds, String inchargerId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         User user = userMapper.selectById(request.getHeader("token"));
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
         String[] split = projectIds.split(",");
         String[] split = projectIds.split(",");
         List<String> stringlist = Arrays.asList(split);
         List<String> stringlist = Arrays.asList(split);
         List<Integer> list=new ArrayList<>();
         List<Integer> list=new ArrayList<>();
@@ -7998,28 +8019,44 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", list));
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", list));
         List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", list));
         List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", list));
         for (Project project : projectList) {
         for (Project project : projectList) {
-            project.setInchargerId(inchargerId);
-            if(projectMapper.updateById(project)<=0){
-                //httpRespMsg.setError("操作失败");
-                httpRespMsg.setError(MessageUtils.message("other.operationFail"));
-                return httpRespMsg;
-            }
-            boolean b = participationList.stream().anyMatch(pl -> pl.getProjectId().equals(project.getId()) && pl.getUserId().equals(inchargerId));
-            //项目经理不在参与人当中时 要添加
-            if(!b){
-                Participation participation=new Participation();
-                participation.setProjectId(project.getId());
-                participation.setUserId(inchargerId);
-                participationMapper.insert(participation);
+            String oldInchargerId = project.getInchargerId();
+            if (!inchargerId.equals(oldInchargerId)) {
+                project.setInchargerId(inchargerId);
+                if(projectMapper.updateById(project)<=0){
+                    //httpRespMsg.setError("操作失败");
+                    httpRespMsg.setError(MessageUtils.message("other.operationFail"));
+                    return httpRespMsg;
+                }
+                boolean b = participationList.stream().anyMatch(pl -> pl.getProjectId().equals(project.getId()) && pl.getUserId().equals(inchargerId));
+                //项目经理不在参与人当中时 要添加
+                if(!b){
+                    Participation participation=new Participation();
+                    participation.setProjectId(project.getId());
+                    participation.setUserId(inchargerId);
+                    participationMapper.insert(participation);
+                }
+                OperationRecord operationRecord=new OperationRecord();
+                operationRecord.setOperatorName(user.getName());
+                operationRecord.setProjectName(project.getProjectName());
+                operationRecord.setCompanyId(project.getCompanyId());
+                operationRecord.setOperationTime(LocalDateTime.now());
+                operationRecord.setContent("批量操作:[设置项目负责人为:"+inchargerId+"]");
+                operationRecord.setModuleName("项目管理");
+                operationRecordService.save(operationRecord);
+                //针对reportAuditType=2(先任务分组负责人审核再项目经理审核的情况),如果项目经理变更,需要把老项目经理负责的日报变成新项目经理负责
+                if (timeType.getReportAuditType() == 2) {
+                    if (oldInchargerId != null) {
+                        Report updateItem = new Report();
+                        updateItem.setProjectAuditorId(inchargerId);
+                        reportMapper.update(updateItem, new QueryWrapper<Report>()
+                                .eq("company_id", timeType.getCompanyId())
+                                .eq("project_auditor_id", oldInchargerId)
+                                .eq("state", 0)
+                                .eq("group_audit_state", 1)//任务分组已审核,当前是项目经理审核
+                                .eq("project_id", project.getId()));
+                    }
+                }
             }
             }
-            OperationRecord operationRecord=new OperationRecord();
-            operationRecord.setOperatorName(user.getName());
-            operationRecord.setProjectName(project.getProjectName());
-            operationRecord.setCompanyId(project.getCompanyId());
-            operationRecord.setOperationTime(LocalDateTime.now());
-            operationRecord.setContent("批量操作:[设置项目负责人为:"+inchargerId+"]");
-            operationRecord.setModuleName("项目管理");
-            operationRecordService.save(operationRecord);
         }
         }
         return httpRespMsg;
         return httpRespMsg;
     }
     }

+ 32 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -1484,7 +1484,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             User auditTargetUser = userMapper.selectById(creatorId);
             User auditTargetUser = userMapper.selectById(creatorId);
             if (timeType.getReportAuditType() == 2) {
             if (timeType.getReportAuditType() == 2) {
                 //先按分组审核,再进行项目经理审核
                 //先按分组审核,再进行项目经理审核
-                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id, state, group_audit_state, project_id, project_audit_state").in("id", ids));
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id, state, group_audit_state, project_id, project_audit_state, project_auditor_id").in("id", ids));
                 List<Integer> assProjectIds = reportList.stream().map(Report::getProjectId).collect(Collectors.toList());
                 List<Integer> assProjectIds = reportList.stream().map(Report::getProjectId).collect(Collectors.toList());
                 List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id, incharger_id").in("id", assProjectIds));
                 List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id, incharger_id").in("id", assProjectIds));
                 Optional<Project> first = projectList.stream().filter(p -> StringUtils.isEmpty(p.getInchargerId())).findFirst();
                 Optional<Project> first = projectList.stream().filter(p -> StringUtils.isEmpty(p.getInchargerId())).findFirst();
@@ -1501,10 +1501,20 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if (r.getGroupAuditState() == 0) {
                     if (r.getGroupAuditState() == 0) {
                         r.setGroupAuditState(1);
                         r.setGroupAuditState(1);
                         r.setProjectAuditTime(LocalDateTime.now());
                         r.setProjectAuditTime(LocalDateTime.now());
+
                         //分组审核完,该项目的pm审核了
                         //分组审核完,该项目的pm审核了
                         Project project1 = projectList.stream().filter(project -> project.getId().equals(r.getProjectId())).findFirst().get();
                         Project project1 = projectList.stream().filter(project -> project.getId().equals(r.getProjectId())).findFirst().get();
-                        r.setProjectAuditorId(project1.getInchargerId());
-                        r.setProjectAuditorName(userMapper.selectById(project1.getInchargerId()).getName());
+
+                        //如果分组负责人和项目经理是同一个人,那么就不需要项目经理审核了
+                        if (r.getProjectAuditorId().equals(project1.getInchargerId())) {
+                            r.setProjectAuditState(1);
+                            r.setProjectAuditTime(LocalDateTime.now());
+                            r.setState(1);
+                        } else {
+                            //不是同一个人,那么就需要项目经理审核
+                            r.setProjectAuditorId(project1.getInchargerId());
+                            r.setProjectAuditorName(userMapper.selectById(project1.getInchargerId()).getName());
+                        }
                     } else if (r.getProjectAuditState() == 0) {
                     } else if (r.getProjectAuditState() == 0) {
                         r.setProjectAuditState(1);
                         r.setProjectAuditState(1);
                         r.setProjectAuditTime(LocalDateTime.now());
                         r.setProjectAuditTime(LocalDateTime.now());
@@ -1659,7 +1669,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (updateReportList.size() > 0) {
                 if (updateReportList.size() > 0) {
                     updateBatchById(updateReportList);
                     updateBatchById(updateReportList);
                 }
                 }
-                /*if(company.getId()==862){
+/*                if(company.getId()==862){
                     String url = "http://183.194.0.98:3202/api/web-server/controlCenter/billApproved";
                     String url = "http://183.194.0.98:3202/api/web-server/controlCenter/billApproved";
                     HttpHeaders headers = new HttpHeaders();
                     HttpHeaders headers = new HttpHeaders();
                     headers.setContentType(MediaType.APPLICATION_JSON);
                     headers.setContentType(MediaType.APPLICATION_JSON);
@@ -2170,7 +2180,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             }
             updateBatchById(newList);
             updateBatchById(newList);
         }
         }
-        /*if(company.getId()==862){
+/*        if(company.getId()==862){
             String url = "http://183.194.0.98:3202/api/web-server/controlCenter/billRejected";
             String url = "http://183.194.0.98:3202/api/web-server/controlCenter/billRejected";
             HttpHeaders headers = new HttpHeaders();
             HttpHeaders headers = new HttpHeaders();
             headers.setContentType(MediaType.APPLICATION_JSON);
             headers.setContentType(MediaType.APPLICATION_JSON);
@@ -2556,7 +2566,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (timeType.getReportAuditType() == 2) {
             if (timeType.getReportAuditType() == 2) {
                 allUsers = userMapper.selectList(new QueryWrapper<User>().select("id, name, department_id").eq("company_id", company.getId()));
                 allUsers = userMapper.selectList(new QueryWrapper<User>().select("id, name, department_id").eq("company_id", company.getId()));
                 //先分组负责人审核,再项目负责人审核
                 //先分组负责人审核,再项目负责人审核
-                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id, state, group_audit_state, project_id, project_audit_state, creator_id, create_date, company_id").in("id", ids));
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id, state, group_audit_state, project_id, project_audit_state, project_auditor_id, creator_id, create_date, company_id").in("id", ids));
                 allReports = reportList;
                 allReports = reportList;
                 List<Integer> assProjectIds = reportList.stream().map(Report::getProjectId).collect(Collectors.toList());
                 List<Integer> assProjectIds = reportList.stream().map(Report::getProjectId).collect(Collectors.toList());
                 List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id, incharger_id").in("id", assProjectIds));
                 List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id, incharger_id").in("id", assProjectIds));
@@ -2574,10 +2584,23 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if (r.getGroupAuditState() == 0) {
                     if (r.getGroupAuditState() == 0) {
                         r.setGroupAuditState(1);
                         r.setGroupAuditState(1);
                         r.setProjectAuditTime(LocalDateTime.now());
                         r.setProjectAuditTime(LocalDateTime.now());
-                        //分组审核完,该项目的pm审核了
+
                         Project project1 = projectList.stream().filter(project -> project.getId().equals(r.getProjectId())).findFirst().get();
                         Project project1 = projectList.stream().filter(project -> project.getId().equals(r.getProjectId())).findFirst().get();
-                        r.setProjectAuditorId(project1.getInchargerId());
-                        r.setProjectAuditorName(userMapper.selectById(project1.getInchargerId()).getName());
+                        Optional<User> pmFirst = allUsers.stream().filter(a -> a.getId().equals(project1.getInchargerId())).findFirst();
+                        if (!pmFirst.isPresent()) {
+                            httpRespMsg.setError(MessageUtils.message("project.masterError",project1.getProjectName()));
+                            return httpRespMsg;
+                        }
+                        //如果分组负责人和项目经理是同一个人,那么就不需要项目经理审核了
+                        if (r.getProjectAuditorId().equals(project1.getInchargerId())) {
+                            r.setProjectAuditState(1);
+                            r.setProjectAuditTime(LocalDateTime.now());
+                            r.setState(1);
+                        } else {
+                            //分组审核完,该项目的pm审核了
+                            r.setProjectAuditorId(project1.getInchargerId());
+                            r.setProjectAuditorName(pmFirst.get().getName());
+                        }
                     } else if (r.getProjectAuditState() == 0) {
                     } else if (r.getProjectAuditState() == 0) {
                         r.setProjectAuditState(1);
                         r.setProjectAuditState(1);
                         r.setProjectAuditTime(LocalDateTime.now());
                         r.setProjectAuditTime(LocalDateTime.now());

+ 26 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -85,6 +85,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Autowired
     @Autowired
     private RestTemplate restTemplate;
     private RestTemplate restTemplate;
     @Resource
     @Resource
+    ExpenseMainTypeService expenseMainTypeService;
+    @Resource
     private SysRoleModuleMapper sysRoleModuleMapper;
     private SysRoleModuleMapper sysRoleModuleMapper;
     @Resource
     @Resource
     private SysRoleService sysRoleService;
     private SysRoleService sysRoleService;
@@ -998,7 +1000,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
 
     //新增公司和负责人
     //新增公司和负责人
     @Override
     @Override
-    public HttpRespMsg insertCompany(String companyName, String name, String phone, String vcode, String password, Integer type) {
+    public HttpRespMsg insertCompany(String companyName, String name, String phone, String vcode, String password, Integer type, String from) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         //检查验证码是否正确
         //检查验证码是否正确
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime now = LocalDateTime.now();
@@ -1046,6 +1048,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 company.setPackageCustomer(1);
                 company.setPackageCustomer(1);
                 company.setPackageEngineering(1);
                 company.setPackageEngineering(1);
             }
             }
+            //设置来源
+            if (from == null) {
+                from = "官网";
+            }
+            company.setRegFrom(from);
             companyMapper.insert(company);
             companyMapper.insert(company);
 
 
             //生成工作时长
             //生成工作时长
@@ -1127,18 +1134,32 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             outsource.add(MessageUtils.message("entry.labourCost"));
             outsource.add(MessageUtils.message("entry.labourCost"));
             outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
             outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
             List<ExpenseType> expenseTypeList=new ArrayList<>();
             List<ExpenseType> expenseTypeList=new ArrayList<>();
+            List<ExpenseMainType> expenseMainTypes=new ArrayList<>();
+            ExpenseMainType expenseMainType=new ExpenseMainType();
+            expenseMainType.setName("一般费用");
+            expenseMainType.setCompanyId(user.getCompanyId());
+            ExpenseMainType expenseMainType1=new ExpenseMainType();
+            expenseMainType1.setName("差旅费用");
+            expenseMainType1.setCompanyId(user.getCompanyId());
+            ExpenseMainType expenseMainType2=new ExpenseMainType();
+            expenseMainType2.setName("外包费用");
+            expenseMainType2.setCompanyId(user.getCompanyId());
+            expenseMainTypes.add(expenseMainType);
+            expenseMainTypes.add(expenseMainType1);
+            expenseMainTypes.add(expenseMainType2);
+            expenseMainTypeService.saveBatch(expenseMainTypes);
             for (String expenseType : expenseTypes) {
             for (String expenseType : expenseTypes) {
                 ExpenseType item=new ExpenseType();
                 ExpenseType item=new ExpenseType();
                 item.setCompanyId(company.getId());
                 item.setCompanyId(company.getId());
                 item.setTypeName(expenseType);
                 item.setTypeName(expenseType);
                 if(commonly.contains(expenseType)){
                 if(commonly.contains(expenseType)){
-                    item.setMainType(0);
+                    item.setMainType(expenseMainType.getId());
                 }
                 }
                 if(travel.contains(expenseType)){
                 if(travel.contains(expenseType)){
-                    item.setMainType(1);
+                    item.setMainType(expenseMainType1.getId());
                 }
                 }
                 if(outsource.contains(expenseType)){
                 if(outsource.contains(expenseType)){
-                    item.setMainType(2);
+                    item.setMainType(expenseMainType2.getId());
                 }
                 }
                 expenseTypeList.add(item);
                 expenseTypeList.add(item);
             }
             }
@@ -2732,15 +2753,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         String requestUrl = GET_TOKEN_URL.replace("APPID", appId).replace("SECRET", appSecret)
         String requestUrl = GET_TOKEN_URL.replace("APPID", appId).replace("SECRET", appSecret)
                 .replace("CODE", code);
                 .replace("CODE", code);
         // 存储获取到的授权字段信息
         // 存储获取到的授权字段信息
-        JSONObject result = new JSONObject();
         Map<String, String> dataMap = new HashMap<>();
         Map<String, String> dataMap = new HashMap<>();
         ResponseEntity<String> responseEntity = this.restTemplate.exchange(requestUrl,
         ResponseEntity<String> responseEntity = this.restTemplate.exchange(requestUrl,
                 HttpMethod.GET, null, String.class);
                 HttpMethod.GET, null, String.class);
         List<User> userList = new ArrayList<>();
         List<User> userList = new ArrayList<>();
         if (responseEntity.getStatusCode() == HttpStatus.OK) {
         if (responseEntity.getStatusCode() == HttpStatus.OK) {
             String resp = responseEntity.getBody();
             String resp = responseEntity.getBody();
-            log.debug("返回信息==" + resp);
-            System.out.println("返回信息==" + resp);
             dataMap.put("resp", resp);
             dataMap.put("resp", resp);
             JSONObject OpenidJSONO = JSONObject.parseObject(resp);
             JSONObject OpenidJSONO = JSONObject.parseObject(resp);
             if (OpenidJSONO.containsKey("access_token")) {
             if (OpenidJSONO.containsKey("access_token")) {
@@ -2749,7 +2767,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 userList = userMapper.selectList(new QueryWrapper<User>().eq("wx_openid", openid));
                 userList = userMapper.selectList(new QueryWrapper<User>().eq("wx_openid", openid));
             }
             }
         }
         }
-        Integer companyId = null;
+        Integer companyId = 0;
         if (userList.size() > 0) {
         if (userList.size() > 0) {
             //该用户已存在
             //该用户已存在
             User curUser = userList.get(0);
             User curUser = userList.get(0);

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

@@ -21,11 +21,13 @@
         <result column="package_finance" property="packageFinance" />
         <result column="package_finance" property="packageFinance" />
         <result column="package_provider" property="packageProvider" />
         <result column="package_provider" property="packageProvider" />
         <result column="is_international" property="isInternational" />
         <result column="is_international" property="isInternational" />
+        <result column="create_date" property="createDate" />
+        <result column="reg_from" property="regFrom" />
     </resultMap>
     </resultMap>
 
 
     <!-- 通用查询结果列 -->
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, is_international
+        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, is_international, create_date, reg_from
     </sql>
     </sql>
 
 
 </mapper>
 </mapper>

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseMainTypeMapper.xml

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

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

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

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

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

File diff suppressed because it is too large
+ 602 - 1799
fhKeeper/formulahousekeeper/ops-platform/octopus.log


+ 1 - 0
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -642,6 +642,7 @@
   "expensereimbursementmodule": "费用报销模块",
   "expensereimbursementmodule": "费用报销模块",
   "fillinthestaffexpenses": "员工费用填报",
   "fillinthestaffexpenses": "员工费用填报",
   "generalexpenses": "一般费用填报",
   "generalexpenses": "一般费用填报",
+  "expenses": "费用填报",
   "travelexpensess": "差旅费用填报",
   "travelexpensess": "差旅费用填报",
   "outsourcingcostshouldbereported": "外包费用填报",
   "outsourcingcostshouldbereported": "外包费用填报",
   "listofreimbursementvouchers": "报销凭证列表",
   "listofreimbursementvouchers": "报销凭证列表",

+ 66 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -12,11 +12,12 @@
                 </div>
                 </div>
             </el-col>
             </el-col>
             <el-col :span="6">
             <el-col :span="6">
-                <div class="tools" @click.prevent="collapse" style="position: relative;">
-                    <i class="fa fa-align-justify"></i>
+                <div class="tools"  style="position: relative;">
+                    <i class="fa fa-align-justify" @click.prevent="collapse" style="position: relative;z-index: 10;"></i>
                     <div class="gongshimingz">
                     <div class="gongshimingz">
                         {{user.companyName}}
                         {{user.companyName}}
-                    </div>
+                        <i v-if="user.roleName == '超级管理员'" class="el-icon-edit" @click="editCompanyNamedialog=true,companyForm.name = user.companyName"  style="position: relative;z-index: 15; margin-left: 5px;"></i>
+                    </div>                    
                 </div>
                 </div>
             </el-col>
             </el-col>
 
 
@@ -230,6 +231,21 @@
                         <el-button type="primary" @click.native="editInfo" :loading="editLoading2">{{$t('btn.submit')}}</el-button>
                         <el-button type="primary" @click.native="editInfo" :loading="editLoading2">{{$t('btn.submit')}}</el-button>
                     </div>
                     </div>
                 </el-dialog>
                 </el-dialog>
+
+                <el-dialog
+                    title="修改公司名称"
+                    :visible.sync="editCompanyNamedialog"
+                    width="30%">
+                    <el-form :model="companyForm" :rules="rules" ref="companyForm" label-width="100px" class="demo-ruleForm">
+                        <el-form-item label="公司名称" prop="name">
+                            <el-input v-model.trim="companyForm.name"></el-input>
+                        </el-form-item>
+                    </el-form>
+                    <span slot="footer" class="dialog-footer">
+                        <el-button @click="editCompanyNamedialog = false">取 消</el-button>
+                        <el-button type="primary" @click="editCompanyName('companyForm')">确 定</el-button>
+                    </span>
+                </el-dialog>
             </section>
             </section>
         </el-col>
         </el-col>
     </el-row>
     </el-row>
@@ -242,7 +258,17 @@
         inject:['reloads'],
         inject:['reloads'],
         data() {
         data() {
             return {
             return {
+                companyForm:{
+                    name: '',
+                },
+                rules: {
+                    name: [
+                        { required: true, message: '请输入公司名称', trigger: 'blur' },
+                        { min: 1, max: 20, message: '长度为1-20个字符', trigger: 'blur' }
+                    ]
+                },
                 tourFlg: false,
                 tourFlg: false,
+                editCompanyNamedialog:false,
                 firstTourFalse: localStorage.getItem('firstTourFalse') | true, // 是否需要新手指导
                 firstTourFalse: localStorage.getItem('firstTourFalse') | true, // 是否需要新手指导
                 steps: [
                 steps: [
                     {
                     {
@@ -490,6 +516,43 @@
                 });
                 });
             },
             },
 
 
+            
+            //编辑公司名称
+            editCompanyName(companyForm){
+                this.$refs[companyForm].validate((valid) => {
+                    if (valid) {
+                        this.http.post("/company/editCompanyName", {name:this.companyForm.name},
+                            res => {
+                            if (res.code == "ok") {
+                                this.editCompanyNamedialog = false;
+                                let list = JSON.parse(sessionStorage.getItem("user") || '[]')
+                                sessionStorage.removeItem('user')
+                                this.user.companyName = this.companyForm.name
+                                list.companyName = this.companyForm.name
+                                sessionStorage.setItem("user",JSON.stringify(list))
+                                this.$message({
+                                message: res.msg,
+                                type: "success"
+                                });
+                            } else {
+                                this.$message({
+                                message: res.msg,
+                                type: "error"
+                                });
+                            }
+                            },
+                            error => {
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
+                        });
+                    } else {
+                        return false;
+                    }
+                });
+            },
+
             reset() {
             reset() {
                 this.editPassWord = true;
                 this.editPassWord = true;
                 this.addForm.id = JSON.parse(sessionStorage.getItem("user")).id;
                 this.addForm.id = JSON.parse(sessionStorage.getItem("user")).id;

+ 203 - 29
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -18,9 +18,9 @@
                   <i class="iconfont firerock-icontianbao"></i>
                   <i class="iconfont firerock-icontianbao"></i>
                   <span>{{ $t('fillinthestaffexpenses') }}</span>
                   <span>{{ $t('fillinthestaffexpenses') }}</span>
                 </template>
                 </template>
-                  <el-menu-item index="1-1"><p @click="ssl(0)"> {{ $t('generalexpenses') }}</p></el-menu-item>
-                  <el-menu-item index="1-2"><p @click="ssl(1)">{{ $t('travelexpensess') }}</p></el-menu-item>
-                  <el-menu-item index="1-3"><p @click="ssl(2)">{{ $t('outsourcingcostshouldbereported') }}</p></el-menu-item>
+                  <el-menu-item index="1-1"><p> {{ $t('expenses') }}</p></el-menu-item>
+                  <!-- <el-menu-item index="1-2"><p @click="ssl(1)">{{ $t('travelexpensess') }}</p></el-menu-item>
+                  <el-menu-item index="1-3"><p @click="ssl(2)">{{ $t('outsourcingcostshouldbereported') }}</p></el-menu-item> -->
               </el-submenu>
               </el-submenu>
               <el-submenu index="2">
               <el-submenu index="2">
                 <template slot="title">
                 <template slot="title">
@@ -48,17 +48,19 @@
     <!-- 内容主体区域 -->
     <!-- 内容主体区域 -->
   <div class="contents">
   <div class="contents">
     <div v-if="!displayTable" class="headine" ref="headine">
     <div v-if="!displayTable" class="headine" ref="headine">
-      <h3 ref="headHe" style="padding-left: 220px">{{shuz[ins]}}</h3>
+      <!-- <h3 ref="headHe" style="padding-left: 220px">{{shuz[ins]}}</h3> -->
+      <h3 ref="headHe" style="padding-left: 220px">费用填报</h3>
       <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submits" size="mini">{{ $t('btn.submit') }}</el-button></p>
       <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submits" size="mini">{{ $t('btn.submit') }}</el-button></p>
       <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submitUpload" size="mini">{{ $t('batchupload') }}</el-button></p>
       <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="submitUpload" size="mini">{{ $t('batchupload') }}</el-button></p>
       <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="customTypeOp" size="mini" v-if="permissions.costAll">{{ $t('expensetypemanagement') }}</el-button></p>
       <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="customTypeOp" size="mini" v-if="permissions.costAll">{{ $t('expensetypemanagement') }}</el-button></p>
+      <p style="float: right;margin-right: 25px;"><el-button type="primary" @click="expenseTypeOp" size="mini" v-if="permissions.costAll">费用主类型管理</el-button></p>
     </div>
     </div>
     <!-- 上面部分 -->
     <!-- 上面部分 -->
     <div ref="staff" style="margin: 20px 20px 0 220px; width: 81.5%" >
     <div ref="staff" style="margin: 20px 20px 0 220px; width: 81.5%" >
       <div class="staff" v-if="!displayTable">
       <div class="staff" v-if="!displayTable">
         <!-- 公共 -->
         <!-- 公共 -->
         <div class="public">
         <div class="public">
-          <el-form :model="addForm" ref="mainAddForm" label-width="80px" :rules="addFormRules">
+          <el-form :model="addForm" ref="mainAddForm" label-width="100px" :rules="addFormRules">
             <!-- <el-form :model="form" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> -->
             <!-- <el-form :model="form" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> -->
             <!-- 报销人 -->
             <!-- 报销人 -->
             <el-form-item :label="$t('peopleconcerned')" prop="ownerId">
             <el-form-item :label="$t('peopleconcerned')" prop="ownerId">
@@ -83,11 +85,17 @@
               <el-input v-model="addForm.ticketNum" style="width: 150px"></el-input>
               <el-input v-model="addForm.ticketNum" style="width: 150px"></el-input>
             </el-form-item>
             </el-form-item>
             <!-- 费用类型 -->
             <!-- 费用类型 -->
-            <el-form-item :label="$t('costtype')">
-              <el-select v-model="addForm.type" disabled style="width: 150px" >
-                <el-option :label="$t('yi-ban')" :value="0"></el-option>
+            <el-form-item :label="'费用主类型'">
+              <el-select v-model="expenseMainTypeValue"  style="width: 150px" @change="this.getExpList">
+                <el-option
+                v-for="item in expenseMainTypes"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+                ></el-option>
+                <!-- <el-option :label="$t('yi-ban')" :value="0"></el-option>
                 <el-option :label="$t('cha-lv')" :value="1"></el-option>
                 <el-option :label="$t('cha-lv')" :value="1"></el-option>
-                <el-option :label="$t('wai-bao')" :value="2"></el-option>
+                <el-option :label="$t('wai-bao')" :value="2"></el-option> -->
               </el-select>
               </el-select>
             </el-form-item>
             </el-form-item>
             
             
@@ -214,11 +222,17 @@
               <el-input v-model="code" size="small" :placeholder="$t('receiptnumber')" clearable="true" style="width: 120px"></el-input>
               <el-input v-model="code" size="small" :placeholder="$t('receiptnumber')" clearable="true" style="width: 120px"></el-input>
             </el-form-item>
             </el-form-item>
             <!-- 费用类型 -->
             <!-- 费用类型 -->
-            <el-form-item :label="$t('costtype')">
-              <el-select v-model="type" size="small" :placeholder="$t('pleaseselectthetypeoffee')" clearable="true" style="width: 150px">
-                <el-option :label="$t('generalcost')" value="0"></el-option>
-                <el-option :label="$t('travelexpenses')" value="1"></el-option>
-                <el-option :label="$t('outsourcingcost')" value="2"></el-option>
+            <el-form-item :label="'费用主类型'">
+              <el-select size="small" v-model="expenseMainTypeValue"  style="width: 150px">
+                <el-option
+                v-for="item in expenseMainTypes"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+                ></el-option>
+                <!-- <el-option :label="$t('yi-ban')" :value="0"></el-option>
+                <el-option :label="$t('cha-lv')" :value="1"></el-option>
+                <el-option :label="$t('wai-bao')" :value="2"></el-option> -->
               </el-select>
               </el-select>
             </el-form-item>
             </el-form-item>
             <!-- 填报日期 -->
             <!-- 填报日期 -->
@@ -269,7 +283,7 @@
               <el-table-column prop="ticketNum" :label="$t('invoicenumber')" ></el-table-column>
               <el-table-column prop="ticketNum" :label="$t('invoicenumber')" ></el-table-column>
               <el-table-column prop="type" :label="$t('ppertype')" >
               <el-table-column prop="type" :label="$t('ppertype')" >
                 <template slot-scope="scope">
                 <template slot-scope="scope">
-                  {{feeType[scope.row.type]}}
+                  {{scope.row.expenseMainTypeName}}
                 </template>
                 </template>
               </el-table-column>
               </el-table-column>
               <el-table-column prop="remark" :label="$t('bei-zhu')" width="180">
               <el-table-column prop="remark" :label="$t('bei-zhu')" width="180">
@@ -345,11 +359,17 @@
               <el-input v-enter-number v-model="ParticularsList.ticketNum" :disabled="flg"></el-input>
               <el-input v-enter-number v-model="ParticularsList.ticketNum" :disabled="flg"></el-input>
             </el-form-item>
             </el-form-item>
             <el-form-item :label="$t('costtype')" style="width: 270px"> 
             <el-form-item :label="$t('costtype')" style="width: 270px"> 
-                <el-select v-model="ParticularsList.type" :placeholder="$t('defaultText.pleaseChoose')" :disabled="flg">
-                  <el-option :label="$t('yi-ban')" :value="0"></el-option>
-                  <el-option :label="$t('cha-lv')" :value="1"></el-option>
-                  <el-option :label="$t('wai-bao')" :value="2"></el-option>
-                </el-select>
+                <el-select size="small" v-model="expenseMainTypeValue"  style="width: 150px">
+                <el-option
+                v-for="item in expenseMainTypes"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+                ></el-option>
+                <!-- <el-option :label="$t('yi-ban')" :value="0"></el-option>
+                <el-option :label="$t('cha-lv')" :value="1"></el-option>
+                <el-option :label="$t('wai-bao')" :value="2"></el-option> -->
+              </el-select>
             </el-form-item>
             </el-form-item>
             <el-form-item :label="$t('bei-zhu')" style="width: 280px">
             <el-form-item :label="$t('bei-zhu')" style="width: 280px">
               <el-input v-model="ParticularsList.remark" :disabled="flg"></el-input>
               <el-input v-model="ParticularsList.remark" :disabled="flg"></el-input>
@@ -496,13 +516,48 @@
             </div>
             </div>
         </el-dialog>
         </el-dialog>
 
 
+
+        <!-- 主费用类型自定义 -->
+        <el-dialog :title="费用类型大类管理" v-if="expenseTypeDialog" :visible.sync="expenseTypeDialog" customClass="customWidth" width="600px">
+          <el-table :data="expenseMainTypes" style="width:100%" height="400" :loading="expenseTypeListLoading">
+            <el-table-column :label="'类型名称'" min-width="150">
+              <template slot-scope="scope">
+                <span>{{scope.row.name}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('operation')" width="150">
+              <template slot-scope="scope">
+                <el-button @click="expenseTypeEditOp(scope.row)" size="small" type="primary">{{ $t('bian-ji') }}</el-button>
+                <el-button @click="expenseTypeEditDelete(scope.row)" size="small" type="danger">{{ $t('btn.delete') }}</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <span slot="footer" class="dialog-footer">
+            <el-button @click="expenseTypeDialog = false" size="medium">{{ $t('btn.cancel') }}</el-button>
+            <el-button type="primary" @click="expenseTypeEditOp()" size="medium">{{ $t('newtype') }}</el-button>
+          </span>
+
+          <!-- 新增/编辑费用类型 -->
+          <el-dialog :title="$t('addeditfeetypes')" v-if="expenseTypeEditDialog" :visible.sync="expenseTypeEditDialog" customClass="customWidth" width="400px" append-to-body>
+            <el-form label-width="80px" :rules="editExpenseTypeDataRules" ref="editExpenseTypeDataForm" :model="editExpenseTypeData">
+              <el-form-item :label="$t('typename ')" style="margin:30px 0" prop="typeName">
+                <el-input id="editExpenseTypeDataInput" size="medium" v-model="editExpenseTypeData.name" :placeholder="$t('customizethfeetypename')" style="width:90%" @keyup.native="editExpenseTypeDataInput('editExpenseTypeDataInput')"></el-input>
+              </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+              <el-button @click="expenseTypeEditDialog = false" size="medium">{{ $t('btn.cancel') }}</el-button>
+              <el-button type="primary" @click="expenseTypeEditSure" size="medium">{{ $t('btn.determine') }}</el-button>
+            </span>
+          </el-dialog>
+        </el-dialog>
+
         <!-- 费用类型自定义 -->
         <!-- 费用类型自定义 -->
         <el-dialog :title="$t('expensetypemanagement')" v-if="customTypeDialog" :visible.sync="customTypeDialog" customClass="customWidth" width="600px">
         <el-dialog :title="$t('expensetypemanagement')" v-if="customTypeDialog" :visible.sync="customTypeDialog" customClass="customWidth" width="600px">
           <el-table :data="customTypeList" style="width:100%" height="400" :loading="customTypeListLoading">
           <el-table :data="customTypeList" style="width:100%" height="400" :loading="customTypeListLoading">
             <el-table-column prop="typeName" :label="$t('costofname')" min-width="150"></el-table-column>
             <el-table-column prop="typeName" :label="$t('costofname')" min-width="150"></el-table-column>
             <el-table-column :label="$t('costtype')" min-width="150">
             <el-table-column :label="$t('costtype')" min-width="150">
               <template slot-scope="scope">
               <template slot-scope="scope">
-                <span>{{scope.row.mainType == 0 ? $t('generalcost') : (scope.row.mainType == 1 ? $t('travelexpenses') : $t('outsourcingcost'))}}</span>
+                <span>{{scope.row.expenseMainTypeName}}</span>
               </template>
               </template>
             </el-table-column>
             </el-table-column>
             <el-table-column :label="$t('operation')" width="150">
             <el-table-column :label="$t('operation')" width="150">
@@ -522,9 +577,12 @@
             <el-form label-width="80px" :rules="editTypeDataRules" ref="editTypeDataForm" :model="editTypeData">
             <el-form label-width="80px" :rules="editTypeDataRules" ref="editTypeDataForm" :model="editTypeData">
               <el-form-item :label="$t('belongstype')" style="margin:30px 0">
               <el-form-item :label="$t('belongstype')" style="margin:30px 0">
                 <el-select v-model="editTypeData.mainType" size="medium" style="width:90%">
                 <el-select v-model="editTypeData.mainType" size="medium" style="width:90%">
-                  <el-option :label="$t('generalcost')" :value="0"></el-option>
-                  <el-option :label="$t('travelexpenses')" :value="1"></el-option>
-                  <el-option :label="$t('outsourcingcost')" :value="2"></el-option>
+                  <el-option
+                  v-for="item in expenseMainTypes"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                  ></el-option>
                 </el-select>
                 </el-select>
               </el-form-item>
               </el-form-item>
               <el-form-item :label="$t('typename ')" style="margin:30px 0" prop="typeName">
               <el-form-item :label="$t('typename ')" style="margin:30px 0" prop="typeName">
@@ -589,7 +647,6 @@ export default {
       allExpList:[],
       allExpList:[],
       expenseTypeList:[],
       expenseTypeList:[],
       tian:{a: null,b: null,c: null,d: null,e: null,f: null,g: null,h: null,},
       tian:{a: null,b: null,c: null,d: null,e: null,f: null,g: null,h: null,},
-      feeType:[this.$t('generalcost'),this.$t('travelexpenses'),this.$t('outsourcingcost')],
       typeInvoic: [this.$t('vATspecialinvoice'), this.$t('vATgeneralinvoice')],
       typeInvoic: [this.$t('vATspecialinvoice'), this.$t('vATgeneralinvoice')],
       listLoading:false,
       listLoading:false,
       tableHeight:0,
       tableHeight:0,
@@ -639,6 +696,15 @@ export default {
       editTypeDataRules:{
       editTypeDataRules:{
         typeName: [{ required: true, message: this.$t('pleaseentercustomfeetypename'), trigger: "blur" }],
         typeName: [{ required: true, message: this.$t('pleaseentercustomfeetypename'), trigger: "blur" }],
       },
       },
+      expenseMainTypes:[],
+      expenseMainTypeValue:'',
+      expenseTypeDialog:false,
+      expenseTypeListLoading:false,
+      expenseTypeEditDialog:false,
+      editExpenseTypeData: {},
+      editExpenseTypeDataRules:{
+        name: [{ required: true, message: this.$t('pleaseentercustomfeetypename'), trigger: "blur" }],
+      },
     };
     };
   },
   },
   computed: {
   computed: {
@@ -668,6 +734,7 @@ export default {
     this.getList() // 获取单据列表
     this.getList() // 获取单据列表
     this.getProjectList();
     this.getProjectList();
     this.getExpList();
     this.getExpList();
+    this.getExpensMainTypes();
   },
   },
   filters: {
   filters: {
       numberToCurrency(value) {
       numberToCurrency(value) {
@@ -690,7 +757,6 @@ export default {
     customTypeOp(){
     customTypeOp(){
       this.customTypeDialog = true
       this.customTypeDialog = true
       this.customTypeListLoading = true
       this.customTypeListLoading = true
-      this.getExpList()
     },
     },
     customTypeEditOp(row){
     customTypeEditOp(row){
       this.customTypeEditDialog = true
       this.customTypeEditDialog = true
@@ -712,6 +778,7 @@ export default {
             if(res.code == 'ok'){
             if(res.code == 'ok'){
               this.customTypeEditDialog = false
               this.customTypeEditDialog = false
               this.customTypeOp()
               this.customTypeOp()
+              this.getExpList()
             }else{
             }else{
               this.$message({
               this.$message({
                 message: res.msg,
                 message: res.msg,
@@ -739,6 +806,7 @@ export default {
           if(res.code == 'ok'){
           if(res.code == 'ok'){
             this.customTypeEditDialog = false
             this.customTypeEditDialog = false
             this.customTypeOp()
             this.customTypeOp()
+            this.getExpList()
           }else{
           }else{
             this.$message({
             this.$message({
               message: res.msg,
               message: res.msg,
@@ -762,6 +830,88 @@ export default {
       let inpu = document.getElementById(typeName);
       let inpu = document.getElementById(typeName);
       inpu.value = inpu.value.replace(/^\s*|\s*$/g, '')
       inpu.value = inpu.value.replace(/^\s*|\s*$/g, '')
     },
     },
+    // 费用主类型自定义
+    expenseTypeOp(){
+      this.expenseTypeDialog = true
+      this.customTypeListLoading = true
+    },
+    expenseTypeEditOp(row){
+      this.expenseTypeEditDialog = true
+      if(row){
+        this.editExpenseTypeData = row
+      }else{
+        this.editExpenseTypeData = {
+          isSystem: 0,
+          name: '',
+          companyId: this.user.companyId
+        }
+      }
+    },
+    expenseTypeEditSure(){
+      this.$refs.editExpenseTypeDataForm.validate(valid => {
+        if (valid) {
+          this.http.post('/expense-main-type/addOrMod',this.editExpenseTypeData,
+          res => {
+            if(res.code == 'ok'){
+              this.expenseTypeEditDialog = false
+              this.expenseTypeOp()
+              this.getExpensMainTypes()
+              this.getExpList()
+            }else{
+              this.$message({
+                message: res.msg,
+                type: 'error'
+              })
+            }
+          },err => {
+            this.$message({
+              message: err,
+              type: 'error'
+            })
+          })
+        }})
+    },
+    expenseTypeEditDelete(row){
+      this.$confirm(this.$t('operationmaycausedatalossAreyousuredeletethedata'),this.$t('other.prompts'),{
+        confirmButtonText: this.$t('btn.determine'),
+        cancelButtonText: this.$t('btn.cancel'),
+        type: 'warning'
+      }).then(()=>{
+        this.http.post('/expense-main-type/delete',{
+          id: row.id
+        },
+        res => {
+          if(res.code == 'ok'){
+            this.expenseTypeEditDialog = false
+            this.expenseTypeOp()
+            this.getExpensMainTypes()
+          }else{
+            this.$message({
+              message: res.msg,
+              type: 'error'
+            })
+          }
+        },err => {
+          this.$message({
+            message: err,
+            type: 'error'
+          })
+        })
+      }).catch(()=>{
+        this.$message({
+          type: 'info',
+          message: this.$t('thedeletionhasbeencancelled')
+        })
+      })
+    },
+    expenseTypeDataInput(typeName){
+      let inpu = document.getElementById(typeName);
+      inpu.value = inpu.value.replace(/^\s*|\s*$/g, '')
+    },
+    editExpenseTypeDataInput(name){
+      let inpu = document.getElementById(name);
+      inpu.value = inpu.value.replace(/^\s*|\s*$/g, '')
+    },
 
 
 
 
 
 
@@ -898,12 +1048,16 @@ export default {
             if (res.code == "ok") {
             if (res.code == "ok") {
                 this.allExpList = res.data;
                 this.allExpList = res.data;
                 this.customTypeList = res.data
                 this.customTypeList = res.data
-                this.expenseTypeList = this.allExpList.filter(a=>a.mainType == 0);
+                this.addForm.type=this.expenseMainTypeValue
+                this.expenseTypeList = this.allExpList.filter(a=>a.mainType == this.expenseMainTypeValue);
                 if(!res.data != res.data.length == 0){
                 if(!res.data != res.data.length == 0){
                   this.http.post('/company/settingExpenseType',{},res => {
                   this.http.post('/company/settingExpenseType',{},res => {
                     if(res.code == 'ok'){}else{this.$message({message: res.msg,type: 'error'})}
                     if(res.code == 'ok'){}else{this.$message({message: res.msg,type: 'error'})}
                   },err => {this.$message({message: err,type: 'error'})})
                   },err => {this.$message({message: err,type: 'error'})})
                 }
                 }
+                for(let i in this.invoiceList){
+                    this.invoiceList[i].expenseType=''
+                }
             } else {
             } else {
                 this.$message({
                 this.$message({
                 message: res.msg,
                 message: res.msg,
@@ -919,6 +1073,26 @@ export default {
             });
             });
         });
         });
     },
     },
+    getExpensMainTypes(){
+        this.http.post('/expense-main-type/list', {
+        },
+        res => {
+            if (res.code == "ok") {
+                this.expenseMainTypes=res.data
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
     // 单据查看
     // 单据查看
     downloadByA(val) {
     downloadByA(val) {
       this.dialog = true
       this.dialog = true
@@ -1087,7 +1261,7 @@ export default {
                 code:null,
                 code:null,
                 ownerId:this.user.id,
                 ownerId:this.user.id,
                 createDate: null,
                 createDate: null,
-                type:this.z, 
+                type:this.expenseMainTypeValue, 
                 ticketNum:1,remark:null,totalAmount:0,}
                 ticketNum:1,remark:null,totalAmount:0,}
               this.invoiceList = []
               this.invoiceList = []
                   
                   
@@ -1142,7 +1316,7 @@ export default {
                     startDate: stat,
                     startDate: stat,
                     endDate: end,
                     endDate: end,
                     ownerId:this.ownerId,
                     ownerId:this.ownerId,
-                    type:this.type,
+                    type:this.expenseMainTypeValue,
                     };
                     };
       if (this.isAuditList) {
       if (this.isAuditList) {
         param.status = 1;
         param.status = 1;

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

@@ -395,10 +395,9 @@
             </template>
             </template>
             <template v-if="(showColumnWidth != '0' || permissions.projectManagement)">
             <template v-if="(showColumnWidth != '0' || permissions.projectManagement)">
                 <el-button size="small" type="primary" @click="addProPreson()">{{ $t('projectparticipantsinbatches') }}</el-button>
                 <el-button size="small" type="primary" @click="addProPreson()">{{ $t('projectparticipantsinbatches') }}</el-button>
-                <el-button size="small" type="primary" @click="batchIncharger()">{{ $t('projectmanagersinbatches') }}</el-button>
+                <el-button size="small" type="primary" v-if="permissions.projectManagement" @click="batchIncharger()">{{ $t('projectmanagersinbatches') }}</el-button>
                 <!-- <el-button size="small" type="primary" @click="batchDelete()">批量删除</el-button> -->
                 <!-- <el-button size="small" type="primary" @click="batchDelete()">批量删除</el-button> -->
             </template>
             </template>
-                
             
             
             <el-pagination
             <el-pagination
                 @size-change="handleSizeChange"
                 @size-change="handleSizeChange"

+ 3 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -8,7 +8,6 @@
                             <el-date-picker size="small" v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM"
                             <el-date-picker size="small" v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM"
                             style="width:190px;"
                             style="width:190px;"
                             @change="changeMonthOut" :clearable="false" type="month" :placeholder="$t('Selectmonth')" :picker-options="getPickerOptions"></el-date-picker>
                             @change="changeMonthOut" :clearable="false" type="month" :placeholder="$t('Selectmonth')" :picker-options="getPickerOptions"></el-date-picker>
-                            <el-button v-if="user.timeType.pushReportData == 1 && permissions.reportPush" style="margin-left:10px;" icon="iconfont firerock-icontuisong" size="mini" @click="pushWorkTime"></el-button>
                             <el-button style="margin-left:10px;" icon="iconfont firerock-icongongshitongji" size="mini"  @click="showWorkTime"></el-button>
                             <el-button style="margin-left:10px;" icon="iconfont firerock-icongongshitongji" size="mini"  @click="showWorkTime"></el-button>
                         </div>
                         </div>
                     <div slot="header" class="clearfix" id="clearfix" style="padding-left: 255px;">
                     <div slot="header" class="clearfix" id="clearfix" style="padding-left: 255px;">
@@ -141,6 +140,9 @@
                                     <el-link type="primary" style="margin-right:10px;" :underline="false" @click="showExportDialog" v-if="permissions.reportExport">{{$t('textLink.exportWork')}}</el-link>
                                     <el-link type="primary" style="margin-right:10px;" :underline="false" @click="showExportDialog" v-if="permissions.reportExport">{{$t('textLink.exportWork')}}</el-link>
                                     <!--部门负责人给个导出工时的功能 -->
                                     <!--部门负责人给个导出工时的功能 -->
                                     <el-link type="primary" v-if="user.manageDeptId != 0" style="margin-right:10px;" :underline="false" @click="showExportTimeDialog">{{$t('textLink.exportingTimeStatistics')}}</el-link>
                                     <el-link type="primary" v-if="user.manageDeptId != 0" style="margin-right:10px;" :underline="false" @click="showExportTimeDialog">{{$t('textLink.exportingTimeStatistics')}}</el-link>
+                                    <el-link type="primary" v-if="user.timeType.pushReportData == 1 && permissions.reportPush" :underline="false" @click="pushWorkTime">推送工时</el-link>
+                                    <!-- <el-button v-if="user.timeType.pushReportData == 1 && permissions.reportPush" style="margin-left:10px;" icon="iconfont firerock-icontuisong" size="mini" @click="pushWorkTime"></el-button> -->
+
                                 </span>
                                 </span>
                             </div>
                             </div>
                             <div :style="'height:'+(tableHeight-50)+'px;overflow:scroll;padding-top:10px;'">
                             <div :style="'height:'+(tableHeight-50)+'px;overflow:scroll;padding-top:10px;'">

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

@@ -128,7 +128,8 @@ export default {
             this.listLoading = true
             this.listLoading = true
             this.$axios.post(url, {
             this.$axios.post(url, {
                 startDate: this.costDate[0],
                 startDate: this.costDate[0],
-                endDate: this.costDate[1]
+                endDate: this.costDate[1],
+                type: 0
             }).then(res => {
             }).then(res => {
                 if(res.code == "ok") {
                 if(res.code == "ok") {
                     this.listLoading = false
                     this.listLoading = false

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

@@ -352,6 +352,9 @@
             <van-tag size="large" style="text-align:center;margin:10px;padding:12px;margin-bottom:120px;border: 1px solid #20a0ff;"
             <van-tag size="large" style="text-align:center;margin:10px;padding:12px;margin-bottom:120px;border: 1px solid #20a0ff;"
                  @click="addNewPro" 
                  @click="addNewPro" 
                 icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 50px;"> + 新增{{user.companyId==781?'任务':'项目'}}  </span></van-tag>
                 icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 50px;"> + 新增{{user.companyId==781?'任务':'项目'}}  </span></van-tag>
+                <!-- <van-button id="btn-start-recording" @click="startRecording">录音</van-button>
+                <van-button id="btn-stop-recording" @click="stopRecording">停止</van-button>
+                <van-button id="btn-play-recording" @click="getRecording">获取文件</van-button> -->
             </div>  
             </div>  
             <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
             <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
                 <div style="padding-bottom:10px;">
                 <div style="padding-bottom:10px;">
@@ -402,6 +405,8 @@
 <script>
 <script>
 import timetoolVue from '../timetool/timetool.vue';
 import timetoolVue from '../timetool/timetool.vue';
     // Vue.prototype.$wx = wx
     // Vue.prototype.$wx = wx
+// import { Recorder } from '../../assets/record/recorder'
+// var recorder = null
     export default {
     export default {
         data() {
         data() {
             return {
             return {
@@ -495,8 +500,10 @@ import timetoolVue from '../timetool/timetool.vue';
                     list: [],
                     list: [],
                     searchList: []
                     searchList: []
                 },
                 },
-                vacationTime: {},
-                totalReportHours: 0
+                // vacationTime: {},
+                // totalReportHours: 0,
+                // leftDataList:[],
+                // rightDataList:[],
             };
             };
         },
         },
 
 
@@ -2127,7 +2134,24 @@ import timetoolVue from '../timetool/timetool.vue';
                         alert(JSON.stringify(res));
                         alert(JSON.stringify(res));
                     }
                     }
                 });
                 });
-            }
+            },
+            // startRecording: function () {
+            //     Recorder.get(function (rec) {
+            //     recorder = rec
+            //     recorder.start()
+            // })
+            // },
+            // stopRecording: function () {
+            //     recorder.stop()
+            // },
+            // getRecording: function () {
+            //     var file =  new File([recorder.getBlob()], new Date().getTime() + '.pcm',{type:recorder.getBlob().type});  //得到需要的pcm文件
+            //     // var file =  recorder.getBlob();  //得到需要的pcm文件
+            //     let param = new FormData();
+            //     param.append("file", file);
+            //     this.$axios.post('/report/record', param).then(res => {})
+            //     console.log(file)
+            // },
         },
         },
         
         
         mounted() {
         mounted() {

+ 30 - 5
fhKeeper/formulahousekeeper/timesheet_h5/src/views/expense/index.vue

@@ -49,8 +49,8 @@
                     </template>
                     </template>
                 </van-field>
                 </van-field>
                 <!-- 费用类型 -->
                 <!-- 费用类型 -->
-                <van-field v-model="editForm.type" label="费用类型" @click="typeShow = true" readonly clickable>
-                    <template #input>{{typeList[editForm.type]}}</template>
+                <van-field v-model="editForm.type" label="费用类型" @click="typeShow = true" readonly clickable>
+                    <template #input>{{expenseMainType.text}}</template>
                 </van-field>
                 </van-field>
                 <van-popup v-model="typeShow" position="bottom">
                 <van-popup v-model="typeShow" position="bottom">
                     <van-picker
                     <van-picker
@@ -259,7 +259,7 @@ export default {
             ownerIdShow: false,
             ownerIdShow: false,
             createDateShow: false,
             createDateShow: false,
             typeShow: false,
             typeShow: false,
-            typeList: ['一般','差旅','外包'],
+            typeList: [],
 
 
             invoiceIndex: 0,
             invoiceIndex: 0,
             invoiceList: [
             invoiceList: [
@@ -303,6 +303,9 @@ export default {
             denyParm: {
             denyParm: {
                 id: '',
                 id: '',
                 denyReason: ''
                 denyReason: ''
+            },
+            expenseMainType:{
+                text:''
             }
             }
 
 
         }
         }
@@ -346,6 +349,7 @@ export default {
         }
         }
         this.getProjectList()
         this.getProjectList()
         this.getExTypeList()
         this.getExTypeList()
+        this.getExpensMainTypes()
     },
     },
     methods: {
     methods: {
         back(){
         back(){
@@ -383,8 +387,12 @@ export default {
             this.createDateShow = false
             this.createDateShow = false
         },
         },
         typeChange(value,key){
         typeChange(value,key){
-            this.editForm.type = key
+            this.editForm.type =value.id
+            this.expenseMainType.text=value.name
             this.typeShow = false
             this.typeShow = false
+            for(let i in this.invoiceList){
+                    this.invoiceList[i].expenseType=''
+                }
             this.inexTypeList = this.allexTypeList.filter(a=>a.mainType == this.editForm.type)
             this.inexTypeList = this.allexTypeList.filter(a=>a.mainType == this.editForm.type)
         },
         },
         ticNumChange(value){
         ticNumChange(value){
@@ -648,7 +656,24 @@ export default {
             .then(res => {
             .then(res => {
                 if(res.code == "ok") {
                 if(res.code == "ok") {
                     this.allexTypeList = res.data
                     this.allexTypeList = res.data
-                    this.inexTypeList = this.allexTypeList.filter(a=>a.mainType == 0)
+                    this.inexTypeList = this.allexTypeList.filter(a=>a.mainType == this.editForm.type)
+                } else {
+                    this.$toast.fail('获取失败');
+                }
+            }).catch(err=> {this.$toast.clear();console.log(err)});
+        },
+
+        getExpensMainTypes(){
+            this.$axios.post("/expense-main-type/list", {})
+            .then(res => {
+                if(res.code == "ok") {
+                    for(var i in res.data) {
+                        res.data[i].text = res.data[i].name
+                    }
+                    this.typeList=res.data
+                    this.expenseMainType.text=res.data[0].name
+                    this.editForm.type=res.data[0].id
+                    this.getExTypeList
                 } else {
                 } else {
                     this.$toast.fail('获取失败');
                     this.$toast.fail('获取失败');
                 }
                 }