Explorar o código

项目报告审核中,成都明夷电子支持按批量填报的作为一条记录来审核

seyason hai 1 ano
pai
achega
178773a386
Modificáronse 16 ficheiros con 528 adicións e 199 borrados
  1. 50 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportBatchController.java
  2. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  3. 17 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  4. 99 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportBatch.java
  5. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportBatchMapper.java
  6. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportBatchService.java
  7. 162 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportBatchServiceImpl.java
  8. 26 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  9. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportBatchMapper.xml
  10. 43 42
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  11. 14 12
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  12. 5 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  13. 5 108
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/team/index.vue
  14. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  15. 2 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  16. 44 25
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

+ 50 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportBatchController.java

@@ -0,0 +1,50 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.service.ReportBatchService;
+import com.management.platform.service.ReportService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-08-10
+ */
+@RestController
+@RequestMapping("/report-batch")
+public class ReportBatchController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ReportBatchService reportBatchService;
+
+    @Resource
+    private ReportService reportService;
+
+    @RequestMapping("/getAuditList")
+    public HttpRespMsg getAuditList(@RequestParam Integer state,
+                                    Integer departmentId,
+                                    Integer projectId,
+                                    String date,
+                                    String startDate,
+                                    String endDate,
+                                    String userId,
+                                    HttpServletRequest request) {
+
+        return reportBatchService.getAuditList(state,departmentId,projectId,date,startDate,endDate,userId,request);
+    }
+}
+

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

@@ -85,6 +85,8 @@ public class ReportController {
     @Resource
     private ProjectMapper projectMapper;
     @Resource
+    private CompanyMapper companyMapper;
+    @Resource
     private SysFunctionMapper sysFunctionMapper;
     @Resource
     ProjectCategoryMapper projectCategoryMapper;

+ 17 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -1,9 +1,16 @@
 package com.management.platform.entity;
 
+import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.management.platform.entity.vo.WorktimeItem;
 import lombok.Data;
@@ -11,20 +18,13 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.List;
-
 /**
  * <p>
  * 
  * </p>
  *
  * @author Seyason
- * @since 2022-08-23
+ * @since 2023-08-10
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -363,6 +363,13 @@ public class Report extends Model<Report> {
     private User auditorThird;
     @TableField(exist = false)
     private User ccUserid;
+    /**
+     * 批量填报时的report_batch表id
+     */
+    @TableField("batch_id")
+    private Integer batchId;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 99 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportBatch.java

@@ -0,0 +1,99 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-08-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportBatch extends Model<ReportBatch> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * 开始日期
+     */
+    @TableField("start_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 结束日期
+     */
+    @TableField("end_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 总工作时长
+     */
+    @TableField("total_work_time")
+    private Double totalWorkTime;
+    @TableField(exist = false)
+    private Double reportTime;
+
+    /**
+     * 0-待审核,1-已通过,2-已驳回
+     */
+    @TableField("state")
+    private Integer state;
+
+    @TableField("create_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField(exist = false)
+    private String name;
+
+    @TableField(exist = false)
+    private String departmentName;
+
+    @TableField(exist = false)
+    private List<Map> data;
+
+    @TableField(exist = false)
+    private String dateStr;
+
+
+    @TableField(exist = false)
+    private String reportIds;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

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

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

@@ -0,0 +1,20 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportBatch;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-08-10
+ */
+public interface ReportBatchService extends IService<ReportBatch> {
+
+    HttpRespMsg getAuditList(Integer state, Integer departmentId, Integer projectId, String date, String startDate, String endDate, String userId, HttpServletRequest request);
+}

+ 162 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportBatchServiceImpl.java

@@ -0,0 +1,162 @@
+package com.management.platform.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.*;
+import com.management.platform.service.ReportBatchService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
+import com.management.platform.util.MessageUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-08-10
+ */
+@Service
+public class ReportBatchServiceImpl extends ServiceImpl<ReportBatchMapper, ReportBatch> implements ReportBatchService {
+
+    @Resource
+    private UserFvTimeMapper userFvTimeMapper;
+    @Resource
+    private ReportBatchMapper reportBatchMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    @Resource
+    private ReportMapper reportMapper;
+
+    @Override
+    public HttpRespMsg getAuditList(Integer state, Integer departmentId, Integer projectId, String date, String startDate, String endDate, String userId, HttpServletRequest request) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        try {
+            User curUser = userMapper.selectById(request.getHeader("Token"));
+            Integer companyId = curUser.getCompanyId();
+            String leaderId = null;
+            List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "审核全员日报");
+            if (functionList.size() == 0) {//没有全员审核的权限
+                leaderId = curUser.getId();
+            }
+            List<String> targetUids = null;
+            if (!StringUtils.isEmpty(userId)) {
+                targetUids = ListUtil.convertLongIdsArrayToList(userId);
+            }
+            List<Map<String, Object>> auditReportList = reportMapper.getAuditReportList(date, companyId, departmentId, projectId, leaderId, 0, startDate, endDate, targetUids);
+            List<Integer> batchIds = new ArrayList<>();
+            for (Map<String, Object> map : auditReportList) {
+                Integer batchId = (Integer)map.get("batchId");
+                if (!batchIds.contains(batchId)) {
+                    batchIds.add(batchId);
+                }
+            }
+
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            List<ReportBatch> reportBatches = new ArrayList<>();
+            if (batchIds.size() > 0) {
+                reportBatches = reportBatchMapper.selectList(new QueryWrapper<ReportBatch>().in("id", batchIds).orderByDesc("id"));
+                reportBatches.forEach(batch -> {
+                    batch.setReportTime(batch.getTotalWorkTime());
+                    List<Map> filterMapList = new ArrayList<>();
+                    //取第一天的所有项目日报
+                    String firstDate = null;
+                    StringBuilder reportIds = new StringBuilder();
+                    for (Map<String, Object> map : auditReportList) {
+                        Integer batchId = (Integer)map.get("batchId");
+                        String curDate = (String)map.get("date");
+                        if (batch.getId().equals(batchId)) {
+                            if (firstDate == null) {
+                                firstDate = curDate;
+                                filterMapList.add(map);
+                            } else if (curDate.equals(firstDate)){
+                                filterMapList.add(map);
+                            }
+                            reportIds.append((Integer)map.get("id")).append(",");
+                        }
+                    }
+                    batch.setData(filterMapList);
+                    reportIds.deleteCharAt(reportIds.length()-1);
+                    batch.setReportIds(reportIds.toString());
+                    batch.setDateStr(batch.getStartDate().format(dtf)+" 至 "+batch.getEndDate().format(dtf));
+                    if (filterMapList.size() > 0) {
+                        //取第一个的姓名和部门名称
+                        batch.setName((String)filterMapList.get(0).get("name"));
+                        batch.setDepartmentName((String)filterMapList.get(0).get("departmentName"));
+                    }
+                });
+            }
+
+//
+//            //抽取姓名,进行分组
+//            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");
+//                String uid = (String)a.get("userId");
+//                String corpwxUserid = (String)a.get("corpwxUserid");
+//
+//                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);
+//                    lastName.put("userId", uid);
+//                    lastName.put("corpwxUserid", corpwxUserid);
+//                    nameList.add(lastName);
+//                    userDailyReportList = new ArrayList<>();
+//                    lastName.put("data", userDailyReportList);
+//                }
+//                //每组日报数据都加上去
+//                userDailyReportList.add(a);
+//            }
+//
+
+//            //设置每人每日考勤打卡时长
+//            QueryWrapper<UserFvTime> userFvTimeQueryWrapper = new QueryWrapper<>();
+//            if (nameList.size() > 0) {
+//                for (Map map : nameList) {
+//                    String itemUid = (String)map.get("userId");
+//                    String dateStr = (String)map.get("dateStr");
+//                    userFvTimeQueryWrapper.or(wrapper->wrapper.eq("user_id", itemUid).eq("work_date", dateStr));
+//                }
+//                List<UserFvTime> timeList = userFvTimeMapper.selectList(userFvTimeQueryWrapper);
+//                //过滤匹配当前的数据
+//                for (Map map : nameList) {
+//                    String itemUid = (String)map.get("userId");
+//                    String dateStr = (String)map.get("dateStr");
+//                    Optional<UserFvTime> first = timeList.stream().filter(time -> time.getUserId().equals(itemUid) && dtf.format(time.getWorkDate()).equals(dateStr)).findFirst();
+//                    if (first.isPresent()) {
+//                        double wh = first.get().getWorkHours();
+//                        //赋值打卡时长
+//                        map.put("cardHours", wh);
+//                    }
+//                }
+//            }
+            httpRespMsg.data = reportBatches;
+        } catch (NullPointerException e) {
+            //httpRespMsg.setError("验证失败");
+            e.printStackTrace();
+            httpRespMsg.setError(MessageUtils.message("access.verificationError"));
+            return httpRespMsg;
+        }
+        return httpRespMsg;
+    }
+}

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

@@ -100,6 +100,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private ReportLogDetailMapper reportLogDetailMapper;
     @Resource
+    private ReportBatchMapper reportBatchMapper;
+    @Resource
     private ReportLogDetailService reportLogDetailService;
     @Resource
     private ProjectAuditorMapper projectAuditorMapper;
@@ -864,6 +866,30 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         //批量新增或更新
         if (reportList.size() > 0) {
             reportService.saveOrUpdateBatch(reportList);
+            //成都明夷电子,需要生成批量记录
+            Company company = companyMapper.selectById(companyId);
+            System.out.println(company.getCompanyName()+", date==="+date);
+            if (company.getCompanyName().equals("成都明夷电子科技有限公司") &&  date != null && date.contains("@")) {
+                String[] split = date.split("\\@");
+                String startDate = split[0];
+                String endDate = split[1];
+                //删除已有的记录
+                reportBatchMapper.delete(new QueryWrapper<ReportBatch>().eq("start_date", startDate).eq("end_date", endDate).eq("creator_id", reportList.get(0).getCreatorId()));
+                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                ReportBatch batch = new ReportBatch();
+                batch.setCreatorId(reportList.get(0).getCreatorId());
+                batch.setState(0);
+                batch.setCompanyId(companyId);
+                batch.setStartDate(LocalDate.parse(startDate, dateTimeFormatter));
+                batch.setEndDate(LocalDate.parse(endDate, dateTimeFormatter));
+                batch.setTotalWorkTime(reportList.stream().mapToDouble(Report::getWorkingTime).sum());
+                reportBatchMapper.insert(batch);
+                System.out.println("生成了批记录batchId==="+batch.getId());
+                //更新batchId
+                reportList.forEach(r->r.setBatchId(batch.getId()));
+                List<Integer> collect = reportList.stream().map(Report::getId).collect(Collectors.toList());
+                reportMapper.update(new Report().setBatchId(batch.getId()), new QueryWrapper<Report>().in("id", collect));
+            }
         } else {
             //没有需要更新的,则
         }

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportBatchMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ReportBatchMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ReportBatch">
+        <id column="id" property="id" />
+        <result column="creator_id" property="creatorId" />
+        <result column="start_date" property="startDate" />
+        <result column="end_date" property="endDate" />
+        <result column="total_work_time" property="totalWorkTime" />
+        <result column="state" property="state" />
+        <result column="create_time" property="createTime" />
+        <result column="company_id" property="companyId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, creator_id, start_date, end_date, total_work_time, state, create_time, company_id
+    </sql>
+
+</mapper>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 43 - 42
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml


+ 14 - 12
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -2105,6 +2105,7 @@ public class WeiXinCorpController {
      */
     @RequestMapping("/syncInsideCorpMembs")
     public HttpRespMsg syncInsideCorpMembs(Integer companyId) {
+        System.out.println("=====syncInsideCorpMembs====");
         Company company = companyMapper.selectById(companyId);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         String corpid = wxCorpInfo.getCorpid();
@@ -2130,6 +2131,7 @@ public class WeiXinCorpController {
                 JSONObject departmentInfoOb = JSONObject.parseObject(departmentInfoResp);
                 JSONArray departmentInfoArrays = departmentInfoOb.getJSONArray("department");
                 System.out.println(departmentInfoOb.toJSONString());
+                List<User> oldUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
                 for (int i = 0; i < departmentInfoArrays.size(); i++) {
                     JSONObject ob = departmentInfoArrays.getJSONObject(i);
                     String departmentName = String.valueOf(ob.get("name"));
@@ -2227,7 +2229,7 @@ public class WeiXinCorpController {
                                 user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
                             }
                         }
-                        boolean b = userList.stream().anyMatch(ul ->ul.getCorpwxUserid()!=null&&ul.getCorpwxUserid().equals(user.getCorpwxUserid()));
+                        boolean b = oldUserList.stream().anyMatch(ul ->ul.getCorpwxRealUserid()!=null&&ul.getCorpwxRealUserid().equals(user.getCorpwxRealUserid()));
                         if(!b){
                             userList.add(user);
                         }
@@ -2279,15 +2281,15 @@ public class WeiXinCorpController {
                                 }
                             }
                             user.setCorpwxUserid(corpWxuserid)
-                                    .setName(userName)
-                                    .setRoleName(role.getRolename())
-                                    .setRoleId(role.getId())
-                                    .setPhone(phone)
-                                    .setCorpwxRealUserid(corpWxuserid)
-                                    .setColor(ColorUtil.randomColor())
-                                    .setPassword(MD5Util.getPassword("000000"))
-                                    .setJobNumber(corpWxuserid);
-                            boolean b = userList.stream().anyMatch(ul -> ul.getCorpwxUserid().equals(user.getCorpwxUserid()));
+                                .setName(userName)
+                                .setRoleName(role.getRolename())
+                                .setRoleId(role.getId())
+                                .setPhone(phone)
+                                .setCorpwxRealUserid(corpWxuserid)
+                                .setColor(ColorUtil.randomColor())
+                                .setPassword(MD5Util.getPassword("000000"))
+                                .setJobNumber(corpWxuserid);
+                            boolean b = oldUserList.stream().anyMatch(ul -> ul.getCorpwxRealUserid().equals(user.getCorpwxRealUserid()));
                             if(!b){
                                 userList.add(user);
                             }
@@ -2457,7 +2459,7 @@ public class WeiXinCorpController {
                                     user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
                                 }
                             }
-                            boolean b = userList.stream().anyMatch(ul ->ul.getCorpwxUserid()!=null&&ul.getCorpwxUserid().equals(user.getCorpwxUserid()));
+                            boolean b = userList.stream().anyMatch(ul ->ul.getCorpwxRealUserid()!=null&&ul.getCorpwxRealUserid().equals(user.getCorpwxRealUserid()));
                             if(!b){
                                 userList.add(user);
                             }
@@ -2518,7 +2520,7 @@ public class WeiXinCorpController {
                                     .setColor(ColorUtil.randomColor())
                                     .setPassword(MD5Util.getPassword("000000"))
                                     .setJobNumber(corpWxuserid);
-                                boolean b = userList.stream().anyMatch(ul -> ul.getCorpwxUserid().equals(user.getCorpwxUserid()));
+                                boolean b = userList.stream().anyMatch(ul -> ul.getCorpwxRealUserid().equals(user.getCorpwxRealUserid()));
                                 if(!b){
                                     userList.add(user);
                                 }

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

@@ -201,6 +201,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             userList = userMapper.selectList(new QueryWrapper<User>().select("id, name, corpwx_userid").in("department_id", deptIncludeSubDeptIds));
         } else if (checkType == 2) {
             List<DepartmentOtherManager> otherManagers = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("department_id", deptId));
+            Department curDept = departmentMapper.selectById(deptId);
+            if (curDept.getSuperiorId() != null && curDept.getSuperiorId() != 0) {
+                //取上级部门的其他负责人
+                otherManagers.addAll(departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("department_id", curDept.getSuperiorId())));
+            }
             if (otherManagers.size() > 0) {
                 List<String> userIds = otherManagers.stream().map(DepartmentOtherManager::getOtherManagerId).collect(Collectors.toList());
                 userList = userMapper.selectList(new QueryWrapper<User>().select("id, name, corpwx_userid").in("id", userIds));

+ 5 - 108
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/team/index.vue

@@ -101,17 +101,9 @@
                     <el-form-item style="float:right;" v-if="permissions.structureExport">
                         <el-link type="primary" :underline="false" @click="showExportDialog">{{ $t('exportpersonnel') }}</el-link>
                     </el-form-item>
-           
-                    <el-form-item style="float:right;" v-if="permissions.structurePersonnel">
-                        <el-link type="primary" :underline="false" @click="importUserSalary(null)">{{ $t('importSalary') }}</el-link>
-                    </el-form-item>
-              
+          
                     <el-form-item style="float:right;" >
-                        <el-link type="primary"  :underline="false" @click="syncWithCorpWx">{{ $t('synchronizetheenterprisemicrodirectory') }}</el-link>
-                    </el-form-item>
-
-                    <el-form-item style="float:right;" v-if="user.dingdingUserid != null && permissions.structureImport">
-                        <el-link type="primary" :underline="false" @click="showCorpDDSyncDialog">{{ $t('synchronizetheaddressbook') }}</el-link>
+                        <el-link type="primary"  :underline="false" @click="newSyncWithCorpWxDayload = true">{{ $t('synchronizetheenterprisemicrodirectory') }}</el-link>
                     </el-form-item>
 
                      <el-form-item style="float:right;" v-if="permissions.structureExport">
@@ -762,32 +754,6 @@
             </el-upload>
             </p>
         </el-dialog>
-        <el-dialog :title="$t('synchronizetheenterprisewechataddressbook')" v-if="showSyncCWDialog" :visible.sync="showSyncCWDialog" customClass="customWidth" width="500px">
-            <p>{{ $t('oneWeix') }} 
-                <el-popover placement="top" width="1200" trigger="hover">
-                    <div class="imgFlex">
-                        <div><img src="../../assets/image/Step1.jpg" style="width: 380px"/> <p><b>{{ $t('firststep') }}</b></p> </div>
-                        <div class="imgBor"> <p></p> <img src="../../assets/image/Step2.jpg" style="width: 380px"/> <p><b>{{ $t('secondstep') }}</b></p></div>
-                        <div><img src="../../assets/image/Step3.jpg" style="width: 380px"/> <p><b>{{ $t('thirdstep') }}</b></p></div>
-                    </div>
-                    <i class="el-icon-question" slot="reference" />
-                </el-popover>
-            </p>
-            <p>
-            <el-input v-model="contactSecret" style="width:380px;" :disabled="!editSecret"/><el-button @click="editSecret?saveContactSecret():editSecret=true;" >{{editSecret?'保存':'修改'}}</el-button>
-            </p>
-            <p v-if="contactServer == null">
-            {{ $t('twoWei') }} 
-            </p>
-            <p v-if="contactServer == null" style="text-align:center;">
-            <img
-                style="width: 120px; height: 120px"
-                src="../../assets/image/code.jpg" />
-            </p>
-            <p style="display: flex;justify-content: center;padding-bottom:1em;">
-                <el-button type="primary" :underline="false" :loading="importingData" :disabled="!canSync" @click="startCorpWxImport">{{ $t('startsynchronization') }}</el-button>
-            </p>
-        </el-dialog>
         <el-dialog title="同步钉钉通讯录" v-if="showSyncDDDialog" :visible.sync="showSyncDDDialog" customClass="customWidth" width="500px">
             <p>{{ $t('areyousuretosynchronize') }} 
             </p>
@@ -816,7 +782,7 @@
         <el-dialog :title="$t('synchronizetheenterprisemicrodirectory')" :visible.sync="newSyncWithCorpWxDayload" width="400px" :before-close="handleClose">
         <span>
           同步前请联系企业微信管理员检查应用授权的可见范围 <br/>
-          路径:管理企业-应用管理-生产车间管家-可见范围
+          路径:管理企业-应用管理-车间工时管家-可见范围
         </span>
         <span slot="footer" class="dialog-footer">
           <el-button type="primary" @click="visibleRange" v-if="wxManager">可见范围设置</el-button>
@@ -935,7 +901,6 @@ export default {
       corpid: null,
       contactSecret: null,
       contactServer: null,
-      showSyncCWDialog: false,
       permissions: JSON.parse(sessionStorage.getItem("permissions")),
       handleSelectionZzjgshow: false,
       handljues: false,
@@ -1346,75 +1311,7 @@ export default {
         }
       );
     },
-    startCorpWxImport() {
-      this.importingData = true;
-      this.http.post(
-        "/wxcorp/getCorpMembs",
-        {
-          corpId: this.corpid,
-        },
-        (res) => {
-          this.importingData = false;
-          if (res.code == "ok") {
-            this.showSyncCWDialog = false;
-            this.$message({
-              message: this.$t('synchronoussuccesss'),
-              type: "success",
-            });
-            this.getDepartment();
-            this.getUser();
-            this.getUsers();
-          } else {
-            this.$message({
-              message: res.msg,
-              type: "error",
-            });
-          }
-        },
-        (err) => {
-          this.tableLoading = false;
-          this.$message({
-            message: err,
-            type: "error",
-          });
-        }
-      );
-    },
-    //从企业微信同步通讯录
-    syncWithCorpWx() {
-      this.showSyncCWDialog = true;
-      this.editSecret = false;
-      this.http.post(
-        "/wx-corp-info/get",
-        {
-          companyId: this.user.companyId,
-        },
-        (res) => {
-          if (res.code == "ok") {
-            this.contactSecret = res.data.contactSecret;
-            this.contactServer = res.data.contactServer;
-            if (this.contactSecret && this.contactServer) {
-              this.canSync = true;
-            } else {
-              this.editSecret = true;
-            }
-            this.corpid = res.data.corpid;
-          } else {
-            this.$message({
-              message: res.msg,
-              type: "error",
-            });
-          }
-        },
-        (err) => {
-          this.tableLoading = false;
-          this.$message({
-            message: err,
-            type: "error",
-          });
-        }
-      );
-    },
+    
     // 从企业微信同步通讯录 (待测试)
     newSyncWithCorpWx() {
       const loading = this.$loading({
@@ -1425,7 +1322,7 @@ export default {
         });
         this.newSyncWithCorpWxDayload = false
       this.http.post(
-        "/wxcorp/getCorpMembsFromPlatform",
+        "/wxcorp/syncInsideCorpMembs",
         {
           companyId: this.user.companyId,
         },

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -16,7 +16,7 @@
                     <i class="fa fa-align-justify" @click.prevent="collapse" style="position: relative;z-index: 10;"></i>
                     <div class="gongshimingz">
                         {{user.companyName}}
-                        <i v-if="user.roleName == '超级管理员'" class="el-icon-edit" @click="editCompanyNamedialog=true,companyForm.name = user.companyName"  style="position: relative;z-index: 15; margin-left: 5px;"></i>
+                        <i v-if="user.roleName == '超级管理员' && user.companyName != '成都明夷电子科技有限公司'" class="el-icon-edit" @click="editCompanyNamedialog=true,companyForm.name = user.companyName"  style="position: relative;z-index: 15; margin-left: 5px;"></i>
                     </div>                    
                 </div>
             </el-col>

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -1030,7 +1030,8 @@ import { error } from 'dingtalk-jsapi';
                     
                     //遍历项目
                     this.projectCols.forEach(p=>{
-                        targetU[p.projectId] = this.curPercentVal[p.projectId];
+                        // targetU[p.projectId] = this.curPercentVal[p.projectId];
+                        this.$set(targetU, p.projectId, this.curPercentVal[p.projectId]);
                     })
                 });
                 this.userCostSettingList.splice(1,0);

+ 44 - 25
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -128,11 +128,18 @@
                                     <!-- 阶段 -->
                                     <span v-if="item.stage != null" style="margin-left:10px;"> {{$t('other.inputStage')}}:{{item.stage}}</span>
                                 </p>
-                                <p><span v-if="item.multiWorktime==1">{{ $t('other.project') }}</span>{{$t('time.duration')}}:
+                                <p v-if="user.company.companyName == '成都明夷电子科技有限公司'">
+                                    <span>用时占比:{{ item.progress }}%</span>
+                                </p>
+                                <p v-else>
+                                    <span v-if="item.multiWorktime==1">{{ $t('other.project') }}</span>
+                                    <span>{{$t('time.duration')}}:</span>
                                     <span v-if="item.startTime">{{ item.startTime + '-' + item.endTime }}</span>
-                                    {{item.time.toFixed(1)}}h <span class="propsbtn" v-if="item.isOvertime === 1">
+                                    <span>{{item.time.toFixed(1)}}h </span>
+                                    <span class="propsbtn" v-if="item.isOvertime === 1">
                                     <el-tag type="danger" size="mini" style="margin-left: 65px">{{ $t('other.WorkOvertime') }}<span v-if="item.overtimeHours">{{item.overtimeHours.toFixed(1)}}{{$t('time.hour')}}</span></el-tag></span>
                                 </p>
+
                                 <div v-if="item.multiWorktime==0">
                                 <p>{{ $t('other.matters') }}:<span v-html="item.content"></span></p>
                                 </div>
@@ -201,7 +208,12 @@
                 <template slot-scope="scope">
                     <span v-if="scope.row.state == 0" style="color:#DAA520;">
                         <span v-if="user.userNameNeedTranslate != '1'">
-                            {{scope.row.isDeptAudit==0?$t('other.Tobereviewedbytheprojectreviewer'):($t('other.await')+scope.row.auditDeptName+('('+scope.row.deptAuditorName+')')+$t('other.audit'))}}
+                            <span v-if="user.company.companyName != '成都明夷电子科技有限公司'">
+                                {{scope.row.isDeptAudit==0?$t('other.Tobereviewedbytheprojectreviewer'):($t('other.await')+scope.row.auditDeptName+('('+scope.row.deptAuditorName+')')+$t('other.audit'))}}
+                            </span>
+                            <span v-else>
+                                待审核
+                            </span>
                         </span>
                         <span v-if="user.userNameNeedTranslate == '1'">
                             <span v-if="scope.row.isDeptAudit==0">{{$t('other.Tobereviewedbytheprojectreviewer')}}</span>
@@ -604,8 +616,12 @@
                 for (var i=0;i<this.multipleSelection.length; i++) {
                     var line = this.multipleSelection[i];
                     var array = line.data;
-                    for (var m=0;m<array.length; m++) {
-                        ids += array[m].id+',';
+                    if (this.user.company.companyName == '成都明夷电子科技有限公司') {
+                        ids += line.reportIds+',';
+                    } else {
+                        for (var m=0;m<array.length; m++) {
+                            ids += array[m].id+',';
+                        }
                     }
                 }
                 if (ids.length > 0) {
@@ -715,12 +731,6 @@
             //获取待审核的数据列表
             getList(e) {
                 this.listLoading = true;
-                // let form = {}
-                // if(this.search.value==-1) {
-                //     form.date = this.search.date
-                // } else {
-                //     form.state = this.search.value;
-                // }
                 if(e){
                     this.search.userIdArray = []
                 }
@@ -742,7 +752,12 @@
                     userarr = userarr.substring(0,userarr.length - 1)
                     this.search.userId = userarr
                 }
-                this.http.post(this.port.report.portList, this.search,
+                //明夷电子特殊处理
+                let url = this.port.report.portList;
+                if (this.user.company.companyName == '成都明夷电子科技有限公司') {
+                    url = '/report-batch/getAuditList';
+                }
+                this.http.post(url, this.search,
                 res => {
                     this.listLoading = false;
                     if (res.code == "ok") {
@@ -768,12 +783,16 @@
             approve(id,date, item) {
                 let ids = '';
                 let data = item.data;
-                data.forEach(element => {
-                    ids +=(element.id+',');
-                });
+                if (this.user.company.companyName == '成都明夷电子科技有限公司') {
+                    ids = item.reportIds;
+                } else {
+                    data.forEach(element => {
+                        ids +=(element.id+',');
+                    });
+                }
+                
                 this.isbatch = false
                 this.approveinData = {
-                    id: id,
                     reportIds: ids
                 }
                 if(this.user.timeType.needEvaluate == 1){
@@ -783,11 +802,6 @@
                     this.logining = true;
                     this.approveinfun()
                 }
-                
-                
-                
-
-                
             },
             approveinfun(){
                 this.http.post(this.port.report.approve, this.approveinData,
@@ -857,10 +871,15 @@
             showDenyDialog(id,i, date, item) {
                 this.denyReasonDialog = true;
                 var ids = '';
-                var data = item.data;
-                data.forEach(element => {
-                    ids +=(element.id+',');
-                });
+                if (this.user.company.companyName == '成都明夷电子科技有限公司') {
+                    ids = item.reportIds;
+                } else {
+                    var data = item.data;
+                    data.forEach(element => {
+                        ids +=(element.id+',');
+                    });
+                }
+                
                 this.denyForm = {id: id ,i:i, date: date, reportIds: ids, reason:null};
             },