package com.fzzy.group.manager; import com.fzzy.common.manager.CommonManager; import com.fzzy.igds.constant.Constant; import com.fzzy.igds.constant.FoodVariety; import com.fzzy.igds.constant.RespCodeEnum; import com.fzzy.igds.data.*; import com.fzzy.igds.domain.*; import com.fzzy.igds.service.*; import com.fzzy.igds.utils.ContextUtil; import com.fzzy.igds.utils.DateUtil; import com.fzzy.igds.utils.NumberUtil; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.text.DecimalFormat; import java.util.*; import java.util.stream.Collectors; /** * @Description * @Author CZT * @Date 2025/12/11 15:48 */ @Slf4j @Component public class GroupManager { @Resource private CommonManager commonManager; @Resource private DicAreaService dicAreaService; @Resource private CoreDeptService deptService; @Resource private DepotService depotService; @Resource private CoreCompanyService coreCompanyService; @Resource private InoutRecordService inoutRecordService; @Resource private EventInfoService eventInfoService; @Resource private SnapRecordService snapRecordService; @Resource private SecCameraService cameraService; @Resource private BankService bankService; @Resource private PledgeContractService pledgeContractService; @Resource private PledgeContractDepotService pledgeContractDepotService; @Resource private GatewaySerService gatewaySerService; /** * 获取省及下属市州集合 * * @param areaCode * @return */ public List getArea(String areaCode) { DicArea area = dicAreaService.listDicAreaByCode(areaCode); if (null == area) { return null; } List list = new ArrayList<>(); list.add(area); if (Constant.AREA_TYPE_1.equals(area.getType())) { //市州级别,只查询伊犁 List children = dicAreaService.listData(null, null, "654000"); if (null != children && !children.isEmpty()) { for (DicArea child : children) { if (Constant.AREA_TYPE_2.equals(child.getType())) { //区县 List childrenItem = dicAreaService.listData(child.getCode(), null, null); if (null != childrenItem && !childrenItem.isEmpty()) { list.addAll(childrenItem); } } } list.addAll(children); } } return list; } /** * 获取对应省份及下属市州children * * @param areaCode * @return */ public List getAreaAndChild(String areaCode) { DicArea area = dicAreaService.listDicAreaByCode(areaCode); if (null == area) { return null; } List list = new ArrayList<>(); if (Constant.AREA_TYPE_1.equals(area.getType())) { //市州级别,只查询伊犁 List children = dicAreaService.listData(null, null, "654000"); if (null != children && !children.isEmpty()) { for (DicArea child : children) { if (Constant.AREA_TYPE_2.equals(child.getType())) { //区县 List childrenItem = dicAreaService.listData(child.getCode(), null, null); if (null != childrenItem && !childrenItem.isEmpty()) { child.setChildren(childrenItem); } } } area.setChildren(children); } } list.add(area); return list; } public List getBankAndChildDept(String areaCode) { DicArea area = dicAreaService.listDicAreaByCode(areaCode); if (null == area) { return null; } List areaChildren = new ArrayList<>(); List list = new ArrayList<>(); if (Constant.AREA_TYPE_1.equals(area.getType())) { //查询所有的质押合同 List pledgeContractList = pledgeContractService.listAll(null); //查询所有的库区 List depotList = deptService.listDept(null, ContextUtil.getCompanyId(), null); //查询所有的银行 List bankList = bankService.listAll(null); DicArea defaultBank = new DicArea(); defaultBank.setCode("-1"); defaultBank.setName("无质押银行"); defaultBank.setChildren(new ArrayList<>()); for (Dept dept : depotList) { Boolean isPledge = false; for (PledgeContract pledgeContract : pledgeContractList) { IgdsBaseParam param = new IgdsBaseParam(); param.setParentId(pledgeContract.getId()); List pledgeContractDepots = pledgeContractDepotService.listAll(param); if (null == pledgeContractDepots || pledgeContractDepots.isEmpty()) { continue; } //找到pledgeContractDepots中的deptId集合,并去重 List deptIdList = pledgeContractDepots.stream().map(PledgeContractDepot::getPledgeDept).distinct().collect(Collectors.toList()); if (deptIdList.contains(dept.getId())) { //从list中找到当前质押银行的数据 DicArea pledgeBank = null; int indexBank = -1; for (DicArea item : areaChildren) { if (pledgeContract.getPledgeBank().equals(item.getCode())) { pledgeBank = item; indexBank = areaChildren.indexOf(pledgeBank); break; } } if (null == pledgeBank) { //未找到质押银行数据则新建 pledgeBank = new DicArea(); pledgeBank.setCode(pledgeContract.getPledgeBank()); pledgeBank.setName("质押银行_" + pledgeContract.getPledgeBank()); //从银行数据中找到质押银行的信息 for (Bank bank : bankList) { if (pledgeContract.getPledgeBank().equals(bank.getId())) { pledgeBank.setName(bank.getName()); } } //添加质押银行下的库区数据 DicArea deptDic = new DicArea(); deptDic.setCode(dept.getId()); deptDic.setName(dept.getKqmc()); List children = pledgeBank.getChildren(); if (null == children) { pledgeBank.setChildren(new ArrayList<>()); } pledgeBank.getChildren().add(deptDic); //新增质押银行数据到list中 areaChildren.add(pledgeBank); isPledge = true; break; } else { //添加质押银行下的库区数据 DicArea deptDic = new DicArea(); deptDic.setCode(dept.getId()); deptDic.setName(dept.getKqmc()); List children = pledgeBank.getChildren(); if (null == children) { pledgeBank.setChildren(new ArrayList<>()); } pledgeBank.getChildren().add(deptDic); //更新list中的质押银行数据 areaChildren.set(indexBank, pledgeBank); isPledge = true; break; } } } if (!isPledge) { DicArea deptDic = new DicArea(); deptDic.setCode(dept.getId()); deptDic.setName(dept.getKqmc()); List children = defaultBank.getChildren(); if (null == children) { defaultBank.setChildren(new ArrayList<>()); } defaultBank.getChildren().add(deptDic); } } List defaultBankChildren = defaultBank.getChildren(); if (defaultBankChildren.size() > 0) { areaChildren.add(defaultBank); } area.setChildren(areaChildren); } list.add(area); return list; } /** * 获取用户下所有库区信息 * * @return */ public List getDeptList() { return deptService.getDeptByUserType(null); } /** * 获取库区封装信息 * * @param companyId * @return */ public List getDeptData(String companyId) { List list = new ArrayList<>(); GroupDeptData deptData; List deptList = deptService.getDeptByUserType(null); if (null != deptList && !deptList.isEmpty()) { List depotList; for (Dept dept : deptList) { deptData = new GroupDeptData(); deptData.setDeptId(dept.getId()); deptData.setDeptName(dept.getKqmc()); deptData.setCode(dept.getXzqhdm()); deptData.setCounty(dept.getXzqhmc()); deptData.setJd(dept.getJd()); deptData.setWd(dept.getWd()); //统计仓库数 depotList = depotService.getCacheDepotList(dept.getCompanyId(), dept.getId()); if (null != depotList && !depotList.isEmpty()) { for (Depot depot : depotList) { deptData.setDepotNumber(deptData.getDepotNumber() + 1); if (StringUtils.isNotBlank(depot.getPledgeBank())) { deptData.setDepotBankNumber(deptData.getDepotBankNumber() + 1); } if (null == depot.getStorageReal()) { depot.setStorageReal(0.0); } deptData.setStorageNum(deptData.getStorageNum() + depot.getStorageReal() / 1000); } } //统计出入库数量 InoutParam inoutParam = new InoutParam(); inoutParam.setDeptId(dept.getId()); inoutParam.setCompanyId(companyId); inoutParam.setStart(DateUtil.getCurZero(new Date())); inoutParam.setEnd(DateUtil.getNextZero(new Date())); List inoutRecords = inoutRecordService.listInout(inoutParam); if (null != inoutRecords && !inoutRecords.isEmpty()) { for (InoutRecord inoutRecord : inoutRecords) { if (Constant.TYPE_IN.equals(inoutRecord.getType())) { deptData.setInNum(deptData.getInNum() + 1); } if (Constant.TYPE_OUT.equals(inoutRecord.getType())) { deptData.setOutNum(deptData.getOutNum() + 1); } } } list.add(deptData); } } return list; } /** * 获取库区封装信息 * * @param companyId * @return */ public List getDepotData(String companyId) { List list = new ArrayList<>(); GroupDepotData depotData; List deptList = deptService.getDeptByUserType(null); if (null != deptList && !deptList.isEmpty()) { List depotList; for (Dept dept : deptList) { //统计仓库数 depotList = depotService.getCacheDepotList(dept.getCompanyId(), dept.getId()); if (null != depotList && !depotList.isEmpty()) { for (Depot depot : depotList) { depotData = new GroupDepotData(); depotData.setDeptId(dept.getId()); depotData.setDeptName(dept.getKqmc()); depotData.setCode(dept.getXzqhdm()); depotData.setCounty(dept.getXzqhmc()); depotData.setDepotId(depot.getId()); depotData.setDepotName(depot.getName()); if (null == depot.getStorageReal()) { depot.setStorageReal(0.0); } depotData.setStorageNum(depot.getStorageReal() / 1000); list.add(depotData); } } } } return list; } /** * 获取库区下监控信息 * * @param param * @return */ public PageResponse> cameraList(IgdsBaseParam param) { if (StringUtils.isBlank(param.getDeptId())) { return new PageResponse<>(RespCodeEnum.CODE_2000, null); } if (StringUtils.isBlank(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } List listCamera = cameraService.getCameraByDeptId(param.getCompanyId(), param.getDeptId()); return new PageResponse<>(RespCodeEnum.CODE_0000, listCamera); } /** * 大屏首页统计信息:企业数、库区数、仓库数、质押仓数、散粮及成品粮数、分品种库存数 * * @param param * @return */ public PageResponse getGroupIndexData(IgdsBaseParam param) { GroupIndexData indexData = new GroupIndexData(); //企业数 Integer companyNum = coreCompanyService.getCompanyNum(param.getCompanyId()); indexData.setCompanyNum(companyNum); //库区数 List deptList = deptService.getDeptByUserType(null); if (null != deptList) { indexData.setDeptNum(deptList.size()); } ///仓库数及质押仓库数 List depotList = depotService.getCacheDepotList(param.getCompanyId()); if (null != depotList) { Double foodSum = 0.0; Double packFoodSum = 0.0; indexData.setDepotNum(depotList.size()); //用于统计分品种库存 LinkedHashMap varietyMap = new LinkedHashMap<>(); for (Depot depot : depotList) { if (StringUtils.isNotBlank(depot.getPledgeBank())) { indexData.setDepotBankNum(indexData.getDepotBankNum() + 1); } if (null == depot.getStorageReal()) { depot.setStorageReal(0.0); } if (StringUtils.isNotBlank(depot.getStoreType()) && "2".equals(depot.getStoreType())) { packFoodSum += depot.getStorageReal() / 1000; } else { foodSum += depot.getStorageReal() / 1000; } if (depot.getStorageReal() > 0) { if (StringUtils.isBlank(depot.getFoodVariety())) { //设置为其他品类 depot.setFoodVariety("9999000"); } varietyMap.putIfAbsent(depot.getFoodVariety(), 0.000); varietyMap.put(depot.getFoodVariety(), varietyMap.get(depot.getFoodVariety()) + NumberUtil.keepPrecision(depot.getStorageReal() / 1000, 3)); } } for (String mapKey : varietyMap.keySet()) { if (varietyMap.get(mapKey) <= 0) { continue; } indexData.getXaxis().add(FoodVariety.getMsg(mapKey)); indexData.getSeriesData().add(new DecimalFormat("0.000").format(varietyMap.get(mapKey))); } indexData.setFoodSum(new DecimalFormat("0.000").format(foodSum)); indexData.setPackFoodSum(new DecimalFormat("0.000").format(packFoodSum)); } return new PageResponse<>(RespCodeEnum.CODE_0000, indexData); } /** * 大屏首页-库区信息统计 * * @param param * @return */ public PageResponse> indexDeptList(IgdsBaseParam param) { List list = new ArrayList<>(); GroupDeptData deptData; List deptList = deptService.getDeptByUserType(null); if (null != deptList && !deptList.isEmpty()) { List depotList; for (Dept dept : deptList) { deptData = new GroupDeptData(); deptData.setDeptId(dept.getId()); deptData.setDeptName(dept.getKqmc()); deptData.setCode(dept.getXzqhdm()); deptData.setCounty(dept.getXzqhmc()); deptData.setJd(dept.getJd()); deptData.setWd(dept.getWd()); //统计仓库数 depotList = depotService.getCacheDepotList(dept.getCompanyId(), dept.getId()); if (null != depotList && !depotList.isEmpty()) { for (Depot depot : depotList) { deptData.setDepotNumber(deptData.getDepotNumber() + 1); if (StringUtils.isNotBlank(depot.getPledgeBank())) { deptData.setDepotBankNumber(deptData.getDepotBankNumber() + 1); } if (null == depot.getStorageReal()) { depot.setStorageReal(0.0); } deptData.setStorageNum(deptData.getStorageNum() + depot.getStorageReal() / 1000); } } //统计出入库数量 InoutParam inoutParam = new InoutParam(); inoutParam.setDeptId(dept.getId()); inoutParam.setCompanyId(param.getCompanyId()); inoutParam.setStart(DateUtil.getCurZero(new Date())); inoutParam.setEnd(DateUtil.getNextZero(new Date())); List inoutRecords = inoutRecordService.listInout(inoutParam); if (null != inoutRecords && !inoutRecords.isEmpty()) { for (InoutRecord inoutRecord : inoutRecords) { if (Constant.TYPE_IN.equals(inoutRecord.getType())) { deptData.setInNum(deptData.getInNum() + 1); } if (Constant.TYPE_OUT.equals(inoutRecord.getType())) { deptData.setOutNum(deptData.getOutNum() + 1); } } } //统计AI事件数量 IgdsBaseParam igdsParam = new IgdsBaseParam(); igdsParam.setDeptId(dept.getId()); igdsParam.setCompanyId(param.getCompanyId()); igdsParam.setStart(DateUtil.getNewByDay(new Date(), -6)); igdsParam.setEnd(DateUtil.getNextZero(new Date())); List enevtList = eventInfoService.getListByParam(igdsParam); List resultEnevtList = new ArrayList<>(); for (EventInfo info : enevtList) { //当标签包含 卡车, 或者包含大写的英文字母(代表有车牌)时,添加进result if (StringUtils.isNotBlank(info.getTags())) { if (info.getTags().contains("卡车") || info.getTags().matches(".*[A-Z].*")) { resultEnevtList.add(info); } } } if (null != resultEnevtList && !resultEnevtList.isEmpty()) { deptData.setWarnNum7(resultEnevtList.size()); for (EventInfo eventInfo : resultEnevtList) { if (DateFormatUtils.format(new Date(), "yyyyMMdd").equals(DateFormatUtils.format(eventInfo.getTime(), "yyyyMMdd"))) { deptData.setDailyTotal(deptData.getDailyTotal() + 1); } } } //判断网关是否在线 GatewaySer cacheSerByDeptId = gatewaySerService.getCacheSerByDeptId(dept.getId()); if (null == cacheSerByDeptId || (null != cacheSerByDeptId && StringUtils.isNotBlank(cacheSerByDeptId.getStatus()) && cacheSerByDeptId.getStatus().equals(Constant.YN_N))) { deptData.setDailyTotal(-1); } list.add(deptData); } } return new PageResponse<>(RespCodeEnum.CODE_0000, list); } /** * 统计gis数据,只统计登录人下属的数据统计 * * @return */ public GroupGisData getGisData() { GroupGisData groupGisData = new GroupGisData(); //查询伊犁下属区县 //区县 List dicAreaList = dicAreaService.listData("654000", null, null); //统计区县下库区数 LinkedHashMap valuePieChart = new LinkedHashMap<>(); LinkedHashMap namePieChart = new LinkedHashMap<>(); if (null != dicAreaList && !dicAreaList.isEmpty()) { for (DicArea dicArea : dicAreaList) { valuePieChart.put(dicArea.getCode(), 0); namePieChart.put(dicArea.getCode(), dicArea.getName()); } } List deptList = deptService.getDeptByUserType(null); if (null != deptList && !deptList.isEmpty()) { //库区总数 groupGisData.setDeptNum(deptList.size()); for (Dept dept : deptList) { if (StringUtils.isBlank(dept.getXzqhdm()) || null == valuePieChart.get(dept.getXzqhdm())) { if (null == valuePieChart.get("999999")) { valuePieChart.put("999999", 0); namePieChart.put("999999", "其他区县"); } dept.setXzqhdm("999999"); } valuePieChart.put(dept.getXzqhdm(), valuePieChart.get(dept.getXzqhdm()) + 1); } } if (groupGisData.getDeptNum() > 0) { for (String mapKey : valuePieChart.keySet()) { groupGisData.getDeptList().add(new ChartPie(valuePieChart.get(mapKey) + "", namePieChart.get(mapKey), new DecimalFormat("0.0").format((double) valuePieChart.get(mapKey) / groupGisData.getDeptNum() * 100))); } } //统计重量 List depotList = depotService.getData(ContextUtil.getCompanyId(), ContextUtil.subDeptId(null), false); if (null != depotList && !depotList.isEmpty()) { for (Depot depot : depotList) { if (null == depot.getStorageReal()) { depot.setStorageReal(0.0); } groupGisData.setSum(groupGisData.getSum() + depot.getStorageReal()); if (StringUtils.isNotBlank(depot.getPledgeBank())) { groupGisData.setBankSum(groupGisData.getBankSum() + depot.getStorageReal()); } else { groupGisData.setNormalSum(groupGisData.getNormalSum() + depot.getStorageReal()); } } } if (groupGisData.getSum() > 0) { groupGisData.setSumPer(new DecimalFormat("0.00").format(groupGisData.getSum() / groupGisData.getSum() * 100L)); groupGisData.setBankSumPer(new DecimalFormat("0.00").format(groupGisData.getBankSum() / groupGisData.getSum() * 100L)); groupGisData.setNormalSumPer(new DecimalFormat("0.00").format(groupGisData.getNormalSum() / groupGisData.getSum() * 100L)); } return groupGisData; } public GroupGisData getGisDataByCompanyId() { GroupGisData groupGisData = new GroupGisData(); //查询伊犁下属区县 //区县 List dicAreaList = dicAreaService.listData("654000", null, null); //统计区县下库区数 LinkedHashMap valuePieChart = new LinkedHashMap<>(); LinkedHashMap namePieChart = new LinkedHashMap<>(); if (null != dicAreaList && !dicAreaList.isEmpty()) { for (DicArea dicArea : dicAreaList) { valuePieChart.put(dicArea.getCode(), 0); namePieChart.put(dicArea.getCode(), dicArea.getName()); } } List deptList = deptService.getDeptByUserType(null); if (null != deptList && !deptList.isEmpty()) { //库区总数 groupGisData.setDeptNum(deptList.size()); for (Dept dept : deptList) { if (StringUtils.isBlank(dept.getXzqhdm()) || null == valuePieChart.get(dept.getXzqhdm())) { if (null == valuePieChart.get("999999")) { valuePieChart.put("999999", 0); namePieChart.put("999999", "其他区县"); } dept.setXzqhdm("999999"); } valuePieChart.put(dept.getXzqhdm(), valuePieChart.get(dept.getXzqhdm()) + 1); } } if (groupGisData.getDeptNum() > 0) { for (String mapKey : valuePieChart.keySet()) { groupGisData.getDeptList().add(new ChartPie(valuePieChart.get(mapKey) + "", namePieChart.get(mapKey), new DecimalFormat("0.0").format((double) valuePieChart.get(mapKey) / groupGisData.getDeptNum() * 100))); } } //统计重量 List depotList = depotService.getCacheDepotList(ContextUtil.getCompanyId()); if (null != depotList && !depotList.isEmpty()) { for (Depot depot : depotList) { if (null == depot.getStorageReal()) { depot.setStorageReal(0.0); } groupGisData.setSum(groupGisData.getSum() + depot.getStorageReal()); if (StringUtils.isNotBlank(depot.getPledgeBank())) { groupGisData.setBankSum(groupGisData.getBankSum() + depot.getStorageReal()); } else { groupGisData.setNormalSum(groupGisData.getNormalSum() + depot.getStorageReal()); } } } if (groupGisData.getSum() > 0) { groupGisData.setSumPer(new DecimalFormat("0.00").format(groupGisData.getSum() / groupGisData.getSum() * 100L)); groupGisData.setBankSumPer(new DecimalFormat("0.00").format(groupGisData.getBankSum() / groupGisData.getSum() * 100L)); groupGisData.setNormalSumPer(new DecimalFormat("0.00").format(groupGisData.getNormalSum() / groupGisData.getSum() * 100L)); } return groupGisData; } /** * 大屏首页-抓拍跟踪信息 * * @param param * @return */ public PageResponse> indexSnapList(IgdsBaseParam param) { param.setStart(DateUtil.getNewByDay(new Date(), -10)); param.setEnd(new Date()); List listSnap = snapRecordService.getListByParam(param); List resultListSnap = new ArrayList<>(); for (SnapRecord info : listSnap) { //当标签包含 卡车, 或者包含大写的英文字母(代表有车牌)时,添加进result if (StringUtils.isNotBlank(info.getTags())) { if (info.getTags().contains("卡车") || info.getTags().matches(".*[A-Z].*")) { resultListSnap.add(info); } } } if (null != resultListSnap && !resultListSnap.isEmpty()) { //判断文件是否存在 for (SnapRecord record : resultListSnap) { record.setImgName(commonManager.isImgExit(record.getImgName(), null)); } } return new PageResponse<>(RespCodeEnum.CODE_0000, resultListSnap); } /** * 大屏首页-抓拍跟踪信息-展示AI时间图片 * 展示图片的业务逻辑:每个库区展示一张,图片为当天十点以后最新的一张 * * @param param * @return */ public PageResponse> indexEventInfoList(IgdsBaseParam param) { // Date start =DateUtils.setHours(DateUtil.getNewByDay(new Date(), -3), 10); //param.setStart(start); // param.setEnd(DateUtil.getNewByDay(new Date(), -3)); Date start =DateUtil.getNewByDay(new Date(), -10); param.setStart(start); param.setEnd(new Date()); //获取当日的抓拍信息 List listByParam = eventInfoService.getListByParam(param); if (null == listByParam || listByParam.isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_0000, new ArrayList<>()); } //获取所有的库区信息 List deptList = deptService.getDeptByUserType(null); //根据库区从listByParam来获取每一个库区下,最新的一张抓拍图片 List resultList = new ArrayList<>(); for (Dept dept : deptList) { EventInfo latestEvent = null; //从listByParam中筛选出与当前id匹配的数据 List collect = listByParam.stream().filter(info -> info.getDeptId().equals(dept.getId())).sorted(Comparator.comparing(EventInfo::getTime).reversed()).collect(Collectors.toList()); //每个库区获取最新的3张图片 int i = 0; for (EventInfo info : collect) { if (i > 2) break; resultList.add(info); i++; } } if (null != resultList && !resultList.isEmpty()) { //判断文件是否存在 for (EventInfo record : resultList) { record.setImgName(commonManager.isImgExit(record.getImgName(), null)); } } return new PageResponse<>(RespCodeEnum.CODE_0000, resultList); } }