| 
					
				 | 
			
			
				@@ -3,11 +3,18 @@ package com.ruoyi.shipping.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.fastjson.JSONArray; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.common.constant.UserConstants; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.common.core.domain.AjaxResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.common.utils.DateUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.common.utils.SecurityUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.common.utils.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.shipping.domain.TCntr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.shipping.domain.TCtnprice; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.shipping.domain.TCtnpriceItems; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.shipping.mapper.TCntrMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.shipping.mapper.TCtnpriceItemsMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.BeanUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -15,6 +22,8 @@ import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.shipping.mapper.TVoyageMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.shipping.domain.TVoyage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.shipping.service.ITVoyageService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.transaction.interceptor.TransactionAspectSupport; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 航次Service业务层处理 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -29,6 +38,8 @@ public class TVoyageServiceImpl implements ITVoyageService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private TVoyageMapper tVoyageMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private TCtnpriceItemsMapper tCtnpriceItemsMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private TCntrMapper tCntrMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 查询航次 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -39,7 +50,12 @@ public class TVoyageServiceImpl implements ITVoyageService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public TVoyage selectTVoyageById(Long fId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return tVoyageMapper.selectTVoyageById(fId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TVoyage voyage = tVoyageMapper.selectTVoyageById(fId);//航次信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TCtnpriceItems tCtnpriceItems = new TCtnpriceItems(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tCtnpriceItems.setfPid(fId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<TCtnpriceItems> ctnpriceItems = tCtnpriceItemsMapper.selectTCtnpriceItemsList(tCtnpriceItems); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyage.settCtnpriceItemsList(ctnpriceItems); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return voyage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -261,6 +277,124 @@ public class TVoyageServiceImpl implements ITVoyageService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public List<TVoyage> selectMessage(TVoyage tVoyage) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return tVoyageMapper.selectMessage(tVoyage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<TVoyage> tVoyages = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<TVoyage> voyages = tVoyageMapper.selectMessage(tVoyage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (CollectionUtils.isNotEmpty(voyages)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (TVoyage voyage : voyages) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                TVoyage tVoyageByFid = tVoyageMapper.selectTVoyageByFid(voyage.getfId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tVoyages.add(tVoyageByFid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return tVoyages; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public AjaxResult insertMessage(String tVoyage, String tCtnpriceItems) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TVoyage voyage = JSONArray.parseObject(tVoyage, TVoyage.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isEmpty(voyage.getfNo())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("航次不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (voyage.getfPortofloadid() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("装货港不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /*if (tVoyage.getfPortofdischargeid() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("卸货港不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (voyage.getfDistinationid() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("目的港不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (voyage.getfEtd() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("预计开船日期不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (voyage.getfEta() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("预计到达日期不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (voyage.getfDucomentrayoffdate() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("截单日期不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isEmpty(voyage.getfTel())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("电话不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        long dateDay = DateUtils.getDateDay(voyage.getfEta(),voyage.getfEtd()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        voyage.setfDays(dateDay); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (voyage.getfId() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //航次 起运港 目的港 中转港 预计开船日期不能重复 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<TVoyage> tVoyages = tVoyageMapper.selectTVoyageMessage(voyage.getfNo(), voyage.getfPortofloadid(), voyage.getfDistinationid(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    voyage.getfPortoftransshipment(), voyage.getfEtd()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (CollectionUtils.isNotEmpty(tVoyages)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return AjaxResult.error("航次信息重复"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            voyage.setCreateTime(DateUtils.getNowDate()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            voyage.setCreateBy(SecurityUtils.getUsername()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tVoyageMapper.insertTVoyage(voyage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            voyage.setUpdateTime(DateUtils.getNowDate()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            voyage.setUpdateBy(SecurityUtils.getUsername()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tVoyageMapper.updateTVoyage(voyage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //tCtnpriceItemsMapper.deleteTCtnpriceItemsByfPid(voyage.getfId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONArray warehouseJSON = JSONArray.parseArray(tCtnpriceItems); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<TCtnpriceItems> ctnpriceItems = JSONObject.parseArray(warehouseJSON.toJSONString(), TCtnpriceItems.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (CollectionUtils.isNotEmpty(ctnpriceItems)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (TCtnpriceItems ctnpriceItem : ctnpriceItems) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (ctnpriceItem.getfCntrid() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return AjaxResult.error("集装箱类型不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (ctnpriceItem.getfPrice() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return AjaxResult.error("单价不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (ctnpriceItem.getfId() == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    List<TCtnpriceItems> ctnpriceItemsList = tCtnpriceItemsMapper.selectItemMeaasge(voyage.getfId(), ctnpriceItem.getfCntrid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (CollectionUtils.isNotEmpty(ctnpriceItemsList)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        TCntr cntr = tCntrMapper.selectTCntrById(ctnpriceItem.getfCntrid()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return AjaxResult.error("运价中集装箱编号"+cntr.getfNo()+"重复,请确认"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctnpriceItem.setfPid(voyage.getfId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctnpriceItem.setCreateTime(DateUtils.getNowDate()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctnpriceItem.setCreateBy(SecurityUtils.getUsername()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    int items = tCtnpriceItemsMapper.insertTCtnpriceItems(ctnpriceItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctnpriceItem.setfPid(voyage.getfId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctnpriceItem.setUpdateTime(DateUtils.getNowDate()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctnpriceItem.setUpdateBy(SecurityUtils.getUsername()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    int items = tCtnpriceItemsMapper.updateTCtnpriceItems(ctnpriceItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return AjaxResult.success(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<TVoyage> createOrder(TVoyage tVoyage) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //查询所有的航次 然后按 起运港 中转港 目的港 去重 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<TVoyage> tVoyages = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tVoyages = tVoyageMapper.selectTVoyageListNew(tVoyage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tVoyages = tVoyages.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(TVoyage -> TVoyage.getfPortofloadid() + ";"+ TVoyage.getfDistinationid()+ ";"+ TVoyage.getfPortoftransshipment()))), ArrayList::new)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (CollectionUtils.isNotEmpty(tVoyages)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (TVoyage voyage : tVoyages) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //然后根据 起运港 中转港  目的港 获取所有的航次ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<Long> longs = tVoyageMapper.selectTVoyageIds(voyage); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //然后根据航次ID去运价详情表中获取对应箱型的最低价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               if (CollectionUtils.isNotEmpty(longs)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   voyage.setTwenty(tCtnpriceItemsMapper.selectMinMoney("20GP",longs)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   voyage.setFortyHc(tCtnpriceItemsMapper.selectMinMoney("40HC",longs)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   voyage.setFortyRh(tCtnpriceItemsMapper.selectMinMoney("40RH",longs)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   List<TVoyage> freightselect = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   //然后根据 所有的航次ID 获取对应的航次信息以及对应箱型的价格 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   for (Long aLong : longs) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       TVoyage tVoyageByFid = tVoyageMapper.selectTVoyageByFid(aLong); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       if (tVoyageByFid != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           freightselect.add(tVoyageByFid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   voyage.setFreight(freightselect); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return tVoyages; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |