Browse Source

1.客户订舱模板保存清空提单号,分单号
2.客户订舱-获取模板权限修改
3.放箱号增加场站相关字段
4.OW(拿)批量修改Pod场站信息同步放箱号
5.edi场站报文文件导入接口调试及修改
6.OW(拿费用明细按照账期排序)
7.OW拿pick UP 费用增加撤销接口
8.OW拿pick UP费用生成逻辑修改
9.营业费用相关接口调试及修改
10.系统生成放箱号撤销接口bug修改
11.OW计算超期箱使费-PerDiem中rate逗号问题修改
12.用箱,延期提醒增加日期排序
13.提交箱型接口,小铃铛通知取值分单号修改

纪新园 4 months ago
parent
commit
6fcf95e5c7
14 changed files with 359 additions and 41 deletions
  1. 48 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBox.java
  2. 9 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/RouteCostController.java
  3. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/controller/TradingBoxController.java
  4. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/IRouteCostService.java
  5. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/ITradingBoxService.java
  6. 125 0
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/RouteCostServiceImpl.java
  7. 78 16
      blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/TradingBoxServiceImpl.java
  8. 26 4
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BookingCabinController.java
  9. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersMapper.xml
  10. 17 10
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  11. 24 0
      blade-service/blade-los/src/main/java/org/springblade/los/excel/UpdatePodStationExcel.java
  12. 2 1
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/controller/FeeCenterItemsController.java
  13. 9 9
      blade-service/blade-los/src/main/java/org/springblade/los/finance/operatingExpenses/service/impl/OperatingExpensesServiceImpl.java
  14. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/ftp/service/impl/CyFtpServiceImpl.java

+ 48 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/entity/PutBox.java

@@ -371,6 +371,54 @@ public class PutBox implements Serializable {
 	private String whetherManuallyCreate;
 
 	/**
+	 * 起运港场站地址
+	 */
+	@ApiModelProperty(value = "起运港场站地址")
+	private String polCyAddress;
+
+	/**
+	 * 起运港场站联系人
+	 */
+	@ApiModelProperty(value = "起运港场站联系人")
+	private String polCyContact;
+
+	/**
+	 * 起运港场站邮箱
+	 */
+	@ApiModelProperty(value = "起运港场站邮箱")
+	private String polCyEmail;
+
+	/**
+	 * 起运港场站电话
+	 */
+	@ApiModelProperty(value = "起运港场站电话")
+	private String polCyTel;
+
+	/**
+	 * 目的港场站地址
+	 */
+	@ApiModelProperty(value = "目的港场站地址")
+	private String podCyAddress;
+
+	/**
+	 * 目的港场站联系人
+	 */
+	@ApiModelProperty(value = "目的港场站联系人")
+	private String podCyContact;
+
+	/**
+	 * 目的港场站邮箱
+	 */
+	@ApiModelProperty(value = "目的港场站邮箱")
+	private String podCyEmail;
+
+	/**
+	 * 目的港场站电话
+	 */
+	@ApiModelProperty(value = "目的港场站电话")
+	private String podCyTel;
+
+	/**
 	 * 明细
 	 */
 	@TableField(exist = false)

+ 9 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/controller/RouteCostController.java

@@ -211,6 +211,15 @@ public class RouteCostController extends BladeController {
 	}
 
 	/**
+	 * 复制单据
+	 */
+	@GetMapping("/batchCopy")
+	@RepeatSubmit
+	public R batchCopy(@RequestParam("ids") String ids) {
+		return routeCostService.batchCopy(ids);
+	}
+
+	/**
 	 * 单据请核
 	 */
 	@PostMapping("/checkRouteCost")

+ 8 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/controller/TradingBoxController.java

@@ -387,6 +387,14 @@ public class TradingBoxController extends BladeController {
 	}
 
 	/**
+	 * OW撤销费用 - PickUp
+	 */
+	@GetMapping("/revokePickUpCost")
+	public R revokePickUpCost(@RequestParam("id") Long id,@RequestParam("accountDate") String itemIds) {
+		return tradingBoxService.revokePickUpCost(id,itemIds);
+	}
+
+	/**
 	 * 合并生成费用明细
 	 */
 	@PostMapping("/mergeGenerateCost")

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/service/IRouteCostService.java

@@ -78,4 +78,6 @@ public interface IRouteCostService extends IService<RouteCost> {
 	R batchRevoke(String ids);
 
 	List<RTFDProfitExcel> RTFDProfitAll(RTFDProfitExcel profitExcel);
+
+	R batchCopy(String ids);
 }

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/service/ITradingBoxService.java

@@ -85,4 +85,6 @@ public interface ITradingBoxService extends IService<TradingBox> {
 	R revokEnable(TradingBox tradingBox);
 
 	List<BoxReminderExcel> boxUsageReminder(BoxReminderExcel boxReminderExcel);
+
+	R revokePickUpCost(Long id,String itemIds);
 }

+ 125 - 0
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/RouteCostServiceImpl.java

@@ -972,6 +972,131 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 			.collect(Collectors.toList());
 	}
 
+	@Override
+	public R batchCopy(String ids) {
+		if (ObjectUtils.isNull(ids)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		List<RouteCost> routeCostList = baseMapper.selectList(new LambdaQueryWrapper<RouteCost>()
+			.eq(RouteCost::getTenantId, AuthUtil.getTenantId())
+			.eq(RouteCost::getIsDeleted, 0)
+			.in(RouteCost::getId, Func.toLongList(ids)));
+		if (routeCostList.isEmpty()) {
+			throw new RuntimeException("未查到数据");
+		}
+		for (RouteCost item : routeCostList) {
+			Long id = item.getId();
+			item.setId(null);
+			item.setCreateTime(null);
+			item.setCreateUser(null);
+			item.setCreateUserName(null);
+			item.setUpdateUser(null);
+			item.setUpdateTime(null);
+			item.setUpdateUserName(null);
+			item.setStatus("录入");
+			item.setBusinessNo(null);
+			item.setExrateDate(new Date());
+
+			String exrateType = currencyUtils.standardCurrency(item.getBelongingCompanyId() + "");
+			List<BCurExrate> curExrateList = currencyUtils.obtainRate(item.getExrateDate(), "1", item.getBelongingCompanyId() + "");
+			List<RouteCostFee> costFeesList = routeCostFeeService.list(new LambdaQueryWrapper<RouteCostFee>()
+				.eq(RouteCostFee::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostFee::getIsDeleted, 0)
+				.eq(RouteCostFee::getPid, id));
+			for (RouteCostFee costFeeItem : costFeesList) {
+				costFeeItem.setId(null);
+				costFeeItem.setPid(null);
+				costFeeItem.setCreateTime(null);
+				costFeeItem.setCreateUser(null);
+				costFeeItem.setCreateUserName(null);
+				costFeeItem.setUpdateUser(null);
+				costFeeItem.setUpdateTime(null);
+				costFeeItem.setUpdateUserName(null);
+				costFeeItem.setExrate(currencyUtils.obtainExrate("D", curExrateList, costFeeItem.getCurCode(), "1"));
+			}
+			item.setCostFeeList(costFeesList.isEmpty() ? new ArrayList<>() : costFeesList);
+			List<RouteCostItem> costItemList = routeCostItemService.list(new LambdaQueryWrapper<RouteCostItem>()
+				.eq(RouteCostItem::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostItem::getIsDeleted, 0)
+				.eq(RouteCostItem::getPid, id));
+			for (RouteCostItem costItem : costItemList) {
+				costItem.setId(null);
+				costItem.setPid(null);
+				costItem.setCreateTime(null);
+				costItem.setCreateUser(null);
+				costItem.setCreateUserName(null);
+				costItem.setUpdateUser(null);
+				costItem.setUpdateTime(null);
+				costItem.setUpdateUserName(null);
+			}
+			item.setCostItemList(costItemList.isEmpty() ? new ArrayList<>() : costItemList);
+			if (ObjectUtils.isNotNull(item.getCostItemList())) {
+				int days = item.getNavigateDay() + item.getExistStationDay();
+				List<RouteCostFee> costFeeList = item.getCostFeeList();
+				for (RouteCostItem routeCostItem : item.getCostItemList()) {
+					routeCostItem.setExrate(currencyUtils.obtainExrate("D", curExrateList, routeCostItem.getCurCode(), "1"));
+					//一程POL杂费成本
+					routeCostItem.setPolCost(computationalCost(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POL杂费收入
+					routeCostItem.setPolIncome(computationalIncome(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POD杂费成本
+					routeCostItem.setPodCost(computationalCost(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POD杂费收入
+					routeCostItem.setPodIncome(computationalIncome(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程用箱成本
+					if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
+						routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
+						BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
+						routeCostItem.setUseBoxCost(boxCost);
+					} else {
+						routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
+					}
+					// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本+附加费
+					routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
+						.add(routeCostItem.getUseBoxCost()).add(routeCostItem.getAdditionalFee()));
+					//一程合计利润
+					routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().add(routeCostItem.getPolIncome())
+						.add(routeCostItem.getPodIncome()).subtract(routeCostItem.getCostPrice()));
+					if ("转船".equals(item.getFlightType()) && "自转".equals(item.getChangeShipType())) {
+						//二程POL杂费成本
+						routeCostItem.setPolCostTwo(computationalCost(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POL杂费收入
+						routeCostItem.setPolIncomeTwo(computationalIncome(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POD杂费成本
+						routeCostItem.setPodCostTwo(computationalCost(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POD杂费收入
+						routeCostItem.setPodIncomeTwo(computationalIncome(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
+						routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
+						//二程合计利润
+						routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().add(routeCostItem.getPolIncomeTwo())
+							.add(routeCostItem.getPodIncomeTwo()).subtract(routeCostItem.getCostPriceTwo()));
+					}
+					routeCostItem.setTotalProfitTwo(routeCostItem.getTotalProfitTwo() != null ? routeCostItem.getTotalProfitTwo() : new BigDecimal("0.00"));
+					//合计利润
+					routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
+
+					if (routeCostItem.getId() == null) {
+						routeCostItem.setPid(id);
+						routeCostItem.setCreateTime(new Date());
+						routeCostItem.setCreateUser(AuthUtil.getUserId());
+						routeCostItem.setCreateUserName(AuthUtil.getUserName());
+					} else {
+						routeCostItem.setUpdateUser(AuthUtil.getUserId());
+						routeCostItem.setUpdateTime(new Date());
+						routeCostItem.setUpdateUserName(AuthUtil.getUserName());
+					}
+				}
+				item.setProfit20(totalProfit(item.getCostItemList(), "20"));
+				item.setProfit40(totalProfit(item.getCostItemList(), "40"));
+				item.setProfitHc(totalProfit(item.getCostItemList(), "40HC"));
+				item.setOtherProfit(totalProfit(item.getCostItemList(), "other"));
+				item.setTotalProfit(item.getProfit20().add(item.getProfit40()).add(item.getProfitHc()).add(item.getOtherProfit()));
+			}
+		}
+		return null;
+	}
+
 
 	/**
 	 * 合计费用成本

+ 78 - 16
blade-service/blade-los/src/main/java/org/springblade/los/box/service/impl/TradingBoxServiceImpl.java

@@ -23,6 +23,7 @@ import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.los.Util.BoxNumUtils;
 import org.springblade.los.Util.CurrencyUtils;
@@ -1282,6 +1283,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R generateBill(TradingBox tradingBoxs) {
 		if (tradingBoxs.getId() == null) {
 			throw new RuntimeException("缺少必要参数");
@@ -1599,11 +1601,9 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				putBox.setPodEname(detail.getPodEname());
 				putBox.setPodCode(detail.getPodCode());
 				putBox.setBoxCondition(tradingBox.getBoxCondition());
-
 				putBox.setTotalNum(tradingBox.getBoxNumber());
 				putBox.setRemainingNum(putBox.getTotalNum());
 				putBox.setNotSuitcaseNum(putBox.getTotalNum());
-
 				putBox.setEffectiveEndDate(tradingBox.getExpiryDate());
 				putBox.setEffectiveStartDate(tradingBox.getEffectiveDate());
 				putBox.setBoxType(tradingBox.getBoxTypeQuantityOne());
@@ -1629,6 +1629,14 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				putBox.setPodStationEname(detail.getPodStationEname());
 				putBox.setLoloPod(tradingBox.getLoloPod());
 				putBox.setLoloPol(tradingBox.getLoloPol());
+				putBox.setPodCyAddress(tradingBox.getPodCyAddress());
+				putBox.setPodCyContact(tradingBox.getPodCyContact());
+				putBox.setPodCyEmail(tradingBox.getPodCyEmail());
+				putBox.setPodCyTel(tradingBox.getPodCyTel());
+				putBox.setPolCyAddress(tradingBox.getPolCyAddress());
+				putBox.setPolCyContact(tradingBox.getPolCyContact());
+				putBox.setPolCyEmail(tradingBox.getPolCyEmail());
+				putBox.setPolCyTel(tradingBox.getPolCyTel());
 				putBoxService.save(putBox);
 			}
 			return R.data(putBox);
@@ -2357,6 +2365,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R revokeCountRent(TradingBox tradingBox) {
 		TradingBox detail = baseMapper.selectById(tradingBox.getId());
 		List<TradingBoxItem> tradingBoxItemList = tradingBoxItemService.list(new LambdaQueryWrapper<TradingBoxItem>()
@@ -2475,6 +2484,11 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		if (putBox == null) {
 			throw new RuntimeException("未查到放箱号");
 		}
+		putBox.setPodCyAddress(tradingBox.getPodCyAddress());
+		putBox.setPodCyContact(tradingBox.getPodCyContact());
+		putBox.setPodCyEmail(tradingBox.getPodCyEmail());
+		putBox.setPodCyTel(tradingBox.getPodCyTel());
+		putBoxService.updateById(putBox);
 		List<PutBoxItems> putBoxItemsList = putBoxItemsService.list(new LambdaQueryWrapper<PutBoxItems>()
 			.eq(PutBoxItems::getTenantId, AuthUtil.getTenantId())
 			.eq(PutBoxItems::getIsDeleted, 0)
@@ -2549,6 +2563,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R synchronousPutBoxData(TradingBox tradingBox) {
 		Long id = tradingBox.getId();
 		baseMapper.updateById(tradingBox);
@@ -2611,6 +2626,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R batchImportPickUpCost(Long id, Date accountDate) {
 		if (id == null || ObjectUtils.isNull(accountDate)) {
 			throw new RuntimeException("缺少必要参数");
@@ -2619,10 +2635,17 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		if (tradingBox == null) {
 			throw new RuntimeException("未查到单据信息");
 		}
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(accountDate);
+		int year = calendar.get(Calendar.YEAR); // 获取年份
+		int month = calendar.get(Calendar.MONTH) + 1; // 获取月份(注意需加上1,因为月份从0开始计数)
+		int day = calendar.get(Calendar.DATE);
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
 		List<TradingBoxItem> tradingBoxItemList = tradingBoxItemService.list(new LambdaQueryWrapper<TradingBoxItem>()
 			.eq(TradingBoxItem::getIsDeleted, 0)
 			.eq(TradingBoxItem::getTenantId, AuthUtil.getTenantId())
 			.eq(TradingBoxItem::getPid, id)
+			.apply("DATE_FORMAT(pol_pick_up_date,'%Y-%m') <= '" + formatter.format(tradingBox.getEffectiveDate()) + "'")
 			.eq(TradingBoxItem::getWhetherGeneratePickUpCost, "0"));
 		if (tradingBoxItemList.isEmpty()) {
 			throw new RuntimeException("箱明细已全部生成PickUp费");
@@ -2635,11 +2658,6 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			throw new RuntimeException("请先维护'Pickup'费用基础信息");
 		}
 		List<FeeCenterItems> feeCenterItemsList = new ArrayList<>();
-		Calendar calendar = Calendar.getInstance();
-		calendar.setTime(accountDate);
-		int year = calendar.get(Calendar.YEAR); // 获取年份
-		int month = calendar.get(Calendar.MONTH) + 1; // 获取月份(注意需加上1,因为月份从0开始计数)
-		int day = calendar.get(Calendar.DATE);
 		List<BCurExrate> bCurExrateList = currencyUtils.obtainRate(accountDate, "1", AuthUtil.getDeptId());
 		BigDecimal exrate = new BigDecimal("0.00");
 		if ("OW-F".equals(tradingBox.getType())) {
@@ -2875,7 +2893,11 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				feeCenterItems.setExrate(currencyUtils.obtainExrate("C", curExrateList, feeCenterItems.getCurCode(), "1"));
 			}
 			feeCenterItems.setAmount(amount.add(detail.getGateInFee()));
-			feeCenterItems.setPrice(price);
+			if (ObjectUtils.isNotNull(price) && price.length() > 1) {
+				feeCenterItems.setPrice(price.substring(0, price.length() - 1));
+			} else {
+				feeCenterItems.setPrice(price);
+			}
 			feeCenterItems.setGateInFee(detail.getGateInFee());
 			feeCenterItems.setRemarks(text);
 			feeCenterItems.setOutboundDate(endDate);
@@ -3091,6 +3113,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R revokeMergeGenerateCost(TradingBox tradingBox) {
 		if (tradingBox.getId() == null || ObjectUtils.isNull(tradingBox.getFeeCenterItemsList()) || tradingBox.getFeeCenterItemsList().isEmpty()) {
 			throw new RuntimeException("缺少必要参数");
@@ -3098,7 +3121,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		TradingBox detail = baseMapper.selectById(tradingBox.getId());
 		List<Long> idList = tradingBox.getFeeCenterItemsList().stream().map(FeeCenterItems::getFeeCenterId)
 			.distinct().filter(Objects::nonNull).collect(Collectors.toList());
-		if (!idList.isEmpty()){
+		if (!idList.isEmpty()) {
 			List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 				.eq(FeeCenter::getIsDeleted, 0)
@@ -3151,7 +3174,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		List<FeeCenterItems> feeCenterItems = feeCenterItemsService.list(new LambdaQueryWrapper<FeeCenterItems>()
 			.eq(FeeCenterItems::getTenantId, AuthUtil.getTenantId())
 			.eq(FeeCenterItems::getIsDeleted, 0)
-			.in(!idList.isEmpty(),FeeCenterItems::getFeeCenterId, idList)
+			.in(!idList.isEmpty(), FeeCenterItems::getFeeCenterId, idList)
 			.eq(FeeCenterItems::getWhetherGenerateCost, "1"));
 		for (FeeCenterItems centerItems : feeCenterItems) {
 			centerItems.setUpdateTime(new Date());
@@ -3168,6 +3191,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R revokEnable(TradingBox detail) {
 		if (ObjectUtils.isNull(detail.getId())) {
 			throw new RuntimeException("必要参数未填写");
@@ -3192,8 +3216,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 			.eq(PutBox::getTenantId, AuthUtil.getTenantId())
 			.eq(PutBox::getIsDeleted, 0)
 			.eq(PutBox::getSrcContainerNumber, tradingBox.getContainerNumber())
-			.eq(PutBox::getSrcNo, tradingBox.getId())
-			.eq(PutBox::getSrcId, tradingBox.getSysNo())
+			.eq(PutBox::getSrcNo, tradingBox.getSysNo())
+			.eq(PutBox::getSrcId, tradingBox.getId())
 			.eq(PutBox::getWhetherManuallyCreate, "1")
 		);
 		if (putBox != null) {
@@ -3225,7 +3249,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		if ("1".equals(boxReminderExcel.getType())) {
 
 		} else if ("2".equals(boxReminderExcel.getType())) {
-			String status = sysClient.getParamServiceDWT("box.usage.reminder",AuthUtil.getTenantId());
+			String status = sysClient.getParamServiceDWT("box.usage.reminder", AuthUtil.getTenantId());
 			if (ObjectUtils.isNull(status) || "获取数据失败".equals(status)) {
 				throw new RuntimeException("请先维护用箱提醒系统参数");
 			}
@@ -3237,7 +3261,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				.eq(TradingBox::getIsDeleted, 0)
 				.eq(TradingBox::getWhetherEnable, "是")
 				.lt(TradingBox::getEffectiveDate, calendar.getTime())
-				.apply("find_in_set(type,'OW-N,OW-F') and suitcase_num = 0"));
+				.apply("find_in_set(type,'OW-N,OW-F') and suitcase_num = 0")
+				.orderByAsc(TradingBox::getEffectiveDate));
 			for (TradingBox item : tradingBoxList) {
 				BoxReminderExcel excel = new BoxReminderExcel();
 				excel.setProvider(item.getPurchaseCompanyName());
@@ -3263,7 +3288,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				list.add(excel);
 			}
 		} else if ("3".equals(boxReminderExcel.getType())) {
-			String status = sysClient.getParamServiceDWT("postponement.reminder",AuthUtil.getTenantId());
+			String status = sysClient.getParamServiceDWT("postponement.reminder", AuthUtil.getTenantId());
 			if (ObjectUtils.isNull(status) || "获取数据失败".equals(status)) {
 				throw new RuntimeException("请先维护延期提醒系统参数");
 			}
@@ -3279,7 +3304,8 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 				.eq(TradingBox::getWhetherEnable, "是")
 				.ge(TradingBox::getExpiryDate, calendar.getTime())
 				.le(TradingBox::getExpiryDate, calendar1.getTime())
-				.apply("find_in_set(type,'OW-N,OW-F') and suitcase_num != 0"));
+				.apply("find_in_set(type,'OW-N,OW-F') and suitcase_num != 0")
+				.orderByAsc(TradingBox::getExpiryDate));
 			for (TradingBox item : tradingBoxList) {
 				BoxReminderExcel excel = new BoxReminderExcel();
 				excel.setProvider(item.getPurchaseCompanyName());
@@ -3310,4 +3336,40 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		return list;
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R revokePickUpCost(Long id, String itemIds) {
+		TradingBox detail = baseMapper.selectById(id);
+		//获取订单费用信息
+		LambdaQueryWrapper<FeeCenterItems> tradingBoxFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		tradingBoxFeesLambdaQueryWrapper.eq(FeeCenterItems::getIsDeleted, 0)
+			.eq(FeeCenterItems::getPid, id)
+			.eq(FeeCenterItems::getTenantId, AuthUtil.getTenantId())
+			.in(FeeCenterItems::getId, Func.toLongList(itemIds));
+		List<FeeCenterItems> feeCenterItems = feeCenterItemsService.list(tradingBoxFeesLambdaQueryWrapper);
+		if (feeCenterItems.isEmpty()) {
+			throw new RuntimeException("未查到Pickup明细");
+		}
+		for (FeeCenterItems item : feeCenterItems) {
+			if ("1".equals(item.getWhetherGenerateCost())) {
+				throw new RuntimeException("箱号:" + item.getCntrNo() + "已生费用明细,撤销失败");
+			}
+		}
+		feeCenterItemsService.removeByIds(feeCenterItems.stream().map(FeeCenterItems::getId).collect(Collectors.toList()));
+		List<TradingBoxItem> tradingBoxItemList = tradingBoxItemService.list(new LambdaQueryWrapper<TradingBoxItem>()
+			.eq(TradingBoxItem::getIsDeleted, 0)
+			.eq(TradingBoxItem::getTenantId, AuthUtil.getTenantId())
+			.eq(TradingBoxItem::getPid, id)
+			.in(TradingBoxItem::getId, feeCenterItems.stream().map(FeeCenterItems::getSrcItemId).collect(Collectors.toList()))
+			.eq(TradingBoxItem::getWhetherGeneratePickUpCost, "1"));
+		if (tradingBoxItemList.isEmpty()) {
+			throw new RuntimeException("未查到箱号明细");
+		}
+		for (TradingBoxItem item : tradingBoxItemList) {
+			item.setWhetherGeneratePickUpCost("0");
+		}
+		tradingBoxItemService.updateBatchById(tradingBoxItemList);
+		return R.data(detail);
+	}
+
 }

+ 26 - 4
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BookingCabinController.java

@@ -29,6 +29,8 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.los.basic.corps.entity.BCorpsAttn;
+import org.springblade.los.basic.corps.service.IBCorpsAttnService;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.entity.PreContainers;
 import org.springblade.los.business.sea.entity.SeaBillsDetail;
@@ -40,6 +42,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -60,6 +63,8 @@ public class BookingCabinController extends BladeController {
 
 	private final IPreContainersService preContainersService;
 
+	private final IBCorpsAttnService corpsAttnService;
+
 	/**
 	 * 详情
 	 */
@@ -150,10 +155,10 @@ public class BookingCabinController extends BladeController {
 			} else if (6 == bills.getBillStatus()) {
 				//待审核
 				lambdaQueryWrapper.eq(Bills::getStatus, 0);
-			}else if (7 == bills.getBillStatus()) {
+			} else if (7 == bills.getBillStatus()) {
 				//订舱驳回
 				lambdaQueryWrapper.eq(Bills::getIssueStatus, "6");
-			}else if (8 == bills.getBillStatus()) {
+			} else if (8 == bills.getBillStatus()) {
 				//已退舱
 				lambdaQueryWrapper.eq(Bills::getBillStatus, "1");
 			}
@@ -255,7 +260,7 @@ public class BookingCabinController extends BladeController {
 	 * 提交箱型
 	 */
 	@GetMapping("/submitBoxType")
-	public R submitBoxType( Bills bills) {
+	public R submitBoxType(Bills bills) {
 		return billsService.submitBoxType(bills);
 	}
 
@@ -288,7 +293,24 @@ public class BookingCabinController extends BladeController {
 			.and(ObjectUtils.isNotNull(bills.getPolEnName()), i -> i.like(Bills::getPolCnName, bills.getPolEnName()).or()
 				.like(Bills::getPolEnName, bills.getPolEnName()).or().like(Bills::getPolCode, bills.getPolEnName()));
 		if (!AuthUtil.getUserRole().contains("总部") && !AuthUtil.getUserRole().contains("admin")) {
-			lambdaQueryWrapper.eq(Bills::getBranchId, AuthUtil.getDeptId());
+			BCorpsAttn bCorpsAttn = corpsAttnService.getOne(new LambdaQueryWrapper<BCorpsAttn>()
+				.eq(BCorpsAttn::getIsDeleted, 0)
+				.eq(BCorpsAttn::getTenantId, AuthUtil.getTenantId())
+				.eq(BCorpsAttn::getUserId, AuthUtil.getUserId()));
+			if (bCorpsAttn != null) {
+				List<BCorpsAttn> bCorpsAttnList = corpsAttnService.list(new LambdaQueryWrapper<BCorpsAttn>()
+					.eq(BCorpsAttn::getPid, bCorpsAttn.getPid())
+					.eq(BCorpsAttn::getTenantId, AuthUtil.getTenantId())
+					.eq(BCorpsAttn::getIsDeleted, 0));
+				if (!bCorpsAttnList.isEmpty()) {
+					lambdaQueryWrapper.in(Bills::getCreateUser, bCorpsAttnList.stream().map(BCorpsAttn::getUserId).filter(Objects::nonNull)
+						.distinct().collect(Collectors.toList()));
+				} else {
+					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
+				}
+			} else {
+				lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
+			}
 		} else {
 			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(bills.getBranchId()), Bills::getBranchId, bills.getBranchId());
 		}

+ 8 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/ContainersMapper.xml

@@ -93,6 +93,10 @@
         sc.seal_no as sealNo,
         sc.cntr_type_code as cntrTypeCode,
         sc.pod_station_cname as podStationCname,
+        sc.pod_cy_address as podCyAddress,
+        sc.pod_cy_contact as podCyContact,
+        sc.pod_cy_email as podCyEmail,
+        sc.pod_cy_tel as podCyTel,
         sc.id as containersId,
         se.id as id,
         se.eta as eta,
@@ -194,6 +198,10 @@
         sc.seal_no as sealNo,
         sc.cntr_type_code as cntrTypeCode,
         sc.pod_station_cname as podStationCname,
+        sc.pod_cy_address as podCyAddress,
+        sc.pod_cy_contact as podCyContact,
+        sc.pod_cy_email as podCyEmail,
+        sc.pod_cy_tel as podCyTel,
         sc.id as containersId,
         se.id as id,
         se.eta as eta,

+ 17 - 10
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import org.springblade.client.entity.Message;
 import org.springblade.client.feign.IMessageClient;
@@ -69,6 +70,7 @@ import org.springblade.los.finance.fee.service.IFeeCenterService;
 import org.springblade.los.finance.fee.service.IFinAccBillsService;
 import org.springblade.los.finance.genleg.entity.FinPeriod;
 import org.springblade.los.finance.genleg.mapper.FinPeriodMapper;
+import org.springblade.los.utils.LosSpecialHandle;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
@@ -5376,23 +5378,26 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			throw new RuntimeException("未查到订舱单据配箱信息");
 		}
 		//覆盖主表信息
-		billsFd.setPolId(billsBooking.getPolId());
-		billsFd.setPolCode(billsBooking.getPolCode());
-		billsFd.setPolCnName(billsBooking.getPolCnName());
-		billsFd.setPolEnName(billsBooking.getPolEnName());
-		billsFd.setPodId(billsBooking.getPodId());
-		billsFd.setPodCode(billsBooking.getPodCode());
-		billsFd.setPodCnName(billsBooking.getPodCnName());
-		billsFd.setPodEnName(billsBooking.getPodEnName());
 		billsFd.setMarks(billsBooking.getMarks());
+		billsFd.setCommodityCnName(billsBooking.getCommodityCnName());
+		billsFd.setCommodityEnName(billsBooking.getCommodityEnName());
+		billsFd.setCommodityShName(billsBooking.getCommodityShName());
+		billsFd.setHscode(billsBooking.getHscode());
 		billsFd.setCommodityDescr(billsBooking.getCommodityDescr());
 		billsFd.setHpaymode(billsBooking.getMpaymode());
 		billsFd.setMpaymode(billsBooking.getMpaymode());
+		billsFd.setPackingUnit(billsBooking.getPackingUnit());
+		billsFd.setPackingUnitId(billsBooking.getPackingUnitId());
+		billsFd.setIssueType(billsBooking.getIssueType());
+		billsFd.setBookingRemarks(billsBooking.getCyRemarks());
 		billsFd.setServiceTerms(billsBooking.getServiceTerms());
 		billsFd.setQuantity(billsBooking.getQuantity());
 		billsFd.setGrossWeight(billsBooking.getGrossWeight());
 		billsFd.setMeasurement(billsBooking.getMeasurement());
 		billsFd.setSiRemarks(billsBooking.getSiRemarks());
+		billsFd.setCorpAttnName(billsBooking.getCorpAttnName());
+		billsFd.setCorpAttnTel(billsBooking.getCorpAttnTel());
+		billsFd.setCorpAttnEmail(billsBooking.getCorpAttnEmail());
 		baseMapper.updateById(billsFd);
 		//覆盖主表从表明细信息
 		seaBillsDetailFd.setHnotifyDetails(seaBillsDetailBooking.getHnotifyDetails());
@@ -5840,7 +5845,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					sendMessage.setUrl("/iosBasicData/SeafreightExportF/bills/index");
 					sendMessage.setPageLabel("海运出口");
 					sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-					sendMessage.setMessageBody("客户已提交修改箱型箱量,请及时待处理!订舱单号:" + bookingCabin.getBillNo() + "时间:" + formatted);
+					sendMessage.setMessageBody("客户已提交修改箱型箱量,请及时待处理!订舱单号:" + bookingCabin.getHblno() + "时间:" + formatted);
 					R save = messageClient.save(sendMessage);
 					if (!save.isSuccess()) {
 						throw new SecurityException("发送消息失败");
@@ -5866,7 +5871,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					sendMessage.setUrl("/iosBasicData/SeafreightExportF/bills/index");
 					sendMessage.setPageLabel("海运出口");
 					sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-					sendMessage.setMessageBody("客户已提交修改箱型箱量,请及时待处理!订舱单号:" + bookingCabin.getBillNo() + "时间:" + formatted);
+					sendMessage.setMessageBody("客户已提交修改箱型箱量,请及时待处理!订舱单号:" + bookingCabin.getHblno() + "时间:" + formatted);
 					R save = messageClient.save(sendMessage);
 					if (!save.isSuccess()) {
 						throw new SecurityException("发送消息失败");
@@ -5966,6 +5971,8 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		bills.setStatus(null);
 		bills.setBillStatus(null);
 		bills.setWhetherModify(null);
+		bills.setMblno("");
+		bills.setHblno("");
 		bills.setTemplatesName(detail.getTemplatesName());
 		bills.setBillNo((String) clientBillNo.getData());
 		bills.setBusinessType("DCMB");

+ 24 - 0
blade-service/blade-los/src/main/java/org/springblade/los/excel/UpdatePodStationExcel.java

@@ -2,6 +2,7 @@ package org.springblade.los.excel;
 
 import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.Date;
@@ -104,6 +105,29 @@ public class UpdatePodStationExcel {
 	@ExcelProperty(value = "pod场站")
 	private String podStationCname;
 	/**
+	 * 目的港场站地址
+	 */
+	@ExcelProperty(value = "目的港场站地址")
+	private String podCyAddress;
+
+	/**
+	 * 目的港场站联系人
+	 */
+	@ExcelProperty(value = "目的港场站联系人")
+	private String podCyContact;
+
+	/**
+	 * 目的港场站邮箱
+	 */
+	@ExcelProperty(value = "目的港场站邮箱")
+	private String podCyEmail;
+
+	/**
+	 * 目的港场站电话
+	 */
+	@ExcelProperty(value = "目的港场站电话")
+	private String podCyTel;
+	/**
 	 * 唛头
 	 */
 	@ExcelProperty(value = "唛头")

+ 2 - 1
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/controller/FeeCenterItemsController.java

@@ -76,7 +76,8 @@ public class FeeCenterItemsController extends BladeController {
 			.eq(FeeCenterItems::getPid, feeCenterItems.getPid())
 			.eq(FeeCenterItems::getFeeType, feeCenterItems.getFeeType())
 			.eq(ObjectUtils.isNotNull(feeCenterItems.getCntrNo()),FeeCenterItems::getCntrNo, feeCenterItems.getCntrNo())
-			.apply(ObjectUtils.isNotNull(feeCenterItems.getDate()),"DATE_FORMAT(account_date,'%Y-%m') = '" + feeCenterItems.getDate() + "'");
+			.apply(ObjectUtils.isNotNull(feeCenterItems.getDate()),"DATE_FORMAT(account_date,'%Y-%m') = '" + feeCenterItems.getDate() + "'")
+			.orderByDesc(FeeCenterItems::getAccountDate);
 		List<FeeCenterItems> pages = feeCenterItemsService.list(lambdaQueryWrapper);
 		return R.data(pages);
 	}

+ 9 - 9
blade-service/blade-los/src/main/java/org/springblade/los/finance/operatingExpenses/service/impl/OperatingExpensesServiceImpl.java

@@ -267,7 +267,7 @@ public class OperatingExpensesServiceImpl extends ServiceImpl<OperatingExpensesM
 		if (!financeProcess.isSuccess()) {
 			throw new SecurityException("操作失败,请联系管理员");
 		}
-		operatingExpenses.setStatus("0");
+		declare.setStatus("0");
 		baseMapper.updateById(declare);
 		return R.data(declare);
 	}
@@ -275,10 +275,10 @@ public class OperatingExpensesServiceImpl extends ServiceImpl<OperatingExpensesM
 	@Override
 	public R confirmation(OperatingExpenses operatingExpenses) {
 		OperatingExpenses declare = baseMapper.selectById(operatingExpenses.getId());
-		operatingExpenses.setSettlementStatus("1");
-		operatingExpenses.setSettlementDate(new Date());
-		operatingExpenses.setSettlementPersonId(AuthUtil.getUserId());
-		operatingExpenses.setSettlementPersonName(AuthUtil.getUserName());
+		declare.setSettlementStatus("1");
+		declare.setSettlementDate(new Date());
+		declare.setSettlementPersonId(AuthUtil.getUserId());
+		declare.setSettlementPersonName(AuthUtil.getUserName());
 		baseMapper.updateById(declare);
 		return R.data(declare);
 	}
@@ -286,10 +286,10 @@ public class OperatingExpensesServiceImpl extends ServiceImpl<OperatingExpensesM
 	@Override
 	public R revokeConfirmation(OperatingExpenses operatingExpenses) {
 		OperatingExpenses declare = baseMapper.selectById(operatingExpenses.getId());
-		operatingExpenses.setSettlementStatus("0");
-		operatingExpenses.setSettlementDate(null);
-		operatingExpenses.setSettlementPersonId(null);
-		operatingExpenses.setSettlementPersonName(null);
+		declare.setSettlementStatus("0");
+		declare.setSettlementDate(null);
+		declare.setSettlementPersonId(null);
+		declare.setSettlementPersonName(null);
 		baseMapper.updateById(declare);
 		return R.data(declare);
 	}

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/ftp/service/impl/CyFtpServiceImpl.java

@@ -308,7 +308,7 @@ public class CyFtpServiceImpl implements CyFtpService {
 		try {
 			// 获取文件列表
 			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
-			if (file.getName().endsWith(".txt")) {
+			if (Objects.requireNonNull(file.getOriginalFilename()).contains(".txt")) {
 				// 下载文件
 				InputStream inputStream = file.getInputStream();
 				// 解析EDIFACT内容