package com.malk.minjiaoyuan.service.impl; import com.alibaba.fastjson.JSON; import com.malk.Util.UtilMap; import com.malk.minjiaoyuan.service.MJYService; import com.malk.server.aliwork.YDConf; import com.malk.server.aliwork.YDParam; import com.malk.server.common.McException; import com.malk.service.aliwork.YDClient; import com.malk.service.aliwork.YDService; import com.malk.service.dingtalk.DDClient; import com.malk.service.dingtalk.DDClient_Contacts; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; @Service @Slf4j public class MJYImplService implements MJYService { @Autowired private YDClient ydClient; @Autowired private YDService ydService; // 名额配置 private List quotaList = new ArrayList<>(); // 获取学校与类型比例 @Override public int getSchoolRatio(String schoolName, String typeName) { if (quotaList.isEmpty()) { List list = (List) ydClient.queryData(YDParam.builder() .formUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLKE") .pageSize(YDConf.PAGE_SIZE_LIMIT) .build(), YDConf.FORM_QUERY.retrieve_list_all).getData(); quotaList = list.stream().map(item -> (Map) item.get("formData")).collect(Collectors.toList()); log.info("名额配置数据, {}", quotaList.size()); } Map formData = quotaList.stream().filter(item -> typeName.equals(item.get("selectField_lgf306u6"))).findAny().get(); int ratio = Integer.valueOf(String.valueOf(formData.get("numberField_lgezizyl"))); List> details = (List>) formData.get("tableField_lgezizyn"); Optional detail = details.stream().filter(item -> item.get("selectField_lgezizyo").equals(schoolName)).findAny(); if (detail.isPresent()) { ratio = Integer.valueOf(String.valueOf(((Map) detail.get()).get("numberField_lgezizyq"))); } return ratio; } // 查询全部数据 @Override public List queryAllBySync(YDParam param) { param.setPageSize(1); long totalCount = ydClient.queryData(param, YDConf.FORM_QUERY.retrieve_list).getTotalCount(); List dataList = new ArrayList<>(); // Math.ceil 需要有浮点数, 否则转 int 类型忽略掉, 向上取整就会是当前值 for (int index = 1; index <= (int) Math.ceil(totalCount * 1.0 / YDConf.PAGE_SIZE_LIMIT); index++) { // 对象拷贝: 避免并发下分页条件被修改导致数据混乱 YDParam ydParam = (YDParam) param.copyParam(); ydParam.setPageNumber(index); ydParam.setPageSize(YDConf.PAGE_SIZE_LIMIT); dataList.addAll((List) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_list).getData()); } return dataList; } // 获取直入名单 @Override public List getDirectList() { YDParam ydParam = YDParam.builder() .formUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLKE") .searchCondition(JSON.toJSONString(UtilMap.map("selectField_lgf306u6", "直入名单"))) .pageSize(1) .build(); String formInstanceId = (String) ((List) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData()).get(0).get("formInstanceId"); ydParam.setFormInstanceId(formInstanceId); ydParam.setTableFieldId("tableField_lgf2p2jm"); List details = ydService.queryDetails(ydParam); log.info("直入名单, {}", details.size()); return details.stream().map(item -> (String) item.get("textField_lgt5j83x")).collect(Collectors.toList()); } // 触发通知 @Override public void triggerNotice(String formUuid, String createUserId, Map formData) { YDParam ydParam = YDParam.builder() .formUuid(formUuid) .formDataJson(JSON.toJSONString(formData)) .userId(createUserId) // 触发通知 .build(); ydClient.operateData(ydParam, YDConf.FORM_OPERATION.create); } // 匹配学校负责人 @Override public List matchQuery(List schoolQuotaList) { YDParam ydParam = YDParam.builder() .formUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLUE") .build(); List schoolAuthList = queryAllBySync(ydParam); List list = schoolQuotaList.stream().map(item -> { // 条件: 学校全称 Optional optional = schoolAuthList.stream().filter(row -> ((Map) row.get("formData")).get("selectField_lgf41nj4").equals(item.get("textField_lgezb8r7"))).findAny(); if (optional.isPresent()) { Map data = (Map) ((Map) optional.get()).get("formData"); // 前端展示格式: prd 学校负责人单选 List empsName = (List) data.get("employeeField_lgf7h60y"); List empsId = (List) data.get("employeeField_lgf7h60y_id"); List managers = new ArrayList<>(); for (int i = 0; i < empsName.size(); i++) { managers.add(UtilMap.map("name, value", empsName.get(i), empsId.get(i))); } item.put("employeeField_lgf7m9s4", managers); log.info("匹配学校负责人, {}", data); } return item; }).collect(Collectors.toList()); return list; } @Autowired private DDClient ddClient; @Autowired private DDClient_Contacts ddClient_contacts; // 同步教师档案 [已邀请] @Override public void syncTeacherStatus() { // 查询已邀请教师档案数据 YDParam ydParam = YDParam.builder() .formUuid("FORM-AC666081555ANZAZ6D4IVCQLY5Y12P4ZSRTGLAE") .searchFieldJson(JSON.toJSONString(UtilMap.map("radioField_lhlhshbc", "已邀请"))) .build(); List dataList = queryAllBySync(ydParam); log.info("同步教师数量, {}", dataList.size()); for (Map formData : dataList) { Map dataForm = (Map) formData.get("formData"); String userId = dataForm.get("textField_lftczqr5").toString(); String remark; String status = "已邀请"; // 是否进入架构 try { ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), userId); remark = "已同步"; status = "已同步"; } catch (McException e) { remark = e.getMessage(); log.error(e.getMessage(), e); } // 发送同步通知 if ("已同步".equals(remark)) { String notice = dataForm.get("textField_lghs4pmx") + "老师[" + userId + "]"; notice += ", 您好: \n欢迎加入【闵行区教师梯队管理】架构, 您的档案已同步, 可发起骨干系列评选报名"; Map data = UtilMap.map("employeeField_lhgj6tc7, textField_lhlj3dgb, textareaField_lhgj6tcu", Arrays.asList(userId), userId, notice); triggerNotice("FORM-8Y866XB1FGHAB037F4F7054SZMHI2RFZ1JLHLP", userId, data); } // 同步邀请状态 ydParam.setFormInstanceId(formData.get("formInstanceId").toString()); ydParam.setUpdateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_lhlqrv31, radioField_lhlhshbc, employeeField_lgeyfc4d", remark, status, Arrays.asList(userId)))); ydClient.operateData(ydParam, YDConf.FORM_OPERATION.update); log.info("同步教师状态, {}, {}", userId, remark); } } }