package com.nationalelectric.greenH5; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.annotation.Resource; import javax.imageio.ImageIO; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import com.jysoft.unipush.AliasManage; import com.jysoft.weChat.service.WechatService; import com.jysoft.weChat.vo.ContentVo; import com.nationalelectirc.Constant.Constant; import com.nationalelectirc.utils.PushMessageUtil; import com.nationalelectirc.utils.RestResult; import com.nationalelectirc.utils.Utils; import com.nationalelectric.greenH5.bizc.BaseServiceImpl; import com.nationalelectric.greenH5.bizc.IGreenApplyListBizc; import com.nationalelectric.greenH5.bizc.IGreenHaircutRemainBizc; import com.nationalelectric.greenH5.identityAuth.util.Const; import com.nationalelectric.greenH5.identityAuth.util.PhotoUtil; import com.nationalelectric.greenH5.po.GreenHaircutRemain; import com.nationalelectric.greenH5.po.GreenHaircutTotal; import com.nationalelectric.greenH5.po.GreenUserInfo; import com.nationalelectric.greenH5.utils.AesEncryptUtil; import com.nationalelectric.greenH5.utils.Base64Utils; import com.nationalelectric.greenH5.utils.DateTime; import com.nationalelectric.greenH5.utils.DateUtil; import com.sgcc.uap.persistence.IHibernateDao; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; /** * 定时任务 * * @author wangchuang * */ /*@Component("greenTask")*/ public class GreenTaskController { @Autowired IHibernateDao hibernateDao; @Autowired private BaseServiceImpl baseService; /** * greenhaircutremain GreenHaircutRemain逻辑构件 */ @Resource private IGreenHaircutRemainBizc greenhaircutremainBizc; /** * greenapplylist GreenApplyList逻辑构件 */ @Resource private IGreenApplyListBizc greenapplylistBizc; @Resource private GreenDictionaryInfoController geenDictionaryInfoController; @Resource private GreenVisitorInfoController greenVisitorInfoController; @Resource private GreenDictionaryInfoController greenDictionaryInfoController; @Resource private GreenUserInfoController greenUserInfoController; @Resource private GreenHaircutInfoController greenHaircutInfoController; @Resource private AliasManageController aliasManageController; /** * 定时更新投票结果 */ @SuppressWarnings("unchecked") //@Scheduled(cron = "0 */60 * * * ?") public void featureVoteEnd() { // 查询投票是否结束 StringBuffer voteEnd = new StringBuffer(); System.out.println("*****************查询是否需要更新推荐菜投票结果开始*****************"); voteEnd.append( " select max(a.activity_no), a.activity_limit,a.activity_no from t_activity a where a.activity_code = 'dining_new_products' and NOW() > a.end_time3 and ") .append(" (a.activity_limit <> (select count(1) from green_food_feature gf where a.activity_no = gf.activity_no and vote_no is not null) ") .append(" or (a.activity_limit > (select count(1) from green_food_feature gf where a.activity_no = gf.activity_no and vote_no is not null) ") .append(" and a.activity_limit <= (select count(1) from green_food_feature gf where a.activity_no = gf.activity_no))) ") .append(" and a.activity_no = (select max(activity_no) from t_activity ) "); List list = hibernateDao.executeSqlQuery(voteEnd.toString()); // 如果没有查询出数据,说明不需要更改数据 if (list == null || list.size() == 0) { System.out.println("*****************查询是否需要更新推荐菜投票无结果*****************"); return; } Integer limit = list.get(0)[1] == null ? null : Integer.parseInt(list.get(0)[1].toString()); Integer no = list.get(0)[1] == null ? null : Integer.parseInt(list.get(0)[2].toString()); // 其一为空不更新 if (limit == null || no == null) { System.out.print("*****************查询是否需要更新推荐菜投票无结果*****************"); return; } System.out.println("*****************开始执行更新:第" + no + "期需要更新" + limit + "个*****************"); StringBuffer updateSql = new StringBuffer(); List params = new ArrayList(); updateSql.append(" update green_food_feature g LEFT JOIN ") .append(" (select count(gv.feature_id) vote_no,gf.id from green_food_feature gf ") .append(" LEFT JOIN green_food_vote gv on gf.id = gv.feature_id where gf.activity_no = ? ") .append(" GROUP BY gf.id ORDER BY vote_no desc,gv.gmt_created desc ") .append(" limit 0, ? ) t on g.id = t.id ") .append(" set g.vote_no = t.vote_no where g.activity_no = ? "); params.add(no); params.add(limit); params.add(no); hibernateDao.executeSqlUpdate(updateSql.toString(), params.toArray()); System.out.println("*****************推荐菜投票结果更新完成*****************"); } // /** * 理发预约定时任务推送 */ @SuppressWarnings("unchecked") //@Scheduled(cron = "0 30 8,9,10,11,12,13,14,15,16,17,18 * * ?") public void sendBookMessage() { try { final ExecutorService taskExecutorService = Executors.newFixedThreadPool(2); // 查询理发预约前30分钟的预约信息 String appListSql = " SELECT ui.login_name FROM GREEN_APPLY_LIST al INNER JOIN GREEN_HAIRCUT_INFO hi ON al.detail_id = hi.id AND al.apply_type = '06' AND hi.is_deleted='N'" + " INNER JOIN GREEN_USER_INFO ui ON al.user_id = ui.id WHERE 1 = 1 AND hi.apply_date = DATE_FORMAT(NOW(),'%Y-%m-%d')" + " AND DATE_FORMAT(DATE_SUB(NOW(),INTERVAL -30 MINUTE),'%H:%i') BETWEEN LEFT(hi.apply_time,5) AND RIGHT(hi.apply_time,5)"; List> userList = hibernateDao.queryForListWithSql(appListSql); final String msgname = "预约通知"; final String tm = "您预约的【理发】还有半个小时就开始啦,请前往理发店完成服务"; if (userList.size() > 0) { for (int i = 0; i < userList.size(); i++) { Map userMap = userList.get(i); final String userName = userMap.get("login_name"); taskExecutorService.execute(new Runnable() { public void run() { try { PushMessageUtil.getInstance().pushMessage(msgname, tm, userName, hibernateDao); } catch (IOException e) { } } }); } } } catch (Exception e) { e.printStackTrace(); } } /** * 向理发师余额表里插入当前日期向后推算三十天的信息 * 0 0/1 * * * ? */ @SuppressWarnings("unchecked") @Scheduled(cron = "0 0/1 * * * ?") public void addHaircutRemain() { try { // 记录当前日期到后三十天内的所有日期(含当前日期) List nowDateList = new ArrayList(); // 记录添加数据库里的数据集合 List dataList = new ArrayList(); // 记录添加数据库里的数据集合中的每一个对象 List dataObjList = new ArrayList(); String insertSql = "INSERT INTO GREEN_HAIRCUT_REMAIN(id,barbershop,barber_id,haircut_date,haircut_time_id,haircut_remain,remain_status,creator,modifier,GMT_CREATED,GMT_MODIFIED,IS_DELETED ) VALUES (?,?,?,?,?,?,?,?,?,SYSDATE,SYSDATE,'N')"; // 查询理发师余总额记录 String haircutTotalSql = " SELECT * FROM GREEN_HAIRCUT_TOTAL ht WHERE ht.is_deleted = 'N'" + " AND ht.total_status = '0' AND ht.barber_id = ?"; // 查询理发师余额表中的预约日期 //String haircutDateSql = " SELECT bi.id AS barber_id,GROUP_CONCAT(DISTINCT hr.haircut_date ORDER BY hr.haircut_date) AS haircut_date" // + " FROM GREEN_BARBER_INFO bi LEFT JOIN GREEN_HAIRCUT_REMAIN hr ON bi.id = hr.barber_id GROUP BY bi.id"; String haircutDateSql = " select t.barber_id AS barber_id," + "rtrim(xmlagg(XMLELEMENT(e,haircut_date,',').EXTRACT('//text()')order by haircut_date ).getclobval(),',') as haircut_date " + "from(SELECT bi.id AS barber_id, hr.haircut_date FROM GREEN_BARBER_INFO bi " + "LEFT JOIN GREEN_HAIRCUT_REMAIN hr ON bi.id = hr.barber_id " + "GROUP BY bi.id,hr.haircut_date order by bi.id desc)t " + "group by t.barber_id "; // 执行sql List haircutDateList = hibernateDao.queryForListWithSql(haircutDateSql, new BeanPropertyRowMapper(GreenHaircutRemain.class)); String remainSeqSql = "select max_id from green_seq where table_name = 'GREEN_HAIRCUT_REMAIN'"; int maxId = hibernateDao.queryForIntWithSql(remainSeqSql); System.out.println(maxId); // int maxId = 100000; for (GreenHaircutRemain greenHaircutRemain : haircutDateList) { // 获取当前日期到后三十天内的所有日期(含当前日期) nowDateList = getNextThirtyDate(); // 获取理发师余额表中的预约日期 String haircutDateStr = greenHaircutRemain.getHaircutDate() == null ? "" : greenHaircutRemain.getHaircutDate(); // 判断从当前日期到向后推算三十天的日期中,理发余额表里缺少哪些日期 nowDateList.removeAll(Arrays.asList(haircutDateStr.split(","))); // 执行sql List haircutTotalList = hibernateDao.queryForListWithSql(haircutTotalSql, new Object[] { greenHaircutRemain.getBarberId() }, new BeanPropertyRowMapper(GreenHaircutTotal.class)); // 循环执行添加操作 for (String nowDateStr : nowDateList) { for (GreenHaircutTotal greenHaircutTotal : haircutTotalList) { // 手动填入主键 // Long seqId = new Date().getTime(); dataObjList.add(maxId); maxId++; // 理发店所在地 dataObjList.add(greenHaircutTotal.getBarbershop()); // 理发师 dataObjList.add(greenHaircutTotal.getBarberId()); // 理发日期 dataObjList.add(nowDateStr); // 理发时间段 dataObjList.add(greenHaircutTotal.getHaircutTimeId()); // 理发余额 DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; date = format1.parse(nowDateStr); List> list1 = geenDictionaryInfoController.getDictionaryInfo("taskHairDate"); String endTime = list1.get(0).get("data_value").toString(); Date date2 = format1.parse(endTime); long beginMillisecond = date.getTime(); long endMillisecond = date2.getTime(); if (beginMillisecond < endMillisecond) { List> list = geenDictionaryInfoController.getDictionaryInfo("taskHairTol"); String haircutTotal = list.get(0).get("data_value").toString(); dataObjList.add(haircutTotal); } else { dataObjList.add(greenHaircutTotal.getHaircutTotal()); } // 当前状态 0 启用 1 禁用 dataObjList.add("0"); // 创建者 dataObjList.add("admin"); // 修改者 dataObjList.add("admin"); // 将数据对象添加到集合中 dataList.add(dataObjList.toArray()); // 初始化 dataObjList = new ArrayList(); // seqId++; } } } // 向余额表里批量插入数据 hibernateDao.batchUpdateWithSql(insertSql, dataList); hibernateDao.executeSqlUpdate("update GREEN_SEQ set max_id = ? WHERE table_name = 'GREEN_HAIRCUT_REMAIN'",new Object[]{ maxId}); // 清除余额表里小于当前日期的数据 // String deleteRemainSql = "DELETE FROM GREEN_HAIRCUT_REMAIN WHERE // TIMESTAMPDIFF(SECOND,CONCAT(haircut_date),DATE_FORMAT(NOW(),'%Y-%m-%d'))>0"; String deleteRemainSql = "DELETE FROM GREEN_HAIRCUT_REMAIN WHERE haircut_date < TO_CHAR(SYSDATE,'YYYY-MM-DD')"; // 执行sql hibernateDao.executeSqlUpdate(deleteRemainSql); } catch (Exception e) { e.printStackTrace(); // 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } /** * 1.将预约时间小于当前时间的理发预约变为已完成状态 * 2.大于预约开始时间小于结束时间的状态变为进行中 */ @SuppressWarnings({ "unchecked" }) //@Scheduled(cron = "0 0/30 * * * ?") @Transactional(rollbackFor = Exception.class) public void updateHaircutStatus() { try { // 更新sql String updateRemainSql = "UPDATE GREEN_APPLY SET status = ?, gmt_modified = ? WHERE id = ? "; // 查询预约时间小于当前时间的理发预约 String sql = " SELECT al.id,CONCAT(hi.apply_date,' ',LEFT(hi.apply_time,5)) AS start_date," + " CONCAT(hi.apply_date,' ',RIGHT(hi.apply_time,5)) AS end_date" + " FROM GREEN_APPLY al" + " INNER JOIN GREEN_HAIRCUT_INFO hi ON al.detail_id = hi.id" + " WHERE al.apply_type = '06' AND al.status NOT IN('3','9')"; // 执行sql List> queryList = hibernateDao.queryForListWithSql(sql); // 修改预约状态 for (Map map : queryList) { // 理发预约开始时间 Date startDate = changeDate(map.get("start_date")); // 理发预约结束时间 Date endDate = changeDate(map.get("end_date")); // 如果时间格式转换有误则跳过该条数据 if (startDate == null || endDate == null) { continue; } else { // 当前时间 Date nowDate = new Date(); // 如果当前时间大于预约的开始时间小于预约结束时间将其状态变为进行中,如果当前时间大于结束时间将其状态变为已完成 if (nowDate.getTime() >= startDate.getTime() && nowDate.getTime() <= endDate.getTime()) { // 更新 hibernateDao.executeSqlUpdate(updateRemainSql, new Object[] { Constant.HAIRCUT_DING, nowDate, map.get("id") }); } else if (nowDate.getTime() >= endDate.getTime()) { // 更新 hibernateDao.executeSqlUpdate(updateRemainSql, new Object[] { Constant.HAIRCUT_FINISH, nowDate, map.get("id") }); } } } } catch (Exception e) { e.printStackTrace(); // 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } /** * 定时三小时清除数据防重集合种的键 */ @SuppressWarnings({ "unchecked" }) @Scheduled(cron = "0 */3 * * * ?") @Transactional(rollbackFor = Exception.class) public void clearKey() { Utils.list.clear(); } /** * 获取当前日期到后三十天内的所有日期(含当前日期) * * @return */ public List getNextThirtyDate() { // 日期list List dateList = new ArrayList(); // 实例化SimpleDateFormat SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 实例化日历类Calendar Calendar calendar = Calendar.getInstance(); // 循环获取后三十天的日期 for (int i = 0; i < 30; i++) { // 添加当前时间 calendar.setTime(new Date()); // 增加一天 calendar.add(Calendar.DATE, i); // 将日期放入集合 dateList.add(sdf.format(calendar.getTime())); } // 返回信息 return dateList; } /** * 提前半小时告知理发预约 */ @SuppressWarnings({ "unchecked" }) //@Scheduled(cron = "0 */1 * * * ?") @Transactional(rollbackFor = Exception.class) public void remindHaircut() { try { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm"); String ymd = sdf.format(date).split(" ")[0]; String barbershop = "1"; Integer week = new Integer(new DateTime(date).getDayOfWeek()); if(week==1||week==3||week==5){ barbershop="2"; } // 返回结果list List> resultList = (List>)(greenHaircutInfoController.getBasicInfoForBarber(ymd,barbershop).get(0).get("remain")); for(int i=0;i29*60*1000 &&countData>0){ String userId = (String) resultList.get(i).get("user_id"); String title = "理发预约"; String text = "您好,您预约的理发即将开始("+startTime+"),请安排好您的时间。"; String url = "/pages/haircut/haircut?currentTabIndex=1"; aliasManageController.pushToSingle(userId,title , text, url); break; } } } catch (Exception e) { e.printStackTrace(); } } /** * 提醒理发评价 */ @SuppressWarnings({ "unchecked" }) //@Scheduled(cron = "0 */1 * * * ?") @Transactional(rollbackFor = Exception.class) public void remindHaircutForEnd() { try { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm"); String ymd = sdf.format(date).split(" ")[0]; String barbershop = "1"; Integer week = new Integer(new DateTime(date).getDayOfWeek()); if(week==1||week==3||week==5){ barbershop="2"; } // 返回结果list List> resultList = (List>)(greenHaircutInfoController.getBasicInfoForBarber(ymd,barbershop).get(0).get("remain")); for(int i=0;i0&&date.getTime()-startTimes<=60*1000){ String userId = (String) resultList.get(i).get("user_id"); String title = "理发预约"; String text = "您好,您预约的理发已结束,请点击查看,并对我们的服务进行评价,谢谢配合。"; String url = "/pages/haircut/haircut?currentTabIndex=1"; aliasManageController.pushToSingle(userId,title , text, url); break; } } } catch (Exception e) { e.printStackTrace(); } } /** * 提前半小时告知洗车预约 */ @SuppressWarnings({ "unchecked" }) //@Scheduled(cron = "0 */1 * * * ?") @Transactional(rollbackFor = Exception.class) public void remindWashCar() { try { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm"); String ymd = sdf.format(date).split(" ")[0]; String sql = "select apply_time,apply_place,user_id from green_wash_car_info where del_flag=0 and apply_date=? and int_status=0"; // 返回结果list List> resultList = hibernateDao.queryForListWithSql(sql, new Object[]{ymd}); for(int i=0;i29*60*1000 ){ String userId = (String) resultList.get(i).get("user_id"); String title = "洗车预约"; String text = "您好,您预约的洗车即将开始("+startTime+"),请安排好您的时间。"; String url = "/pages/washcar/washCarReservation?currentTabIndex=1"; aliasManageController.pushToSingle(userId,title , text, url); break; } } } catch (Exception e) { e.printStackTrace(); } } /** * 提醒洗车评价 */ @SuppressWarnings({ "unchecked" }) //@Scheduled(cron = "0 */1 * * * ?") @Transactional(rollbackFor = Exception.class) public void remindWashCarForEnd() { try { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm"); String ymd = sdf.format(date).split(" ")[0]; String sql = "select apply_time,apply_place,user_id from green_wash_car_info where del_flag=0 and apply_date=? and int_status=0 "; // 返回结果list List> resultList = hibernateDao.queryForListWithSql(sql, new Object[]{ymd}); for(int i=0;i0&&date.getTime()-startTimes<=60*1000){ String userId = (String) resultList.get(i).get("user_id"); String title = "洗车预约"; String text = "您好,您预约的洗车已结束,请点击查看,并对我们的服务进行评价,谢谢配合。"; String url = "/pages/washcar/washCarReservation?currentTabIndex=1"; aliasManageController.pushToSingle(userId,title , text, url); break; } } } catch (Exception e) { e.printStackTrace(); } } /** * 周三周五早上八点半通知外卖取货 */ @SuppressWarnings({ "unchecked" }) //@Scheduled(cron = "0 30 08 ? * FRI") @Transactional(rollbackFor = Exception.class) public void remindPickUp() { try { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm"); String ymd = sdf.format(date).split(" ")[0]; String sql = "Select user_id,take_food_place,take_food_time from GREEN_FOOD_ORDER_LIST where is_deleted = 'N' and take_food_time = ? and order_status <> 0 "; // 返回结果list List> resultList = hibernateDao.queryForListWithSql(sql, new Object[]{ymd}); for(int i=0;i> resultList = hibernateDao.queryForListWithSql(sql, new Object[]{ymd}); for(int i=0;i29*60*1000 ){ String userId = (String) resultList.get(i).get("apply_id"); String xm = (String) resultList.get(i).get("project_name"); String title = "就诊预约"; String text = "您好,您的就诊即将开始,就诊时间:"+time+",就诊项目:"+xm+",请安排好您的时间。"; String url = "/pages/medical/see-doctor?currentTabIndex=1"; aliasManageController.pushToSingle(userId,title , text, url); break; } } } catch (Exception e) { e.printStackTrace(); } } /** * 提醒就诊评价 */ @SuppressWarnings({ "unchecked" }) //@Scheduled(cron = "0 */1 * * * ?") @Transactional(rollbackFor = Exception.class) public void remindSeeDoctorForEnd() { try { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm"); String ymd = sdf.format(date).split(" ")[0]; String sql = "Select project_info_name,apply_id,project_name from green_seekmedical_record where is_deleted='N' AND apply_date=? and status=0"; // 返回结果list List> resultList = hibernateDao.queryForListWithSql(sql, new Object[]{ymd}); for(int i=0;i0&&date.getTime()-startTimes<=60*1000){ String userId = (String) resultList.get(i).get("apply_id"); String xm = (String) resultList.get(i).get("project_name"); String title = "就诊预约"; String text = "您好,您的就诊已结束,请点击查看,并对我们的服务进行评价,谢谢配合。"; String url = "/pages/medical/see-doctor?currentTabIndex=1"; aliasManageController.pushToSingle(userId,title , text, url); break; } } } catch (Exception e) { e.printStackTrace(); } } /** * 图片同步服务 */ @SuppressWarnings({ "unchecked" }) @Scheduled(cron = "0 0 23 * * ?") // @Scheduled(cron = "0 30 17 * * ?") @Transactional(rollbackFor = Exception.class) public void getWebImage() { try { System.out.println("getWebImage"); String sql = "select id,IMAGE_CONTENT_BLOB from green_image_info where IMAGE_STATUS = '1'"; // 返回结果list List> resultList = hibernateDao.queryForListWithSql(sql); String id = null; byte[] iamgeContent = null; String path = baseService.getWebImgDir();//"/home/appImageDir/zhhq_sj/";// for(int i=0;i