此功能分两部分,第一部分定时器每天定点推送一条URL+图片+文字,第二部分点击URL进入页面,能看到生日祝福文字、背景图片、音乐。
第一部分定时器每天定点推送一条URL+图片+文字
ApplicationContext-elasticJob.xml设置定时任务,指定触发频率和运行类,
/wxapp/src/main/resources/spring/ApplicationContext-elasticJob.xml设置定时任务:
定时器知识:https://blog.csdn.net/Linweiqiang5/article/details/86741258
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
xmlns:job="http://www.dangdang.com/schema/ddframe/job"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.dangdang.com/schema/ddframe/reg http://www.dangdang.com/schema/ddframe/reg/reg.xsd
http://www.dangdang.com/schema/ddframe/job http://www.dangdang.com/schema/ddframe/job/job.xsd">
<!-- 生日祝福日报 -->
<job:simple id="BirthdayBlessingDailyJob" class="com.aoyang.wxapp.quartz.job.BirthdayBlessingDailyJob"
registry-center-ref="regCenter" cron="0 00 8 1/1 * ?" sharding-total-count="1" />
<!--configure registry center -->
<reg:zookeeper id="regCenter" server-lists="192.168.1.109:2181" namespace="wx-dd-job"
base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />
<!--configure job -->
<job:simple id="myElasticJob" class="com.aoyang.wxapp.quartz.job.MyElasticJob"
registry-center-ref="regCenter" cron="0/10 * * * * ?" sharding-total-count="1"/>
<!-- 组织人数处理 -->
<job:simple id="departmentUserNumberJob" class="com.aoyang.wxapp.quartz.job.DepartmentUserNumberJob"
registry-center-ref="regCenter" cron="1 28 21 1/1 * ?" sharding-total-count="1" />
<!-- 定时同步HR人员信息 -->
<job:simple id="employeeSyncFromHRJob" class="com.aoyang.wxapp.quartz.job.EmployeeSyncFromHRJob"
registry-center-ref="regCenter" cron="1 30 21 1/1 * ? " sharding-total-count="1"/>
<!-- 更新人员信息到微信 -->
<job:simple id="employeeSyncToWeixinJob" class="com.aoyang.wxapp.quartz.job.EmployeeSyncToWeixinJob"
registry-center-ref="regCenter" cron="1 1 20 1/1 * ?" sharding-total-count="1" />
<!-- 用车:隔天任务处理 -->
<job:simple id="vehicleGgsReportSynchronizeJob" class="com.aoyang.wxapp.quartz.job.VehicleGgsReportSynchronizeJob"
registry-center-ref="regCenter" cron="0 0 1 1/1 * ?" sharding-total-count="1" />
<!-- 车辆使用日报 -->
<job:simple id="vehicleReportDailySynchronizeJob" class="com.aoyang.wxapp.quartz.job.VehicleReportDailySynchronizeJob"
registry-center-ref="regCenter" cron="1 30 13 1/1 * ?" sharding-total-count="1" />
<!-- 组织架构同步 -->
<job:simple id="organisationSynchronizeJob" class="com.aoyang.wxapp.quartz.job.OrganisationSynchronizeJob"
registry-center-ref="regCenter" cron="1 33 23 1/1 * ?" sharding-total-count="1" />
<!-- 微信信息发送 -->
<job:simple id="weixinMsgSendSynchronizeJob" class="com.aoyang.wxapp.quartz.job.WeixinMsgSendSynchronizeJob"
registry-center-ref="regCenter" cron="0/5 * * * * ?" sharding-total-count="1" />
<!-- BIS日推给组长 -->
<job:simple id="bisDailyReport" class="com.aoyang.wxapp.quartz.job.BisDailyReport"
registry-center-ref="regCenter" cron="0 0 12 ? * SAT" sharding-total-count="1" />
<!-- itsm 自动催办 -->
<job:simple id="itsmAutoReminder" class="com.aoyang.wxapp.quartz.job.ItsmAutoReminder"
registry-center-ref="regCenter" cron="0 0/5 8-17 ? * MON-SAT" sharding-total-count="1" />
<!-- it服务统计日报推送 -->
<job:simple id="itServiceStatisticsMsg" class="com.aoyang.wxapp.quartz.job.ItServiceStatisticsMsg"
registry-center-ref="regCenter" cron="0 0 7 * * ?" sharding-total-count="1" />
<!-- 接收ESB耗材订单数据: 每天凌晨1,3,5各拉取一次 -->
<job:simple id="esbDailyOrder" class="com.aoyang.wxapp.quartz.job.EsbDailyOrder"
registry-center-ref="regCenter" cron="0 0 1,3,5 * * ?" sharding-total-count="1" />
<!-- 接收ESB资产采购入库数据:每天凌晨1,3,5各拉取一次 -->
<job:simple id="esbDailyAssetOrder" class="com.aoyang.wxapp.quartz.job.EsbDailyAssetOrder"
registry-center-ref="regCenter" cron="0 0 1,3,5 * * ?" sharding-total-count="1" />
<!-- 接收ESB固定资产卡片数据:每天凌晨1,3,5各拉取一次 -->
<job:simple id="esbDailyFixedAssetCard" class="com.aoyang.wxapp.quartz.job.EsbDailyFixedAssetCard"
registry-center-ref="regCenter" cron="0 0 1,3,5 * * ?" sharding-total-count="1" />
<!-- 维护原资产表单ASSET_LIST:周一到周六每天23点59分运行 -->
<job:simple id="eDailyUpdateAssetList" class="com.aoyang.wxapp.quartz.job.EDailyUpdateAssetList"
registry-center-ref="regCenter" cron="0 59 23 ? * MON-SAT" sharding-total-count="1" />
<!--接收固定资产清单:每隔1小时 张凯:实现打印功能而做的,,-->
<job:simple id="asPrtTimetask" class="com.aoyang.wxapp.quartz.job.AsPrtTimetask"
registry-center-ref="regCenter" cron="0 0 0/1 * * ?" sharding-total-count="1"/>
<!-- 发送上个月资产耗材总费用:每月1号8点 -->
<job:simple id="pushLeaderTimetask" class="com.aoyang.wxapp.quartz.job.PushLeaderTimetask"
registry-center-ref="regCenter" cron="0 0 8 1 * ?" sharding-total-count="1"/>
<job:simple id="stats7ClockTask" class="com.aoyang.wxapp.quartz.job.Stats7ClockTask"
registry-center-ref="regCenter" cron="0 0 7 * * ?" sharding-total-count="1"/>
<job:simple id="stats8ClockTask" class="com.aoyang.wxapp.quartz.job.Stats8ClockTask"
registry-center-ref="regCenter" cron="0 0 8 * * ?" sharding-total-count="1"/>
<job:simple id="ayyyGenerateIncomeTask" class="com.aoyang.wxapp.quartz.job.AyyyGenerateIncomeTask"
registry-center-ref="regCenter" cron="0 30 2 * * ?" sharding-total-count="1"/>
</beans>
/wx-quartz-job/src/main/java/com/aoyang/wxapp/quartz/job/BirthdayBlessingDailyJob.java
定时推送类BirthdayBlessingDailyJob,注入两个Service
staffService,用于查询今天过生日的人员名单,
sendService,用于将信息推送给人员名单,
/**
* Project Name: 澳洋信息系统微信台平台 Date:2019年8月20日 Copyright(c) 2019 All Rights Reserved
*
* @author qiudc.
*
*/
package com.aoyang.wxapp.quartz.job;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
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.Component;
import com.aoyang.weixin.corp.model.msg.Article;
import com.aoyang.weixin.corp.model.msg.News;
import com.aoyang.weixin.corp.model.msg.resp.WxCorpNewsResponseMessage;
import com.aoyang.weixin.corp.service.WxCorpMessageSendService;
import com.aoyang.weixin.util.OAuth2Utils;
import com.aoyang.wxapp.service.fhoa.staff.StaffManager;
import com.aoyang.wxapp.util.PageData;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
@Component("birthdayBlessingDailyJob")
public class BirthdayBlessingDailyJob implements SimpleJob {
private static final Logger LOGGER = LoggerFactory.getLogger(BirthdayBlessingDailyJob.class);
private static final String BIRTHDAY_BLESSING_URL = "weixin/hr/birthdayBlessing";
@Resource(name="staffService")
private StaffManager staffService;
@Autowired
private WxCorpMessageSendService sendService;
@Value("${Hostname}")
private String hostName;
@Value("${agent.hr}")
private int hrAgentId;
public void syncVehicleReportDaily() throws Exception {
LOGGER.info("生日祝福日报推送开始......");
try {
PageData resultPd = staffService.getBirthdayStaffList();
if (resultPd != null) {
String birtydayStaffId = resultPd.getString("STAFF_ID_LIST");
String birtydayStaffIdAll = birtydayStaffId.replace(",", "|");
//推送的文字内容、图片url、跳转链接
String sendContent = String.format("澳洋集团祝您生日快乐!");
String picurl = "http://weixin.aoyang.com/group1/M00/05/8D/wKgBxl1LeCCADe4-AAoVjP4jB4A736.jpg";
String url = OAuth2Utils.getOAuthUrl(hostName,BIRTHDAY_BLESSING_URL,hrAgentId);
List<Article> articles = new ArrayList<Article>();
articles.add(new Article("生日祝福", sendContent, picurl, url));
News news = new News();
news.setArticles(articles);
//推送微信通知给所有今天过生日的人
WxCorpNewsResponseMessage message = new WxCorpNewsResponseMessage();
message.setNews(news);
message.setTouser(birtydayStaffIdAll);
//隶属于IT新服务
message.setAgentid(hrAgentId);
message.setTotag("@all"); //@all表示忽略本参数
message.setToparty("@all");
String backMsg = sendService.sendMessage(message);
backMsg = (backMsg == null ? "" : backMsg);
LOGGER.info("[ITSM] 推送消息 : 生日祝福" + ";返回的数据为:" + backMsg);
}
} catch (Exception e) {
LOGGER.error("生日祝福日报推送时发生异常,{}", e);
}
LOGGER.info("生日祝福日报推送定时任务执行完毕");
}
@Override
public void execute(ShardingContext shardingContext) {
try {
LOGGER.info("分片值:" + shardingContext.getShardingItem());
syncVehicleReportDaily();
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
}
}
/wx-system-api/src/main/java/com/aoyang/wxapp/service/fhoa/staff/StaffManager.java
StaffManager接口
/**
* Project Name: 澳洋信息系统微信管理平台
* Date:2016年10月10日
* Copyright(c) 2016 All Rights Reserved
*/
package com.aoyang.wxapp.service.fhoa.staff;
import java.util.List;
import java.util.Map;
import com.aoyang.wxapp.entity.Page;
import com.aoyang.wxapp.util.PageData;
/**
* 员工管理接口
*/
public interface StaffManager{
/**通过id获取数据
* @param pd
* @throws Exception
*/
public PageData findById(PageData pd)throws Exception;
/**
* 根据用户ID查找.
*
* @param userId 用户ID.
* @return
* @throws Exception
*/
public PageData findByUserId(String userId) throws Exception;
/**
* 获取当天年月日String.
*@return String
*/
String getTodayDate()throws Exception;
/**
* 生日祝福人员列表.
*@return List<PageData>
* @param
*/
public PageData getBirthdayStaffList()throws Exception;
}
/wx-system-service/src/main/java/com/aoyang/wxapp/service/fhoa/staff/impl/StaffService.java
StaffService实现StaffManager接口,
/**
* Project Name: 澳洋信息系统微信管理平台
* Date:2016年10月10日
* Copyright(c) 2016 All Rights Reserved
*/
package com.aoyang.wxapp.service.fhoa.staff.impl;
import com.aoyang.wxapp.dao.DaoSupport;
import com.aoyang.wxapp.entity.Page;
import com.aoyang.wxapp.service.fhoa.staff.StaffManager;
import com.aoyang.wxapp.util.PageData;
/**
* 员工管理.
*/
@Service("staffService")
public class StaffService implements StaffManager{
@Resource(name = "daoSupport")
private DaoSupport dao;
/**通过id获取数据
* @param pd
* @throws Exception
*/
public PageData findById(PageData pd)throws Exception{
return (PageData)dao.findForObject("StaffMapper.findById", pd);
}
@Override
public PageData findByUserId(String userId) throws Exception {
PageData pd = new PageData();
pd.put("STAFF_ID", userId);
Object obj = dao.findForObject("StaffMapper.findByUserId", userId);
if(obj != null) {
pd = (PageData)obj;
return pd;
}
return null;
}
/**
* 获取当天年月日String.
*@return String
*/
@Override
public String getTodayDate() throws Exception {
return (String)dao.findForObject("StaffMapper.getTodayDate", null);
}
/**
* 生日祝福人员列表.
*@return List<PageData>
* @param
*/
@Override
public PageData getBirthdayStaffList() throws Exception {
return (PageData) dao.findForObject("StaffMapper.getBirthdayStaffList",null);
}
}
/wxapp/src/main/resources/mybatis1/fhoa/StaffMapper.xml
xml文件从数据库读取数据
<?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="StaffMapper">
<!--表名 -->
<sql id="tableName">
OA_STAFF
</sql>
<!-- 字段 -->
<sql id="Field">
NAME,
NAME_EN,
BIANMA,
DEPARTMENT_ID,
FUNCTIONS,
TEL,
EMAIL,
SEX,
BIRTHDAY,
NATION,
JOBTYPE,
JOBJOINTIME,
FADDRESS,
POLITICAL,
PJOINTIME,
SFID,
MARITAL,
DJOINTIME,
POST,
POJOINTIME,
EDUCATION,
SCHOOL,
MAJOR,
FTITLE,
CERTIFICATE,
CONTRACTLENGTH,
CSTARTTIME,
CENDTIME,
ADDRESS,
USER_ID,
BZ,
HIDETEL,
UPDATE_DATE,
QQ,
WECHAT,
STATION,
POSITION,
HIREDATE,
SHORTPHONE,
WORKPLACE,
WORKPHONE,
STAFF_ID
</sql>
<!-- 通过ID获取数据 -->
<select id="findById" parameterType="pd" resultType="pd">
select
<include refid="Field"></include>
from
<include refid="tableName"></include>
where
STAFF_ID = #{STAFF_ID}
</select>
<!-- 通过ID获取数据 -->
<select id="findByUserId" parameterType="pd" resultType="pd">
select
<include refid="Field"></include>
from
<include refid="tableName"></include>
where
STAFF_ID = #{STAFF_ID}
</select>
<!-- 获取当天年月日String -->
<select id="getTodayDate" resultType="string">
select TO_CHAR(SYSDATE,'YYYY-MM-DD') from dual
</select>
<!-- 获取今天生日的人员名单 -->
<select id="getBirthdayStaffList" resultType="pd">
SELECT
LISTAGG (STAFF_ID, ',') WITHIN GROUP (ORDER BY STAFF_ID) AS STAFF_ID_LIST
FROM
<include refid="tableName"></include>
WHERE
SUBSTR (BIRTHDAY, 6, 5) = TO_CHAR (SYSDATE, 'MM-DD')
</select>
</mapper>
/wx-weixin-core/src/main/java/com/aoyang/weixin/util/OAuth2Utils.java
package com.aoyang.weixin.util;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 微信OAuth工具类.
*
* @author huangcheng@aoyang.com.
*
*/
public class OAuth2Utils {
private static Log logger = LogFactory.getLog(OAuth2Utils.class);
private OAuth2Utils() {};
/** 回调验证的URL前缀. */
private static final String OAUTH_URL_PREFIX = "http://weixin.aoyang.com/wxapp/weixin/authenticate.do?state=";
private static final String OAUTH_URL_PREFIX_WITHOUT_DOMAIN = "/wxapp/weixin/authenticate.do?agentId=AGENT_ID&state=STATE";
private static final String HTTP_PREFIX = "http://";
/**
*
* @param hostName
* : 域名
* @param contextPath
* @param agentId
* @return
*/
public static String getOAuthUrl(String hostName, String contextPath, int agentId) {
if (contextPath == null || contextPath.trim().length() == 0) {
throw new IllegalArgumentException("contextPath 不能为null");
}
// 解决contextPath携带参数的问题
hostName = hostName.startsWith(HTTP_PREFIX) ? hostName : HTTP_PREFIX + hostName;
String url = hostName + OAUTH_URL_PREFIX_WITHOUT_DOMAIN;
String newUrl = url.replace("AGENT_ID", String.valueOf(agentId)).replace("STATE", contextPath);
logger.info("拼接替换后的url为:" + newUrl);
return newUrl;
}
/**
* 获取回调的URL地址,此地址可以获取企业微信用户身份(UserId).
*
* @param contextPath
* 应用程序上下文路径,不能为<code>null</code>或空值.
* 如:weixin/addresslist/showmygroup.do, 不包含协议、端口号、域名、程序路径等.
* @return 指向我们程序且回以获取用户身份信息的URL.
*/
@Deprecated
public static String getOAuthUrl(String contextPath, int agentId) {
if (contextPath == null || contextPath.trim().length() == 0) {
throw new IllegalArgumentException("contextPath 不能为null");
}
String url = OAUTH_URL_PREFIX + contextPath;
url = url + "&agentId=" + agentId;
logger.info("生成URL -->" + url);
return url;
}
}
/wx-weixin-api/src/main/java/com/aoyang/weixin/corp/service/WxCorpMessageSendService.java
/**
* Project Name: 澳洋信息系统微信台平台
* Date:2016年11月12日
* Copyright(c) 2016 All Rights Reserved
* @author hc2900@126.com.
*
*/
package com.aoyang.weixin.corp.service;
import com.aoyang.weixin.corp.model.msg.resp.WxCorpResponseMessage;
import com.aoyang.weixin.exception.WxException;
/**
* 企业微信号向微信用户发送消息服务.
*
* @author hc2900@126.com
*
*/
public interface WxCorpMessageSendService {
/**
* 企业接口向下属关注用户发送微信消息.
*
* @param message
* 要发送的消息.
* @return JSON格式的返回结果.格式如下:
*
* <pre>
* {
* "errcode": 0,
* "errmsg": "ok",
* "invaliduser": "UserID1",
* "invalidparty":"PartyID1",
* "invalidtag":"TagID1"
* }
*
* @return JSON格式的返回结果,可能 会返回 <code>null</code>.
*
*
* @throws WxException 如果无法发送抛出异常。
*/
public String sendMessage(WxCorpResponseMessage message) throws WxException;
/**
* 企业接口向下属关注用户发送微信消息.
*
* @param jsonWxMessage String格式的微信消息.
* @return JSON格式的返回结果,可能 会返回 <code>null</code>.
* @throws WxException 如果无法发送抛出异常.
*/
public String sendMessage(String jsonWxMessage) throws WxException;
/**
* 企业接口向下属关注用户发送微信文本消息.
*
* @param touser
* 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,
* 则向关注该企业应用的全部成员发送
* @param toparty
* 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数
* @param totag
* 标签ID列表,多个接收者用‘|’分隔。当touser为@all时忽略本参数
* @param content
* 消息内容
* @param agentId
* 企业微信应用ID,可以在微信管理后台获取不同的应用ID.
* @return
*/
public String sendTextMessage(String touser, String toparty, String totag,
String content, Integer agentId) throws WxException;
}
/wx-weixin-core/src/main/java/com/aoyang/weixin/corp/model/msg/Article.java
package com.aoyang.weixin.corp.model.msg;
/**
* 图文类.
*
* @author hc2900@126.com
*
*/
public class Article {
/**图文标题.*/
private String title;
/**图文描述.*/
private String description;
/**图片链接,支持JPG,PNG,较好的效果为大图640*320,小图80*80.*/
private String picurl;
/**点击图文消息跳转链接.*/
private String url;
/**
* 构造函数.
*/
public Article() {
}
/**
* 构造函数.
*
* @param title 图文标题.
* @param description 图文描述.
* @param picUrl 图片链接.
* @param url 跳转链接.
*/
public Article(String title, String description, String picUrl, String url) {
super();
this.title = title;
this.description = description;
this.picurl = picUrl;
this.url = url;
}
/**
* @return the title
*/
public String getTitle() {
return title;
}
/**
* @param title the title to set
*/
public void setTitle(String title) {
this.title = title;
}
/**
* @return the description
*/
public String getDescription() {
return description;
}
/**
* @param description the description to set
*/
public void setDescription(String description) {
this.description = description;
}
/**
* @return the picUrl
*/
public String getPicurl() {
return picurl;
}
/**
* @param picurl the picUrl to set
*/
public void setPicurl(String picurl) {
this.picurl = picurl;
}
/**
* @return the url
*/
public String getUrl() {
return url;
}
/**
* @param url the url to set
*/
public void setUrl(String url) {
this.url = url;
}
}
/wx-weixin-core/src/main/java/com/aoyang/weixin/corp/model/msg/News.java
/**
* Project Name: 澳洋信息系统微信台平台
* Date:2016年10月9日
* Copyright(c) 2016 All Rights Reserved
* @author hc2900@126.com.
*
*/
package com.aoyang.weixin.corp.model.msg;
import java.util.Arrays;
import java.util.List;
public class News {
private List<Article> articles;
public News() {
}
public News(List<Article> article) {
this.articles = article;
}
public News(Article...articles ) {
this.articles = Arrays.asList(articles);
}
public List<Article> getArticles() {
return articles;
}
public void setArticles(List<Article> article) {
this.articles = article;
}
}
配置文件:
/wxapp/src/main/resources/env/dev.properties
db_url=jdbc:oracle:thin:@172.30.112.197:1521:orclutf8
db_driverClassName=oracle.jdbc.OracleDriver
db_username=itsm20
db_password=Itsm20.123
#huashengke---xinkefuwu
wx_corpID=ww22141d223bc1a1ad
wx_token=lFTdRHxw2CZsNnPY1rm
wx_encodingAESKey=o0JcSyWPz3HW5sbhpAbSjMUTWJtfC97kOf8hgQybkDc
wx_secret=v6DBWgCBbh6SiWoznl1AfAf-ZAta-xEftXy2JfqMGl0
wx_hostname=263fw85879.qicp.vip:19303
#wx_hostname=2399016x6l.qicp.vip:51286
wx_agent_hr=1000016
/wxapp/src/main/resources/weixin.properties 调取 dev.properties
CorpID=${wx_corpID}
Token=${wx_token}
EncodingAESKey=${wx_encodingAESKey}
Secret=${wx_secret}
Hostname=${wx_hostname}
agent.inventory=${wx_agent_inventory}
agent.itsm.new=${wx_agent_itsm_new}
agent.itsm.new.workbench=${wx_agent_itsm_new_workbench}
agent.stats=${wx_agent_stats}
agent.hr=${wx_agent_hr}
consumables.apply.templateId=${consumables_apply_templateId}
knowledge.audit.templateId=${knowledge_audit_templateId}
out.sourcing.templateId=${out_sourcing_templateId}
consumables.outbound.templateId=${consumables_outbound_templateId}
nonfixed.asset.nonvalueChange.templateId=${nonfixed_asset_nonvalueChange_templateId}
asset.inventory.audit.templateId=${asset_inventory_audit_templateId}
fixed.asset.nonvalueChange.templateId=${fixed_asset_nonvalueChange_templateId}
测试时使用的是:/wxapp/src/test/resources/weixin.properties
#huashengke---xinkefuwu
CorpID=ww22141d223bc1a1ad
Token=lFTdRHxw2CZsNnPY1rm
EncodingAESKey=o0JcSyWPz3HW5sbhpAbSjMUTWJtfC97kOf8hgQybkDc
Secret=v6DBWgCBbh6SiWoznl1AfAf-ZAta-xEftXy2JfqMGl0
#Hostname=2m04471c37.51mypc.cn:14127
Hostname=263fw85879.qicp.vip:19303
#Hostname=wei.aoyang.com
agent.hr=1000016
第二部分点击URL进入页面,能看到生日祝福文字、背景图片、音乐
/wxapp/src/main/java/com/aoyang/wxapp/controller/hr/HrController.java
/**
* Project Name: 澳洋信息系统微信台平台
* Date:2017年1月3日
* Copyright(c) 2016 All Rights Reserved
* @author gongkx
*
*/
package com.aoyang.wxapp.controller.hr;
import java.util.Calendar;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.aoyang.wxapp.controller.BaseController;
import com.aoyang.wxapp.service.fhoa.staff.StaffManager;
import com.aoyang.wxapp.service.kq.KqService;
import com.aoyang.wxapp.service.salary.HrService;
import com.aoyang.wxapp.util.DateTimeUtils;
import com.aoyang.wxapp.util.PageData;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping(value = "/weixin/hr")
public class HrController extends BaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(HrController.class);
@Autowired
private HrService hrService;
@Resource(name = "staffService")
private StaffManager staffService;
@Autowired
KqService kq;
/**
* 生日祝福推送.
* qiudc
* @param page
* @throws Exception
*/
@RequestMapping(value = "/birthdayBlessing")
public ModelAndView birthdayBlessing(ModelAndView model) throws Exception {
model.setViewName("hr/birthdayBlessing");
String userId = getCurrentUserId();
userId = "AY006278";
if (!StringUtils.isEmpty(userId)) {
PageData staff = staffService.findByUserId(userId);
String todayDate = staffService.getTodayDate();
String year = todayDate.substring(0, 4); //2019-08-25
String birthday = staff.getString("BIRTHDAY");
String month = birthday.substring(5, 7);
String day = birthday.substring(8, 10);
model.addObject("year", year);
model.addObject("month", month);
model.addObject("day", day);
model.addObject("staff", staff);
return model;
}
return model;
}
}
页面JSP:
/wxapp/src/main/webapp/WEB-INF/jsp/hr/birthdayBlessing.jsp
注意导入音乐的写法,判断性别的写法,
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
<title>祝您生日快乐</title>
<base href="<%=basePath%>">
<!-- ace styles -->
<link rel="stylesheet" href="static/ace/css/ace.css" class="ace-main-stylesheet" id="main-ace-style" />
<!-- 下拉框 -->
<link rel="stylesheet" href="static/ace/css/chosen.css" />
<!-- jsp文件头和头部 -->
<!--<link rel="stylesheet" href="static/ace/css/bootstrap.css" />-->
<!--<link rel="stylesheet" href="static/ace/css/font-awesome.css" />-->
<!-- 使用HR指定字体 -->
<link rel="stylesheet" href="static/ace/css/birthdayblessing.css" />
<style>
.main-container{
background-image:url(static/weixin/images/birthday_bkgrd.jpg);
background-repeat: no-repeat;
background-size: cover;
height: 100vh;
padding: 45vw 4vw 4vw 4vw;
}
.userName{
font-size: 22px;
color: #EF8200;
}
</style>
</head>
<body class="no-skin">
<div class="main-container" id="main-container">
<!-- 引用网络音乐-网易云音乐 -->
<!-- <iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=298 height=52 -->
<!-- src="//music.163.com/outchain/player?type=2&id=469762679&auto=1&height=32" hidden="true"></iframe> -->
<!-- 引用本地音乐 -->
<audio id="birthdayAudio" src="static/sound/happyBirthday.ogg" preload="auto" loop autoplay
style="clear:both;display:block;margin:auto" ></audio>
<div class="main-content">
<p>
<c:if test="${staff.SEX == 1 }">
<span>尊敬的</span> <span class="userName">${staff.NAME} </span><span>先生:</span><br/>
</c:if>
<c:if test="${staff.SEX == 2 }">
<span>尊敬的</span> <span class="userName"> ${staff.NAME} </span><span>女士:</span><br/>
</c:if>
光阴如水,日月如梭。又是一年时光悄然而去。在这特别的日子里,公司全体同仁给您送上生日最真挚的祝福。
祝您生日快乐!阖家欢乐!公司的发展倾注了您和您家人的支持和奉献,感谢您的辛勤工作,在此向您和您的家人表示感谢!
愿我们在今后的工作中和谐,同心共创美好明天。<br/></p>
<p align="right">${year} 年 ${month} 月 ${day} 日 </p>
</div>
<!-- /.main-content -->
<!-- 返回顶部 -->
<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
<i class="ace-icon fa fa-angle-double-up icon-only bigger-110"></i>
</a>
</div>
<!-- /.main-container -->
<!-- basic scripts -->
<!-- 页面底部js¨ -->
<script type="text/javascript">
window.jQuery || document.write("<script src='<%=basePath%>static/ace/js/jquery.js'>"+"<"+"/script>");
</script>
<!-- <![endif]-->
<script type="text/javascript">
if('ontouchstart' in document.documentElement) document.write("<script src='<%=basePath%>static/ace/js/jquery.mobile.custom.js'>"+"<"+"/script>");
</script>
<script src="static/ace/js/bootstrap.js"></script>
<!-- 删除时确认窗口 -->
<script src="static/ace/js/bootbox.js"></script>
<!-- ace scripts -->
<script src="static/ace/js/ace/ace.js"></script>
<!-- 下拉框 -->
<script src="static/ace/js/chosen.jquery.js"></script>
<!-- 日期框 -->
<script src="static/ace/js/date-time/bootstrap-datepicker.js"></script>
<script src="static/js/jquery.tablerowspan.js"></script>
<!--提示框-->
<script type="text/javascript" src="static/js/jquery.tips.js"></script>
<!--<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>-->
<script type="text/javascript">
</script>
</body>
</html>
css渲染文件:
/wxapp/src/main/webapp/static/ace/css/birthdayblessing.css
将 FZSEJW.ttf 字体文件放入 /wxapp/src/main/webapp/static/ace/fonts/FZSEJW.ttf
注意引用字体的写法 @font-face font-family ,
和 字体阴影的写法 text-shadow:2.5px 2.5px 2.5px #ffffff;
/* 方正少儿体fonts for /wxapp/src/main/webapp/WEB-INF/jsp/hr/birthdayBlessing.jsp */
@font-face{
font-family: 'fangzhengshaoer';
src: url('../fonts/FZSEJW.ttf');
}
html {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
body {
margin: 0;
font-family: fangzhengshaoer;
font-size: 18px;
color: #32282e;
text-shadow:2.5px 2.5px 2.5px #ffffff;
}
summary {
display: block;
}
video {
display: inline-block;
vertical-align: baseline;
}
audio:not([controls]) {
display: none;
height: 0;
}
写测试类,推送生日祝福给用户:
/wxapp/src/test/java/com/aoyang/wxapp/quartz/job/BirthdayBlessingDailyJobTest.java
运行测试方法,推送生日祝福到微信,点击推送消息,看能否打开网页。
/**
* All rights Reserved,Designed By www.aoyang.com
* @Title EmployeeSyncFromHRJobTest.java
* @Package com.aoyang.wxapp.quartz.job
* @Description :
* @Author daixiongyan
* @date 2019年8月8日
* @Version V1.0
* @Copyright : 2019.www.aoyang.com
*/
package com.aoyang.wxapp.quartz.job;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.aoyang.wxapp.BaseJunit4;
import com.aoyang.wxapp.service.fhoa.staff.StaffManager;
import com.aoyang.wxapp.util.PageData;
/**
* @ClassName: EmployeeSyncFromHRJobTest
* @Description: TODO(这里用一句话描述这个类的作用)
* @author qiudechao
* @date 2019年8月8日
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
public class BirthdayBlessingDailyJobTest extends BaseJunit4{
@Resource(name="birthdayBlessingDailyJob")
private BirthdayBlessingDailyJob birthdayBlessingDailyJob;
@Resource(name="staffService")
private StaffManager staffService;
private static final Logger LOGGER = LoggerFactory.getLogger(BirthdayBlessingDailyJobTest.class);
//birthdayBlessingDailyJob.syncVehicleReportDaily();分成两部分测试
@Test
public void test() {
try {
birthdayBlessingDailyJob.syncVehicleReportDaily();
} catch (Exception e) {
LOGGER.error("生日祝福出现异常:{}", e);
}
}
}
电脑端浏览生日祝福页面效果:
本地网址:http://localhost:9090/wxapp/weixin/hr/birthdayBlessing.do
外网映射网址:http://2399016x6l.qicp.vip:51286/wxapp/weixin/hr/birthdayBlessing.do
相关连接:
利用花生壳搭建微信小应用 https://blog.csdn.net/qiudechao1/article/details/100141669