Преглед изворни кода

费用类型增加大类
文件中心模板
费用类型 创建初始化

yurk пре 2 година
родитељ
комит
e34ddaf195
30 измењених фајлова са 1112 додато и 116 уклоњено
  1. 21 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. 19 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  8. 42 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseMainType.java
  9. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseSheet.java
  10. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseType.java
  11. 50 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProDocumentTemDetail.java
  12. 53 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectDocumentTemplate.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ExpenseMainTypeMapper.java
  14. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProDocumentTemDetailMapper.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectDocumentTemplateMapper.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExpenseMainTypeService.java
  17. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProDocumentTemDetailService.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectDocumentTemplateService.java
  19. 159 69
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  20. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseMainTypeServiceImpl.java
  21. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  22. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProDocumentTemDetailServiceImpl.java
  23. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectDocumentTemplateServiceImpl.java
  24. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  25. 19 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  26. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseMainTypeMapper.xml
  27. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProDocumentTemDetailMapper.xml
  28. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectDocumentTemplateMapper.xml
  29. 1 0
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  30. 203 29
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

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

@@ -4,12 +4,10 @@ package com.management.platform.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.constant.Constant;
 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.DingDingService;
+import com.management.platform.service.ExpenseMainTypeService;
 import com.management.platform.service.ExpenseTypeService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
@@ -51,6 +49,8 @@ public class CompanyController {
     private ContactSyncLogMapper contactSyncLogMapper;
     @Resource
     private CompanyMapper companyMapper;
+    @Resource
+    private ExpenseMainTypeService expenseMainTypeService;
 
     public static final HashMap<String, Long> syncLog = new HashMap();
 
@@ -190,18 +190,32 @@ public class CompanyController {
         //outsource.add("其他外包费");
         outsource.add(MessageUtils.message("entry.OtherOutsourceCost"));
         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) {
             ExpenseType item=new ExpenseType();
             item.setCompanyId(user.getCompanyId());
             item.setTypeName(expenseType);
             if(commonly.contains(expenseType)){
-                item.setMainType(0);
+                item.setMainType(expenseMainType.getId());
             }
             if(travel.contains(expenseType)){
-                item.setMainType(1);
+                item.setMainType(expenseMainType1.getId());
             }
             if(outsource.contains(expenseType)){
-                item.setMainType(2);
+                item.setMainType(expenseMainType2.getId());
             }
             expenseTypeList.add(item);
         }

+ 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.management.platform.entity.ExpenseItem;
+import com.management.platform.entity.ExpenseMainType;
 import com.management.platform.entity.ExpenseType;
 import com.management.platform.entity.User;
 import com.management.platform.mapper.ExpenseItemMapper;
 import com.management.platform.mapper.ExpenseTypeMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpenseMainTypeService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import org.springframework.util.StringUtils;
@@ -16,6 +18,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Optional;
 
 /**
  * <p>
@@ -36,12 +40,22 @@ public class ExpenseTypeController {
     private HttpServletRequest request;
     @Resource
     private ExpenseItemMapper expenseItemMapper;
+    @Resource
+    private ExpenseMainTypeService expenseMainTypeService;
 
     @RequestMapping("/getList")
     public HttpRespMsg getList() {
         User user = userMapper.selectById(request.getHeader("token"));
         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;
     }
 

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

+ 19 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -119,6 +119,8 @@ public class WeiXinCorpController {
     @Resource
     HttpServletRequest request;
     @Resource
+    ExpenseMainTypeService expenseMainTypeService;
+    @Resource
     private SysRoleMapper sysRoleMapper;
     @Resource
     private ParticipationMapper participationMapper;
@@ -1373,18 +1375,32 @@ public class WeiXinCorpController {
                         outsource.add("其他外包费");
                         //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(0);
+                                item.setMainType(expenseMainType.getId());
                             }
                             if(travel.contains(expenseType)){
-                                item.setMainType(1);
+                                item.setMainType(expenseMainType1.getId());
                             }
                             if(outsource.contains(expenseType)){
-                                item.setMainType(2);
+                                item.setMainType(expenseMainType2.getId());
                             }
                             expenseTypeList.add(item);
                         }

+ 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)
     private List<ExpenseItem> invoiceList;
 
+    @TableField(exist = false)
+    private String expenseMainTypeName;
+
     @Override
     protected Serializable pkVal() {
         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")
     private Integer companyId;
 
+    @TableField(exist = false)
+    private String expenseMainTypeName;
+
 
     @Override
     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> {
+
+}

+ 159 - 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;
     @Resource
     TempDuserService tempDuserService;
+    @Resource
+    ExpenseMainTypeService expenseMainTypeService;
 
     public static String PRE_AUTH_CODE = null;
     public static long expireTime = 0L;
@@ -240,18 +242,32 @@ public class DingDingServiceImpl implements DingDingService {
                 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(0);
+                        item.setMainType(expenseMainType.getId());
                     }
                     if(travel.contains(expenseType)){
-                        item.setMainType(1);
+                        item.setMainType(expenseMainType1.getId());
                     }
                     if(outsource.contains(expenseType)){
-                        item.setMainType(2);
+                        item.setMainType(expenseMainType2.getId());
                     }
                     expenseTypeList.add(item);
                 }
@@ -378,73 +394,80 @@ public class DingDingServiceImpl implements DingDingService {
                 setting.setCompanyId(company.getId());
                 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();
@@ -487,6 +510,73 @@ public class DingDingServiceImpl implements DingDingService {
 
                 //获取授权的部门
                 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 {
                 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;
     @Resource
     private ExcelExportService excelExportService;
+    @Resource
+    private ExpenseMainTypeService expenseMainTypeService;
     public static final String[] sheetTypes = {"一般费用","差旅费","外包费用"};
     @Override
     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),
                 queryWrapper);
         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();
         Map<String, Object> map = new HashMap<>();
         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 {
+
+}

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

@@ -1659,7 +1659,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (updateReportList.size() > 0) {
                     updateBatchById(updateReportList);
                 }
-                /*if(company.getId()==862){
+/*                if(company.getId()==862){
                     String url = "http://183.194.0.98:3202/api/web-server/controlCenter/billApproved";
                     HttpHeaders headers = new HttpHeaders();
                     headers.setContentType(MediaType.APPLICATION_JSON);
@@ -2170,7 +2170,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             updateBatchById(newList);
         }
-        /*if(company.getId()==862){
+/*        if(company.getId()==862){
             String url = "http://183.194.0.98:3202/api/web-server/controlCenter/billRejected";
             HttpHeaders headers = new HttpHeaders();
             headers.setContentType(MediaType.APPLICATION_JSON);

+ 19 - 3
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
     private RestTemplate restTemplate;
     @Resource
+    ExpenseMainTypeService expenseMainTypeService;
+    @Resource
     private SysRoleModuleMapper sysRoleModuleMapper;
     @Resource
     private SysRoleService sysRoleService;
@@ -1127,18 +1129,32 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             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(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) {
                 ExpenseType item=new ExpenseType();
                 item.setCompanyId(company.getId());
                 item.setTypeName(expenseType);
                 if(commonly.contains(expenseType)){
-                    item.setMainType(0);
+                    item.setMainType(expenseMainType.getId());
                 }
                 if(travel.contains(expenseType)){
-                    item.setMainType(1);
+                    item.setMainType(expenseMainType1.getId());
                 }
                 if(outsource.contains(expenseType)){
-                    item.setMainType(2);
+                    item.setMainType(expenseMainType2.getId());
                 }
                 expenseTypeList.add(item);
             }

+ 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>

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

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

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

@@ -18,9 +18,9 @@
                   <i class="iconfont firerock-icontianbao"></i>
                   <span>{{ $t('fillinthestaffexpenses') }}</span>
                 </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 index="2">
                 <template slot="title">
@@ -48,17 +48,19 @@
     <!-- 内容主体区域 -->
   <div class="contents">
     <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="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="expenseTypeOp" size="mini" v-if="permissions.costAll">费用主类型管理</el-button></p>
     </div>
     <!-- 上面部分 -->
     <div ref="staff" style="margin: 20px 20px 0 220px; width: 81.5%" >
       <div class="staff" v-if="!displayTable">
         <!-- 公共 -->
         <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-item :label="$t('peopleconcerned')" prop="ownerId">
@@ -83,11 +85,17 @@
               <el-input v-model="addForm.ticketNum" style="width: 150px"></el-input>
             </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('wai-bao')" :value="2"></el-option>
+                <el-option :label="$t('wai-bao')" :value="2"></el-option> -->
               </el-select>
             </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-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-form-item>
             <!-- 填报日期 -->
@@ -269,7 +283,7 @@
               <el-table-column prop="ticketNum" :label="$t('invoicenumber')" ></el-table-column>
               <el-table-column prop="type" :label="$t('ppertype')" >
                 <template slot-scope="scope">
-                  {{feeType[scope.row.type]}}
+                  {{scope.row.expenseMainTypeName}}
                 </template>
               </el-table-column>
               <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-form-item>
             <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 :label="$t('bei-zhu')" style="width: 280px">
               <el-input v-model="ParticularsList.remark" :disabled="flg"></el-input>
@@ -496,13 +516,48 @@
             </div>
         </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-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 :label="$t('costtype')" min-width="150">
               <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>
             </el-table-column>
             <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-item :label="$t('belongstype')" style="margin:30px 0">
                 <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-form-item>
               <el-form-item :label="$t('typename ')" style="margin:30px 0" prop="typeName">
@@ -589,7 +647,6 @@ export default {
       allExpList:[],
       expenseTypeList:[],
       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')],
       listLoading:false,
       tableHeight:0,
@@ -639,6 +696,15 @@ export default {
       editTypeDataRules:{
         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: {
@@ -668,6 +734,7 @@ export default {
     this.getList() // 获取单据列表
     this.getProjectList();
     this.getExpList();
+    this.getExpensMainTypes();
   },
   filters: {
       numberToCurrency(value) {
@@ -690,7 +757,6 @@ export default {
     customTypeOp(){
       this.customTypeDialog = true
       this.customTypeListLoading = true
-      this.getExpList()
     },
     customTypeEditOp(row){
       this.customTypeEditDialog = true
@@ -712,6 +778,7 @@ export default {
             if(res.code == 'ok'){
               this.customTypeEditDialog = false
               this.customTypeOp()
+              this.getExpList()
             }else{
               this.$message({
                 message: res.msg,
@@ -739,6 +806,7 @@ export default {
           if(res.code == 'ok'){
             this.customTypeEditDialog = false
             this.customTypeOp()
+            this.getExpList()
           }else{
             this.$message({
               message: res.msg,
@@ -762,6 +830,88 @@ export default {
       let inpu = document.getElementById(typeName);
       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") {
                 this.allExpList = 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){
                   this.http.post('/company/settingExpenseType',{},res => {
                     if(res.code == 'ok'){}else{this.$message({message: res.msg,type: 'error'})}
                   },err => {this.$message({message: err,type: 'error'})})
                 }
+                for(let i in this.invoiceList){
+                    this.invoiceList[i].expenseType=''
+                }
             } else {
                 this.$message({
                 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) {
       this.dialog = true
@@ -1087,7 +1261,7 @@ export default {
                 code:null,
                 ownerId:this.user.id,
                 createDate: null,
-                type:this.z, 
+                type:this.expenseMainTypeValue, 
                 ticketNum:1,remark:null,totalAmount:0,}
               this.invoiceList = []
                   
@@ -1142,7 +1316,7 @@ export default {
                     startDate: stat,
                     endDate: end,
                     ownerId:this.ownerId,
-                    type:this.type,
+                    type:this.expenseMainTypeValue,
                     };
       if (this.isAuditList) {
         param.status = 1;