Lee-考确认单需求开发2025-07-31
This commit is contained in:
parent
a26b55d36c
commit
df75f4d16a
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,140 @@
|
||||||
|
package com.weaver.seconddev.chapanda.action;
|
||||||
|
|
||||||
|
import cn.hutool.json.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.weaver.common.base.entity.result.WeaResult;
|
||||||
|
import com.weaver.common.cache.base.BaseCache;
|
||||||
|
import com.weaver.common.hrm.util.HrmCommonUtil;
|
||||||
|
import com.weaver.eb.common.util.TimeUtils;
|
||||||
|
import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface;
|
||||||
|
import com.weaver.mc.api.async.AsyncSystemMessageRest;
|
||||||
|
import com.weaver.mc.api.entity.SendMessageEntity;
|
||||||
|
import com.weaver.seconddev.chapanda.constant.Constant;
|
||||||
|
import com.weaver.seconddev.chapanda.entity.dto.EmployeeAttendDTO;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.constant.Constants;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuOpenIdUtil;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuSendTodoUtil;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuTokenUtil;
|
||||||
|
import com.weaver.seconddev.chapanda.mapper.EmployeeAttendMapper;
|
||||||
|
import com.weaver.seconddev.chapanda.util.SystemMessageUtil;
|
||||||
|
import com.weaver.teams.domain.user.SimpleEmployee;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.YearMonth;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service("kqMindDoneAction")
|
||||||
|
public class KqMindDoneAction implements EsbServerlessRpcRemoteInterface {
|
||||||
|
@Autowired
|
||||||
|
EmployeeAttendMapper employeeAttendMapper;
|
||||||
|
@Autowired
|
||||||
|
private AsyncSystemMessageRest asyncSystemMessageRest;
|
||||||
|
@Autowired
|
||||||
|
Esb2FeishuOpenIdUtil esb2FeishuOpenIdUtil;
|
||||||
|
@Autowired
|
||||||
|
private Esb2FeishuTokenUtil esb2FeishuTokenUtil;
|
||||||
|
@Autowired
|
||||||
|
Esb2FeishuSendTodoUtil esb2FeishuSendTodoUtil;
|
||||||
|
@Autowired
|
||||||
|
private HrmCommonUtil hrmCommonUtil;
|
||||||
|
@Autowired
|
||||||
|
private BaseCache baseCache;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WeaResult<Map<String, Object>> execute(Map<String, Object> params) {
|
||||||
|
// 在动作流中配置的输入参数可从 params 中读取
|
||||||
|
log.error("params: {}", JSON.toJSONString(params));
|
||||||
|
|
||||||
|
String dataId = (String) params.get("dataId");
|
||||||
|
String operator = (String) params.get("operator");
|
||||||
|
String status = (String) params.get("status");
|
||||||
|
SimpleEmployee user = hrmCommonUtil.getSimpleEmployee(Long.valueOf(operator));
|
||||||
|
|
||||||
|
String pcUrl = "";
|
||||||
|
String mobileUrl = "";
|
||||||
|
|
||||||
|
sendToFeiShuTodo(user, dataId, pcUrl, mobileUrl, status);
|
||||||
|
|
||||||
|
return WeaResult.success(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendToFeiShuTodo(SimpleEmployee user, String dataId, String pcUrl, String mobileUrl, String status) {
|
||||||
|
Map<String, Object> userMap = esb2FeishuOpenIdUtil.queryFeishuOpenIdByMobiles(user.getMobile());
|
||||||
|
String operator_open_id = String.valueOf(userMap.get(user.getMobile()));
|
||||||
|
|
||||||
|
String token = (String) baseCache.get(Constant.MODULE_KEY, Constant.FEI_SHU_TOKEN_KEY);
|
||||||
|
if (StringUtils.isEmpty(token)) {
|
||||||
|
token = esb2FeishuTokenUtil.getToken();
|
||||||
|
baseCache.set(Constant.MODULE_KEY, Constant.FEI_SHU_TOKEN_KEY, token, 6000);
|
||||||
|
}
|
||||||
|
long currentTimeStamp = System.currentTimeMillis();
|
||||||
|
//接收人openid
|
||||||
|
String receiver_open_id = operator_open_id;
|
||||||
|
|
||||||
|
JSONObject bodyJson = new JSONObject();
|
||||||
|
bodyJson.put("approval_code", Constants.approvalCode);
|
||||||
|
bodyJson.put("status", status);
|
||||||
|
bodyJson.put("instance_id", dataId);
|
||||||
|
JSONObject linksJson = new JSONObject();
|
||||||
|
linksJson.put("pc_link", pcUrl);
|
||||||
|
linksJson.put("mobile_link", mobileUrl);
|
||||||
|
bodyJson.put("links", linksJson);
|
||||||
|
bodyJson.put("title", "@i18n@title");
|
||||||
|
bodyJson.put("open_id", operator_open_id);
|
||||||
|
bodyJson.put("start_time", currentTimeStamp);
|
||||||
|
bodyJson.put("end_time", 0);
|
||||||
|
bodyJson.put("update_time", currentTimeStamp);
|
||||||
|
bodyJson.put("display_method", Constants.browser);
|
||||||
|
bodyJson.put("update_mode", Constants.updateMode);
|
||||||
|
|
||||||
|
JSONArray i18nResourcesTextsArray = new JSONArray();
|
||||||
|
JSONObject i18nResourcesTextsJson = new JSONObject();
|
||||||
|
i18nResourcesTextsJson.put("key", "@i18n@title");
|
||||||
|
i18nResourcesTextsJson.put("value", "");
|
||||||
|
i18nResourcesTextsArray.add(i18nResourcesTextsJson);
|
||||||
|
|
||||||
|
JSONObject i18nResourcesJson = new JSONObject();
|
||||||
|
i18nResourcesJson.put("locale", "zh-CN");
|
||||||
|
i18nResourcesJson.put("texts", i18nResourcesTextsArray);
|
||||||
|
i18nResourcesJson.put("is_default", "true");
|
||||||
|
JSONArray i18nResourcesArray = new JSONArray();
|
||||||
|
i18nResourcesArray.add(i18nResourcesJson);
|
||||||
|
bodyJson.put("i18n_resources", i18nResourcesArray);
|
||||||
|
|
||||||
|
JSONArray taskListArray = new JSONArray();
|
||||||
|
JSONObject taskListJson = new JSONObject();
|
||||||
|
taskListJson.put("task_id", dataId + "_" + user.getMobile());
|
||||||
|
taskListJson.put("open_id", receiver_open_id);
|
||||||
|
taskListJson.put("title", "@i18n@title");
|
||||||
|
taskListJson.put("links", linksJson);
|
||||||
|
taskListJson.put("status", status);
|
||||||
|
taskListJson.put("create_time", currentTimeStamp);
|
||||||
|
|
||||||
|
taskListJson.put("end_time", 0);
|
||||||
|
taskListJson.put("update_time", String.valueOf(System.currentTimeMillis()));
|
||||||
|
taskListJson.put("display_method", Constants.browser);
|
||||||
|
taskListJson.put("exclude_statistics", Constants.excludeStatistics);
|
||||||
|
taskListArray.add(taskListJson);
|
||||||
|
bodyJson.put("task_list", taskListArray);
|
||||||
|
log.error("sendToFeiShuTodo-bodyJson:{}", bodyJson.toJSONString());
|
||||||
|
String sendResult = esb2FeishuSendTodoUtil.doPostSendMessage(bodyJson.toJSONString(), token);
|
||||||
|
if (StringUtils.isNotBlank(sendResult)) {
|
||||||
|
JSONObject returnData = JSONObject.parseObject(sendResult);
|
||||||
|
if (returnData.containsKey("code")) {
|
||||||
|
String code = returnData.getString("code");
|
||||||
|
if (!"0".equals(code)) {
|
||||||
|
log.error("todoOpenIdList:{}", "创建飞书待办异常" + user.getName() + dataId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,285 @@
|
||||||
|
package com.weaver.seconddev.chapanda.action;
|
||||||
|
|
||||||
|
import cn.hutool.json.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.weaver.common.base.entity.result.WeaResult;
|
||||||
|
import com.weaver.common.cache.base.BaseCache;
|
||||||
|
import com.weaver.common.hrm.util.HrmCommonUtil;
|
||||||
|
import com.weaver.eb.common.util.TimeUtils;
|
||||||
|
import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface;
|
||||||
|
import com.weaver.mc.api.async.AsyncSystemMessageRest;
|
||||||
|
import com.weaver.mc.api.entity.SendMessageEntity;
|
||||||
|
import com.weaver.seconddev.chapanda.constant.Constant;
|
||||||
|
import com.weaver.seconddev.chapanda.entity.dto.EmployeeAttendDTO;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.constant.Constants;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuBotCreateTodoUtil;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuOpenIdUtil;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuSendTodoUtil;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuTokenUtil;
|
||||||
|
import com.weaver.seconddev.chapanda.mapper.EmployeeAttendMapper;
|
||||||
|
import com.weaver.seconddev.chapanda.util.SystemMessageUtil;
|
||||||
|
import com.weaver.teams.domain.user.SimpleEmployee;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.YearMonth;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service("sendKqMindAction")
|
||||||
|
public class SendKqMindAction implements EsbServerlessRpcRemoteInterface {
|
||||||
|
@Autowired
|
||||||
|
EmployeeAttendMapper employeeAttendMapper;
|
||||||
|
@Autowired
|
||||||
|
private AsyncSystemMessageRest asyncSystemMessageRest;
|
||||||
|
@Autowired
|
||||||
|
Esb2FeishuOpenIdUtil esb2FeishuOpenIdUtil;
|
||||||
|
@Autowired
|
||||||
|
private Esb2FeishuTokenUtil esb2FeishuTokenUtil;
|
||||||
|
@Autowired
|
||||||
|
Esb2FeishuSendTodoUtil esb2FeishuSendTodoUtil;
|
||||||
|
@Autowired
|
||||||
|
Esb2FeishuBotCreateTodoUtil esb2FeishuBotTodoUtil;
|
||||||
|
@Autowired
|
||||||
|
private HrmCommonUtil hrmCommonUtil;
|
||||||
|
@Autowired
|
||||||
|
private BaseCache baseCache;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WeaResult<Map<String, Object>> execute(Map<String, Object> params) {
|
||||||
|
// 在动作流中配置的输入参数可从 params 中读取
|
||||||
|
log.error("params: {}", JSON.toJSONString(params));
|
||||||
|
String operatorMobile = (String) params.get("operatorMobile");
|
||||||
|
String month = (String) params.get("month");
|
||||||
|
String dataId = (String) params.get("dataId");
|
||||||
|
String dbName = (String) params.get("dbName");
|
||||||
|
String domain = (String) params.get("domain");
|
||||||
|
String text = (String) params.get("text");
|
||||||
|
String title = (String) params.get("title");
|
||||||
|
String content = (String) params.get("content");
|
||||||
|
// 获取该月的最后一天
|
||||||
|
Date lastDay = TimeUtils.getString2Date(YearMonth.parse(month).atEndOfMonth().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), "yyyy-MM-dd");
|
||||||
|
|
||||||
|
//勾选批量发送
|
||||||
|
if (StringUtils.isNotEmpty(dataId)) {
|
||||||
|
//批量发送可以传人员id,不用再去查一遍,直接查人员考勤规则对应的模板id
|
||||||
|
String userId = (String) params.get("userId");
|
||||||
|
SimpleEmployee user = hrmCommonUtil.getSimpleEmployee(Long.valueOf(userId));
|
||||||
|
log.error("SimpleEmployee:{}", JSON.toJSONString(user));
|
||||||
|
|
||||||
|
EmployeeAttendDTO employeeAttendDTO = employeeAttendMapper.getModeIdByUserId(Long.valueOf(userId), lastDay, dbName);
|
||||||
|
log.error("employeeAttendDTO:{}", JSON.toJSONString(employeeAttendDTO));
|
||||||
|
if (employeeAttendDTO == null) {
|
||||||
|
return WeaResult.fail("未查询到考勤确认单模板,请确认该人员是否参与考勤:" + user.getName());
|
||||||
|
}
|
||||||
|
String pcUrl = domain + "/sp/ebdfpage/card/0/1152452803526967297/" + dataId + "?layoutId=" + employeeAttendDTO.getConfirmModelId();
|
||||||
|
String mobileUrl = domain + "/mobile/ebdfpage/card/0/1152452803526967297/" + dataId + "?layoutId=" + employeeAttendDTO.getConfirmModelId();
|
||||||
|
|
||||||
|
//发送系统消息
|
||||||
|
WeaResult<Long> weaResult = sendMessage(text, title, content, pcUrl, mobileUrl, employeeAttendDTO, user);
|
||||||
|
log.error("weaResult:{}", JSON.toJSONString(weaResult));
|
||||||
|
//发送飞书消息
|
||||||
|
sendToFeiShuBotTodo(operatorMobile, dataId, text, title, content, pcUrl, mobileUrl, user);
|
||||||
|
sendToFeiShuTodo(operatorMobile, dataId, text, title, content, pcUrl, mobileUrl, user);
|
||||||
|
} else {
|
||||||
|
//全量发送
|
||||||
|
//查询考勤汇总所有考勤周期内的人员id
|
||||||
|
HashSet<Long> failUser = new HashSet<>();
|
||||||
|
List<EmployeeAttendDTO> employeeAttendDTOList = employeeAttendMapper.getAllUserByMonth(month, dbName);
|
||||||
|
log.error("employeeAttendDTOList:{}", JSON.toJSONString(employeeAttendDTOList));
|
||||||
|
for (EmployeeAttendDTO employeeAttendDTO : employeeAttendDTOList) {
|
||||||
|
log.error("employeeAttendDTO:{}", JSON.toJSONString(employeeAttendDTO));
|
||||||
|
Long employee = employeeAttendDTO.getEmployee();
|
||||||
|
SimpleEmployee user = hrmCommonUtil.getSimpleEmployee(employee);
|
||||||
|
EmployeeAttendDTO modeIdByUserId = employeeAttendMapper.getModeIdByUserId(employee, lastDay, dbName);
|
||||||
|
if (modeIdByUserId == null) {
|
||||||
|
failUser.add(employee);
|
||||||
|
} else {
|
||||||
|
String pcUrl = domain + "/sp/ebdfpage/card/0/1152452803526967297/" + employeeAttendDTO.getId() + "?layoutId=" + modeIdByUserId.getConfirmModelId();
|
||||||
|
String mobileUrl = domain + "/mobile/ebdfpage/card/0/1152452803526967297/" + employeeAttendDTO.getId() + "?layoutId=" + modeIdByUserId.getConfirmModelId();
|
||||||
|
//发系统消息
|
||||||
|
WeaResult<Long> weaResult = sendMessage(text, title, content, pcUrl, mobileUrl, modeIdByUserId, user);
|
||||||
|
sendToFeiShuBotTodo(operatorMobile, employeeAttendDTO.getId().toString(), text, title, content, pcUrl, mobileUrl, user);
|
||||||
|
sendToFeiShuTodo(operatorMobile, employeeAttendDTO.getId().toString(), text, title, content, pcUrl, mobileUrl, user);
|
||||||
|
log.error("weaResult:{}", JSON.toJSONString(weaResult));
|
||||||
|
if (weaResult != null & weaResult.getCode() == 200) {
|
||||||
|
employeeAttendMapper.updateStatueById(employeeAttendDTO.getId(), Constant.CONFIRM_ISSUED, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.error("failUser:{}", JSON.toJSONString(failUser));
|
||||||
|
}
|
||||||
|
return WeaResult.success(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendToFeiShuTodo(String operatorMobile, String dataId, String text, String title, String content, String pcUrl, String mobileUrl, SimpleEmployee receiver) {
|
||||||
|
String token = (String) baseCache.get(Constant.MODULE_KEY, Constant.FEI_SHU_TOKEN_KEY);
|
||||||
|
if (StringUtils.isEmpty(token)) {
|
||||||
|
token = esb2FeishuTokenUtil.getToken();
|
||||||
|
baseCache.set(Constant.MODULE_KEY, Constant.FEI_SHU_TOKEN_KEY, token, 6000);
|
||||||
|
}
|
||||||
|
Map<String, Object> userMap = esb2FeishuOpenIdUtil.queryFeishuOpenIdByMobiles(operatorMobile);
|
||||||
|
String operator_open_id = String.valueOf(userMap.get(operatorMobile));
|
||||||
|
long currentTimeStamp = System.currentTimeMillis();
|
||||||
|
//接收人openid
|
||||||
|
Map<String, Object> receiverMap = esb2FeishuOpenIdUtil.queryFeishuOpenIdByMobiles(receiver.getMobile());
|
||||||
|
String receiver_open_id = String.valueOf(receiverMap.get(receiver.getMobile()));
|
||||||
|
|
||||||
|
String status = "PENDING";
|
||||||
|
JSONObject bodyJson = new JSONObject();
|
||||||
|
bodyJson.put("approval_code", Constants.approvalCode);
|
||||||
|
bodyJson.put("status", status);
|
||||||
|
bodyJson.put("instance_id", dataId);
|
||||||
|
JSONObject linksJson = new JSONObject();
|
||||||
|
linksJson.put("pc_link", pcUrl);
|
||||||
|
linksJson.put("mobile_link", mobileUrl);
|
||||||
|
bodyJson.put("links", linksJson);
|
||||||
|
bodyJson.put("title", "@i18n@title");
|
||||||
|
bodyJson.put("open_id", operator_open_id);
|
||||||
|
bodyJson.put("start_time", currentTimeStamp);
|
||||||
|
bodyJson.put("end_time", 0);
|
||||||
|
bodyJson.put("update_time", currentTimeStamp);
|
||||||
|
bodyJson.put("display_method", Constants.browser);
|
||||||
|
bodyJson.put("update_mode", Constants.updateMode);
|
||||||
|
|
||||||
|
JSONArray i18nResourcesTextsArray = new JSONArray();
|
||||||
|
JSONObject i18nResourcesTextsJson = new JSONObject();
|
||||||
|
i18nResourcesTextsJson.put("key", "@i18n@title");
|
||||||
|
i18nResourcesTextsJson.put("value", title);
|
||||||
|
i18nResourcesTextsArray.add(i18nResourcesTextsJson);
|
||||||
|
|
||||||
|
JSONArray formArray = new JSONArray();
|
||||||
|
JSONObject formJson1 = new JSONObject();
|
||||||
|
String key_key = "@i18n@k" + 0;
|
||||||
|
String val_key = "@i18n@v" + 0;
|
||||||
|
|
||||||
|
formJson1.put("name", key_key);
|
||||||
|
formJson1.put("value", val_key);
|
||||||
|
|
||||||
|
formArray.add(formJson1);
|
||||||
|
bodyJson.put("form", formArray);
|
||||||
|
|
||||||
|
JSONObject keyI18 = new JSONObject();
|
||||||
|
keyI18.put("key", key_key);
|
||||||
|
keyI18.put("value", text);
|
||||||
|
i18nResourcesTextsArray.add(keyI18);
|
||||||
|
JSONObject vauleI18 = new JSONObject();
|
||||||
|
vauleI18.put("key", val_key);
|
||||||
|
vauleI18.put("value", content);
|
||||||
|
i18nResourcesTextsArray.add(vauleI18);
|
||||||
|
|
||||||
|
JSONObject i18nResourcesJson = new JSONObject();
|
||||||
|
i18nResourcesJson.put("locale", "zh-CN");
|
||||||
|
i18nResourcesJson.put("texts", i18nResourcesTextsArray);
|
||||||
|
i18nResourcesJson.put("is_default", "true");
|
||||||
|
JSONArray i18nResourcesArray = new JSONArray();
|
||||||
|
i18nResourcesArray.add(i18nResourcesJson);
|
||||||
|
bodyJson.put("i18n_resources", i18nResourcesArray);
|
||||||
|
|
||||||
|
JSONArray taskListArray = new JSONArray();
|
||||||
|
JSONObject taskListJson = new JSONObject();
|
||||||
|
taskListJson.put("task_id", dataId + "_" + receiver.getId());
|
||||||
|
taskListJson.put("open_id", receiver_open_id);
|
||||||
|
taskListJson.put("title", "@i18n@title");
|
||||||
|
taskListJson.put("links", linksJson);
|
||||||
|
taskListJson.put("status", status);
|
||||||
|
taskListJson.put("create_time", currentTimeStamp);
|
||||||
|
|
||||||
|
taskListJson.put("end_time", 0);
|
||||||
|
taskListJson.put("update_time", String.valueOf(System.currentTimeMillis()));
|
||||||
|
taskListJson.put("display_method", Constants.browser);
|
||||||
|
taskListJson.put("exclude_statistics", Constants.excludeStatistics);
|
||||||
|
taskListArray.add(taskListJson);
|
||||||
|
bodyJson.put("task_list", taskListArray);
|
||||||
|
log.error("sendToFeiShuTodo-bodyJson:{}", bodyJson.toJSONString());
|
||||||
|
String sendResult = esb2FeishuSendTodoUtil.doPostSendMessage(bodyJson.toJSONString(), token);
|
||||||
|
if (StringUtils.isNotBlank(sendResult)) {
|
||||||
|
JSONObject returnData = JSONObject.parseObject(sendResult);
|
||||||
|
if (returnData.containsKey("code")) {
|
||||||
|
String code = returnData.getString("code");
|
||||||
|
if (!"0".equals(code)) {
|
||||||
|
log.error("todoOpenIdList:{}", "创建飞书待办异常" + receiver.getName() + dataId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendToFeiShuBotTodo(String operatorMobile, String dataId, String text, String title, String content, String pcUrl, String mobileUrl, SimpleEmployee receiver) {
|
||||||
|
Map<String, Object> userMap = esb2FeishuOpenIdUtil.queryFeishuOpenIdByMobiles(operatorMobile);
|
||||||
|
String operator_open_id = String.valueOf(userMap.get(operatorMobile));
|
||||||
|
|
||||||
|
String token = (String) baseCache.get(Constant.MODULE_KEY, Constant.FEI_SHU_TOKEN_KEY);
|
||||||
|
if (StringUtils.isEmpty(token)) {
|
||||||
|
token = esb2FeishuTokenUtil.getToken();
|
||||||
|
baseCache.set(Constant.MODULE_KEY, Constant.FEI_SHU_TOKEN_KEY, token, 6000);
|
||||||
|
}
|
||||||
|
long currentTimeStamp = System.currentTimeMillis();
|
||||||
|
//接收人openid
|
||||||
|
Map<String, Object> receiverMap = esb2FeishuOpenIdUtil.queryFeishuOpenIdByMobiles(receiver.getMobile());
|
||||||
|
String receiver_open_id = String.valueOf(receiverMap.get(receiver.getMobile()));
|
||||||
|
|
||||||
|
|
||||||
|
JSONObject bodyJson = new JSONObject();
|
||||||
|
bodyJson.put("template_id", Constants.botTemplateId);
|
||||||
|
bodyJson.put("open_id", receiver_open_id);
|
||||||
|
bodyJson.put("approval_name", "@i18n@title");
|
||||||
|
|
||||||
|
JSONArray summariesArray = new JSONArray();
|
||||||
|
JSONObject summariesObject = new JSONObject();
|
||||||
|
summariesObject.put("summary", "@i18n@summary");
|
||||||
|
summariesArray.add(summariesObject);
|
||||||
|
|
||||||
|
JSONObject contentJson = new JSONObject();
|
||||||
|
contentJson.put("summaries", summariesArray);
|
||||||
|
bodyJson.put("content", contentJson);
|
||||||
|
|
||||||
|
JSONArray actionsArray = new JSONArray();
|
||||||
|
JSONObject actionsObject = new JSONObject();
|
||||||
|
actionsObject.put("action_name", "DETAIL");
|
||||||
|
actionsObject.put("url", mobileUrl);
|
||||||
|
actionsObject.put("android_url", mobileUrl);
|
||||||
|
actionsObject.put("ios_url", mobileUrl);
|
||||||
|
actionsObject.put("pc_url", pcUrl);
|
||||||
|
actionsArray.add(actionsObject);
|
||||||
|
bodyJson.put("actions", actionsArray);
|
||||||
|
|
||||||
|
JSONObject i18nResourcesTextsJson = new JSONObject();
|
||||||
|
i18nResourcesTextsJson.put("@i18n@title",title);
|
||||||
|
i18nResourcesTextsJson.put("@i18n@summary",text);
|
||||||
|
JSONObject i18nResourcesJson = new JSONObject();
|
||||||
|
i18nResourcesJson.put("locale","zh-CN");
|
||||||
|
i18nResourcesJson.put("texts",i18nResourcesTextsJson);
|
||||||
|
i18nResourcesJson.put("is_default",true);
|
||||||
|
JSONArray i18nResourcesArray = new JSONArray();
|
||||||
|
i18nResourcesArray.add(i18nResourcesJson);
|
||||||
|
bodyJson.put("i18n_resources",i18nResourcesArray);
|
||||||
|
|
||||||
|
log.error("sendToFeiShuTodo-bodyJson:{}", bodyJson.toJSONString());
|
||||||
|
String sendResult = esb2FeishuBotTodoUtil.doSendPost(bodyJson.toJSONString(), token);
|
||||||
|
if (StringUtils.isNotBlank(sendResult)) {
|
||||||
|
JSONObject returnData = JSONObject.parseObject(sendResult);
|
||||||
|
if (returnData.containsKey("code")) {
|
||||||
|
String code = returnData.getString("code");
|
||||||
|
if (!"0".equals(code)) {
|
||||||
|
log.error("todoOpenIdList:{}", "创建飞书bot待办异常" + receiver.getName() + dataId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private WeaResult<Long> sendMessage(String text, String title, String content, String pcUrl, String mobileUrl, EmployeeAttendDTO modeIdByUserId, SimpleEmployee user) {
|
||||||
|
//发送系统消息
|
||||||
|
SendMessageEntity smg = SystemMessageUtil.buildSmgEntity(text, title, content, user, pcUrl, mobileUrl);
|
||||||
|
log.error("SendMessageEntity:{}", JSON.toJSONString(smg));
|
||||||
|
WeaResult<Long> weaResult = asyncSystemMessageRest.sendMsg(smg);
|
||||||
|
return weaResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,124 @@
|
||||||
|
package com.weaver.seconddev.chapanda.action;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.weaver.common.base.entity.result.WeaResult;
|
||||||
|
import com.weaver.common.hrm.util.HrmCommonUtil;
|
||||||
|
import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface;
|
||||||
|
import com.weaver.seconddev.chapanda.entity.po.UnOperator;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuBotCreateTodoUtil;
|
||||||
|
import com.weaver.seconddev.chapanda.feishu.util.Esb2FeishuOpenIdUtil;
|
||||||
|
import com.weaver.seconddev.portal.constant.ApplicationConfigConstant;
|
||||||
|
import com.weaver.seconddev.portal.util.PapiUtil;
|
||||||
|
import com.weaver.teams.client.utils.HttpUtils;
|
||||||
|
import com.weaver.teams.domain.user.SimpleEmployee;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service("urgingAction")
|
||||||
|
public class UrgingAction implements EsbServerlessRpcRemoteInterface {
|
||||||
|
@Autowired
|
||||||
|
Esb2FeishuOpenIdUtil esb2FeishuOpenIdUtil;
|
||||||
|
@Autowired
|
||||||
|
Esb2FeishuBotCreateTodoUtil esb2FeishuBotCreateTodoUtil;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private HrmCommonUtil hrmCommonUtil;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WeaResult<Map<String, Object>> execute(Map<String, Object> params) {
|
||||||
|
// 在动作流中配置的输入参数可从 params 中读取
|
||||||
|
log.error("urgingAction-params: {}", JSON.toJSONString(params));
|
||||||
|
String datas = (String) params.get("datas");
|
||||||
|
String operator = (String) params.get("operator");
|
||||||
|
if (StringUtils.isNotEmpty(datas)) {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
try {
|
||||||
|
//催办基本请求参数
|
||||||
|
HashMap<String, Object> requestMap = getWeaverBaseMap(operator);
|
||||||
|
String urgingUrl = ApplicationConfigConstant.APP_URL + "/papi/openapi/api/workflow/core/paService/v1/requestSupervise";
|
||||||
|
String unOperateUrl = ApplicationConfigConstant.APP_URL + "/papi/openapi/api/workflow/core/paService/v1/getNodeOperator";
|
||||||
|
List<Map<String, String>> dataList = mapper.readValue(datas, List.class);
|
||||||
|
for (Map<String, String> item : dataList) {
|
||||||
|
try {
|
||||||
|
String requestName = item.get("requestname");
|
||||||
|
String requestId = item.get("requestid");
|
||||||
|
String creatorId = item.get("userid");
|
||||||
|
//发送bot消息给流程当前节点未操作人
|
||||||
|
sendUnOperatedToBotMsg(unOperateUrl, requestId, requestName, creatorId, operator, mapper);
|
||||||
|
//发送系统催办
|
||||||
|
requestMap.put("requestId", requestId);
|
||||||
|
String weaverR = HttpUtils.httpJsonPost(urgingUrl, JSON.toJSONString(requestMap));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("urgingE:{}", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (JsonProcessingException e) {
|
||||||
|
log.error("JsonProcessingException:{}", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return WeaResult.success(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendUnOperatedToBotMsg(String unOperateUrl, String requestId, String requestName, String creatorId, String operator, ObjectMapper mapper) throws JsonProcessingException {
|
||||||
|
//流程创建人飞书openid
|
||||||
|
SimpleEmployee creatorEmployee = hrmCommonUtil.getSimpleEmployee(Long.valueOf(creatorId));
|
||||||
|
Map<String, Object> creatorMap = esb2FeishuOpenIdUtil.queryFeishuOpenIdByMobiles(creatorEmployee.getMobile());
|
||||||
|
String create_open_id = String.valueOf(creatorMap.get(creatorEmployee.getMobile()));
|
||||||
|
|
||||||
|
String papiCode = PapiUtil.getPapiCode(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.CORP_ID, "A1a");
|
||||||
|
String papiToken = PapiUtil.getPapiToken(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.ORGANIZATION_APP_KEY, ApplicationConfigConstant.ORGANIZATION_APP_SECRET, papiCode);
|
||||||
|
//流程当前节点未操作人查询
|
||||||
|
HashMap<String, Object> requestMap = new HashMap<>();
|
||||||
|
requestMap.put("access_token", papiToken);
|
||||||
|
requestMap.put("userid", operator);
|
||||||
|
requestMap.put("requestId", requestId);
|
||||||
|
requestMap.put("onlyOperator", true);
|
||||||
|
String jsonStr = HttpUtils.httpJsonPost(unOperateUrl, JSONObject.toJSONString(requestMap));
|
||||||
|
UnOperator response = mapper.readValue(jsonStr, UnOperator.class);
|
||||||
|
response.getData().forEach((nodeId, nodeData) -> {
|
||||||
|
List<UnOperator.OperatorUser> operatorUsers = nodeData.getOperatorUsers();
|
||||||
|
if (operatorUsers != null) {
|
||||||
|
operatorUsers.forEach(user -> {
|
||||||
|
//流程未操作人飞书openid
|
||||||
|
SimpleEmployee unOperator = hrmCommonUtil.getSimpleEmployee(Long.valueOf(user.getUserId()));
|
||||||
|
Map<String, Object> unMap = esb2FeishuOpenIdUtil.queryFeishuOpenIdByMobiles(unOperator.getMobile());
|
||||||
|
String unOperator_open_id = String.valueOf(unMap.get(unOperator.getMobile()));
|
||||||
|
String mobileurl = "/mobile/workflow/flowpage/view/" + requestId;
|
||||||
|
String pcurl = "/sp/workflow/flowpage/view/" + requestId;
|
||||||
|
//发送bot消息
|
||||||
|
esb2FeishuBotCreateTodoUtil.senBotTodoMessage(
|
||||||
|
requestId, requestName, "",
|
||||||
|
create_open_id, unOperator_open_id, unOperator_open_id,
|
||||||
|
mobileurl, pcurl);
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HashMap<String, Object> getWeaverBaseMap(String operator) {
|
||||||
|
String papiCode = PapiUtil.getPapiCode(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.CORP_ID, "A1a");
|
||||||
|
String papiToken = PapiUtil.getPapiToken(ApplicationConfigConstant.APP_URL, ApplicationConfigConstant.ORGANIZATION_APP_KEY, ApplicationConfigConstant.ORGANIZATION_APP_SECRET, papiCode);
|
||||||
|
|
||||||
|
HashMap<String, Object> requestMap = new HashMap<>();
|
||||||
|
HashMap<String, Object> otherParam = new HashMap<>();
|
||||||
|
otherParam.put("currentOperator", 1);
|
||||||
|
otherParam.put("doneOperator", 0);
|
||||||
|
requestMap.put("otherParam", otherParam);
|
||||||
|
|
||||||
|
requestMap.put("access_token", papiToken);
|
||||||
|
requestMap.put("userId", operator);
|
||||||
|
return requestMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,11 +14,18 @@ public class Constant {
|
||||||
* 模块标识
|
* 模块标识
|
||||||
*/
|
*/
|
||||||
public static final String MODULE = "secondev";
|
public static final String MODULE = "secondev";
|
||||||
|
public static final String MODULE_KEY = "SECOND_DEV_KEY";
|
||||||
|
public static final String FEI_SHU_TOKEN_KEY = "feishu_token_key";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*租户
|
*租户
|
||||||
*/
|
*/
|
||||||
public static final String TENANT_KEY = "tma3ktp1q7";
|
public static final String TENANT_KEY = "tma3ktp1q7";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static final int CONFIRM_ISSUED = 1;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.weaver.seconddev.chapanda.entity.dto;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class AttendStatusDetailDTO {
|
||||||
|
private Long id;
|
||||||
|
private Date attendDate;
|
||||||
|
private Long employee;
|
||||||
|
private Long attendConfig;
|
||||||
|
private Integer deleteType;
|
||||||
|
private String tenantKey;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getAttendDate() {
|
||||||
|
return attendDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAttendDate(Date attendDate) {
|
||||||
|
this.attendDate = attendDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getEmployee() {
|
||||||
|
return employee;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmployee(Long employee) {
|
||||||
|
this.employee = employee;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getAttendConfig() {
|
||||||
|
return attendConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAttendConfig(Long attendConfig) {
|
||||||
|
this.attendConfig = attendConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getDeleteType() {
|
||||||
|
return deleteType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeleteType(Integer deleteType) {
|
||||||
|
this.deleteType = deleteType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTenantKey() {
|
||||||
|
return tenantKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTenantKey(String tenantKey) {
|
||||||
|
this.tenantKey = tenantKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "AttendStatusDetail{" + "id=" + id + ", attendDate=" + attendDate + ", employee='" + employee + '\''
|
||||||
|
+ ", attendConfig='" + attendConfig + '\'' + ", deleteType=" + deleteType + ", tenantKey='" + tenantKey
|
||||||
|
+ '\'' + '}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
package com.weaver.seconddev.chapanda.entity.dto;
|
|
||||||
|
|
||||||
import com.weaver.common.component.search.item.WeaSearchConditionItemType;
|
|
||||||
import com.weaver.seconddev.chapanda.annotation.SearchCondition;
|
|
||||||
import com.weaver.seconddev.chapanda.annotation.SearchConditionItem;
|
|
||||||
import com.weaver.seconddev.chapanda.constant.Constant;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class DemoSearchConditionDTO {
|
|
||||||
|
|
||||||
@SearchCondition(
|
|
||||||
label = "创建人",
|
|
||||||
labelId = 0,
|
|
||||||
needQuickSearch = true,
|
|
||||||
quickSearchKey = "username",
|
|
||||||
items = {
|
|
||||||
@SearchConditionItem(itemType = WeaSearchConditionItemType.INPUT, name = "username"),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
private String username;
|
|
||||||
|
|
||||||
@SearchCondition(
|
|
||||||
label = "部门",
|
|
||||||
labelId = 0,
|
|
||||||
needQuickSearch = true,
|
|
||||||
items = {
|
|
||||||
@SearchConditionItem(itemType = WeaSearchConditionItemType.BROWSER,
|
|
||||||
browserType = "department", browserMultiple = true, name = "department"),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
private String department;
|
|
||||||
|
|
||||||
@SearchCondition(
|
|
||||||
label = "工单类型",
|
|
||||||
labelId = 0,
|
|
||||||
items = @SearchConditionItem(itemType = WeaSearchConditionItemType.BROWSER,
|
|
||||||
browserType = "orderTypeBrowser", name = "orderType", browserModule = Constant.MODULE)
|
|
||||||
)
|
|
||||||
private String orderType;
|
|
||||||
|
|
||||||
|
|
||||||
@SearchCondition(
|
|
||||||
label = "创建日期",
|
|
||||||
labelId = 0,
|
|
||||||
items = {
|
|
||||||
@SearchConditionItem(itemType = WeaSearchConditionItemType.DATEPICKER, name = "createTime"),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
private String createTime;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.weaver.seconddev.chapanda.entity.dto;
|
||||||
|
|
||||||
|
public class EmployeeAttendDTO {
|
||||||
|
private Long id;
|
||||||
|
private Long employee;
|
||||||
|
private Long confirmModelId;
|
||||||
|
|
||||||
|
// Getters and Setters
|
||||||
|
public Long getEmployee() {
|
||||||
|
return employee;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmployee(Long employee) {
|
||||||
|
this.employee = employee;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getConfirmModelId() {
|
||||||
|
return confirmModelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfirmModelId(Long confirmModelId) {
|
||||||
|
this.confirmModelId = confirmModelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.weaver.seconddev.chapanda.entity.po;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class UnOperator {
|
||||||
|
private Message message;
|
||||||
|
private Map<String, NodeData> data; // Key 是 nodeId,Value 是节点数据
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class Message {
|
||||||
|
private String errcode;
|
||||||
|
private String errmsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class NodeData {
|
||||||
|
private String nodeId;
|
||||||
|
private String nodeName;
|
||||||
|
private List<OperatorUser> operatorUsers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class OperatorUser {
|
||||||
|
private String userId;
|
||||||
|
private String userName;
|
||||||
|
private String mainUserId;
|
||||||
|
private String departMentId;
|
||||||
|
private int isRemark;
|
||||||
|
private String status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.weaver.seconddev.chapanda.mapper;
|
||||||
|
|
||||||
|
import com.weaver.seconddev.chapanda.entity.dto.AttendStatusDetailDTO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface AttendStatusDetailMapper {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param tenantKey
|
||||||
|
* @param attendDate
|
||||||
|
* @param deleteType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<AttendStatusDetailDTO> selectByCondition(@Param("tenantKey") String tenantKey,
|
||||||
|
@Param("attendDate") Date attendDate, @Param("deleteType") Integer deleteType,@Param("dbName") String dbName);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.weaver.seconddev.chapanda.mapper;
|
||||||
|
|
||||||
|
import com.weaver.seconddev.chapanda.entity.dto.EmployeeAttendDTO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface EmployeeAttendMapper {
|
||||||
|
EmployeeAttendDTO getModeIdByUserId(
|
||||||
|
@Param("employeeId") Long employeeId,
|
||||||
|
@Param("yearMonth") Date yearMonth,
|
||||||
|
@Param("dbName") String dbName
|
||||||
|
);
|
||||||
|
|
||||||
|
List<EmployeeAttendDTO> getAllUserByMonth(@Param("month") String month, @Param("dbName") String dbName);
|
||||||
|
|
||||||
|
void updateStatueById(@Param("id") Long id,@Param("statue") int statue, @Param("dbName")String dbName);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,276 @@
|
||||||
|
package com.weaver.seconddev.chapanda.trigger;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.weaver.common.distribution.genid.IdGenerator;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.data.EBDataReqOperation;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.data.EBDataReqOperationInfo;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.data.EBDataUpdateType;
|
||||||
|
import com.weaver.seconddev.chapanda.entity.dto.AttendStatusDetailDTO;
|
||||||
|
import com.weaver.seconddev.chapanda.mapper.AttendStatusDetailMapper;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.apache.logging.log4j.util.Base64Util;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.weaver.common.cache.tablecache.impl.ComInfoCache;
|
||||||
|
import com.weaver.common.escheduler.context.ESchedulerJobHelper;
|
||||||
|
import com.weaver.common.escheduler.handler.annotation.ESchedulerHandler;
|
||||||
|
import com.weaver.common.hrm.cache.HrmEmployeeComInfo;
|
||||||
|
import com.weaver.eb.common.util.TimeUtils;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.data.EBDataChangeReqDto;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.data.EBDataChangeResult;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.data.EBDataReqDetailDto;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.data.EBDataReqDto;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.data.EBDataReqHeader;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.field.FieldsQueryDto;
|
||||||
|
import com.weaver.ebuilder.form.client.entity.field.ModuleField;
|
||||||
|
import com.weaver.ebuilder.form.client.service.data.RemoteSimpleDataService;
|
||||||
|
import com.weaver.ebuilder.form.client.service.emobile.IEtFormDatasetService;
|
||||||
|
import com.weaver.ebuilder.teams.etform.base.query.ConditionTreeDto;
|
||||||
|
import com.weaver.ebuilder.teams.etform.base.query.Query;
|
||||||
|
import com.weaver.ebuilder.teams.etform.org.bean.EBSimpleEmployee;
|
||||||
|
import com.weaver.framework.util.JsonUtil;
|
||||||
|
import com.weaver.publishkit.api.util.PublishKitRuntimeUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监控考勤规则变动,存在变动的写入eb台账表
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class AttendConfChangeEscheduler {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(AttendConfChangeEscheduler.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AttendStatusDetailMapper attendStatusDetailMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ComInfoCache comInfoCache;
|
||||||
|
@Autowired
|
||||||
|
private PublishKitRuntimeUtil publishKitRuntimeUtil;
|
||||||
|
|
||||||
|
@Value("#{'${attend.opensyncEbTable.tenantKey:tk9x0xdor1}'.split(',')}")
|
||||||
|
private List<String> tenantKeyList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* value: 考勤规则同步eb表单 cron: cron表达式自定义执行时间
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@ESchedulerHandler(value = "AttendConfChangeEscheduler", cron = "0/10 * * * * ?")
|
||||||
|
public void demoJobHandler() throws Exception {
|
||||||
|
log.error("AttendConfChangeEscheduler runnint");
|
||||||
|
try {
|
||||||
|
|
||||||
|
// 获取页面上配置的任务参数
|
||||||
|
final String jobParam = ESchedulerJobHelper.getJobParam();
|
||||||
|
// eb表单id,eb表单姓名字段fieldId,eb表单是否生效中字段fieldId,操作人id
|
||||||
|
String[] jobParamSplit = jobParam.split(",");
|
||||||
|
Date preDayDate =
|
||||||
|
TimeUtils.getString2Date(TimeUtils.dateAdd(TimeUtils.getCurrentTimeString(), -1), "yyyy-MM-dd");
|
||||||
|
|
||||||
|
IEtFormDatasetService iEtFormDatasetService =
|
||||||
|
publishKitRuntimeUtil.buildRpcService(IEtFormDatasetService.class, "ebuilderform", "defaultAppId");
|
||||||
|
RemoteSimpleDataService remoteSimpleDataService =
|
||||||
|
publishKitRuntimeUtil.buildRpcService(RemoteSimpleDataService.class, "ebuilderform", "defaultAppId");
|
||||||
|
// 开启此功能的租户
|
||||||
|
for (String tenantKey : tenantKeyList) {
|
||||||
|
// 不同租户eb表字段对应的id
|
||||||
|
Map<String, String> fieldMap = extracted(jobParamSplit, iEtFormDatasetService, tenantKey, jobParamSplit[1]);
|
||||||
|
log.error("AttendConfChangeEscheduler-fieldMap:{}", JSON.toJSONString(fieldMap));
|
||||||
|
|
||||||
|
// 查询昨天人员对应的考勤规则与eb台账最新的生效考勤规则对比
|
||||||
|
try {
|
||||||
|
EBDataChangeReqDto ebReqDto = new EBDataChangeReqDto();
|
||||||
|
ebReqDto.setHeader(new EBDataReqHeader(jobParamSplit[0], jobParamSplit[1], tenantKey));
|
||||||
|
|
||||||
|
List<AttendStatusDetailDTO> statusDetailDtos =
|
||||||
|
attendStatusDetailMapper.selectByCondition(tenantKey, preDayDate, 0, null);
|
||||||
|
for (AttendStatusDetailDTO statusDetailDto : statusDetailDtos) {
|
||||||
|
List<Map<String, Object>> oldAttendRuleEbList = queryResult(iEtFormDatasetService,
|
||||||
|
statusDetailDto.getEmployee(), tenantKey, jobParamSplit, fieldMap, true);
|
||||||
|
ArrayList<EBDataReqDto> insertDataReqDtos = new ArrayList<>();
|
||||||
|
EBDataReqDto InsertEbDataReqDto = new EBDataReqDto();
|
||||||
|
List<EBDataReqDetailDto> mainData1 = new ArrayList<>();
|
||||||
|
mainData1.add(new EBDataReqDetailDto(fieldMap.get("xm"),
|
||||||
|
String.valueOf(statusDetailDto.getEmployee())));
|
||||||
|
HrmEmployeeComInfo hrmEmployeeInfo =
|
||||||
|
comInfoCache.getCacheById(HrmEmployeeComInfo.class, statusDetailDto.getEmployee());
|
||||||
|
mainData1.add(new EBDataReqDetailDto(fieldMap.get("fb"),
|
||||||
|
String.valueOf(hrmEmployeeInfo.getSubcompanyId())));
|
||||||
|
mainData1.add(new EBDataReqDetailDto(fieldMap.get("bm"),
|
||||||
|
String.valueOf(hrmEmployeeInfo.getDepartment())));
|
||||||
|
mainData1.add(new EBDataReqDetailDto(fieldMap.get("bdrq"),
|
||||||
|
DateUtil.format(preDayDate, "yyyy-MM-dd")));
|
||||||
|
mainData1.add(new EBDataReqDetailDto(fieldMap.get("sxkqgz"),
|
||||||
|
String.valueOf(statusDetailDto.getAttendConfig())));
|
||||||
|
mainData1.add(new EBDataReqDetailDto(fieldMap.get("sfsxz"), "0"));
|
||||||
|
//有历史数据
|
||||||
|
if (CollectionUtils.isEmpty(oldAttendRuleEbList)) {
|
||||||
|
// mainData1.add(new EBDataReqDetailDto(fieldMap.get("shxkqgz"), String.valueOf(statusDetailDto.getAttendConfig())));
|
||||||
|
InsertEbDataReqDto.setMainDatas(mainData1);
|
||||||
|
log.error("empty-insertResult:{}", JSON.toJSONString(mainData1));
|
||||||
|
insertDataReqDtos.add(InsertEbDataReqDto);
|
||||||
|
ebReqDto.setDatas(insertDataReqDtos);
|
||||||
|
remoteSimpleDataService.saveFormData(ebReqDto);
|
||||||
|
} else {
|
||||||
|
Map<String, Object> oldAttendRuleEb = oldAttendRuleEbList.get(0);
|
||||||
|
// 生效考勤规则变动,失效之前的考勤规则,并新增一条记录
|
||||||
|
ArrayList<Map<String, Object>> sxkqgz =
|
||||||
|
(ArrayList<Map<String, Object>>) oldAttendRuleEb.get(fieldMap.get("sxkqgz"));
|
||||||
|
Map<String, Object> sxkqgzMap = sxkqgz.get(0);
|
||||||
|
if (!String.valueOf(statusDetailDto.getAttendConfig()).equals(sxkqgzMap.get("id"))) {
|
||||||
|
mainData1.add(new EBDataReqDetailDto(fieldMap.get("shxkqgz"), (String) sxkqgzMap.get("id")));
|
||||||
|
InsertEbDataReqDto.setMainDatas(mainData1);
|
||||||
|
insertDataReqDtos.add(InsertEbDataReqDto);
|
||||||
|
// 失效老数据
|
||||||
|
updateExtracted(remoteSimpleDataService, fieldMap, ebReqDto, oldAttendRuleEb);
|
||||||
|
ebReqDto.setDatas(insertDataReqDtos);
|
||||||
|
EBDataChangeResult insertResult = remoteSimpleDataService.saveFormData(ebReqDto);
|
||||||
|
log.error("insertResult:{}", JSON.toJSONString(insertResult));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("AttendConfChangeEscheduler,tenantKey" + tenantKey, e);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("AttendConfChangeEscheduler runnint error", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void updateExtracted(RemoteSimpleDataService remoteSimpleDataService, Map<String, String> fieldMap,
|
||||||
|
EBDataChangeReqDto ebReqDto, Map<String, Object> oldAttendRuleEb) {
|
||||||
|
try {
|
||||||
|
// 请求操作信息
|
||||||
|
EBDataReqOperation ebDataReqOperation = new EBDataReqOperation();
|
||||||
|
ebDataReqOperation.setUpdateType(EBDataUpdateType.conditions);
|
||||||
|
// 若数据写入后就要从前台看到数据或者立即操作本次写入的数据, 需要调整后置处理为同步 权限处理完成再返回
|
||||||
|
ebDataReqOperation.setAsyncPostProcess(false);// 更新条件构造
|
||||||
|
// 操作明细
|
||||||
|
EBDataReqOperationInfo ebDataReqOperationInfo = new EBDataReqOperationInfo();
|
||||||
|
// 数据没有找到的时候是否新增数据
|
||||||
|
ebDataReqOperationInfo.setNeedAdd(false);
|
||||||
|
ConditionTreeDto conditionTreeDto = new ConditionTreeDto();
|
||||||
|
conditionTreeDto.setIsParent(false);
|
||||||
|
conditionTreeDto.setConditionId("id");
|
||||||
|
conditionTreeDto.setCompareType("eq");
|
||||||
|
conditionTreeDto.setConditionValue((String) oldAttendRuleEb.get("id"));
|
||||||
|
ebDataReqOperationInfo.setConditionTreeDto(conditionTreeDto);
|
||||||
|
ebDataReqOperation.setMainData(ebDataReqOperationInfo);
|
||||||
|
ebReqDto.setOperation(ebDataReqOperation);
|
||||||
|
// 数据
|
||||||
|
EBDataReqDto ebDataReqDto = new EBDataReqDto();
|
||||||
|
List<EBDataReqDetailDto> mainData = new ArrayList<>();
|
||||||
|
mainData.add(new EBDataReqDetailDto(fieldMap.get("sfsxz"), "1"));
|
||||||
|
ebDataReqDto.setMainDatas(mainData);
|
||||||
|
ebReqDto.setDatas(Collections.singletonList(ebDataReqDto));
|
||||||
|
EBDataChangeResult ebDataChangeResult = remoteSimpleDataService.updateFormData(ebReqDto);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("updateExtracted-" + oldAttendRuleEb.get("id"), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, String> extracted(String[] jobParamSplit, IEtFormDatasetService iEtFormDatasetService,
|
||||||
|
String tenantKey, String userId) {
|
||||||
|
Map<String, String> fieldMap = new HashMap<>();
|
||||||
|
EBSimpleEmployee ebSimpleEmployee = new EBSimpleEmployee();
|
||||||
|
ebSimpleEmployee.setEmployeeId(userId);
|
||||||
|
ebSimpleEmployee.setTenantKey(tenantKey);
|
||||||
|
FieldsQueryDto fieldsQueryDto = new FieldsQueryDto();
|
||||||
|
fieldsQueryDto.setEbSimpleEmployee(ebSimpleEmployee);
|
||||||
|
fieldsQueryDto.setObjId(Long.valueOf(jobParamSplit[0]));
|
||||||
|
List<ModuleField> fields = iEtFormDatasetService.getFields(fieldsQueryDto);
|
||||||
|
log.error("ModuleField:{}", JSON.toJSONString(fields));
|
||||||
|
fields.stream().forEach(item -> {
|
||||||
|
fieldMap.put(item.getDataKey(), item.getFieldId());
|
||||||
|
});
|
||||||
|
return fieldMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Map<String, Object>> queryResult(IEtFormDatasetService iEtFormDatasetService, Long userId,
|
||||||
|
String tenantKey, String[] paramSplit, Map<String, String> fieldMap, boolean schedulerSource) {
|
||||||
|
List<Map<String, Object>> records = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
Query query = new Query();
|
||||||
|
EBSimpleEmployee ebSimpleEmployee = new EBSimpleEmployee();
|
||||||
|
ebSimpleEmployee.setEmployeeId("-1");
|
||||||
|
ebSimpleEmployee.setTenantKey(tenantKey);
|
||||||
|
query.setEbSimpleEmployee(ebSimpleEmployee);
|
||||||
|
|
||||||
|
// 搜索条件树
|
||||||
|
|
||||||
|
ConditionTreeDto rootNode = new ConditionTreeDto();
|
||||||
|
rootNode.setKey(String.valueOf(IdGenerator.generate()));
|
||||||
|
rootNode.setRelationship("1");
|
||||||
|
rootNode.setIsParent(true);
|
||||||
|
rootNode.setConditionList(Lists.newArrayList());
|
||||||
|
|
||||||
|
ConditionTreeDto leaf1Node = new ConditionTreeDto();
|
||||||
|
leaf1Node.setIsParent(true);
|
||||||
|
leaf1Node.setKey(String.valueOf(IdGenerator.generate()));
|
||||||
|
leaf1Node.setParentNode(rootNode.getKey());
|
||||||
|
leaf1Node.setRelationship("1");
|
||||||
|
leaf1Node.setConditionList(Lists.newArrayList());
|
||||||
|
rootNode.getConditionList().add(leaf1Node);
|
||||||
|
|
||||||
|
ConditionTreeDto leaf4Node = new ConditionTreeDto();
|
||||||
|
leaf4Node.setCompareType("eq");
|
||||||
|
leaf4Node.setConditionId(fieldMap.get("xm"));
|
||||||
|
leaf4Node.setConditionType("employee");
|
||||||
|
leaf4Node.setConditionValue(userId.toString());
|
||||||
|
leaf4Node.setIsParent(false);
|
||||||
|
leaf4Node.setKey(String.valueOf(IdGenerator.generate()));
|
||||||
|
leaf4Node.setObjId(paramSplit[0]);
|
||||||
|
leaf4Node.setParentNode(leaf1Node.getKey());
|
||||||
|
leaf1Node.getConditionList().add(leaf4Node);
|
||||||
|
|
||||||
|
ConditionTreeDto leaf5Node = new ConditionTreeDto();
|
||||||
|
leaf5Node.setCompareType("eq");
|
||||||
|
leaf5Node.setConditionId(fieldMap.get("sfsxz"));
|
||||||
|
leaf5Node.setConditionType("Select");
|
||||||
|
leaf5Node.setConditionValue("0");
|
||||||
|
leaf5Node.setIsParent(false);
|
||||||
|
leaf5Node.setKey(String.valueOf(IdGenerator.generate()));
|
||||||
|
leaf5Node.setObjId(paramSplit[0]);
|
||||||
|
leaf5Node.setParentNode(leaf1Node.getKey());
|
||||||
|
leaf1Node.getConditionList().add(leaf5Node);
|
||||||
|
|
||||||
|
// 权限相关
|
||||||
|
Map<String, Object> ebuilderDataConfig = Maps.newHashMap();
|
||||||
|
Map<String, Object> dataSetup = Maps.newHashMap();
|
||||||
|
dataSetup.put("dataPermission", "ALL");
|
||||||
|
ebuilderDataConfig.put("dataSetup", dataSetup);
|
||||||
|
query.setEbuilderDataConfig(ebuilderDataConfig);
|
||||||
|
|
||||||
|
if (rootNode != null) {
|
||||||
|
query.setConditionTrees(rootNode);
|
||||||
|
}
|
||||||
|
String encodeStr = Base64Util.encode(JsonUtil.toJsonString(query));
|
||||||
|
Map<String, Object> ebFormDataMap =
|
||||||
|
iEtFormDatasetService.getDatas(Long.valueOf(paramSplit[0]), "", encodeStr, null);
|
||||||
|
if (ebFormDataMap != null && ebFormDataMap.size() > 0) {
|
||||||
|
if (ebFormDataMap.containsKey("list")) {
|
||||||
|
records = (List<Map<String, Object>>) ebFormDataMap.getOrDefault("list", Collections.emptyList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("AttendConfChangeEscheduler-queryResult-", e);
|
||||||
|
}
|
||||||
|
return records;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.weaver.seconddev.chapanda.util;
|
||||||
|
|
||||||
|
import com.weaver.teams.domain.user.SimpleEmployee;
|
||||||
|
import com.weaver.workflow.common.entity.org.WeaUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Company 泛微软件
|
||||||
|
* @CreateDate 2025/7/31
|
||||||
|
* @Description ${description}
|
||||||
|
* @Author 李栋
|
||||||
|
*/
|
||||||
|
public class FormUtil {
|
||||||
|
public static WeaUser getFlowWeaUser(SimpleEmployee currentUser) {
|
||||||
|
WeaUser weaUser = new WeaUser();
|
||||||
|
weaUser.setAdmin(currentUser.isAdmin());
|
||||||
|
weaUser.setAvatar(currentUser.getAvatarId());
|
||||||
|
weaUser.setUserId(currentUser.getId());
|
||||||
|
weaUser.setDepartMentId(currentUser.getDepartmentId());
|
||||||
|
weaUser.setJobId(currentUser.getPositionId());
|
||||||
|
weaUser.setTenantKey(currentUser.getTenantKey());
|
||||||
|
weaUser.setUserName(currentUser.getName());
|
||||||
|
return weaUser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
package com.weaver.seconddev.chapanda.util;
|
||||||
|
|
||||||
|
import com.weaver.mc.api.entity.Entity;
|
||||||
|
import com.weaver.mc.api.entity.MessageEvent;
|
||||||
|
import com.weaver.mc.api.entity.MessageModule;
|
||||||
|
import com.weaver.mc.api.entity.SendMessageEntity;
|
||||||
|
import com.weaver.mc.api.entity.UserEntity;
|
||||||
|
import com.weaver.teams.domain.user.SimpleEmployee;
|
||||||
|
import dm.jdbc.util.IDGenerator;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Company 泛微软件
|
||||||
|
* @CreateDate 2025/7/22
|
||||||
|
* @Description 系统消息推送工具类
|
||||||
|
* @Author 李栋
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class SystemMessageUtil {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建消息发送类对象
|
||||||
|
* @param text
|
||||||
|
* @param title
|
||||||
|
* @param content
|
||||||
|
* @param user
|
||||||
|
* @param senPcUrl
|
||||||
|
* @param senAppUrl
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static SendMessageEntity buildSmgEntity(String text, String title, String content, SimpleEmployee user, String senPcUrl, String senAppUrl) {
|
||||||
|
SendMessageEntity smg = new SendMessageEntity();
|
||||||
|
smg.setModule(MessageModule.EBUILDER);
|
||||||
|
smg.setEvent(MessageEvent.NOTIFY);
|
||||||
|
smg.setSender(UserEntity.SYSTEM_USER);
|
||||||
|
smg.setReceivers(Collections.singletonList(new UserEntity().setEmployeeId(user.getId()).setTenantKey(user.getTenantKey())));
|
||||||
|
smg.setText(text);
|
||||||
|
smg.setTitle(title);
|
||||||
|
smg.setContent(content);
|
||||||
|
|
||||||
|
Entity entity = new Entity();
|
||||||
|
entity.setId(IDGenerator.generateId());
|
||||||
|
entity.setModule("task");
|
||||||
|
entity.setName(title);
|
||||||
|
entity.setPcLinkeType(2);
|
||||||
|
entity.setPcUrl(senPcUrl);
|
||||||
|
entity.setH5LinkeType(2);
|
||||||
|
entity.setH5Url(senAppUrl);
|
||||||
|
smg.setEntity(entity);
|
||||||
|
return smg;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?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.weaver.seconddev.chapanda.mapper.AttendStatusDetailMapper">
|
||||||
|
|
||||||
|
<resultMap id="attendStatusDetailResultMap" type="com.weaver.seconddev.chapanda.entity.dto.AttendStatusDetailDTO">
|
||||||
|
<id property="id" column="id"/>
|
||||||
|
<result property="attendDate" column="ATTEND_DATE"/>
|
||||||
|
<result property="employee" column="EMPLOYEE"/>
|
||||||
|
<result property="attendConfig" column="ATTEND_CONFIG"/>
|
||||||
|
<result property="deleteType" column="delete_type"/>
|
||||||
|
<result property="tenantKey" column="TENANT_KEY"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="selectByCondition" resultMap="attendStatusDetailResultMap">
|
||||||
|
SELECT a.id,
|
||||||
|
a.ATTEND_DATE,
|
||||||
|
a.EMPLOYEE,
|
||||||
|
a.ATTEND_CONFIG,
|
||||||
|
a.delete_type
|
||||||
|
<choose>
|
||||||
|
<when test="dbName != null and dbName != ''">
|
||||||
|
FROM #{dbName}.attend_status_detail a
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
FROM e10_other_business.attend_status_detail a
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
|
WHERE a.TENANT_KEY = #{tenantKey}
|
||||||
|
AND a.ATTEND_DATE = #{attendDate}
|
||||||
|
AND a.delete_type = #{deleteType}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
<?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.weaver.seconddev.chapanda.mapper.EmployeeAttendMapper">
|
||||||
|
|
||||||
|
<resultMap id="employeeAttendanceResultMap" type="com.weaver.seconddev.chapanda.entity.dto.EmployeeAttendDTO">
|
||||||
|
<result property="id" column="ID"/>
|
||||||
|
<result property="employee" column="EMPLOYEE"/>
|
||||||
|
<result property="confirmModelId" column="confirm_model_id"/>
|
||||||
|
</resultMap>
|
||||||
|
<update id="updateStatueById">
|
||||||
|
update
|
||||||
|
<choose>
|
||||||
|
<when test="dbName != null and dbName != ''">
|
||||||
|
#{dbName}.uf_kqtotal
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
e10_common.uf_kqtotal
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
|
set zt= #{statue}
|
||||||
|
where ID = #{id}
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<select id="getModeIdByUserId" resultMap="employeeAttendanceResultMap">
|
||||||
|
SELECT a.EMPLOYEE,
|
||||||
|
b.confirm_model_id
|
||||||
|
FROM
|
||||||
|
<choose>
|
||||||
|
<when test="dbName != null and dbName != ''">
|
||||||
|
#{dbName}.attend_status_detail a
|
||||||
|
LEFT JOIN #{dbName}.attend_config b ON a.ATTEND_CONFIG = b.id
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
e10_other_business.attend_status_detail a
|
||||||
|
LEFT JOIN e10_other_business.attend_config b ON a.ATTEND_CONFIG = b.id
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
|
WHERE a.EMPLOYEE = #{employeeId}
|
||||||
|
AND a.delete_type = 0
|
||||||
|
AND a.ATTEND_DATE <= #{yearMonth}
|
||||||
|
AND b.confirm_model_id IS NOT NULL
|
||||||
|
ORDER BY a.ATTEND_DATE DESC
|
||||||
|
LIMIT 1
|
||||||
|
</select>
|
||||||
|
<select id="getAllUserByMonth"
|
||||||
|
resultType="com.weaver.seconddev.chapanda.entity.dto.EmployeeAttendDTO">
|
||||||
|
SELECT ID,xm as EMPLOYEE
|
||||||
|
FROM
|
||||||
|
<choose>
|
||||||
|
<when test="dbName != null and dbName != ''">
|
||||||
|
#{dbName}.uf_kqtotal
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
e10_common.uf_kqtotal
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
|
WHERE kqyf = #{month}
|
||||||
|
AND (zt IS NULL OR zt = 0)
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
Loading…
Reference in New Issue