sgj
2026-03-25 8bb88ec2ed80687858d0aa9f53b78f407f4045dd
fzzy-igdss-web/src/main/java/com/fzzy/group/manager/GroupManager.java
@@ -1,16 +1,27 @@
package com.fzzy.group.manager;
import com.fzzy.common.manager.CommonManager;
import com.fzzy.igds.constant.Constant;
import com.fzzy.igds.domain.Dept;
import com.fzzy.igds.domain.DicArea;
import com.fzzy.igds.service.CoreDeptService;
import com.fzzy.igds.service.DicAreaService;
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.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @Description
@@ -22,9 +33,32 @@
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;
    /**
     * 获取省及下属市州集合
@@ -96,13 +130,566 @@
        return list;
    }
    public List<DicArea> getBankAndChildDept(String areaCode) {
        DicArea area = dicAreaService.listDicAreaByCode(areaCode);
        if (null == area) {
            return null;
        }
        List<DicArea> areaChildren =  new ArrayList<>();
        List<DicArea> list = new ArrayList<>();
        if (Constant.AREA_TYPE_1.equals(area.getType())) {
           //查询所有的质押合同
            List<PledgeContract> pledgeContractList = pledgeContractService.listAll(null);
            //查询所有的库区
            List<Dept> depotList = deptService.listDept(null, ContextUtil.getCompanyId(), null);
            //查询所有的银行
            List<Bank> 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<PledgeContractDepot> pledgeContractDepots = pledgeContractDepotService.listAll(param);
                    if (null == pledgeContractDepots || pledgeContractDepots.isEmpty()){
                        continue;
                    }
                    //找到pledgeContractDepots中的deptId集合,并去重
                    List<String> 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<DicArea> 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<DicArea> 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<DicArea> children = defaultBank.getChildren();
                    if (null == children) {
                        defaultBank.setChildren(new ArrayList<>());
                    }
                    defaultBank.getChildren().add(deptDic);
                }
            }
            List<DicArea> defaultBankChildren = defaultBank.getChildren();
            if (defaultBankChildren.size()>0) {
                areaChildren.add(defaultBank);
            }
            area.setChildren(areaChildren);
        }
        list.add(area);
        return list;
    }
    /**
     * 获取组织下所有库区信息
     * 获取用户下所有库区信息
     *
     * @return
     */
    public List<Dept> getDeptList() {
        return deptService.getDeptByUserType(null);
    }
    /**
     * 获取库区封装信息
     *
     * @param companyId
     * @return
     */
    public List<Dept> getAllDept(String companyId) {
        return deptService.listDept(null, companyId, null);
    public List<GroupDeptData> getDeptData(String companyId) {
        List<GroupDeptData> list = new ArrayList<>();
        GroupDeptData deptData;
        List<Dept> deptList = deptService.getDeptByUserType(null);
        if (null != deptList && !deptList.isEmpty()) {
            List<Depot> 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<InoutRecord> 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<GroupDepotData> getDepotData(String companyId) {
        List<GroupDepotData> list = new ArrayList<>();
        GroupDepotData depotData;
        List<Dept> deptList = deptService.getDeptByUserType(null);
        if (null != deptList && !deptList.isEmpty()) {
            List<Depot> 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<List<Camera>> 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<Camera> listCamera = cameraService.getCameraByDeptId(param.getCompanyId(), param.getDeptId());
        return new PageResponse<>(RespCodeEnum.CODE_0000, listCamera);
    }
    /**
     * 大屏首页统计信息:企业数、库区数、仓库数、质押仓数、散粮及成品粮数、分品种库存数
     *
     * @param param
     * @return
     */
    public PageResponse<GroupIndexData> getGroupIndexData(IgdsBaseParam param) {
        GroupIndexData indexData = new GroupIndexData();
        //企业数
        Integer companyNum = coreCompanyService.getCompanyNum(param.getCompanyId());
        indexData.setCompanyNum(companyNum);
        //库区数
        List<Dept> deptList = deptService.getDeptByUserType(null);
        if (null != deptList) {
            indexData.setDeptNum(deptList.size());
        }
        ///仓库数及质押仓库数
        List<Depot> depotList = depotService.getCacheDepotList(param.getCompanyId());
        if (null != depotList) {
            Double foodSum = 0.0;
            Double packFoodSum = 0.0;
            indexData.setDepotNum(depotList.size());
            //用于统计分品种库存
            LinkedHashMap<String, Double> 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<List<GroupDeptData>> indexDeptList(IgdsBaseParam param) {
        List<GroupDeptData> list = new ArrayList<>();
        GroupDeptData deptData;
        List<Dept> deptList = deptService.getDeptByUserType(null);
        if (null != deptList && !deptList.isEmpty()) {
            List<Depot> 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<InoutRecord> 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<EventInfo> enevtList = eventInfoService.getListByParam(igdsParam);
                List<EventInfo> 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);
                        }
                    }
                }
                list.add(deptData);
            }
        }
        return new PageResponse<>(RespCodeEnum.CODE_0000, list);
    }
    /**
     * 统计gis数据,只统计登录人下属的数据统计
     *
     * @return
     */
    public GroupGisData getGisData() {
        GroupGisData groupGisData = new GroupGisData();
        //查询伊犁下属区县
        //区县
        List<DicArea> dicAreaList = dicAreaService.listData("654000", null, null);
        //统计区县下库区数
        LinkedHashMap<String, Integer> valuePieChart = new LinkedHashMap<>();
        LinkedHashMap<String, String> namePieChart = new LinkedHashMap<>();
        if (null != dicAreaList && !dicAreaList.isEmpty()) {
            for (DicArea dicArea : dicAreaList) {
                valuePieChart.put(dicArea.getCode(), 0);
                namePieChart.put(dicArea.getCode(), dicArea.getName());
            }
        }
        List<Dept> 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<Depot> 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<DicArea> dicAreaList = dicAreaService.listData("654000", null, null);
        //统计区县下库区数
        LinkedHashMap<String, Integer> valuePieChart = new LinkedHashMap<>();
        LinkedHashMap<String, String> namePieChart = new LinkedHashMap<>();
        if (null != dicAreaList && !dicAreaList.isEmpty()) {
            for (DicArea dicArea : dicAreaList) {
                valuePieChart.put(dicArea.getCode(), 0);
                namePieChart.put(dicArea.getCode(), dicArea.getName());
            }
        }
        List<Dept> 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<Depot> 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<List<SnapRecord>> indexSnapList(IgdsBaseParam param) {
        param.setStart(DateUtil.getNewByDay(new Date(), -10));
        param.setEnd(new Date());
        List<SnapRecord> listSnap = snapRecordService.getListByParam(param);
        List<SnapRecord> 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);
    }
}