Forráskód Böngészése

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

Lijy 2 éve
szülő
commit
a0daa37515
14 módosított fájl, 246 hozzáadás és 116 törlés
  1. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  2. 40 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  3. 14 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  4. 7 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  5. 10 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  6. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  7. 29 20
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java
  8. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  9. 3 0
      fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue
  10. 37 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/TimeType.java
  11. 7 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml
  12. 4 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  13. 26 24
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  14. 60 45
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

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

@@ -471,7 +471,7 @@ public class ReportController {
                         return msg;
                     }
 
-                    List<LocalDate> workDaysListInRange = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate);
+                    List<LocalDate> workDaysListInRange = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, comTimeType.getIncludeWeekends());
                     if (workDaysListInRange.size() == 0) {
                         HttpRespMsg msg = new HttpRespMsg();
                         msg.setError("工作日天数为0,无法提交。(批量填报会自动跳过节假日,请尝试填写日报或者重新选择日期范围)");
@@ -1198,12 +1198,13 @@ public class ReportController {
                 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                 LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
                 LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+                TimeType timeType = timeTypeMapper.selectById(byId.getCompanyId());
                 //时间间隔不得超过365天
                 long until = localStartDate.until(localEndDate, ChronoUnit.DAYS);
                 if (until > 365) {
                     msg.setError("日期间隔不得超过365天");
                 } else {
-                    msg.data = WorkDayCalculateUtils.getWorkDaysCountInRange(startDate, endDate);
+                    msg.data = WorkDayCalculateUtils.getWorkDaysCountInRange(startDate, endDate, timeType.getIncludeWeekends());
                 }
             }
         }

+ 40 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -1782,6 +1782,9 @@ public class WeiXinCorpController {
             }
         }
 
+        //更新人员的deptcascade
+        updateUserDeptCascade(companyId);
+
         return new HttpRespMsg();
     }
 
@@ -1938,8 +1941,7 @@ public class WeiXinCorpController {
                         .setRoleId(defaultRole.getId())
                         .setRoleName(defaultRole.getRolename())
                         .setCompanyId(companyId)
-                        .setDepartmentId(departmentId)
-                        .setPhone(userJson.getString("mobile"))
+                        .setDepartmentId(departmentId).setPhone(userJson.getString("mobile"))
                         .setName(userJson.getString("name"))
                         .setCorpwxUserid(curUserid)
                         .setColor(ColorUtil.randomColor());
@@ -2193,6 +2195,42 @@ public class WeiXinCorpController {
         return msg;
     }
 
+    //更新用户部门的层级结构
+    @RequestMapping("/updateUserDeptCascade")
+    public HttpRespMsg updateUserDeptCascade(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id, name, department_id").eq("company_id", companyId));
+        List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+        List<User> updateList = new ArrayList<>();
+        for (User user : userList) {
+            User u = new User();
+            u.setId(user.getId());
+            u.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
+            updateList.add(u);
+        }
+        userService.updateBatchById(updateList);
+        return msg;
+    }
+
+    //将部门id转换为部门层级
+    private String convertDepartmentIdToCascade(Integer id, List<Department> allDeptList) {
+        StringBuilder cascade = new StringBuilder();
+        if (id == 0) {
+            cascade.append("0");
+        } else {
+            cascade.append(id);
+            id = findById(id, allDeptList).getSuperiorId();
+            while (id != null) {
+                cascade.append(",").append(id);
+                id = findById(id, allDeptList).getSuperiorId();
+            }
+        }
+        return cascade.toString();
+    }
+
+    private Department findById(int id, List<Department> allList) {
+        return allList.stream().filter(all->all.getDepartmentId().intValue() == id).findFirst().get();
+    }
 
     private boolean judgeIsLeader(String userId) {
         int cnt = projectAuditorMapper.selectCount(new QueryWrapper<ProjectAuditor>().eq("auditor_id", userId));

+ 14 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -1,23 +1,23 @@
 package com.management.platform.entity;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
+import java.math.BigDecimal;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
 /**
  * <p>
  * 
  * </p>
  *
  * @author Seyason
- * @since 2022-08-05
+ * @since 2022-08-07
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -314,9 +314,15 @@ public class TimeType extends Model<TimeType> {
     @TableField("user_custom_static")
     private Integer userCustomStatic;
 
+    /**
+     * 批量填报是否包含节假日;0-不包含,1-包含
+     */
+    @TableField("include_weekends")
+    private Integer includeWeekends;
+
     @TableField(exist = false)
     private List<User> userList;
-
+    
     @Override
     protected Serializable pkVal() {
         return this.companyId;

+ 7 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -259,16 +259,16 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         return departmentMapper.selectCount(new QueryWrapper<Department>().eq("superior_id", id)) > 0;
     }
 
-    private void fillSubDepartmentList(List<Department> allDepts, DepartmentVO parentDept) {
+    private void fillSubDepartmentList(List<Department> allDepts, DepartmentVO parentDept, List<DepartmentOtherManager> otherManagerList) {
         Integer id = parentDept.getId();
         List<Department> collect = allDepts.stream().filter(all -> all.getSuperiorId() != null && all.getSuperiorId().intValue() == id).collect(Collectors.toList());
         List<DepartmentVO> subResult = new ArrayList<>();
         if (collect.size() > 0) {
             collect.forEach(c->{
-                DepartmentVO vo = formatDepartmentToVO(c);
+                DepartmentVO vo = formatDepartmentToVO(c, otherManagerList);
                 subResult.add(vo);
                 //继续添加当前部门的子部门
-                fillSubDepartmentList(allDepts, vo);
+                fillSubDepartmentList(allDepts, vo, otherManagerList);
             });
         }
         if (subResult.size() > 0) {
@@ -285,13 +285,14 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
             List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>()
                     .eq("company_id", companyId));
+            List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("company_id", companyId));
             //结果列表
             List<DepartmentVO> list = new ArrayList<>();
             List<Department> rootDepartments = departmentList.stream().filter(dept -> dept.getSuperiorId() == null).collect(Collectors.toList());
             rootDepartments.forEach(root->{
-                DepartmentVO rootDeptVO = formatDepartmentToVO(root);
+                DepartmentVO rootDeptVO = formatDepartmentToVO(root, departmentOtherManagerList);
                 list.add(rootDeptVO);
-                fillSubDepartmentList(departmentList, rootDeptVO);
+                fillSubDepartmentList(departmentList, rootDeptVO, departmentOtherManagerList);
             });
             //返回数据
             httpRespMsg.data = list;
@@ -303,8 +304,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     }
 
     //将部门PO转化为部门VO
-    private DepartmentVO formatDepartmentToVO(Department department) {
-        List<DepartmentOtherManager> departmentOtherManagerList = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("company_id", department.getCompanyId()));
+    private DepartmentVO formatDepartmentToVO(Department department, List<DepartmentOtherManager> departmentOtherManagerList) {
         List<String> collect = departmentOtherManagerList.stream().filter(dm -> dm.getDepartmentId().equals(department.getDepartmentId())).map(vo -> vo.getOtherManagerId()).collect(Collectors.toList());
         //这俩东西并没有继承关系
         return new DepartmentVO()

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

@@ -64,6 +64,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     public String TEMPLATE_REPORT_PASS;
     @Value("${wx.template_report_reject}")
     public String TEMPLATE_REPORT_REJECT;
+    @Value("${configEnv.isDev}")
+    public boolean isDev;
 
     @Value("${wx.app_id}")
     public String appId;
@@ -1451,6 +1453,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     public boolean pushReject(String str, User user, String rejectUsername, String reason) {
+        if (isDev) return true;
         //1,配置
         WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
         wxStorage.setAppId(appId);
@@ -1484,6 +1487,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
 
     public boolean pushPass(String projectName, User user) {
+        if (isDev) return true;
         //1,配置
         WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
         wxStorage.setAppId(appId);
@@ -1583,9 +1587,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 Report upR = new Report();
                 upR.setId(r.getId());
                 upR.setGroupAuditState(0);
-                String inchargerId = taskGroupMapper.selectById(r.getGroupId()).getInchargerId();
-                upR.setProjectAuditorId(inchargerId);
-                upR.setProjectAuditorName(userMapper.selectById(inchargerId).getName());
+                System.out.println("groupId=="+r.getGroupId());
+                if (r.getGroupId() != 0) {
+                    String inchargerId = taskGroupMapper.selectById(r.getGroupId()).getInchargerId();
+                    upR.setProjectAuditorId(inchargerId);
+                    upR.setProjectAuditorName(userMapper.selectById(inchargerId).getName());
+                }
                 newList.add(upR);
             }
             updateBatchById(newList);

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -679,6 +679,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         try {
             User creator = userMapper.selectById(request.getHeader("Token"));
+            if (name != null) name = name.trim();
+            if (phone != null) phone = phone.trim();
             //处理时薪
             BigDecimal costValue = cost == null ? BigDecimal.valueOf(0) : BigDecimal.valueOf(cost);
             BigDecimal monthCostValue = (monthCost == null ? BigDecimal.valueOf(0) : BigDecimal.valueOf(monthCost));
@@ -981,6 +983,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 if (StringUtils.isEmpty(name)) {
                     continue;
                 }
+                name = name.trim();
                 Integer deptId;
                 String deptCascade;
                 if (StringUtils.isEmpty(dept)) {
@@ -1026,6 +1029,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     phoneList.add(phone);
                 }
 
+
                 userList.add(new User()
                         .setId(id.toString())
                         .setName(name)

+ 29 - 20
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WorkDayCalculateUtils.java

@@ -97,14 +97,14 @@ public class WorkDayCalculateUtils {
      * @param endDate
      * @return
      */
-    public static List<LocalDate> getWorkDaysListInRange(String startDate, String endDate) {
+    public static List<LocalDate> getWorkDaysListInRange(String startDate, String endDate, int includeWeekends) {
         int daysOffset = 0;
         LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
         LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
         List<LocalDate> list = new ArrayList<>();
         while(true) {
             localStartDate = localStartDate.plusDays(daysOffset);
-            if (isWorkDay(localStartDate)) {
+            if (includeWeekends == 1 || isWorkDay(localStartDate)) {
                 list.add(localStartDate);
             }
             //到达结束日期,结束计算
@@ -125,28 +125,37 @@ public class WorkDayCalculateUtils {
      * @param endDate
      * @return
      */
-    public static int getWorkDaysCountInRange(String startDate, String endDate) {
-        int daysOffset = 0;
-        if (startDate.compareTo(endDate) > 0) {
-            return -1;
-        }
+    public static int getWorkDaysCountInRange(String startDate, String endDate, int includeWeekend) {
+        int count = 0;
         LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
         LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
-        int count = 0;
-        while(true) {
-            localStartDate = localStartDate.plusDays(daysOffset);
-            if (isWorkDay(localStartDate)) {
-                count++;
-            }
-            //到达结束日期,结束计算
-            if (localStartDate.isEqual(localEndDate)) {
-                break;
+
+        if (includeWeekend == 0) {
+            //不含周末节假日
+            int daysOffset = 0;
+            if (startDate.compareTo(endDate) > 0) {
+                return -1;
             }
-            //每次加一天
-            if (daysOffset == 0) {
-                daysOffset = 1;
+
+            while(true) {
+                localStartDate = localStartDate.plusDays(daysOffset);
+                if (isWorkDay(localStartDate)) {
+                    count++;
+                }
+                //到达结束日期,结束计算
+                if (localStartDate.isEqual(localEndDate)) {
+                    break;
+                }
+                //每次加一天
+                if (daysOffset == 0) {
+                    daysOffset = 1;
+                }
             }
+        } else {
+            //全部日期
+            count = (int)(localEndDate.toEpochDay() - localStartDate.toEpochDay() + 1);
         }
+
         return count;
     }
 
@@ -202,6 +211,6 @@ public class WorkDayCalculateUtils {
 
 
     public static void main(String[] args) {
-        System.out.println(getWorkDaysCountInRange("2019-01-01","2019-12-31"));
+        System.out.println(getWorkDaysCountInRange("2022-08-06","2022-08-08", 1));
     }
 }

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 3 - 0
fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue

@@ -197,6 +197,7 @@
                 <el-form-item><el-checkbox v-model="dialogData.onlyImportreport">是否仅使用导入日报审核(不要项目审核)</el-checkbox></el-form-item>
                 <el-form-item><el-checkbox v-model="dialogData.projectLevelState">是否开启项目级别自定义</el-checkbox></el-form-item>
                 <el-form-item><el-checkbox v-model="dialogData.outputValueStatus">是否开启项目产值字段</el-checkbox></el-form-item>
+                <el-form-item><el-checkbox v-model="dialogData.takePhoto">是否开启拍照上传功能</el-checkbox></el-form-item>
                 <el-form-item>
                     日报审核模式:
                     <el-select v-model="dialogData.reportAuditType" size="small">
@@ -341,6 +342,7 @@
                             this.$set(this.dialogData,'onlyImportreport',res.data.onlyImportreport ? true : false)
                             this.$set(this.dialogData,'projectLevelState',res.data.projectLevelState ? true : false)
                             this.$set(this.dialogData,'outputValueStatus',res.data.outputValueStatus ? true : false)
+                            this.$set(this.dialogData,'takePhoto',res.data.takePhoto ? true : false)
                             this.$set(this.dialogData,'reportAuditType',res.data.reportAuditType)
                         }else{
                             this.$message({
@@ -589,6 +591,7 @@
                     onlyImportreport: this.dialogData.onlyImportreport ? 1 : 0,
                     projectLevelState: this.dialogData.projectLevelState ? 1 : 0,
                     outputValueStatus: this.dialogData.outputValueStatus ? 1 : 0,
+                    // takePhoto: this.dialogData.takePhoto ? 1 : 0,
                     reportAuditType: this.dialogData.reportAuditType
                 },res => {
                     if(res.code == 'ok'){

+ 37 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-07-25
+ * @since 2022-08-07
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -156,6 +156,18 @@ public class TimeType extends Model<TimeType> {
     @TableField("custom_data_status")
     private Integer customDataStatus;
 
+    /**
+     * 工时填报数值收集字段最大值是否限制 0-否 1-是
+     */
+    @TableField("custom_data_max_status")
+    private Integer customDataMaxStatus;
+
+    /**
+     * 工时填报数值收集字段最大值限制
+     */
+    @TableField("custom_data_max_value")
+    private Integer customDataMaxValue;
+
     /**
      * 财务成本导入是否需要审核
      */
@@ -282,6 +294,30 @@ public class TimeType extends Model<TimeType> {
     @TableField("project_level_state")
     private Integer projectLevelState;
 
+    /**
+     * 0-未开启 1-开启
+     */
+    @TableField("need_evaluate")
+    private Integer needEvaluate;
+
+    /**
+     * 0-未开启 1-开启
+     */
+    @TableField("output_value_status")
+    private Integer outputValueStatus;
+
+    /**
+     * 0-未开启 1-开启
+     */
+    @TableField("user_custom_static")
+    private Integer userCustomStatic;
+
+    /**
+     * 批量填报是否包含节假日;0-不包含,1-包含
+     */
+    @TableField("include_weekends")
+    private Integer includeWeekends;
+
 
     @Override
     protected Serializable pkVal() {

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 7 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml


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

@@ -2923,7 +2923,8 @@ a {
                         chosenLeaders:[],
                         category:null,
                         creatorId: this.user.id,
-                        projectMainId: ''
+                        projectMainId: '',
+                        outputValue: ''
                     }
                     if(this.user.companyId == '936') {
                         this.$set(this.addForm, 'contractCode', '')
@@ -2979,7 +2980,8 @@ a {
                         category:item.category,
                         projectDesc: item.projectDesc,
                         projectMainId: item.projectMainId,
-                        creatorId: item.creatorId
+                        creatorId: item.creatorId,
+                        outputValue: item.outputValue
                     }
 
                     // 判断公司id是否等于936

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

@@ -2838,7 +2838,7 @@
                 this.$forceUpdate();
             },
 
-            getGroupStages(domain, index) {
+            getGroupStages(domain, index, keepStage) {
                 // console.log(domain);
                 if(!domain.groupId){
                     domain.projectAuditorId = ''
@@ -2852,7 +2852,9 @@
                 this.http.post("/stages/getProjectStagesByGroup", {groupId: domain.groupId},
                     res => {
                         if (res.code == "ok") {
-                            domain.stage = '';
+                            if (!keepStage) {
+                                domain.stage = '';
+                            }
                             domain.stages = res.data;
                             this.$forceUpdate();
                         }
@@ -3979,16 +3981,21 @@
                 sss.con = item.con
                 sss.progress = item.progress
                 sss.time = item.time
+                sss.groupId = item.groupId
+                sss.stage = item.stage;
                 sss.workingTime = item.workingTime
                 sss.projectAuditorId = item.projectAuditorId;
                 if (this.timeBasecostList && this.timeBasecostList.length > 0) {
                     //默认选中第一个
                     sss.basecostId = this.timeBasecostList[0].id;
                 }
+                
                 var that = this
                 setTimeout(() =>{
+                    var isFirstEdit = false;
                     if(Object.keys(item).length < 5) {
-                        // console.log(456)
+                        //首次点开当前的这个cell,初始化数据
+                        isFirstEdit = true;
                         sss.subProjectId = that.workForm.domains[0].subProjectId
                         sss.stage = that.workForm.domains[0].stage
                         sss.subProjectList = that.workForm.domains[0].subProjectList
@@ -4002,6 +4009,8 @@
                         sss.stages = item.stages
                         sss.taskGroups = item.taskGroups;
                         sss.auditUserList = obj.auditUserList;
+                        sss.degreeId = item.degreeId;
+                        sss.customData = item.customData;
                     }
                     if (sss.auditUserList != null && sss.auditUserList.length==1) {
                         //只有一个审核人,自动设置上去
@@ -4013,30 +4022,16 @@
                     that.zhoBaoName = names
                     that.zhoBao = sss
                     that.zhis = row
+                    if (sss.groupId) {
+                        //最后一个参数表示是否保留stage的值,不要重置为空
+                        this.getGroupStages(that.zhoBao, 0, !isFirstEdit)
+                    }
                     that.$forceUpdate();
-                },500);
-                // if(Object.keys(sss).length <= 4) {
-                //     sss.subProjectId = this.workForm.domains[0].subProjectId
-                //     sss.stage = this.workForm.domains[0].stage
-                //     sss.subProjectList = this.workForm.domains[0].subProjectList
-                //     sss.stages = this.workForm.domains[0].stages
-                // } else {
-                //     sss.subProjectId = item.subProjectId
-                //     sss.stage = item.stage
-                //     sss.subProjectList = item.subProjectList
-                //     sss.stages = item.stages
-                // }
-                // console.log(sss, '数据')
-                // this.zhoBaoIdx = i
-                // this.zhoBaoName = names
-                // this.zhoBao = sss
-                // this.zhis = row
-                // this.selectProject(row[0], i)
+                },600);
             },
             // 按周填报里内容的填写点击确定
             btnTianxiaes() {
                 if (this.zhoBao.projectAuditorId) {
-                    
                     let errtips = ''
                     if(this.user.timeType.customDegreeStatus == 1 && this.zhoBao.wuduList.length != 0 && !this.zhoBao.degreeId) {
                         errtips += this.user.timeType.customDegreeName + '、'
@@ -4057,8 +4052,6 @@
                             type: 'warning'
                         })
                     }else {
-
-
                         this.tianxieDialogVisible = false
                         var zhong = this.zhoData
                         zhong[this.zhoBaoIdx][this.zhoBaoName] = this.zhoBao
@@ -4557,6 +4550,9 @@
                                     formData.append("content", zhiZhi)
                                     formData.append("isOvertime", 0)
                                     formData.append("professionProgress", "[]")
+                                    if (zhoD[j].groupId) {
+                                        formData.append("groupId",zhoD[j].groupId)
+                                    }
                                     zhoD[j].stage ? formData.append("stage", zhoD[j].stage) : formData.append("stage", '');
                                     formData.append("createDate",zhoD.zhoDataTime)
                                     if (zhoD[j].projectAuditorId) {
@@ -4609,6 +4605,9 @@
                                         zhoD[j].con == '' || zhoD[j].con == null ? formData.append("content", '-') : formData.append("content", zhoD[j].con)
                                         formData.append("isOvertime", 0)
                                         formData.append("professionProgress", "[]")
+                                        if (zhoD[j].groupId) {
+                                            formData.append("groupId",zhoD[j].groupId)
+                                        }
                                         zhoD[j].stage ? formData.append("stage", zhoD[j].stage) : formData.append("stage", '');
                                         formData.append("createDate",zhoD.zhoDataTime)
                                         if (zhoD[j].projectAuditorId) {
@@ -4664,6 +4663,9 @@
                                         zhoD[j].con == '' || zhoD[j].con == null ? formData.append("content", '-') : formData.append("content", zhoD[j].con)
                                         formData.append("isOvertime", 0)
                                         formData.append("professionProgress", "[]")
+                                        if (zhoD[j].groupId) {
+                                            formData.append("groupId",zhoD[j].groupId)
+                                        }
                                         zhoD[j].stage ? formData.append("stage", zhoD[j].stage) : formData.append("stage", '');
                                         formData.append("createDate",zhoD.zhoDataTime)
                                         if (zhoD[j].projectAuditorId) {

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

@@ -29,7 +29,7 @@
                 @click="copyProject(index)" style="border: 1px solid #20a0ff;padding:5px;"
                  icon="plus" type="default" ><span style="color:#666;padding: 0 5px;">复制项目</span></van-tag> -->
                 
-                <van-tag v-if="index>0&&canEdit" color="#fff" 
+                <van-tag v-if="index>0&&item.canEdit" color="#fff" 
                 @click="delPro(index)" style="border: 1px solid #ff0000;padding:5px;margin-left:10px;"
                  icon="plus" type="default" ><span style="color:#666;padding: 0 5px;">删除</span></van-tag>
                 </div>
@@ -91,13 +91,13 @@
                     </van-popup>
 
                     <!-- 自定义数值 -->
-                    <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 == 1 ? [{ required: true, message: '请输入' + user.timeType.customDataName }] : []"></van-field> 
+                    <van-field v-if="user.timeType.customDataActive==1" type="number" :disabled="!item.canEdit" v-model="item.customData" :label="user.timeType.customDataName" placeholder="请输入数字" :rules="user.timeType.customDataStatus == 1 ? [{ 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="1000" :rules="user.timeType.customTextStatus ? [{ required: true, message: '请选择' + user.timeType.customTextName }] : []" rows="2" type="textarea" show-word-limit autosize></van-field> 
+                    <van-field v-if="user.timeType.customTextActive==1" :disabled="!item.canEdit" v-model="item.customText" :label="user.timeType.customTextName" placeholder="请输入" maxlength="1000" :rules="user.timeType.customTextStatus ? [{ required: true, message: '请选择' + user.timeType.customTextName }] : []" rows="2" type="textarea" show-word-limit autosize></van-field> 
 
                     <van-cell title="专业进度" v-if="user.company.packageEngineering == 1">
                     </van-cell>
-                    <van-field :disabled="!canEdit"
+                    <van-field :disabled="!item.canEdit"
                         type="number"  :name="'progress_'+pItem.professionId" input-align="right"  
                         v-for="pItem in item.professionProgress" :key="pItem.professionId"
                         :label="'--    '+pItem.professionName"  
@@ -106,11 +106,11 @@
                         <van-stepper v-model="pItem.progress" integer min="0" max="100" />%
                     </template>
                     </van-field>
-                    <van-field v-if="user.company.packageProject == 1"  readonly name="taskId" :value="item.taskName" label="关联任务" placeholder="请选择关联任务" @click="clickPickerTask(index)"
+                    <van-field v-if="user.company.packageProject == 1"  readonly name="taskId" :value="item.taskName" label="关联任务" placeholder="请选择关联任务" @click="clickPickerTask(index,item)"
                     ></van-field>
                     <van-field name="taskFinish" label="是否已完成" v-if="item.taskId != null">
                         <template #input>
-                            <van-checkbox :disabled="!canEdit" v-model="item.taskFinish" shape="square">已完成</van-checkbox>
+                            <van-checkbox :disabled="!item.canEdit" v-model="item.taskFinish" shape="square">已完成</van-checkbox>
                         </template>
                         
                     </van-field>
@@ -124,7 +124,7 @@
                     <!-- 常规选择时间的方式 -->
                     <!-- 全天上下午模式 -->
                     <div v-if="reportTimeType.multiWorktime==0">
-                    <van-field v-if="reportTimeType.type < 2" readonly clickable  :value="reportTimeType.type==0?item.label:(parseFloat(item.workingTime).toFixed(1)+'h')" label="工作时长" placeholder="请选择工作时长(小时)" @click="clickTimePicker(index)"
+                    <van-field v-if="reportTimeType.type < 2" readonly clickable  :value="reportTimeType.type==0?item.label:(parseFloat(item.workingTime).toFixed(1)+'h')" label="工作时长" placeholder="请选择工作时长(小时)" @click="clickTimePicker(index,item)"
                     :rules="[{ required: true, message: '请选择工作时长' }]"/>
                     <van-popup v-model="showPickerTime" position="bottom">
                         <van-picker show-toolbar :columns="timeType"  value-key="label" @confirm="choseTimePick" @cancel="showPickerTime = false" />
@@ -139,7 +139,7 @@
 
                     <!-- 时间段选择模式 -->
                     <van-field readonly v-if="reportTimeType.type == 2" clickable name="datetimePicker" :value="item.startTime" label="开始时间" placeholder="点击选择时间" 
-                        @click="canEdit?showStartTime = true:''" :disabled="!canEdit"
+                        @click="item.canEdit?showStartTime = true:''" :disabled="!item.canEdit"
                         :rules="[{ required: true, message: '请选择开始时间' }]"
                           />
                     <van-popup v-model="showStartTime" position="bottom">
@@ -154,7 +154,7 @@
                         <!-- :filter="filter" 原本这个属性在里面 -->
                     </van-popup>
                     <van-field v-if="reportTimeType.type == 2" readonly clickable name="datetimePicker" :value="item.endTime" label="结束时间" placeholder="点击选择时间" 
-                        @click="canEdit?showEndTime = true:''" :disabled="!canEdit" 
+                        @click="item.canEdit?showEndTime = true:''" :disabled="!item.canEdit" 
                         :rules="[{ required: true, message: '请选择结束时间' }]" />
                     <van-popup v-model="showEndTime" position="bottom" >
                         <van-datetime-picker
@@ -171,7 +171,7 @@
                         <template >
                             <div>
                         <span>用时占比</span>
-                        <van-slider :disabled="!canEdit" :min="5" :step="5" style="width:120px;display:inline-block;margin-left:50px;" v-model="item.progress" :value="100" @change="item.workingTime = (reportTimeType.allday*item.progress/100).toFixed(1)" >
+                        <van-slider :disabled="!item.canEdit" :min="5" :step="5" style="width:120px;display:inline-block;margin-left:50px;" v-model="item.progress" :value="100" @change="item.workingTime = (reportTimeType.allday*item.progress/100).toFixed(1)" >
                         <template #button>
                             <div class="custom-button">{{ item.progress }}%</div>
                         </template>
@@ -180,7 +180,7 @@
                             </div>
                         </template>
                     </van-cell>
-                    <van-field class="form_input" :disabled = "!canEdit"
+                    <van-field class="form_input" :disabled="!item.canEdit"
                     v-model="item.content" name="content" type="textarea" :label="user.companyId==781?'具体内容与结果':'工作事项'" placeholder="请输入" :rules="user.timeType.workContentState == 1 ? [{ required: true, message: '请填写工作事项' }] : null"
                     rows="3" autosize  />
                     </div>
@@ -188,21 +188,21 @@
                     <!-- 多个时间和工作事项的选择方式 -->
                     <div v-if="reportTimeType.multiWorktime==1">
                         <div v-for="(timeItem, tindex) in item.worktimeList" :key="tindex" style="position:relative;border:#ccc 0.5px solid;margin:7px;">
-                            <van-tag v-if="tindex>0 && canEdit" style="position:absolute; right:-7px;top:-7px;z-index:10;" 
+                            <van-tag v-if="tindex>0 && item.canEdit" style="position:absolute; right:-7px;top:-7px;z-index:10;" 
                                 @click="removeTimeItem(item,tindex)">X</van-tag>
                             
                             <!-- 时间段选择模式 -->
-                            <van-field readonly v-if="reportTimeType.type == 2" :clickable="canEdit" name="datetimePicker" 
+                            <van-field readonly v-if="reportTimeType.type == 2" :clickable="item.canEdit" name="datetimePicker" 
                             :value="timeItem.startTime" label="开始时间" placeholder="点击选择时间" 
                             :rules="[{ required: true, message: '必填项' }]"
-                                @click="canEdit?showStartDialog(timeItem):''"  />
+                                @click="item.canEdit?showStartDialog(timeItem):''"  />
                             
                             <van-field v-if="reportTimeType.type == 2" readonly :clickable="canEdit" name="datetimePicker" 
                             :value="timeItem.endTime" label="结束时间" placeholder="点击选择时间" 
                             :rules="[{ required: true, message: '必填项' }]"
-                                @click="canEdit?showEndDialog(timeItem):''"  />
+                                @click="item.canEdit?showEndDialog(timeItem):''"  />
                             
-                            <van-field class="form_input" :disabled="!canEdit" style="color:#333;-webkit-text-fill-color:#646566;"
+                            <van-field class="form_input" :disabled="!item.canEdit" style="color:#333;-webkit-text-fill-color:#646566;"
                             
                                 v-model="timeItem.content" name="content" type="textarea" label="工作事项" placeholder="请输入工作事项" 
                                 :rules="user.timeType.workContentState == 1 ? [{ required: true, message: '请填写工作事项' }] : null"
@@ -233,27 +233,27 @@
                             </van-popup>
                     </div>
                     
-                    <div style="width:100%;" v-if="canEdit&&reportTimeType.multiWorktime==1">
+                    <div style="width:100%;" v-if="item.canEdit&&reportTimeType.multiWorktime==1">
                     <van-tag  style="text-align:center;padding:5px;margin-left:15px;border: 1px solid #20a0ff;"
-                        :disabled="!canEdit" @click="addNewWorktime(index, item)" 
+                        :disabled="!item.canEdit" @click="addNewWorktime(index, item)" 
                         icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 5px;"> 添加工时  </span></van-tag>
                     </div>
                     
                     <div class="overtime" v-if="((user.timeType.fillOvertime || isWeekend) || (isCorpWX&&canEdit))">
                         <div class="overTimeClas" v-if="user.timeType.fillOvertime || isWeekend">
-                            <van-checkbox :disabled="!canEdit" v-model="item.isOvertime" style="width: 4.3rem;">含加班</van-checkbox>
-                            <van-field v-model="item.overtimeHours" type="number" :disabled="!canEdit || item.isOvertime==null||item.isOvertime==0 || !item.isOvertime"
+                            <van-checkbox :disabled="!item.canEdit" v-model="item.isOvertime" style="width: 4.3rem;">含加班</van-checkbox>
+                            <van-field v-model="item.overtimeHours" type="number" :disabled="!item.canEdit || item.isOvertime==null||item.isOvertime==0 || !item.isOvertime"
                             placeholder="请输入加班时长" style="width: 5rem"></van-field>
-                            <span :class="canEdit ? 'overListTime' : 'overListTime hoveOver'">小时</span>    
+                            <span :class="item.canEdit ? 'overListTime' : 'overListTime hoveOver'">小时</span>    
                         </div>
-                        <van-tag style="position:absolute;right:10px;" v-if="isCorpWX&&canEdit" type="primary" size="large" @click="takePhoto(index)">拍照上传</van-tag>
+                        <van-tag style="position:absolute;right:10px;" v-if="isCorpWX&&item.canEdit && user.timeType.takePhoto" type="primary" size="large" @click="takePhoto(index)">拍照上传</van-tag>
                         <!-- <van-tag style="position:absolute;right:10px;" type="primary" size="large" @click="takePhoto(index)">拍照上传</van-tag> -->
                         <!-- <van-tag style="position:absolute;right:10px;" type="primary" size="large" @click="takePhoto(index)">拍照上传</van-tag> -->
                     </div>
                     <div style="padding:5px;text-align:center;" v-if="!isIOSystem">
                         <span v-for="(p, index) in item.pics"  :key="p" style="margin-right:15px;">
                         <div class="imgList">    
-                            <van-icon v-if="canEdit && user.companyId==7" size="20" name="clear"  @click="deleteImg(item, index)" class="imgList_i"/>
+                            <van-icon v-if="item.canEdit && user.companyId==7" size="20" name="clear"  @click="deleteImg(item, index)" class="imgList_i"/>
                             <img  :src="p" style="width:100px; height:100px;" @click="showLargeImg(item.pics, index)"/>
                         </div>
                         </span>
@@ -261,7 +261,7 @@
                     <div style="padding:5px;text-align:center;" v-if="isIOSystem">
                         <span v-for="(p, index) in item.iospics"  :key="p" style="margin-right:15px;">
                         <div class="imgList">
-                            <van-icon  v-if="canEdit && user.companyId==7" size="20" name="clear"  @click="deleteImg(item, index)" class="imgList_i"/>
+                            <van-icon  v-if="item.canEdit && user.companyId==7" size="20" name="clear"  @click="deleteImg(item, index)" class="imgList_i"/>
                             <img :src="p" style="width:100px; height:100px;" @click="showLargeImg(item.iospics, index)"/>
                         </div>
                         </span>
@@ -277,8 +277,8 @@
                 
             </div>
             <div style="text-align:center;" >
-            <van-tag v-if="canEdit" size="large" style="text-align:center;margin:10px;padding:12px;margin-bottom:120px;border: 1px solid #20a0ff;"
-                :disabled="!canEdit" @click="addNewPro" 
+            <van-tag size="large" style="text-align:center;margin:10px;padding:12px;margin-bottom:120px;border: 1px solid #20a0ff;"
+                 @click="addNewPro" 
                 icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 50px;"> + 新增{{user.companyId==781?'任务':'项目'}}  </span></van-tag>
             </div>  
             <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
@@ -292,9 +292,10 @@
                         <van-loading type="spinner" v-if="!flgLg" />
                     </van-button>
                 </div>
-                 <van-button v-if="canEdit&&form.domains.length>0 && form.domains[0].id != null" 
+                <van-button v-if="canDeleteReport" 
                         square block type="default" @click="deleteReport" native-type="button" 
                     style=""> 删除 </van-button>
+                <van-button  v-if="canCancelInDialog" block type="default" @click="cancel"> 撤销 </van-button>
                 <!-- <div v-if="canEdit&&form.domains.length>0 && form.domains[0].id != null"
                     style="display:block;padding-top:30px;font-size:15px;color:#666;margin:0 auto;text-align:center;padding-bottom:10px;background:#ffffff;" 
                     @click="deleteReport"> 删除 </div> -->
@@ -302,9 +303,7 @@
                     style="margin-top:10px;"> 删除 </van-button> -->
             </div>
         </van-form>
-        <div style="position:fixed; bottom:0px;width:100%;">
-            <van-button  v-if="canCancel" block type="default" @click="cancel"> 撤销 </van-button>
-        </div>
+        
         
         <div class="form_tip" v-if="!canEdit && !canCancel"> 已审核无法修改 </div>
 
@@ -343,6 +342,8 @@
                 isWX: false,
                 showPickerTask:false,
                 canCancel:false,
+                canDeleteReport: false,
+                canCancelInDialog: false,
                 canEdit:false,
                 showEndTime: false,
                 showStartTime: false,
@@ -695,7 +696,9 @@
                 var data = this.form.domains;
                 data.forEach(element => {
                     if (element.id != null && element.id != '') {
-                        ids +=(element.id+',');
+                        if(element.id){
+                            ids +=(element.id+',');
+                        }
                     }
                 });
                 this.$axios.post("/report/cancel", {userId: this.user.id, reportIds:ids})
@@ -768,8 +771,8 @@
                 }
       
             },
-            clickTimePicker(i) {
-                if (!this.canEdit) {
+            clickTimePicker(i,item) {
+                if (!item.canEdit) {
                     return;
                 }
                 this.clickTimeIndex = i;
@@ -889,9 +892,11 @@
                             timeType.push({value:2, label:'下午 - '+t.pm+'小时', hours: t.pm});
                         }
                         var list = res.data.report;
+                        this.canCancelInDialog = false
                         if(list.length != 0) {
                             this.canEdit = false;
                             this.canCancel = false;
+                            this.canDeleteReport = true
                             let array = [];
                             for(var i in list) {
                                 var projectName = "";
@@ -964,12 +969,17 @@
                                     projectAuditorName: list[i].projectAuditorName,
                                     auditUserList: list[i].auditUserList,
                                     overtimeHours: list[i].overtimeHours,
-                                    customText: list[i].customText
+                                    customText: list[i].customText,
+                                    canEdit: list[i].state >= 2 ? true : false
                                 })
                                 if (list[i].state >= 2) {
                                     this.canEdit = true;
-                                } else if (list[i].state == 0) {
+                                } else {
+                                    this.canDeleteReport = false
+                                }
+                                if (list[i].state == 0) {
                                     this.canCancel = true;
+                                    this.canCancelInDialog = true
                                 }
                             }
                             this.form.domains = array;
@@ -991,6 +1001,7 @@
                                 professionProgress:[],
                                 multiWorktime:t.multiWorktime,
                                 worktimeList:[{}],  
+                                canEdit: true
                             }]
                             if(this.isWeekend){
                                 this.$set(this.form.domains[0],'isOvertime',true)
@@ -1023,7 +1034,7 @@
 
             //点击选择审核人
             clickPickAuditor(i, item) {
-                if (!this.canEdit) return;
+                if (!item.canEdit) return;
                 if (item.auditUserList.length<=1) return;
                 this.clickIndex = i;
                 item.showPickerAuditor = true;
@@ -1039,25 +1050,25 @@
 
             //点击选择子项目
             clickPickSubProject(i, item) {
-                if (!this.canEdit) return;
+                if (!item.canEdit) return;
                 this.clickIndex = i;
                 item.showPickerSubProject = true;
                 this.$forceUpdate();
             },
             clickPickCostId(i, item) {
-                if (!this.canEdit) return;
+                if (!item.canEdit) return;
                 this.clickIndex = i;
                 item.showPickerCostId = true;
                 this.$forceUpdate();
             },
             clickPickTaskGroup(i, item) {
-                if (!this.canEdit) return;
+                if (!item.canEdit) return;
                 this.clickIndex = i;
                 item.showPickerTaskGroup = true;
                 this.$forceUpdate();
             },
             clickPickStage(i, item) {
-                if (!this.canEdit) return;
+                if (!item.canEdit) return;
                 this.clickIndex = i;
                 item.showPickerStage = true;
                 this.$forceUpdate();
@@ -1065,7 +1076,7 @@
 
             // 选择项目
             clickPicker(i, item) {
-                if (!this.canEdit) return;
+                if (!item.canEdit) return;
                 // this.clickIndex = i;
                 // this.showPickerProject = true;
                 // console.log(i, item, this.form)
@@ -1084,7 +1095,7 @@
             },
             clickPickers(i,item) {
                 // console.log('wudulist',item.wuduList);
-                if (!this.canEdit) return;
+                if (!item.canEdit) return;
                 
                 this.clickIndex = i;
                 // item.showPickDegree = true;
@@ -1093,8 +1104,8 @@
                 // this.dimension(proId)
             },
             //选择任务
-            clickPickerTask(i) {
-                if (!this.canEdit) return;
+            clickPickerTask(i,item) {
+                if (!item.canEdit) return;
                 // console.log(i);
                 this.clickIndex = i;
                 // var proId = this.form.domains[this.clickIndex].projectId
@@ -1251,7 +1262,8 @@
                     isOvertime:false,
                     multiWorktime: this.reportTimeType.multiWorktime,
                     worktimeList:[{}],
-                    degreeId: null
+                    degreeId: null,
+                    canEdit: true
                 }
                 if(this.isWeekend){
                     this.$set(item,'isOvertime',true)
@@ -1262,6 +1274,9 @@
                     }
                 }
                 this.form.domains.push(item)
+                this.canEdit = true
+                this.$forceUpdate()
+                console.log('cancanneed',this.flgLg);
             },
 
             // 移除项目