| package com.xzx.gc.system.service;  | 
|   | 
| import cn.hutool.core.bean.BeanUtil;  | 
| import cn.hutool.core.collection.CollUtil;  | 
| import cn.hutool.core.date.DateUtil;  | 
| import cn.hutool.core.util.StrUtil;  | 
| import com.github.pagehelper.PageHelper;  | 
| import com.github.pagehelper.PageInfo;  | 
| import com.xzx.gc.entity.SysStorage;  | 
| import com.xzx.gc.model.admin.StorageModel;  | 
| import com.xzx.gc.model.admin.SysStorageApiModel;  | 
| import com.xzx.gc.system.mapper.OrderMapper;  | 
| import com.xzx.gc.system.mapper.OrderStorageInfoMapper;  | 
| import com.xzx.gc.system.mapper.PartnerGaodeMapper;  | 
| import com.xzx.gc.system.mapper.SysStorageMapper;  | 
| import com.xzx.gc.util.DoubleUtil;  | 
| import org.springframework.beans.factory.annotation.Autowired;  | 
| import org.springframework.stereotype.Service;  | 
| import org.springframework.transaction.annotation.Transactional;  | 
|   | 
| import java.math.BigDecimal;  | 
| import java.math.RoundingMode;  | 
| import java.util.ArrayList;  | 
| import java.util.HashMap;  | 
| import java.util.List;  | 
| import java.util.Map;  | 
|   | 
| @Service  | 
| @Transactional  | 
| public class SysStorageService {  | 
|   | 
|     @Autowired  | 
|     private SysStorageMapper sysStorageMapper;  | 
|   | 
|     @Autowired  | 
|     private CityPartnerService cityPartnerService;  | 
|   | 
|     @Autowired  | 
|     private PartnerGaodeMapper partnerGaodeMapper;  | 
|   | 
|     @Autowired  | 
|     private OrderStorageInfoMapper orderStorageInfoMapper;  | 
|   | 
|     @Autowired  | 
|     private OrderMapper orderMapper;  | 
|   | 
|     public SysStorage findById(Integer id){  | 
|         return sysStorageMapper.selectByPrimaryKey(id);  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 添加仓库  | 
|      *  | 
|      * @param storageModel  | 
|      * @return  | 
|      */  | 
|     public int addSysStorageApi(SysStorageApiModel storageModel) {  | 
|   | 
|         if(StrUtil.isBlank(storageModel.getPartnerId())){  | 
|             List<String> list = cityPartnerService.queryPartnerByCurrent();  | 
|             if(CollUtil.isNotEmpty(list)){  | 
|                 storageModel.setPartnerId(CollUtil.getFirst(list));  | 
|             }  | 
|         }  | 
|   | 
|         storageModel.setCreateTime(DateUtil.now());  | 
|         return sysStorageMapper.addSysStorageApi(storageModel);  | 
|     }  | 
|   | 
|     /**  | 
|      * 修改仓库  | 
|      *  | 
|      * @param storageModel  | 
|      * @return  | 
|      */  | 
|     public int updateSysStorageApi(SysStorageApiModel storageModel) {  | 
|         SysStorage sysStorage=new SysStorage();  | 
|         BeanUtil.copyProperties(storageModel,sysStorage);  | 
|         return sysStorageMapper.updateByPrimaryKeySelective(sysStorage);  | 
| //        return sysStorageMapper.updateSysStorageApi(storageModel);  | 
|     }  | 
|   | 
|     /**  | 
|      * 删除仓库  | 
|      *  | 
|      * @param storageModel  | 
|      * @return  | 
|      */  | 
|     public int delSysStorageApi(SysStorageApiModel storageModel) {  | 
|         return sysStorageMapper.delSysStorageApi(storageModel);  | 
|     }  | 
|   | 
|   | 
|     public Map<String, Object> querySysStorageList(SysStorageApiModel storageModel) {  | 
| //        List<String> partnerIds = new ArrayList<>();  | 
|   | 
|         if(StrUtil.isBlank(storageModel.getPartnerId())){  | 
|             List<String> list = cityPartnerService.queryPartnerByCurrent();  | 
|             if(CollUtil.isNotEmpty(list)){  | 
|                 storageModel.setPartnerId(CollUtil.getFirst(list));  | 
|             }  | 
|         }  | 
|   | 
|   | 
|   | 
|         Map<String, Object> m = new HashMap<>();  | 
|         PageHelper.startPage(storageModel.getPage(),storageModel.getLimit());  | 
|         List<SysStorageApiModel> list = sysStorageMapper.querySysStorageApiList(storageModel);  | 
|         PageInfo<SysStorageApiModel> pageInfo=new PageInfo<>(list);  | 
|   | 
|         m.put("data", list);  | 
|         m.put("count", pageInfo.getTotal());  | 
|         m.put("code", 0);  | 
|         return m;  | 
|     }  | 
|   | 
|   | 
|     public List<Map<String, Object>> querySysStrangeList(){  | 
|         List<String> partnerIds = cityPartnerService.queryPartnerByCurrent();  | 
|         List<Map<String, Object>> list;  | 
|         if(null!=partnerIds&&partnerIds.size()>0){  | 
|             List<String> townIds = partnerGaodeMapper.queryTownIdsByPartnerIdList(partnerIds);  | 
|             list = sysStorageMapper.querySysStrangeList(townIds);  | 
|   | 
|         }else{  | 
|             list = sysStorageMapper.querySysStrangeList(null);  | 
|         }  | 
|   | 
|         return list;  | 
|     }  | 
|   | 
|     public Map<String,Object> querySysStorageListData(StorageModel storageModel) {  | 
|         List<String> partnerIds = new ArrayList<>();  | 
|         if(null!=storageModel.getPartnerId()&&!"".equals(storageModel.getPartnerId())){  | 
|             partnerIds.add(storageModel.getPartnerId());  | 
|         }else{  | 
|             partnerIds = cityPartnerService.queryPartnerByCurrent();  | 
|         }  | 
|         if(null!=partnerIds&&partnerIds.size()>0){  | 
|             String partnerId = partnerIds.get(0);  | 
|             List<String> townIds = cityPartnerService.queryTownIdsByPartnerId(partnerId);  | 
|             storageModel.setTownIds(townIds);  | 
|         }  | 
|         Map<String,Object> result = new HashMap<>();  | 
|         PageHelper.startPage(storageModel.getPage(),storageModel.getLimit());  | 
|         List<Map<String,Object>> list = sysStorageMapper.querySysStorageList(storageModel);  | 
|         PageInfo<Map<String,Object>> pageInfo = new PageInfo<>(list);  | 
|         BigDecimal allWeight = new BigDecimal("0");  | 
|         BigDecimal allMoney = new BigDecimal("0");  | 
|         //相隔的天数 ,查询日均  | 
|         int dayNum = orderStorageInfoMapper.queryDayDiff(storageModel);  | 
|         for (Map<String,Object> map:list) {  | 
|             StorageModel pModel = new StorageModel();  | 
|             String id = map.get("id").toString();  | 
|             map.put("areaname",map.get("areaName"));  | 
|             map.put("storagename",map.get("storageName"));  | 
|             pModel.setSysStorageId(id);  | 
|             pModel.setStartTime(storageModel.getStartTime());  | 
|             pModel.setEndTime(storageModel.getEndTime());  | 
|             pModel.setPartnerIds(partnerIds);  | 
|             Map<String,Object> rMap = orderStorageInfoMapper.querySysStorageAll(pModel);  | 
|             List<String>  allOrderNumBySsId= orderStorageInfoMapper.sysStorageOrderNum(pModel);  | 
|             BigDecimal allOrderNum = new BigDecimal("0") ;  | 
|             for (String orderIds:allOrderNumBySsId) {  | 
|                 String[] ossid = orderIds.split(",");  | 
|                 allOrderNum = allOrderNum.add(new BigDecimal(ossid.length));  | 
|             }  | 
|             map.put("orderNum",allOrderNum);  | 
|             if(null!=rMap){  | 
|                 allWeight = allWeight.add(new BigDecimal(rMap.get("storageWeight").toString()));  | 
|                 allMoney =allMoney.add(new BigDecimal(rMap.get("storageMoney").toString()));  | 
|                 BigDecimal storageWeight = new BigDecimal(rMap.get("storageWeight").toString());  | 
|                 storageWeight = storageWeight.divide(new BigDecimal("1000"),6,RoundingMode.HALF_UP);  | 
|                 BigDecimal storageMoney = new BigDecimal(rMap.get("storageMoney").toString());  | 
|                 storageMoney = storageMoney.divide(new BigDecimal("10000"),5,RoundingMode.HALF_UP);  | 
|                 BigDecimal recycleweight = new BigDecimal(rMap.get("recycleWeight").toString());  | 
|                 recycleweight = recycleweight.divide(new BigDecimal("1000"),6,RoundingMode.HALF_UP);  | 
|                 BigDecimal recyclemoney = new BigDecimal(rMap.get("recycleMoney").toString());  | 
|                 recyclemoney = recyclemoney.divide(new BigDecimal("10000"),5,RoundingMode.HALF_UP);  | 
|                 map.put("storageWeight",DoubleUtil.roundSix(storageWeight.toString()));  | 
|                 map.put("storageMoney",DoubleUtil.roundFive(storageMoney.toString()));  | 
|                 map.put("recycleWeight",DoubleUtil.roundSix(recycleweight.toString()));  | 
|                 map.put("recycleMoney",DoubleUtil.roundFive(recyclemoney.toString()));  | 
|                 //日均重量  | 
|                 BigDecimal sw = new BigDecimal(rMap.get("storageWeight").toString());  | 
|                 if(dayNum>0){  | 
|                     BigDecimal dayw = sw.divide(new BigDecimal(dayNum),6, RoundingMode.HALF_UP);  | 
|                     map.put("dayStorageWeight",dayw.divide(new BigDecimal("1000"),6,RoundingMode.HALF_UP));  | 
|                 }else{  | 
|                     sw =sw.divide(new BigDecimal("1000"),6,RoundingMode.HALF_UP);  | 
|                     map.put("dayStorageWeight",DoubleUtil.roundThree(sw.toString()));  | 
|                 }  | 
|                 //日均金额  | 
|                 BigDecimal sm = new BigDecimal(rMap.get("storageMoney").toString());  | 
|                 if(dayNum>0){  | 
|                     BigDecimal daym = sm.divide(new BigDecimal(dayNum),5,RoundingMode.HALF_UP);  | 
|                     map.put("dayStorageMoney",daym.divide(new BigDecimal("10000"),5,RoundingMode.HALF_UP));  | 
|                 }else{  | 
|                     map.put("dayStorageMoney",sm.divide(new BigDecimal("10000"),5,RoundingMode.HALF_UP));  | 
|                 }  | 
|   | 
|             }  | 
|         }  | 
|         if(dayNum==0){  | 
|             dayNum=1;  | 
|         }  | 
|         BigDecimal alldayw = allWeight.divide(new BigDecimal(dayNum),6,RoundingMode.HALF_UP);  | 
|         BigDecimal alldaym = allMoney.divide(new BigDecimal(dayNum),5,RoundingMode.HALF_UP);  | 
|         allWeight = allWeight.divide(new BigDecimal("1000"),6,RoundingMode.HALF_UP);  | 
|         alldayw = alldayw.divide(new BigDecimal("1000"),6,RoundingMode.HALF_UP);  | 
|         alldaym = alldaym.divide(new BigDecimal("10000"),5,RoundingMode.HALF_UP);  | 
|         allMoney = allMoney.divide(new BigDecimal("10000"),5,RoundingMode.HALF_UP);  | 
|         //int count = dao.querySysStorageCount(storageModel);  | 
|         result.put("count",pageInfo.getTotal());  | 
|         result.put("code",0);  | 
|         result.put("data",list);  | 
|         result.put("allWeight",DoubleUtil.roundSix(allWeight.toString()));  | 
|         result.put("allMoney",DoubleUtil.roundFive(allMoney.toString()));  | 
|         result.put("allDayWeight",DoubleUtil.roundSix(alldayw.toString()));  | 
|         result.put("allDayMoney",DoubleUtil.roundFive(alldaym.toString()));  | 
|         return result;  | 
|     }  | 
|   | 
|   | 
|     public Map<String,Object> querySysStorageDetail(StorageModel storageModel) {  | 
|         Map<String,Object> result = new HashMap<>();  | 
|         List<Map<String,String>> weekOrMonthList = new ArrayList<>();  | 
|         List<Map<String,String>> weekOrMonthImgList = new ArrayList<>();  | 
|         //相隔天数  | 
|         int dayNum = orderStorageInfoMapper.queryDayDiff(storageModel);  | 
|         Map<String,Object> allRMap = sysStorageMapper.querySysStorageAll(storageModel);  | 
|   | 
|         BigDecimal allWeight = new BigDecimal(allRMap.get("storageWeight").toString());  | 
|         BigDecimal  allMoney = new BigDecimal(allRMap.get("storageMoney").toString());  | 
|         BigDecimal alldayw = new BigDecimal("0");  | 
|         BigDecimal alldaym = new BigDecimal("0");  | 
|   | 
|         if(dayNum>0){  | 
|             alldayw = allWeight.divide(new BigDecimal(dayNum),2,RoundingMode.HALF_UP);  | 
|             alldaym = allMoney.divide(new BigDecimal(dayNum),2,RoundingMode.HALF_UP);  | 
|         }  | 
|         String am = allMoney.divide(new BigDecimal("10000"),2, RoundingMode.HALF_UP).toString();  | 
|         String aw = allWeight.divide(new BigDecimal("1000"),3, RoundingMode.HALF_UP).toString();  | 
|         String adm = alldaym.divide(new BigDecimal("10000"),2, RoundingMode.HALF_UP).toString();  | 
|         String adw = alldayw.divide(new BigDecimal("1000"),3, RoundingMode.HALF_UP).toString();  | 
|   | 
|         result.put("allWeight",DoubleUtil.roundThree(aw));  | 
|         result.put("allMoney",DoubleUtil.roundTwo(am));  | 
|         result.put("alldayw",DoubleUtil.roundThree(adw));  | 
|         result.put("alldaym",DoubleUtil.roundTwo(adm));  | 
|   | 
|         List<Map<String,Object>> weekOrderList = new ArrayList<>();  | 
|         List<Map<String,Object>> weekMoneyAndWeightList = new ArrayList<>();  | 
|         List<Map<String,Object>> detailImage = new ArrayList<>();  | 
|         if(null!=storageModel.getTimeType()&&!"".equals(storageModel.getTimeType())){  | 
|             if(storageModel.getTimeType().equals("week")){  | 
|                 weekOrMonthList = com.xzx.gc.util.DateUtil.query12WeekStartTimeAndEndTime();  | 
|             }else{  | 
|                 weekOrMonthList = com.xzx.gc.util.DateUtil.query12MonthStartTimeAndEndTime();  | 
|             }  | 
|             for (Map<String,String> map:weekOrMonthList) {  | 
|                 String startTime = map.get("startTime");  | 
|                 String endTime = map.get("endTime");  | 
|                 if(map.get("storageWeight")!=null){  | 
|                     String storageweight = DoubleUtil.roundThree(map.get("storageWeight"));  | 
|                     map.put("storageWeight",storageweight);  | 
|                 }  | 
|                 if(map.get("recycleWeight")!=null){  | 
|                     String recycleweight = DoubleUtil.roundThree(map.get("recycleWeight"));  | 
|                     map.put("recycleWeight",recycleweight);  | 
|                 }  | 
|   | 
|   | 
|   | 
|                 //周订单数  | 
|                 weekOrderList = getWeekOrderList(startTime,endTime,storageModel.getSysStorageId(),weekOrderList);  | 
|                 //周金额(入库金额,订单金额,入库重量,订单重量)  | 
|                 weekMoneyAndWeightList = getWeekMoneyAndWeightList(startTime,endTime,storageModel.getSysStorageId(),weekMoneyAndWeightList);  | 
|             }  | 
|         }else{  | 
|             weekOrMonthList = com.xzx.gc.util.DateUtil.query12WeekStartTimeAndEndTime();  | 
|             for (Map<String,String> map:weekOrMonthList) {  | 
|                 String startTime = map.get("startTime");  | 
|                 String endTime = map.get("endTime");  | 
|                 if(map.get("storageWeight")!=null){  | 
|                     String storageweight = DoubleUtil.roundThree(map.get("storageWeight"));  | 
|                     map.put("storageweight",storageweight);  | 
|                 }  | 
|                 if(map.get("recycleWeight")!=null){  | 
|                     String recycleweight = DoubleUtil.roundThree(map.get("recycleWeight"));  | 
|                     map.put("recycleweight",recycleweight);  | 
|                 }  | 
|                 //周订单数  | 
|                 weekOrderList = getWeekOrderList(startTime,endTime,storageModel.getSysStorageId(),weekOrderList);  | 
|                 //周金额(入库金额,订单金额,入库重量,订单重量)  | 
|                 weekMoneyAndWeightList = getWeekMoneyAndWeightList(startTime,endTime,storageModel.getSysStorageId(),weekMoneyAndWeightList);  | 
|             }  | 
|         }  | 
|         Map<String,String> lastMap = new HashMap<>();  | 
|         if(null!=storageModel.getImageType()&&!"".equals(storageModel.getImageType())) {  | 
|             if (storageModel.getImageType().equals("week")) {  | 
|                 weekOrMonthImgList = com.xzx.gc.util.DateUtil.query12WeekStartTimeAndEndTime();  | 
|                 lastMap = weekOrMonthImgList.get(0);  | 
|             } else {  | 
|                 weekOrMonthImgList = com.xzx.gc.util.DateUtil.query12MonthStartTimeAndEndTime();  | 
|                 lastMap = weekOrMonthImgList.get(0);  | 
|             }  | 
|         }else{  | 
|             weekOrMonthImgList = com.xzx.gc.util.DateUtil.query12WeekStartTimeAndEndTime();  | 
|             lastMap = weekOrMonthImgList.get(0);  | 
|         }  | 
|         detailImage = getSysStorageTypeName(storageModel.getSysStorageId(), lastMap.get("startTime"),lastMap.get("endTime"),null);  | 
|         for (Map<String,Object> obj:weekMoneyAndWeightList) {  | 
|             if(obj.get("storageWeight")!=null){  | 
|                 String storageweight = DoubleUtil.roundThree(obj.get("storageWeight").toString());  | 
|                 obj.put("storageweight",storageweight);  | 
|             }  | 
|             if(obj.get("storageMoney")!=null){  | 
|                 String storageMoney = DoubleUtil.roundThree(obj.get("storageMoney").toString());  | 
|                 obj.put("storagemoney",storageMoney);  | 
|             }  | 
|             if(obj.get("recycleMoney")!=null){  | 
|                 String recycleMoney = DoubleUtil.roundThree(obj.get("recycleMoney").toString());  | 
|                 obj.put("recyclemoney",recycleMoney);  | 
|             }  | 
|             if(obj.get("recycleWeight")!=null){  | 
|                 String recycleWeight = DoubleUtil.roundThree(obj.get("recycleWeight").toString());  | 
|                 obj.put("recycleweight",recycleWeight);  | 
|             }  | 
|         }  | 
|         result.put("weekOrMonthOrderList",weekOrderList);  | 
|         result.put("weekOrMonthMoneyAndWeightList",weekMoneyAndWeightList);  | 
|         result.put("detailImage",detailImage);  | 
|   | 
|         return result;  | 
|     }  | 
|   | 
|     /**  | 
|      * 按照仓库图表统计周订单数  | 
|      * @param startTime  | 
|      * @param endTime  | 
|      * @param sysStorageId  | 
|      * @param weekOrderList  | 
|      * @return  | 
|      */  | 
|     private List<Map<String,Object>> getWeekOrderList(String startTime,String endTime,String sysStorageId,List<Map<String,Object>> weekOrderList){  | 
|         Map<String,Object> paramMap = new HashMap<>();  | 
|         //订单量 入库、订单重量 入库、订单金额  | 
|         StorageModel storageModel1 = new StorageModel();  | 
|         storageModel1.setStartTime(startTime);  | 
|         storageModel1.setEndTime(endTime);  | 
|         storageModel1.setSysStorageId(sysStorageId);  | 
|         List<String> orderIdBySysStorageId = orderStorageInfoMapper.sysStorageOrderNum(storageModel1);  | 
|         int orderNum = 0 ;  | 
|         for (String orderIds:orderIdBySysStorageId) {  | 
|             orderNum = orderIds.split(",").length;  | 
|         }  | 
|         String[] startStr = startTime.split(" ");  | 
|         String[] endStr = endTime.split(" ");  | 
|         paramMap.put("startTime",startStr[0]);  | 
|         paramMap.put("endTime",endStr[0]);  | 
|         paramMap.put("orderNum",orderNum);  | 
|         weekOrderList.add(paramMap);  | 
|         return weekOrderList;  | 
|     }  | 
|   | 
|     private List<Map<String,Object>> getWeekMoneyAndWeightList(String startTime,String endTime,String sysStorageId,List<Map<String,Object>> weekOrderList) {  | 
|         //入库、订单重量 入库、订单金额  | 
|         StorageModel storageModel2 = new StorageModel();  | 
|         storageModel2.setStartTime(startTime);  | 
|         storageModel2.setEndTime(endTime);  | 
|         storageModel2.setSysStorageId(sysStorageId);  | 
|         Map<String,Object> rMap = sysStorageMapper.querySysStorageAll(storageModel2);  | 
|   | 
|         String[] startStr = startTime.split(" ");  | 
|         String[] endStr = endTime.split(" ");  | 
|         rMap.put("startTime",startStr[0]);  | 
|         rMap.put("endTime",endStr[0]);  | 
|         weekOrderList.add(rMap);  | 
|         return weekOrderList;  | 
|     }  | 
|   | 
|     private List<Map<String,Object>> getSysStorageTypeName(String sysStorageId,String startTime,String endTime,String typeName){  | 
|         List<Map<String,Object>> resultMap = new ArrayList<>();  | 
|         StorageModel storageModel1 = new StorageModel();  | 
|         storageModel1.setStartTime(startTime);  | 
|         storageModel1.setEndTime(endTime);  | 
|         storageModel1.setSysStorageId(sysStorageId);  | 
|         List<String> orderIdBySysStorageId = orderStorageInfoMapper.sysStorageOrderNum(storageModel1);  | 
|         List<String> orderIds = new ArrayList<>();  | 
|         for (String ids:orderIdBySysStorageId) {  | 
|             String[] orderIdsTemp = ids.split(",");  | 
|             for (String orderId:orderIdsTemp) {  | 
|                 orderIds.add(orderId);  | 
|             }  | 
|         }  | 
|         List<Map<String,Object>> list = new ArrayList<>();  | 
|         if(orderIds!=null&&orderIds.size()>0){  | 
|             list = orderMapper.getSysStorageTypeName(orderIds,null,null,typeName);  | 
|         }  | 
|         //总金额  | 
|         BigDecimal totalMoney = new BigDecimal("0");  | 
|         for (Map<String,Object> map:list) {  | 
|             totalMoney = totalMoney.add(new BigDecimal(map.get("money").toString()));  | 
|         }  | 
|         //查询占比  | 
|         for (Map<String,Object> map:list) {  | 
|             BigDecimal rate = new BigDecimal(map.get("money").toString()).divide(totalMoney,2,RoundingMode.HALF_UP);  | 
|             map.put("rate",rate.multiply(new BigDecimal("100")).toString()+"%");  | 
|             BigDecimal money = new BigDecimal(map.get("money").toString());  | 
|             BigDecimal weight = new BigDecimal(map.get("weight").toString());  | 
|             money = money.divide(new BigDecimal("10000"),2, RoundingMode.HALF_UP);  | 
|             weight = weight.divide(new BigDecimal("1000"),3, RoundingMode.HALF_UP);  | 
|             map.put("weight",DoubleUtil.roundThree(weight.toString()));  | 
|             map.put("money",DoubleUtil.roundTwo(money.toString()));  | 
|         }  | 
|         Map<String,Object> imageData = new HashMap<>();  | 
|         if(null!=totalMoney){  | 
|             totalMoney =  totalMoney.divide(new BigDecimal("10000"),2, RoundingMode.HALF_UP);  | 
|         }  | 
|   | 
|         imageData.put("totalMoney",DoubleUtil.roundTwo(totalMoney.toString()));  | 
|         imageData.put("data",list);  | 
|         resultMap.add(imageData);  | 
|         return resultMap;  | 
|     }  | 
| }  |