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 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 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 userIds = message.getUserIds(); List errUserIds = new ArrayList(); if(!StringUtils.isEmpty(accessToken)){ //微信公众号模板消息接口url 配置成参数 url = (String) sysCtrlParamMap.get("nckd_msgurl"); url = url+accessToken; //模板消息接口请求参数 Map requestJson = new HashMap<>(); requestJson.put("template_id",templateid); //微信公众号对应跳转信息 Map 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 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 queryEntityObject(String entityNumber, Long bizDataId) { Map 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 sysCtrlParam(String entityNumber) { //获取采购应用参数 Map 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 getResMap(String entityNumber, String resStr) { if (StringUtils.isEmpty(resStr)) { throw new KDBizException("请前往系统参数-应用-供应链云-采购应用参数 配置对应跳转信息"); } //资源代号信息 Map res = ((List>) 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; } }