Browse Source

1.mkt&slot模块增加请核接口
3.mkt&slot模块增加撤销请核接口
4.mkt&slot模块增加审核逻辑
5.海运进出口复制增加配箱信息
6.配箱明细导入接口逻辑修改
7.财务明细保存不覆盖所属公司
8.客户托书增加报表打印接口
9.费用-申请修改增加报表打印接口
10.箱-ftp进场导入,出场导入接口逻辑修改
11.预定舱、托书,复制数据问题修改
12.海运进出口,客户托书样本导入逻辑修改
13.海运箱量利润统计修改

纪新园 6 months ago
parent
commit
27ccc0bf77
25 changed files with 623 additions and 129 deletions
  1. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/excel/EmptyContainerAppearanceAnalysis.java
  2. 17 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/mktSlot/entity/MktSlot.java
  3. 11 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/view/entity/BoxNumberProfit.java
  4. 1 22
      blade-service/blade-los/src/main/java/org/springblade/los/Util/MagicValues.java
  5. 13 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/service/impl/ReportsServiceImpl.java
  6. 20 1
      blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/controller/MktSlotController.java
  7. 4 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/service/IMktSlotService.java
  8. 125 1
      blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/service/impl/MktSlotServiceImpl.java
  9. 2 1
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java
  10. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java
  11. 46 11
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  12. 5 5
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/ContainersServiceImpl.java
  13. 9 6
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/TemplateImportServiceImpl.java
  14. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditProecessController.java
  15. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/check/service/IAuditProecessService.java
  16. 171 0
      blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java
  17. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/excel/BoxAndLeadSealNoExcel.java
  18. 12 2
      blade-service/blade-los/src/main/java/org/springblade/los/excel/BoxNumberProfitExcel.java
  19. 1 10
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/controller/FeeCenterController.java
  20. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/IFeeCenterService.java
  21. 41 11
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterServiceImpl.java
  22. 3 2
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterUpdateRecordServiceImpl.java
  23. 5 8
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java
  24. 48 37
      blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/impl/FinStlBillsServiceImpl.java
  25. 76 10
      blade-service/blade-los/src/main/java/org/springblade/los/ftp/service/impl/CyFtpServiceImpl.java

+ 5 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/box/excel/EmptyContainerAppearanceAnalysis.java

@@ -66,4 +66,9 @@ public class EmptyContainerAppearanceAnalysis {
 	 */
 	private String reason;
 
+	/**
+	 * 来源文件
+	 */
+	private String srcFile;
+
 }

+ 17 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/mktSlot/entity/MktSlot.java

@@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.los.check.entity.LosAuditPathsLevels;
 import org.springblade.system.entity.Dept;
 import org.springframework.format.annotation.DateTimeFormat;
 
@@ -231,5 +232,21 @@ public class MktSlot implements Serializable {
 	@TableField(exist = false)
 	private String etd;
 
+	//审核-跳转对应页面的路由
+	@TableField(exist = false)
+	private String url;
+	//审核-页面枚举
+	@TableField(exist = false)
+	private String pageStatus;
+	//审核-页面名字
+	@TableField(exist = false)
+	private String pageLabel;
+
+	/**
+	 * 审核路径
+	 */
+	@TableField(exist = false)
+	private List<LosAuditPathsLevels> auditPathsLevels;
+
 
 }

+ 11 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/view/entity/BoxNumberProfit.java

@@ -18,6 +18,7 @@ package org.springblade.los.view.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -39,6 +40,7 @@ public class BoxNumberProfit implements Serializable {
 
 	private Long id;
 	private String branchId;
+	private String branchName;
 	private String tenantId;
 	private String businessType;
 	private String billNo;
@@ -86,9 +88,18 @@ public class BoxNumberProfit implements Serializable {
 	private Long teamId;
 	private String teamName;
 	private Long operatorId;
+	private Long operatorName;
 	private String operatorDept;
 	private String srcDeptId;
 	private Long createUser;
+	/**
+	 * 客服
+	 */
+	private Long customerServiceId;
+	/**
+	 * 客服
+	 */
+	private String customerServiceName;
 
 
 }

+ 1 - 22
blade-service/blade-los/src/main/java/org/springblade/los/Util/MagicValues.java

@@ -17,6 +17,7 @@ public class MagicValues {
 	public static final String XGDX = "XGDX";
 	public static final String CCSQ = "CCSQ";
 	public static final String DXCB = "DXCB";
+	public static final String KHTS = "KHTS";
 	public static final String DOCUMENT = "单证";
 	public static final String COST = "费用";
 	public static final String PAID_APPLICATION = "付费申请";
@@ -32,46 +33,30 @@ public class MagicValues {
 	public static final String SETTLEMENT_CENTER = "结算中心";
 	public static final String MEET = "应付";
 	public static final String MEET_BILL = "应付-账单";
-
 	public static final String MEET_BILL_NUMBER = "应付-账单号";
 	public static final String MEET_AMEND = "应付-amend";
 	public static final String RECEIVABLE = "应收";
-
 	public static final String RECEIVABLE_BILL = "应收-账单";
-
 	public static final String BILL_NUMBER = "应收-账单号";
 	public static final String RECEIVABLE_AMEND = "应收-amend";
 	public static final String DISPATCH_NOTICE = "派车通知单";
 	public static final String INCOMING_NOTIFICATION = "入货通知";
 	public static final String SALES_REPORT = "销售报告";
-
 	public static final String CONTAINER_PREVIEW = "配箱预览";
 	public static final String SALES_REPORT_AMEND = "销售报告-amend";
-
 	public static final String MASTER_BILLS = "MASTER 提单";
 	public static final String BILLS_DETAIL = "提单详情";
 	public static final String BILLS_DETAIL_M = "提单详情(M)";
 	public static final String HYCK = "HYCK";
-
 	public static final String HYJK = "HYJK";
-
 	public static final String BJZX = "BJZX";
-
 	public static final String QUOTATION_CENTER = "mkt&slot";
 	public static final String FYSQ = "FYSQ";
 	public static final String AMEND = "AMEND";
 	public static final String AMEND_SI = "AMENDSI";
 	public static final String AMEND_SE = "AMENDSE";
-	public static final String AMEND_AE = "AMENDAE";
-	public static final String AMEND_AI = "AMENDAI";
 	public static final String SE = "SE";
 	public static final String SI = "SI";
-	public static final String AE = "AE";
-	public static final String AI = "AI";
-	public static final String BGSE = "BGSE";
-	public static final String BGSI = "BGSI";
-	public static final String BGAE = "BGAE";
-	public static final String BGAI = "BGAI";
 	public static final String USD = "USD";
 	public static final String CNY = "CNY";
 	public static final String D = "D";
@@ -82,8 +67,6 @@ public class MagicValues {
 	public static final String MH = "MH";
 	public static final String MM = "MM";
 	public static final String DD = "DD";
-	public static final String PROFIT_MARGIN = "profit.margin";
-	public static final String SALESREPORT_OVERLIMIT = "salesReport.overlimit";
 	public static final String DATA = "data";
 	public static final String[] units = {
 		"", // 0
@@ -92,16 +75,12 @@ public class MagicValues {
 		"ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN",
 		"SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"
 	};
-
 	public static final String[] tens = {
 		"", // 0
 		"", // 1
 		"TWENTY", "THIRTY", "FORTY", "FIFTY",
 		"SIXTY", "SEVENTY", "EIGHTY", "NINETY"
 	};
-
-	public static final String HUNDRED = "100";
-
 	private MagicValues() {} // 防止外部实例化该类
 
 }

+ 13 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/service/impl/ReportsServiceImpl.java

@@ -720,6 +720,19 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 				} else {
 					map.put(MagicValues.DATA, null);
 				}
+			} else if (MagicValues.KHTS.equals(reportCode) && MagicValues.KHTS.equals(groupCode) && MagicValues.KHTS.equals(type)) {
+				Bills bills = billsService.getById(billId);
+				if (bills != null) {
+					List<PreContainers> preContainersList = preContainersService.list(new LambdaQueryWrapper<PreContainers>()
+						.eq(PreContainers::getIsDeleted, 0)
+						.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
+						.eq(PreContainers::getPid, bills.getId()));
+					bills.setPreContainersList(preContainersList);
+					bills.setDept(dept);
+					map.put(MagicValues.DATA, bills);
+				} else {
+					map.put(MagicValues.DATA, null);
+				}
 			}
 		}
 		return R.data(map);

+ 20 - 1
blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/controller/MktSlotController.java

@@ -24,6 +24,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
+import org.springblade.common.annotation.RepeatSubmit;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -207,7 +208,7 @@ public class MktSlotController extends BladeController {
 				.eq(MktSlotQuotation::getIsDeleted, 0)
 				.eq(ObjectUtils.isNotNull(mktSlot.getPolId()), MktSlotQuotation::getPolId, mktSlot.getPolId())
 				.eq(ObjectUtils.isNotNull(mktSlot.getPodId()), MktSlotQuotation::getPodId, mktSlot.getPodId())
-				.eq(ObjectUtils.isNotNull(mktSlot.getActualShippingCompanyId()),MktSlotQuotation::getActualShippingCompanyId, mktSlot.getActualShippingCompanyId())
+				.eq(ObjectUtils.isNotNull(mktSlot.getActualShippingCompanyId()), MktSlotQuotation::getActualShippingCompanyId, mktSlot.getActualShippingCompanyId())
 				.eq(MktSlotQuotation::getEtd, mktSlot.getEtd())
 				.in(MktSlotQuotation::getPid, pid)
 			);
@@ -215,4 +216,22 @@ public class MktSlotController extends BladeController {
 		return R.data(mktSlotQuotationList);
 	}
 
+	/**
+	 * 请核
+	 */
+	@PostMapping("/checkMktSlot")
+	@RepeatSubmit
+	public R checkMktSlot(@Valid @RequestBody MktSlot mktSlot) {
+		return mktSlotService.checkMktSlot(mktSlot);
+	}
+
+	/**
+	 * 撤销请核
+	 */
+	@GetMapping("/revokeCheckMktSlot")
+	@RepeatSubmit
+	public R revokeCheckMktSlot(@RequestParam("id") Long id) {
+		return mktSlotService.revokeCheckMktSlot(id);
+	}
+
 }

+ 4 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/service/IMktSlotService.java

@@ -50,4 +50,8 @@ public interface IMktSlotService extends IService<MktSlot> {
 	R generateQuotation(MktSlot mktSlot);
 
 	R revokeQuotation(MktSlot mktSlot);
+
+    R checkMktSlot(MktSlot mktSlot);
+
+	R revokeCheckMktSlot(Long id);
 }

+ 125 - 1
blade-service/blade-los/src/main/java/org/springblade/los/business/mktSlot/service/impl/MktSlotServiceImpl.java

@@ -18,6 +18,7 @@ package org.springblade.los.business.mktSlot.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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 lombok.AllArgsConstructor;
@@ -25,7 +26,6 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.los.Util.CurrencyUtils;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.billno.entity.BusinessBillNo;
@@ -38,6 +38,12 @@ import org.springblade.los.business.mktSlot.service.IMktSlotItemService;
 import org.springblade.los.business.mktSlot.service.IMktSlotQuotationService;
 import org.springblade.los.business.mktSlot.service.IMktSlotService;
 import org.springblade.los.business.mktSlot.vo.MktSlotVO;
+import org.springblade.los.check.dto.LosAuditProecessDTO;
+import org.springblade.los.check.entity.LosAuditPathsActs;
+import org.springblade.los.check.entity.LosAuditPathsLevels;
+import org.springblade.los.check.service.IAuditPathsActsService;
+import org.springblade.los.check.service.IAuditPathsLevelsService;
+import org.springblade.los.check.service.IAuditProecessService;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -71,6 +77,12 @@ public class MktSlotServiceImpl extends ServiceImpl<MktSlotMapper, MktSlot> impl
 
 	private final IMktSlotQuotationService mktSlotQuotationService;
 
+	private final IAuditPathsActsService auditPathsActsService;
+
+	private final IAuditPathsLevelsService auditPathsLevelsService;
+
+	private final IAuditProecessService auditProecessService;
+
 	@Override
 	public IPage<MktSlotVO> selectMktSlotPage(IPage<MktSlotVO> page, MktSlotVO mktSlot) {
 		return page.setRecords(baseMapper.selectMktSlotPage(page, mktSlot));
@@ -357,4 +369,116 @@ public class MktSlotServiceImpl extends ServiceImpl<MktSlotMapper, MktSlot> impl
 		return R.data(mktSlot);
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R checkMktSlot(MktSlot mktSlot) {
+		MktSlot detail = baseMapper.selectById(mktSlot.getId());
+		int actId = 1135;
+		String processType = "mkt&slot审核";
+		String checkType = "BJZX";
+		//审批数据
+		LosAuditProecessDTO auditProecessDTO = new LosAuditProecessDTO();
+		//获取审批级次
+		List<LosAuditPathsLevels> auditPathsLevels;
+		// 判断是否有审批流,如果审批流已开启就进入审批流,否则直接走申请通过
+		LosAuditPathsActs pathsActs;
+		//是否开启流程
+		LambdaQueryWrapper<LosAuditPathsActs> auditPathsActsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		auditPathsActsLambdaQueryWrapper
+			.eq(LosAuditPathsActs::getIsEnable, 1)
+			.eq(LosAuditPathsActs::getFidStatus, "status")
+			.eq(LosAuditPathsActs::getTenantId, AuthUtil.getTenantId())
+			.eq(LosAuditPathsActs::getSalesCompanyId, detail.getBranchId())
+			.eq(LosAuditPathsActs::getActId, actId);
+		pathsActs = auditPathsActsService.getOne(auditPathsActsLambdaQueryWrapper);
+		//获取审批信息
+		LosAuditPathsActs losAuditPathsActs = auditPathsActsService.getOne(new LambdaQueryWrapper<LosAuditPathsActs>()
+			.eq(LosAuditPathsActs::getActId, actId)
+			.eq(LosAuditPathsActs::getFidStatus, "status")
+			.eq(LosAuditPathsActs::getSalesCompanyId, detail.getBranchId())
+			.eq(LosAuditPathsActs::getTenantId, AuthUtil.getTenantId()));
+		Long pathId = losAuditPathsActs.getPathId();
+		auditPathsLevels = auditPathsLevelsService.list(new LambdaQueryWrapper<LosAuditPathsLevels>()
+			.eq(LosAuditPathsLevels::getTenantId, AuthUtil.getTenantId())
+			.eq(LosAuditPathsLevels::getPathId, pathId)
+			.eq(LosAuditPathsLevels::getSalesCompanyId, detail.getBranchId())
+		);
+		auditProecessDTO.setTimes(1);
+		auditProecessDTO.setProcessType(processType);
+		// 没开启审批流直接走 通过流程
+		if (pathsActs == null || pathsActs.getIsEnable() == 2) {
+			throw new SecurityException("当前租户未查询到审批流配置");
+		} else {
+			if (CollectionUtils.isEmpty(auditPathsLevels)) {
+				throw new SecurityException("开启审批失败:未查询到审批信息");
+			}
+			// 绑定审核类型
+			auditProecessDTO.setCheckType(checkType);
+			// 追加跳转路由url
+			auditProecessDTO.setUrl(mktSlot.getUrl());
+			auditProecessDTO.setPageStatus(mktSlot.getPageStatus());
+			auditProecessDTO.setPageLabel(mktSlot.getPageLabel());
+			auditProecessDTO.setOrderRemark(detail.getRemarks());
+			List<LosAuditPathsLevels> pathsLevelsList = mktSlot.getAuditPathsLevels();
+			if (ObjectUtils.isNotNull(pathsLevelsList) && !pathsLevelsList.isEmpty()) {
+				List<Long> idList = pathsLevelsList.stream().map(LosAuditPathsLevels::getId).collect(Collectors.toList());
+				List<LosAuditPathsLevels> levelsList = new ArrayList<>();
+				for (LosAuditPathsLevels item : auditPathsLevels) {
+					if (2 == item.getUserMold()) {
+						if (idList.contains(item.getId())) {
+							levelsList.add(item);
+						}
+					} else {
+						levelsList.add(item);
+					}
+				}
+				auditProecessDTO.setPathsLevelsList(levelsList);
+			} else {
+				auditProecessDTO.setPathsLevelsList(auditPathsLevels);
+			}
+			auditProecessDTO.setActId(1);
+			auditProecessDTO.setSrcBillId(detail.getId());
+			auditProecessDTO.setBillId(detail.getId());
+			auditProecessDTO.setBillNo(detail.getSysNo());
+			auditProecessDTO.setSendUserId(AuthUtil.getUserId());
+			auditProecessDTO.setSendName(AuthUtil.getUserName());
+			auditProecessDTO.setSendTime(new Date());
+			auditProecessDTO.setBillTime(detail.getCreateTime());
+			auditProecessDTO.setTenantId(AuthUtil.getTenantId());
+			auditProecessDTO.setReferenceNumber(detail.getSysNo());
+			auditProecessDTO.setMorderNo(detail.getSysNo());
+			auditProecessDTO.setSrcBusType("BJZX");
+			auditProecessDTO.setSalesCompanyId(Long.parseLong(detail.getBranchId()));
+			auditProecessDTO.setSalesCompanyName(detail.getBranchName());
+			auditProecessDTO.setMblno(detail.getSysNo());
+			auditProecessDTO.setHblno(detail.getSysNo());
+			R financeProcess = auditProecessService.createFinanceProcess(auditProecessDTO);
+			if (!financeProcess.isSuccess()) {
+				throw new SecurityException("操作失败,请联系管理员");
+			}
+		}
+		detail.setStatus("1");
+		baseMapper.updateById(detail);
+		return R.data(detail);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R revokeCheckMktSlot(Long id) {
+		MktSlot detail = baseMapper.selectById(id);
+		if (detail == null) {
+			throw new RuntimeException("未查到单据");
+		}
+		detail.setStatus("0");
+		detail.setUpdateUser(AuthUtil.getUserId());
+		detail.setUpdateTime(new Date());
+		detail.setUpdateUserName(AuthUtil.getUserName());
+		baseMapper.updateById(detail);
+		R financeProcess = auditProecessService.deteleByBillId(id);
+		if (!financeProcess.isSuccess()) {
+			throw new SecurityException("操作失败,请联系管理员");
+		}
+		return R.data(detail);
+	}
+
 }

+ 2 - 1
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java

@@ -547,8 +547,9 @@ public class BillsController extends BladeController {
 	public R batchCopyBills(@RequestParam("ids") String ids,
 							@RequestParam(value = "billType", required = false) String billType,
 							@RequestParam(value = "copyCntr", required = false) String copyCntr,
+							@RequestParam(value = "containers", required = false) String containers,
 							@RequestParam(value = "copyFee", required = false) String copyFee) {
-		return billsService.batchCopyBills(ids, billType, copyCntr, copyFee);
+		return billsService.batchCopyBills(ids, billType, copyCntr, copyFee,containers);
 	}
 
 	/**

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java

@@ -174,7 +174,7 @@ public interface IBillsService extends IService<Bills> {
 
 	R increaseReinsurancePolicyTeu(String ids, String id);
 
-	R batchCopyBills(String ids, String billType, String copyCntr, String copyFee);
+	R batchCopyBills(String ids, String billType, String copyCntr, String copyFee, String containers);
 
 	Bills detailBookingCabin(Bills bills);
 

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

@@ -3985,7 +3985,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public R batchCopyBills(String ids, String billType, String copyCntr, String copyFee) {
+	public R batchCopyBills(String ids, String billType, String copyCntr, String copyFee, String containers) {
 		if (ObjectUtils.isNull(ids)) {
 			throw new SecurityException("缺少必要参数");
 		}
@@ -4013,6 +4013,13 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				.eq(PreContainers::getIsDeleted, 0)
 				.in(PreContainers::getPid, Func.toLongList(ids)));
 		}
+		List<Containers> containersList = new ArrayList<>();
+		if (ObjectUtils.isNotNull(containers) && "1".equals(containers)) {
+			containersList = containersService.list(new LambdaQueryWrapper<Containers>()
+				.eq(Containers::getTenantId, AuthUtil.getTenantId())
+				.eq(Containers::getIsDeleted, 0)
+				.in(Containers::getPid, Func.toLongList(ids)));
+		}
 		BusinessType businessType = bBusinessTypeService.getOne(new LambdaQueryWrapper<BusinessType>()
 			.select(BusinessType::getId)
 			.eq(BusinessType::getTenantId, AuthUtil.getTenantId())
@@ -4105,6 +4112,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		List<FeeCenter> copyFeeCenterList = new ArrayList<>();
 		List<PreContainers> copyPreContainersList = new ArrayList<>();
 		List<SeaBillsDetail> copySeaBillsDetailList = new ArrayList<>();
+		List<Containers> containersArrayList = new ArrayList<>();
 		for (Bills item : copyBillsList) {
 			if (!seaBillsDetailList.isEmpty()) {
 				SeaBillsDetail seaBillsDetail = seaBillsDetailList.stream().filter(e -> e.getPid().equals(item.getTemporaryId()))
@@ -4200,16 +4208,30 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			if (ObjectUtils.isNotNull(copyFee) && "1".equals(copyCntr) && !preContainersList.isEmpty()) {
 				List<PreContainers> preContainers = preContainersList.stream().filter(e -> e.getPid().equals(item.getTemporaryId()))
 					.collect(Collectors.toList());
-				for (PreContainers containers : preContainers) {
-					containers.setId(null);
-					containers.setPid(item.getId());
-					containers.setCreateUser(AuthUtil.getUserId());
-					containers.setCreateUserName(AuthUtil.getUserName());
-					containers.setCreateDept(item.getCreateDept());
-					containers.setCreateDeptName(item.getCreateDeptName());
-					containers.setCreateTime(new Date());
-					containers.setContainerNumberStatus("录入");
-					copyPreContainersList.add(containers);
+				for (PreContainers preContainers1 : preContainers) {
+					preContainers1.setId(null);
+					preContainers1.setPid(item.getId());
+					preContainers1.setCreateUser(AuthUtil.getUserId());
+					preContainers1.setCreateUserName(AuthUtil.getUserName());
+					preContainers1.setCreateDept(item.getCreateDept());
+					preContainers1.setCreateDeptName(item.getCreateDeptName());
+					preContainers1.setCreateTime(new Date());
+					preContainers1.setContainerNumberStatus("录入");
+					copyPreContainersList.add(preContainers1);
+				}
+			}
+			if (ObjectUtils.isNotNull(containers) && "1".equals(containers) && !containersList.isEmpty()) {
+				List<Containers> containers1 = containersList.stream().filter(e -> e.getPid().equals(item.getTemporaryId()))
+					.collect(Collectors.toList());
+				for (Containers containers2 : containers1) {
+					containers2.setId(null);
+					containers2.setPid(item.getId());
+					containers2.setCreateUser(AuthUtil.getUserId());
+					containers2.setCreateUserName(AuthUtil.getUserName());
+					containers2.setCreateDept(item.getCreateDept());
+					containers2.setCreateDeptName(item.getCreateDeptName());
+					containers2.setCreateTime(new Date());
+					containersArrayList.add(containers2);
 				}
 			}
 		}
@@ -4222,6 +4244,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		if (!copySeaBillsDetailList.isEmpty()) {
 			seaBillsDetailService.saveBatch(copySeaBillsDetailList);
 		}
+		if (!containersArrayList.isEmpty()) {
+			containersService.saveBatch(containersArrayList);
+		}
 		return R.data("操作成功");
 	}
 
@@ -4959,6 +4984,16 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		copyBills.setWaitingBoxList(new ArrayList<>());
 		copyBills.setFeeCenterList(new ArrayList<>());
 		copyBills.setFeeCenterAmendList(new ArrayList<>());
+		copyBills.setCreateTime(null);
+		copyBills.setCreateUser(null);
+		copyBills.setCreateUserName(null);
+		copyBills.setUpdateTime(null);
+		copyBills.setUpdateUser(null);
+		copyBills.setUpdateUserName(null);
+		copyBills.setVoyageNo(null);
+		copyBills.setVesselId(null);
+		copyBills.setVesselCnName(null);
+		copyBills.setVesselEnName(null);
 		return copyBills;
 	}
 

+ 5 - 5
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/ContainersServiceImpl.java

@@ -461,12 +461,12 @@ public class ContainersServiceImpl extends ServiceImpl<ContainersMapper, Contain
 			containers.setCntrTypeCode(item.getCntrTypeCode());
 			containers.setCntrNo(item.getCntrNo().toUpperCase());
 			containers.setSealNo(item.getSealNo());
-			containers.setMeasurement(item.getMeasurement());
-			containers.setQuantity(item.getQuantity());
-			containers.setGrossWeight(item.getGrossWeight());
-			containers.setVgmWeight(item.getGrossWeight());
+			containers.setMeasurement(ObjectUtils.isNotNull(item.getMeasurement()) ? item.getMeasurement(): new BigDecimal("0.00"));
+			containers.setQuantity(ObjectUtils.isNotNull(item.getQuantity()) ? item.getQuantity(): new BigDecimal("0.00"));
+			containers.setGrossWeight(ObjectUtils.isNotNull(item.getGrossWeight()) ? item.getGrossWeight(): new BigDecimal("0.00"));
+			containers.setTare(ObjectUtils.isNotNull(item.getTare()) ? item.getTare(): new BigDecimal("0.00"));
+			containers.setVgmWeight(containers.getGrossWeight().add(containers.getTare()));
 			containers.setHblno(item.getHblno());
-			containers.setTare(item.getTare());
 			containersList.add(containers);
 		}
 		if (!containersList.isEmpty()) {

+ 9 - 6
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/TemplateImportServiceImpl.java

@@ -1376,7 +1376,8 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 		String pol = getSheetCellValueAsString(sheet, 19, 0);
 		System.out.println("Port of Loading:" + pol);
 		if (ObjectUtils.isNotNull(pol)) {
-			BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+			bills.setPolNamePrint(pol);
+			/*BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
 				.eq(BPorts::getTenantId, AuthUtil.getTenantId())
 				.eq(BPorts::getIsDeleted, 0)
 				.like(BPorts::getEnName, pol)
@@ -1388,13 +1389,14 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 				bills.setPolEnName(ports.getEnName());
 			} else {
 				throw new RuntimeException("Port of Loading:" + pol + " 无法识别!");
-			}
+			}*/
 		}
 		//pod
 		String pod = getSheetCellValueAsString(sheet, 19, 2);
 		System.out.println("Port of Discharge:" + pod);
 		if (ObjectUtils.isNotNull(pod)) {
-			BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+			bills.setPodNamePrint(pod);
+			/*BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
 				.eq(BPorts::getTenantId, AuthUtil.getTenantId())
 				.eq(BPorts::getIsDeleted, 0)
 				.like(BPorts::getEnName, pod)
@@ -1406,13 +1408,14 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 				bills.setPodEnName(ports.getEnName());
 			} else {
 				throw new RuntimeException("Port of Discharge:" + pod + " 无法识别!");
-			}
+			}*/
 		}
 		//交货地
 		String placeDelivery = getSheetCellValueAsString(sheet, 19, 10);
 		System.out.println("Place of delivery:" + placeDelivery);
 		if (ObjectUtils.isNotNull(placeDelivery)) {
-			BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
+			bills.setPlaceDeliveryNamePrint(placeDelivery);
+			/*BPorts ports = bPortsService.getOne(new LambdaQueryWrapper<BPorts>()
 				.eq(BPorts::getTenantId, AuthUtil.getTenantId())
 				.eq(BPorts::getIsDeleted, 0)
 				.like(BPorts::getEnName, placeDelivery)
@@ -1423,7 +1426,7 @@ public class TemplateImportServiceImpl implements ITemplateImportService {
 				bills.setPlaceDeliveryCode(ports.getCode());
 			} else {
 				throw new RuntimeException("Place of delivery:" + placeDelivery + " 无法识别!");
-			}
+			}*/
 		}
 		//G.W.
 		String gw = getSheetCellValueAsString(sheet, 21, 11);

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditProecessController.java

@@ -248,6 +248,8 @@ public class AuditProecessController extends BladeController {
 			auditProecessService.pleaseVerifyCostCheck(auditProecess);
 		}else if ("FY-SQXG".equals(proecess.getCheckType()) || "FY-SQSC".equals(proecess.getCheckType())) {
 			auditProecessService.applyUpdateFee(auditProecess);
+		}else if ("BJZX".equals(proecess.getCheckType())) {
+			auditProecessService.checkMktSlot(auditProecess);
 		}
 		return R.data(auditProecess);
 	}

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/check/service/IAuditProecessService.java

@@ -70,4 +70,6 @@ public interface IAuditProecessService extends IService<LosAuditProecess> {
 	void pleaseVerifyCostCheck(LosAuditProecess auditProecess);
 
 	void applyUpdateFee(LosAuditProecess auditProecess);
+
+	void checkMktSlot(LosAuditProecess auditProecess);
 }

+ 171 - 0
blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java

@@ -41,6 +41,8 @@ import org.springblade.los.box.mapper.ExpenseApplicationMapper;
 import org.springblade.los.box.mapper.RouteCostMapper;
 import org.springblade.los.business.amends.entity.Amends;
 import org.springblade.los.business.amends.mapper.AmendsMapper;
+import org.springblade.los.business.mktSlot.entity.MktSlot;
+import org.springblade.los.business.mktSlot.mapper.MktSlotMapper;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.mapper.BillsMapper;
 import org.springblade.los.check.dto.LosAuditProecessDTO;
@@ -110,6 +112,8 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 
 	private final CurrencyUtils currencyUtils;
 
+	private final MktSlotMapper mktSlotMapper;
+
 
 	@Override
 	public IPage<LosAuditProecessVO> selectAuditProecessPage(IPage<LosAuditProecessVO> page, LosAuditProecessVO auditProecess) {
@@ -1772,6 +1776,173 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 		baseMapper.updateById(auditProecess);
 	}
 
+	@Override
+	public void checkMktSlot(LosAuditProecess auditProecess) {
+		//查看最新操作记录,防止重复提交
+		LosAuditProecess proecessTemp = baseMapper.selectById(auditProecess.getId());
+		if (proecessTemp == null) {
+			throw new SecurityException("未查到此审批记录,禁止操作");
+		}
+		if ("A".equals(proecessTemp.getAuditStatus()) || "B".equals(proecessTemp.getAuditStatus())) {
+			throw new SecurityException("当前记录已经完成审批,禁止重复操作");
+		}
+
+		if (auditProecess.getAuditStatus() == null || !"S".equals(auditProecess.getAuditStatus())) {
+			throw new SecurityException("审批状态非待审,禁止操作");
+		}
+		//信息
+		Message sendMessage = new Message();
+		sendMessage.setParameter(String.valueOf(auditProecess.getBillId()));
+		sendMessage.setUserName(AuthUtil.getUserName());
+		sendMessage.setUserId(AuthUtil.getUserId());
+		sendMessage.setToUserId(auditProecess.getSendUserId());
+		sendMessage.setToUserName(auditProecess.getSendName());
+		sendMessage.setMessageType(1);
+		sendMessage.setTenantId(AuthUtil.getTenantId());
+		sendMessage.setCreateUser(AuthUtil.getUserId());
+		sendMessage.setCreateTime(new Date());
+		sendMessage.setUrl(auditProecess.getUrl());
+		sendMessage.setPageLabel(auditProecess.getPageLabel());
+		sendMessage.setPageStatus(auditProecess.getPageStatus());
+
+		//用户操作 1.通过  2.驳回
+		Integer operate = auditProecess.getOperate();
+		//查看当前审批是否为最后一级
+		String iffinalItem = auditProecess.getIffinalItem();
+		//审批人
+		auditProecess.setAuditUserId(String.valueOf(AuthUtil.getUserId()));
+		//审批时间
+		auditProecess.setAuditOpTime(new Date());
+
+		MktSlot mktSlot = mktSlotMapper.selectById(proecessTemp.getBillId());
+
+		//不是最后一级
+		if ("F".equals(iffinalItem)) {
+
+			//通过
+			if (operate == 1) {
+				//如果是第一级, 则修改状态为审批中
+				if (auditProecess.getLevelId() == 1) {
+					mktSlot.setStatus("2");
+					int count = mktSlotMapper.updateById(mktSlot);
+					if (count == 0) {
+						throw new SecurityException("审批开始修改审核状态失败");
+					}
+				}
+
+				auditProecess.setAuditStatus("A");
+				//查询下一级,开启待审
+				LambdaQueryWrapper<LosAuditProecess> auditProecessLambdaQueryWrapper = new LambdaQueryWrapper<>();
+				auditProecessLambdaQueryWrapper
+					.eq(LosAuditProecess::getBatchNo, auditProecess.getBatchNo())
+					.eq(LosAuditProecess::getSrcBillId, auditProecess.getSrcBillId())
+					.eq(LosAuditProecess::getIsDelete, 0)
+					.eq(LosAuditProecess::getActId, auditProecess.getActId())
+					.eq(LosAuditProecess::getBillId, auditProecess.getBillId())
+					.eq(LosAuditProecess::getBillNo, auditProecess.getBillNo())
+					.eq(LosAuditProecess::getTenantId, AuthUtil.getTenantId())
+					.eq(LosAuditProecess::getLevelId, auditProecess.getLevelId() + 1);
+				Integer count = baseMapper.selectCount(auditProecessLambdaQueryWrapper);
+				if (count != null && count > 1) {
+					throw new SecurityException("审核失败,获取下一级信息失败");
+				}
+				LosAuditProecess proecess = baseMapper.selectOne(auditProecessLambdaQueryWrapper);
+				if (proecess == null) {
+					throw new SecurityException("审批通过=>获取下一级信息失败");
+				}
+				proecess.setAuditStatus("S");
+				baseMapper.updateById(proecess);
+
+				SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
+
+				//获得订单创建日期
+				String billsDate = null;
+				if (proecessTemp.getBillId() != null) {
+					if (mktSlot != null) {
+						billsDate = simpleDateFormat.format(mktSlot.getCreateTime());
+					}
+				}
+
+				Message message = new Message();
+				message.setUserName(AuthUtil.getUserName());
+				message.setUserId(AuthUtil.getUserId());
+				message.setParameter(String.valueOf(auditProecess.getBillId()));
+				message.setMessageType(1);
+				message.setTenantId(AuthUtil.getTenantId());
+				message.setMessageBody("您有新的mkt&slot审核,申请单号:" + proecessTemp.getBillNo() + ","
+					+ "单据日期:" + billsDate + ",请审核。"
+					+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
+				);
+				message.setUrl(auditProecess.getUrl());
+				message.setPageLabel(auditProecess.getPageLabel());
+				message.setPageStatus(auditProecess.getPageStatus());
+				message.setCreateUser(AuthUtil.getUserId());
+
+				message.setCreateTime(new Date());
+
+				// 消息批量通知下一级
+				sendMsgToGroup(message, proecess.getAuditUserId());
+			}
+			//不通过
+			else if (operate == 2) {
+				auditProecess.setAuditStatus("B");
+				mktSlot.setStatus("4");
+				int count = mktSlotMapper.updateById(mktSlot);
+				if (count == 0) {
+					throw new SecurityException("修改订单数据失败");
+				}
+
+				sendMessage.setMessageBody("您的mkt&slot审核未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+
+		}
+		//是最后一级
+		else if ("T".equals(iffinalItem)) {
+			//通过
+			if (operate == 1) {
+				auditProecess.setAuditStatus("A");
+				mktSlot.setStatus("3");
+				int count = mktSlotMapper.updateById(mktSlot);
+				if (count == 0) {
+					throw new SecurityException("修改订单数据失败");
+				}
+
+				sendMessage.setMessageBody("您的mkt&slot审核已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",请继续操作");
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+			//不通过
+			else if (operate == 2) {
+				auditProecess.setAuditStatus("B");
+				mktSlot.setStatus("4");
+				int count = mktSlotMapper.updateById(mktSlot);
+				if (count == 0) {
+					throw new SecurityException("修改订单数据失败");
+				}
+				sendMessage.setMessageBody("您的mkt&slot审核未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
+				R save = messageClient.save(sendMessage);
+				if (!save.isSuccess()) {
+					throw new SecurityException("发送消息失败");
+				}
+			}
+		} else {
+			throw new SecurityException("审批异常,请联系管理员");
+		}
+
+		cleanMsg(proecessTemp.getAuditUserId(), AuthUtil.getUserId(), proecessTemp.getSrcBillId());
+
+		//保存操作记录
+		auditProecess.setAuditMsg(auditProecess.getAuditMsg());
+		auditProecess.setAuditItem(new Date());
+		baseMapper.updateById(auditProecess);
+	}
+
 	private void updateFeeCenter(FeeCenterUpdateRecord feeCenterUpdateRecord, FeeCenter feeCenter) {
 		feeCenterUpdateRecord.setStatus("3");
 		feeCenterUpdateRecord.setUpdateUser(AuthUtil.getUserId());

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/excel/BoxAndLeadSealNoExcel.java

@@ -82,7 +82,7 @@ public class BoxAndLeadSealNoExcel implements Serializable {
 	 * VGM
 	 */
 	@ExcelProperty(value = "VGM")
-	private String vgmWeight;
+	private BigDecimal vgmWeight;
 	/**
 	 * 提单号
 	 */

+ 12 - 2
blade-service/blade-los/src/main/java/org/springblade/los/excel/BoxNumberProfitExcel.java

@@ -201,9 +201,19 @@ public class BoxNumberProfitExcel {
 	@ExcelProperty(value = "业务员")
 	private String srcCnName;
 	/**
-	 * 团队
+	 * 所属公司
+	 */
+	@ExcelProperty(value = "所属公司")
+	private String branchName;
+	/**
+	 * 操作
+	 */
+	@ExcelProperty(value = "操作")
+	private String operatorName;
+	/**
+	 * 客服
 	 */
 	@ExcelProperty(value = "团队")
-	private String teamName;
+	private String customerServiceName;
 
 }

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

@@ -213,16 +213,7 @@ public class FeeCenterController extends BladeController {
 	@ApiOperation(value = "删除", notes = "传入ids")
 	@RepeatSubmit
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
-			.eq(FeeCenter::getIsDeleted, 0)
-			.apply("find_in_set(id,'" + ids + "')"));
-		for (FeeCenter item : feeCenterList) {
-			if (item.getAccStatus() != 0) {
-				throw new RuntimeException("费用:" + item.getFeeCnName() + "已生成账单,删除失败");
-			}
-		}
-		return R.status(feeCenterService.removeByIds(Func.toLongList(ids)));
+		return feeCenterService.delete(Func.toLongList(ids));
 	}
 
 	/**

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/IFeeCenterService.java

@@ -90,4 +90,6 @@ public interface IFeeCenterService extends IService<FeeCenter> {
 	R costImportBatch(String billsIds, String costId);
 
 	R quotationImportBatch(String billsIds, String quotationId);
+
+    R delete(List<Long> longList);
 }

+ 41 - 11
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterServiceImpl.java

@@ -300,12 +300,12 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 						if (!corpsList.isEmpty()) {
 							bCorps = corpsList.stream().filter(e -> e.getId().equals(items.getCorpId())).findFirst().orElse(null);
 						}
-						if (bCorps == null){
+						if (bCorps == null) {
 							feeCenter.setCorpId(bills.getForeignAgencyId());
 							feeCenter.setCorpCnName(bills.getForeignAgencyCnName());
 							feeCenter.setCorpEnName(bills.getForeignAgencyEnName());
 							feeCenter.setShortName(bills.getForeignAgencyCnName());
-						}else{
+						} else {
 							feeCenter.setCorpId(bCorps.getId());
 							feeCenter.setCorpCnName(bCorps.getCnName());
 							feeCenter.setCorpEnName(bCorps.getEnName());
@@ -330,12 +330,12 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 						if (!corpsList.isEmpty()) {
 							bCorps = corpsList.stream().filter(e -> e.getId().equals(items.getCorpId())).findFirst().orElse(null);
 						}
-						if (bCorps == null){
+						if (bCorps == null) {
 							feeCenter.setCorpId(bills.getShippingAgencyId());
 							feeCenter.setCorpCnName(bills.getShippingAgencyCname());
 							feeCenter.setCorpEnName(bills.getShippingAgencyEname());
 							feeCenter.setShortName(bills.getShippingAgencyCname());
-						}else{
+						} else {
 							feeCenter.setCorpId(bCorps.getId());
 							feeCenter.setCorpCnName(bCorps.getCnName());
 							feeCenter.setCorpEnName(bCorps.getEnName());
@@ -1184,12 +1184,12 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 						if (!corpsList.isEmpty()) {
 							bCorps = corpsList.stream().filter(e -> e.getId().equals(items.getCorpId())).findFirst().orElse(null);
 						}
-						if (bCorps == null){
+						if (bCorps == null) {
 							feeCenter.setCorpId(bills.getForeignAgencyId());
 							feeCenter.setCorpCnName(bills.getForeignAgencyCnName());
 							feeCenter.setCorpEnName(bills.getForeignAgencyEnName());
 							feeCenter.setShortName(bills.getForeignAgencyCnName());
-						}else{
+						} else {
 							feeCenter.setCorpId(bCorps.getId());
 							feeCenter.setCorpCnName(bCorps.getCnName());
 							feeCenter.setCorpEnName(bCorps.getEnName());
@@ -1214,12 +1214,12 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 						if (!corpsList.isEmpty()) {
 							bCorps = corpsList.stream().filter(e -> e.getId().equals(items.getCorpId())).findFirst().orElse(null);
 						}
-						if (bCorps == null){
+						if (bCorps == null) {
 							feeCenter.setCorpId(bills.getShippingAgencyId());
 							feeCenter.setCorpCnName(bills.getShippingAgencyCname());
 							feeCenter.setCorpEnName(bills.getShippingAgencyEname());
 							feeCenter.setShortName(bills.getShippingAgencyCname());
-						}else{
+						} else {
 							feeCenter.setCorpId(bCorps.getId());
 							feeCenter.setCorpCnName(bCorps.getCnName());
 							feeCenter.setCorpEnName(bCorps.getEnName());
@@ -1365,6 +1365,9 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 			.eq(Bills::getTenantId, AuthUtil.getTenantId())
 			.eq(Bills::getIsDeleted, 0)
 			.in(Bills::getMasterId, billsList.stream().map(Bills::getId).collect(Collectors.toList())));
+		if (billsListFD.isEmpty()) {
+			throw new RuntimeException("未查到分单单据信息");
+		}
 		List<FeeCenter> feeCenterListFD = baseMapper.selectList(new LambdaQueryWrapper<FeeCenter>()
 			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 			.eq(FeeCenter::getIsDeleted, 0)
@@ -1713,7 +1716,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 			bills.setAccountStatus(1);
 		} else if (0 == statusD && 1 == statusC) {
 			bills.setAccountStatus(2);
-		}else{
+		} else {
 			bills.setAccountStatus(3);
 		}
 		BigDecimal amountDr;
@@ -1904,6 +1907,33 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 		}
 	}
 
+	@Override
+	public R delete(List<Long> longList) {
+		List<FeeCenter> feeCenterList = baseMapper.selectList(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.in(FeeCenter::getId, longList));
+		for (FeeCenter item : feeCenterList) {
+			if (item.getAccStatus() != 0) {
+				throw new RuntimeException("费用:" + item.getFeeCnName() + "已生成账单,删除失败");
+			}
+		}
+		Bills bills = billsMapper.selectById(feeCenterList.get(0).getPid());
+		if (bills != null) {
+			List<FeeCenter> feeCenters = baseMapper.selectList(new LambdaQueryWrapper<FeeCenter>()
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getIsDeleted, 0)
+				.eq(FeeCenter::getPid, bills.getId())
+				.notIn(FeeCenter::getId, longList));
+			String exrateType = currencyUtils.standardCurrency(bills.getBranchId());
+			if (!feeCenters.isEmpty()) {
+				this.updateBills(feeCenters, bills, exrateType);
+			}
+		}
+
+		return R.data(this.removeByIds(longList));
+	}
+
 	private FeeCenter addFeeCenterQuotation(Bills bills, String dc, int count, BFees fees, String corpType,
 											PreContainers items, List<BCurExrate> curExrateList,
 											MktSlotQuotation mktSlotQuotations, String exrateType, String type) {
@@ -2147,9 +2177,9 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 				feeCenter.setAmountLoc(new BigDecimal("0"));
 			}
 		}
-		if (new BigDecimal("0.00").compareTo(feeCenter.getAmount()) == 0){
+		if (new BigDecimal("0.00").compareTo(feeCenter.getAmount()) == 0) {
 			return null;
-		}else{
+		} else {
 			return feeCenter;
 		}
 	}

+ 3 - 2
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterUpdateRecordServiceImpl.java

@@ -307,10 +307,11 @@ public class FeeCenterUpdateRecordServiceImpl extends ServiceImpl<FeeCenterUpdat
 				throw new SecurityException("操作失败,请联系管理员");
 			}
 		}
-		return null;
+		return R.data(feeCenterUpdateRecord);
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public R revokeapplyUpdate(Long itemId, Long billId) {
 		FeeCenterUpdateRecord feeCenterUpdateRecord = baseMapper.selectOne(new LambdaQueryWrapper<FeeCenterUpdateRecord>()
 			.eq(FeeCenterUpdateRecord::getTenantId, AuthUtil.getTenantId())
@@ -345,7 +346,7 @@ public class FeeCenterUpdateRecordServiceImpl extends ServiceImpl<FeeCenterUpdat
 		if (!financeProcess.isSuccess()) {
 			throw new SecurityException("操作失败,请联系管理员");
 		}
-		return null;
+		return R.data("操作成功");
 	}
 
 }

+ 5 - 8
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java

@@ -25,7 +25,6 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.los.Util.CurrencyUtils;
-import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.billno.entity.BusinessBillNo;
@@ -46,7 +45,6 @@ import org.springblade.los.finance.invoices.service.IFinInvoiceItemDetailService
 import org.springblade.los.finance.invoices.service.IFinInvoicesItemsService;
 import org.springblade.los.finance.invoices.service.IFinInvoicesService;
 import org.springblade.los.finance.invoices.vo.FinInvoicesVO;
-import org.springblade.los.finance.stl.entity.FinStlBillsItems;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -196,11 +194,10 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
 					item.setCreateUserName(AuthUtil.getUserName());
-					if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
-						item.setCreateDept(deptId);
-						item.setBranchId(branchId);
-						item.setCreateDeptName(deptName);
-					}
+					item.setCreateDept(deptId);
+					item.setCreateDeptName(deptName);
+//					item.setBranchId(branchId);
+//					item.setBranchName(deptName);
 				} else {
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateTime(new Date());
@@ -383,7 +380,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 					feeCenter.setInvoiceStatus(9);
 					feeCenter.setInvoiceCurCode(detail.getCurCode());
 					feeCenter.setInvoiceExrate(detail.getExrate());
-						feeCenter.setInvoiceAmount(detail.getAmountUsd());
+					feeCenter.setInvoiceAmount(detail.getAmountUsd());
 					feeCenter.setInvoiceAmountLoc(detail.getAmountLoc());
 					feeCenter.setInvoiceById(detail.getCreateUser());
 					feeCenter.setInvoiceByName(detail.getCreateUserName());

+ 48 - 37
blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/impl/FinStlBillsServiceImpl.java

@@ -264,12 +264,10 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
 					item.setCreateUserName(AuthUtil.getUserName());
-					if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
-						item.setCreateDept(deptId);
-						item.setBranchId(branchId);
-						item.setBranchName(deptName);
-						item.setCreateDeptName(deptName);
-					}
+					item.setCreateDept(deptId);
+					item.setCreateDeptName(deptName);
+//					item.setBranchId(branchId);
+//					item.setBranchName(deptName);
 				} else {
 					item.setUpdateUser(AuthUtil.getUserId());
 					item.setUpdateTime(new Date());
@@ -298,15 +296,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 			List<Long> ids = finStlBills.getFinStlBillsItemsList().stream().map(FinStlBillsItems::getSrcIdInvoices).filter(Objects::nonNull).collect(Collectors.toList());
 			if (!ids.isEmpty()) {
 				List<Long> filePidList = new ArrayList<>();
-				if ("D".equals(finStlBills.getDc())) {
-					List<FinInvoicesItems> finInvoicesItemsList = finInvoicesItemsMapper.selectList(new LambdaQueryWrapper<FinInvoicesItems>()
-						.eq(FinInvoicesItems::getTenantId, AuthUtil.getTenantId())
-						.eq(FinInvoicesItems::getIsDeleted, 0)
-						.in(FinInvoicesItems::getId, ids));
-					if (!finInvoicesItemsList.isEmpty()) {
-						filePidList = finInvoicesItemsList.stream().map(FinInvoicesItems::getPid).filter(Objects::nonNull).distinct().collect(Collectors.toList());
-					}
-				} else {
+				if ("C".equals(finStlBills.getDc())) {
 					List<FinStlBillsItems> finStlBillsItems = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
 						.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
 						.eq(FinStlBillsItems::getIsDeleted, 0)
@@ -321,17 +311,28 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 						.eq(FilesCenter::getIsDeleted, 0)
 						.in(FilesCenter::getPid, filePidList));
 					if (!filesCenterList.isEmpty()) {
+						List<FilesCenter> filesCenterList1 = filesCenterService.list(new LambdaQueryWrapper<FilesCenter>()
+							.eq(FilesCenter::getTenantId, AuthUtil.getTenantId())
+							.eq(FilesCenter::getIsDeleted, 0)
+							.eq(FilesCenter::getPid, finStlBills.getId()));
+						List<Long> itemIdList = new ArrayList<>();
+						if (!filesCenterList1.isEmpty()) {
+							itemIdList = filesCenterList1.stream().map(FilesCenter::getItemId).distinct().collect(Collectors.toList());
+						}
 						List<FilesCenter> filesCenters = new ArrayList<>();
 						for (FilesCenter item : filesCenterList) {
-							item.setId(null);
-							item.setCreateTime(new Date());
-							item.setCreateUserName(AuthUtil.getUserName());
-							item.setCreateUser(AuthUtil.getUserId());
-							item.setPid(finStlBills.getId());
-							item.setUpdateTime(null);
-							item.setUpdateUserName(null);
-							item.setUpdateUser(null);
-							filesCenters.add(item);
+							if (itemIdList.isEmpty() || !itemIdList.contains(item.getId())) {
+								item.setItemId(item.getId());
+								item.setId(null);
+								item.setCreateTime(new Date());
+								item.setCreateUserName(AuthUtil.getUserName());
+								item.setCreateUser(AuthUtil.getUserId());
+								item.setPid(finStlBills.getId());
+								item.setUpdateTime(null);
+								item.setUpdateUserName(null);
+								item.setUpdateUser(null);
+								filesCenters.add(item);
+							}
 						}
 						filesCenterService.saveBatch(filesCenters);
 					}
@@ -854,17 +855,6 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 									item.setBillStatus("1");
 									finInvoicesMapper.updateById(item);
 								}
-									for (FilesCenter filesCenter : filesCenterList) {
-										filesCenter.setId(null);
-										filesCenter.setCreateTime(new Date());
-										filesCenter.setCreateUserName(AuthUtil.getUserName());
-										filesCenter.setCreateUser(AuthUtil.getUserId());
-										filesCenter.setPid(item.getId());
-										filesCenter.setUpdateTime(null);
-										filesCenter.setUpdateUserName(null);
-										filesCenter.setUpdateUser(null);
-										filesCenters.add(filesCenter);
-									}
 							}
 						}
 						for (FinInvoicesItems item : finInvoicesItemsList) {
@@ -887,6 +877,10 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 							.eq(FinStlBills::getIsDeleted, 0)
 							.in(FinStlBills::getId, pid));
 						List<Long> id = finStlBills2.stream().map(FinStlBills::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+						List<FilesCenter> filesCenterList1 = filesCenterService.list(new LambdaQueryWrapper<FilesCenter>()
+							.eq(FilesCenter::getTenantId, AuthUtil.getTenantId())
+							.eq(FilesCenter::getIsDeleted, 0)
+							.in(FilesCenter::getId, id));
 						List<FinStlBillsItems> finStlBillsItemsList1 = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
 							.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
 							.eq(FinStlBillsItems::getIsDeleted, 0)
@@ -898,7 +892,18 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 							if (invoicesItemsSum.size() == finInvoicesItems.size()) {
 								item.setBillStatus("1");
 							}
+							List<Long> idList = new ArrayList<>();
+							List<Long> itemList = new ArrayList<>();
+							if (!filesCenterList1.isEmpty()) {
+								idList = filesCenterList1.stream().filter(e -> e.getPid().equals(item.getId()))
+									.map(FilesCenter::getId).distinct().collect(Collectors.toList());
+								itemList = filesCenterList1.stream().filter(e -> e.getPid().equals(item.getId()))
+									.map(FilesCenter::getItemId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+							}
 							for (FilesCenter filesCenter : filesCenterList) {
+								Long filesCenterId = filesCenter.getId();
+								Long filesCenterItemId = filesCenter.getItemId();
+								filesCenter.setItemId(filesCenter.getId());
 								filesCenter.setId(null);
 								filesCenter.setCreateTime(new Date());
 								filesCenter.setCreateUserName(AuthUtil.getUserName());
@@ -907,14 +912,20 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 								filesCenter.setUpdateTime(null);
 								filesCenter.setUpdateUserName(null);
 								filesCenter.setUpdateUser(null);
-								filesCenters.add(filesCenter);
+								if (!itemList.isEmpty() && !itemList.contains(filesCenterId)) {
+									filesCenters.add(filesCenter);
+								} else {
+									if (!idList.contains(filesCenterItemId)) {
+										filesCenters.add(filesCenter);
+									}
+								}
 							}
 						}
 						this.updateBatchById(finStlBills2);
 						finStlBillsItemsService.saveOrUpdateBatch(finStlBillsItemsList);
 					}
 				}
-				if (!filesCenters.isEmpty()){
+				if (!filesCenters.isEmpty()) {
 					filesCenterService.saveBatch(filesCenters);
 				}
 			}

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

@@ -1,13 +1,21 @@
 package org.springblade.los.ftp.service.impl;
 
 import com.alibaba.cloud.commons.io.IOUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import lombok.AllArgsConstructor;
 import org.apache.commons.net.ftp.FTP;
 import org.apache.commons.net.ftp.FTPClient;
 import org.apache.commons.net.ftp.FTPFile;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.los.basic.cntr.entity.BCntrTypes;
+import org.springblade.los.basic.cntr.service.IBCntrTypesService;
 import org.springblade.los.basic.corps.entity.BCorps;
 import org.springblade.los.basic.corps.service.IBCorpsService;
+import org.springblade.los.basic.ports.entity.BPorts;
+import org.springblade.los.basic.ports.service.IBPortsService;
+import org.springblade.los.box.excel.EmptyContainerAppearanceAnalysis;
 import org.springblade.los.ftp.dto.ContainerMovement;
 import org.springblade.los.ftp.service.CyFtpService;
 import org.springframework.stereotype.Service;
@@ -15,8 +23,9 @@ import org.springframework.stereotype.Service;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
+import java.rmi.RemoteException;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author :jixinyuan
@@ -28,14 +37,27 @@ public class CyFtpServiceImpl implements CyFtpService {
 
 	private final IBCorpsService bCorpsService;
 
+	private final IBCntrTypesService bCntrTypesService;
+
+	private final IBPortsService bPortsService;
+
 	@Override
-	public R ftpFilesHandle(Long corpId,String type) {
+	public R ftpFilesHandle(Long corpId, String type) {
+		List<EmptyContainerAppearanceAnalysis> analysisList = new ArrayList<>();
 		BCorps bCorps = bCorpsService.getById(corpId);
 		String server = bCorps.getEdiFtp();
 		int port = 21;
 		String user = bCorps.getUsernameFtp();
 		String pass = bCorps.getPasswordFtp();
 		String remoteDir = "/WFL";
+		String boxStatus = "";
+		if ("IN".equals(type)) {
+			remoteDir = remoteDir + "/IN";
+			boxStatus = "空箱提箱进场";
+		} else if ("OUT".equals(type)) {
+			remoteDir = remoteDir + "/OUT";
+			boxStatus = "空箱出场";
+		}
 		FTPClient ftpClient = new FTPClient();
 		try {
 			// 连接FTP服务器
@@ -46,22 +68,32 @@ public class CyFtpServiceImpl implements CyFtpService {
 
 			// 获取文件列表
 			FTPFile[] files = ftpClient.listFiles(remoteDir);
-
+			Calendar calendar = Calendar.getInstance();
 			for (FTPFile file : files) {
 				if (file.isFile() && file.getName().endsWith(".txt")) {
-					System.out.println("\nProcessing file: " + file.getName());
 					// 下载文件
 					InputStream inputStream = ftpClient.retrieveFileStream(remoteDir + "/" + file.getName());
-
 					// 解析EDIFACT内容
 					List<ContainerMovement> movements = parseEdifactMessage(inputStream);
-
 					// 输出解析结果
 					for (ContainerMovement movement : movements) {
+						EmptyContainerAppearanceAnalysis analysis = new EmptyContainerAppearanceAnalysis();
+						analysis.setContainerNumber(movement.getBookingNumber());
+						analysis.setBoxCode(movement.getContainerNumber());
+						analysis.setBoxType(movement.getContainerType());
+						analysis.setPortName(movement.getFromLocation());
+						analysis.setStationName(bCorps.getCnName());
+						analysis.setMblno(movement.getBillOfLading());
+						analysis.setBoxStatus(boxStatus);
+						if (ObjectUtils.isNotNull(movement.getMovementDateTime())){
+							calendar.setTimeInMillis(Long.parseLong(movement.getMovementDateTime()));
+							analysis.setBoxStatusDate(calendar.getTime());
+						}
+						analysis.setSrcFile(file.getName());
+						analysisList.add(analysis);
 						System.out.println(movement);
 						System.out.println("----------------------------------------");
 					}
-
 					inputStream.close();
 					ftpClient.completePendingCommand();
 				}
@@ -78,7 +110,41 @@ public class CyFtpServiceImpl implements CyFtpService {
 				ex.printStackTrace();
 			}
 		}
-		return R.data("操作成功");
+		if (!analysisList.isEmpty()){
+			List<String> boxType = analysisList.stream().map(EmptyContainerAppearanceAnalysis::getBoxType).filter(Objects::nonNull)
+				.distinct().collect(Collectors.toList());
+			List<BCntrTypes> cntrTypesList = new ArrayList<>();
+			if (!boxType.isEmpty()) {
+				 cntrTypesList = bCntrTypesService.list(new LambdaQueryWrapper<BCntrTypes>()
+					.eq(BCntrTypes::getTenantId, AuthUtil.getTenantId())
+					.eq(BCntrTypes::getIsDeleted, 0)
+					.in(BCntrTypes::getCode95, boxType));
+			}
+			List<String> portName = analysisList.stream().map(EmptyContainerAppearanceAnalysis::getPortName).filter(Objects::nonNull)
+				.distinct().collect(Collectors.toList());
+			List<BPorts> portsList = new ArrayList<>();
+			if (!portName.isEmpty()) {
+				portsList = bPortsService.list(new LambdaQueryWrapper<BPorts>()
+					.eq(BPorts::getTenantId, AuthUtil.getTenantId())
+					.eq(BPorts::getIsDeleted, 0)
+					.in(BPorts::getUnCode, portName));
+			}
+			for (EmptyContainerAppearanceAnalysis item : analysisList){
+				BCntrTypes cntrTypes = cntrTypesList.stream().filter(e -> e.getCode95().equals(item.getBoxType())).findFirst().orElse(null);
+				if (cntrTypes == null) {
+					throw new RuntimeException("请先维护箱型:" + item.getBoxType() + "基础资料");
+				}else{
+					item.setBoxType(cntrTypes.getCntrType());
+				}
+				BPorts ports = portsList.stream().filter(e -> e.getUnCode().equals(item.getPortName())).findFirst().orElse(null);
+				if (ports == null) {
+					throw new RuntimeException("请先维护港口:" + item.getPortName() + "基础资料");
+				}else{
+					item.setPortName(ports.getCnName());
+				}
+			}
+		}
+		return R.data(analysisList);
 	}
 
 	public static List<ContainerMovement> parseEdifactMessage(InputStream inputStream) throws IOException {
@@ -154,7 +220,7 @@ public class CyFtpServiceImpl implements CyFtpService {
 						break;
 					case "MEA":
 						if (elements.length > 1 && elements[1].equals("AAE")) {
-							movement.setCargoWeight(elements[3] + " " + elements[4]);
+							movement.setCargoWeight(elements[3]);
 						}
 						break;
 					case "SEL":