Bladeren bron

通过redis存储企业微信的回调数据

QuYueTing 4 maanden geleden
bovenliggende
commit
6cd21b781c

+ 34 - 11
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java

@@ -1,5 +1,7 @@
 package com.management.platform.service.impl;
 
+import com.management.platform.controller.TaskController;
+import com.management.platform.controller.UserController;
 import com.management.platform.entity.CorpwxJobResult;
 import com.management.platform.entity.User;
 import com.management.platform.entity.WxCorpInfo;
@@ -11,6 +13,9 @@ import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import com.management.platform.util.RedisUtil;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.stereotype.Service;
@@ -42,6 +47,8 @@ public class ExcelExportServiceImpl implements ExcelExportService {
     private CorpwxJobResultMapper corpwxJobResultMapper;
     @Value("${upload.path}")
     private String path;
+    @Autowired
+    private RedisUtil redisUtil;
 
     @Transactional(isolation = Isolation.READ_COMMITTED)
     public void testRead(String jobId) {
@@ -125,18 +132,34 @@ public class ExcelExportServiceImpl implements ExcelExportService {
                     Thread.sleep(3000);
                 }
                 System.out.println("i=="+i+", "+LocalDateTime.now());
-                CorpwxJobResult corpwxJobResult = corpwxJobCenter.get(jobId);
-                if (corpwxJobResult != null) {
-                    if (corpwxJobResult.getErrCode() == 0) {
-                        syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
-                        corpwxJobCenter.remove(jobId);
-                    } else {
-                        long t2 = System.currentTimeMillis();
-                        System.out.println("222企业微信转译报错:"+corpwxJobResult.getErrMsg()+",耗时:" + (t2 - t) + "ms");
-                        httpRespMsg.setError(corpwxJobResult.getErrMsg());
-                        return httpRespMsg;
+                //直接循环调用接口,后面需要改成通过redis获取jobId对应的消息,再去调用接口
+                Object map = redisUtil.getString("corpwxJobCenter"+jobId);
+                JSONObject jsonObject = new JSONObject(map.toString());
+                System.out.println("通过redis获取到企业微信上传回调的数据=="+jsonObject);
+                String infoType = jsonObject.getString("InfoType");
+                if ("batch_job_result".equals(infoType)) {
+                    org.json.JSONObject batchJob = jsonObject.getJSONObject("BatchJob");
+                    String jobType = batchJob.getString("JobType");
+                    String authCorpId = jsonObject.getString("AuthCorpId");
+                    CorpwxJobResult corpwxJobResult = new CorpwxJobResult();
+                    corpwxJobResult.setAuthCorpId(authCorpId);
+                    corpwxJobResult.setErrCode(batchJob.getInt("ErrCode"));
+                    corpwxJobResult.setErrMsg(batchJob.getString("ErrMsg"));
+                    corpwxJobResult.setJobId(jobId);
+                    corpwxJobResult.setJobType(jobType);
+                    corpwxJobResultMapper.insert(corpwxJobResult);
+                    if (corpwxJobResult != null) {
+                        if (corpwxJobResult.getErrCode() == 0) {
+                            syncTranslationResult = wxCorpInfoService.getSyncTranslationResult(jobId);
+                            corpwxJobCenter.remove(jobId);
+                        } else {
+                            long t2 = System.currentTimeMillis();
+                            System.out.println("222企业微信转译报错:"+corpwxJobResult.getErrMsg()+",耗时:" + (t2 - t) + "ms");
+                            httpRespMsg.setError(corpwxJobResult.getErrMsg());
+                            return httpRespMsg;
+                        }
+                        break;
                     }
-                    break;
                 }
                 i++;
             }

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -148,6 +148,11 @@ public class AuthRedirectController {
         } else {
             redirecUrl = "https://worktime.ttkuaiban.com/#/" + router;
         }
+        //定制化风格
+        if (corpId.equals("wpy9TkCAAAvjmvQuz0IH9iosxBXrqcdA")) {
+            //中辰华典
+            reqParam.put("style", "new");
+        }
         ModelAndView modelAndView = new ModelAndView(
                 new RedirectView(redirecUrl), reqParam);
 

+ 40 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -476,16 +476,23 @@ public class ReportController {
                 customData[i] = 0.0;
             }
         }
-        if (projectAuditorId == null) {
+        System.out.println("projectAuditorId:"+(projectAuditorId == null?"为Null":"Length="+projectAuditorId.length));
+        if (projectAuditorId == null || projectAuditorId.length == 0) {
             projectAuditorId = new String[projectId.length];
             for(int i=0;i<projectAuditorId.length; i++) {
                 projectAuditorId[i] = null;
             }
-        } else if (projectAuditorId.length < projectId.length) {
-            //数组大小不对,后端无法确定项目和审核人的对应关系,必须前端全部传递过来
-            HttpRespMsg msg = new HttpRespMsg();
-            msg.setError("请检查每个项目的审核人是否设置");
-            return msg;
+        }
+        else if (projectAuditorId.length < projectId.length) {
+            if (comTimeType.getReportAuditType() <= 1) {
+                //数组大小不对,后端无法确定项目和审核人的对应关系,必须前端全部传递过来
+                HttpRespMsg msg = new HttpRespMsg();
+                msg.setError("请检查每个项目的审核人是否设置");
+                return msg;
+            } else {
+                //自动扩充数组大小
+                projectAuditorId = Arrays.copyOf(projectAuditorId, projectId.length);
+            }
         }
 
         if (overtimeHours == null) {
@@ -2958,6 +2965,33 @@ public class ReportController {
         return msg;
     }
 
+    @RequestMapping("/transferReportAuditor")
+    public HttpRespMsg transferReportAuditor(String userId, String targetAuditorId){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Report::getState,0);
+        queryWrapper.eq(Report::getCompanyId,companyId);
+        queryWrapper.and(wrapper->wrapper.and(wr->wr.eq(Report::getAuditDeptManagerid,userId).eq(Report::getIsDeptAudit,1)).or(wr1->wr1.eq(Report::getProjectAuditorId,userId).eq(Report::getIsDeptAudit,0)));
+        List<Report> reportList = reportMapper.selectList(queryWrapper);
+        reportList.forEach(r->{
+            if (r.getIsDeptAudit() == 1) {
+                r.setAuditDeptManagerid(targetAuditorId);
+            } else {
+                r.setProjectAuditorId(targetAuditorId);
+            }
+        });
+        if(!reportService.updateBatchById(reportList)){
+            msg.setError("验证失败");
+            return msg;
+        }
+        User user = userMapper.selectById(userId);
+        user.setIsActive(0);
+        userMapper.updateById(user);
+        participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        return msg;
+    }
+
     @RequestMapping("/changeReminder")
     public HttpRespMsg changeReminder(String createDate,String userId,String startDate,String endDate) throws Exception {
         return reportService.changeReminder(request,createDate,userId,startDate,endDate);

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

@@ -752,14 +752,14 @@ public class UserController {
         HttpRespMsg msg = new HttpRespMsg();
         Integer companyId = userService.getById(request.getHeader("token")).getCompanyId();
         //针对美莱德,飞锐特,湾创在对人员进行停用操作时,需要检查待他审核的日报
-        if(companyId==876||companyId==877||companyId==878){
+        if(companyId==876||companyId==877||companyId==878 || companyId==10){
             LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(Report::getState,0);
             queryWrapper.eq(Report::getCompanyId,companyId);
             queryWrapper.and(wrapper->wrapper.and(wr->wr.eq(Report::getAuditDeptManagerid,user.getId()).eq(Report::getIsDeptAudit,1)).or(wr1->wr1.eq(Report::getProjectAuditorId,user.getId()).eq(Report::getIsDeptAudit,0)));
             Integer count = reportMapper.selectCount(queryWrapper);
             if(count>0){
-                msg.setError("当前员工有待审核日报,确认停用并驳回日报吗?");
+                msg.setError("当前员工有待审核日报,请确认处理方式?");
                 return msg;
             }
         }

+ 9 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -20,6 +20,7 @@ import org.json.XML;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.ReactiveRedisOperations;
 import org.springframework.http.*;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
@@ -191,6 +192,10 @@ public class WeiXinCorpController {
     String timestamp = Sha1Util.getTimeStamp();
 
     public static Map<String, Item> corpTicketMap = new HashMap<String,Item>();
+
+    @Resource
+    private RedisUtil redisUtil;
+
     public class Item {
         public String jsTicket = null;
         public LocalDateTime expireTime = null;
@@ -803,8 +808,9 @@ public class WeiXinCorpController {
                     org.json.JSONObject batchJob = jsonObject.getJSONObject("BatchJob");
                     String jobId = batchJob.getString("JobId");
                     String jobType = batchJob.getString("JobType");
+                    String authCorpId = jsonObject.getString("AuthCorpId");
                     CorpwxJobResult result = new CorpwxJobResult();
-                    result.setAuthCorpId(jsonObject.getString("AuthCorpId"));
+                    result.setAuthCorpId(authCorpId);
                     result.setErrCode(batchJob.getInt("ErrCode"));
                     result.setErrMsg(batchJob.getString("ErrMsg"));
                     result.setJobId(jobId);
@@ -814,6 +820,8 @@ public class WeiXinCorpController {
                     ReportServiceImpl.corpwxJobCenter.put(jobId, result);
                     UserController.corpwxJobCenter.put(jobId, result);
                     TaskController.corpwxJobCenter.put(jobId, result);
+                    //注册到redis,其他系统可能需要用
+                    redisUtil.setString("corpwxJobCenter"+jobId, jsonObject.toString(), 600);
                 } else if ("auto_activate".equals(infoType)) {
                     //被邀请的同事自动激活使用
                     //{"xml":{"Scene":1,"InfoType":"auto_activate",

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java

@@ -20,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.File;
 import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.List;
@@ -740,7 +741,16 @@ public class ExcelExportServiceImpl implements ExcelExportService {
             //文件名不能含有路径,得替换掉
             title = title.replace("\\", "@");
         }
+
+
         String fileUrlSuffix = title + ".xlsx";
+        //检查文件是否存在
+        File file = new File(downloadPath + fileUrlSuffix);
+        if (!file.exists()) {
+            httpRespMsg.setError("数据存在问题,文件生成失败");
+            System.err.println("数据存在问题,文件生成失败:"+downloadPath + fileUrlSuffix);
+            return httpRespMsg;
+        }
         if(wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1){
             String mediaId = wxCorpInfoService.getTranslationMediaId(fileUrlSuffix);
             String jobId = wxCorpInfoService.syncTranslation(wxCorpInfo.getCorpid(),mediaId,fileUrlSuffix, null);

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

@@ -671,12 +671,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             String[] sheetNames = new String[2];
             sheetNames[0] = "项目统计表";
             sheetNames[1] = "人员统计表";
-
-
-
-//            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,"月度工时统计表" , allList, path);
-//            return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,dingding,"月度工时统计表" , totalList, path,sheetNames);
-            return excelExportService.exportMultiSheetGeneralExcelByTitleAndListNew(wxCorpInfo,dingding,"月度工时统计表" , totalList, path,sheetNames);
+            String fileName = year + "年" + month + "月工时统计表_"+System.currentTimeMillis();
+            return excelExportService.exportMultiSheetGeneralExcelByTitleAndListNew(wxCorpInfo,dingding,fileName , totalList, path,sheetNames);
         } catch (NullPointerException e) {
             e.printStackTrace();
             //httpRespMsg.setError("验证失败");

+ 11 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ExcelUtil.java

@@ -1247,6 +1247,7 @@ public class ExcelUtil {
 
                 if(multiSheetList[sheetIndex].size() > 0) {
                     int start = 0;
+                    Row row0 = null;
                     for(List<String> rowList : multiSheetList[sheetIndex]) {
                         Row row = sheetOne.createRow(start);
                         row.setHeightInPoints(24);
@@ -1259,13 +1260,15 @@ public class ExcelUtil {
                             }
                             cell.setCellValue(rowList.get(i));
                         }
+                        if (start == 0) {
+                            //先拿第一行,后面需要用到。 不能等for循环结束再拿,因为for循环结束后可能数据超过100行。 SXSSFWorkbook 会通过一个内部缓冲区管理内存中保留的行数。
+                            // 默认情况下,它只会在内存中保留最近的 100 行。如果行数超过这个限制,它会将早期的行写入磁盘并将它们从内存中删除。
+                            // 因此,当你尝试获取 sheetOne.getRow(0) 时,返回的行对象为空,因为那一行已经被丢弃到磁盘。
+                            row0 = row;
+                        }
                         start++;
                     }
                     if (sheetIndex==1){
-                        Row row0 = sheetOne.getRow(0);
-                        for (int i = 0; i < 4; i++) {
-                            sheetOne.addMergedRegion(new CellRangeAddress(0, 1, i,i));
-                        }
                         int numberOfCells = row0.getPhysicalNumberOfCells();
                         int index=-1;
                         for (int i = 0; i < numberOfCells; i++) {
@@ -1274,6 +1277,10 @@ public class ExcelUtil {
                                 break;
                             }
                         }
+
+                        for (int i = 0; i < 4; i++) {
+                            sheetOne.addMergedRegion(new CellRangeAddress(0, 1, i,i));
+                        }
                         if (index!=-1){
                             sheetOne.addMergedRegion(new CellRangeAddress(0, 0, 4,index-1));
                         }
@@ -1281,9 +1288,6 @@ public class ExcelUtil {
                         if (index!=-1&&index<lastCellNum-1){
                             sheetOne.addMergedRegion(new CellRangeAddress(0, 0, index,lastCellNum-1));
                         }
-
-
-
                     }
                 }
             }

+ 63 - 36
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -649,6 +649,33 @@
                 <el-button type="primary" @click="confirmDeactive">{{ $t('btn.determine') }}</el-button>
             </span>
         </el-dialog>
+
+        <el-dialog title="转移日报审核人" :visible.sync="reportAuditorSelectDialog" width="500px" >
+            <p>*该用户尚有需要审核的日报,请确认处理方式</p>
+            <el-form :model="userInActiveForm" label-width="120px">
+                <el-form-item prop="name">
+                    <el-radio-group v-model="userInActiveForm.way">
+                      <el-radio :label="0">驳回日报</el-radio>
+                      <el-radio :label="1">转移审核人</el-radio>
+                    </el-radio-group>
+                </el-form-item>
+
+                <!-- 主要负责人 -->
+                <el-form-item label="选择新的审核人" v-if="userInActiveForm.way">
+                    <el-select v-model="userInActiveForm.targetAuditorId" filterable v-if="user.userNameNeedTranslate != '1'" clearable  :placeholder="$t('defaultText.pleaseChoose')" style="width: 200px">
+                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                          <span style="float: left">{{ item.name }}</span>
+                          <span style="float: right; color: #8492a6; font-size: 13px">{{ item.jobNumber }}</span>
+                        </el-option>
+                    </el-select>
+                    <selectCat :size="'medium'" :filterable="true" :clearable="true" :widthStr="'360'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="userInActiveForm.targetAuditorId" :distinction="'30'" @selectCal="selectCal"></selectCat>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="reportAuditorSelectDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="confirmInactiveWay" >{{ $t('btn.submit') }}</el-button>
+            </span>
+        </el-dialog>
         <!-- 管理专业证书 -->
         <el-dialog :title="$t('professionalCertificate inManagement')" :visible.sync="managementDiolog" width="500px" :before-close="handleClose">
             <div>
@@ -947,6 +974,8 @@ export default {
   },
   data() {
     return {
+      reportAuditorSelectDialog: false,
+      userInActiveForm:{way:0,targetAuditorId:null},
       isExporting: false,
       isSyncContact: false,
       showSyncDDDialog: false,
@@ -2272,42 +2301,10 @@ export default {
             });
             this.getUser();
           } else {
-            if(this.user.companyId==876||this.user.companyId==877||this.user.companyId==878){
-                this.$confirm(this.$t('dangQianYuanGongYouDaiShenHeRiBaoQueRenTingYongBingBoHuiRiBaoMa'), this.$t('other.prompts'), {
-                confirmButtonText: this.$t('btn.determine'),
-                cancelButtonText: this.$t('btn.cancel'),
-                type: 'warning'
-                }).then(() => {
-                  this.http.post(
-                    "/report/denyByCheckId",
-                    { userId:this.deactiveUser.id },
-                    (res) => {
-                      if (res.code == "ok") {
-                        this.$message({
-                          message: this.$t('stopsuccess'),
-                          type: "success",
-                        });
-                      } else {
-                        this.$message({
-                          message: res.msg,
-                          type: "error",
-                        });
-                      }
-                    },
-                    (error) => {
-                      this.listLoading = false;
-                      this.$message({
-                        message: error,
-                        type: "error",
-                      });
-                    }
-                  );
-                }).catch(() => {
-                  this.$message({
-                    type: 'info',
-                    message: this.$t('yiQuXiao')
-                  });          
-              });
+            if(this.user.companyId==876||this.user.companyId==877||this.user.companyId==878 || this.user.companyId == 10){
+              //新的模式
+              this.userInActiveForm.userId = this.deactiveUser.id;
+              this.reportAuditorSelectDialog = true;
             }else{
               this.$message({
                 message: error,
@@ -2324,6 +2321,36 @@ export default {
         }
       );
     },
+
+    confirmInactiveWay() {
+      var url = this.userInActiveForm.way?'/report/transferReportAuditor':'/report/denyByCheckId'
+      this.http.post(
+          url,
+          this.userInActiveForm,
+          (res) => {
+            if (res.code == "ok") {
+              this.$message({
+                message: this.$t('stopsuccess'),
+                type: "success",
+              });
+              this.reportAuditorSelectDialog = false;
+              this.deactiveDialog = false;
+            } else {
+              this.$message({
+                message: res.msg,
+                type: "error",
+              });
+            }
+          },
+          (error) => {
+            this.listLoading = false;
+            this.$message({
+              message: error,
+              type: "error",
+            });
+          }
+        );
+    },
     showDeactiveDialog(item) {
       this.deactiveDialog = true;
       this.deactiveUser = item;