Bladeren bron

增加项目自定义字段
对接绎维 日报填报审核驳回

yurk 2 jaren geleden
bovenliggende
commit
f1b7b7c2a1
19 gewijzigde bestanden met toevoegingen van 1056 en 25 verwijderingen
  1. 21 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  2. 123 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectCustomController.java
  3. 75 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  4. 64 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  5. 51 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectCustom.java
  6. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectCustomMapper.java
  7. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectCustomService.java
  8. 12 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  9. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectCustomServiceImpl.java
  10. 126 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  11. 62 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  12. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  13. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectCustomMapper.xml
  14. 11 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  15. 3 2
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  16. 6 2
      fhKeeper/formulahousekeeper/timesheet/src/routes.js
  17. 207 3
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  18. 219 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectForm.vue
  19. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

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

@@ -161,13 +161,21 @@ public class ProjectController {
                                    ProjectSeparate projectSeparate,
                                    Double outputValue,
                                    Integer deptId,
-                                   Integer manDay,
                                    @RequestParam(defaultValue = "false") boolean onlyChangeParticipate,
-                                   String buId) {
+                                   String buId,Integer manDay,String plate1,
+                                   String plate2,
+                                   String plate3,
+                                   String plate4,
+                                   String plate5,
+                                   String plate6,
+                                   String plate7,
+                                   String plate8,
+                                   String plate9,
+                                   String plate10) {
         return projectService.editProject(id, name, code, userId, inchargerId, isPublic, planStartDate, planEndDate, level, contractAmount,changeContractReason,
                 projectBaseCostData,projectKeyNodesData,
                  budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames,
-                taskGpIncharge,auditUserIds, category, projectDesc,projectMainId, providerIds, providerNames, request,projectSeparate,outputValue,deptId,onlyChangeParticipate,buId,manDay);
+                taskGpIncharge,auditUserIds, category, projectDesc,projectMainId, providerIds, providerNames, request,projectSeparate,outputValue,deptId,onlyChangeParticipate,buId,manDay,plate1,plate2,plate3,plate4,plate5,plate6,plate7,plate8,plate9,plate10);
     }
 
     @RequestMapping("/adjustBase")
@@ -317,6 +325,16 @@ public class ProjectController {
         return projectService.detail(id, request);
     }
 
+    /**
+     * 获取项目详细信息
+     * @param id
+     * @return
+     */
+    @RequestMapping("/detailTwo")
+    public HttpRespMsg detailTwo(@RequestParam Integer id) {
+        return projectService.detailTwo(id, request);
+    }
+
     /**
      * 项目统计任务数量分布
      * @param id

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

@@ -0,0 +1,123 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectCustom;
+import com.management.platform.mapper.ProjectCustomMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectCustomService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-03-20
+ */
+@RestController
+@RequestMapping("/project-custom")
+public class ProjectCustomController {
+    @Autowired
+    private ProjectCustomService projectCustomService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectCustomMapper projectCustomMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ProjectMapper projectMapper;
+    @RequestMapping("/editProjectCustom")
+    public HttpRespMsg editProjectCustom(ProjectCustom projectCustom){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectCustom> projectCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", companyId));
+        List<String> nameList=new ArrayList<>();
+        projectCustomList.forEach(pc->{
+            nameList.add(pc.getCustomName());
+        });
+        if(nameList.contains(projectCustom.getCustomName())){
+            httpRespMsg.setError("名称已存在");
+            return httpRespMsg;
+        }
+        projectCustomService.saveOrUpdate(projectCustom);
+        return httpRespMsg;
+    }
+    @RequestMapping("/getProjectCustom")
+    public HttpRespMsg getProjectCustom(HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectCustom> projectCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", companyId));
+        httpRespMsg.data=projectCustomList;
+        return httpRespMsg;
+    }
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id,HttpServletRequest request){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectCustom> projectCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", companyId));
+        Integer num=null;
+        Object result=null;
+        for(int i=0;i<projectCustomList.size();i++){
+            if(id.equals(projectCustomList.get(i).getId())){
+                num=i;
+            }
+        }
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
+        for(Project project:projectList) {
+            switch (num){
+                case 0:
+                    result=project.getPlate1();
+                    break;
+                case 1:
+                    result=project.getPlate2();
+                    break;
+                case 2:
+                    result=project.getPlate3();
+                    break;
+                case 3:
+                    result=project.getPlate4();
+                    break;
+                case 4:
+                    result=project.getPlate5();
+                    break;
+                case 5:
+                    result=project.getPlate6();
+                    break;
+                case 6:
+                    result=project.getPlate7();
+                    break;
+                case 7:
+                    result=project.getPlate8();
+                    break;
+                case 8:
+                    result=project.getPlate9();
+                    break;
+                case 9:
+                    result=project.getPlate10();
+                    break;
+            }
+            if(result!=null){
+                httpRespMsg.setError("当前配置下已存在数据");
+                return httpRespMsg;
+            }
+        }
+        projectCustomService.removeById(id);
+        return new HttpRespMsg();
+    }
+
+}
+

+ 75 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -17,10 +17,9 @@ import com.management.platform.util.MessageUtils;
 import com.management.platform.util.WorkDayCalculateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.*;
-import org.springframework.http.client.ClientHttpResponse;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.client.DefaultResponseErrorHandler;
+import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
@@ -29,13 +28,12 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
-import java.text.NumberFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
-import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -62,6 +60,8 @@ public class ReportController {
     private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
     @Resource
     private UserService userService;
+    @Autowired
+    RestTemplate restTemplate;
     @Resource
     private CompanyService companyService;
     @Resource
@@ -898,6 +898,54 @@ public class ReportController {
             }
         }
 
+        /*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();
+            User reportUser = userMapper.selectById(creatorId);
+            DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
+            LocalDateTime time = LocalDateTime.now();
+            String format = time.format(df);
+            String tokenOfYiWei = getTokenOfYiWei();
+            String url = "http://183.194.0.98:3202/controlCenter/billApply";
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            headers.add("token",tokenOfYiWei);
+            JSONObject body=new JSONObject();
+            body.put("dataSource","工时管家");
+            body.put("type","EXPENSE");
+            body.put("applicant",reportUser.getName());
+            body.put("applyTime",format);
+            body.put("billNo","GS"+ reportUser.getId()+reportList.get(0).getCreateDate());
+            JSONArray expenseDetails=new JSONArray();
+            for (Report report : reportList) {
+                Optional<Project> first = targetProjectList.stream().filter(tl -> tl.getId().equals(report.getProjectId())).findFirst();
+                if(first.isPresent()){
+                    JSONObject expenseDetail =new JSONObject();
+                    expenseDetail.put("company","");
+                    expenseDetail.put("department","");
+                    expenseDetail.put("project",first.get().getProjectCode());
+                    expenseDetail.put("expenseItem","default");
+                    expenseDetail.put("amount",report.getWorkingTime());
+                    expenseDetails.add(expenseDetail);
+                }
+
+            }
+            body.put("expenseDetails",expenseDetails);
+            HttpEntity<String> requestEntity = new HttpEntity<String>(body.toJSONString(), headers);
+            ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                    HttpMethod.POST, requestEntity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                JSONObject json = JSONObject.parseObject(resp);
+                if(json.getIntValue("status")==0){
+                    JSONArray jsonArray = json.getJSONArray("data");
+                }
+            }
+        }*/
+
+
+
         //如果锁定工作时长上限的话,需要校验每日的合计工作时长
         if (comTimeType.getLockWorktime() == 1) {
             for (Report report : reportList) {
@@ -1197,6 +1245,29 @@ public class ReportController {
         return httpRespMsg;
     }
 
+
+    private String getTokenOfYiWei(){
+        String url = "http://183.194.0.98:3202/controlCenter/token";
+        HttpHeaders headers = new HttpHeaders();
+        String token="";
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("appId","GongShi");
+        jsonObject.put("appSecret","6195e252f611785a5e1446e1");
+        HttpEntity<String> requestEntity;
+        requestEntity = new HttpEntity<String>(jsonObject.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if(json.getIntValue("status")==0){
+                token= json.getString("data");
+            }
+        }
+        return token;
+    }
+
     private void fillReportHours(Report report, BigDecimal hourCost, Double workingTime, Integer timeType, String startTime, String endTime, SimpleDateFormat sdf, TimeType comTimeType, List<TimeAutoExclude> excludeTimeList) {
         if (report.getMultiWorktime() == 0) {
             //普通工时成本计算

+ 64 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -6,6 +6,7 @@ import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -372,6 +373,69 @@ public class Project extends Model<Project> {
     @TableField("man_day")
     private Integer manDay;
 
+    /**
+     * 预留字段
+     */
+    @TableField("plate1")
+    private String plate1;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate2")
+    private String plate2;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate3")
+    private String plate3;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate4")
+    private String plate4;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate5")
+    private String plate5;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate6")
+    private String plate6;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate7")
+    private String plate7;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate8")
+    private String plate8;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate9")
+    private String plate9;
+
+    /**
+     * 预留字段
+     */
+    @TableField("plate10")
+    private String plate10;
+
+    @TableField(exist = false)
+    private HashMap plateMap;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -0,0 +1,51 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectCustom extends Model<ProjectCustom> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 公司ID
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("custom_name")
+    private String customName;
+
+    /**
+     * 0-文本 1-图片 2-日期
+     */
+    @TableField("custom_type")
+    private Integer customType;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

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

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

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

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

@@ -47,7 +47,16 @@ public interface ProjectService extends IService<Project> {
                             String providerIds,
                             String providerNames,
                             HttpServletRequest request,
-                            ProjectSeparate projectSeparate,Double outputValue,Integer deptId,boolean onlyChangeParticipate,String buId,Integer manDay);
+                            ProjectSeparate projectSeparate,Double outputValue,Integer deptId,boolean onlyChangeParticipate,String buId,Integer manDay,String plate1,
+                            String plate2,
+                            String plate3,
+                            String plate4,
+                            String plate5,
+                            String plate6,
+                            String plate7,
+                            String plate8,
+                            String plate9,
+                            String plate10);
 
     HttpRespMsg deleteProject(Integer id, Integer force);
 
@@ -67,6 +76,8 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg detail(Integer id, HttpServletRequest request);
 
+    HttpRespMsg detailTwo(Integer id, HttpServletRequest request);
+
     HttpRespMsg taskSum(Integer id, HttpServletRequest request);
 
     HttpRespMsg restartProject(Integer id);

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

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

+ 126 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -92,6 +92,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     private SysFunctionMapper sysFunctionMapper;
     @Resource
+    private ProjectCustomMapper projectCustomMapper;
+    @Resource
     private UserMapper userMapper;
     @Resource
     private ReportMapper reportMapper;
@@ -497,7 +499,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                    String providerIds,
                                    String providerNames,
                                    HttpServletRequest request,
-                                   ProjectSeparate projectSeparate,Double outputValue,Integer deptId,boolean onlyChangeParticipate,String buId,Integer manDay) {
+                                   ProjectSeparate projectSeparate,Double outputValue,Integer deptId,boolean onlyChangeParticipate,String buId,Integer manDay,String plate1,
+                                   String plate2,
+                                   String plate3,
+                                   String plate4,
+                                   String plate5,
+                                   String plate6,
+                                   String plate7,
+                                   String plate8,
+                                   String plate9,
+                                   String plate10) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
@@ -560,7 +571,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             .setDeptCascade(deptId == null ?
                                     convertDepartmentIdToCascade(0) :
                                     convertDepartmentIdToCascade(deptId))
-                            .setProviderNames(providerNames);
+                            .setProviderNames(providerNames)
+                            .setPlate1(plate1)
+                            .setPlate2(plate2)
+                            .setPlate3(plate3)
+                            .setPlate4(plate4)
+                            .setPlate5(plate5)
+                            .setPlate6(plate6)
+                            .setPlate7(plate7)
+                            .setPlate8(plate8)
+                            .setPlate9(plate9)
+                            .setPlate10(plate10);
                     if(companyId==862){
                         project.setBuId(buId);
                         if (project.getBuId()!=null&&!project.getBuId().equals("")) {
@@ -678,7 +699,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         .setDeptCascade(deptId == null ?
                                 convertDepartmentIdToCascade(0) :
                                 convertDepartmentIdToCascade(deptId))
-                        .setProviderNames(providerNames);
+                        .setProviderNames(providerNames)
+                        .setPlate1(plate1)
+                        .setPlate2(plate2)
+                        .setPlate3(plate3)
+                        .setPlate4(plate4)
+                        .setPlate5(plate5)
+                        .setPlate6(plate6)
+                        .setPlate7(plate7)
+                        .setPlate8(plate8)
+                        .setPlate9(plate9)
+                        .setPlate10(plate10);
                 if(companyId==862){
                     p.setBuId(buId);
                     if (p.getBuId()!=null&&!p.getBuId().equals("")) {
@@ -1525,6 +1556,25 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+
+    private String disposePhoto(String photoString) {
+        if(photoString!=null&&(photoString
+                .toLowerCase().endsWith(".jpg")||photoString
+                .toLowerCase().endsWith(".png"))){
+            String[] arrayStr = photoString.replaceAll("@", ",").split(",");
+            String string="";
+            for(int i=0;i<arrayStr.length;i++){
+                if(i==arrayStr.length-1){
+                    string+=arrayStr[i];
+                }else{
+                    string+=arrayStr[i]+",";
+                }
+            }
+            return string;
+        }
+        return photoString;
+    }
+
     @Override
     public HttpRespMsg detail(Integer id, HttpServletRequest request) {
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
@@ -1557,6 +1607,79 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+
+    @Override
+    public HttpRespMsg detailTwo(Integer id, HttpServletRequest request) {
+        HttpRespMsg projectPage = getProjectPage(1, 20, null, 1, 0, null, id, null, null, null, null, null, null, null, null, request);
+        Map<String,Object> mapList= (Map<String, Object>) projectPage.data;
+        List<Project> projectList= (List<Project>) mapList.get("records");
+        Project project = projectList.get(0);
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<ProjectCustom> proCustomList = projectCustomMapper.selectList(new QueryWrapper<ProjectCustom>().eq("company_id", companyId));
+        //按顺序存储项目自定义字段 对应plate
+        HashMap map=new HashMap();
+        for(int i=0;i<proCustomList.size();i++){
+            String disposePhoto;
+            switch (i){
+                case 0:
+                    disposePhoto= disposePhoto(project.getPlate1());
+                    project.setPlate1(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate1());
+                    break;
+                case 1:
+                    disposePhoto= disposePhoto(project.getPlate2());
+                    project.setPlate2(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate2());
+                    break;
+                case 2:
+                    disposePhoto= disposePhoto(project.getPlate3());
+                    project.setPlate3(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate3());
+                    break;
+                case 3:
+                    disposePhoto= disposePhoto(project.getPlate4());
+                    project.setPlate4(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate4());
+                    break;
+                case 4:
+                    disposePhoto= disposePhoto(project.getPlate5());
+                    project.setPlate5(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate5());
+                    break;
+                case 5:
+                    disposePhoto= disposePhoto(project.getPlate6());
+                    project.setPlate6(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate6());
+                    break;
+                case 6:
+                    disposePhoto= disposePhoto(project.getPlate7());
+                    project.setPlate7(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate7());
+                    break;
+                case 7:
+                    disposePhoto= disposePhoto(project.getPlate8());
+                    project.setPlate8(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate8());
+                    break;
+                case 8:
+                    disposePhoto= disposePhoto(project.getPlate9());
+                    project.setPlate9(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate9());
+                    break;
+                case 9:
+                    disposePhoto= disposePhoto(project.getPlate10());
+                    project.setPlate10(disposePhoto);
+                    map.put(proCustomList.get(i).getCustomName(),project.getPlate10());
+                    break;
+            }
+        }
+        project.setPlateMap(map);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = project;
+
+        return msg;
+    }
+
     @Override
     public HttpRespMsg taskSum(Integer id, HttpServletRequest request) {
         List<Task> allTask = taskMapper.simpleList(new QueryWrapper<Task>().eq("project_id", id),null,null);

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

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.controller.ReportController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.*;
 import com.management.platform.mapper.*;
@@ -1656,6 +1657,25 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (updateReportList.size() > 0) {
                     updateBatchById(updateReportList);
                 }
+                /*if(company.getId()==862){
+                    String url = "http://183.194.0.98:3202/controlCenter/billApproved";
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.APPLICATION_JSON);
+                    headers.add("token",getTokenOfYiWei());
+                    JSONObject body=new JSONObject();
+                    body.put("type","EXPENSE");
+                    body.put("billNo","GS"+reportList.get(0).getCreatorId()+reportList.get(0).getCreateDate());
+                    HttpEntity<String> requestEntity = new HttpEntity<String>(body.toJSONString(), headers);
+                    ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                            HttpMethod.POST, requestEntity, String.class);
+                    if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                        String resp = responseEntity.getBody();
+                        JSONObject json = JSONObject.parseObject(resp);
+                        if(json.getIntValue("status")==0){
+                            JSONArray jsonArray = json.getJSONArray("data");
+                        }
+                    }
+                }*/
             }else if(timeType.getReportAuditType() == 5){
                 List<Report> updateReportList = new ArrayList<>();
                 //项目所属BU审核
@@ -1917,6 +1937,29 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
     }
 
+
+    private String getTokenOfYiWei(){
+        String url = "http://183.194.0.98:3202/controlCenter/token";
+        HttpHeaders headers = new HttpHeaders();
+        String token="";
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("appId","GongShi");
+        jsonObject.put("appSecret","6195e252f611785a5e1446e1");
+        HttpEntity<String> requestEntity;
+        requestEntity = new HttpEntity<String>(jsonObject.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            if(json.getIntValue("status")==0){
+                token= json.getString("data");
+            }
+        }
+        return token;
+    }
+
     //审核通过需要通知相关领导
     private void notifyLeaders(List<Report> reportList) {
         List<Integer> collect = reportList.stream().map(Report::getProjectId).collect(Collectors.toList());
@@ -2125,6 +2168,25 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             updateBatchById(newList);
         }
+        /*if(company.getId()==862){
+            String url = "http://183.194.0.98:3202/controlCenter/billRejected";
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            headers.add("token",getTokenOfYiWei());
+            JSONObject body=new JSONObject();
+            body.put("type","EXPENSE");
+            body.put("billNo","GS"+rList.get(0).getCreatorId()+rList.get(0).getCreateDate());
+            HttpEntity<String> requestEntity = new HttpEntity<String>(body.toJSONString(), headers);
+            ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                    HttpMethod.POST, requestEntity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                JSONObject json = JSONObject.parseObject(resp);
+                if(json.getIntValue("status")==0){
+                    JSONArray jsonArray = json.getJSONArray("data");
+                }
+            }
+        }*/
         List<Integer> collect = rList.stream().map(Report::getProjectId).collect(Collectors.toList());
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect));
         String pNames = projectList.stream().map(Project::getProjectName).collect(Collectors.joining(", ", "[", "]"));

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

@@ -447,9 +447,9 @@ public class TimingTask {
                         default:leaveType=8;
                     }
                     leaveSheet.setLeaveType(leaveType);
-                    leaveSheet.setProcinstId(String.valueOf(map.get("procinstId")));
+                    leaveSheet.setProcinstId(String.valueOf(map.get("ID")));
                     leaveSheet.setGmtFinished(String.valueOf(map.get("gmtFinished")));
-                    Optional<LeaveSheet> first = oldLeaveSheetList.stream().filter(ol -> ol.getStartDate().isEqual(leaveSheet.getStartDate())&&ol.getEndDate().isEqual(leaveSheet.getEndDate())&& ol.getOwnerId().equals(leaveSheet.getOwnerId())).findFirst();
+                    Optional<LeaveSheet> first = oldLeaveSheetList.stream().filter(ol -> ol.getStartDate().isEqual(leaveSheet.getStartDate())&&ol.getEndDate().isEqual(leaveSheet.getEndDate())&& ol.getOwnerId().equals(leaveSheet.getOwnerId())&& ol.getProcinstId().equals(leaveSheet.getProcinstId())).findFirst();
                     if(first.isPresent()){
                         leaveSheet.setId(first.get().getId());
                     }
@@ -502,9 +502,9 @@ public class TimingTask {
                     businessTrip.setGoBack(goBack);
                     Double dayCount =Double.valueOf(String.valueOf(map.get("dayCount")));
                     businessTrip.setDayCount(dayCount.intValue());
-                    businessTrip.setProcinstId((String) map.get("procinstId"));
+                    businessTrip.setProcinstId((String) map.get("ID"));
                     businessTrip.setGmtFinished((String)map.get("gmtFinished"));
-                    Optional<BusinessTrip> first = oldBusinessTripList.stream().filter(ol -> ol.getStartDate().isEqual(businessTrip.getStartDate())&&ol.getEndDate().isEqual(businessTrip.getEndDate())&& ol.getOwnerId().equals(businessTrip.getOwnerId())).findFirst();
+                    Optional<BusinessTrip> first = oldBusinessTripList.stream().filter(ol -> ol.getStartDate().isEqual(businessTrip.getStartDate())&&ol.getEndDate().isEqual(businessTrip.getEndDate())&& ol.getOwnerId().equals(businessTrip.getOwnerId())&& ol.getProcinstId().equals(businessTrip.getProcinstId())).findFirst();
                     if(first.isPresent()){
                         businessTrip.setId(first.get().getId());
                     }

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectCustomMapper.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.ProjectCustomMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectCustom">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="custom_name" property="customName" />
+        <result column="custom_type" property="customType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, custom_name, custom_type
+    </sql>
+
+</mapper>

File diff suppressed because it is too large
+ 11 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml


+ 3 - 2
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -22,9 +22,10 @@
     "supplierManagement": "供应商管理",
     "organizationalStructure": "组织架构",
     "approvalFlowSettings": "审批流设置",
-    "basicDataManagemen": "基本数据管理",
+    "basicDataManagement": "基础数据管理",
     "basicSystemSettings": "系统基础设置",
-    "roleRightsManagement": "角色权限管理"
+    "roleRightsManagement": "角色权限管理",
+    "projectFormSettings": "项目表单设置"
   },
   "role": {
     "ordinaryEmployees": "普通员工",

+ 6 - 2
fhKeeper/formulahousekeeper/timesheet/src/routes.js

@@ -84,6 +84,9 @@ import centerManage from './views/centerManage/centerManage'
 // 供应商模块
 import provider from './views/provider/provider'
 
+// 项目表单设置
+import projectForm from './views/project/projectForm'
+
 Vue.use(Router)
 
 export const fixedRouter = [
@@ -454,10 +457,11 @@ export const allRouters = [//组织架构
         leaf: false,//只有一个节点
         children: [
             { path: '/timetype', component: timetype, name: '系统基础设置', iconCls: 'iconfont firerock-iconxitong-', meta: { text: 'navigation.basicSystemSettings' }},
-            { path: '/role', component: quanx, name: '角色权限管理', iconCls: 'iconfont firerock-iconquanxian1', meta: { text: 'navigation.roleRightsManagement' } }
+            { path: '/role', component: quanx, name: '角色权限管理', iconCls: 'iconfont firerock-iconquanxian1', meta: { text: 'navigation.roleRightsManagement' } },
+            { path: '/projectForm', component: projectForm, name: '项目表单设置', iconCls: 'iconfont firerock-iconquanxian1', meta: { text: 'navigation.projectFormSettings' } },
         ],
         // 其他信息
-        meta: { text: 'navigation.basicDataManagemen' }
+        meta: { text: 'navigation.basicDataManagement' }
     },
     {
         path: '/404',

+ 207 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -630,6 +630,50 @@
                         <el-input v-model="addForm.bu" :placeholder="$t('subordinateBU')" clearable :disabled="canOnlyModParticipator"></el-input>
                     </el-form-item>
                     </div>
+
+
+                    <!-- 用户自己定义的字段 -->
+                    <div style="margin-top: 20px" v-if="dataList.length > 0">
+                        <el-form-item v-for="(item, index) in dataList" :key="item.id" :label="item.customName">
+                            <div v-if="item.customType == 0">
+                                <el-input v-model="item.value" clearable placeholder="请输入内容" @input="ipts(item.value, index)"></el-input>
+                            </div>
+                            <div v-if="item.customType == 1">
+                                <el-upload
+                                    list-type="picture-card"
+                                    ref="upload" :file-list="item.value" :action="index" :auto-upload="true" :limit="2" :disabled="item.valuelist.length == '2'" :http-request="fileUpload">
+                                        <i slot="default" class="el-icon-plus"></i>
+                                        <div slot="file" slot-scope="{file}">
+                                        <img
+                                            class="el-upload-list__item-thumbnail"
+                                            :src="file.url" alt=""
+                                        >
+                                        <span class="el-upload-list__item-actions">
+                                            <span
+                                            class="el-upload-list__item-preview"
+                                            @click="handlePictureCardPreview(file)"
+                                            >
+                                            <i class="el-icon-zoom-in"></i>
+                                            </span>
+                                            <span
+                                            v-if="!disabled"
+                                            class="el-upload-list__item-delete"
+                                            @click="handleRemove(file, index)"
+                                            >
+                                            <i class="el-icon-delete"></i>
+                                            </span>
+                                        </span>
+                                        </div>
+                                    </el-upload>
+                            </div>
+                            <div v-if="item.customType == 2">
+                                <el-date-picker v-model="item.value" type="date" placeholder="请选择日期"  value-format="yyyy-MM-dd"></el-date-picker>
+                            </div>
+                        </el-form-item>
+                    </div>
+
+
+
                     <!-- <div v-if="user.companyId == '428'">
                         <el-form-item :label="$t('projectgroup')" >
                             <el-input v-model="addForm.projectCategorySub" maxlength="50" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
@@ -749,6 +793,12 @@
             </div>
         </el-dialog>
 
+
+        <!-- 图片放大弹窗 -->
+        <el-dialog :visible.sync="imgUrlListFlg" width="70%" :before-close="xhutDown">
+            <img width="100%" :src="imgUrlLists" alt="">
+        </el-dialog>
+
         <!--用户详细信息弹出框-->
         <el-dialog :title="$t('Checkthedetails')" v-if="userDetailVisible" :visible.sync="userDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
             <div class="line"><span>{{ $t('lable.name') }}</span>
@@ -1404,8 +1454,7 @@ a {
                     name: '',
                     userId: [],
                     level:1,
-                    // bu:'',
-                    bu: ['50'],
+                    bu:'',
                     id: '',
                     code: '',
                     projectDesc: '',
@@ -1504,6 +1553,10 @@ a {
 
                 exportDisabled: false,
                 exportNotification: null,
+                dataList: [],
+                dataListBf: [],
+                imgUrlLists: '',
+                imgUrlListFlg: false,
             };
         },
         // 过滤器
@@ -1808,6 +1861,100 @@ a {
                     this.getList()
                 }
             },
+            fileUpload(file) {
+                //首先判断文件类型
+                console.log(file)
+                let str = file.file.name.split(".");
+                let indexLi = file.action
+                let format = str[str.length - 1];
+                if (format != "jpg" && format != "jpeg" && format != "png") {
+                    this.$message({
+                        message: "请选择.jpg或.jpeg文件",
+                        type: "error"
+                    });
+                } else {
+                    let formData = new FormData();
+                    formData.append("multipartFile", file.file);
+                    this.http.uploadFile('/common/uploadFile', formData,
+                    res => {
+                        if (res.code == "ok") {
+                            this.dataList[indexLi].valuelist.push(res.data)
+                            this.$forceUpdate()
+                            this.$message({
+                                message: "上传成功",
+                                type: "success"
+                            });
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                }
+            },
+            handleRemove(file, index) {
+                let uploadFiles = this.$refs.upload[0].uploadFiles
+                for (var i = 0; i < uploadFiles.length; i++) {
+                    if (uploadFiles[i]['url'] == file.url) {
+                        uploadFiles.splice(i, 1)
+                        this.dataList[index].valuelist.splice(i, 1)
+                    }
+                }
+            },
+            handlePictureCardPreview(file) {
+                console.log(file)
+                this.imgUrlLists = file.url;
+                this.imgUrlListFlg = true;
+                // this.$set(this, 'imgUrlListFlg', true)
+                // console.log(this.imgUrlListFlg)
+                this.$forceUpdate()
+            },
+            xhutDown(done) {
+                this.imgUrlListFlg = false
+                done()
+                this.$forceUpdate()
+            },
+            ipts(i, item) {
+                this.$forceUpdate()
+            },
+            getObtain() {
+                this.http.post('/project-custom/getProjectCustom', {},
+                res => {
+                    if(res.code == 'ok') {
+                        var yaunz = []
+                        for(var i in res.data) {
+                            if(res.data[i].customType == '1') {
+                                this.$set(res.data[i], 'value', [])
+                                this.$set(res.data[i], 'valuelist', [])
+                            } else {
+                                this.$set(res.data[i], 'value', '')
+                                this.$set(res.data[i], 'valuelist', [])
+                            }
+                            yaunz.push(res.data[i])
+                        }
+                        this.dataList = yaunz
+                        this.dataListBf = yaunz
+                    } else {
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
             //获取项目列表
             getSupplierList() {
                 this.http.post('/provider-info/list', {
@@ -3677,6 +3824,37 @@ a {
                 }
             },
 
+
+            // 处理数据
+            chulishuju(data) {
+                console.log(data, 12345)
+                let arrLists = JSON.parse(JSON.stringify(this.dataListBf))
+                var arr = []
+                for(var s in arrLists) {
+                    for(var p in data.plateMap) {
+                        if(arrLists[s].customName == p && arrLists[s].customType != '1') {
+                            arrLists[s].value = data.plateMap[p]
+                        } 
+                        if(arrLists[s].customName == p && arrLists[s].customType == '1' && data.plateMap[p] != null && data.plateMap[p] != ''){
+                            var sel = data.plateMap[p].split(',')
+                            var live = []
+                            for(var dd in sel) {
+                                var obj = {}
+                                obj.name = p
+                                obj.url = this.pictureAddress + '/upload/' + sel[dd]
+                                live.push(obj)
+                            }
+                            console.log('值值hi', this.pictureAddress)
+                            arrLists[s].value = live
+                            arrLists[s].valuelist = sel
+                        }
+                    }
+                }
+                this.dataList = arrLists
+                console.log(this.form, 9999)
+                console.log(this.dataList, 8888)
+                this.dialogVisible = true
+            },
             //显示新增界面
             handleAdd(i, item) {
                 this.canOnlyModParticipator = false;
@@ -3703,6 +3881,10 @@ a {
                         manDay:0
                         // deptId: []
                     }
+                    for(var i in this.dataList) {
+                        var str = 'plate' + (+i + 1)
+                        this.$set(this.addForm,str, '')
+                    }
 
                     if(this.user.timeType.projectWithDept) {
                         this.$set(this.addForm, 'deptId', [])
@@ -3736,6 +3918,12 @@ a {
                         // console.log(this.projectKeyNodesData, '节点值')
                     }
                 } else {
+                    this.http.post('/project/detailTwo', {id: item.id},
+                    res => {
+                    if (res.code == "ok") {
+                        this.chulishuju(res.data)
+                    }
+                    });
                     //编辑时,非 (管理全部项目,项目创建人,项目经理),有编辑项目参与人权限的人,可以进行参与人的修改
                     if (!(this.permissions.projectManagement || this.user.id==item.inchargerId || this.user.id == item.creatorId) && this.permissions.projectParticipator) {
                         this.canOnlyModParticipator = true;
@@ -3815,6 +4003,14 @@ a {
                         manDay:item.manDay==null?0:item.manDay,
                         manDayDisable:item.manDay
                     }
+                    for(var i in this.dataList) {
+                        var str = 'plate' + (+i + 1)
+                        if(this.dataList[i].customType != '1') {
+                            this.$set(this.addForm,str, this.dataList[i].value==null?'':this.dataList[i].value)
+                        } else {
+                            this.$set(this.addForm,str,this.dataList[i].valuelist.join('@'))
+                        }
+                    }
                     this.contractAmountOld = item.contractAmount ? item.contractAmount : 0
                     // console.log(this.addForm, '数据')
                     if(this.user.timeType.projectWithDept) {
@@ -4166,7 +4362,14 @@ a {
                         if(this.user.timeType.projectManDay){
                             formData.append("manDay", this.addForm.manDay ? this.addForm.manDay : '');
                         }
-                    
+                        for(var i in this.dataList) {
+                             var str = 'plate' + (+i + 1)
+                             if(this.dataList[i].customType != '1') {
+                                 formData.append(str,this.dataList[i].value==null?'':this.dataList[i].value);
+                             } else {
+                                formData.append(str,this.dataList[i].valuelist.join('@'));
+                             }
+                         }
                         // formData.append("associateDegreeNames", listName)
                         //console.log("addform",this.addForm);
                         //return
@@ -4409,6 +4612,7 @@ a {
             this.getProjectBaseConfigList();
             this.getClfConfigList()
             this.yanjiuzx()
+            this.getObtain()
 
             // 判断是否有供应商字段
             if(this.user.company.packageProvider == 1){

+ 219 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectForm.vue

@@ -0,0 +1,219 @@
+<template>
+  <div class="infrastructures">
+      <div class="til">
+          <p>项目表单设置</p>
+          <div style="display: flex;">
+            <p style="cursor:pointer;margin-left: 30px;color: #20A0FF;" @click="addJa('添加表单字段', 'ruleForm')"><i class="el-icon-circle-plus-outline"></i>添加</p>
+          </div>
+      </div>
+      <div class="tabl">
+        <el-table :data="dataList" highlight-current-row v-loading="listLoading" :height="heightDoms" style="width: 100%;">
+            <el-table-column type="index" label="序号" width="250px">
+                <template slot-scope="scope" >
+                    {{scope.$index + 1}}
+                </template>
+            </el-table-column>
+            <el-table-column prop="customName" label="自定义名称" sortable></el-table-column>
+            <el-table-column prop="customType" label="类型" sortable>
+                <template slot-scope="scope">
+                    {{scope.row.customType == '2' ? '日期' : (scope.row.customType == '1' ? '图片' : '文本')}}
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" width="280">
+                <template slot-scope="scope">
+                    <el-button size="mini" type="primary" @click="editor(scope.row, '编辑表单字段')">编辑</el-button>
+                    <el-button size="mini" type="danger" @click="deteles(scope.row)">删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+      </div>
+      <!-- 弹窗 -->
+      <el-dialog :title="titleTex" :visible.sync="dialogVisible" width="400px" :before-close="handleClose">
+        <div>
+            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="80px" class="demo-ruleForm">
+                <el-form-item label="类型">
+                    <el-radio-group v-model="ruleForm.customType">
+                        <el-radio-button label="0">文本</el-radio-button>
+                        <el-radio-button label="1">图片</el-radio-button>
+                        <el-radio-button label="2">日期</el-radio-button>
+                    </el-radio-group>
+                </el-form-item>
+                <el-form-item label="名称" prop="customName">
+                    <el-input placeholder="请输入自定义名称" v-model.trim="ruleForm.customName" clearable></el-input>
+                </el-form-item>
+            </el-form>
+        </div>
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="dialogVisible = false">取 消</el-button>
+            <el-button type="primary" @click="determine('ruleForm')" v-loading="listLoading">确 定</el-button>
+        </span>
+      </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {},
+  components: {},
+  data() {
+    return {
+      heightDoms: document.documentElement.clientHeight - 130,
+      titleTex: '添加表单字段',
+      dialogVisible: false,
+      ruleForm: {
+          id: '',
+          companyId: '',
+          customName: '',
+          customType: '0'
+      },
+      rules: {customName: [{required: true, message: '请输入自定义名称', trigger: 'blur'}]},
+      listLoading: false,
+      user: JSON.parse(sessionStorage.getItem("user")),
+      dataList: []
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+      this.getObtain()
+  },
+  methods: {
+    getObtain() {
+        this.listLoading = true
+        this.http.post('/project-custom/getProjectCustom', this.ruleForm,
+        res => {
+            this.listLoading = false
+            if(res.code == 'ok') {
+                this.dataList = res.data
+            } else {
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            }
+        },
+        error => {
+            this.listLoading = false;
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+    addJa(tex) {
+        if(this.dataList.length >= 10) {
+            this.$message({
+                message: '最多只能存在十个自定义字段',
+                type: 'warning'
+            });
+            return
+        }
+        if(this.$refs['ruleForm']) {
+            this.$refs['ruleForm'].resetFields();
+        }
+        this.titleTex = tex
+        this.ruleForm = {
+            id: '',
+            companyId: '',
+            customName: '',
+            customType: '0'
+        },
+        this.dialogVisible = true
+    },
+    editor(item, tex) {
+        if(this.$refs['ruleForm']) {
+            this.$refs['ruleForm'].resetFields();
+        }
+        this.titleTex = tex
+        this.ruleForm = JSON.parse(JSON.stringify(item))
+        this.dialogVisible = true
+    },
+    determine(formName) {
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.listLoading = true
+            this.ruleForm.companyId = this.user.companyId
+            this.http.post( '/project-custom/editProjectCustom', this.ruleForm,
+            res => {
+                this.listLoading = false
+                if(res.code == 'ok') {
+                    this.$message({
+                        message: this.titleTex == '添加表单字段' ? '添加成功' : '编辑成功',
+                        type: 'success'
+                    });
+                    this.dialogVisible = false
+                    this.getObtain()
+                } else {
+                    this.$message({
+                        message: this.titleTex == '添加表单字段' ? '添加失败: ' + res.msg : '编辑失败: ' + res.msg,
+                        type: 'error'
+                    });
+                }
+            },
+            error => {
+                this.listLoading = false;
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            });
+          } else {
+            console.log('error submit!!');
+            return false;
+          }
+        });
+    },
+    deteles(item) {
+        this.http.post( '/project-custom/delete', {
+            id: item.id
+        },
+        res => {
+            if(res.code == 'ok') {
+                this.$message({
+                    message: '删除成功',
+                    type: 'success'
+                });
+                this.getObtain()
+            } else {
+                this.$message({
+                    message: '删除失败:' + res.msg,
+                    type: 'error'
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    }
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.infrastructures {
+    color: #666;
+    .til {
+        display: flex;
+        justify-content: space-between;
+        line-height: 0;
+        background: #f2f2f2;
+        padding: 10px 25px 10px 25px;
+        align-items: center;
+        p {
+          font-size: 14px;
+          i {
+            display: inline-block;
+            margin-right: 5px;
+          }
+        }
+    }
+    .tabl {
+      padding-left: 15px;
+      box-sizing: border-box;
+    }
+}
+</style>

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

@@ -911,7 +911,7 @@
                             <el-option v-for="item in zhoBao.stages" :key="item.id" :label="item.stagesName" :value="item.stagesName"></el-option>
                     </el-select>
                 </div>
-                <div class="zhoFel" v-if="user.timeType.reportAuditType != 3">
+                <div class="zhoFel" v-if="user.timeType.reportAuditType == 0 || user.timeType.reportAuditType == 4">
                     <p>{{$t('other.reviewer')}}</p>
                     <el-select v-model="zhoBao.projectAuditorId" v-if="user.userNameNeedTranslate != 1" :placeholder="$t('defaultText.pleaseChoose')" clearable="true" style="width: 355px">
                         <el-option v-for="item in zhoBao.auditUserList" :key="item.id" :label="item.auditorName" :value="item.auditorId"></el-option>
@@ -4870,7 +4870,7 @@
                     });
                     return;
                 }
-                if (!this.zhoBao.projectAuditorId && this.user.timeType.reportAuditType != 3) {
+                if (!this.zhoBao.projectAuditorId &&(user.timeType.reportAuditType == 0 || user.timeType.reportAuditType == 4)) {
                     this.$message({
                         message: this.$t('message.Pleaseselectareviewer'),
                         type: "error"