server/src/main/java/com/doumee/api/web/WebCategoryController.java
@@ -50,6 +50,21 @@ } } @LoginRequired @GetMapping("/getCategoryVOForGCXTree") @ApiOperation("获取分类类别获取分类树 - 观察项") public ApiResponse<List<CategoryVO>> getCategoryVOForGCXTree(@RequestParam Integer categoryId, @RequestHeader(JwtTokenUtil.HEADER_KEY) String token){ try { jwtTokenUtil.getUserInfoByToken(token); return ApiResponse.success(categoryService.getCategoryVOForGCXTree(categoryId)); }catch (BusinessException e){ return ApiResponse.failed(e.getCode(),e.getMessage()); }catch (Exception e){ return ApiResponse.failed(ResponseStatus.SERVER_ERROR); } } @LoginRequired @GetMapping("/categoryList") server/src/main/java/com/doumee/api/web/WebMemberController.java
@@ -9,6 +9,8 @@ import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.ApiResponse; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.dto.WebQwSingatureDto; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.vo.WebQwSingatureVO; @@ -18,6 +20,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -110,18 +113,18 @@ String jsapiTicket = systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_JS_API_TICKET).getCode(); String noncestr = UUID.randomUUID().toString(); Long timestamp = System.currentTimeMillis() / 1000; String jsapiTicketStr = jsapiTicket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + param.getUrl(); MessageDigest instance = MessageDigest.getInstance("SHA-1"); instance.update(jsapiTicketStr.getBytes()); byte[] digest = instance.digest(); BigInteger bigInteger = new BigInteger(1, digest); String string = bigInteger.toString(); String jsapiTicketStr = "jsapi_ticket="+jsapiTicket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + param.getUrl(); // MessageDigest instance = MessageDigest.getInstance("SHA-1"); // instance.update(jsapiTicketStr.getBytes()); // byte[] digest = instance.digest(); // BigInteger bigInteger = new BigInteger(1, digest); // String string = bigInteger.toString(); WebQwSingatureVO result = new WebQwSingatureVO(); result.setNoncestr( noncestr); result.setSignature( string); result.setSignature( getSHA1(jsapiTicketStr)); result.setTimestamp( timestamp); result.setUrl( param.getUrl()); // result.put("ticket", jsapiTicket); result.setTicket(jsapiTicket); return ApiResponse.success( result); } catch ( Exception e) { e.printStackTrace(); @@ -130,4 +133,41 @@ return ApiResponse.failed("获取签名失败"); } @LoginRequired @ApiOperation("查询可被抄送人分页") @PostMapping("/getCopySendUserPage") public ApiResponse<PageData<Member>> getCopySendUserPage (@RequestBody PageWrap<Member> pageWrap) { pageWrap.getModel().setIsSendCopy(Constants.ONE); return ApiResponse.success(memberService.findPage(pageWrap)); } public static String getSHA1(String input) { try { // 获取MessageDigest类的实例,指定使用SHA-1算法 MessageDigest md = MessageDigest.getInstance("SHA-1"); // 使用指定的字节更新摘要 md.update(input.getBytes()); // 获取密文(哈希值) byte[] digest = md.digest(); // 将字节数组转换为十六进制字符串 StringBuilder hexString = new StringBuilder(); for (byte b : digest) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } } server/src/main/java/com/doumee/api/web/WebWorkOrderController.java
@@ -140,7 +140,6 @@ @GetMapping("/urge") public ApiResponse urge(@RequestParam Integer workorderId, @RequestHeader(JwtTokenUtil.HEADER_KEY) String token) { try { workorderService.urge(workorderId,jwtTokenUtil.getUserInfoByToken(token)); return ApiResponse.success("操作成功"); }catch (BusinessException e){ server/src/main/java/com/doumee/core/constants/Constants.java
@@ -24,6 +24,7 @@ public static final String QYWX_TOKEN = "QYWX_TOKEN"; public static final String QYWX_AGENTID = "QYWX_AGENTID"; public static final String QYWX_JS_API_TICKET = "QYWX_JS_API_TICKET"; public static final String JUMP_OUT_URL = "JUMP_OUT_URL"; public static final String QYWX = "QYWX"; server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java
@@ -137,7 +137,7 @@ QywxBaseResponse<String> response = sendHttpRequest(url,interfaceUrl[1],"" ,new TypeReference<QywxBaseResponse<String>>(){}); if(response.getErrcode()!=null && response.getErrcode() ==0){ return response.getJsapi_ticket(); return response.getTicket(); } return null; } server/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java
@@ -26,7 +26,7 @@ @ApiModelProperty(value = "获取到的凭证,最长为512字节") private String access_token; @ApiModelProperty(value = "获取到的凭证,最长为512字节") private String jsapi_ticket; private String ticket; @ApiModelProperty(value = "凭证的有效时间") private Long expires_in; server/src/main/java/com/doumee/dao/business/model/Member.java
@@ -107,5 +107,8 @@ @ApiModelProperty(value = "用户所属组织名称集合") @TableField(exist = false) private String[] companyNameList; @ApiModelProperty(value = "是否查询抄送人:0=否;1=是;(查询使用)") @TableField(exist = false) private Integer isSendCopy; } server/src/main/java/com/doumee/dao/business/vo/WebQwSingatureVO.java
@@ -24,5 +24,7 @@ private String signature; @ApiModelProperty(value = "地址") private String url; @ApiModelProperty(value = "ticket") private String ticket; } server/src/main/java/com/doumee/dao/web/dto/PassOnDTO.java
@@ -20,7 +20,7 @@ private Integer workorderId; @ApiModelProperty(value = "被转交人(下一步处理人)") private Integer passOnUserId; private String passOnUserId; @ApiModelProperty(value = "说明") private String info; server/src/main/java/com/doumee/service/business/CategoryService.java
@@ -106,5 +106,7 @@ List<CategoryVO> getCategoryVOList(Integer categoryType,Integer isRoot); List<CategoryVO> getCategoryVOForGCXTree(Integer categoryId); List<Category> treeList(Category param ); } server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -10,6 +10,7 @@ import com.doumee.core.utils.Utils; import com.doumee.dao.business.CategoryMapper; import com.doumee.dao.business.model.Category; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.vo.CompanyTree; import com.doumee.dao.web.vo.CategoryVO; import com.doumee.dao.web.vo.CategoryVOTree; @@ -35,6 +36,7 @@ import java.util.List; import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; /** * 分类信息表Service实现 @@ -319,6 +321,41 @@ @Override public List<CategoryVO> getCategoryVOForGCXTree(Integer categoryId){ List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda() .eq(Category::getIsdeleted, Constants.ZERO) .eq(Category::getType, Constants.FOUR) .and( ms->ms.eq(Category::getId,categoryId).or().eq(Category::getParentId,categoryId)) .orderByAsc(Category::getSortnum,Category::getId) ); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){ categoryList.addAll( categoryMapper.selectList(new QueryWrapper<Category>().lambda() .eq(Category::getIsdeleted, Constants.ZERO) .eq(Category::getType, Constants.SIX) .in(Category::getParentId,categoryList.stream().map(i->i.getId()).collect(Collectors.toList())) .orderByAsc(Category::getSortnum,Category::getId)) ); } List<CategoryVO> categoryVOList = new ArrayList<>(); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){ for (Category category:categoryList) { CategoryVO categoryVO = new CategoryVO(); categoryVO.setId(category.getId()); categoryVO.setName(category.getName()); categoryVO.setParentId(category.getParentId()); categoryVOList.add(categoryVO); } CategoryVOTree treeBuild = new CategoryVOTree(categoryVOList); categoryVOList = treeBuild.buildTree(); } return categoryVOList; } @Override public List<CategoryVO> getCategoryVOList(Integer categoryType,Integer isRoot){ List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda() .eq(Category::getIsdeleted, Constants.ZERO) server/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -220,6 +220,11 @@ //不包含下级组织 queryWrapper.exists(pageWrap.getModel().getCompanyId()!=null,"select (cm.id) from company_member cm where cm.company_id='"+pageWrap.getModel().getCompanyId()+"' and cm.member_id=t.id"); } if(Objects.nonNull(pageWrap.getModel().getIsSendCopy())&&Constants.equalsInteger(Constants.ONE,pageWrap.getModel().getIsSendCopy())){ queryWrapper.apply(" t.id in ( select MEMBER_ID from managers where ISDELETED= 0 and STATUS = 0 and TYPE = 1 ) "); } queryWrapper.orderByAsc(Member::getCreateDate); PageData<Member> record = PageData.from(memberMapper.selectJoinPage(page,Member.class, queryWrapper)); if(record!=null && record.getRecords()!=null){ @@ -431,7 +436,7 @@ } String token = systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_TOKEN).getCode(); //根据code换区企业微信ID QywxBaseResponse<String> qwIdBaseResponse= QywxUtil.getUserInfoByCode(token,dto.getCode()); QywxBaseResponse<String> qwIdBaseResponse= QywxUtil.getUserInfoByCode(token,dto.getCode()); if(Objects.isNull(qwIdBaseResponse)||Objects.isNull(qwIdBaseResponse.getErrcode())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"企业微信登录码解析失败,请联系管理员"); } server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
@@ -82,12 +82,12 @@ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public Integer create(Workorder workorder) { this.isValidBaseParam(workorder); workorder.setCreateDate(new Date()); workorder.setEditDate(new Date()); workorder.setMemberId(workorder.getMemberId()); workorder.setIsdeleted(Constants.ZERO); workorder.setCode(this.getNextCode(workorder.getType())); workorder.setEmailStatus(Constants.ZERO); workorder.setCreateDate(new Date()); //处理人员类信息 this.dealNoticeData(workorder); //处理SHE事件状态 @@ -143,10 +143,13 @@ qywxSendMsgRequest.setTextcard(textCard); QywxUtil.sendMsg(systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_TOKEN).getCode(), qywxSendMsgRequest); //https://open.weixin.qq.com/connect/oauth2/authorize?appid=${corpId}&redirect_uri=https://dmtest.ahapp.net/lianhelihua_web/&response_type=code&scope=snsapi_base&state={status}#wechat_redirect } private static final String jumpUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={corpId}&redirect_uri={ourUrl}"; private static final String [] qwDetailUrls = {"/pages/details_she/details_she","/pages/workOrder_dca/workOrder_dca","","/pages/workOrder_she/workOrder_she"}; /** * 通知文案整理 @@ -160,7 +163,9 @@ public QywxTextCardMsgRequest dealMessageContent(Workorder workorder,String userName ,String categoryName,Integer contentType,String csInfo){ QywxTextCardMsgRequest textCard = new QywxTextCardMsgRequest(); String message = ""; textCard.setUrl(qwDetailUrls[workorder.getType()]+"?id="+workorder.getId()); String url = jumpUrl.replace("{corpId}",systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_CORPID).getCode()); String jumpOurUrl = systemDictDataBiz.queryByCode(Constants.QYWX,Constants.JUMP_OUT_URL).getCode().replace("{status}",workorder.getType()+"_"+workorder.getId()); textCard.setUrl(url.replace("{ourUrl}",jumpOurUrl)); if(Constants.equalsInteger(workorder.getType(),Constants.ZERO)){ textCard.setTitle("【SHE事件上报】"); if(Constants.equalsInteger(workorder.getMemberType(),Constants.ZERO)){ @@ -168,7 +173,7 @@ }else { message = Constants.equalsInteger(workorder.getMemberType(),Constants.ONE)?"同事":"供应商"; } message = message + "-" + workorder.getMemberNames() + " " + DateUtil.formatDate(new Date(),"yyyy-MM-dd HH:mm") + workorder.getLocationName() + categoryName; message = message + "-" + workorder.getMemberNames() + " " + DateUtil.formatDate(new Date(),"yyyy-MM-dd HH:mm") + "/" +workorder.getLocationName() + "/" + categoryName; textCard.setDescription("<div class=\"normal\">"+message+"</div>"); }else{ @@ -195,6 +200,7 @@ if (Constants.equalsInteger(workorder.getType(), Constants.THREE) || Constants.equalsInteger(workorder.getType(), Constants.TWO) ) { //处理上报日志 DCA工单 日志存储至子业务 不存在于父级 与跌绊滑 String logTitle = Constants.equalsInteger(workorder.getType(), Constants.THREE) ? "跌绊滑风险" : "DCA"; workorder.setCreateDate(workorder.getSubmitDate()); this.saveLog(null,workorder,Constants.ZERO,workorder.getMemberId(),workOrderStatus.getLogTitle().replace("{title}",logTitle),null,null); } } @@ -271,6 +277,9 @@ multifileMapper.insert(multifileList); } } }else{ workorder.setStatus(Constants.WorkOrderStatus.sheClose.getKey()); workorderMapper.updateById(workorder); } //查询主题下的所有观察项 @@ -279,13 +288,16 @@ //存储DCA工单详情 Map<String,Object> detail = new HashMap<>(); detail.put("title","观察主题:"+type.getName()); List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda().eq(Category::getType,4).eq(Category::getParentId,workorder.getTypeId())); List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda().eq(Category::getType,4) .eq(Category::getIsdeleted,Constants.ZERO) .eq(Category::getParentId,workorder.getTypeId())); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(categoryList)){ List<Map<String,Object>> childMapList = new ArrayList<>(); for (Category category:categoryList) { Map<String,Object> childMap = new HashMap<>(); childMap.put("childTitle",category.getName()); List<Category> problemList = categoryMapper.selectList(new QueryWrapper<Category>().lambda() .eq(Category::getIsdeleted,Constants.ZERO) .eq(Category::getType,6).eq(Category::getParentId,category.getId())); List<Map<String,Object>> problemMapList = new ArrayList<>(); Integer index = Constants.ONE; @@ -384,8 +396,8 @@ */ public Integer saveLog(String beforeJson,Workorder afterWorkorder,Integer objType,Integer memberId,String title,String content,String paramr2){ WorkorderLog workorderLog = new WorkorderLog(); workorderLog.setCreateDate(new Date()); workorderLog.setEditDate(new Date()); workorderLog.setCreateDate(afterWorkorder.getCreateDate()); workorderLog.setEditDate(afterWorkorder.getCreateDate()); workorderLog.setIsdeleted(Constants.ZERO); workorderLog.setBeforeContent(beforeJson); workorderLog.setAfterContent(JSONObject.toJSONString(afterWorkorder)); @@ -564,7 +576,7 @@ if(Constants.equalsInteger(workorder.getStatus(),Constants.ONE)){ Member member = memberMapper.selectById(workorderLog.getParam1()); if(Objects.nonNull(member) && org.apache.commons.lang3.StringUtils.isNotBlank(member.getQwId()) && member.getQwId().equals(workorder.getManagerId()) ){ && workorder.getQwnoticeMemberIds().indexOf(member.getQwId())>=Constants.ZERO){ workorderLog.setUrgeButton(Constants.ONE); } } @@ -572,7 +584,7 @@ if(Constants.equalsInteger(workorder.getStatus(),Constants.TWO)){ Member member = memberMapper.selectById(workorderLog.getParam1()); if(Objects.nonNull(member) && org.apache.commons.lang3.StringUtils.isNotBlank(member.getQwId()) && member.getQwId().equals(workorder.getDealerId()) && canOpenUrgeButton){ && member.getQwId().equals(workorder.getManagerId()) && canOpenUrgeButton){ workorderLog.setUrgeButton(Constants.ONE); canOpenUrgeButton = false; } @@ -725,7 +737,7 @@ queryWrapper.and( ms->ms.like(Member::getName, pageWrap.getMemberName()) .or().like(Member::getPhone, pageWrap.getMemberName()) ); } queryWrapper.orderByDesc(Workorder::getProblemId); queryWrapper.orderByDesc(Workorder::getId); return queryWrapper; } @@ -809,7 +821,7 @@ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,当前工单非您的工单,无法进行处理"); } workorder.setStatus(Constants.WorkOrderStatus.wtsClose.getKey()); qwIds = Arrays.asList(workorder.getQwnoticeMemberIds()); qwIds.addAll(Arrays.asList(workorder.getQwnoticeMemberIds().split(","))); qwIds.add(workorder.getManagerId()); qwIds.remove(closeDTO.getMember().getQwId()); }else if(Constants.equalsInteger(workorder.getStatus(),Constants.WorkOrderStatus.waitDeal.getKey())){ @@ -819,7 +831,7 @@ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,当前工单非您的工单,无法进行处理"); } workorder.setStatus(Constants.WorkOrderStatus.wtsClose.getKey()); qwIds = Arrays.asList(workorder.getQwnoticeMemberIds()); qwIds.addAll(Arrays.asList(workorder.getQwnoticeMemberIds().split(","))); qwIds.add(workorder.getDealerId()); qwIds.remove(closeDTO.getMember().getQwId()); }else{ @@ -859,11 +871,11 @@ public void passOn(PassOnDTO passOnDTO){ if(Objects.isNull(passOnDTO) || Objects.isNull(passOnDTO.getWorkorderId()) || Objects.isNull(passOnDTO.getPassOnUserId()) || org.apache.commons.lang3.StringUtils.isBlank(passOnDTO.getPassOnUserId()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Member member = memberMapper.selectById(passOnDTO.getPassOnUserId()); Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getQwId,passOnDTO.getPassOnUserId())); if(Objects.isNull(member)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到被转交人信息"); } @@ -897,7 +909,7 @@ Integer logId = this.saveLog(beforeJson,workorder, Constants.equalsInteger(passOnDTO.getPassOnType(),Constants.ZERO)?Constants.ONE:Constants.TWO ,workorder.getMemberId(),"任务分配",passOnDTO.getInfo(),paramr2); List<Multifile> multifileList = workorder.getMultifileList(); List<Multifile> multifileList = passOnDTO.getMultifileList(); if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){ for (Multifile multifile:multifileList) { multifile.setObjId(logId); @@ -1110,7 +1122,7 @@ } this.saveLog(null,workorder, Constants.ONE Constants.FOUR ,member.getId(),"催促","已催促 "+urgeUser.getCompanyName() + "/" + urgeUser.getName(),null); //发送企微通知 Category category = categoryMapper.selectById(workorder.getTypeId()); server/src/main/resources/application.yml
@@ -9,7 +9,7 @@ spring: profiles: active: dev active: test # JSON返回配置 jackson: # 默认时区 @@ -22,6 +22,10 @@ auto-startup: true # 调度器名称 scheduler-name: EvaScheduler servlet: multipart: max-file-size: 50MB max-request-size: 50MB # MyBatis配置 mybatis-plus: