Просмотр исходного кода

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

Lijy 3 лет назад
Родитель
Сommit
4178551ace
31 измененных файлов с 984 добавлено и 334 удалено
  1. BIN
      fhKeeper/formulahousekeeper/management-platform/0AAE1300
  2. BIN
      fhKeeper/formulahousekeeper/management-platform/ED622300
  3. 65 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java
  4. 14 24
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  5. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  6. 39 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/AuditWorkflowTimeSetting.java
  7. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/AuditWorkflowTimeSettingMapper.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/AuditWorkflowTimeSettingService.java
  9. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  10. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserService.java
  11. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/AuditWorkflowTimeSettingServiceImpl.java
  12. 14 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  13. 71 106
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  14. 95 15
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  15. 189 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ColorUtil.java
  16. 7 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/AuditWorkflowTimeSettingMapper.xml
  17. BIN
      fhKeeper/formulahousekeeper/management-platform/人员导入模板 (1).xlsx
  18. BIN
      fhKeeper/formulahousekeeper/management-platform/人员导入模板 (4).xlsx
  19. BIN
      fhKeeper/formulahousekeeper/management-platform/人员导入模板.xlsx
  20. BIN
      fhKeeper/formulahousekeeper/management-platform/员工工时导入模板 (14).xlsx
  21. 10 10
      fhKeeper/formulahousekeeper/timesheet/config/index.js
  22. 11 1
      fhKeeper/formulahousekeeper/timesheet/src/routes.js
  23. 34 7
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  24. 11 7
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  25. 194 85
      fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue
  26. 7 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/router/index.js
  27. 86 25
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  28. 113 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/test/index.vue
  29. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/calendar.vue
  30. 1 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue
  31. 10 10
      fhKeeper/formulahousekeeper/timesheet_h5/vue.config.js

BIN
fhKeeper/formulahousekeeper/management-platform/0AAE1300


BIN
fhKeeper/formulahousekeeper/management-platform/ED622300


+ 65 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java

@@ -5,15 +5,18 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.AuditWorkflowTimeSetting;
+import com.management.platform.entity.Department;
 import com.management.platform.mapper.AuditWorkflowTimeSettingMapper;
+import com.management.platform.mapper.DepartmentMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -33,32 +36,82 @@ public class AuditWorkflowTimeSettingController {
     AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
     @Resource
     UserMapper userMapper;
+    @Resource
+    DepartmentMapper departmentMapper;
+
 
     @RequestMapping("/add")
-    public HttpRespMsg add(String json) {
+    public HttpRespMsg add(String json, Integer deptId) {
         String token = request.getHeader("TOKEN");
         Integer companyId = userMapper.selectById(token).getCompanyId();
-        auditWorkflowTimeSettingMapper.delete(new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", companyId));
+        auditWorkflowTimeSettingMapper.delete(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId));
         JSONArray array = JSONArray.parseArray(json);
 
-        for (int i=0;i<array.size(); i++) {
-            JSONObject obj = array.getJSONObject(i);
-            AuditWorkflowTimeSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowTimeSetting.class);
-            auditWorkflowTimeSetting.setCompanyId(companyId);
-            auditWorkflowTimeSetting.setSeq(i+1);
-            auditWorkflowTimeSettingMapper.insert(auditWorkflowTimeSetting);
+        if (array.size() == 1 && array.getJSONObject(0).getInteger("type") == 1) {
+            //只有一个项目负责人审核,不保存
+        } else {
+            //检查是否有重复的部门
+            List<Integer> auditDeptIds = new ArrayList<>();
+            for (int i=0;i<array.size(); i++) {
+                JSONObject obj = array.getJSONObject(i);
+                AuditWorkflowTimeSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowTimeSetting.class);
+                if (auditDeptIds.contains(auditWorkflowTimeSetting.getAuditDeptId())) {
+                    HttpRespMsg msg = new HttpRespMsg();
+                    msg.setError("保存失败: 部门["+auditWorkflowTimeSetting.getAuditDeptName()+"]存在重复");
+                    return msg;
+                } else {
+                    auditDeptIds.add(auditWorkflowTimeSetting.getAuditDeptId());
+                }
+            }
+
+            for (int i=0;i<array.size(); i++) {
+                JSONObject obj = array.getJSONObject(i);
+                AuditWorkflowTimeSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowTimeSetting.class);
+                auditWorkflowTimeSetting.setCompanyId(companyId);
+                auditWorkflowTimeSetting.setSeq(i+1);
+                if (i == array.size() -1) {
+                    auditWorkflowTimeSetting.setIsFinal(1);
+                } else {
+                    auditWorkflowTimeSetting.setIsFinal(0);
+                }
+                auditWorkflowTimeSetting.setDeptId(deptId);
+                auditWorkflowTimeSettingMapper.insert(auditWorkflowTimeSetting);
+            }
         }
         return new HttpRespMsg();
-
     }
 
 
     @RequestMapping("/get")
-    public HttpRespMsg get() {
+    public HttpRespMsg get(Integer deptId) {
         String token = request.getHeader("TOKEN");
         Integer companyId = userMapper.selectById(token).getCompanyId();
-        List<AuditWorkflowTimeSetting> auditWorkflowTimeSettings = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("company_id", companyId).orderByAsc("seq"));
+        List<AuditWorkflowTimeSetting> auditWorkflowTimeSettings = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId).orderByAsc("seq"));
         HttpRespMsg msg = new HttpRespMsg();
+        if (auditWorkflowTimeSettings.size() == 0) {
+            int seq = 1;
+            //未独立设置,获取默认的设置,默认直接就是项目负责人审批
+            Department dept = departmentMapper.selectById(deptId);
+            AuditWorkflowTimeSetting setting = new AuditWorkflowTimeSetting();
+            setting.setSeq(seq);
+            setting.setCompanyId(companyId);
+            setting.setDeptId(dept.getDepartmentId());
+            setting.setIsFinal(1);
+            setting.setType(1);
+            auditWorkflowTimeSettings.add(setting);
+//            while (dept.getSuperiorId() != null && dept.getSuperiorId() > 0) {
+//                seq++;
+//                dept = departmentMapper.selectById(dept.getSuperiorId());
+//                setting = new AuditWorkflowTimeSetting();
+//                setting.setCompanyId(companyId);
+//                setting.setDeptId(dept.getDepartmentId());
+//                setting.setSeq(seq);
+//                setting.setAuditDeptId(dept.getDepartmentId());
+//                setting.setAuditDeptName(dept.getDepartmentName());
+//                auditWorkflowTimeSettings.add(setting);
+//            }
+
+        }
         msg.data = auditWorkflowTimeSettings;
         return msg;
     }

+ 14 - 24
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -118,6 +118,7 @@ public class ReportController {
      * workingTime 工作时间 数组
      * content 工作内容 数组
      * createDate 报告日期 数组
+     * draft 草稿
      */
     @RequestMapping("/editReport")
     public HttpRespMsg editReport(Integer[] id, Integer[] projectId,
@@ -137,12 +138,18 @@ public class ReportController {
                                   String[] stage,
                                   String[] pics,
                                   Integer[] multiWorktime,
-                                  Integer[] degreeId
+                                  Integer[] degreeId,
+                                  @RequestParam(required = false, defaultValue = "0") Integer draft
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
         List<String> targetUidList = null;
         List<User> targetUserList = null;
+        if (projectId == null) {
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError("项目不能为空");
+            return msg;
+        }
         //初始化,防止老版本无此字段奔溃报错
         if (multiWorktime == null) {
             multiWorktime = new Integer[projectId.length];
@@ -314,7 +321,7 @@ public class ReportController {
                                     .setMultiWorktime(multiWorktime[i])
                                     .setContent(content[i])
                                     .setDegreeId(degreeId.length > 0?degreeId[i]:null)
-                                    .setState(0)
+                                    .setState(draft==0?0:3)
                                     .setCompanyId(user.getCompanyId())
                                     .setPicAdd(pics!=null?pics[i]:null)
                                     .setStage(stage != null && stage.length > 0 && !StringUtil.isEmpty(stage[i])?stage[i]:null)
@@ -378,22 +385,6 @@ public class ReportController {
                             }
                         }
                     }
-//                    int daysOffset = 0;
-//                    while(true) {
-//                        localStartDate = localStartDate.plusDays(daysOffset);
-//                        //跳过周末
-//                        if (localStartDate.getDayOfWeek() != DayOfWeek.SATURDAY && localStartDate.getDayOfWeek() != DayOfWeek.SUNDAY) {
-//
-//
-//
-//                        }
-//
-//                        //结束条件
-//                        if (localStartDate.isEqual(localEndDate)) {
-//                            break;
-//                        }
-//                        daysOffset = 1;
-//                    }
                 } else {
                     if (targetUidList == null) {
                         Report report = new Report()
@@ -405,7 +396,7 @@ public class ReportController {
                                 .setContent(content[i])
                                 .setDegreeId(degreeId.length > 0?degreeId[i]:null)
                                 .setStage(stage!=null && stage.length > 0  && !StringUtil.isEmpty(stage[i])?stage[i]:null)
-                                .setState(0)
+                                .setState(draft==0?0:3)
                                 .setCompanyId(user.getCompanyId())
                                 .setPicAdd(pics!=null?pics[i]:null)
                                 .setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")))
@@ -469,7 +460,6 @@ public class ReportController {
                                 fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf);
                             }
 
-
                             fillReportProgress(report, professionProgress[i]);
                             reportList.add(report);
                             /*后续需要加入状态*/
@@ -680,16 +670,16 @@ public class ReportController {
     @RequestMapping("/listImportByState")
     public HttpRespMsg listDeptImportByState(
                                       Integer projectId,
-                                      String startDate,
-                                      String endDate,
+                                      Integer dateType,
+                                      String date,
                                       Integer departmentId,
                                       HttpServletRequest request) {
         String token = request.getHeader("TOKEN");
         User user = userService.getById(token);
 
         return reportService.listDeptImportByState(user.getId(),
-                projectId,
-                startDate, endDate, departmentId, request);
+                projectId,dateType,
+                date, departmentId, request);
     }
 
     @RequestMapping("/getlastWeekFillTime")

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

@@ -147,8 +147,8 @@ public class UserController {
      * file Excel文件
      */
     @RequestMapping("/importUser")
-    public HttpRespMsg importUser(Integer departmentId, @RequestParam MultipartFile file) {
-        return userService.importUser(departmentId, file, request);
+    public HttpRespMsg importUser(@RequestParam MultipartFile file) {
+        return userService.importUser(file, request);
     }
 
     /**
@@ -194,5 +194,8 @@ public class UserController {
         userService.updateById(user);
         return new HttpRespMsg();
     }
+
+
+
 }
 

+ 39 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/AuditWorkflowTimeSetting.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-07-26
+ * @since 2022-02-21
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -30,14 +30,11 @@ public class AuditWorkflowTimeSetting extends Model<AuditWorkflowTimeSetting> {
     @TableField("company_id")
     private Integer companyId;
 
-    @TableField("role_id")
-    private Integer roleId;
-
-    @TableField("role_name")
-    private String roleName;
-
-    @TableField("seq")
-    private Integer seq;
+    /**
+     * 要设置的部门id,针对部门设置流程
+     */
+    @TableField("dept_id")
+    private Integer deptId;
 
     /**
      * 指定该节点的审核人员
@@ -45,9 +42,42 @@ public class AuditWorkflowTimeSetting extends Model<AuditWorkflowTimeSetting> {
     @TableField("user_id")
     private String userId;
 
+    /**
+     * 指定该节点的审核姓名
+     */
     @TableField("user_name")
     private String userName;
 
+    /**
+     * 顺序
+     */
+    @TableField("seq")
+    private Integer seq;
+
+    /**
+     * 审核部门的id
+     */
+    @TableField("audit_dept_id")
+    private Integer auditDeptId;
+
+    /**
+     * 审核部门的名称
+     */
+    @TableField("audit_dept_name")
+    private String auditDeptName;
+
+    /**
+     * 0-部门审核,1-项目负责人审核
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 是否是最终审核
+     */
+    @TableField("is_final")
+    private Integer isFinal;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -1,7 +1,7 @@
 package com.management.platform.mapper;
 
-import com.management.platform.entity.AuditWorkflowTimeSetting;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.AuditWorkflowTimeSetting;
 
 /**
  * <p>

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

@@ -1,7 +1,7 @@
 package com.management.platform.service;
 
-import com.management.platform.entity.AuditWorkflowTimeSetting;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.AuditWorkflowTimeSetting;
 
 /**
  * <p>

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

@@ -66,8 +66,8 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg listDeptImportByState(String leaderId,
                                Integer projectId,
-                               String startDate,
-                               String endDate,
+                               Integer dateType,
+                               String date,
                                       Integer deprarmtentId, HttpServletRequest request);
 
     HttpRespMsg getlastWeekFillTime(String userId);

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

@@ -34,7 +34,7 @@ public interface UserService extends IService<User> {
                            Integer salaryType, String costApplyDate,
                            HttpServletRequest request);
 
-    HttpRespMsg importUser(Integer departmentId, MultipartFile multipartFile, HttpServletRequest request);
+    HttpRespMsg importUser(MultipartFile multipartFile, HttpServletRequest request);
 
     HttpRespMsg switchPermission(String id, HttpServletRequest request);
 
@@ -61,4 +61,5 @@ public interface UserService extends IService<User> {
     HttpRespMsg bindCorpWeiXin(String code, String userId);
 
     HttpRespMsg loginByUserId(String userId, HttpServletRequest request);
+
 }

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

@@ -1,9 +1,9 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.AuditWorkflowTimeSetting;
 import com.management.platform.mapper.AuditWorkflowTimeSettingMapper;
 import com.management.platform.service.AuditWorkflowTimeSettingService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
 /**

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

@@ -2,16 +2,10 @@ package com.management.platform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.entity.Department;
-import com.management.platform.entity.Participation;
-import com.management.platform.entity.Project;
-import com.management.platform.entity.User;
+import com.management.platform.entity.*;
 import com.management.platform.entity.vo.DepartmentMasterVO;
 import com.management.platform.entity.vo.DepartmentVO;
-import com.management.platform.mapper.DepartmentMapper;
-import com.management.platform.mapper.ParticipationMapper;
-import com.management.platform.mapper.ProjectMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.DepartmentService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
@@ -50,6 +44,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     private ProjectMapper projectMapper;
     @Resource
     private ParticipationMapper participationMapper;
+    @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
     //新增部门
     @Override
     public HttpRespMsg insertDepartment(String departmentName, Integer superiorId, String managerId, String reportAuditUserid,  HttpServletRequest request) {
@@ -97,12 +93,22 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             if (!department.getCompanyId().equals(companyId)) {
                 httpRespMsg.setError("不能修改其他公司的部门");
             } else {
+                boolean deptNameChanged = false;
+                if (!departmentName.equals(department.getDepartmentName())) {
+                    deptNameChanged = true;
+                }
                 department.setDepartmentName(departmentName);
                 department.setManagerId(managerId);
                 department.setReportAuditUserid(reportAuditUserid);
+
                 if (departmentMapper.updateById(department) == 0) {
                     httpRespMsg.setError("修改失败");
                 } else {
+                    if (deptNameChanged) {
+                        AuditWorkflowTimeSetting setting = new AuditWorkflowTimeSetting();
+                        setting.setAuditDeptName(departmentName);
+                        auditWorkflowTimeSettingMapper.update(setting, new QueryWrapper<AuditWorkflowTimeSetting>().eq("audit_dept_id", departmentId));
+                    }
                     //修改负责人的部门
                     if (managerId != null) {
                         User manager = userMapper.selectById(managerId);

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

@@ -124,6 +124,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private StagesMapper stagesMapper;
     @Resource
     private UserSalaryService userSalaryService;
+    @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -339,7 +341,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
                 for (Map<String, Object> report : reportList) {
                     String picStr = (String)report.get("picStr");
-                    if (picStr != null) {
+                    if (picStr != null && !"@".equals(picStr)) {
                         JSONArray array = JSONArray.parseArray(picStr.replaceAll("@", ","));
                         List<String> picList = new ArrayList<>();
                         for (int i=0;i<array.size(); i++) {
@@ -415,7 +417,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     r.setStages(stagesMapper.getProjectStages(r.getProjectId()));
                 }
                 //处理图片
-                if (!StringUtils.isEmpty(r.getPicStr())) {
+                if (!StringUtils.isEmpty(r.getPicStr()) && !r.getPicStr().equals("@")) {
                     JSONArray array = JSONArray.parseArray(r.getPicStr().replaceAll("@", ","));
                     List<String> list = new ArrayList<>();
                     for (int i=0;i<array.size(); i++) {
@@ -599,27 +601,53 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         if (wxCorpInfoMapper.selectCount(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId)) > 0) {
             WxCorpInfo corpInfo = wxCorpInfoMapper.selectList(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId)).get(0);
             for (Report report : reportList) {
-                if (!StringUtils.isEmpty(report.getPicAdd()) && !report.getPicAdd().equals("@")) {
-                    report.setPicStr(report.getPicStr());
+                if (!StringUtils.isEmpty(report.getPicAdd())) {
                     Report item = new Report();
                     item.setId(report.getId());
-                    item.setPicStr(report.getPicAdd());
-                    batchUpdateList.add(item);
-
-                    String s = item.getPicStr().replaceAll("@", ",");
-                    JSONArray array = JSONArray.parseArray(s);
-                    for (int i = 0; i < array.size(); i++) {
-                        String string = array.getString(i);
-                        wxCorpInfoService.downloadFile(corpInfo, string);
+
+                    //和历史数据比对,要计算本次新增的照片
+                    Report oldItem = reportMapper.selectById(report.getId());
+                    String newPics = report.getPicAdd();
+                    if (!newPics.equals(oldItem.getPicStr())) {
+                        //对比变化,有变化才处理
+                        JSONArray oldArray = null;
+                        if (oldItem.getPicStr() != null && !"@".equals(oldItem.getPicStr())) {
+                            String oldPicArrStr = oldItem.getPicStr().replaceAll("@", ",");
+                            oldArray = JSONArray.parseArray(oldPicArrStr);
+                        }
+                        item.setPicStr(newPics);
+                        batchUpdateList.add(item);
+
+                        //有照片才处理
+                        if (!newPics.equals("@")) {
+                            String s = item.getPicStr().replaceAll("@", ",");
+                            JSONArray array = JSONArray.parseArray(s);
+                            for (int i = 0; i < array.size(); i++) {
+                                String string = array.getString(i);
+                                boolean exists = false;
+                                if (oldArray != null) {
+                                    for (int j=0;j<oldArray.size(); j++) {
+                                        String oldPicItem = oldArray.getString(j);
+                                        if (oldPicItem.equals(string)) {
+                                            exists = true;
+                                            break;
+                                        }
+                                    }
+                                }
+                                //本次新增的照片要去企业微信下载
+                                if (!exists) {
+                                    wxCorpInfoService.downloadFile(corpInfo, string);
+                                }
+                            }
+                        }
                     }
+
                 }
             }
             if (batchUpdateList.size() > 0) {
                 updateBatchById(batchUpdateList);
-
             }
         }
-
     }
 
 
@@ -656,7 +684,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             Integer companyId = curUser.getCompanyId();
             Integer isEngeering = companyMapper.selectById(companyId).getPackageEngineering();
             String leaderId = null;
-            if (curUser.getRole() == 0) {//普通员工
+            if (curUser.getRole() != 1 && curUser.getRole() != 2) {//非超级管理员和系统管理员
                 leaderId = curUser.getId();
             }
             List<Map<String, Object>> auditReportList = reportMapper.getAuditReportList(date, companyId, departmentId, projectId, leaderId, isEngeering);
@@ -716,7 +744,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
                 for (Map<String, Object> report : reportList) {
                     String picStr = (String)report.get("picStr");
-                    if (picStr != null) {
+                    if (picStr != null && !"@".equals(picStr)) {
                         JSONArray array = JSONArray.parseArray(picStr.replaceAll("@", ","));
                         List<String> picList = new ArrayList<>();
                         for (int i=0;i<array.size(); i++) {
@@ -749,7 +777,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         try {
             User user = userMapper.selectById(request.getHeader("Token"));
             Company company = companyMapper.selectById(user.getCompanyId());
-            final List<Long> ids = ListUtil.convertIdsArrayToList(reportIds);
+            final List<Integer> ids = ListUtil.convertIntegerIdsArrayToList(reportIds);
             if (company.getPackageEngineering() == 1) {
                 //检查是否有专业进度待审核
                 List<ReportProfessionProgress> list = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().in("report_id", ids).eq("audit_state", 0));
@@ -821,9 +849,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 }
             } else {
-                //直接进行项目经理审核
-                reportMapper.update(new Report().setState(1),
-                        new QueryWrapper<Report>().in("id", ids));
+                String creatorId = reportMapper.selectById(ids.get(0)).getCreatorId();
+                User auditTargetUser = userMapper.selectById(creatorId);
+                List<AuditWorkflowTimeSetting> settings = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", auditTargetUser.getDepartmentId()));
+                if (settings.size() == 0) {
+                    //直接进行项目经理审核
+                    reportMapper.update(new Report().setState(1),
+                            new QueryWrapper<Report>().in("id", ids));
+                } else {
+                    //按流程走
+                    
+                }
+
             }
             
         } catch (NullPointerException e) {
@@ -1290,7 +1327,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         int cnt = 0;
         for (Integer reportId : ids) {
             Report report = new Report();
-            report.setState(3);//待提交
+            report.setState(3);//待提交,即草稿状态
             if (user.getRole() == 0) {
                 //自己只能撤销待审核状态的
                 cnt += reportMapper.update(report, new QueryWrapper<Report>().eq("id", reportId).eq("state", 0));
@@ -1387,7 +1424,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
                 for (Map<String, Object> report : reportList) {
                     String picStr = (String)report.get("picStr");
-                    if (picStr != null) {
+                    if (picStr != null && !"@".equals(picStr)) {
                         JSONArray array = JSONArray.parseArray(picStr.replaceAll("@", ","));
                         List<String> picList = new ArrayList<>();
                         for (int i=0;i<array.size(); i++) {
@@ -1480,7 +1517,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
                 for (Map<String, Object> report : reportList) {
                     String picStr = (String)report.get("picStr");
-                    if (picStr != null) {
+                    if (picStr != null && !"@".equals(picStr)) {
                         JSONArray array = JSONArray.parseArray(picStr.replaceAll("@", ","));
                         List<String> picList = new ArrayList<>();
                         for (int i=0;i<array.size(); i++) {
@@ -2084,7 +2121,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg listDeptImportByState(String leaderId, Integer projectId, String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
+    public HttpRespMsg listDeptImportByState(String leaderId, Integer projectId, Integer dateType, String date, Integer departmentId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@@ -2101,89 +2138,17 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 filterDeptIds.add(departmentId);
                 filterDeptIds.addAll(subDepts.stream().map(Department::getDepartmentId).collect(Collectors.toList()));
             }
+            String startDate = null;
+            String endDate = null;
+            if (dateType == 0) {
+                startDate = date;
+                endDate = date;
+            } else {
+                //按月
+                startDate = date + "-01";
+                endDate = date + "-31";
+            }
             List<Map<String, Object>> auditReportList = reportMapper.getDeptImportAuditList(companyId, leaderId, startDate, endDate, filterDeptIds, projectId);
-//            //抽取姓名,进行分组
-//            List<Map<String, Object>> nameList = new ArrayList<Map<String, Object>>();
-//            Map<String, Object> lastName = null;
-//            //某个用户某天下的各个项目日报列表
-//            List<Map<String, Object>> userDailyReportList = null;
-//            for (Map a : auditReportList) {
-//                String createDate = (String)a.get("date");
-//                String name = (String)a.get("name");
-//
-//                if (lastName == null || !(lastName.get("name").equals(name) && lastName.get("dateStr").equals(createDate))) {
-//                    lastName = new HashMap<String, Object>();
-//                    lastName.put("dateStr", createDate);
-//                    lastName.put("name", name);
-//                    nameList.add(lastName);
-//                    userDailyReportList = new ArrayList<>();
-//                    lastName.put("data", userDailyReportList);
-//                }
-//                //每组日报数据都加上去
-//                userDailyReportList.add(a);
-//            }
-
-
-//            List<Profession> professions = professionMapper.selectList(new QueryWrapper<Profession>().eq("company_id", curUser.getCompanyId()));
-//            for (int index=0;index<nameList.size(); index++) {
-//                Map<String, Object> map2 = nameList.get(index);
-//                List<Map<String, Object>> list2 = (List)map2.get("data");
-//                //项目专业进度
-//                if (isEngeering == 1) {
-//                    for (Map<String, Object> map : list2) {
-//                        //获取当前项目的工程专业进度
-//                        List<ReportProfessionProgress> progressList = reportProfessionProgressService.list(new QueryWrapper<ReportProfessionProgress>().eq("report_id", (int)map.get("id")));
-//                        progressList.stream().forEach(p->{
-//                            p.setProfessionName(professions.stream().filter(m->m.getId().equals(p.getProfessionId())).findFirst().get().getName());
-//                        });
-//                        map.put("professionProgressList", progressList);
-//                    }
-//                }
-//
-//                double reportTime = 0;
-//                BigDecimal total = new BigDecimal(0);
-//                //计算每日汇总的工时成本
-//                for (Map<String, Object> m : list2) {
-//                    double t = (double) m.get("time");
-//                    reportTime += t;
-//                    total = total.add((BigDecimal)m.get("cost"));
-//                }
-//                DecimalFormat df = new DecimalFormat("0.00");
-//                map2.put("reportTime", df.format(reportTime));
-//                map2.put("cost", total);
-//                map2.put("state", list2.get(0).get("state"));
-//            }
-
-            //设置照片和项目工时成本显示
-//            for (Map map : nameList) {
-//                List<Map<String, Object>> reportList = (List<Map<String, Object>>)map.get("data");
-//                StringBuilder sb = new StringBuilder();
-//                for (int t=0;t<reportList.size(); t++) {
-//                    Map<String, Object> report = reportList.get(t);
-//                    String picStr = (String)report.get("picStr");
-//                    if (picStr != null) {
-//                        JSONArray array = JSONArray.parseArray(picStr.replaceAll("@", ","));
-//                        List<String> picList = new ArrayList<>();
-//                        for (int i=0;i<array.size(); i++) {
-//                            String string = array.getString(i);
-//                            string = "/upload/" + string + ".jpg";
-//                            picList.add(string);
-//                        }
-//                        report.put("pics", picList);
-//                    }
-//                    if (((Integer)report.get("multiWorktime")) == 1) {
-//                        //设置多个工时情况下的报告列表
-//                        String timeStr = (String)report.get("content");
-//                        report.put("worktimeList", JSONArray.parse(timeStr));
-//                    }
-//                    //抽取项目,工时和成本
-//                    sb.append(report.get("project")+"("+report.get("time")+"h/"+report.get("cost")+"元)");
-//                    if (t < reportList.size() -1) {
-//                        sb.append(" | ");
-//                    }
-//                }
-//                map.put("allProjectTime", sb.toString());
-//            }
 
             httpRespMsg.data = auditReportList;
         } catch (NullPointerException e) {

+ 95 - 15
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -47,6 +47,7 @@ import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -75,6 +76,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Autowired
     private RestTemplate restTemplate;
 
+    @Resource
+    private ParticipationMapper participationMapper;
     @Resource
     private ReportService reportService;
     @Resource
@@ -97,6 +100,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private UserVcodeMapper userVcodeMapper;
     @Resource
     private ProjectBasecostSettingMapper projectBasecostSettingMapper;
+    @Resource
+    private TaskMapper taskMapper;
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password) {
@@ -281,13 +286,34 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             } else {
                 if (!requester.getCompanyId().equals(target.getCompanyId())) {
                     httpRespMsg.setError("只能删除同一公司人员的账号");
-                } else if (target.getRole() == 2) {
+                } else if (target.getRole() == 1) {
+                    //超级管理员账号不能删除
                     httpRespMsg.setError("负责人账号不可删除");
-                } else if (target.getRole() == 3 && requester.getRole() != 2) {
-                    httpRespMsg.setError("只有负责人可以删除管理员账号");
-                } else {
-                    userMapper.deleteById(userId);
-                    userSalaryMapper.delete(new QueryWrapper<UserSalary>().eq("user_id", userId));
+                } else if (target.getRole() == 2 && requester.getRole() != 1) {
+                    httpRespMsg.setError("您无权删除系统管理员账号,请联系超级管理员操作");
+                }  else {
+                    //检测是否该人员已填日报,已填写日报的不能删除
+                    Integer userReportNum = reportMapper.selectCount(new QueryWrapper<Report>().eq("creator_id", target.getId()));
+                    if (userReportNum > 0) {
+                        httpRespMsg.setError("该员工存在填写的日报,无法删除。");
+                    } else {
+                        //检测是否有已参与的任务
+                        Integer taskNum = taskMapper.selectCount(new QueryWrapper<Task>().eq("executor_id", userId));
+                        if (taskNum > 0) {
+                            httpRespMsg.setError("该员工存在参与的任务,无法删除");
+                        } else {
+                            //检测是否担任项目负责人
+                            Integer projectNum = projectMapper.selectCount(new QueryWrapper<Project>().eq("incharger_id", userId));
+                            if (projectNum > 0) {
+                                httpRespMsg.setError("该员工存在负责的项目,无法删除");
+                            } else {
+                                userMapper.deleteById(userId);
+                                userSalaryMapper.delete(new QueryWrapper<UserSalary>().eq("user_id", userId));
+                                //项目参与人可以直接删除
+                                participationMapper.delete(new QueryWrapper<Participation>().eq("user_id", userId));
+                            }
+                        }
+                    }
                 }
             }
         } catch (NullPointerException e) {
@@ -543,9 +569,25 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return cascade.toString();
     }
 
+    private String convertDepartmentIdToCascade(final Integer id, List<Department> deptList) {
+        StringBuilder cascade = new StringBuilder();
+        if (id == 0 || id == null) {
+            cascade.append("0");
+        } else {
+            cascade.append(id);
+            Integer superiorId = deptList.stream().filter(d->d.getDepartmentId().equals(id)).findFirst().get().getSuperiorId();
+            while (superiorId != null) {
+                cascade.append(",").append(id);
+                final Integer tempId = superiorId;
+                superiorId = deptList.stream().filter(d->d.getDepartmentId().equals(tempId)).findFirst().get().getSuperiorId();
+            }
+        }
+        return cascade.toString();
+    }
+
     //导入用户
     @Override
-    public HttpRespMsg importUser(Integer departmentId, MultipartFile multipartFile,
+    public HttpRespMsg importUser(MultipartFile multipartFile,
                                   HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
 
@@ -587,26 +629,59 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             List<String> phoneList = new ArrayList<>();
             //要插入的账号列表
             List<User> userList = new ArrayList<>();
+            //获取已有的部门列表
+            List<Department> deptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
             //由于第一行需要指明列对应的标题
             for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                 XSSFRow row = sheet.getRow(rowIndex);
                 if (row == null) {
                     continue;
                 }
-                //此处新建账号 默认密码为000000 默认 姓名第一列 手机号第二列 月薪第三
+                //此处新建账号 默认密码为000000 默认 姓名第一列 手机号第二列 部门第三列 月薪第四
                 Long id = SnowFlake.nextId();
                 XSSFCell nameCell = row.getCell(0);
                 XSSFCell phoneCell = row.getCell(1);
-                XSSFCell monthCostCell = row.getCell(2);
-                XSSFCell costCell = row.getCell(3);
+                XSSFCell deptCell = row.getCell(2);
+                XSSFCell monthCostCell = row.getCell(3);
+                XSSFCell costCell = row.getCell(4);
                 nameCell.setCellType(CellType.STRING);
                 phoneCell.setCellType(CellType.STRING);
 
                 String name = nameCell.getStringCellValue();
                 String phone = phoneCell.getStringCellValue();
+                String dept = null;
+                if (deptCell != null) {
+                    deptCell.setCellType(CellType.STRING);
+                    dept = deptCell.getStringCellValue();
+                }
+
                 if (name.equals("姓名") && phone.equals("手机号") && rowIndex == 0) {
+                    if (!"部门".equals(dept)) {
+                        httpRespMsg.setError("缺少部门列,请下载最新模板进行导入");
+                        return httpRespMsg;
+                    }
+                    continue;
+                }
+                //姓名为空的,不处理
+                if (StringUtils.isEmpty(name)) {
                     continue;
                 }
+                Integer deptId;
+                String deptCascade;
+                if (StringUtils.isEmpty(dept)) {
+                    deptId = null;
+                    deptCascade = null;
+                } else {
+                    final String tmpDept = dept;
+                    if (!deptList.stream().filter(d->d.getDepartmentName().equals(tmpDept)).findFirst().isPresent()) {
+                        httpRespMsg.setError("部门["+dept+"]不存在,请先创建该部门");
+                        return httpRespMsg;
+                    } else {
+                        deptId = deptList.stream().filter(d->d.getDepartmentName().equals(tmpDept)).findFirst().get().getDepartmentId();
+                        deptCascade = convertDepartmentIdToCascade(deptId, deptList);
+                    }
+                }
+
                 int salaryType = 0;
                 BigDecimal monthCost = new BigDecimal(0);
                 BigDecimal cost = new BigDecimal(0);
@@ -631,20 +706,23 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     cost = MathUtil.isIntegerOrDigital(costString) ? new BigDecimal(costString) : BigDecimal.valueOf(0);
                 }
 
-                phoneList.add(phone);
+                if (!StringUtils.isEmpty(phone)) {
+                    phoneList.add(phone);
+                }
+
                 userList.add(new User()
                         .setId(id.toString())
                         .setName(name)
                         .setPassword(MD5Util.getPassword("000000"))
                         .setPhone(phone)
                         .setRole(0)
+                        .setDepartmentId(deptId)
+                        .setDepartmentCascade(deptCascade)
                         .setColor(ColorUtil.randomColor())
                         .setCompanyId(companyId)
                         .setMonthCost(monthCost)
                         .setCost(cost)
-                        .setSalaryType(salaryType)
-                        .setDepartmentId(departmentId)
-                        .setDepartmentCascade(departmentId==null?null:convertDepartmentIdToCascade(departmentId)));
+                        .setSalaryType(salaryType));
             }
             //最后删掉这个文件
 //            if (!file.delete()) {
@@ -660,7 +738,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                         userMapper.insert(user);
                     }
                 } else {
-                    httpRespMsg.setError("手机号有重复 批量新建账号失败");
+                    List<User> existList = userMapper.selectList(new QueryWrapper<User>().in("phone", phoneList));
+                    String duplicatePhoneStr = existList.stream().map(User::getPhone).collect(Collectors.joining(","));
+                    httpRespMsg.setError("手机号有重复 批量新建账号失败:" + duplicatePhoneStr);
                     /*这里以后可能需要返回重复的手机号的具体信息*/
                 }
             }

+ 189 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ColorUtil.java

@@ -1,5 +1,8 @@
 package com.management.platform.util;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
 import java.util.Random;
 
 public class ColorUtil {
@@ -11,6 +14,191 @@ public class ColorUtil {
     }
 
     public static void main(String[] args) {
-        System.out.println(randomColor());
+        String[] str = new String[]{"18658127122",
+                "13958019678",
+                "13777870711",
+                "18857154912",
+                "15557161578",
+                "15397126535",
+                "13456906403",
+                "18868860034",
+                "13588345506",
+                "13777419005",
+                "15268555322",
+                "15397023915",
+                "18069703196",
+                "13456735736",
+                "13805726051",
+                "18698555982",
+                "18958046862",
+                "15868845002",
+                "13575738161",
+                "15990199772",
+                "18658872590",
+                "13867169056",
+                "18158182525",
+                "15088689713",
+                "13585961039",
+                "18668017529",
+                "18057128645",
+                "15257582246",
+                "13735844966",
+                "18106532040",
+                "13716269811",
+                "17682330355",
+                "15958035195",
+                "15874924072",
+                "15158005335",
+                "17858936083",
+                "18457061976",
+                "18518207024",
+                "15921722090",
+                "13575489658",
+                "15202181434",
+                "18621559970",
+                "13309236572",
+                "15617169920",
+                "13992062944",
+                "18792624855",
+                "18158771827",
+                "13022966965",
+                "18629391086",
+                "18857114810",
+                "17606869224",
+                "18609654280",
+                "15309252997",
+                "13666166105",
+                "18782259249",
+                "18066953451",
+                "15129233575",
+                "18011265989",
+                "15224092347",
+                "15829070933",
+                "18200376799",
+                "18601666475",
+                "13700279481",
+                "15319957089",
+                "18792475086",
+                "13572160817",
+                "15167118084",
+                "13281865290",
+                "18616761341",
+                "15897721636",
+                "17816891567",
+                "13214327825",
+                "13567105150",
+                "13596260933",
+                "15200744011",
+                "18857866308",
+                "19883270311",
+                "13891857170",
+                "18392138744",
+                "15924058876",
+                "13227892017",
+                "15715817791",
+                "15824304746",
+                "15209256108",
+                "15282690951",
+                "13208101965",
+                "13173612375",
+                "18069809196",
+                "18402868212",
+                "13588015853",
+                "15828344349",
+                "13758183719",
+                "15101135063",
+                "18767157952",
+                "15158172465",
+                "17682308747",
+                "17733397108",
+                "18767180985",
+                "18508233670",
+                "13758200824",
+                "17348510010",
+                "17705737070",
+                "15058125780",
+                "15669067889",
+                "13516713029",
+                "13223014721",
+                "18868875984",
+                "15158866871",
+                "13666699169",
+                "15937664749",
+                "15102756101",
+                "17858606393",
+                "13588905589",
+                "15267163086",
+                "17791776120",
+                "19857124399",
+                "15858297095",
+                "18279055251",
+                "17682300802",
+                "15228949530",
+                "13524587246",
+                "15620552019",
+                "18683616506",
+                "13408015748",
+                "13913730634",
+                "15332315975",
+                "18868802950",
+                "18230107901",
+                "18367821189",
+                "15651615092",
+                "15680573913",
+                "15328183610",
+                "18270824772",
+                "15757189113",
+                "18706805139",
+                "13424441897",
+                "15375687185",
+                "18482270702",
+                "15850561758",
+                "13957795236",
+                "19817711781",
+                "18092719836",
+                "13488477632",
+                "13895461198",
+                "18758271681",
+                "17858603330",
+                "15621023159",
+                "15738531696",
+                "13525071538",
+                "15858181363",
+                "15178725899",
+                "18768417808",
+                "13289815592",
+                "13508506578",
+                "17639411957",
+                "13757174079",
+                "15191024238",
+                "17764558635",
+                "15957152408",
+                "18888928715",
+                "15988879266",
+                "13572525540",
+                "17858955042",
+                "15868157451",
+                "13735485537",
+                "18368497686",
+                "13736912611",
+                "15168483201",
+                "15922337143",
+                "17396247720",
+                "15707722551",
+                "18768110676",
+                "13957983264",
+                "13588810732",
+                "15112445545",
+                "18868101349",
+                "18611395335",
+                "15814404625",
+                "18605227853",
+                "15757517964",
+                "18096049625"};
+        List<String> phoneList = Arrays.asList(str);
+        for (int i=0;i<phoneList.size(); i++) {
+
+        }
+
     }
 }

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

@@ -6,16 +6,19 @@
     <resultMap id="BaseResultMap" type="com.management.platform.entity.AuditWorkflowTimeSetting">
         <id column="id" property="id" />
         <result column="company_id" property="companyId" />
-        <result column="role_id" property="roleId" />
-        <result column="role_name" property="roleName" />
-        <result column="seq" property="seq" />
+        <result column="dept_id" property="deptId" />
         <result column="user_id" property="userId" />
         <result column="user_name" property="userName" />
+        <result column="seq" property="seq" />
+        <result column="audit_dept_id" property="auditDeptId" />
+        <result column="audit_dept_name" property="auditDeptName" />
+        <result column="type" property="type" />
+        <result column="is_final" property="isFinal" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, role_id, role_name, seq, user_id, user_name
+        id, company_id, dept_id, user_id, user_name, seq, audit_dept_id, audit_dept_name, type, is_final
     </sql>
 
 </mapper>

BIN
fhKeeper/formulahousekeeper/management-platform/人员导入模板 (1).xlsx


BIN
fhKeeper/formulahousekeeper/management-platform/人员导入模板 (4).xlsx


BIN
fhKeeper/formulahousekeeper/management-platform/人员导入模板.xlsx


BIN
fhKeeper/formulahousekeeper/management-platform/员工工时导入模板 (14).xlsx


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

@@ -4,19 +4,19 @@ var path = require('path')
 // var ip = '192.168.2.36'
 
  
-var ip = '47.100.37.243'
+// var ip = '47.100.37.243'
 // var ip = '192.168.2.136'
 
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
 
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 
 module.exports = {
   build: {

+ 11 - 1
fhKeeper/formulahousekeeper/timesheet/src/routes.js

@@ -301,7 +301,17 @@ export const allRouters = [//组织架构
             { path: '/team', component: team, name: '组织架构' },
         ]
     },
-    
+    {
+        
+        path: '/',
+        component: Home,
+        name: '',
+        iconCls: 'iconfont firerock-iconliucheng',
+        leaf: true,//只有一个节点
+        children: [
+            { path: '/workflow', component: workflow, name: '审批流程设置' },
+        ]
+    },
     //设置时间类型
     {
         

+ 34 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -72,8 +72,8 @@
                     <el-form-item style="float:right;">
                         <el-link type="primary" :underline="false" href="./upload/人员导入模板.xlsx" download="人员导入模板.xlsx">模板下载</el-link>
                     </el-form-item>
-                    <el-form-item  v-if="depData != null && depData.id != -1 && depData.id != 0" style="float:right;border: 0.5px solid #20a0ff;height: 27px;margin-top: 6px;">
-                    </el-form-item>
+                    <!-- <el-form-item  v-if="depData != null && depData.id != -1 && depData.id != 0" style="float:right;border: 0.5px solid #20a0ff;height: 27px;margin-top: 6px;">
+                    </el-form-item> -->
                     <!-- <el-form-item style="float:right;">
                         <el-link type="danger" v-if="depData != null && depData.id != -1 && depData.id != 0" :underline="false" @click="deleteDep(null)">删除部门</el-link>
                     </el-form-item>
@@ -133,7 +133,7 @@
                         <el-link @click.native="showSalaryList(scope.row)"><i class="iconfont firerock-iconrecord"></i></el-link>
                     </template>
                 </el-table-column>
-                <el-table-column label="操作" width="280">
+                <el-table-column label="操作" width="330">
                     <template slot-scope="scope">
                         <!-- <el-button size="small" v-if="scope.row.role == 0 && user.role == 1" @click="switchRole(scope.$index)">切换为管理员</el-button>
                         <el-button size="small" v-if="scope.row.role == 2 && user.role == 1" @click="switchRole(scope.$index)">切换为员工</el-button> -->
@@ -141,6 +141,7 @@
                         <el-button size="mini" type="default" v-if="scope.row.role != 1" @click="resetPwd(scope.row)">重置</el-button>
                         <el-button size="mini" type="primary" v-if="scope.row.role != 1" @click="openInsertDialog(scope.$index)">编辑</el-button>
                         <el-button size="mini" type="primary" v-if="scope.row.role == 1" @click="openInsertDialog1(scope.$index)">编辑</el-button>
+                        <el-button size="mini" type="danger"  v-if="scope.row.role != 1" @click="deleteUser(scope.row)">删除</el-button>
                         <el-button size="mini" type="default" v-if="scope.row.role != 1 && scope.row.isActive==1" @click="showDeactiveDialog(scope.row)">停用</el-button>
                         <el-button size="mini" type="success" v-if="scope.row.role != 1 && scope.row.isActive==0" @click="setActive(scope.row, 1)">启用</el-button>
                     </template>
@@ -482,8 +483,36 @@
             };
         },
         methods: {
+            deleteUser(targetUser) {
+                this.$confirm("确定要删除该员工吗?", "提示", {
+                    //type: 'warning'
+                }).then(() => {
+                    this.http.post('/user/deleteUser', {
+                        userId: targetUser.id,
+                    },
+                    res => {
+                        if (res.code == "ok") {
+                            this.$message({
+                                message: '删除成功',
+                                type: "success"
+                            });
+                            this.getUser()
+                        } else {
+                            this.$message({
+                            message: res.msg,
+                            type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                })
+            },
             chufa(data, b, c, e) {
-                console.log(78)
                 if(this.depData == null || data.id != this.depData.id) {
                     // this.depData = data.id
                     this.depData = data;
@@ -743,9 +772,7 @@
                     this.listLoading = true;
                     let formData = new FormData();
                     formData.append("file", item.file);
-                    if(this.depData.label != '全部人员') {
-                        formData.append("departmentId", this.depData.id);
-                    }
+                    
                     this.http.uploadFile( this.port.manage.import, formData,
                     res => {
                         this.$refs.upload.clearFiles();

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

@@ -29,7 +29,7 @@
                         <el-option value="1" label="已通过">已通过</el-option>
                         <el-option value="0" label="待审核">待审核</el-option>
                         <el-option value="2" label="不通过">不通过</el-option>
-                        <el-option value="3" label="已撤回">已撤回</el-option>
+                        <el-option value="3" label="待提交">待提交</el-option>
                         </el-select></div>
                     <div>
                         <el-tree :data="data"  @node-click="handleNodeClick" >
@@ -50,7 +50,7 @@
                             未通过
                             </span>
                             <span v-if="data.isUser == 1 && data.state == 3" style="color:red;">
-                            已撤回
+                            待提交
                             </span>
                             </div>
                         </span>
@@ -124,7 +124,7 @@
                                             <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 || item2.state == -1">[ 待审核 ]</span>
                                             <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">[ 已通过 ]</span>
                                             <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">[ 已驳回 ] 原因:{{item2.rejectReason}}</span>
-                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">[ 已撤回 ]</span>
+                                            <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">[ 待提交 ]</span>
                                             </span>
                                             <!-- <el-button v-if="(user.role == 1 || user.role == 2) && item2.state != 1 && user.manageDeptId != 0" size="mini" @click="guanli(item2, item1)" style="float: right;">删除</el-button> -->
                                             <span v-if="user.company.packageEngineering == 1">
@@ -134,7 +134,7 @@
                                                 <span style="margin-left:15px;color:#DAA520;" v-if="item2.state == 0 && item2.departmentAuditState == 1">[ 待项目经理审核 ]</span>
                                                 <span style="margin-left:15px;color:#32CD32;" v-else-if="item2.state == 1">[ 已通过 ]</span>
                                                 <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 2">[ 已驳回 ] 原因:{{item2.rejectReason}}</span>
-                                                <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">[ 已撤回 ]</span>
+                                                <span style="margin-left:15px;color:#FF0000;" v-else-if="item2.state == 3">[ 待提交 ]</span>
                                             </span>
                                             </p>
                                             <p v-if="user.timeType.customDegreeActive==1 && item2.degree_id != null">{{user.timeType.customDegreeName}}:{{item2.degreeName}}</p>
@@ -456,7 +456,8 @@
             <span slot="footer" class="dialog-footer">
                 <el-button @click="deleteReport" v-if="workForm.domains[0].id != null">删除</el-button>
                 <el-button @click="dialogVisible = false">取消</el-button>
-                <el-button type="primary" @click="submitDepartment"
+                <el-button @click="submitDepartment(1)" :disabled="workForm.domains.length==0?true:(canEdit?false:true)">暂存</el-button>
+                <el-button type="primary" @click="submitDepartment(0)"
                 :disabled="workForm.domains.length==0?true:(canEdit?false:true)" >提交</el-button>
             </span>
         </el-dialog>
@@ -833,6 +834,7 @@
     export default {
         data() {
             return {
+                isDraft: 0,
                 timeStamp: 0,
                 projectColumns:[],
                 checkinLoading:false,
@@ -3135,7 +3137,8 @@
             },
 
             // 保存日报
-            submitDepartment() {
+            submitDepartment(isDraft) {
+                this.isDraft = isDraft;
                 this.$refs.workForm.validate(valid => {
                     if (valid) {
                         this.dateAr = []
@@ -3259,6 +3262,7 @@
                         
                         this.listLoading = true;
                         let formData = new FormData();
+                        formData.append("draft", this.isDraft);
                         for(var i in this.workForm.domains) {
                             if(this.workForm.domains[i].degreeId) {
                                 // var sss = this.workForm.domains[i].degreeId.toString()
@@ -3392,7 +3396,7 @@
                             this.listLoading = false;
                             if (res.code == "ok") {
                                 this.$message({
-                                    message: "填报成功",
+                                    message: this.isDraft==0?"提交成功":"暂存成功",
                                     type: "success"
                                 });
                                 this.dialogVisible = false;

+ 194 - 85
fhKeeper/formulahousekeeper/timesheet/src/views/workflow/report.vue

@@ -4,56 +4,77 @@
             <el-form :inline="true">
                 <el-form-item label="审批流程设置">
                 </el-form-item>
-                <el-form-item  style="float:right">
-                    <el-button  type="primary" @click="submitInsert" :loading="addLoading">保存</el-button>
-                </el-form-item>
             </el-form>
         </el-col>
         <p style="padding-top:80px;margin: 0 0 10px 10px;color:#666;">工时审批流程</p>
-        <div class="panel" style="margin-left:20px;margin-right:20px;">
-          <el-button type="primary">员工填报</el-button>
-          <icon class="iconfont firerock-iconright" ></icon>
-          <el-button type="primary">项目负责人</el-button>
-          <icon class="iconfont firerock-iconright"></icon>
-          <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(0)"></icon>
-          <icon class="iconfont firerock-iconright"></icon>
-          <span v-for="(item, index) in dataArray" :key="item.roleId" >
-            <el-button type="primary" @click="editNodeDialog(index, item)">{{item.roleName}}<span v-if="item.userId != null">({{item.userName}})</span></el-button>
-            <icon class="iconfont firerock-iconright"></icon>
-            <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
-            <icon class="iconfont firerock-iconright"></icon>
-          </span>
+        <div>
+        <el-col :span="6" >
+            <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-left:15px;" >
+            <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
+                <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" accordion></el-tree>
+            </div>
+            </el-scrollbar>
+        </el-col>
+        <el-col :span="18" >
+            <el-scrollbar style="height:100%;border:1px solid #dddddd;margin-right:20px;" >
+            <div class="tree" :style="'height:'+ (tableHeight-120) + 'px'">
+                <div style="padding:5px;color:#333;" v-if="depData != null && depData.children == null">设置 &lt;<span style="color:#20a0ff;">{{depData.label}}&gt;</span> 工时审批流程</div>
+                <div style="padding:5px;" v-if="depData == null || depData.children != null">请选择最末级部门</div>
+                <div style="width:100%;margin:0 auto;text-align: center; margin-top:50px;" v-if="depData != null && depData.children == null">
+                    <span>员工填报</span>
+                    <icon class="iconfont firerock-iconright"></icon>
+                    <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(0)"></icon>
+                    <icon class="iconfont firerock-iconright"></icon>
+                    <span v-for="(item, index) in dataArray" :key="item.seq" >
+                        
+                        <el-button type="primary" v-if="item.type == 0" @click="editNodeDialog(index, item)">{{item.auditDeptName}}</el-button>
+                        <el-button type="primary" v-if="item.type == 1" @click="editNodeDialog(index, item)">项目负责人</el-button>
+                        <icon class="iconfont firerock-iconright"></icon>
+                        <icon class="iconfont firerock-iconInsertLine addNode" @click="showNodeDialog(index+1)"></icon>
+                        <icon class="iconfont firerock-iconright"></icon>
+                    </span>
 
-          <!--结束点 -->
-          <icon class="iconfont firerock-iconApp_New_Line" style="color:#20A0FF;"></icon>
-        </div>
-        <div style="width:80px;margin:0 auto;padding:20px;">
-            <el-button type="primary" @click="submitInsert" :loading="addLoading">保存</el-button>
+                    <!--结束点 -->
+                    <icon class="iconfont firerock-iconApp_New_Line" style="color:#20A0FF;"></icon>
+                    审批完成
+                </div>
+
+                <div style="width:100%;margin:0 auto;margin-bottom:30px;position: absolute;bottom: 0px;text-align: center; ">
+                    <el-button type="primary" @click="submitInsert" :loading="addLoading">保存</el-button>
+                </div>
+            </div>
+            </el-scrollbar>
+            
+        </el-col>
         </div>
-        <!--人员列表 -->
-        <el-dialog  title="请选择审批角色" v-if="dialogVisible" :visible.sync="dialogVisible"  width="400px">
+        
+        <!--部门选择列表 -->
+        <el-dialog  title="请选择审批部门" v-if="dialogVisible" :visible.sync="dialogVisible"  width="400px">
               <el-form label-width="80px">
-              <el-form-item label="角色" >
-                  <el-select style="width:100%;" v-model="curRoleId" >
-                    <el-option v-for="item in roleArray"  :label="item.label"  :value="item.value" :key="item.name">
-                        {{item.label}}
-                    </el-option>
-                  </el-select>
-              </el-form-item>
-              <el-form-item label="指定人员" v-if="curRoleId==4">
-                  <el-select style="width:100%;" v-model="curUserId" >
-                    <el-option v-for="item in userList"  :label="item.name"  :value="item.id" :key="item.id">
-                        {{item.name}}
-                    </el-option>
-                  </el-select>
+              <el-form-item label="选择部门" >
+                  <el-cascader ref="deptCascader"  v-model="curDeptId" placeholder="请选择部门" style="width: 100%" @change="chooseDept"
+                    :options="option" :props="{ checkStrictly: true,expandTrigger: 'hover' }" :show-all-levels="false" clearable></el-cascader>
               </el-form-item>
               </el-form>
-
             <div slot="footer" class="dialog-footer">
               <el-button type="default" @click="deleteNode" v-if="!isAdd" style="float:left;">删除</el-button>
                 <el-button type="primary" @click="addNode" >确定</el-button>
             </div>
         </el-dialog>
+
+        <!--管理员设置 -->
+        <el-dialog  title="请选择审批管理员" v-if="userDialogVisible" :visible.sync="userDialogVisible"  width="400px">
+              <el-form label-width="100px">
+              <el-form-item label="指定管理员" >
+                  <el-select v-model="auditManagerId" >
+                      <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                  </el-select>
+              </el-form-item>
+              </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="setAuditUser" >确定</el-button>
+            </div>
+        </el-dialog>
     </section>
 </template>
 <script>
@@ -62,50 +83,159 @@
     export default {
         data() {
             return {
+                data: [
+                ],
+                option: [],
+                depData:null,
+                defaultProps: {
+                    children: 'children',
+                    label: 'label'
+                },
+                userDialogVisible: false,
+                auditManagerId:null,
                 isAdd: false,
                 dataArray:[],
-                curRoleId:null,
+                curDeptId:null,
                 curUserId: null,
                 index:0,
                 roleArray:[
                 {label:"项目管理员",value:5},
                 {label:"部门主管",value:6},
-                {label:"财务管理员",value:4},
+                {label:"人事管理员",value:4},
                 ],
                 dialogVisible:false,
                 editNode:{},
                 user: JSON.parse(sessionStorage.getItem("user")),
                 userList:[],
+                sysAuditUSer:{}
             };
         },
         methods: {
+            setAuditUser() {
+                this.http.post('/audit-workflow-time-setting/setAuditSysUser',{userId: this.auditManagerId},
+                    res => {
+                        this.listLoading = false;
+                        if (res.code == "ok") {
+                            this.sysAuditUSer = res.data;
+                            this.userDialogVisible = false;
+                            this.$message({
+                                message: '设置成功',
+                                type: "success"
+                            });
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                        }
+                    );
+            },
+            showUserDialog() {
+                this.userDialogVisible = true;
+                this.auditManagerId = this.sysAuditUSer.id;
+
+            },
+            getAuditSysUser() {
+                this.http.post('/audit-workflow-time-setting/getAuditSysUser',{},
+                    res => {
+                        this.listLoading = false;
+                        if (res.code == "ok") {
+                            this.sysAuditUSer = res.data;
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    },
+                    error => {
+                        this.listLoading = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                        }
+                    );
+            },
+            // 获取部门列表
+            getDepartment() {
+                this.http.post( this.port.manage.depList, {},
+                res => {
+                    if (res.code == "ok") {
+                        var list = res.data , list1 = JSON.parse(JSON.stringify(res.data));
+                        this.data = list;
+                        this.option = this.changeArr(list1);
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+
+            // 修改数组
+            changeArr(arr) {
+                for (var i = 0; i < arr.length; i++) {
+                    if(arr[i].id != -1 && arr[i].id != 0) {
+                        if (arr[i].children != null && arr[i].children.length>0) {
+                            arr[i].children = this.changeArr(arr[i].children);
+                        }
+                        arr[i].id && (arr[i].value = arr[i].id);
+                        delete arr[i].id;
+                    }
+                }
+                for(var i in arr) {
+                    if(arr[i].id == -1 || arr[i].id == 0) {
+                        arr.splice(i,1)
+                    }    
+                }
+                return arr;
+            },
+
+            // 部门列表点击
+            handleNodeClick(data) {
+                if(this.depData == null || data.id != this.depData.id) {
+                    this.depData = data;
+                    console.log(this.depData);
+                    if (this.depData.children == null) {
+                        this.getSettings();
+                    }
+                }
+            },
+
             deleteNode() {
               this.dialogVisible = false;
               this.dataArray.splice(this.index, 1);
             },
+
             addNode() {
               this.dialogVisible = false;
-              if (this.curRoleId == null) return;
-              var label = this.roleArray.filter(r=>r.value == this.curRoleId)[0].label;
+              if (this.curDeptId == null) return;
+              var node = this.$refs.deptCascader.getCheckedNodes()[0];
+              
               if (this.isAdd) {
-                var node = {roleId: this.curRoleId, roleName: label};
-                if (this.curUserId != null) {
-                  node.userId = this.curUserId;
-                  node.userName = this.userList.filter(u=>u.id == node.userId)[0].name;
-                }
+                var node = {auditDeptId: node.value, auditDeptName: node.label, type:0};
                 this.dataArray.splice(this.index, 0, node);
+                console.log(this.dataArray);
               } else {
                 //编辑
-                this.dataArray[this.index].roleId = this.curRoleId;
-                this.dataArray[this.index].roleName = label;
-                this.dataArray[this.index].userId = this.curUserId;
-                let uid = this.curUserId;
-                console.log(uid);
-                if (uid != null) {
-                  this.dataArray[this.index].userName = this.userList.filter(u=>u.id == uid)[0].name;
-                } else {
-                  this.dataArray[this.index].userName = null;
-                }
+                this.dataArray[this.index].auditDeptId = node.value;
+                this.dataArray[this.index].auditDeptName = node.label;
               }
             },
             editNodeDialog(index, item) {
@@ -113,40 +243,18 @@
                 this.index = index;
                 this.curUserId = item.userId;
                 this.dialogVisible = true;
-                this.curRoleId = item.roleId;
+                this.curDeptId = item.deptId;
             },
             showNodeDialog(index) {
               this.isAdd = true;
               this.index = index;
-              this.curRoleId = null;
+              this.curDeptId = null;
               this.curUserId = null;
               this.dialogVisible = true;
             },
             
-            getHRList() {
-              this.http.post('/user/getHRList',{},
-                            res => {
-                                this.listLoading = false;
-                                if (res.code == "ok") {
-                                    this.userList = res.data;
-                                } else {
-                                    this.$message({
-                                        message: res.msg,
-                                        type: "error"
-                                    });
-                                }
-                            },
-                            error => {
-                                this.listLoading = false;
-                                this.$message({
-                                    message: error,
-                                    type: "error"
-                                });
-                                }
-                            );
-            },
             submitInsert() {
-                this.http.post('/audit-workflow-time-setting/add',{json:JSON.stringify(this.dataArray)},
+                this.http.post('/audit-workflow-time-setting/add',{json:JSON.stringify(this.dataArray), deptId: this.depData.id},
                             res => {
                                 this.listLoading = false;
                                 if (res.code == "ok") {
@@ -173,11 +281,12 @@
 
             // 获取本公司的工时日报审批流程设置
             getSettings() {
-                this.http.post('/audit-workflow-time-setting/get',{},
+                this.http.post('/audit-workflow-time-setting/get',{deptId: this.depData.id},
                     res => {
                         this.listLoading = false;
                         if (res.code == "ok") {
                             this.dataArray = res.data;
+                            console.log(this.data);
                         } else {
                             this.$message({
                                 message: res.msg,
@@ -205,8 +314,8 @@
             };
         },
         mounted() {
-            this.getHRList();
-            this.getSettings();
+            this.getDepartment();
+
         }
     };
 </script>
@@ -220,7 +329,7 @@
 }
 
 .panel {
-    padding:50px 15px ;box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
+    padding:30px 15px ;box-shadow: 0 2px 4px rgba(3, 3, 3, 0.12), 0 0 6px rgba(0, 0, 0, .04);
     
 }
 .sample {

+ 7 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/router/index.js

@@ -109,6 +109,13 @@ const router = new Router({
         },
         component: () => import("@/views/error/index")
     },
+    {
+        path: "/test",
+        meta: {
+            title: "测试页面"
+        },
+        component: () => import("@/views/test/index")
+    },
     {
         path: "/my",
         component: () => import("@/views/my/index"),

+ 86 - 25
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -182,13 +182,18 @@
                     </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;">
-                        <img  :src="p" style="width:100px; height:100px;" @click="showLargeImg(item.pics, index)"/>
+                        <div class="imgList">    
+                            <van-icon v-if="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>
                     </div>
                     <div style="padding:5px;text-align:center;" v-if="isIOSystem">
-                        
                         <span v-for="(p, index) in item.iospics"  :key="p" style="margin-right:15px;">
-                        <img  :src="p" style="width:100px; height:100px;" @click="showLargeImg(item.iospics, index)"/>
+                        <div class="imgList">
+                            <van-icon  v-if="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>
                     </div>
                     <van-popup v-model="imgShow" position="bottom" closeable >
@@ -207,10 +212,18 @@
                 icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 50px;"> + 新增项目  </span></van-tag>
             </div>  
             <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
-                <van-button v-if="canEdit" block type="info" native-type="submit"> 提交 </van-button>
-                
-                <p v-if="canEdit&&form.domains.length>0 && form.domains[0].id != null" block type="default" 
-                    style="padding-top:30px;font-size:15px;color:#666;margin:0 auto;text-align:center;padding-bottom:10px;background:#ffffff;" @click="deleteReport"> 删除 </p>
+                <div style="padding-bottom:10px;">
+                    <van-button v-if="canEdit" square block type="info" @click="isDraft=0" native-type="submit" style="width:50%;float:left;"> 提交 </van-button>
+                    <van-button v-if="canEdit" square block type="default" @click="isDraft=1" native-type="submit" style="width:50%;float:left;"> 暂存 </van-button>
+                </div>
+                 <van-button v-if="canEdit&&form.domains.length>0 && form.domains[0].id != null" 
+                        square block type="default" @click="deleteReport" native-type="button" 
+                    style=""> 删除 </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> -->
+                <!-- <van-button v-if="canEdit" square block type="default" @click="deleteReport" native-type="button" 
+                    style="margin-top:10px;"> 删除 </van-button> -->
             </div>
         </van-form>
         <div style="position:fixed; bottom:0px;width:100%;">
@@ -227,6 +240,7 @@
     export default {
         data() {
             return {
+                isDraft:0,
                 showWorkStartTime:false,
                 showWorkEndTime:false,
                 curWorktime:null,
@@ -329,26 +343,39 @@
                         var localIds = res.localIds; // 返回选定照片的本地ID列表,
                                 // andriod中localId可以作为img标签的src属性显示图片;
                                 // iOS应当使用 getLocalImgData 获取图片base64数据,从而用于img标签的显示(在img标签内使用 wx.chooseImage 的 localid 显示可能会不成功)
-                        
+                        if (that.form.domains[index].pics == null) {
+                            that.form.domains[index].pics = [];
+                            that.form.domains[index].iospics = [];
+                        }
                         if (that.isIOSystem) {
-                            var retArray = [];
-                            
                             for (var i=0;i<localIds.length; i++) {
                                 wx.getLocalImgData({
                                     localId: localIds[i], // 图片的localID
                                     success: function (res) {
                                         var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
-                                        retArray.push(localData);
+                                        that.form.domains[index].iospics.push(localData);
+                                        that.$forceUpdate();
                                     }
                                 });
                             }
-                            that.form.domains[index].iospics = retArray;
-                            that.form.domains[index].pics = localIds; 
+                            
+                            if (that.user.companyId == 7) {
+                                that.form.domains[index].pics = that.form.domains[index].pics.concat(localIds); 
+                            } else {
+                                that.form.domains[index].pics = localIds;
+                            }
                         } else {
-                            that.form.domains[index].pics = localIds; 
-                            that.$forceUpdate();   
+                            if (that.user.companyId == 7) {
+                                that.form.domains[index].pics = that.form.domains[index].pics.concat(localIds); 
+                            } else {
+                                that.form.domains[index].pics = localIds;
+                            }
+                            that.$forceUpdate();                            
+                        }
+                        // var serverIdList = [];
+                        if (that.form.domains[index].serverPics == null) {
+                            that.form.domains[index].serverPics = [];
                         }
-                        var serverIdList = [];
                         //立即就上传到企业微信服务器
                         for (var i=0;i<localIds.length; i++) {
                             wx.uploadImage({
@@ -356,11 +383,11 @@
                                 isShowProgressTips: 1, // 默认为1,显示进度提示
                                 success: function (res) {
                                     var serverId = res.serverId; // 返回图片的服务器端ID
-                                    serverIdList.push(serverId);
+                                    // serverIdList.push(serverId);
+                                    that.form.domains[index].serverPics.push(serverId);
                                 }
                             });
                         }
-                        that.form.domains[index].serverPics = serverIdList;
                     }
                 });
             },
@@ -626,6 +653,12 @@
                                         wuduName = sss[s].name
                                     }
                                 }
+                                let serverPicArray = [];
+                                console.log('picArray=='+list[i].picStr);
+                                if (list[i].picStr != null && list[i].picStr != '@') {
+                                    serverPicArray = JSON.parse(list[i].picStr.replace(/@/g,","));
+                                }
+                                
                                 
                                 array.push({
                                     id: list[i].id,
@@ -646,6 +679,7 @@
                                     professionProgress:list[i].professionProgressList,
                                     pics: list[i].pics,
                                     iospics:list[i].pics,
+                                    serverPics:serverPicArray,
                                     multiWorktime:t.multiWorktime,
                                     worktimeList:list[i].worktimeList,
                                     wuduList: list[i].degreeList,
@@ -674,7 +708,7 @@
                                 isOvertime:false,
                                 professionProgress:[],
                                 multiWorktime:t.multiWorktime,
-                                worktimeList:[{}]
+                                worktimeList:[{}],  
                             }]
                             this.canEdit = true;
                         }
@@ -865,8 +899,6 @@
 
             // 提交日报
             register() {
-                console.log(this.form, '看啊可能')
-                // return
                 this.dateAr = []
                 let alp = []
                 if(this.user.timeType.multiWorktime == 1) {
@@ -896,6 +928,7 @@
                     duration: 0
                 });
                 let formData = new FormData();
+                formData.append("draft", this.isDraft);
                 if (this.reportTimeType.type == 0) {
                     var alldayNum = 0;
                     var amNum = 0;
@@ -992,7 +1025,7 @@
                     } else {
                         formData.append("professionProgress", "[]");
                     }
-                    //图片的处理,只处理当前通过手机拍摄的新的照片
+                    //图片的处理,serverPic是当前所有的照片
                     if (this.form.domains[i].serverPics!= null && this.form.domains[i].serverPics.length > 0) {
                         let m = JSON.stringify(this.form.domains[i].serverPics);
                         m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
@@ -1000,6 +1033,7 @@
                     } else {
                         formData.append("pics", "@");
                     }
+                    
                     //处理多个时间事项
                     if (this.reportTimeType.multiWorktime == 1) {
                         //检查时间是否有重叠
@@ -1043,11 +1077,13 @@
                 .then(res => {
                     if(res.code == "ok") {
                         toast.clear();
-                        this.$toast.success('填报成功');
-                        this.$router.push("/index");
+                        this.$toast.success(this.isDraft==0?'提交成功':'暂存成功');
+                        if (this.isDraft==0) {
+                            this.$router.push("/index");
+                        }
                     } else {
                         toast.clear();
-                        this.$toast.fail('填报失败');
+                        this.$toast.fail((this.isDraft==0?'提交失败':'暂存成功')+':'+res.msg);
                     }
                 }).catch(err=> {toast.clear();});
             },
@@ -1084,6 +1120,19 @@
                             }
                         }).catch(err=> {this.$toast.fail('发生异常'+err);console.log(err)});
                 
+            },
+            deleteImg(item, index) {
+                //删除添加的图片
+                if (this.isIOSystem) {
+                    item.iospics.splice(index,1);
+                    item.iospics = item.iospics;
+                }
+                item.pics.splice(index,1);
+                item.pics = item.pics;
+
+                //传递到后台的数据也要做同步删除
+                item.serverPics.splice(index,1);
+                this.$forceUpdate();
             }
         },
         
@@ -1201,6 +1250,18 @@
     background-color: #1989fa;
     border-radius: 100px;
   }
+  .imgList {
+    position: relative;
+    width: 100px;
+    height: 100px;
+    display: inline-block;
+  }
+  .imgList_i {
+      position: absolute;
+      top: -8px;
+      right: -6px;
+      z-index: 1;
+  }
 </style>
 
 

+ 113 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/views/test/index.vue

@@ -0,0 +1,113 @@
+<template>
+    <div class="body">
+        <van-swipe class="my-swipe" :autoplay="3000" :height="200" indicator-color="white">
+            <van-swipe-item v-for="(item, index) in images" :key="index" class="swipe-img">
+                <img :src="item"/>
+            </van-swipe-item>
+        </van-swipe>
+        
+    </div>
+</template>
+
+<script>
+    import Footer from "@/components/Footer";
+
+    export default {
+        data() {
+            return {
+                isCorpWX:false,
+                isWX:false,
+                user: JSON.parse(localStorage.userInfo),
+                unreadNum:0,
+                images: [
+                    // require('../../assets/img/index/banner_1.png'),
+                    require('../../assets/img/index/banner4.jpeg'),
+                    // require('../../assets/img/index/banner_3.png'),
+                ],
+                routers: [
+                    {
+                        name: '查看日报',
+                        url: '/calendar',
+                        icon: 'description'
+                    },
+                    
+                    {
+                        name: '填写日报',
+                        url: '/edit',
+                        icon: 'edit'
+                    },
+                    
+                    
+                ],
+            };
+        },
+        created() {
+            let index = this.active + 1;
+            this.list = this[`list${index}`]; // this.list1
+        },
+        mounted() {
+            var ua = navigator.userAgent.toLowerCase();
+            if (ua.indexOf("wxwork") > 0) {
+                this.isCorpWX = true;
+            } else if (ua.indexOf("micromessenger") > 0) {
+                this.isWX = true;
+            }
+            this.test();
+        },
+        components: {
+            Footer
+        },
+        methods: {
+            //获取账户信息
+            test() {
+                var array = ["111", "222", "333"];
+                var ret = array.splice(1,1);
+                alert(ret);
+                // this.$axios.get('/user/loginByUserId', {params:{userId: this.user.id}})
+                //             .then(res => {
+                //                 console.log(res);
+                //                 if (res.code == 'error') {
+                //                     localStorage.errorMsg = res.msg;
+                //                     //账号信息有问题,不能使用。
+                //                     this.$router.push("/error");
+                //                 } else {
+                                    
+                //                     localStorage.userInfo = JSON.stringify(res.data);
+                //                     this.user = res.data;
+                //                 } 
+                //             }).catch(err=> {
+                //                 alert('err=' + err);
+                //             });
+            },
+            
+        },
+        activated(){
+            
+        }
+    };
+</script>
+
+<style lang="less" scoped>
+    .swipe-img {
+        img {
+            width: 100%;
+            height: 100%;
+        }
+    }
+
+    .body {
+        height: calc(100vh - 50px);
+        position: relative;
+    }
+
+    .tip {
+        position: absolute;
+        width: 100%;
+        bottom: 5px;
+        font-size: 14px;
+        color: #8f8f8f;
+        margin-top: 20px;
+        text-align: center;
+        line-height: 20px;
+    }
+</style>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/calendar.vue

@@ -30,7 +30,7 @@
                 nowTime: this.format(new Date(new Date()),"yyyy-MM-dd"),
                 showPicker: false,
                 report: [],
-                statusTxt:["待审核", "已通过", "已驳回", "已撤销"],
+                statusTxt:["待审核", "已通过", "已驳回", "待提交"],
                 statusStyle:["waiting", "filledReportStyle", "RejectStyle", ""],
                 tableHeight:0,
             };

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

@@ -86,7 +86,7 @@
                 showPicker: false,
                 report: [],
                 fullDayTxt:['全天','上午','下午'],
-                statusTxt:["待审核", "已通过", "已驳回", "已撤销"],
+                statusTxt:["待审核", "已通过", "已驳回", "待提交"],
             };
         },
         created() {

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

@@ -5,16 +5,16 @@ const themePath = path.resolve(__dirname,'src/assets/style/theme.less');
 
 // var ip = '127.0.0.1'
 // var ip = '192.168.2.105'
-var ip = '47.100.37.243'
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+// var ip = '47.100.37.243'
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 
 module.exports = {
     // 关闭eslint检查