| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- package nckd.fi.er.message;
- import com.alibaba.fastjson.JSONObject;
- import com.grapecity.documents.excel.S;
- import kd.bos.context.RequestContext;
- import kd.bos.dataentity.entity.DynamicObject;
- import kd.bos.dataentity.entity.DynamicObjectCollection;
- import kd.bos.exception.KDBizException;
- import kd.bos.logging.Log;
- import kd.bos.logging.LogFactory;
- import kd.bos.orm.query.QCP;
- import kd.bos.orm.query.QFilter;
- import kd.bos.servicehelper.BusinessDataServiceHelper;
- import kd.bos.servicehelper.QueryServiceHelper;
- import kd.bos.servicehelper.parameter.SystemParamServiceHelper;
- import kd.bos.workflow.engine.msg.AbstractMessageServiceHandler;
- import kd.bos.workflow.engine.msg.ctx.MessageContext;
- import kd.bos.workflow.engine.msg.info.MessageInfo;
- import kd.bos.workflow.engine.msg.info.ToDoInfo;
- import nckd.base.common.utils.DateUtil;
- import nckd.base.common.utils.HttpUtils;
- import nckd.base.common.utils.ParamUtils;
- import org.apache.commons.lang3.ObjectUtils;
- import org.apache.commons.lang3.StringUtils;
- import java.io.IOException;
- import java.util.*;
- /**
- * @description:TODO
- * @author: dingsixi
- * @create: 2025/12/27 0:09
- */
- public class SendMsgToWeChatOA extends AbstractMessageServiceHandler {
- private Log log = LogFactory.getLog(SendMsgToWeChatOA.class);
- @Override
- public void createToDo(MessageContext messageContext, ToDoInfo toDoInfo) {
- }
- @Override
- public void dealToDo(MessageContext messageContext, ToDoInfo toDoInfo) {
- }
- @Override
- public void deleteToDo(MessageContext messageContext, ToDoInfo toDoInfo) {
- }
- //重写sendMessage,给微信公众号发消息
- @Override
- public void sendMessage(MessageContext ctx, MessageInfo message) {
- super.sendMessage(ctx, message);
- log.info("-----------------------------------------"+"微信公众号发送提醒信息:" +message.getMessageContent().getLocaleValue_zh_CN()+" begin--------------------------------------------------");
- //微信公众号消息推送地址
- String mobUrl = message.getMobContentUrl();
- //微信公众号消息推送地址
- String contentUrl = message.getContentUrl();
- //表单数据id
- Long bizDataId = message.getBizDataId();
- if(bizDataId == null){
- log.info("表单数据id为空");
- return;
- }
- //表单标识
- String entityNumber = message.getEntityNumber();
- if(StringUtils.isEmpty(entityNumber)){
- log.info("表单标识为空");
- return;
- }
- Long id = message.getId();
- //从系统参数中获取以下参数值
- Map<String, Object> sysCtrlParamMap = sysCtrlParam(entityNumber);
- //微信获取token地址
- String url = (String) sysCtrlParamMap.get("nckd_tokenurl");
- //公众号appid
- String appid = (String) sysCtrlParamMap.get("nckd_appid");
- //公众号密码
- String appsecret = (String) sysCtrlParamMap.get("nckd_appsecret");
- //公众号模板消息 模板id
- String templateid = (String) sysCtrlParamMap.get("nckd_textfield");
- String accessToken = "";
- //请求token接口参数
- Map<String,Object> data = new HashMap<>();
- data.put("appid",appid);
- data.put("secret",appsecret);
- data.put("grant_type","client_credential");
- //获取token
- String responseStr = null;
- try {
- responseStr = HttpUtils.postJson(url,data);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- //是否推送成功
- if(!StringUtils.isEmpty(responseStr)){
- JSONObject jsonObject = JSONObject.parseObject(responseStr);
- accessToken = jsonObject.getString("access_token");
- if(StringUtils.isEmpty(accessToken)){
- String errmsg = jsonObject.getString("errmsg");
- }
- }
- //当前消息发送人用户id
- List<Long> userIds = message.getUserIds();
- List<Long> errUserIds = new ArrayList<Long>();
- if(!StringUtils.isEmpty(accessToken)){
- //微信公众号模板消息接口url 配置成参数
- url = (String) sysCtrlParamMap.get("nckd_msgurl");
- url = url+accessToken;
- //模板消息接口请求参数
- Map<String,Object> requestJson = new HashMap<>();
- requestJson.put("template_id",templateid);
- //微信公众号对应跳转信息
- Map<String, String> nckdRes = getResMap(entityNumber, (String) sysCtrlParamMap.get("nckd_res"));
- //拼接移动端供应商跳转路径
- String msgUrl = "http://erp-test.jxctly.com/ierp/mobile.html?"+nckdRes.get("nckd_rescode")+bizDataId +"&accountId="+ RequestContext.get().getAccountId();
- log.info("供应商跳转路径msgUrl:"+msgUrl);
- requestJson.put("url",msgUrl);
- requestJson.put("client_msg_id",id);
- //组装data参数
- JSONObject dataJson = madeJsonObject(entityNumber,bizDataId);
- // 转换为字符串
- String dataStr = dataJson.toJSONString();
- Map map = JSONObject.parseObject(dataStr, Map.class);
- requestJson.put("data",map);
- //获取当前用户id对应得微信公众号openid,每个用户都需要发送
- for(Long userId:userIds){
- //只有通过微信公众号单点登陆过的用户,苍穹平台才会留存openid,否则无法正常推送消息
- String openid = getUserOpenId(userId);
- if(StringUtils.isEmpty(openid)){
- continue;
- }
- requestJson.put("touser",openid);
- String response = null;
- try {
- response = HttpUtils.postJson(url, requestJson);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- log.info("公众号:"+response);
- if(StringUtils.isEmpty(response)){
- errUserIds.add(userId);
- }else{
- JSONObject json = JSONObject.parseObject(response);
- Integer errcode = json.getInteger("errcode");
- if(errcode!=0){
- errUserIds.add(userId);
- }
- }
- }
- if(errUserIds.size()>0){
- message.setUserIds(errUserIds);
- throw new KDBizException("推送公众号消息失败,请联系管理员!");
- }
- }else{
- throw new KDBizException("推送公众号消息失败,获取token失败!");
- }
- }
- /**
- * 组装Json
- * @param entityNumber
- * @param bizDataId
- * @return
- */
- private JSONObject madeJsonObject(String entityNumber,Long bizDataId) {
- //获取表单名称 、 单据编号
- Map<String, String> queryEntityMap = queryEntityObject(entityNumber,bizDataId);
- // 动态构建 JSON 对象
- JSONObject dataJson = new JSONObject();
- // first 部分
- JSONObject firstObj = new JSONObject();
- firstObj.put("value", "【您有新的任务通知】 您有新的待办消息任务,请及时反馈执行进度");
- // msgType 部分
- JSONObject msgTypeObj = new JSONObject();
- msgTypeObj.put("value", queryEntityMap.get("entityName"));
- // orderNumber 部分
- JSONObject orderNumberObj = new JSONObject();
- orderNumberObj.put("value", queryEntityMap.get("billno"));
- // 组装完整 JSON
- dataJson.put("first", firstObj);
- dataJson.put("msgType", msgTypeObj);
- dataJson.put("orderNumber", orderNumberObj);
- return dataJson;
- }
- /**
- * 查询表单对象
- * @param entityNumber
- * @param bizDataId
- * @return
- */
- private Map<String, String> queryEntityObject(String entityNumber, Long bizDataId) {
- Map<String, String> map = new HashMap<>();
- //查询主实体对象 获取表单名称
- DynamicObject entityobject = BusinessDataServiceHelper.loadSingle("bos_entityobject","name",new QFilter[]{
- new QFilter("number", QCP.equals, entityNumber)});
- String entityName = entityobject.getString("name");
- map.put("entityName",entityName);
- //查询表单
- DynamicObject hotelcheckingbill = BusinessDataServiceHelper.loadSingle(entityNumber,"billno",new QFilter[]{
- new QFilter("id", QCP.equals, String.valueOf(bizDataId))
- });
- //单据编码
- String billno = hotelcheckingbill.getString("billno");
- map.put("billno",billno);
- return map;
- }
- //根据用户id获取微信openid
- private String getUserOpenId(Long userId) {
- String openid = "";
- //普通微信表里存了1
- QFilter filter = new QFilter("imtype", QCP.equals,"1");
- filter = filter.and(new QFilter("userid", QCP.equals,userId));
- DynamicObjectCollection openids = QueryServiceHelper.query("bas_immapping", "openid", new QFilter[]{filter});
- if(openids.size()>0){
- openid = openids.get(0).getString("openid");
- }
- return openid;
- }
- /**
- * 获取公共参数
- */
- private Map<String, Object> sysCtrlParam(String entityNumber) {
- //获取采购应用参数
- Map<String, Object> sysCtrlParamMap = ParamUtils.getSysCtrlParameter(ParamUtils.PM);
- //微信获取token地址
- sysCtrlParamMap.get("nckd_tokenurl");
- //公众号appid
- sysCtrlParamMap.get("nckd_appid");
- //公众号密码
- sysCtrlParamMap.get("nckd_appsecret");
- //公众号模板消息 模板id
- sysCtrlParamMap.get("nckd_textfield");
- //模板消息接口url
- sysCtrlParamMap.get("nckd_msgurl");
- //对应跳转信息
- sysCtrlParamMap.get("nckd_res");
- return sysCtrlParamMap;
- }
- /**
- * 获取采购应用参数
- * @param entityNumber
- * @param resStr
- * @return
- */
- public static Map<String, String> getResMap(String entityNumber, String resStr) {
- if (StringUtils.isEmpty(resStr)) {
- throw new KDBizException("请前往系统参数-应用-供应链云-采购应用参数 配置对应跳转信息");
- }
- //资源代号信息
- Map<String, String> res = ((List<Map<String, String>>) JSONObject.parseObject(resStr, List.class))
- .stream().filter(it -> it.get("nckd_rescaption").equals(entityNumber)).findAny().orElse(null);
- if (null == res) {
- throw new KDBizException("请前往系统参数-应用-供应链云-采购应用参数 对应跳转信息,配置供应商访问页面路径");
- }
- return res;
- }
- }
|