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

1. 针对赛元微电子,实现关联企业微信身份的功能
2. 修复项目管理中下载模板的bug
3. 去除钉钉ticket检查
4. 任务支持无执行人有计划工时的情况

seyason 2 éve
szülő
commit
bba711cef3

+ 29 - 28
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -141,7 +141,7 @@ public class TaskController {
                 needReOrderList.add(newT);
             }
             if (task.getExecutorId() != null) {
-                msgRecepientList = task.getExecutorList().stream().filter(exe->exe.getExecutorId() != null).map(TaskExecutor::getExecutorId).collect(Collectors.toList());
+                msgRecepientList = task.getExecutorList().stream().filter(exe->!StringUtils.isEmpty(exe.getExecutorId())).map(TaskExecutor::getExecutorId).collect(Collectors.toList());
             }
         } else {
             //更新的情况,需要对比是否修改了任务标题,更新子任务的parentTname
@@ -162,7 +162,7 @@ public class TaskController {
                 task.getExecutorList().forEach(exe->exe.setTaskId(task.getId()));
                 taskExecutorService.saveOrUpdateBatch(task.getExecutorList());
                 //新增的执行人
-                msgRecepientList = task.getExecutorList().stream().filter(newT->newT.getExecutorId() != null && !oldExeList.stream().anyMatch(old->newT.getExecutorId().equals(old.getExecutorId())))
+                msgRecepientList = task.getExecutorList().stream().filter(newT->!StringUtils.isEmpty(newT.getExecutorId()) && !oldExeList.stream().anyMatch(old->newT.getExecutorId().equals(old.getExecutorId())))
                         .map(TaskExecutor::getExecutorId).collect(Collectors.toList());
             }
         }
@@ -202,34 +202,35 @@ public class TaskController {
                 informationService.save(new Information().setType(1).setContent(String.valueOf(task.getProjectId())).setUserId(msgRecepient));
             });
             List<User> recpUserList = userMapper.selectList(new QueryWrapper<User>().in("id", msgRecepientList));
-            if (recpUserList.get(0).getDingdingUserid() != null) {
-                //钉钉用户
-                CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
-                LocalDate endDate = task.getEndDate();
-                String endStr = "";
-                if (endDate != null) {
-                    endStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(endDate);
+            if (recpUserList.size() > 0) {
+                if (recpUserList.get(0).getDingdingUserid() != null) {
+                    //钉钉用户
+                    CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+                    LocalDate endDate = task.getEndDate();
+                    String endStr = "";
+                    if (endDate != null) {
+                        endStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(endDate);
+                    }
+                    companyDingdingService.sendNewTaskMsg(dingding, recpUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(",")),
+                            task.getName(), endStr);
+                } else if (recpUserList.get(0).getCorpwxUserid() != null) {
+                    //企业微信用户
+                    WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+                    recpUserList.forEach(ru->{
+                        String corpUid = ru.getCorpwxUserid();
+                        JSONObject json=new JSONObject();
+                        JSONArray dataJson=new JSONArray();
+                        JSONObject jsonObj=new JSONObject();
+                        jsonObj.put("key", "任务内容");
+                        jsonObj.put("value",task.getName());
+                        dataJson.add(jsonObj);
+                        json.put("template_id","tty9TkCAAAovv416zsWtn0e06CJ635HA");
+                        json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
+                        json.put("content_item",dataJson);
+                        wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpUid, json);
+                    });
                 }
-                companyDingdingService.sendNewTaskMsg(dingding, recpUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(",")),
-                        task.getName(), endStr);
-            } else if (recpUserList.get(0).getCorpwxUserid() != null) {
-                //企业微信用户
-                WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
-                recpUserList.forEach(ru->{
-                    String corpUid = ru.getCorpwxUserid();
-                    JSONObject json=new JSONObject();
-                    JSONArray dataJson=new JSONArray();
-                    JSONObject jsonObj=new JSONObject();
-                    jsonObj.put("key", "任务内容");
-                    jsonObj.put("value",task.getName());
-                    dataJson.add(jsonObj);
-                    json.put("template_id","tty9TkCAAAovv416zsWtn0e06CJ635HA");
-                    json.put("url", "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://mobworktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect");
-                    json.put("content_item",dataJson);
-                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpUid, json);
-                });
             }
-
         }
         return msg;
     }

+ 71 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -1193,6 +1193,77 @@ public class WeiXinCorpController {
         return msg;
     }
 
+    @RequestMapping("/syncMembByCardTime")
+    public HttpRespMsg syncMembByCardTime(Integer companyId) {
+        Company company = companyMapper.selectById(companyId);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        String curCorpAccessToken = null;
+        try {
+            curCorpAccessToken = getCorpAccessToken(wxCorpInfo);
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        //获取公司根部门人员,也就是没有分配部门的人员
+        int companyRootDeptId = 1;
+        JSONArray unAssignedUserList = getDeptUserSimple(curCorpAccessToken, companyRootDeptId);
+        SysRole defaultRole = sysRoleMapper.selectOne(
+                new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+
+        for (int m=0;m<unAssignedUserList.size(); m++) {
+            JSONObject userJson = unAssignedUserList.getJSONObject(m);
+            String curUserid = userJson.getString("userid");
+            System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
+            //不存在的人员, 进行插入
+            User user = new User();
+
+            user.setId(SnowFlake.nextId()+"")
+                    .setRoleId(defaultRole.getId())//默认普通员工
+                    .setRoleName(defaultRole.getRolename())
+                    .setCompanyId(companyId)
+                    .setName(userJson.getString("name"))
+                    .setCorpwxUserid(curUserid)
+                    .setColor(ColorUtil.randomColor());
+
+            //检查用户是否已经存在
+            if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid)) == 0) {
+                userMapper.insert(user);
+            }
+        }
+
+        //获取部门
+        JSONObject deptObj = getAllDepartments(curCorpAccessToken);
+        JSONArray deptObjJSONArray = deptObj.getJSONArray("department");
+
+        for (int i=0;i<deptObjJSONArray.size(); i++) {
+            int deptId = deptObjJSONArray.getJSONObject(i).getIntValue("id");
+
+            JSONArray userList = getDeptUserSimple(curCorpAccessToken, deptId);
+            for (int m=0;m<userList.size(); m++) {
+                JSONObject userJson = userList.getJSONObject(m);
+                String curUserid = userJson.getString("userid");
+                System.out.println("userid="+curUserid+", name=" + userJson.getString("name")+", mobile="+userJson.getString("mobile"));
+                //不存在的人员, 进行插入
+                User user = new User();
+
+                user.setId(SnowFlake.nextId()+"")
+                        .setRoleId(defaultRole.getId())//默认普通员工
+                        .setRoleName(defaultRole.getRolename())
+                        .setCompanyId(companyId)
+                        .setDepartmentId(0)
+                        .setName(userJson.getString("name"))
+                        .setCorpwxUserid(curUserid)
+                        .setColor(ColorUtil.randomColor());
+
+                //检查用户是否已经存在
+                if (userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", curUserid).eq("company_id", companyId)) == 0) {
+                    userMapper.insert(user);
+                }
+            }
+        }
+
+        return wxCorpInfoService.syncMembByCardTime(wxCorpInfo);
+    }
+
     //老版本
     @RequestMapping("/getCorpMembsOld")
     public HttpRespMsg getCorpMembsOld(String corpId) {

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

@@ -26,4 +26,6 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     public String testDownloadFile();
 
     public HttpRespMsg getUserCheckInDayData(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime, boolean showLog);
+
+    HttpRespMsg syncMembByCardTime(WxCorpInfo wxCorpInfo);
 }

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

@@ -68,6 +68,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
     private long appId;//钉钉第三方应用的appId
     @Value("${configEnv.isPrivateDeploy}")
     private boolean isPrivateDeploy;//是否是私有化部署,企业内部应用
+    @Value("${configEnv.isDev}")
+    private boolean isDev;//是否是本地开发环境
 
 
     @Override
@@ -250,6 +252,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
     }
     @Override
     public void sendNewTaskMsg(CompanyDingding dingding, String ddUserid, String title, String endDate) {
+        //开发环境不发送
+        if (isDev) return;
         if (isPrivateDeploy) {
             List<OapiMessageCorpconversationAsyncsendV2Request.Form> form=new ArrayList<>();
             OapiMessageCorpconversationAsyncsendV2Request.Form item=new OapiMessageCorpconversationAsyncsendV2Request.Form();

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

@@ -3072,8 +3072,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 break;
                             }
                         }
-                    } else {
-
                     }
                     row.createCell(index).setCellValue(cellValue);
                 }

+ 68 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -5,17 +5,16 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.controller.WeiXinCorpController;
-import com.management.platform.entity.SysConfig;
-import com.management.platform.entity.User;
-import com.management.platform.entity.UserCorpwxTime;
-import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.entity.*;
 import com.management.platform.mapper.SysConfigMapper;
 import com.management.platform.mapper.UserCorpwxTimeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.util.ColorUtil;
 import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.SnowFlake;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -311,7 +310,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 Object[] objects = corpwxUserIds.subList(fromIndex, toIndex).toArray(new String[0]);
                 reqOnceCardTime(corpInfo, startTime, endTime, objects, showLog);
             }
-
         } catch (Exception exception) {
             exception.printStackTrace();
         }
@@ -319,6 +317,71 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return msg;
     }
 
+    @Override
+    public HttpRespMsg syncMembByCardTime(WxCorpInfo wxCorpInfo) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", wxCorpInfo.getCompanyId()).likeRight("name", "woy9Tk"));
+        List<String> corpwxUserIds = userList.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
+        System.out.println("新拉取到的无姓名用户WXCorp_userid size="+corpwxUserIds.size());
+        if (corpwxUserIds.size() == 0) {
+            msg.data = "无新成员更新";
+            return msg;
+        }
+        String url = null;
+        try {
+            LocalDateTime startDateTime = LocalDateTime.now();
+            LocalDateTime endDateTime = LocalDateTime.now();
+            startDateTime = startDateTime.minusDays(5);
+            endDateTime = endDateTime.minusDays(1);
+
+            startDateTime = startDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
+            long startTime = startDateTime.toEpochSecond(ZoneOffset.of("+8"));
+            endDateTime = endDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
+            long endTime = endDateTime.toEpochSecond(ZoneOffset.of("+8"));
+            System.out.println("startTime="+startTime+",endTime="+endTime);
+
+            int batchCount = 1;
+            int batchSize = 100;
+            int totalLength = 1;
+            //按批调用
+            for (int i=0;i<batchCount; i++) {
+                int fromIndex = i*batchSize;
+                int toIndex = (i+1) * batchSize;
+                if (toIndex > totalLength) toIndex = totalLength;
+                Object[] objects = corpwxUserIds.subList(fromIndex, toIndex).toArray(new String[0]);
+                reqOnceCardTime(wxCorpInfo, startTime, endTime, objects, false);
+            }
+            //查询日报中的人员姓名,更新用户表
+            List<UserCorpwxTime> cardTimeList = userCorpwxTimeMapper.selectList(
+                    new QueryWrapper<UserCorpwxTime>().select("corpwx_userid, name").eq("company_id", wxCorpInfo.getCompanyId()).in("corpwx_userid", corpwxUserIds));
+            List<User> updateUserList = new ArrayList<>();
+            for (UserCorpwxTime userCorpwxTime : cardTimeList) {
+                User user = userMapper.selectOne(new QueryWrapper<User>().eq("name", userCorpwxTime.getName()).eq("company_id", wxCorpInfo.getCompanyId()));
+                if (user != null && user.getCorpwxUserid() == null) {
+                    user.setCorpwxUserid(userCorpwxTime.getCorpwxUserid());
+                    updateUserList.add(user);
+                    userMapper.updateById(user);
+                    System.out.println("更新用户:"+user.getName());
+                } else {
+                    System.out.println("查询日报无更新:"+userCorpwxTime.getCorpwxUserid()+", "+userCorpwxTime.getName());
+                }
+            }
+
+            List<String> collect = userList.stream().map(User::getId).collect(Collectors.toList());
+
+            userMapper.delete(new QueryWrapper<User>().in("id", collect));
+            if (updateUserList.size() == 0) {
+                msg.data = "处理完毕。当前无新人员需要关联企业微信身份";
+            } else {
+                msg.data = "处理完毕。本次自动关联了:"+updateUserList.size()+"位人员:"+updateUserList.stream().map(User::getName).collect(Collectors.joining(","));
+            }
+
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        return msg;
+    }
+
 
     private void reqOnceCardTime(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects, boolean showLog) throws Exception {
         DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");

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

@@ -349,9 +349,9 @@ public class TimingTask {
         }
         LocalDateTime now = LocalDateTime.now();
         LocalDate localDate = LocalDate.now();
-        if (!isPrivateDeploy) {
-            checkDingDingSuiteTicket();
-        }
+//        if (!isPrivateDeploy) {
+//            checkDingDingSuiteTicket();
+//        }
 
         //判断是否是工作日,非工作日不提醒
         if (!WorkDayCalculateUtils.isWorkDay(localDate)) {

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

@@ -2935,7 +2935,8 @@ a {
                     if(res.code == 'ok'){
                         var filePath = res.data;
                         const a = document.createElement('a'); // 创建a标签
-                        a.setAttribute('download', fName);// download属性
+                        var fileName = filePath.split('/')[2];
+                        a.setAttribute('download', fileName);// download属性
                         a.setAttribute('href', filePath);// href链接
                         a.click(); //自执行点击事件
                         a.remove();

+ 31 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -77,7 +77,10 @@
                     <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport">
                         <el-link type="primary" :underline="false" @click="importUserC">批量导入</el-link>
                     </el-form-item>
-                    <el-form-item style="float:right;" v-if="user.corpwxUserid != null && permissions.structureImport">
+                    <el-form-item style="float:right;" v-if="user.corpwxUserid != null && permissions.structureImport && user.companyId==469">
+                        <el-link type="primary" :underline="false" @click="syncMembByCardTime">关联企微身份</el-link>
+                    </el-form-item>
+                    <el-form-item style="float:right;" v-if="user.corpwxUserid != null && permissions.structureImport && user.companyId!=469">
                         <el-link type="primary" :underline="false" @click="syncWithCorpWx">同步企微通讯录</el-link>
                     </el-form-item>
                     <el-form-item style="float:right;" v-if="user.dingdingUserid != null && permissions.structureImport">
@@ -580,6 +583,11 @@
                 <el-button type="primary" :underline="false" :loading="importingData" :disabled="!canSync" @click="startCorpWxImport">开始同步</el-button>
             </p>
         </el-dialog>
+        <el-dialog title="关联结果" v-if="syncMembByCardTimeResultGialog" :visible.sync="syncMembByCardTimeResultGialog" customClass="customWidth" width="500px">
+            <p style="padding-bottom:30px;">
+            {{syncMembByCardTimeMsg}}
+            </p>
+        </el-dialog>
     </div>
   </div>
 </template>
@@ -639,6 +647,8 @@ export default {
   },
   data() {
     return {
+      syncMembByCardTimeResultGialog:false,
+      syncMembByCardTimeMsg:null,
       editSecret: false,
       canSync: false,
       corpid: null,
@@ -858,6 +868,26 @@ export default {
     that = this;
   },
   methods: {
+    syncMembByCardTime() {
+      this.syncMembByCardTimeResultGialog = true;
+      this.syncMembByCardTimeMsg = '正在同步关联,请稍等...';
+        this.http.post("/wxcorp/syncMembByCardTime",
+        {
+          companyId: this.user.companyId,
+        },
+        (res) => {
+          if (res.code == "ok") {
+            this.syncMembByCardTimeMsg = res.data;
+            this.getUser();
+          } else {
+            this.syncMembByCardTimeMsg = res.msg;
+          }
+        },
+        (err) => {
+          this.syncMembByCardTimeMsg = err;
+        }
+      );
+    },
     saveContactSecret() {
       if (!this.contactSecret) {
         this.$message({