package org.springblade.jfpt.parcel.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import io.swagger.models.auth.In; import org.springblade.jfpt.alarm.constant.AlarmTimeConstant; import org.springblade.jfpt.animalheat.util.ImageUtil; import org.springblade.jfpt.parcel.service.ParcelService; import org.springblade.jfpt.parcel.util.DateUtils; import org.springblade.jfpt.parcel.util.HttpClientUtils; import org.springblade.jfpt.parcel.util.JacksonUtil; import org.springblade.jfpt.parcel.util.PageList; import org.springblade.jfpt.parcel.vo.ConditionVo; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; import static org.springblade.core.tool.utils.DateUtil.now; /** * 包裹服务实现层 */ @Service public class ParcelServiceImpl implements ParcelService { @Value("${PARCEL_KEY}") private String PARCEL_KEY; @Value("${PARCEL_SECRET}") private String PARCEL_SECRET; @Value("${PARCEL_CONTRABAND_URL}") private String PARCEL_CONTRABAND_URL; @Value("${PARCEL_URL}") private String PARCEL_URL; @Value("${PARCEL_PICTURE_URL}") private String PARCEL_PICTURE_URL; @Value("${PARCEL_DETAIL_RUL}") private String PARCEL_DETAIL_RUL; @Value("${PARCEL_KIND_URL}") private String PARCEL_KIND_URL; @Value("${PARCEL_PRE_URL}") private String PARCEL_PRE_URL; /** * 获取违禁包裹统计数据,远程调用接口 * @param conditionVo 查询条件对象 status 状态码 0:本天 1:近7天 2:本月 3:本周 * @return */ @Override public List> parcelKindStatis(ConditionVo conditionVo) { //1.判空 if (null!=conditionVo.getStatus()) { //获取数据 List objectList = getParcelData(conditionVo,PARCEL_CONTRABAND_URL,PARCEL_KEY,PARCEL_SECRET); Map mapCode = new HashMap<>(); //遍历集合,存储所有的违禁包裹编码 for (Object object : objectList) { //取出list里面的值转为map Map objectMap = (Map) object; //将所有的违禁包裹编码存起来 mapCode.put(objectMap.get("objCode").toString(),objectMap.get("objCode").toString()); } //遍历违禁编码map数据 List> list = new ArrayList<>(); for (String value:mapCode.values()) { Integer count = 0; HashMap map = new HashMap<>(); for (Object object : objectList) { Map objectMap = (Map) object;//取出list里面的值转为map //将所有的违禁包裹编码存起来 if (value.equals(objectMap.get("objCode").toString())){ count+=Integer.parseInt(objectMap.get("objCount").toString()); map.put("name",objectMap.get("objName").toString()); map.put("value",count); } } list.add(map); } return list; } return null; } /** * 获取包裹统计数据,远程调用接口获取数据 * @param conditionVo 查询条件对象 status 状态码 0:本天 1:本周 2:本月 * @return */ @Override public Object getParcelStatis(ConditionVo conditionVo) { List list = new ArrayList<>();//返回 //1.判空 if (null!=conditionVo.getStatus()) { //2.获取数据 List objectList = getParcelData(conditionVo, PARCEL_URL, PARCEL_KEY, PARCEL_SECRET); if (null != objectList) { //3.创建时间集合,包裹集合数据 List listTime = new ArrayList<>(); List> parcelList = new ArrayList<>(); if (conditionVo.getStatus() == 1) { //3.获取今天之前的每一天数组 2021-3-12 arsn修改 listTime = DateUtils.pastDay(new SimpleDateFormat("yyyy-MM-dd").format(new Date())); List percelTimeList = new ArrayList<>(); for (Object object : objectList) { //4.取出list里面的值转为map Map objectMap = (Map) object; //5.将远程时间数据存入集合 percelTimeList.add(objectMap.get("dateStr").toString()); } for (String time : listTime) { //6.创建map,用于存储包裹数据 HashMap hashMap = new HashMap<>(); //7.如果远程数据哪天数据没有,则为0 if (!percelTimeList.contains(time)) { hashMap.put("dateStr", time); hashMap.put("checkCount", 0); hashMap.put("dangerCount", 0); parcelList.add(hashMap); } else { //8.遍历,分别取出数据 for (Object object : objectList) { //9.取出list里面的值转为map Map objectMap = (Map) object; String dateStr = objectMap.get("dateStr").toString(); //安检时间 Integer checkCount = Integer.parseInt(objectMap.get("checkCount").toString()); //安检包裹数量 Integer dangerCount = Integer.parseInt(objectMap.get("dangerCount").toString()); //违禁包裹数量 //10.判断,存入数据 if (time.equals(dateStr)) { Set> entries = objectMap.entrySet(); for (Map.Entry m : entries) { if (m.getKey().equals("checkCount")) { hashMap.put("checkCount", checkCount); hashMap.put("dateStr", dateStr); } if (m.getKey().equals("dangerCount")) { hashMap.put("dangerCount", dangerCount); } } } } //11.加入到集合中 parcelList.add(hashMap); } } } //12.封装数据 list.add(listTime); list.add(parcelList); list.add(getKindServenDataList(conditionVo)); //13.返回 return list; } } return null; } /** * 数据请求处理 * @param conditionVo 条件 * @param url url * @param key 请求Key * @param secret 请求 secret * @return */ private List getParcelData(ConditionVo conditionVo, String url, String key, String secret) { //1.创建map对象,用于存储请求接口的秘钥 Map map = new HashMap<>(); String startDate = null; String endDate = null; //2.2查询本天的数据 if (null!=conditionVo.getStatus()) { if (conditionVo.getStatus() == 0) { //3.获取本天开始时间和结束时间 startDate = DateUtils.getToday(); endDate = DateUtils.getToday(); } //2.2查询过去6天及当天的的数据 if (conditionVo.getStatus() == 1) { //3.获取过去6天及当天开始时间和结束时间 startDate = DateUtils.getPastDate(6, now()); endDate = DateUtils.getToday(); } //2.4查询本周的数据 if (conditionVo.getStatus() == 3) { //3.获取过去6天及当天开始时间和结束时间 startDate = DateUtils.getWeekStart(); endDate = DateUtils.getWeekEnd(); } //2.2查询本月的数据 if (conditionVo.getStatus() == 2) { //3.获取本月开始时间和结束时间 startDate = DateUtils.getMonthStart(); endDate = DateUtils.getMonthEnd(); } } //2.5 按时间条件查询 if (null!=conditionVo.getStartTime() && conditionVo.getStartTime()!="" && null != conditionVo.getEndTime() && conditionVo.getEndTime()!=""){ startDate = conditionVo.getStartTime().substring(0,10); System.out.println("startDate = " + startDate); endDate = conditionVo.getEndTime().substring(0,10); System.out.println("endDate = " + endDate); } map.put("startDate", startDate); map.put("endDate", endDate); //4.远程调用数据 String params = HttpClientUtils.httpPost(url, key, secret, map); //5.数据转换 Map data = (Map) JSONObject.parse(params); if (data.get("succ").toString().equals("ok")){ //6.返回数据 return JSON.parseArray(data.get("result").toString()); } return null; } /** * 查询包裹,违禁品总数 * @param conditionVo status 状态码 0:本天 1:本周 2:本月 * @return */ @Override public List selectParcelCount(ConditionVo conditionVo) { List list = new ArrayList<>(); //获取包裹数据 List parcelData = getParcelData(conditionVo, PARCEL_URL, PARCEL_KEY, PARCEL_SECRET); if (null!=parcelData) { //查询当天的包裹总数 Integer dangerCount = null; Integer contrabandCount = null; conditionVo.setStatus(0); if (conditionVo.getStatus() == 0) { for (Object object : parcelData) { //取出list里面的值转为map Map objectMap = (Map) object; dangerCount = Integer.parseInt(objectMap.get("dangerCount").toString()); //违禁包裹数量 contrabandCount = Integer.parseInt(objectMap.get("contrabandCount").toString()); //违禁物品数量 } } //封装数据 list.add(dangerCount); list.add(contrabandCount); //返回数据 return list; } return null; } /** * 查询7天内违禁品每天的数量(需筛选危险品) * @return */ @Override public Map selectParcelData(ConditionVo conditionVo) { HashMap map = new HashMap<>(); map.put("parcelData",getKindServenDataList(conditionVo)); return map; } /** * 获取危险违禁品7天内每天的数量集合 * @return */ public List getKindServenDataList(ConditionVo conditionVo){ if (null==conditionVo){ conditionVo.setStatus(1);//近7天status 为 1 } //获取数据 List objectList = getParcelData(conditionVo,PARCEL_CONTRABAND_URL,PARCEL_KEY,PARCEL_SECRET); if (null!=objectList) { //遍历违禁编码map数据 List times = DateUtils.pastDay(new SimpleDateFormat("yyyy-MM-dd").format(new Date())); List list = new ArrayList<>(); for (String time : times) { Integer count = 0; //遍历集合数据获取每一天的count for (Object object : objectList) { Map objectMap = (Map) object;//取出list里面的值转为map //对比时间和objCode,危险品,刀具,枪支等 if (time.equals(objectMap.get("dateStr").toString())) { // //枪支 // if (objectMap.get("objCode").toString().equals("gan")) { // count += Integer.parseInt(objectMap.get("objCount").toString()); // } // //刀具 // if (objectMap.get("objCode").toString().equals("knife")) { // count += Integer.parseInt(objectMap.get("objCount").toString()); // } // //爆炸物 // if (objectMap.get("objCode").toString().equals("boomExplosive")) { // count += Integer.parseInt(objectMap.get("objCount").toString()); // } //3-20 修改不筛选危险品,由第三方筛选好 count += Integer.parseInt(objectMap.get("objCount").toString()); } } list.add(count); } return list; } return null; } /** * 获取图片地址 * @param imgUrl 图片Url * @return */ @Override public Map getParcelPic(String imgUrl) { //截取图片imgKey信息 String[] imgKeys = imgUrl.split("=", imgUrl.length()); String imgKey = imgKeys[1]; //封装成map对象 HashMap map = new HashMap<>(); map.put("imgKey",imgKey); //执行http远程调用 String s = HttpClientUtils.doGetHeaderPictureBase64(PARCEL_PICTURE_URL, PARCEL_KEY, PARCEL_SECRET, map); //获取图片的长宽 Map imageMap = ImageUtil.getBase64ImageWidthAndHeight(s); //封装数据 imageMap.put("imgBase64",s); //返回 return imageMap; } /** * 获取包裹明细分页数据,远程调用api获取数据 * @param conditionVo 请求参数对象 * @return */ @Override public Object getParcelDetailPage(ConditionVo conditionVo) { Map result =(Map) getParcelDataPageList(conditionVo, PARCEL_DETAIL_RUL, PARCEL_KEY, PARCEL_SECRET).get("result"); if (null!=result) { // List dataList = JSONArray.parseArray(result.get("data").toString()); // System.out.println("dataList = " + dataList); // //遍历集合 // for (Object data:dataList) { // Map parcelData =(Map)data; // String imgUrl = parcelData.get("imgUrl").toString(); // //查询图片 PARCEL_PRE_URL // //截取图片imgKey信息 // String[] imgKeys = imgUrl.split("=", imgUrl.length()); // String imgKey = imgKeys[1]; // //封装成map对象 // HashMap map = new HashMap<>(); // map.put("imgKey",imgKey); // //执行http远程调用 // String s = HttpClientUtils.doGetHeaderPictureBase64(PARCEL_PICTURE_URL, PARCEL_KEY, PARCEL_SECRET, map); // //封装数据 // if (null!=s && s!="") { // parcelData.put("imgUrl", s); // } // } return JSONObject.parse(result.toString()); } return null; } /** * 获取包裹违禁品明细分页数据,远程调用api获取数据 * @param conditionVo 请求参数对象 * @return */ @Override public Object getParcelkindDetailPage(ConditionVo conditionVo) { //获取违禁品数据 String result = getParcelDataPageList(conditionVo, PARCEL_KIND_URL, PARCEL_KEY, PARCEL_SECRET).get("result").toString(); if (null!=result) { return JSONObject.parse(result); } return null; } /** * 远程调用api 获取违禁品详细数据 * @param conditionVo 条件 * @param url 违禁品详细数据Url * @param key key * @param secret 秘钥 * @return */ public Map getParcelDataPageList(ConditionVo conditionVo, String url, String key, String secret){ //1.创建map对象存储数据 HashMap map = new HashMap<>(); //2.条件判断 if (null!=conditionVo.getStartTime()){ map.put("startTime", conditionVo.getStartTime()); } if (null!=conditionVo.getEndTime()){ map.put("endTime", conditionVo.getEndTime()); } if (null!=conditionVo.getDecisioDiagramResult()){ map.put("decisioDiagramResult", conditionVo.getDecisioDiagramResult()); } if (null!=conditionVo.getCurrentPage()){ map.put("currentPage", conditionVo.getCurrentPage()); } if (null!=conditionVo.getPageSize()){ map.put("pageSize", conditionVo.getPageSize()); } //3.远程调用api 获取数据 String params = HttpClientUtils.httpPost(url, key, secret, map); Map paramsMap = (Map) JSONObject.parse(params); if (paramsMap.get("succ").toString().equals("ok")){ //4返回数据 return paramsMap; } //4返回数据 return null; } /** * 查询当前时间段违禁品总个数 * @param conditionVo * @return */ @Override public Integer selParcelTimeCount(ConditionVo conditionVo) { return selectParcelCount(conditionVo).get(1); } /** *查询当前时间段区间时间违禁品个数 * @param conditionVo * @return */ @Override public List selParcelTimeDis(ConditionVo conditionVo) { ArrayList> objectArrayList = new ArrayList<>(); //设置页码数 conditionVo.setCurrentPage(1); conditionVo.setPageSize(100); //获取数据 Map result =(Map) getParcelDataPageList(conditionVo, PARCEL_KIND_URL, PARCEL_KEY, PARCEL_SECRET).get("result"); if (null!=result) { List dataList = JSONArray.parseArray(result.get("data").toString()); objectArrayList.add(dataList); //取第一次获取到的数据总数,每次取100条,多于100分批次取 int totalSize = Integer.parseInt(result.get("totalSize").toString()); int i = totalSize/100+1; if (i>1){ for (int j=1;j result0 =(Map) getParcelDataPageList(conditionVo, PARCEL_KIND_URL, PARCEL_KEY, PARCEL_SECRET).get("result"); List dataLists = JSONArray.parseArray(result0.get("data").toString()); objectArrayList.add(dataLists); } } //合并集合 List collect = objectArrayList.stream().flatMap(List::stream).collect(Collectors.toList()); //筛选数据,返回数据 return getParcelTimeDis(collect); } return Arrays.asList(0,0,0,0,0,0,0,0,0,0,0,0); } /** * 筛选数据,分类返回 * @param collect 集合数据 * @return */ private List getParcelTimeDis(List collect) { List list = new ArrayList<>(); int count02 = 0; int count0204 = 0; int count0406 = 0; int count0608 = 0; int count0810 = 0; int count1012 = 0; int count1214 = 0; int count1416 = 0; int count1618 = 0; int count1820 = 0; int count2022 = 0; int count2224 = 0; //遍历集合 for (Object data:collect) { Map parcelData =(Map)data; try { long hours = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(parcelData.get("createTime").toString()).getHours(); if (hours>0 && hours< AlarmTimeConstant.TWO){ count02+=1; } if (hours>=AlarmTimeConstant.TWO && hours=AlarmTimeConstant.FOUR && hours=AlarmTimeConstant.SIX && hours=AlarmTimeConstant.EIGHT && hours=AlarmTimeConstant.TEN && hours=AlarmTimeConstant.TWEKVE && hours=AlarmTimeConstant.FOURTEEN && hours=AlarmTimeConstant.SIXTEEN && hours=AlarmTimeConstant.EIGHTEEN && hours=AlarmTimeConstant.TWENTY && hours=AlarmTimeConstant.TWENTY_TWO && hours