Prechádzať zdrojové kódy

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

seyason 2 rokov pred
rodič
commit
e3fd2307e2
17 zmenil súbory, kde vykonal 302 pridanie a 159 odobranie
  1. 44 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java
  2. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectRequirement.java
  3. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  4. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  5. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java
  6. 15 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  7. 7 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectRequirementMapper.xml
  9. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  10. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  11. 1 1
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  12. 15 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue
  13. 19 0
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  14. 33 30
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  15. 94 91
      fhKeeper/formulahousekeeper/timesheet_h5/package-lock.json
  16. 23 12
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  17. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

+ 44 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectRequirementController.java

@@ -4,11 +4,9 @@ package com.management.platform.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.ProjectRequirement;
+import com.management.platform.entity.Task;
 import com.management.platform.entity.TaskGroup;
-import com.management.platform.mapper.ProjectMapper;
-import com.management.platform.mapper.ProjectRequirementMapper;
-import com.management.platform.mapper.TaskGroupMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.ProjectRequirementService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
@@ -59,6 +57,8 @@ public class ProjectRequirementController {
     private ProjectRequirementService projectRequirementService;
     @Resource
     private TaskGroupMapper taskGroupMapper;
+    @Resource
+    private TaskMapper taskMapper;
 
     @RequestMapping("/addOrMod")
     public HttpRespMsg addOrMod(ProjectRequirement record) {
@@ -89,6 +89,15 @@ public class ProjectRequirementController {
             projectIds = taskGroups.stream().map(TaskGroup::getProjectId).collect(Collectors.toList());
         }
         List<ProjectRequirement> projectRequirements = projectRequirementMapper.customSelect(companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize,reStartDate,reEndDate);
+        List<Integer> collect = projectRequirements.stream().map(pr -> pr.getProjectId()).collect(Collectors.toList());
+        List<Task> milepostList=taskMapper.selectMilepost(collect);
+        projectRequirements.forEach(pr->{
+            milepostList.forEach(mp->{
+                if(pr.getProjectId().equals(mp.getProjectId())){
+                    pr.setMilepost(mp);
+                }
+            });
+        });
         long total=projectRequirementMapper.selectCountByDate(companyId, startDate, projectId, projectIds.size()==0?null:projectIds, startIndex, pageSize,reStartDate,reEndDate);
         HashMap map = new HashMap();
         map.put("total", total);
@@ -106,8 +115,17 @@ public class ProjectRequirementController {
         now = now.minusDays(7);
         String startDate = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
         List<ProjectRequirement> projectRequirementList = projectRequirementMapper.customSelect(companyId,startDate, null, null, null, null,null,null);
+        List<Integer> collect = projectRequirementList.stream().map(pr -> pr.getProjectId()).collect(Collectors.toList());
+        List<Task> milepostList=taskMapper.selectMilepost(collect);
+        projectRequirementList.forEach(pr->{
+            milepostList.forEach(mp->{
+                if(pr.getProjectId().equals(mp.getProjectId())){
+                    pr.setMilepost(mp);
+                }
+            });
+        });
         List<List<String>> dataList=new ArrayList<>();
-        String[] titleString={"项目编号","项目名称","近七日活跃人员","人员需求","任务需求","开始时间","结束时间"};
+        String[] titleString={"项目编号","项目名称","近七日活跃人员","人员需求","任务需求","合同要求","参与部门进度","里程碑进度","开始时间","结束时间"};
         List<String> nameList = Arrays.asList(titleString);
         dataList.add(nameList);
         projectRequirementList.forEach(pr->{
@@ -117,13 +135,24 @@ public class ProjectRequirementController {
             resultData.add(pr.getActiveUsers());
             resultData.add(pr.getMembReq());
             resultData.add(pr.getTaskReq());
+            resultData.add(pr.getContractReq());
+            resultData.add(pr.getDepartmentSpeed());
+            if(pr.getMilepost()!=null){
+                resultData.add(pr.getMilepost().getName()+"-完成时间:"+pr.getMilepost().getFinishDate());
+            }else{
+                resultData.add("");
+            }
             if(pr.getStartDate()!=null){
                 String s=df.format(pr.getStartDate());
                 resultData.add(s);
+            }else {
+                resultData.add("");
             }
             if(pr.getEndDate()!=null){
                 String s1=df.format(pr.getEndDate());
                 resultData.add(s1);
+            }else {
+                resultData.add("");
             }
             dataList.add(resultData);
         });
@@ -176,12 +205,16 @@ public class ProjectRequirementController {
                 XSSFCell codeCell = row.getCell(0);
                 XSSFCell taskReqCell = row.getCell(1);
                 XSSFCell membReqCell = row.getCell(2);
-                XSSFCell startDateCell = row.getCell(3);
-                XSSFCell endDateCell = row.getCell(4);
+                XSSFCell contractReqCell = row.getCell(3);
+                XSSFCell departmentSpeedCell = row.getCell(4);
+                XSSFCell startDateCell = row.getCell(5);
+                XSSFCell endDateCell = row.getCell(6);
 
                 if (codeCell != null)codeCell.setCellType(CellType.STRING);
                 if (taskReqCell != null)taskReqCell.setCellType(CellType.STRING);
                 if (membReqCell != null)membReqCell.setCellType(CellType.STRING);
+                if (contractReqCell != null)contractReqCell.setCellType(CellType.STRING);
+                if (departmentSpeedCell != null)departmentSpeedCell.setCellType(CellType.STRING);
                 if (startDateCell != null)startDateCell.setCellType(CellType.NUMERIC);
                 if (endDateCell != null)endDateCell.setCellType(CellType.NUMERIC);
                 ProjectRequirement projectRequirement=new ProjectRequirement();
@@ -198,8 +231,10 @@ public class ProjectRequirementController {
                 }else{
                     list.forEach(li->{
                         projectRequirement.setProjectId(li.getId());
-                        projectRequirement.setTaskReq(StringUtils.isEmpty(taskReqCell.getStringCellValue())?"":taskReqCell.getStringCellValue());
-                        projectRequirement.setMembReq(StringUtils.isEmpty(membReqCell.getStringCellValue())?"":membReqCell.getStringCellValue());
+                        projectRequirement.setTaskReq(StringUtils.isEmpty(taskReqCell)?"":taskReqCell.getStringCellValue());
+                        projectRequirement.setMembReq(StringUtils.isEmpty(membReqCell)?"":membReqCell.getStringCellValue());
+                        projectRequirement.setContractReq(StringUtils.isEmpty(contractReqCell)?"":contractReqCell.getStringCellValue());
+                        projectRequirement.setDepartmentSpeed(StringUtils.isEmpty(departmentSpeedCell)?"":departmentSpeedCell.getStringCellValue());
                         if(startDateCell!=null){
                             projectRequirement.setStartDate(startDateCell.getDateCellValue());
                         }else {

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

@@ -59,6 +59,16 @@ public class ProjectRequirement extends Model<ProjectRequirement> {
     @TableField(exist = false)
     private String activeUsers;
 
+    @TableField("contract_req")
+    private String contractReq;
+
+    @TableField("department_speed")
+    private String departmentSpeed;
+
+    @TableField(exist = false)
+    private Task milepost;
+
+
 
     @Override
     protected Serializable pkVal() {

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -110,6 +110,13 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_degree_name")
     private String customDegreeName;
 
+
+    /**
+     * 工时填报自定义维度是否必填
+     */
+    @TableField("custom_degree_status")
+    private Integer customDegreeStatus;
+
     /**
      * 提醒内容
      */
@@ -146,6 +153,13 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_data_name")
     private String customDataName;
 
+
+    /**
+     * 工时填报数值收集字段是否必填
+     */
+    @TableField("custom_data_status")
+    private String customDataStatus;
+
     /**
      * 财务成本导入是否需要审核
      */
@@ -200,6 +214,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_text_name")
     private String customTextName;
 
+    /**
+     * 自定义文本信息是否必填 0-否 1-是
+     */
+    @TableField("custom_text_status")
+    private Integer customTextStatus;
+
     /**
      * 是否锁定每日填报时长
      */

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java

@@ -85,7 +85,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
 
     List getBaseCostAndRealCost(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId);
 
-    List<Map<String, Object>> getProjectCostGroupByProject(Integer companyId, String startDate, String endDate, Integer projectId);
+    List<Map<String, Object>> getProjectCostGroupByProject(Integer companyId, String startDate, String endDate, Integer projectId,String userId);
 
     List<Map<String, Object>> getTimeCostByCategory(Integer companyId, String startDate, String endDate, Integer projectCategoryId, String userId);
 

+ 3 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskMapper.java

@@ -1,16 +1,14 @@
 package com.management.platform.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.management.platform.entity.Task;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.TimeTask;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
-import org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * <p>
@@ -43,4 +41,6 @@ public interface TaskMapper extends BaseMapper<Task> {
 
     @Update("update task set executor_id = null, executor_name = null, executor_color=null where id=#{id}")
     void removeTaskExecutor(Integer id);
+
+    List<Task> selectMilepost(List<Integer> collect);
 }

+ 15 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -783,6 +783,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     List<Map<String, Object>> membList = projectMapper.getProjectCost(companyId,startDate, endDate, curProjectId, userId);
                     map.put("membList", membList);
                     for (Map<String, Object> membMap : membList) {
+                        double pTotalTime = 0;
+                        BigDecimal pTotalMoney = new BigDecimal(0);
                         List<String> membRowData = new ArrayList<String>();
                         if (projectSum == null || projectSum == false) {
                             membRowData.add((String)map.get("projectCode"));
@@ -812,7 +814,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 sumRow.add(totalMoneyCost.toString());
                 allList.add(sumRow);
             }else{
-                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
                 List<Object> projectNames = list.stream().map(mp -> mp.get("project")).collect(Collectors.toList());
                 List<Object> projectIds = list.stream().map(mp -> mp.get("id")).collect(Collectors.toList());
                 List<String> headList = new ArrayList<String>();
@@ -826,7 +828,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 allList=new ArrayList<>();
                 allList.add(headList);
                 //统计当前所有项目所有人的时间成本投入
-                List<Map<String, Object>> membList = projectMapper.getProjectCostGroupByProject(companyId,startDate, endDate, projectId);
+                List<Map<String, Object>> membList = projectMapper.getProjectCostGroupByProject(companyId,startDate, endDate, projectId,userId);
                 for (User user : userList) {
                     BigDecimal moneyCost = BigDecimal.valueOf(0);
                     double costTime = 0;
@@ -839,7 +841,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             membRowData.add(String.valueOf(resultList.get(0).get("cost")));
                             membRowData.add(String.valueOf(resultList.get(0).get("costMoney")));
                             costTime += (Double)resultList.get(0).get("cost");
-                            moneyCost = totalMoneyCost.add((BigDecimal)resultList.get(0).get("costMoney"));
+                            moneyCost = moneyCost.add((BigDecimal)resultList.get(0).get("costMoney"));
                         }else{
                             membRowData.add("");
                             membRowData.add("");
@@ -2971,7 +2973,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 sumRow.add(totalMoneyCost.toString());
                 allList.add(sumRow);
             }else{
-                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
                 List<Object> projectCategoryNameS = list.stream().map(mp -> mp.get("categoryName")).collect(Collectors.toList());
                 List<Object> projectCategorys = list.stream().map(mp -> mp.get("category")).collect(Collectors.toList());
                 List<String> headList = new ArrayList<String>();
@@ -2980,12 +2982,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     headList.add(String.valueOf(pc)+"/工时");
                     headList.add(String.valueOf(pc)+"/成本");
                 });
+                headList.add("工时/合计");
+                headList.add("成本/合计");
                 allList=new ArrayList<>();
                 allList.add(headList);
                 //统计当前所有项目所有人的时间成本投入
                 List<Map<String, Object>> membList = projectMapper.getProjectCostGroupByCategory(companyId,startDate,endDate, projectCategoryId,userId);
                 for (User user : userList) {
-                    boolean flag=false;
+                    BigDecimal moneyCost = BigDecimal.valueOf(0);
+                    double costTime = 0;
                     List<Map<String, Object>> mapList = membList.stream().filter(mb -> mb.get("creatorId").equals(user.getId())).collect(Collectors.toList());
                     List<String> membRowData=new ArrayList<>();
                     membRowData.add(user.getName());
@@ -2994,18 +2999,22 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         if(resultList.size()>0){
                             membRowData.add(String.valueOf(resultList.get(0).get("cost")));
                             membRowData.add(String.valueOf(resultList.get(0).get("costMoney")));
+                            costTime += (Double)resultList.get(0).get("cost");
+                            moneyCost = moneyCost.add((BigDecimal)resultList.get(0).get("costMoney"));
                         }else{
                             membRowData.add("");
                             membRowData.add("");
                         }
                     }
+                    membRowData.add(""+new BigDecimal(costTime).setScale(1, BigDecimal.ROUND_HALF_UP));
+                    membRowData.add(moneyCost.toString());
                     if(mapList.size()>0){
                         allList.add(membRowData);
                     }
                 }
             }
             //生成excel文件导出
-            String fileName = "项目成本工时统计_"+System.currentTimeMillis();
+            String fileName = "项目分类工时成本统计_"+System.currentTimeMillis();
             String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , allList, path);
             httpRespMsg.data = resp;
         } catch (NullPointerException e) {

+ 7 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -245,7 +245,7 @@
 
     <!--获取个人每个项目分别需要的工时-->
     <select id="getProjectCostGroupByProject" resultType="java.util.Map">
-        SELECT b.id as creatorId,a.creator_id as creatorId,a.project_id as projectId, b.name,a.dept_id as deptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
+        SELECT b.id as creatorId,a.project_id as projectId, b.name,a.dept_id as deptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id
@@ -256,14 +256,17 @@
         <if test="startDate != null and endDate != null">
             AND a.create_date between #{startDate} and #{endDate}
         </if>
-        GROUP BY b.id, a.dept_id,a.project_id
+        <if test="userId != null">
+            AND a.creator_id = #{userId}
+        </if>
+        GROUP BY b.id,a.project_id
         ORDER BY b.id ASC, a.dept_id ASC
     </select>
 
 
     <!--获取个人每个项目分类分别需要的工时-->
     <select id="getProjectCostGroupByCategory" resultType="java.util.Map">
-        SELECT b.id as creatorId,a.creator_id as creatorId,ifnull(c.category_name,'未分类') as categoryName,ifnull(c.category,0) as category, b.name,a.dept_id as deptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
+        SELECT a.creator_id as creatorId,ifnull(c.category_name,'未分类') as categoryName,ifnull(c.category,0) as category, b.name,a.dept_id as deptId, IFNULL(department.department_name, '未分配') as departmentName, SUM(a.working_time) AS cost, SUM(a.cost) AS costMoney
         FROM report AS a
         JOIN user AS b ON a.creator_id = b.id
         left join department on department.department_id = a.dept_id
@@ -278,7 +281,7 @@
         <if test="userId != null">
             AND a.creator_id = #{userId}
         </if>
-        GROUP BY b.id, a.dept_id,c.category
+        GROUP BY b.id,c.category
         ORDER BY b.id ASC, a.dept_id ASC
     </select>
 

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

@@ -30,7 +30,7 @@
     </sql>
 
     <select id="customSelect" resultMap="RichMap">
-        SELECT project_requirement.id, project.id AS project_id, project.`project_name`, project.`project_code`, project_requirement.`memb_req`, project_requirement.`task_req`,project_requirement.start_date,project_requirement.end_date,
+        SELECT project_requirement.id, project.id AS project_id, project.`project_name`, project.`project_code`, project_requirement.`memb_req`, project_requirement.`task_req`,project_requirement.contract_req,project_requirement.department_speed,project_requirement.start_date,project_requirement.end_date,
         (SELECT GROUP_CONCAT(DISTINCT user.`name`) FROM report LEFT JOIN `user` ON user.`id` = report.`creator_id` WHERE report.company_id=#{companyId} AND report.create_time >= #{startDate} AND report.`project_id` = project.id) AS active_users
         FROM project LEFT JOIN project_requirement ON project.id = project_requirement.`project_id`
         WHERE project.`company_id` = #{companyId}

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml

@@ -189,4 +189,16 @@
         </if>
         and task_status = 0 order by task.id desc limit 50
     </select>
+    <select id="selectMilepost" resultType="com.management.platform.entity.Task">
+        select * from task where task.project_id in
+        <foreach collection="list" index="index" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        and task.task_type=1 and task.finish_date in
+        (select MAX(task.finish_date)from task where  task.project_id in
+        <foreach collection="list" index="index" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+         and task.task_type=1   group by project_id) group by task.project_id
+    </select>
 </mapper>

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml

@@ -18,12 +18,14 @@
         <result column="fill_months" property="fillMonths" />
         <result column="custom_degree_active" property="customDegreeActive" />
         <result column="custom_degree_name" property="customDegreeName" />
+        <result column="custom_degree_status" property="customDegreeStatus" />
         <result column="alert_msg" property="alertMsg" />
         <result column="sync_corpwx_time" property="syncCorpwxTime" />
         <result column="need_dept_audit" property="needDeptAudit" />
         <result column="report_workflow" property="reportWorkflow" />
         <result column="custom_data_active" property="customDataActive" />
         <result column="custom_data_name" property="customDataName" />
+        <result column="custom_data_status" property="customDataStatus" />
         <result column="finance_audit" property="financeAudit" />
         <result column="overtime_ratio" property="overtimeRatio" />
         <result column="sync_dingding" property="syncDingding" />
@@ -33,6 +35,7 @@
         <result column="show_corpwx_cardtime" property="showCorpwxCardtime" />
         <result column="custom_text_active" property="customTextActive" />
         <result column="custom_text_name" property="customTextName" />
+        <result column="custom_text_status" property="customTextStatus" />
         <result column="lock_worktime" property="lockWorktime" />
         <result column="fill_overtime" property="fillOvertime" />
         <result column="show_fillaudit_time" property="showFillauditTime" />

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -2,7 +2,7 @@ var path = require('path')
 
 //  var ip = '127.0.0.1'
 // var ip = '192.168.2.9'
-var ip = '192.168.2.39'
+var ip = '192.168.2.30'
 
 // var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
 // for (var i in ifaces) {

+ 15 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue

@@ -84,8 +84,15 @@
           <span>{{scope.row.startDate ? scope.row.startDate + ' ~ ' + scope.row.endDate : ''}}</span>
         </template>
       </el-table-column>
+      <el-table-column label="合同要求" prop="contractReq" min-width="240" show-overflow-tooltip></el-table-column>
+      <el-table-column label="里程碑进度" prop="milepost" min-width="280">
+        <template slot-scope="scope">
+          <span>{{scope.row.milepost ? scope.row.milepost.name + '\u3000完成时间:' + scope.row.milepost.finishDate : ''}}</span>
+        </template>
+      </el-table-column>
       <el-table-column label="人员需求" prop="membReq" min-width="280"></el-table-column>
       <el-table-column label="任务需求" prop="taskReq" min-width="280"></el-table-column>
+      <el-table-column label="参与部门进度" prop="departmentSpeed" min-width="280"></el-table-column>
       <el-table-column label="操作" width="120" align="center" fixed="right">
         <template slot-scope="scope">
           <el-button @click="demandEdit(scope.row)" size="small">修改</el-button>
@@ -129,6 +136,12 @@
       <el-form-item label="任务需求">
         <el-input style="width:350px" v-model="editParameter.taskReq" clearable></el-input>
       </el-form-item>
+      <el-form-item label="合同要求">
+        <el-input style="width:350px" v-model="editParameter.contractReq" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="部门进度">
+        <el-input style="width:350px" v-model="editParameter.departmentSpeed" clearable></el-input>
+      </el-form-item>
     </el-form>
     <div slot="footer" class="dialog-footer">
               <el-button type="default" @click="demandEditDialog = false">取消</el-button>
@@ -305,6 +318,7 @@ export default {
 
       handleSizeChange(val){
         this.pageSize = val
+        this.pageIndex = 1
         this.getDemandList()
       },
       handleCurrentChange(val){
@@ -325,6 +339,7 @@ export default {
         this.editParameter.endDate = this.editDate2
         delete this.editParameter.reStartDate
         delete this.editParameter.reEndDate
+        delete this.editParameter.milepost
         this.http.post('/project-requirement/addOrMod',this.editParameter,
         res => {
           if(res.code == 'ok'){

+ 19 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -224,6 +224,10 @@
             <p style="margin-left:10px;color:#666;">自定义日报填报列表</p>
             <el-switch style="margin-left: 40px" v-model="timeType.customDegreeActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <span style="margin-left:10px;color:#999;">开启后系统可按该字段数据进行分类统计工时成本</span>
+            <template v-if="timeType.customDegreeActive">
+            <el-switch style="margin-left: 40px" v-model="timeType.customDegreeStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
+            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            </template>
         </div>
         <el-row v-if="timeType.customDegreeActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
@@ -244,6 +248,10 @@
             <p style="margin-left:10px;color:#666;"><span>自定义日报填报数值</span></p>
             <el-switch style="margin-left: 40px" v-model="timeType.customDataActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <span style="margin-left:10px;color:#999;">开启后可按项目,部门和人员统计该数值</span>
+            <template v-if="timeType.customDataActive">
+            <el-switch style="margin-left: 40px" v-model="timeType.customDataStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
+            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            </template>
         </div>
         <el-row v-if="timeType.customDataActive && user.company.packageProject==1" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
@@ -262,6 +270,10 @@
             <p style="margin-left:10px;color:#666;"><span>自定义日报填报文本</span></p>
             <el-switch style="margin-left: 40px" v-model="timeType.customTextActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
             <span style="margin-left:10px;color:#999;">开启后可员工可额外填写该信息</span>
+            <template v-if="timeType.customTextActive">
+            <el-switch style="margin-left: 40px" v-model="timeType.customTextStatus" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
+            <span style="margin-left:10px;color:#999;">是否为必填项</span>
+            </template>
         </div>
         <el-row v-if="timeType.customTextActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
@@ -891,6 +903,10 @@
                             }
                         }
                         delete param.userList
+                        param.customTextStatus = param.customTextStatus && param.customTextActive ? 1 : 0
+                        param.customDegreeStatus = param.customDegreeStatus && param.customDegreeActive ? 1 : 0
+                        param.customDataStatus = param.customDataStatus && param.customDataActive ? 1 : 0
+                        
                         // console.log(param, '将要提交的值')
                         // return
                         this.http.post('/time-type/save',param,
@@ -933,6 +949,9 @@
                             this.timeType = res.data;
                             this.timeType.fillOvertime = this.timeType.fillOvertime ? true : false
                             this.timeType.lockWorktime = this.timeType.lockWorktime ? true : false
+                            this.timeType.customTextStatus = this.timeType.customTextStatus ? true : false
+                            this.timeType.customDegreeStatus = this.timeType.customDegreeStatus ? true : false
+                            this.timeType.customDataStatus = this.timeType.customDataStatus ? true : false
                             this.timeChange();
                             let userlist = res.data.userList
                             this.whiteList = []

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

@@ -374,18 +374,18 @@
                         </el-select>
                     </el-form-item>
                     <!-- 相关维度/自定义维度 -->
-                    <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1">
+                    <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1" :rules="user.timeType.customDegreeStatus == 1 && domain.wuduList.length != 0 ? { required: true, message: '请选择' + yonghuUser.customDegreeName, trigger: ['change','blur'] } : {}" :prop="'domains.' + index + '.degreeId'">
                         <el-select v-model="domain.degreeId" clearable placeholder="请选择" :disabled="!canEdit">
                             <el-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                             </el-option>
                         </el-select>
                     </el-form-item>
                     <!-- 相关数值 -->
-                    <el-form-item :label="yonghuUser.customDataName" v-if="yonghuUser.customDataActive == 1">
+                    <el-form-item :label="yonghuUser.customDataName" v-if="yonghuUser.customDataActive == 1" :prop="'domains.' + index + '.customData'" :rules="user.timeType.customDataStatus == 1 ? { required: true, message: '请选择' + yonghuUser.customDataName, trigger: ['change','blur'] } : {}">
                         <el-input-number :id="'numberData_'+index" :disabled="!canEdit" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                     </el-form-item>
                     <!-- 自定义文本 -->
-                    <el-form-item :label="yonghuUser.customTextName + '123'" v-if="yonghuUser.customTextActive == 1">
+                    <el-form-item :label="yonghuUser.customTextName" v-if="yonghuUser.customTextActive == 1" :prop="'domains.' + index + '.customText'" :rules="user.timeType.customTextStatus == 1 ? { required: true, message: '请填写' + yonghuUser.customTextName, trigger: ['change','blur'] } : {}">
                         <el-input :disabled="!canEdit" v-model="domain.customText" style="width:75%;margin-right:7%" maxlength="25" show-word-limit></el-input>
                     </el-form-item>
                     <el-form-item v-if="reportTimeType.type == 3" label="用时占比" :prop="'domains.' + index + '.'+timeFields[reportTimeType.type]"
@@ -493,18 +493,18 @@
                             </span>
                         </el-form-item>
                         <!-- 相关维度 -->
-                        <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1">
+                        <el-form-item :label="yonghuUser.customDegreeName" v-if="domain.projectId && yonghuUser.customDegreeActive == 1" :rules="user.timeType.customDegreeStatus == 1 && domain.wuduList.length != 0 ? { required: true, message: '请选择' + yonghuUser.customDegreeName, trigger: ['change','blur'] } : {}" :prop="'domains.' + index + '.degreeId'">
                             <el-select v-model="domain.degreeId" clearable placeholder="请选择">
                                 <el-option v-for="item in domain.wuduList" :key="item.value" :label="item.name" :value="item.id">
                                 </el-option>
                             </el-select>
                         </el-form-item>
                         <!-- 相关数值 -->
-                        <el-form-item :label="yonghuUser.customDataName" v-if="domain.projectId && yonghuUser.customDataActive == 1">
+                        <el-form-item :label="yonghuUser.customDataName" v-if="domain.projectId && yonghuUser.customDataActive == 1" :prop="'domains.' + index + '.customData'" :rules="user.timeType.customDataStatus == 1 ? { required: true, message: '请选择' + yonghuUser.customDataName, trigger: ['change','blur'] } : {}">
                             <el-input-number :id="'numberData_'+index" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                         </el-form-item>
                         <!-- 自定义文本 -->
-                        <el-form-item :label="yonghuUser.customTextName" v-if="yonghuUser.customTextActive == 1">
+                        <el-form-item :label="yonghuUser.customTextName" v-if="yonghuUser.customTextActive == 1" :prop="'domains.' + index + '.customText'" :rules="user.timeType.customTextStatus == 1 ? { required: true, message: '请填写' + yonghuUser.customTextName, trigger: ['change','blur'] } : {}">
                             <el-input :disabled="!canEdit" v-model="domain.customText" style="width:75%;margin-right:7%" maxlength="25" show-word-limit></el-input>
                         </el-form-item>
                         <!--项目管理专业版模式下,项目下的近期执行的任务 -->
@@ -3678,23 +3678,6 @@
             guanbi() {
                 this.falsss = false
             },
-            // wuduLists(id) {
-            //     this.http.post('/project/getDegreeList',{ 
-            //         projectId: id,
-            //     },
-            //     res => {
-            //         if (res.code == "ok") {
-            //             return res.data
-            //         } 
-            //     },
-            //     error => {
-            //         this.$message({
-            //             message: error,
-            //             type: "error"
-            //         });
-            //         }
-            //     );
-            // },
 
             // 打开日报填写
             fillInReport(i, isBatch) {
@@ -3826,13 +3809,33 @@
             // 按周填报里内容的填写点击确定
             btnTianxiaes() {
                 if (this.zhoBao.projectAuditorId) {
-                    this.tianxieDialogVisible = false
-                    var zhong = this.zhoData
-                    zhong[this.zhoBaoIdx][this.zhoBaoName] = this.zhoBao
-                    this.zhoData = zhong
-                    if(this.reportTimeType.type == 1) this.zhoXuan(this.zhoBao, this.zhoBaoIdx)
-                    if(this.reportTimeType.type == 2) this.zhoTimes(this.zhoBao, this.zhoBaoIdx)
-                    if(this.reportTimeType.type == 3) this.addBli(this.zhoBao, this.zhoBaoIdx)
+                    
+                    let errtips = ''
+                    if(this.user.timeType.customDegreeStatus == 1 && this.zhoBao.wuduList.length != 0 && !this.zhoBao.degreeId) {
+                        errtips += this.user.timeType.customDegreeName + '、'
+                    }
+                    if(this.user.timeType.customDataStatus == 1 && !this.zhoBao.customData){
+                        errtips += this.user.timeType.customDataName + '、'
+                    }
+                    if(this.user.timeType.customTextStatus == 1 && !this.zhoBao.customText){
+                        errtips += this.user.timeType.customTextName + '、'
+                    }
+                    if(errtips != ''){
+                        errtips = errtips.substring(0,errtips.length - 1)
+                        this.$message({
+                            message: '请对' + errtips + '进行填写',
+                            type: 'error'
+                        })
+                    }else {
+                        this.tianxieDialogVisible = false
+                        var zhong = this.zhoData
+                        zhong[this.zhoBaoIdx][this.zhoBaoName] = this.zhoBao
+                        this.zhoData = zhong
+                        if(this.reportTimeType.type == 1) this.zhoXuan(this.zhoBao, this.zhoBaoIdx)
+                        if(this.reportTimeType.type == 2) this.zhoTimes(this.zhoBao, this.zhoBaoIdx)
+                        if(this.reportTimeType.type == 3) this.addBli(this.zhoBao, this.zhoBaoIdx)
+                    }
+                    
                 } else {
                     this.$message({
                         message: '请选择审核人',

+ 94 - 91
fhKeeper/formulahousekeeper/timesheet_h5/package-lock.json

@@ -1694,7 +1694,8 @@
         },
         "ansi-regex": {
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
         "semver": {
@@ -1812,9 +1813,63 @@
         },
         "ansi-regex": {
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "emojis-list": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "minimist": {
           "version": "1.2.5",
           "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
@@ -1844,6 +1899,41 @@
           "requires": {
             "ansi-regex": "^5.0.0"
           }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          },
+          "dependencies": {
+            "chalk": {
+              "version": "4.1.2",
+              "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+              "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+              }
+            }
+          }
         }
       }
     },
@@ -12025,94 +12115,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
-          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-router": {
       "version": "3.5.1",
       "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1617697843139&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
@@ -13064,7 +13066,8 @@
       "dependencies": {
         "ansi-regex": {
           "version": "5.0.0",
-          "resolved": "",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
         "cliui": {

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

@@ -77,17 +77,15 @@
 
 
                     <!-- 相关维度 -->
-                    <van-field :value="item.weiduName" v-if="item.projectId && user.timeType.customDegreeActive == 1"  readonly  name="id" clickable :label="user.timeType.customDegreeName" placeholder="请选择" @click="clickPickers(index)"/>
+                    <van-field :value="item.weiduName" v-if="item.projectId && user.timeType.customDegreeActive == 1"  readonly  name="id" clickable :label="user.timeType.customDegreeName" placeholder="请选择" @click="clickPickers(index,item)"/>
                     <van-popup v-model="item.showPickDegree" position="bottom">
                         <van-picker show-toolbar :columns="item.wuduList" value-key="name" @confirm="choseProjects" @cancel="item.showPickDegree = false;$forceUpdate()" />
                     </van-popup>
 
                     <!-- 自定义数值 -->
-                    <van-field v-if="user.timeType.customDataActive==1" type="number" :disabled="!canEdit" v-model="item.customData" :label="user.timeType.customDataName" 
-                         placeholder="请输入数字" ></van-field> 
+                    <van-field v-if="user.timeType.customDataActive==1" type="number" :disabled="!canEdit" v-model="item.customData" :label="user.timeType.customDataName" placeholder="请输入数字" :rules="user.timeType.customDataStatus ? [{ required: true, message: '请选择' + user.timeType.customDataName }] : []"></van-field> 
                     <!-- 自定义文本 -->
-                    <van-field v-if="user.timeType.customTextActive==1" :disabled="!canEdit" v-model="item.customText" :label="user.timeType.customTextName" 
-                         placeholder="请输入" maxlength="25"></van-field> 
+                    <van-field v-if="user.timeType.customTextActive==1" :disabled="!canEdit" v-model="item.customText" :label="user.timeType.customTextName" placeholder="请输入" maxlength="25" :rules="user.timeType.customTextStatus ? [{ required: true, message: '请选择' + user.timeType.customTextName }] : []"></van-field> 
 
                     <van-cell title="专业进度" v-if="user.company.packageEngineering == 1">
                     </van-cell>
@@ -474,6 +472,7 @@
                 //清空分组和阶段
                 domainItem.stage = null;
                 domainItem.groupId = null;
+                domainItem.weiduName = null;
 
                 this.showPickerUserddp = false;
                 //获取子项目
@@ -488,7 +487,7 @@
 
                 // 获取1相关维度
                 this.getTaskList(domainItem.projectId)
-
+                this.dimension(domainItem.projectId)
                 //获取相关日报提交选择人
                 domainItem.projectAuditorId = null;
                 domainItem.projectAuditorName = null;
@@ -1020,6 +1019,8 @@
                 // console.log(i, item, this.form)
                 this.proIdx = i
                 this.showPickerUserddp = true
+                // console.log(item);
+                // this.dimension()
                 // this.$router.push({
                 //     path: '/search',
                 //     query: {
@@ -1029,12 +1030,14 @@
                 //     }
                 // });
             },
-            clickPickers(i) {
+            clickPickers(i,item) {
+                console.log('wudulist',item.wuduList);
                 if (!this.canEdit) return;
                 this.clickIndex = i;
-                this.form.domains[this.clickIndex].showPickDegree = true;
-                var proId = this.form.domains[this.clickIndex].projectId
-                this.dimension(proId)
+                // item.showPickDegree = true;
+                this.$set(item,'showPickDegree',true)
+                // var proId = this.form.domains[this.clickIndex].projectId
+                // this.dimension(proId)
             },
             //选择任务
             clickPickerTask(i) {
@@ -1055,10 +1058,12 @@
 
             choseProjects(value, index) {
                 // console.log(value)
+                if(value){
                 this.form.domains[this.clickIndex].weiduName = value.name;
                 this.form.domains[this.clickIndex].degreeId = value.id;
+                
+                this.$forceUpdate();}
                 this.form.domains[this.clickIndex].showPickDegree = false;
-                this.$forceUpdate();
             },
 
             choseSubProject(value, index) {
@@ -1318,7 +1323,13 @@
                         if(this.form.domains[i].degreeId) {
                             formData.append("degreeId", this.form.domains[i].degreeId);
                         } else {
-                            formData.append("degreeId", -1);
+                            if(this.user.timeType.customDegreeStatus && this.form.domains[i].wuduList.length){
+                                this.$toast.fail('请选择' + this.user.timeType.customDegreeName)
+                                return
+                            }else{
+                                formData.append("degreeId", -1);
+                            }
+                            
                         }
                     } else {
                         formData.append("degreeId", -1);

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

@@ -3,7 +3,7 @@ const pxtorem = require("postcss-pxtorem");
 const path = require('path');
 const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 
-var ip = '192.168.2.39'
+var ip = '192.168.2.30'
 // var ip = '127.0.0.1'
 // var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
 // for (var i in ifaces) {