yujian
2019-10-21 f780acfbda0ce34cf95eddc8a772266d90ef0635
商品更新-代码优化
4个文件已修改
580 ■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/controller/admin/BoutiqueAutoRuleAdminController.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/job/QualityFactoryJob.java 301 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/job/QuartzManager.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/lable/BoutiqueAutoRuleServiceImpl.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/admin/BoutiqueAutoRuleAdminController.java
@@ -338,7 +338,6 @@
    @RequestMapping(value = "delete")
    public void delete(String callback, Long id, PrintWriter out) {
        try {
            if (id == null) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请传递正确参数"));
                return;
@@ -372,11 +371,8 @@
     */
    @RequestMapping(value = "shutdownJobs")
    public void shutdownJobs(String callback, PrintWriter out) {
        try {
            boutiqueAutoRuleService.shutdownJobs();
        } catch (Exception e) {
            e.printStackTrace();
        }
@@ -388,16 +384,12 @@
     * @param boutiqueAutoRule
     */
    public void transformJsonString(BoutiqueAutoRule boutiqueAutoRule){
        JSONObject data = new JSONObject();
        Integer source = boutiqueAutoRule.getSource();
        // 类目id
        if (source.equals(BoutiqueAutoRule.TB_OPTIONAL)) {
            // 类目id
            data.put("systemCid", boutiqueAutoRule.getClassName());
        }
        
        if (boutiqueAutoRule.getKey() != null){
            // 搜索关键词
@@ -446,8 +438,6 @@
            data.put("endZkPrice", boutiqueAutoRule.getEndZkPrice()); 
        }
        if ( boutiqueAutoRule.getStartPrice() != null){
            // 券后价范围小值
            data.put("startPrice", boutiqueAutoRule.getStartPrice());
@@ -509,24 +499,24 @@
        
        // 请求最大页码
        if (boutiqueAutoRule.getClassName() != null){
            if (source.equals(BoutiqueAutoRule.TB_OPTIONAL) || source== BoutiqueAutoRule.TB_OPTIONAL) {
                String classId = boutiqueAutoRule.getClassName();
                if (!StringUtil.isNullOrEmpty(classId)){
                    GoodsClass rb = goodsClassService.getGoodsClass(Long.parseLong(classId));
                    if (rb != null) {
                        data.put("sourceCalss", rb.getName()); 
                        boutiqueAutoRule.setSourceCalss(rb.getName());
                    } 
                }
            }  else if (source.equals(BoutiqueAutoRule.TB_MATERIAL) || source == BoutiqueAutoRule.TB_MATERIAL) {
                String subName = boutiqueAutoRule.getSubclassName();
                String superName = boutiqueAutoRule.getClassName();
                if (StringUtil.isNullOrEmpty(subName)) {
                    data.put("sourceCalss", superName); 
                    boutiqueAutoRule.setSourceCalss(superName);
                } else {
                    data.put("sourceCalss", superName +" "+ subName); 
                    boutiqueAutoRule.setSourceCalss(superName +" "+ subName);
                }
            }
        }
@@ -541,7 +531,6 @@
     * @param boutiqueAutoRule
     */
    public void jsonTransformString(BoutiqueAutoRule boutiqueAutoRule){
        String searchContent = boutiqueAutoRule.getSearchContent();
        if (StringUtil.isNullOrEmpty(searchContent)) {
            return;
@@ -647,7 +636,6 @@
            // 是否包邮:1 有 0 无
            boutiqueAutoRule.setMaxPage((int)jsonData.get("maxPage")); 
        }
    }
    
    /**
@@ -758,12 +746,9 @@
        
        // 生效时间
        Date startTime = boutiqueAutoRule.getStartTime();
        // 失效时间
        Date endTime = boutiqueAutoRule.getEndTime();
        if (endTime != null) {
            if (startTime != null && startTime.getTime() > endTime.getTime()){
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("生效时间不能大于失效时间"));
                return false;
@@ -774,26 +759,13 @@
            calendar.set(Calendar.HOUR, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            boutiqueAutoRule.setEndTime(calendar.getTime());
        }
        
        if (startTime == null) {
             boutiqueAutoRule.setStartTime(new Date());
        }
        return true;
    }
    public static void main(String[] args) {
        String s = "abacada";
        if (s.contains("a")) {
            System.out.println(1);
        } else {
            System.out.println(0);
        }
    }
    
}
fanli/src/main/java/com/yeshi/fanli/job/QualityFactoryJob.java
@@ -30,8 +30,6 @@
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import net.sf.json.JSONObject;
/**
 * 精选商品自动入库
 * 
@@ -69,63 +67,22 @@
    public void searchGoods(JobExecutionContext context) {
        try {
            JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
            BoutiqueAutoRule autoRule = new BoutiqueAutoRule();
            /* 规则id */
            if (jobDataMap.get("ruleId") != null && !StringUtil.isNullOrEmpty(jobDataMap.get("ruleId").toString())) {
                Long ruleId = Long.parseLong(jobDataMap.get("ruleId").toString());
                autoRule.setId(ruleId);
            Object object = jobDataMap.get("key");
            if (object == null) {
                return;
            }
            /* 筛选条件 */
            JSONObject jsonData = null;
            if (jobDataMap.get("searchContent") != null) {
                String jsonContent = jobDataMap.get("searchContent").toString();
                jsonData = JSONObject.fromObject(jsonContent);
            }
            if (jsonData == null) {
                jsonData = new JSONObject();
            }
            /* 来源名称 */
            if (jsonData.get("sourceCalss") != null
                    && !StringUtil.isNullOrEmpty(jsonData.get("sourceCalss").toString())) {
                String sourceCalss = jsonData.get("sourceCalss").toString();
                autoRule.setSourceCalss(sourceCalss);
            }
            /* 规则名称 */
            String title = "";
            if (jsonData.get("title") != null && !StringUtil.isNullOrEmpty(jsonData.get("title").toString())) {
                title = jsonData.get("title").toString();
            }
            autoRule.setTitle(title);
            /* 系统类目id */
            String systemCid = "";
            if (jsonData.get("systemCid") != null && !StringUtil.isNullOrEmpty(jsonData.get("systemCid").toString())) {
                systemCid = jsonData.get("systemCid").toString();
            }
            autoRule.setSystemCid(systemCid);
            BoutiqueAutoRule autoRule = (BoutiqueAutoRule) object;
            /* 操作人: 开发账号 */
            AdminUser admin = new AdminUser(2L);
            autoRule.setAdminUser(admin);
            /* 标签列表 */
            List<Label> listLabs = new ArrayList<Label>();
            if (jsonData.get("lableNames") != null
                    && !StringUtil.isNullOrEmpty(jsonData.get("lableNames").toString())) {
                // 空格隔开
                String[] arrtitles = jsonData.get("lableNames").toString().split("\\s+");
                // 获取标签属性
            String lableNames = autoRule.getLableNames();
            if (!StringUtil.isNullOrEmpty(lableNames)) {
                String[] arrtitles = lableNames.split("\\s+"); // 空格隔开
                for (String name : arrtitles) {
                    Label label = labelService.getByTitleCache("labKey", name.trim());
                    if (label == null) {
@@ -134,20 +91,13 @@
                    listLabs.add(label);
                }
            }
            int source = Integer.parseInt(jobDataMap.get("source").toString());
            autoRule.setSource(QualityFactory.SOURCE_TAOBAO);
            // 1、来源淘宝普通接口
            if (BoutiqueAutoRule.TB_OPTIONAL == source) {
            if (BoutiqueAutoRule.TB_OPTIONAL == autoRule.getSource()) { // 1、来源淘宝普通接口
                autoRule.setGoodsSource(QualityFactory.SOURCE_TAOBAO);
                searchTaoBao(jsonData, listLabs, autoRule);
            }
            // 2、淘宝推荐
            if (BoutiqueAutoRule.TB_MATERIAL == source) {
                searchTaoBao(listLabs, autoRule);
            } else if (BoutiqueAutoRule.TB_MATERIAL == autoRule.getSource()) { // 2、淘宝推荐
                autoRule.setGoodsSource(QualityFactory.SOURCE_TAOBAO_MATERIAL);
                searchMaterial(jsonData, listLabs, autoRule);
                searchMaterial(listLabs, autoRule);
            }
        } catch (Exception e) {
@@ -166,13 +116,9 @@
     * 
     * @param jobDataMap
     */
    private void searchTaoBao(JSONObject jsonData, List<Label> listLabs, BoutiqueAutoRule autoRule) {
    private void searchTaoBao(List<Label> listLabs, BoutiqueAutoRule autoRule) {
        try {
            String formatDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
            // 页大小,默认100条
            int pageSize = 100;
            boolean isCrawl = true;
            // 权重起始
            int startWeight = 0;
@@ -189,14 +135,13 @@
            // 最多爬取页码
            int pageMax = 200;
            if (jsonData.get("maxPage") != null) {
                pageMax = Integer.parseInt(jsonData.get("maxPage").toString());
            if (autoRule.getMaxPage() != null) {
                pageMax = autoRule.getMaxPage();
            }
            /* 参数处理 */
            SearchFilter filter = getSearchFilter(jsonData);
            // 展示条目
            filter.setPageSize(pageSize);
            SearchFilter filter = getSearchFilter(autoRule);
            filter.setPageSize(100);
            for (int page = 1; page <= pageMax; page++) {
                filter.setPage(page);
@@ -228,25 +173,22 @@
                autoRule.setEndWeight(endWeight);
                // 筛选入库
                screen(listGoods, jsonData, filter, listLabs, autoRule);
                screen(listGoods, filter, listLabs, autoRule);
                
                /* 销售量小值 */
                int minSales = 0;
                if (jsonData.get("startSales") != null) {
                    minSales = (int) jsonData.get("startSales");
                if (autoRule.getStartSales() != null) {
                    minSales = autoRule.getStartSales();
                }
                /* 销售量大值 */
                int maxSales = 0;
                if (jsonData.get("endSales") != null) {
                    maxSales = (int) jsonData.get("endSales");
                if (autoRule.getEndSales() != null) {
                    maxSales = autoRule.getEndSales();
                }
                // 销量控制
                for (TaoBaoGoodsBrief goodsBrief : listGoods) {
                    int biz30day = goodsBrief.getBiz30day();
                    /* 验证销售量 -- 结束爬取数据 */
                    if (maxSales > 0 && minSales > 0 && (biz30day < minSales || biz30day > maxSales)) {
@@ -279,8 +221,8 @@
            }
            /* 更新完成后清理之前创建的数据 */
            if (jsonData.get("systemCid") != null && !StringUtil.isNullOrEmpty(jsonData.get("systemCid").toString())) {
                Long systemCid = Long.parseLong(jsonData.get("systemCid").toString());
            if (!StringUtil.isNullOrEmpty(autoRule.getSystemCid())) {
                Long systemCid = Long.parseLong(autoRule.getSystemCid());
                qualityFactoryService.deleteNotUpdateGoods(systemCid, formatDate, autoRule.getGoodsSource());
            }
@@ -299,7 +241,7 @@
     * 
     * @param jobDataMap
     */
    private void searchMaterial(JSONObject jsonData, List<Label> listLabs, BoutiqueAutoRule autoRule) {
    private void searchMaterial(List<Label> listLabs, BoutiqueAutoRule autoRule) {
        try {
            String formatDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
@@ -324,12 +266,11 @@
            // 最多爬取页码
            int pageMax = 200;
            if (jsonData.get("maxPage") != null) {
                pageMax = Integer.parseInt(jsonData.get("maxPage").toString());
            }
            if (autoRule.getMaxPage() != null)
                pageMax = autoRule.getMaxPage();
            /* 参数处理 */
            SearchFilter filter = getSearchFilter(jsonData);
            SearchFilter filter = getSearchFilter(autoRule);
            for (int page = 1; page <= pageMax; page++) {
@@ -356,7 +297,7 @@
                }
                // 筛选入库
                screen(listGoods, jsonData, filter, listLabs, autoRule);
                screen(listGoods, filter, listLabs, autoRule);
                
                // 总页数爬取完成
@@ -380,8 +321,8 @@
            }
            /* 更新完成后清理之前创建的数据 */
            if (jsonData.get("systemCid") != null && !StringUtil.isNullOrEmpty(jsonData.get("systemCid").toString())) {
                Long systemCid = Long.parseLong(jsonData.get("systemCid").toString());
            if (!StringUtil.isNullOrEmpty(autoRule.getSystemCid())) {
                Long systemCid = Long.parseLong(autoRule.getSystemCid());
                qualityFactoryService.deleteNotUpdateGoods(systemCid, formatDate, autoRule.getGoodsSource());
            }
@@ -401,93 +342,79 @@
     * @param jobDataMap
     * @return
     */
    public SearchFilter getSearchFilter(JSONObject jsonData) {
    public SearchFilter getSearchFilter(BoutiqueAutoRule autoRule) {
        SearchFilter filter = new SearchFilter();
        // 排序字段 销量高到低(默认)
        filter.setSort(TaoBaoUtil.SORT_SALE_HIGH_TO_LOW);
        // 搜索关键词
        filter.setKey(autoRule.getKey());
        // 官方推荐商品库投放ID;淘宝类目id集合
        filter.setCateIds(autoRule.getCateIds());
        if (jsonData.get("key") != null) {
            String key = jsonData.get("key").toString();
            if (!StringUtil.isNullOrEmpty(key)) {
                // 搜索关键词
                filter.setKey(key);
            }
        // 在售价范围小值
        if (autoRule.getStartZkPrice() != null) {
            filter.setStartPrice(new BigDecimal(autoRule.getStartPrice()));
        }
        if (jsonData.get("cateIds") != null) {
            // 官方推荐商品库投放ID;淘宝类目id集合
            filter.setCateIds(jsonData.get("cateIds").toString());
        // 在售价范围大值
        if (autoRule.getEndZkPrice() != null) {
            filter.setEndPrice(new BigDecimal(autoRule.getEndZkPrice()));
        }
        if (jsonData.get("startZkPrice") != null) {
            // 在售价范围小值
            Double startZkPrice = Double.valueOf(jsonData.get("startZkPrice").toString());
            filter.setStartPrice(new BigDecimal(startZkPrice));
        }
        if (jsonData.get("endZkPrice") != null) {
            // 在售价范围大值
            Double endZxPrice = Double.valueOf(jsonData.get("endZkPrice").toString());
            filter.setEndPrice(new BigDecimal(endZxPrice));
        }
        if (jsonData.get("startTkRate") != null) {
            // 佣金范围小值
            BigDecimal b = new BigDecimal(jsonData.get("startTkRate").toString());
        // 佣金范围小值
        if (autoRule.getStartTkRate() != null) {
            BigDecimal b = new BigDecimal(autoRule.getStartTkRate());
            double df = b.setScale(2, BigDecimal.ROUND_FLOOR).doubleValue();
            int tkRate = (int) (df * 100);
            filter.setStartTkRate(tkRate);
        }
        if (jsonData.get("endTkRate") != null) {
            // 佣金范围大值
            BigDecimal b = new BigDecimal(jsonData.get("endTkRate").toString());
        // 佣金范围大值
        if (autoRule.getEndTkRate() != null) {
            BigDecimal b = new BigDecimal(autoRule.getEndTkRate());
            double df = b.setScale(2, BigDecimal.ROUND_FLOOR).doubleValue();
            int tkRate = (int) (df * 100);
            filter.setEndTkRate(tkRate);
        }
        if (jsonData.get("isTmall") != null && jsonData.get("isTmall").toString().equals("1")) {
            // 是否天猫if ("1".equals(isTmall)) {
        // 是否天猫
        if (autoRule.getIsTmall() != null  && autoRule.getIsTmall() == 1) {
            filter.setTmall(true);
        }
        if (jsonData.get("hasCoupon") != null && jsonData.get("hasCoupon").toString().equals("1")) {
            // 是否有券:1 有 0 无
        // 是否有券:1 有 0 无
        if (autoRule.getHasCoupon() != null  && autoRule.getHasCoupon() == 1) {
            filter.setQuan(1);
        }
        if (jsonData.get("freeShipment") != null && jsonData.get("freeShipment").toString().equals("1")) {
            // 是否包邮:1 有 0 无
        // 是否包邮:1 有 0 无
        if (autoRule.getFreeShipment() != null  && autoRule.getFreeShipment() == 1) {
            filter.setBaoYou(true);
            // ip地址
            // filter.setIp("113.251.22.10");// 重庆
            filter.setIp("218.72.111.105");// 杭州
        }
        if (jsonData.get("needPrepay") != null && jsonData.get("needPrepay").toString().equals("1")) {
            // 是否消费保障:1有 0 无
        // 是否消费保障:1有 0 无
        if (autoRule.getNeedPrepay() != null  && autoRule.getNeedPrepay() == 1) {
            filter.setNeedPrepay(true);
        }
        if (jsonData.get("npxLevel") != null) {
            // 牛皮癣程度,取值:1:不限,2:无,3:轻微
            filter.setNpxLevel((int) jsonData.get("npxLevel"));
        // 牛皮癣程度,取值:1:不限,2:无,3:轻微
        if (autoRule.getNpxLevel() != null  && autoRule.getNpxLevel() == 1) {
            filter.setNpxLevel(autoRule.getNpxLevel());
        }
        if (jsonData.get("includePayRate30") != null && jsonData.get("includePayRate30").toString().equals("1")) {
            // 成交转化是否高于行业均值
        // 成交转化是否高于行业均值
        if (autoRule.getIncludePayRate30() != null  && autoRule.getIncludePayRate30() == 1) {
            filter.setIncludePayRate30(true);
        }
        if (jsonData.get("includeGoodRate") != null && jsonData.get("includeGoodRate").toString().equals("1")) {
            // 好评率是否高于行业均值 1 有 0 无
        // 好评率是否高于行业均值 1 有 0 无
        if (autoRule.getIncludeGoodRate() != null  && autoRule.getIncludeGoodRate() == 1) {
            filter.setIncludeGoodRate(true);
        }
        if (jsonData.get("includeRfdRate") != null && jsonData.get("includeRfdRate").toString().equals("1")) {
            // 退款率是否低于行业均值 1 有 0 无
        // 退款率是否低于行业均值 1 有 0 无
        if (autoRule.getIncludeRfdRate() != null  && autoRule.getIncludeRfdRate() == 1) {
            filter.setIncludeRfdRate(true);
        }
        return filter;
@@ -505,13 +432,13 @@
     * @param autoRule
     * @throws Exception
     */
    public void screen(List<TaoBaoGoodsBrief> taoBaoGoodsBriefs, JSONObject jsonData, SearchFilter filter,
    public void screen(List<TaoBaoGoodsBrief> taoBaoGoodsBriefs, SearchFilter filter,
            List<Label> listLabs, BoutiqueAutoRule autoRule)  {
        try {
            List<TaoBaoGoodsBrief> listGoods = new ArrayList<TaoBaoGoodsBrief>();
            for (TaoBaoGoodsBrief goodsBrief : taoBaoGoodsBriefs) {
                // 验证是否符合要求
                if (validate(filter, jsonData, goodsBrief, 1)) {
                if (validate(filter, autoRule, goodsBrief, 1)) {
                    listGoods.add(goodsBrief);
                }
            }
@@ -527,38 +454,34 @@
     * 
     * @return
     */
    public boolean validate(SearchFilter filter, JSONObject jsonData, TaoBaoGoodsBrief goodsBrief, int source) {
        /* 销售量小值 */
    public boolean validate(SearchFilter filter, BoutiqueAutoRule autoRule, TaoBaoGoodsBrief goodsBrief, int source) {
        int minSales = 0;
        if (jsonData.get("startSales") != null) {
            minSales = (int) jsonData.get("startSales");
        }
        if (autoRule.getStartSales() != null)
            minSales = autoRule.getStartSales();
        /* 销售量大值 */
        int maxSales = 0;
        if (jsonData.get("endSales") != null) {
            maxSales = (int) jsonData.get("endSales");
        }
        int biz30day = goodsBrief.getBiz30day();
        if (autoRule.getEndSales() != null)
            maxSales = autoRule.getEndSales();
        /* 验证销售量 */
        if (maxSales > 0 && minSales > 0 && (biz30day < minSales || biz30day > maxSales)) {
            return false;
        } else if (maxSales > 0 && biz30day > maxSales) {
            return false;
        } else if (minSales > 0 && biz30day < minSales) {
            return false;
        if (maxSales == 0 && minSales ==0) {
        } else {
            int biz30day = goodsBrief.getBiz30day();
            if (maxSales > 0 && minSales > 0 && (biz30day < minSales || biz30day > maxSales)) {
                return false;
            } else if (maxSales > 0 && biz30day > maxSales) {
                return false;
            } else if (minSales > 0 && biz30day < minSales) {
                return false;
            }
        }
        /* 验证比例 */
        if (BoutiqueAutoRule.TB_MATERIAL == source) {
            int startTkRate = filter.getStartTkRate();
            int endTkRate = filter.getEndTkRate();
            BigDecimal tkRate = goodsBrief.getTkRate();
            if (startTkRate > 0 && endTkRate > 0 && (tkRate.compareTo(new BigDecimal(startTkRate / 100)) < 0
                    || tkRate.compareTo(new BigDecimal(endTkRate / 100)) > 0)) {
                return false;
@@ -571,37 +494,33 @@
        /* 券后价范围下限 */
        BigDecimal startPrice = null;
        if (jsonData.get("startPrice") != null) {
            startPrice = new BigDecimal(jsonData.get("startPrice").toString());
        }
        if (autoRule.getStartPrice() != null)
            startPrice = new BigDecimal(autoRule.getStartPrice().toString());
        /* 券后价范围上限 */
        BigDecimal endPrice = null;
        if (jsonData.get("endPrice") != null) {
            endPrice = new BigDecimal(jsonData.get("endPrice").toString());
        }
        if (autoRule.getEndPrice() != null)
            endPrice = new BigDecimal(autoRule.getEndPrice().toString());
        /* 券后价--计算 */
        BigDecimal couponPrice = TaoBaoUtil.getAfterUseCouplePrice(goodsBrief);
        /* 验证在券后价 */
        if (startPrice != null && endPrice != null
                && (couponPrice.compareTo(startPrice) < 0 || couponPrice.compareTo(endPrice) > 0)) {
            return false;
        } else if (endPrice != null && couponPrice.compareTo(endPrice) > 0) {
            return false;
        } else if (startPrice != null && couponPrice.compareTo(startPrice) < 0) {
            return false;
        }
        /* 验证在是否有券 */
        if (filter.getQuan() > 0) {
            String couponInfo = goodsBrief.getCouponInfo();
            if (StringUtil.isNullOrEmpty(couponInfo)) {
        if (startPrice == null && endPrice == null) {
        } else {
            BigDecimal couponPrice = TaoBaoUtil.getAfterUseCouplePrice(goodsBrief);
            if (startPrice != null && endPrice != null
                    && (couponPrice.compareTo(startPrice) < 0 || couponPrice.compareTo(endPrice) > 0)) {
                return false;
            } else if (endPrice != null && couponPrice.compareTo(endPrice) > 0) {
                return false;
            } else if (startPrice != null && couponPrice.compareTo(startPrice) < 0) {
                return false;
            }
        }
        /* 验证在是否有券 */
        if (filter.getQuan() > 0) {
            String couponInfo = goodsBrief.getCouponInfo();
            if (StringUtil.isNullOrEmpty(couponInfo))
                return false;
        }
        return true;
    }
fanli/src/main/java/com/yeshi/fanli/job/QuartzManager.java
@@ -1,10 +1,8 @@
package com.yeshi.fanli.job;
import java.util.Iterator;
import java.util.Map;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
@@ -29,8 +27,8 @@
     * @param params
     * @param cls
     */
    public static void addJob(Scheduler sched, @SuppressWarnings("rawtypes") Class cls, String jobName,
            String time, Map<String, String> params) {
    public static void addJob(Scheduler sched, Class <? extends Job> jobClass, String jobName,
            String time, Object obj) {
        try {
            
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);
@@ -38,13 +36,9 @@
            
            if (trigger == null) {
                LogHelper.test("------addJob---任务创建-----" + jobName + "------- ");
                JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build();
                if (params != null) {
                    Iterator<String> its = params.keySet().iterator();
                    while (its.hasNext()) {
                        String key = its.next();
                        jobDetail.getJobDataMap().put(key, params.get(key));
                    }
                JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();
                if (obj != null) {
                    jobDetail.getJobDataMap().put("key", obj);
                }
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
                trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME)
@@ -72,27 +66,20 @@
     * @param params
     * @param cls
     */
    @SuppressWarnings("rawtypes")
    public static void modifyJob(Scheduler sched, Class cls, String jobName,
             String time, Map<String, String> params ) {
    public static void modifyJob(Scheduler sched, Class <? extends Job> jobClass, String jobName,
             String time, Object obj) {
        try {
            LogHelper.test("------modifyJob---任务修改-----" + jobName + "------- ");
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);
            CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
            
            if (trigger == null) {
            if (trigger == null)
                return;
            }
            
            // 删除原任务
            removeJob(sched, jobName);
            // 新建任务
            addJob(sched, QualityFactoryJob.class, jobName, time, params);
            addJob(sched, jobClass, jobName, time, obj);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
fanli/src/main/java/com/yeshi/fanli/service/impl/lable/BoutiqueAutoRuleServiceImpl.java
@@ -1,9 +1,7 @@
package com.yeshi.fanli.service.impl.lable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
@@ -19,6 +17,8 @@
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.lable.BoutiqueAutoRuleService;
import com.yeshi.fanli.util.StringUtil;
import net.sf.json.JSONObject;
@Service
public class BoutiqueAutoRuleServiceImpl implements BoutiqueAutoRuleService {
@@ -56,7 +56,6 @@
    @Transactional
    public void deleteBatchByPrimaryKey(List<Long> ids) throws BoutiqueAutoRuleException {
        for (Long id : ids) {
            // 删除
            boutiqueAutoRuleMapper.deleteByPrimaryKey(id);
        }
    }
@@ -100,61 +99,41 @@
        Integer source = boutiqueAutoRule.getSource();
        String cronTime = boutiqueAutoRule.getCronTime();
        // 不能为空: 触发时间、请求源、类目
        if (source == null || StringUtil.isNullOrEmpty(cronTime)) {
        if (source == null || StringUtil.isNullOrEmpty(cronTime))
            return;
        }
        Map<String, String> params = new HashMap<String, String>();
        params.put("source", source+"");
        params.put("searchContent", boutiqueAutoRule.getSearchContent());
        params.put("ruleId", boutiqueAutoRule.getId()+"");
        jsonTransformString(boutiqueAutoRule);
        
        // 任务名
        String JobName = "JOB_" + source + "_" + id;
        try {
            /* 新建任务 */
            if ("add".equalsIgnoreCase(type)) {
                QuartzManager.addJob(scheduler,QualityFactoryJob.class, JobName, cronTime, params);
                QuartzManager.addJob(scheduler,QualityFactoryJob.class, JobName, cronTime, boutiqueAutoRule);
            }
            /* 修改任务 */
            if ("modify".equalsIgnoreCase(type)) {
                QuartzManager.modifyJob(scheduler, QualityFactoryJob.class, JobName, cronTime, params);
                QuartzManager.modifyJob(scheduler, QualityFactoryJob.class, JobName, cronTime, boutiqueAutoRule);
            }
            /* 删除任务 */
            if ("delete".equalsIgnoreCase(type)) {
                QuartzManager.removeJob(scheduler, JobName);
            }
        } catch (Exception e) {
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
            LogHelper.errorDetailInfo(e);
        }
    }
    @Override
    public String setCronTime(String day, String time) {
        if (StringUtil.isNullOrEmpty(day) || StringUtil.isNullOrEmpty(time)) {
            return null;
        }
        String cronTime = null;
        if (day.contains("小时")) {
            
            String[] sts = time.split(":");
@@ -174,44 +153,31 @@
            if ("0".equals(minNumOne)) {
                minute = minute.substring(1, 2);
            }
            // 0 11 2/12 * * ?
            cronTime = 0 + " " + minute + " " + hour + "/" + day.replace("小时", "") + " * * ? ";
        }
        
        if (day.contains("天")) {
            String[] sts = time.split(":");
            // 小时
            String hour = sts[0];
            // 分
            String minute = sts[1];
            // 清除前面的0
            String hourNumOne = hour.substring(0, 1);
            if ("0".equals(hourNumOne)) {
                hour = hour.substring(1, 2);
            }
            // 清除前面的0
            String minNumOne = minute.substring(0, 1);
            if ("0".equals(minNumOne)) {
                minute = minute.substring(1, 2);
            }
                String[] sts = time.split(":");
                // 小时
                String hour = sts[0];
                // 分
                String minute = sts[1];
                // 清除前面的0
                String hourNumOne = hour.substring(0, 1);
                if ("0".equals(hourNumOne)) {
                    hour = hour.substring(1, 2);
                }
                // 清除前面的0
                String minNumOne = minute.substring(0, 1);
                if ("0".equals(minNumOne)) {
                    minute = minute.substring(1, 2);
                }
                // 0 34 3 1/5 * ?
                // 秒 小时 分 相隔天数
                cronTime = 0 + " " + minute + " " + hour + " " + "1/" + day.replace("天", "") + " * ?";
            // 0 34 3 1/5 * ?
            // 秒 小时 分 相隔天数
            cronTime = 0 + " " + minute + " " + hour + " " + "1/" + day.replace("天", "") + " * ?";
        }
        return cronTime;
    }
@@ -220,13 +186,12 @@
     */
    @Override
    public void startScheduler() {
        List<BoutiqueAutoRule> listStart = boutiqueAutoRuleMapper.queryStart();
        if (listStart != null && listStart.size() > 0) {
            for (BoutiqueAutoRule boutiqueAutoRule : listStart) {
                boolean validateDate = boutiqueAutoRuleService.validateDate(boutiqueAutoRule);
                if (validateDate) {
                    jsonTransformString(boutiqueAutoRule);
                    boutiqueAutoRuleService.setScheduler(boutiqueAutoRule, "add");
                }
            }
@@ -238,7 +203,6 @@
     */
    @Override
    public void shutdownJobs() throws Exception {
        /* 停止任务 */
        QuartzManager.shutdownJobs(scheduler);
@@ -246,25 +210,127 @@
    @Override
    public boolean validateDate(BoutiqueAutoRule boutiqueAutoRule) {
        long nowTime = new Date().getTime();
        Date endTime = boutiqueAutoRule.getEndTime();
        if (endTime != null) {
            long end = endTime.getTime();
            if (end - nowTime <= 0) {
                return false; // 结束时间已过
            } 
        }
        return true;
    }
    /**
     * json 转换未String
     * @param boutiqueAutoRule
     */
    public void jsonTransformString(BoutiqueAutoRule boutiqueAutoRule){
        String searchContent = boutiqueAutoRule.getSearchContent();
        if (StringUtil.isNullOrEmpty(searchContent)) {
            return;
        }
        JSONObject jsonData = JSONObject.fromObject(searchContent);
        if (jsonData.get("key") != null){
            // 搜索关键词
            boutiqueAutoRule.setKey(jsonData.get("key").toString());
        }
        if (jsonData.get("cateIds") != null){
            // 官方推荐商品库投放ID;淘宝类目id集合
            boutiqueAutoRule.setCateIds(jsonData.get("cateIds").toString());
        }
        if (jsonData.get("startTkRate") != null){
            // 佣金范围小值Double.valueOf(itoString());
            boutiqueAutoRule.setStartTkRate(Double.valueOf(jsonData.get("startTkRate").toString()));
        }
        if (jsonData.get("endTkRate") != null){
            // 佣金范围大值
             boutiqueAutoRule.setEndTkRate(Double.valueOf(jsonData.get("endTkRate").toString()));
        }
        if (jsonData.get("startSales") != null){
            // 销量小值
             boutiqueAutoRule.setStartSales((int)jsonData.get("startSales"));
        }
        if (jsonData.get("endSales") != null){
            // 销量大值
            boutiqueAutoRule.setEndSales((int)jsonData.get("endSales"));
        }
        if (jsonData.get("startZkPrice") != null){
            // 在售价范围小值
            boutiqueAutoRule.setStartZkPrice(Double.valueOf(jsonData.get("startZkPrice").toString()));
        }
        if (jsonData.get("endZkPrice") != null){
            // 在售价范围大值
            boutiqueAutoRule.setEndZkPrice(Double.valueOf(jsonData.get("endZkPrice").toString()));
        }
        if (jsonData.get("startPrice") != null){
            // 券后价范围小值
            boutiqueAutoRule.setStartPrice(Double.valueOf(jsonData.get("startPrice").toString()));
        }
        if (jsonData.get("endPrice") != null){
            // 券后价范围大值
            boutiqueAutoRule.setEndPrice(Double.valueOf(jsonData.get("endPrice").toString()));
        }
        if (jsonData.get("isTmall") != null){
            // 是否天猫
            boutiqueAutoRule.setIsTmall((int)jsonData.get("isTmall"));
        }
        if (jsonData.get("hasCoupon") != null){
            // 是否有券:1 有 0 无
            boutiqueAutoRule.setHasCoupon((int)jsonData.get("hasCoupon"));
        }
        if (jsonData.get("freeShipment") != null){
            // 是否包邮:1 有 0 无
            boutiqueAutoRule.setFreeShipment((int)jsonData.get("freeShipment"));
        }
        if (jsonData.get("needPrepay") != null){
            // 是否消费保障:1有 0 无
            boutiqueAutoRule.setNeedPrepay((int)jsonData.get("needPrepay"));
        }
        if (jsonData.get("npxLevel") != null){
            // 牛皮癣程度,取值:1:不限,2:无,3:轻微
            boutiqueAutoRule.setNpxLevel((int)jsonData.get("npxLevel"));
        }
        if (jsonData.get("includePayRate30") != null){
            // 成交转化是否高于行业均值        1 有 0 无
            boutiqueAutoRule.setIncludePayRate30((int)jsonData.get("includePayRate30"));
        }
        if (jsonData.get("includeGoodRate") != null){
            // 好评率是否高于行业均值            1 有 0 无
            boutiqueAutoRule.setIncludeGoodRate((int)jsonData.get("includeGoodRate"));
        }
        if (jsonData.get("includeRfdRate") != null){
            // 退款率是否低于行业均值             1 有 0 无
            boutiqueAutoRule.setIncludeRfdRate((int)jsonData.get("includeRfdRate"));
        }
        if (jsonData.get("lableNames") != null){
            boutiqueAutoRule.setLableNames(jsonData.get("lableNames").toString());
        }
        if (jsonData.get("maxPage") != null){
            // 是否包邮:1 有 0 无
            boutiqueAutoRule.setMaxPage((int)jsonData.get("maxPage"));
        }
    }
    public static void main(String[] args) {
        String t = "3小时";
        System.out.println(t.replace("小时", ""));
    }
}