Explorar o código

2024年5月23日18:03:42

纪新园 hai 1 ano
pai
achega
6c866f3a0f
Modificáronse 23 ficheiros con 1817 adicións e 476 borrados
  1. 16 2
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/release/entity/SeaReleaseBill.java
  2. 9 2
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/release/entity/SeaReleaseBillItems.java
  3. 19 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/genleg/dto/PeriodExchangeRate.java
  4. 2 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/genleg/dto/PeriodVouchersTemplate.java
  5. 3 2
      blade-service/blade-los/src/main/java/org/springblade/los/basic/acc/service/impl/AccountsServiceImpl.java
  6. 12 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/controller/BCurrencyController.java
  7. 3 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/service/IBCurrencyService.java
  8. 81 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/service/impl/BCurrencyServiceImpl.java
  9. 12 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/service/impl/LosBFeesTemplateServiceImpl.java
  10. 12 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/aea/controller/AeaBillsController.java
  11. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/aea/service/IAeaBillsService.java
  12. 325 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/aea/service/impl/AeaBillsServiceImpl.java
  13. 57 13
      blade-service/blade-los/src/main/java/org/springblade/los/business/release/controller/SeaReleaseBillController.java
  14. 15 2
      blade-service/blade-los/src/main/java/org/springblade/los/business/release/controller/SeaReleaseBillItemsController.java
  15. 10 3
      blade-service/blade-los/src/main/java/org/springblade/los/business/release/service/impl/SeaReleaseBillServiceImpl.java
  16. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java
  17. 9 2
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  18. 21 1
      blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/controller/FinPeriodController.java
  19. 4 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/service/IFinPeriodService.java
  20. 775 203
      blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/service/impl/FinPeriodServiceImpl.java
  21. 12 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/controller/FinVouchersController.java
  22. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/IFinVouchersService.java
  23. 414 246
      blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/impl/FinVouchersServiceImpl.java

+ 16 - 2
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/release/entity/SeaReleaseBill.java

@@ -119,6 +119,11 @@ public class SeaReleaseBill implements Serializable {
 	@ApiModelProperty(value = "单据日期")
 	private Date billDate;
 	/**
+	 * 单据日期
+	 */
+	@TableField(exist = false)
+	private List<String> billDateList;
+	/**
 	 * 操作 Id
 	 */
 	@ApiModelProperty(value = "操作 Id")
@@ -307,6 +312,11 @@ public class SeaReleaseBill implements Serializable {
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date applyTime;
 	/**
+	 * 提交时间
+	 */
+	@TableField(exist = false)
+	private List<String> applyTimeList;
+	/**
 	 * 要求时间,yyyy-MM-dd HH:mm
 	 */
 	@ApiModelProperty(value = "要求时间,yyyy-MM-dd HH:mm")
@@ -315,6 +325,11 @@ public class SeaReleaseBill implements Serializable {
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date requireTime;
 	/**
+	 * 要求时间
+	 */
+	@TableField(exist = false)
+	private List<String> requireTimeList;
+	/**
 	 * 结算方式(0 票结 1月结)
 	 */
 	@ApiModelProperty(value = "结算方式(0 票结 1月结)")
@@ -487,7 +502,7 @@ public class SeaReleaseBill implements Serializable {
 	 * 正本提单份数, ONE,TWO.THREE...
 	 */
 	@TableField(exist = false)
-	private String numberOfObl;
+	private Integer numberOfObl;
 
 
 	/**
@@ -496,5 +511,4 @@ public class SeaReleaseBill implements Serializable {
 	@TableField(exist = false)
 	private String unplacedOrders;
 
-
 }

+ 9 - 2
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/release/entity/SeaReleaseBillItems.java

@@ -28,6 +28,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 业务-海运放单明细实体类
@@ -145,6 +146,8 @@ public class SeaReleaseBillItems implements Serializable {
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date billDate;
+	@TableField(exist = false)
+	private List<String> billDateList;
 	/**
 	 * 海运进出口原业务创建人 Id
 	 */
@@ -371,12 +374,12 @@ public class SeaReleaseBillItems implements Serializable {
 	 * 正本提单份数, ONE,TWO.THREE...
 	 */
 	@ApiModelProperty(value = "正本提单份数, ONE,TWO.THREE...")
-	private String numberOfObl;
+	private Integer numberOfObl;
 	/**
 	 * 副本提单份数, ONE,TWO.THREE...
 	 */
 	@ApiModelProperty(value = "副本提单份数, ONE,TWO.THREE...")
-	private String numberOfCopy;
+	private Integer numberOfCopy;
 	/**
 	 * 签单方式
 	 */
@@ -420,12 +423,16 @@ public class SeaReleaseBillItems implements Serializable {
 	@ApiModelProperty(value = "要求时间,yyyy-MM-dd HH:mm")
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date requireTime;
+	@TableField(exist = false)
+	private List<String> requireTimeList;
 	/**
 	 * 提交时间,yyyy-MM-dd HH:mm
 	 */
 	@ApiModelProperty(value = "提交时间,yyyy-MM-dd HH:mm")
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date applyTime;
+	@TableField(exist = false)
+	private List<String> applyTimeList;
 	/**
 	 * 跑单时间,yyyy-MM-dd HH:mm
 	 */

+ 19 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/genleg/dto/PeriodExchangeRate.java

@@ -0,0 +1,19 @@
+package org.springblade.los.finance.genleg.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author :jixinyuan
+ * @date ;2024/5/21
+ */
+@Data
+public class PeriodExchangeRate {
+
+	private String curCode;
+	private String curName;
+	private String curDate;
+	private BigDecimal exrate;
+
+}

+ 2 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/genleg/dto/PeriodVouchersTemplate.java

@@ -27,4 +27,6 @@ public class PeriodVouchersTemplate {
 	private BigDecimal exrate;
 	private List<PeriodVouchersAccItems> accItems;
 
+	private List<PeriodExchangeRate> exchangeRateList;
+
 }

+ 3 - 2
blade-service/blade-los/src/main/java/org/springblade/los/basic/acc/service/impl/AccountsServiceImpl.java

@@ -120,6 +120,7 @@ public class AccountsServiceImpl extends ServiceImpl<AccountsMapper, Accounts> i
 				if (Func.toLong(details.getParentId()) == Func.toLong(details.getId())) {
 					throw new ServiceException("父节点不可选择自身!");
 				}
+				accounts.setIsDetail(1);
 			}
 			accounts.setCreateTime(new Date());
 			accounts.setCreateUser(AuthUtil.getUserId());
@@ -244,13 +245,13 @@ public class AccountsServiceImpl extends ServiceImpl<AccountsMapper, Accounts> i
 			accounts.setQuantityBlc(accounts.getAccItemsOpenblcList().stream().map(AccItemsOpenblc::getQuantityBlc)
 				.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 		}
-		if (baseMapper.selectCount(new LambdaQueryWrapper<Accounts>()
+		/*if (baseMapper.selectCount(new LambdaQueryWrapper<Accounts>()
 			.eq(Accounts::getTenantId, AuthUtil.getTenantId())
 			.eq(Accounts::getParentId, accounts.getId())) == 0) {
 			accounts.setIsDetail(0);
 		} else {
 			accounts.setIsDetail(1);
-		}
+		}*/
 		this.saveOrUpdate(accounts);
 		return R.data(accounts);
 	}

+ 12 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/controller/BCurrencyController.java

@@ -37,6 +37,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.los.excel.BCurrencyExcel;
+import org.springblade.los.finance.genleg.dto.PeriodExchangeRate;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.los.basic.cur.entity.BCurrency;
@@ -213,5 +214,16 @@ public class BCurrencyController extends BladeController {
 		return R.data(detail);
 	}
 
+	/**
+	 * 详情
+	 */
+	@GetMapping("/getPeriodExchangeRate")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入bCurrency")
+	public R<List<PeriodExchangeRate>> getPeriodExchangeRate() {
+		List<PeriodExchangeRate> detail = bCurrencyService.getPeriodExchangeRate();
+		return R.data(detail);
+	}
+
 
 }

+ 3 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/service/IBCurrencyService.java

@@ -22,6 +22,7 @@ import org.springblade.los.basic.cur.entity.BCurrency;
 import org.springblade.los.basic.cur.vo.BCurrencyVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.los.finance.genleg.dto.PeriodExchangeRate;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -88,4 +89,6 @@ public interface IBCurrencyService extends IService<BCurrency> {
 	BigDecimal getCnyExrate(String curCode, String dc,String type);
 
 	List<BCurrency> getExrate(BCurrency bCurrency);
+
+	List<PeriodExchangeRate> getPeriodExchangeRate();
 }

+ 81 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/cur/service/impl/BCurrencyServiceImpl.java

@@ -33,6 +33,7 @@ import org.springblade.los.basic.cur.service.IBCurExrateService;
 import org.springblade.los.basic.cur.service.IBCurrencyService;
 import org.springblade.los.basic.cur.vo.BCurrencyVO;
 import org.springblade.los.excel.BCurrencyExcel;
+import org.springblade.los.finance.genleg.dto.PeriodExchangeRate;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -663,4 +664,84 @@ public class BCurrencyServiceImpl extends ServiceImpl<CurrencyMapper, BCurrency>
 		return bCurrencyList;
 	}
 
+	@Override
+	public List<PeriodExchangeRate> getPeriodExchangeRate() {
+		BCurrency bCurrency = new BCurrency();
+		// 创建 Calendar 对象并设置为当前时间
+		Calendar calendar = Calendar.getInstance();
+		if (ObjectUtils.isNull(bCurrency.getDate())) {
+			bCurrency.setDate(new Date());
+		}
+		calendar.setTime(bCurrency.getDate());
+		int year = calendar.get(Calendar.YEAR); // 获取年份
+		int month = calendar.get(Calendar.MONTH) + 1; // 获取月份(注意需加上1,因为月份从0开始计数)
+		int day = calendar.get(Calendar.DATE) + 1;
+		List<BCurrency> bCurrencyList = baseMapper.selectList(new LambdaQueryWrapper<BCurrency>()
+			.eq(BCurrency::getTenantId, AuthUtil.getTenantId())
+			.eq(BCurrency::getIsDeleted, 0)
+			.apply("code != 'CNY'")
+			.eq(BCurrency::getStatus, 0));
+		for (BCurrency details : bCurrencyList) {
+			if (ObjectUtils.isNotNull(details) && ObjectUtils.isNotNull(details.getExrate()) &&
+				new BigDecimal("0.00").compareTo(details.getExrate()) != 0) {
+				LambdaQueryWrapper<BCurExrate> lambdaQueryWrapper = new LambdaQueryWrapper<BCurExrate>()
+					.eq(BCurExrate::getCode, details.getCode())
+					.eq(BCurExrate::getTenantId, AuthUtil.getTenantId())
+					.eq(BCurExrate::getIsDeleted, 0)
+					.eq(BCurExrate::getExrateYear, year);
+				String status = sysClient.getParamService("business.exchange.rate");
+				if (ObjectUtils.isNotNull(status)) {
+					if ("月".equals(status)) {
+						lambdaQueryWrapper.eq(BCurExrate::getExrateMonth, month)
+							.eq(BCurExrate::getType, "月汇率");
+					} else if ("日".equals(status)) {
+						lambdaQueryWrapper.eq(BCurExrate::getExrateMonth, month);
+						lambdaQueryWrapper.eq(BCurExrate::getExrateDay, day)
+							.eq(BCurExrate::getType, "日汇率");
+					} else {
+						if ("月汇率".equals(details.getParitiesType())) {
+							lambdaQueryWrapper.eq(BCurExrate::getExrateMonth, month)
+								.eq(BCurExrate::getType, details.getParitiesType());
+						} else if ("日汇率".equals(details.getParitiesType())) {
+							lambdaQueryWrapper.eq(BCurExrate::getExrateDay, day);
+							lambdaQueryWrapper.eq(BCurExrate::getExrateMonth, month)
+								.eq(BCurExrate::getType, details.getParitiesType());
+						}
+					}
+				} else {
+					if ("月汇率".equals(details.getParitiesType())) {
+						lambdaQueryWrapper.eq(BCurExrate::getExrateMonth, month)
+							.eq(BCurExrate::getType, details.getParitiesType());
+					} else if ("日汇率".equals(details.getParitiesType())) {
+						lambdaQueryWrapper.eq(BCurExrate::getExrateDay, day);
+						lambdaQueryWrapper.eq(BCurExrate::getExrateMonth, month)
+							.eq(BCurExrate::getType, details.getParitiesType());
+					}
+				}
+				BCurExrate bCurExrate = bCurExrateService.getOne(lambdaQueryWrapper);
+					if (ObjectUtils.isNull(bCurExrate)) {
+						throw new RuntimeException("请维护" + year + "年" + month + "月," + details.getCode() + "汇率");
+					}
+					if (ObjectUtils.isNull(bCurExrate.getExrateReceipts()) &&
+						new BigDecimal("0.00").compareTo(bCurExrate.getExrateReceipts()) == 0) {
+						throw new RuntimeException("请维护" + year + "年" + month + "月," + details.getCode() + "实收汇率");
+					} else {
+						details.setExrate(bCurExrate.getExrateReceipts());
+					}
+			} else {
+				throw new RuntimeException("请维护币别汇率");
+			}
+		}
+		List<PeriodExchangeRate> periodExchangeRates = new ArrayList<>();
+		for (BCurrency details : bCurrencyList) {
+			PeriodExchangeRate periodExchangeRate = new PeriodExchangeRate();
+			periodExchangeRate.setExrate(details.getExrate());
+			periodExchangeRate.setCurCode(details.getCode());
+			periodExchangeRate.setCurName(details.getCnName());
+			periodExchangeRate.setCurDate(year+"-"+month+"-"+day);
+			periodExchangeRates.add(periodExchangeRate);
+		}
+		return periodExchangeRates;
+	}
+
 }

+ 12 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/service/impl/LosBFeesTemplateServiceImpl.java

@@ -40,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 基础资料-费用模版及明细 服务实现类
@@ -113,7 +114,14 @@ public class LosBFeesTemplateServiceImpl extends ServiceImpl<LosBFeesTemplateMap
 				deptName = String.join(",", res.getData());
 			}
 		}
+		List<LosBFeesTemplate> list = baseMapper.selectList(new LambdaQueryWrapper<LosBFeesTemplate>()
+			.eq(LosBFeesTemplate::getTenantId, AuthUtil.getTenantId())
+			.eq(LosBFeesTemplate::getIsDeleted, 0)
+			.eq(LosBFeesTemplate::getCode, losBFeesTemplate.getCode()));
 		if (losBFeesTemplate.getId() == null) {
+			if (!list.isEmpty()) {
+				throw new RuntimeException("编码不允许重复");
+			}
 			losBFeesTemplate.setCreateTime(new Date());
 			losBFeesTemplate.setCreateUser(AuthUtil.getUserId());
 			losBFeesTemplate.setCreateUserName(AuthUtil.getUserName());
@@ -122,6 +130,10 @@ public class LosBFeesTemplateServiceImpl extends ServiceImpl<LosBFeesTemplateMap
 				losBFeesTemplate.setCreateDeptName(deptName);
 			}
 		} else {
+			List<Long> ids = list.stream().map(LosBFeesTemplate::getId).filter(e -> !e.equals(losBFeesTemplate.getId())).collect(Collectors.toList());
+			if (!ids.isEmpty()) {
+				throw new RuntimeException("编码不允许重复");
+			}
 			losBFeesTemplate.setUpdateUser(AuthUtil.getUserId());
 			losBFeesTemplate.setUpdateTime(new Date());
 			losBFeesTemplate.setUpdateUserName(AuthUtil.getUserName());

+ 12 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/aea/controller/AeaBillsController.java

@@ -378,5 +378,17 @@ public class AeaBillsController extends BladeController {
 		return R.data(detail);
 	}
 
+	/**
+	 * 是否同步汇率
+	 */
+	@GetMapping("/synchronizationExchangeRate")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入bills")
+	@RepeatSubmit
+	public R synchronizationExchangeRate(@RequestParam("date") String date, @RequestParam("type") String type
+		, @RequestParam("billId") Long billId) {
+		return aeaBillsService.synchronizationExchangeRate(date, type, billId);
+	}
+
 
 }

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/aea/service/IAeaBillsService.java

@@ -120,4 +120,6 @@ public interface IAeaBillsService extends IService<AeaBills> {
 	R revokeDisembarking(String ids);
 
     List<AeaBills> getDetail(AeaBills bills);
+
+    R synchronizationExchangeRate(String date, String type, Long billId);
 }

+ 325 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/aea/service/impl/AeaBillsServiceImpl.java

@@ -34,6 +34,7 @@ import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.basic.corps.entity.BCorps;
 import org.springblade.los.basic.corps.service.IBCorpsService;
+import org.springblade.los.basic.cur.entity.BCurrency;
 import org.springblade.los.basic.cur.service.IBCurrencyService;
 import org.springblade.los.billno.entity.BusinessBillNo;
 import org.springblade.los.billno.service.IBusinessBillNoService;
@@ -63,6 +64,9 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.math.RoundingMode;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -1297,4 +1301,325 @@ public class AeaBillsServiceImpl extends ServiceImpl<AeaBillsMapper, AeaBills> i
 		return billsList;
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public R synchronizationExchangeRate(String date, String type, Long billId) {
+		if (billId == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		AeaBills bills = baseMapper.selectById(billId);
+		if (bills == null) {
+			throw new RuntimeException("未查到单据信息");
+		}
+		bills.setUpdateUserName(AuthUtil.getUserName());
+		bills.setUpdateTime(new Date());
+		bills.setUpdateUser(AuthUtil.getUserId());
+		bills.setId(billId);
+		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		Date date1;
+		try {
+			date1 = dateFormat.parse(date);
+			if ("AE".equals(bills.getBusinessType())) {
+				bills.setEtd(date1);
+			} else if ("AI".equals(bills.getBusinessType())) {
+				bills.setEta(date1);
+			}
+			bills.setBillDate(date1);
+		} catch (ParseException e) {
+			throw new RuntimeException(e);
+		}
+		if ("1".equals(type)) {
+			List<FeeCenter> feeCenterListSum = new ArrayList<>();
+			BigDecimal exrateDUsd = null;
+			BigDecimal exrateCUsd = null;
+			BCurrency bCurrency = new BCurrency();
+			bCurrency.setType("1");
+			bCurrency.setDc("D");
+			bCurrency.setDate(date1);
+			List<BCurrency> bCurrencyListD = bCurrencyService.getExrate(bCurrency);
+			if (!bCurrencyListD.isEmpty()) {
+				BCurrency bCurrency1 = bCurrencyListD.stream().filter(e -> e.getCode().equals("USD"))
+					.findFirst().orElse(null);
+				if (bCurrency1 != null) {
+					exrateDUsd = bCurrency1.getExrate();
+				}
+			}
+			bCurrency.setDc("C");
+			List<BCurrency> bCurrencyListC = bCurrencyService.getExrate(bCurrency);
+			if (!bCurrencyListD.isEmpty()) {
+				BCurrency bCurrency1 = bCurrencyListC.stream().filter(e -> e.getCode().equals("USD"))
+					.findFirst().orElse(null);
+				if (bCurrency1 != null) {
+					exrateCUsd = bCurrency1.getExrate();
+				}
+			}
+			if (ObjectUtils.isNull(exrateDUsd) || ObjectUtils.isNull(exrateCUsd)) {
+				throw new RuntimeException("请先维护汇率信息");
+			}
+
+			BigDecimal amountDr = new BigDecimal("0.00");
+			BigDecimal amountCr = new BigDecimal("0.00");
+			BigDecimal amountProfit = new BigDecimal("0.00");
+			BigDecimal amountDrUsd = new BigDecimal("0.00");
+			BigDecimal amountCrUsd = new BigDecimal("0.00");
+			BigDecimal amountProfitUsd = new BigDecimal("0.00");
+			BigDecimal amountDrLoc = new BigDecimal("0.00");
+			BigDecimal amountCrLoc = new BigDecimal("0.00");
+			BigDecimal amountProfitLoc = new BigDecimal("0.00");
+
+			List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getIsDeleted, 0)
+				.eq(FeeCenter::getPid, billId));
+			if (!feeCenterList.isEmpty()) {
+				List<FeeCenter> feeCenterListD = feeCenterList.stream().filter(e -> e.getDc().equals("D")).collect(Collectors.toList());
+				if (!feeCenterListD.isEmpty()) {
+					for (FeeCenter item : feeCenterListD) {
+						item.setEtd(bills.getEtd());
+						item.setEta(bills.getEta());
+						if ("USD".equals(item.getCurCode())) {
+							amountCrUsd = amountCrUsd.add(item.getAmount());
+						} else if ("CNY".equals(item.getCurCode())) {
+							amountCr = amountCr.add(item.getAmount());
+						} else {
+							BigDecimal usd = item.getAmount().multiply(exrateDUsd);
+							amountCrUsd = amountCrUsd.add(usd);
+						}
+						if ("USD".equals(item.getCurCode())) {
+							item.setExrate(exrateDUsd);
+							item.setAmountNetLoc(item.getAmountNet().multiply(exrateDUsd));
+							item.setAmountTaxLoc(item.getAmountTax().multiply(exrateDUsd));
+							item.setAmountLoc(item.getAmount().multiply(exrateDUsd));
+							item.setAmountDiscountLoc(item.getAmount().multiply(exrateDUsd));
+						}
+						feeCenterListSum.add(item);
+					}
+				}
+				List<FeeCenter> feeCenterListC = feeCenterList.stream().filter(e -> e.getDc().equals("C")).collect(Collectors.toList());
+				if (!feeCenterListC.isEmpty()) {
+					for (FeeCenter item : feeCenterListC) {
+						item.setEtd(bills.getEtd());
+						item.setEta(bills.getEta());
+						if ("USD".equals(item.getCurCode())) {
+							amountDrUsd = amountDrUsd.add(item.getAmount());
+						} else if ("CNY".equals(item.getCurCode())) {
+							amountDr = amountDr.add(item.getAmount());
+						} else {
+							BigDecimal usd = item.getAmount().multiply(exrateCUsd);
+							amountDrUsd = amountDrUsd.add(usd);
+						}
+						if ("USD".equals(item.getCurCode())) {
+							item.setExrate(exrateCUsd);
+							item.setAmountNetLoc(item.getAmountNet().multiply(exrateCUsd));
+							item.setAmountTaxLoc(item.getAmountTax().multiply(exrateCUsd));
+							item.setAmountLoc(item.getAmount().multiply(exrateCUsd));
+							item.setAmountDiscountLoc(item.getAmount().multiply(exrateCUsd));
+						}
+						feeCenterListSum.add(item);
+					}
+				}
+				//主单应加上分单费用
+				if ("MM".equals(bills.getBillType())) {
+					List<AeaBills> details = baseMapper.selectList(new LambdaQueryWrapper<AeaBills>()
+						.select(AeaBills::getAmountDr, AeaBills::getAmountCr, AeaBills::getAmountDrUsd, AeaBills::getAmountCrUsd, AeaBills::getAmountDrLoc, AeaBills::getAmountCrLoc
+							, AeaBills::getQuantity, AeaBills::getGrossWeight, AeaBills::getMeasurement)
+						.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
+						.eq(AeaBills::getIsDeleted, 0)
+						.eq(AeaBills::getMasterId, bills.getId()));
+					if (!details.isEmpty()) {
+						List<Long> billIds = details.stream().map(AeaBills::getId).distinct().collect(Collectors.toList());
+						List<FeeCenter> feeCenterListMH = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+							.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+							.eq(FeeCenter::getIsDeleted, 0)
+							.in(FeeCenter::getPid, billIds));
+						for (AeaBills item : details) {
+
+							BigDecimal amountDrMH = new BigDecimal("0.00");
+							BigDecimal amountCrMH = new BigDecimal("0.00");
+							BigDecimal amountProfitMH = new BigDecimal("0.00");
+							BigDecimal amountDrUsdMH = new BigDecimal("0.00");
+							BigDecimal amountCrUsdMH = new BigDecimal("0.00");
+							BigDecimal amountProfitUsdMH = new BigDecimal("0.00");
+							BigDecimal amountDrLocMH = new BigDecimal("0.00");
+							BigDecimal amountCrLocMH = new BigDecimal("0.00");
+							BigDecimal amountProfitLocMH = new BigDecimal("0.00");
+
+							item.setUpdateUserName(AuthUtil.getUserName());
+							item.setUpdateTime(new Date());
+							item.setUpdateUser(AuthUtil.getUserId());
+							if ("AE".equals(item.getBusinessType())) {
+								item.setEtd(date1);
+							} else if ("AI".equals(item.getBusinessType())) {
+								item.setEta(date1);
+							}
+							item.setBillDate(date1);
+							if (!feeCenterListMH.isEmpty()) {
+								List<FeeCenter> feeCenterListDMH = feeCenterListMH.stream().filter(e -> e.getDc().equals("D")
+									&& item.getId().equals(e.getPid())).collect(Collectors.toList());
+								if (!feeCenterListDMH.isEmpty()) {
+									for (FeeCenter itemMH : feeCenterListDMH) {
+										itemMH.setEtd(bills.getEtd());
+										itemMH.setEta(bills.getEta());
+										if ("USD".equals(itemMH.getCurCode())) {
+											amountCrUsd = amountCrUsd.add(itemMH.getAmount());
+											amountCrUsdMH = amountCrUsdMH.add(itemMH.getAmount());
+										} else if ("CNY".equals(itemMH.getCurCode())) {
+											amountCr = amountCr.add(itemMH.getAmount());
+											amountCrMH = amountCrMH.add(itemMH.getAmount());
+										} else {
+											BigDecimal usd = itemMH.getAmount().multiply(exrateDUsd);
+											amountCrUsd = amountCrUsd.add(usd);
+											amountCrUsdMH = amountCrUsdMH.add(usd);
+										}
+										if ("USD".equals(itemMH.getCurCode())) {
+											itemMH.setExrate(exrateDUsd);
+											itemMH.setAmountNetLoc(itemMH.getAmountNet().multiply(exrateDUsd));
+											itemMH.setAmountTaxLoc(itemMH.getAmountTax().multiply(exrateDUsd));
+											itemMH.setAmountLoc(itemMH.getAmount().multiply(exrateDUsd));
+											itemMH.setAmountDiscountLoc(itemMH.getAmount().multiply(exrateDUsd));
+										}
+										feeCenterListSum.add(itemMH);
+									}
+								}
+								List<FeeCenter> feeCenterListCMH = feeCenterListMH.stream().filter(e -> e.getDc().equals("C")
+									&& item.getId().equals(e.getPid())).collect(Collectors.toList());
+								if (!feeCenterListCMH.isEmpty()) {
+									for (FeeCenter itemMH : feeCenterListCMH) {
+										itemMH.setEtd(bills.getEtd());
+										itemMH.setEta(bills.getEta());
+										if ("USD".equals(itemMH.getCurCode())) {
+											amountDrUsd = amountDrUsd.add(itemMH.getAmount());
+											amountDrUsdMH = amountDrUsdMH.add(itemMH.getAmount());
+										} else if ("CNY".equals(itemMH.getCurCode())) {
+											amountDr = amountDr.add(itemMH.getAmount());
+											amountDrMH = amountDrMH.add(itemMH.getAmount());
+										} else {
+											BigDecimal usd = itemMH.getAmount().multiply(exrateCUsd);
+											amountDrUsd = amountDrUsd.add(usd);
+											amountDrUsdMH = amountDrUsdMH.add(usd);
+										}
+										if ("USD".equals(itemMH.getCurCode())) {
+											itemMH.setExrate(exrateCUsd);
+											itemMH.setAmountNetLoc(itemMH.getAmountNet().multiply(exrateCUsd));
+											itemMH.setAmountTaxLoc(itemMH.getAmountTax().multiply(exrateCUsd));
+											itemMH.setAmountLoc(itemMH.getAmount().multiply(exrateCUsd));
+											itemMH.setAmountDiscountLoc(itemMH.getAmount().multiply(exrateCUsd));
+										}
+										feeCenterListSum.add(itemMH);
+									}
+								}
+							}
+							//利润 = 收 - 付
+							amountProfitMH = amountDrMH.subtract(amountCrMH);
+							amountProfitUsdMH = amountDrUsdMH.subtract(amountCrUsdMH);
+							if (amountDrUsdMH.compareTo(new BigDecimal("0.00")) != 0) {
+								amountDrLocMH = amountDrLocMH.add(amountDrUsdMH.multiply(exrateDUsd).add(amountDrMH));
+							} else {
+								amountDrLocMH = amountDrLocMH.add(amountDrMH);
+							}
+							if (amountCrUsdMH.compareTo(new BigDecimal("0.00")) != 0) {
+								amountCrLocMH = amountCrLocMH.add(amountCrUsdMH.multiply(exrateCUsd).add(amountCrMH));
+							} else {
+								amountCrLocMH = amountCrLocMH.add(amountCrMH);
+							}
+							amountProfitLocMH = amountDrLocMH.subtract(amountCrLocMH);
+							item.setAmountDr(amountDrMH);
+							item.setAmountCr(amountCrMH);
+							item.setAmountProfit(amountProfitMH);
+							item.setAmountDrUsd(amountDrUsdMH);
+							item.setAmountCrUsd(amountCrUsdMH);
+							item.setAmountProfitUsd(amountProfitUsdMH);
+							item.setAmountDrLoc(amountDrLocMH);
+							item.setAmountCrLoc(amountCrLocMH);
+							item.setAmountProfitLoc(amountProfitLocMH);
+						}
+						this.updateBatchById(details);
+					}
+				} else if ("MH".equals(bills.getBillType()) && ObjectUtils.isNotNull(bills.getId())) {
+					AeaBills details = baseMapper.selectOne(new LambdaQueryWrapper<AeaBills>()
+						.select(AeaBills::getAmountDr, AeaBills::getAmountCr, AeaBills::getAmountProfit, AeaBills::getAmountDrUsd, AeaBills::getAmountCrUsd
+							, AeaBills::getAmountProfitUsd, AeaBills::getAmountDrLoc, AeaBills::getAmountCrLoc, AeaBills::getAmountProfitLoc
+							, AeaBills::getQuantity, AeaBills::getGrossWeight, AeaBills::getMeasurement)
+						.eq(AeaBills::getMasterId, bills.getMasterId()));
+					//重新计算主单合计
+					if (details != null) {
+						BigDecimal amountDrM = new BigDecimal("0.00");
+						BigDecimal amountCrM = new BigDecimal("0.00");
+						BigDecimal amountProfitM = new BigDecimal("0.00");
+						BigDecimal amountDrUsdM = new BigDecimal("0.00");
+						BigDecimal amountCrUsdM = new BigDecimal("0.00");
+						BigDecimal amountProfitUsdM = new BigDecimal("0.00");
+						BigDecimal amountDrLocM = new BigDecimal("0.00");
+						BigDecimal amountCrLocM = new BigDecimal("0.00");
+						BigDecimal amountProfitLocM = new BigDecimal("0.00");
+						amountDrM = amountDrM.add(details.getAmountDr());
+						amountCrM = amountCrM.add(details.getAmountCr());
+						amountDrUsdM = amountDrUsdM.add(details.getAmountDrUsd());
+						amountCrUsdM = amountCrUsdM.add(details.getAmountCrUsd());
+						List<AeaBills> billsList = this.list(new LambdaQueryWrapper<AeaBills>()
+							.select(AeaBills::getAmountDr, AeaBills::getAmountCr, AeaBills::getAmountDrUsd, AeaBills::getAmountCrUsd, AeaBills::getAmountDrLoc
+								, AeaBills::getAmountCrLoc, AeaBills::getQuantity, AeaBills::getQuantity, AeaBills::getGrossWeight, AeaBills::getMeasurement)
+							.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
+							.eq(AeaBills::getIsDeleted, 0)
+							.eq(AeaBills::getMasterId, details.getId()));
+						List<AeaBills> billsLists = billsList.stream().filter(e -> !e.getId().equals(bills.getId())).collect(Collectors.toList());
+						if (!billsLists.isEmpty()) {
+							amountDrM = amountDrM.add(billsLists.stream().map(AeaBills::getAmountDr).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+							amountCrM = amountCrM.add(billsLists.stream().map(AeaBills::getAmountCr).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+							amountDrUsdM = amountDrUsdM.add(billsLists.stream().map(AeaBills::getAmountDrUsd).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+							amountCrUsdM = amountCrUsdM.add(billsLists.stream().map(AeaBills::getAmountCrUsd).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+						}
+						amountDrM = amountDrM.add(amountDr);
+						amountCrM = amountCrM.add(amountCr);
+						amountDrUsdM = amountDrUsdM.add(amountDrUsd);
+						amountCrUsdM = amountCrUsdM.add(amountCrUsd);
+						//利润 = 收 - 付
+						amountProfitM = amountDrM.subtract(amountCrM);
+						amountProfitUsdM = amountDrUsdM.subtract(amountCrUsdM);
+						amountDrLocM = amountDrLocM.add(bCurrencyService.converterCny("USD", amountDrUsdM, "D", "1")).add(amountDrM);
+						amountCrLocM = amountCrLocM.add(bCurrencyService.converterCny("USD", amountCrUsdM, "C", "1")).add(amountCrM);
+						amountProfitLocM = amountDrLocM.subtract(amountCrLocM);
+						details.setAmountDr(amountDrM);
+						details.setAmountCr(amountCrM);
+						details.setAmountProfit(amountProfitM);
+						details.setAmountDrUsd(amountDrUsdM);
+						details.setAmountCrUsd(amountCrUsdM);
+						details.setAmountProfitUsd(amountProfitUsdM);
+						details.setAmountDrLoc(amountDrLocM);
+						details.setAmountCrLoc(amountCrLocM);
+						details.setAmountProfitLoc(amountProfitLocM);
+						baseMapper.updateById(details);
+					}
+				}
+				//利润 = 收 - 付
+				amountProfit = amountDr.subtract(amountCr);
+				amountProfitUsd = amountDrUsd.subtract(amountCrUsd);
+				if (amountDrUsd.compareTo(new BigDecimal("0.00")) != 0) {
+					amountDrLoc = amountDrLoc.add(amountDrUsd.multiply(exrateDUsd).add(amountDr));
+				} else {
+					amountDrLoc = amountDrLoc.add(amountDr);
+				}
+				if (amountCrUsd.compareTo(new BigDecimal("0.00")) != 0) {
+					amountCrLoc = amountCrLoc.add(amountCrUsd.multiply(exrateDUsd).add(amountCr));
+				} else {
+					amountCrLoc = amountCrLoc.add(amountCr);
+				}
+				amountProfitLoc = amountDrLoc.subtract(amountCrLoc);
+				bills.setAmountDr(amountDr);
+				bills.setAmountCr(amountCr);
+				bills.setAmountProfit(amountProfit);
+				bills.setAmountDrUsd(amountDrUsd);
+				bills.setAmountCrUsd(amountCrUsd);
+				bills.setAmountProfitUsd(amountProfitUsd);
+				bills.setAmountDrLoc(amountDrLoc);
+				bills.setAmountCrLoc(amountCrLoc);
+				bills.setAmountProfitLoc(amountProfitLoc);
+				feeCenterService.updateBatchById(feeCenterListSum);
+			}
+		}
+		baseMapper.updateById(bills);
+		return R.data(bills);
+	}
+
 }

+ 57 - 13
blade-service/blade-los/src/main/java/org/springblade/los/business/release/controller/SeaReleaseBillController.java

@@ -33,13 +33,14 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.los.business.release.entity.SeaReleaseBill;
 import org.springblade.los.business.release.entity.SeaReleaseBillItems;
+import org.springblade.los.business.release.service.ISeaReleaseBillItemsService;
 import org.springblade.los.business.release.service.ISeaReleaseBillService;
 import org.springblade.los.business.release.vo.SeaReleaseBillVO;
-import org.springblade.los.business.sea.entity.Bills;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 业务-海运放单 控制器
@@ -55,6 +56,8 @@ public class SeaReleaseBillController extends BladeController {
 
 	private final ISeaReleaseBillService seaReleaseBillService;
 
+	private final ISeaReleaseBillItemsService seaReleaseBillItemsService;
+
 	/**
 	 * 详情
 	 */
@@ -77,10 +80,51 @@ public class SeaReleaseBillController extends BladeController {
 		lambdaQueryWrapper.eq(SeaReleaseBill::getTenantId, AuthUtil.getTenantId())
 			.eq(SeaReleaseBill::getIsDeleted, 0)
 			.eq(SeaReleaseBill::getBillType, seaReleaseBill.getBillType())
-			.eq(ObjectUtils.isNotNull(seaReleaseBill.getBillNo()), SeaReleaseBill::getBillNo, seaReleaseBill.getBillNo())
-			.eq(ObjectUtils.isNotNull(seaReleaseBill.getCorpCnName()), SeaReleaseBill::getCorpCnName, seaReleaseBill.getCorpCnName())
-			.orderByDesc(SeaReleaseBill::getBillDate);
+			.like(ObjectUtils.isNotNull(seaReleaseBill.getBillNo()), SeaReleaseBill::getBillNo, seaReleaseBill.getBillNo())
+			.eq(ObjectUtils.isNotNull(seaReleaseBill.getCorpCnName()), SeaReleaseBill::getCorpCnName, seaReleaseBill.getCorpCnName());
+		if (ObjectUtils.isNotNull(seaReleaseBill.getBillDateList()) && !seaReleaseBill.getBillDateList().isEmpty()) {
+			lambdaQueryWrapper.gt(SeaReleaseBill::getBillDate, seaReleaseBill.getBillDateList().get(0));
+			lambdaQueryWrapper.lt(SeaReleaseBill::getBillDate, seaReleaseBill.getBillDateList().get(1));
+		}
+		if (ObjectUtils.isNotNull(seaReleaseBill.getApplyTimeList()) && !seaReleaseBill.getApplyTimeList().isEmpty()) {
+			lambdaQueryWrapper.gt(SeaReleaseBill::getApplyTime, seaReleaseBill.getApplyTimeList().get(0));
+			lambdaQueryWrapper.lt(SeaReleaseBill::getApplyTime, seaReleaseBill.getApplyTimeList().get(1));
+		}
+		if (ObjectUtils.isNotNull(seaReleaseBill.getRequireTimeList()) && !seaReleaseBill.getRequireTimeList().isEmpty()) {
+			lambdaQueryWrapper.gt(SeaReleaseBill::getRequireTime, seaReleaseBill.getRequireTimeList().get(0));
+			lambdaQueryWrapper.lt(SeaReleaseBill::getRequireTime, seaReleaseBill.getRequireTimeList().get(1));
+		}
+		lambdaQueryWrapper.orderByDesc(SeaReleaseBill::getBillDate);
 		IPage<SeaReleaseBill> pages = seaReleaseBillService.page(Condition.getPage(query), lambdaQueryWrapper);
+		if (!pages.getRecords().isEmpty()){
+			List<Long> ids = pages.getRecords().stream().map(SeaReleaseBill::getId).collect(Collectors.toList());
+			LambdaQueryWrapper<SeaReleaseBillItems> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper1.eq(SeaReleaseBillItems::getTenantId, AuthUtil.getTenantId())
+				.eq(SeaReleaseBillItems::getIsDeleted, 0);
+			if ("A".equals(seaReleaseBill.getBillType())) {
+				lambdaQueryWrapper1.in(SeaReleaseBillItems::getPApplyId, ids);
+			} else if ("D".equals(seaReleaseBill.getBillType())) {
+				lambdaQueryWrapper1.in(SeaReleaseBillItems::getPDispatchId, ids);
+			} else if ("R".equals(seaReleaseBill.getBillType())) {
+				lambdaQueryWrapper1.in(SeaReleaseBillItems::getPReleaseId, ids);
+			}
+			List<SeaReleaseBillItems> seaReleaseBillList = seaReleaseBillItemsService.list(lambdaQueryWrapper1);
+			for (SeaReleaseBill item : pages.getRecords()) {
+				if ("A".equals(item.getBillType())) {
+					List<SeaReleaseBillItems> seaReleaseBillItems = seaReleaseBillList.stream()
+						.filter(e -> e.getPApplyId().equals(item.getId())).collect(Collectors.toList());
+					item.setNumberOfObl(seaReleaseBillItems.size());
+				} else if ("D".equals(item.getBillType())) {
+					List<SeaReleaseBillItems> seaReleaseBillItems = seaReleaseBillList.stream()
+						.filter(e -> e.getPDispatchId().equals(item.getId())).collect(Collectors.toList());
+					item.setNumberOfObl(seaReleaseBillItems.size());
+				} else if ("R".equals(item.getBillType())) {
+					List<SeaReleaseBillItems> seaReleaseBillItems = seaReleaseBillList.stream()
+						.filter(e -> e.getPReleaseId().equals(item.getId())).collect(Collectors.toList());
+					item.setNumberOfObl(seaReleaseBillItems.size());
+				}
+			}
+		}
 		return R.data(pages);
 	}
 
@@ -122,7 +166,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R submit(@Valid @RequestBody SeaReleaseBill seaReleaseBill) throws Exception{
+	public R submit(@Valid @RequestBody SeaReleaseBill seaReleaseBill) throws Exception {
 		return seaReleaseBillService.submit(seaReleaseBill);
 	}
 
@@ -145,7 +189,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R application(@Valid @RequestBody SeaReleaseBill seaReleaseBill){
+	public R application(@Valid @RequestBody SeaReleaseBill seaReleaseBill) {
 		return seaReleaseBillService.application(seaReleaseBill);
 	}
 
@@ -156,7 +200,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R revokeApplication(@Valid @RequestBody SeaReleaseBill seaReleaseBill){
+	public R revokeApplication(@Valid @RequestBody SeaReleaseBill seaReleaseBill) {
 		return seaReleaseBillService.revokeApplication(seaReleaseBill);
 	}
 
@@ -167,7 +211,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R signcomplete(@Valid @RequestBody SeaReleaseBill seaReleaseBill){
+	public R signcomplete(@Valid @RequestBody SeaReleaseBill seaReleaseBill) {
 		return seaReleaseBillService.signcomplete(seaReleaseBill);
 	}
 
@@ -178,7 +222,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R revokeSigncomplete(@Valid @RequestBody SeaReleaseBill seaReleaseBill){
+	public R revokeSigncomplete(@Valid @RequestBody SeaReleaseBill seaReleaseBill) {
 		return seaReleaseBillService.revokeSigncomplete(seaReleaseBill);
 	}
 
@@ -189,7 +233,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R generateDispatch(@Valid @RequestBody SeaReleaseBill seaReleaseBill){
+	public R generateDispatch(@Valid @RequestBody SeaReleaseBill seaReleaseBill) {
 		return seaReleaseBillService.generateDispatch(seaReleaseBill);
 	}
 
@@ -200,7 +244,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R dispatchComplete(@Valid @RequestBody SeaReleaseBill seaReleaseBill){
+	public R dispatchComplete(@Valid @RequestBody SeaReleaseBill seaReleaseBill) {
 		return seaReleaseBillService.dispatchComplete(seaReleaseBill);
 	}
 
@@ -211,7 +255,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R removeDispatch(@Valid @RequestBody SeaReleaseBill seaReleaseBill){
+	public R removeDispatch(@Valid @RequestBody SeaReleaseBill seaReleaseBill) {
 		return seaReleaseBillService.removeDispatch(seaReleaseBill);
 	}
 
@@ -233,7 +277,7 @@ public class SeaReleaseBillController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入seaReleaseBill")
 	@RepeatSubmit
-	public R releaseComplete(@Valid @RequestBody SeaReleaseBill seaReleaseBill){
+	public R releaseComplete(@Valid @RequestBody SeaReleaseBill seaReleaseBill) {
 		return seaReleaseBillService.releaseComplete(seaReleaseBill);
 	}
 

+ 15 - 2
blade-service/blade-los/src/main/java/org/springblade/los/business/release/controller/SeaReleaseBillItemsController.java

@@ -74,11 +74,24 @@ public class SeaReleaseBillItemsController extends BladeController {
 		lambdaQueryWrapper.eq(SeaReleaseBillItems::getTenantId, AuthUtil.getTenantId())
 			.eq(SeaReleaseBillItems::getIsDeleted, 0)
 			.like(ObjectUtils.isNotNull(seaReleaseBillItems.getBillNo()), SeaReleaseBillItems::getBillNo, seaReleaseBillItems.getBillNo())
+			.eq(ObjectUtils.isNotNull(seaReleaseBillItems.getCorpId()), SeaReleaseBillItems::getCorpId, seaReleaseBillItems.getCorpId())
 			.eq(ObjectUtils.isNotNull(seaReleaseBillItems.getPReleaseId()), SeaReleaseBillItems::getPReleaseId, seaReleaseBillItems.getPReleaseId())
 			.eq(ObjectUtils.isNotNull(seaReleaseBillItems.getPApplyId()), SeaReleaseBillItems::getPApplyId, seaReleaseBillItems.getPApplyId())
 			.eq(ObjectUtils.isNotNull(seaReleaseBillItems.getPDispatchId()), SeaReleaseBillItems::getPDispatchId, seaReleaseBillItems.getPDispatchId())
-			.eq(ObjectUtils.isNotNull(seaReleaseBillItems.getIssueStatus()), SeaReleaseBillItems::getIssueStatus, seaReleaseBillItems.getIssueStatus())
-			.orderByDesc(SeaReleaseBillItems::getBillDate);
+			.eq(ObjectUtils.isNotNull(seaReleaseBillItems.getIssueStatus()), SeaReleaseBillItems::getIssueStatus, seaReleaseBillItems.getIssueStatus());
+		if (ObjectUtils.isNotNull(seaReleaseBillItems.getBillDateList()) && !seaReleaseBillItems.getBillDateList().isEmpty()){
+			lambdaQueryWrapper.gt(SeaReleaseBillItems::getBillDate,seaReleaseBillItems.getBillDateList().get(0));
+			lambdaQueryWrapper.lt(SeaReleaseBillItems::getBillDate,seaReleaseBillItems.getBillDateList().get(1));
+		}
+		if (ObjectUtils.isNotNull(seaReleaseBillItems.getApplyTimeList()) && !seaReleaseBillItems.getApplyTimeList().isEmpty()){
+			lambdaQueryWrapper.gt(SeaReleaseBillItems::getApplyTime,seaReleaseBillItems.getApplyTimeList().get(0));
+			lambdaQueryWrapper.lt(SeaReleaseBillItems::getApplyTime,seaReleaseBillItems.getApplyTimeList().get(1));
+		}
+		if (ObjectUtils.isNotNull(seaReleaseBillItems.getRequireTimeList()) && !seaReleaseBillItems.getRequireTimeList().isEmpty()){
+			lambdaQueryWrapper.gt(SeaReleaseBillItems::getRequireTime,seaReleaseBillItems.getRequireTimeList().get(0));
+			lambdaQueryWrapper.lt(SeaReleaseBillItems::getRequireTime,seaReleaseBillItems.getRequireTimeList().get(1));
+		}
+		lambdaQueryWrapper.orderByDesc(SeaReleaseBillItems::getBillDate);
 		IPage<SeaReleaseBillItems> pages = seaReleaseBillItemsService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}

+ 10 - 3
blade-service/blade-los/src/main/java/org/springblade/los/business/release/service/impl/SeaReleaseBillServiceImpl.java

@@ -160,6 +160,7 @@ public class SeaReleaseBillServiceImpl extends ServiceImpl<SeaReleaseBillMapper,
 		if (ObjectUtils.isNotNull(releaseBill.getReleaseBillList()) && !releaseBill.getReleaseBillList().isEmpty()) {
 			for (SeaReleaseBillItems item : releaseBill.getReleaseBillList()) {
 				item.setPReleaseId(releaseBill.getId());
+				item.setIsSwtich(releaseBill.getIsSwtich());
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
@@ -181,6 +182,7 @@ public class SeaReleaseBillServiceImpl extends ServiceImpl<SeaReleaseBillMapper,
 		if (ObjectUtils.isNotNull(releaseBill.getApplicationList()) && !releaseBill.getApplicationList().isEmpty()) {
 			for (SeaReleaseBillItems item : releaseBill.getApplicationList()) {
 				item.setPApplyId(releaseBill.getId());
+				item.setIsSwtich(releaseBill.getIsSwtich());
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
@@ -205,6 +207,7 @@ public class SeaReleaseBillServiceImpl extends ServiceImpl<SeaReleaseBillMapper,
 		if (ObjectUtils.isNotNull(releaseBill.getDispatchList()) && !releaseBill.getDispatchList().isEmpty()) {
 			for (SeaReleaseBillItems item : releaseBill.getDispatchList()) {
 				item.setPDispatchId(releaseBill.getId());
+				item.setIsSwtich(releaseBill.getIsSwtich());
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
@@ -277,6 +280,7 @@ public class SeaReleaseBillServiceImpl extends ServiceImpl<SeaReleaseBillMapper,
 			throw new RuntimeException("缺少必要参数");
 		}
 		seaReleaseBill.setIssueStatus("N");
+		seaReleaseBill.setApplyTime(null);
 		seaReleaseBill.setUpdateUser(AuthUtil.getUserId());
 		seaReleaseBill.setUpdateTime(new Date());
 		baseMapper.updateById(seaReleaseBill);
@@ -372,6 +376,9 @@ public class SeaReleaseBillServiceImpl extends ServiceImpl<SeaReleaseBillMapper,
 		//申请明细
 		if (!seaReleaseBill.getApplicationList().isEmpty()) {
 			for (SeaReleaseBillItems item : seaReleaseBill.getApplicationList()) {
+				if ("D".equals(item.getIssueStatus())) {
+					throw new RuntimeException("单据编号:" + item.getBillNo() + "已生成调度信息,撤销失败");
+				}
 				item.setIssueStatus("B");
 				item.setUpdateUser(AuthUtil.getUserId());
 				item.setUpdateTime(date);
@@ -536,7 +543,7 @@ public class SeaReleaseBillServiceImpl extends ServiceImpl<SeaReleaseBillMapper,
 			.eq(ObjectUtils.isNotNull(releaseBill.getVoyageNo()), SeaReleaseBillItems::getVoyageNo, releaseBill.getVoyageNo())
 			.eq(ObjectUtils.isNotNull(releaseBill.getPolId()), SeaReleaseBillItems::getPolId, releaseBill.getPolId())
 			.eq(ObjectUtils.isNotNull(releaseBill.getPodId()), SeaReleaseBillItems::getPodId, releaseBill.getPodId())
-			.eq( SeaReleaseBillItems::getIssueStatus, "I")
+			.eq(SeaReleaseBillItems::getIssueStatus, "I")
 			.eq(ObjectUtils.isNotNull(releaseBill.getIsSwtich()), SeaReleaseBillItems::getIsSwtich, releaseBill.getIsSwtich())
 			.eq(ObjectUtils.isNotNull(releaseBill.getReleaseType()), SeaReleaseBillItems::getReleaseType, releaseBill.getReleaseType())
 		;
@@ -704,12 +711,12 @@ public class SeaReleaseBillServiceImpl extends ServiceImpl<SeaReleaseBillMapper,
 			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 			for (Bills item : billsList1) {
 				if ("SE".equals(item.getBusinessType())) {
-					if (ObjectUtils.isNotNull(item.getEtd())){
+					if (ObjectUtils.isNotNull(item.getEtd())) {
 						text.append(sdf.format(item.getEtd()));
 					}
 					text.append(" ");
 				} else {
-					if (ObjectUtils.isNotNull(item.getEta())){
+					if (ObjectUtils.isNotNull(item.getEta())) {
 						text.append(sdf.format(item.getEta()));
 					}
 					text.append(" ");

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

@@ -96,6 +96,7 @@ public class BillsController extends BladeController {
 			.like(ObjectUtils.isNotNull(bills.getBillNo()), Bills::getBillNo, bills.getBillNo())
 			.like(ObjectUtils.isNotNull(bills.getMblno()), Bills::getMblno, bills.getMblno())
 			.like(ObjectUtils.isNotNull(bills.getHblno()), Bills::getHblno, bills.getHblno())
+			.like(ObjectUtils.isNotNull(bills.getBookingNo()), Bills::getBookingNo, bills.getBookingNo())
 			.and(ObjectUtils.isNotNull(bills.getVesselCnName()), i -> i.like(Bills::getVesselCnName, bills.getVesselCnName()).or()
 				.like(Bills::getVesselEnName, bills.getVesselCnName()))
 			.like(ObjectUtils.isNotNull(bills.getVoyageNo()), Bills::getVoyageNo, bills.getVoyageNo())
@@ -160,6 +161,7 @@ public class BillsController extends BladeController {
 			.like(ObjectUtils.isNotNull(bills.getBillNo()), Bills::getBillNo, bills.getBillNo())
 			.like(ObjectUtils.isNotNull(bills.getMblno()), Bills::getMblno, bills.getMblno())
 			.like(ObjectUtils.isNotNull(bills.getHblno()), Bills::getHblno, bills.getHblno())
+			.like(ObjectUtils.isNotNull(bills.getBookingNo()), Bills::getBookingNo, bills.getBookingNo())
 			.and(ObjectUtils.isNotNull(bills.getVesselCnName()), i -> i.like(Bills::getVesselCnName, bills.getVesselCnName()).or()
 				.like(Bills::getVesselEnName, bills.getVesselCnName()))
 			.like(ObjectUtils.isNotNull(bills.getVoyageNo()), Bills::getVoyageNo, bills.getVoyageNo())

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

@@ -1758,11 +1758,12 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			seaReleaseBillItems.setPodCnName(item.getPodCnName());
 			seaReleaseBillItems.setPodEnName(item.getPodEnName());
 			seaReleaseBillItems.setPodNamePrint(item.getPodNamePrint());
-			seaReleaseBillItems.setNumberOfObl(item.getNumberOfObl());
-			seaReleaseBillItems.setNumberOfCopy(item.getNumberOfCopy());
+			seaReleaseBillItems.setNumberOfObl(1);
+			seaReleaseBillItems.setNumberOfCopy(1);
 			seaReleaseBillItems.setIssueType(item.getIssueType());
 			seaReleaseBillItems.setIssueDate(item.getIssueDate());
 			seaReleaseBillItems.setIssueAt(item.getIssueAt());
+			seaReleaseBillItems.setRemarks(item.getRemarks());
 //			seaReleaseBillItems.setStlMode(item.getHpaymode());
 			seaReleaseBillItemsList.add(seaReleaseBillItems);
 		}
@@ -1793,6 +1794,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			} else if ("SI".equals(bills.getBusinessType())) {
 				bills.setEta(date1);
 			}
+			bills.setBillDate(date1);
 		} catch (ParseException e) {
 			throw new RuntimeException(e);
 		}
@@ -1854,6 +1856,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 							amountCrUsd = amountCrUsd.add(usd);
 						}
 						if ("USD".equals(item.getCurCode())) {
+							item.setExrate(exrateDUsd);
 							item.setAmountNetLoc(item.getAmountNet().multiply(exrateDUsd));
 							item.setAmountTaxLoc(item.getAmountTax().multiply(exrateDUsd));
 							item.setAmountLoc(item.getAmount().multiply(exrateDUsd));
@@ -1876,6 +1879,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 							amountDrUsd = amountDrUsd.add(usd);
 						}
 						if ("USD".equals(item.getCurCode())) {
+							item.setExrate(exrateCUsd);
 							item.setAmountNetLoc(item.getAmountNet().multiply(exrateCUsd));
 							item.setAmountTaxLoc(item.getAmountTax().multiply(exrateCUsd));
 							item.setAmountLoc(item.getAmount().multiply(exrateCUsd));
@@ -1918,6 +1922,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 							} else if ("SI".equals(item.getBusinessType())) {
 								item.setEta(date1);
 							}
+							item.setBillDate(date1);
 							if (!feeCenterListMH.isEmpty()) {
 								List<FeeCenter> feeCenterListDMH = feeCenterListMH.stream().filter(e -> e.getDc().equals("D")
 									&& item.getId().equals(e.getPid())).collect(Collectors.toList());
@@ -1937,6 +1942,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 											amountCrUsdMH = amountCrUsdMH.add(usd);
 										}
 										if ("USD".equals(itemMH.getCurCode())) {
+											itemMH.setExrate(exrateDUsd);
 											itemMH.setAmountNetLoc(itemMH.getAmountNet().multiply(exrateDUsd));
 											itemMH.setAmountTaxLoc(itemMH.getAmountTax().multiply(exrateDUsd));
 											itemMH.setAmountLoc(itemMH.getAmount().multiply(exrateDUsd));
@@ -1963,6 +1969,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 											amountDrUsdMH = amountDrUsdMH.add(usd);
 										}
 										if ("USD".equals(itemMH.getCurCode())) {
+											itemMH.setExrate(exrateCUsd);
 											itemMH.setAmountNetLoc(itemMH.getAmountNet().multiply(exrateCUsd));
 											itemMH.setAmountTaxLoc(itemMH.getAmountTax().multiply(exrateCUsd));
 											itemMH.setAmountLoc(itemMH.getAmount().multiply(exrateCUsd));

+ 21 - 1
blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/controller/FinPeriodController.java

@@ -16,7 +16,9 @@
  */
 package org.springblade.los.finance.genleg.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -24,17 +26,24 @@ 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.excel.util.ExcelUtil;
 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.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.los.basic.cntr.entity.BCntrTypes;
+import org.springblade.los.excel.BCntrTypesExcel;
 import org.springblade.los.finance.genleg.dto.PeriodVouchersTemplate;
 import org.springblade.los.finance.genleg.entity.FinPeriod;
 import org.springblade.los.finance.genleg.service.IFinPeriodService;
 import org.springblade.los.finance.genleg.vo.FinPeriodVO;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * 业务-财务期间 控制器
@@ -70,7 +79,7 @@ public class FinPeriodController extends BladeController {
 	public R<IPage<FinPeriod>> list(FinPeriod finPeriod, Query query) {
 		IPage<FinPeriod> pages = finPeriodService.page(Condition.getPage(query), Condition.getQueryWrapper(finPeriod));
 		for (FinPeriod item : pages.getRecords()) {
-			item.setPeriodDate(item.getPeriodYear() + "-" + item.getPeriodMonth());
+			item.setPeriodDate(item.getPeriodYear() + "年" + item.getPeriodMonth()+"月");
 		}
 		return R.data(pages);
 	}
@@ -184,4 +193,15 @@ public class FinPeriodController extends BladeController {
 	public R generateVouchers(@Valid @RequestBody PeriodVouchersTemplate periodVouchersTemplate) {
 		return finPeriodService.generateVouchers(periodVouchersTemplate);
 	}
+
+	/**
+	 * 导出
+	 */
+	@GetMapping("/export")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "导出", notes = "finPeriod")
+	public void export(FinPeriod finPeriod, HttpServletResponse response) {
+		finPeriodService.export(finPeriod, response);
+	}
+
 }

+ 4 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/service/IFinPeriodService.java

@@ -24,6 +24,8 @@ import org.springblade.los.finance.genleg.vo.FinPeriodVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * 业务-财务期间 服务类
  *
@@ -60,4 +62,6 @@ public interface IFinPeriodService extends IService<FinPeriod> {
 	FinPeriod detail(FinPeriod finPeriod);
 
 	R generateVouchers(PeriodVouchersTemplate periodVouchersTemplate);
+
+	void export(FinPeriod finPeriod, HttpServletResponse response);
 }

+ 775 - 203
blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/service/impl/FinPeriodServiceImpl.java

@@ -24,16 +24,13 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
+import org.springblade.core.excel.util.ExcelUtil;
 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.IDeptUtils;
 import org.springblade.los.basic.acc.entity.Accounts;
 import org.springblade.los.basic.acc.service.IAccountsService;
-import org.springblade.los.basic.business.entity.BusinessType;
-import org.springblade.los.basic.business.service.IBusinessTypeService;
-import org.springblade.los.basic.cur.service.IBCurrencyService;
-import org.springblade.los.billno.entity.BusinessBillNo;
-import org.springblade.los.billno.service.IBusinessBillNoService;
 import org.springblade.los.business.aea.entity.AeaBills;
 import org.springblade.los.business.aea.service.IAeaBillsService;
 import org.springblade.los.business.amends.entity.Amends;
@@ -44,6 +41,7 @@ import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.service.IBillsService;
 import org.springblade.los.excel.ReviewFailedExcel;
 import org.springblade.los.excel.UnbookkeptExcel;
+import org.springblade.los.finance.genleg.dto.PeriodExchangeRate;
 import org.springblade.los.finance.genleg.dto.PeriodVouchersAccItems;
 import org.springblade.los.finance.genleg.dto.PeriodVouchersTemplate;
 import org.springblade.los.finance.genleg.entity.FinGenleg;
@@ -62,9 +60,10 @@ import org.springblade.los.finance.vouchers.service.IFinVouchersService;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.temporal.TemporalAdjusters;
@@ -104,14 +103,8 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 
 	private final IFinGenlegService finGenlegService;
 
-	private final IBusinessTypeService bBusinessTypeService;
-
-	private final IBusinessBillNoService businessBillNoService;
-
 	private final IAccountsService accountsService;
 
-	private final IBCurrencyService bCurrencyService;
-
 
 	@Override
 	public IPage<FinPeriodVO> selectFinPeriodPage(IPage<FinPeriodVO> page, FinPeriodVO finPeriod) {
@@ -163,7 +156,7 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			}
 			LocalDate date = finPeriod.getBeginDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 			Integer periodYear = date.getYear();
-			Integer periodMonth = date.lengthOfMonth();
+			Integer periodMonth = date.getMonthValue();
 			List<FinGenlegCalc> finGenlegCalcList = finGenlegCalcService.list(new LambdaQueryWrapper<FinGenlegCalc>()
 				.eq(FinGenlegCalc::getTenantId, AuthUtil.getTenantId())
 				.eq(FinGenlegCalc::getBranchId, deptUtils.getDeptPid())
@@ -203,12 +196,26 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 		}
 		List<ReviewFailedExcel> reviewFailedExcelList = new ArrayList<>();
 		List<UnbookkeptExcel> unbookkeptExcelList = new ArrayList<>();
+		String beginDate = "";
+		String endDate = "";
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if (null != detail.getBeginDate()) {
+			beginDate = sdf.format(detail.getBeginDate());
+		} else {
+			throw new RuntimeException("该期间缺少开始时间,操作失败");
+		}
+		if (null != detail.getEndDate()) {
+			endDate = sdf.format(detail.getEndDate());
+		} else {
+			throw new RuntimeException("该期间缺少结束时间,操作失败");
+		}
 		List<Bills> billsList = billsService.list(new LambdaQueryWrapper<Bills>()
 			.eq(Bills::getTenantId, AuthUtil.getTenantId())
 			.eq(Bills::getIsDeleted, 0)
 			.eq(Bills::getBranchId, detail.getBranchId())
-			.apply("((business_type = 'SE' and etd >=" + detail.getBeginDate() + " and etd <= " + detail.getEndDate() + " ) " +
-				"or (business_type = 'SI' and eta >=" + detail.getBeginDate() + " and eta <= " + detail.getEndDate() + "))"));
+			.apply("not find_in_set(bill_status,'1,3')")
+			.apply("((business_type = 'SE' and etd >='" + beginDate + "' and etd <= '" + endDate + "' ) " +
+				"or (business_type = 'SI' and eta >='" + beginDate + "' and eta <= '" + endDate + "'))"));
 		if (!billsList.isEmpty()) {
 			List<Bills> bills = billsList.stream().filter(e -> e.getBillStatus().equals(3)).collect(Collectors.toList());
 			for (Bills item : bills) {
@@ -232,8 +239,9 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
 			.eq(AeaBills::getIsDeleted, 0)
 			.eq(AeaBills::getBranchId, detail.getBranchId())
-			.apply("((business_type = 'AE' and etd >=" + detail.getBeginDate() + " and etd <= " + detail.getEndDate() + " ) " +
-				"or (business_type = 'AI' and eta >=" + detail.getBeginDate() + " and eta <= " + detail.getEndDate() + "))"));
+			.apply("not find_in_set(bill_status,'1,3')")
+			.apply("((business_type = 'AE' and etd >='" + beginDate + "' and etd <= '" + endDate + "' ) " +
+				"or (business_type = 'AI' and eta >='" + beginDate + "' and eta <= '" + endDate + "'))"));
 		if (!aeaBillsList.isEmpty()) {
 			List<AeaBills> aeaBills = aeaBillsList.stream().filter(e -> e.getBillStatus().equals(3)).collect(Collectors.toList());
 			for (AeaBills item : aeaBills) {
@@ -257,10 +265,11 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			.eq(Amends::getTenantId, AuthUtil.getTenantId())
 			.eq(Amends::getIsDeleted, 0)
 			.eq(Amends::getBranchId, detail.getBranchId())
-			.apply("((business_type = 'SEA' and etd >=" + detail.getBeginDate() + " and etd <= " + detail.getEndDate() + " ) " +
-				"or (business_type = 'SIA' and eta >=" + detail.getBeginDate() + " and eta <= " + detail.getEndDate() + "))" +
-				"or (business_type = 'AEA' and etd >=" + detail.getBeginDate() + " and etd <= " + detail.getEndDate() + "))" +
-				"or (business_type = 'AIA' and eta >=" + detail.getBeginDate() + " and eta <= " + detail.getEndDate() + "))"
+			.apply("not find_in_set(bill_status,'3')")
+			.apply("((business_type = 'SEA' and etd >='" + beginDate + "' and etd <= '" + endDate + "' ) " +
+				"or (business_type = 'SIA' and eta >='" + beginDate + "' and eta <= '" + endDate + "')" +
+				"or (business_type = 'AEA' and etd >='" + beginDate + "' and etd <= '" + endDate + "')" +
+				"or (business_type = 'AIA' and eta >='" + beginDate + "' and eta <= '" + endDate + "'))"
 			));
 		if (!amendsList.isEmpty()) {
 			List<Amends> bills = amendsList.stream().filter(e -> e.getBillStatus().equals(3)).collect(Collectors.toList());
@@ -330,6 +339,7 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 		List<CustomsDeclaration> customsDeclarationList = customsDeclarationService.list(new LambdaQueryWrapper<CustomsDeclaration>()
 			.eq(CustomsDeclaration::getTenantId, AuthUtil.getTenantId())
 			.eq(CustomsDeclaration::getIsDeleted, 0)
+			.apply("not find_in_set(bill_status,'3')")
 			.eq(CustomsDeclaration::getBranchId, detail.getBranchId())
 			.gt(CustomsDeclaration::getDeclareDate, detail.getBeginDate())
 			.lt(CustomsDeclaration::getDeclareDate, detail.getEndDate())
@@ -361,9 +371,10 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
 			.eq(FinStlBills::getIsDeleted, 0)
 			.eq(FinStlBills::getBusinessType, "STL")
+			.eq(FinStlBills::getStatus, 3)
 			.eq(FinStlBills::getBranchId, detail.getBranchId())
-			.gt(FinStlBills::getBillDate, detail.getBeginDate())
-			.lt(FinStlBills::getBillDate, detail.getEndDate())
+			.gt(FinStlBills::getBillDate, beginDate)
+			.lt(FinStlBills::getBillDate, endDate)
 		);
 		if (!finStlBillsList.isEmpty()) {
 			List<FinStlBills> bills = finStlBillsList.stream().filter(e -> e.getBillStatus().equals("3")).collect(Collectors.toList());
@@ -375,8 +386,8 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 						.eq(FinVouchers::getIsDeleted, 0)
 						.eq(FinVouchers::getBranchId, detail.getBranchId())
 						.in(FinVouchers::getSrcId, ids)
-						.gt(FinVouchers::getVoucherDate, detail.getBeginDate())
-						.lt(FinVouchers::getVoucherDate, detail.getEndDate()));
+						.gt(FinVouchers::getVoucherDate, beginDate)
+						.lt(FinVouchers::getVoucherDate, endDate));
 					for (FinStlBills item : bills) {
 						FinVouchers finVouchers = finVouchersList.stream().filter(e -> e.getSrcId().equals(item.getId())).findFirst().orElse(null);
 						if (finVouchers == null) {
@@ -389,30 +400,49 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 							reviewFailedExcel.setSalesperson(item.getSalesName());
 							reviewFailedExcelList.add(reviewFailedExcel);
 						} else {
-							UnbookkeptExcel unbookkeptExcel = new UnbookkeptExcel();
-							unbookkeptExcel.setYear(finVouchers.getAccountYear() + "");
-							unbookkeptExcel.setMonth(finVouchers.getAccountMonth() + "");
-							unbookkeptExcel.setVoucherNumber(finVouchers.getVoucherNo());
-							unbookkeptExcel.setVoucherDate(finVouchers.getVoucherDate());
-							unbookkeptExcel.setOperator(finVouchers.getCreateUserName());
-							unbookkeptExcelList.add(unbookkeptExcel);
+							if (3 != finVouchers.getStatus()) {
+								UnbookkeptExcel unbookkeptExcel = new UnbookkeptExcel();
+								unbookkeptExcel.setYear(finVouchers.getAccountYear() + "");
+								unbookkeptExcel.setMonth(finVouchers.getAccountMonth() + "");
+								unbookkeptExcel.setVoucherNumber(finVouchers.getVoucherNo());
+								unbookkeptExcel.setVoucherDate(finVouchers.getVoucherDate());
+								unbookkeptExcel.setOperator(finVouchers.getCreateUserName());
+								unbookkeptExcelList.add(unbookkeptExcel);
+							}
 						}
 					}
 				}
 			}
 		}
+		List<FinVouchers> finVouchersList = finVouchersService.list(new LambdaQueryWrapper<FinVouchers>()
+			.eq(FinVouchers::getTenantId, AuthUtil.getTenantId())
+			.eq(FinVouchers::getIsDeleted, 0)
+			.eq(FinVouchers::getBranchId, detail.getBranchId())
+			.gt(FinVouchers::getVoucherDate, beginDate)
+			.lt(FinVouchers::getVoucherDate, endDate));
+		for (FinVouchers item : finVouchersList) {
+			if (3 != item.getStatus()) {
+				UnbookkeptExcel unbookkeptExcel = new UnbookkeptExcel();
+				unbookkeptExcel.setYear(item.getAccountYear() + "");
+				unbookkeptExcel.setMonth(item.getAccountMonth() + "");
+				unbookkeptExcel.setVoucherNumber(item.getVoucherNo());
+				unbookkeptExcel.setVoucherDate(item.getVoucherDate());
+				unbookkeptExcel.setOperator(item.getCreateUserName());
+				unbookkeptExcelList.add(unbookkeptExcel);
+			}
+		}
 		if (!reviewFailedExcelList.isEmpty()) {
 			return R.data(reviewFailedExcelList, "审核未通过");
 		}
 		if (!unbookkeptExcelList.isEmpty()) {
-			return R.data(reviewFailedExcelList, "凭证未记账");
+			return R.data(unbookkeptExcelList, "凭证未记账");
 		}
 		detail.setUpdateTime(new Date());
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setLockingStatus(1);
-		baseMapper.updateById(finPeriod);
-		return R.data(finPeriod);
+		baseMapper.updateById(detail);
+		return R.data(detail);
 	}
 
 	@Override
@@ -459,13 +489,14 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 				detail.setPeriod(JSON.toJSONString(detail.getPeriodVouchersTemplate()));
 			}
 		}
-		baseMapper.updateById(finPeriod);
+		baseMapper.updateById(detail);
 
 		List<FinVouchers> finVouchersList = finVouchersService.list(new LambdaQueryWrapper<FinVouchers>()
 			.eq(FinVouchers::getTenantId, AuthUtil.getTenantId())
 			.eq(FinVouchers::getIsDeleted, 0)
 			.eq(FinVouchers::getBranchId, detail.getBranchId())
-			.eq(FinVouchers::getVoucherSource, "SYSTEM")
+			.and(e -> e.eq(FinVouchers::getVoucherSource, "FM-PERIOD-PL-TRANSFER")
+				.or().eq(FinVouchers::getVoucherSource, "FM-CURRENCY-PL-TRANSFER"))
 			.eq(FinVouchers::getAccountYear, detail.getPeriodYear())
 			.eq(FinVouchers::getAccountMonth, detail.getPeriodMonth())
 			.gt(FinVouchers::getVoucherDate, detail.getBeginDate())
@@ -499,8 +530,81 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 				finPeriodNew.setPeriod(JSON.toJSONString(finPeriodNew.getPeriodVouchersTemplate()));
 			}
 		}
+		finPeriodNew.setExchange(detail.getExchange());
+		finPeriodNew.setPeriod(detail.getPeriod());
 		this.submit(finPeriodNew);
-		return R.data(finPeriod);
+
+		List<FinGenlegCalc> finGenlegCalcList = finGenlegCalcService.list(new LambdaQueryWrapper<FinGenlegCalc>()
+			.eq(FinGenlegCalc::getTenantId, AuthUtil.getTenantId())
+			.eq(FinGenlegCalc::getAccyear, detail.getPeriodYear())
+			.eq(FinGenlegCalc::getAccmonth, detail.getPeriodMonth()));
+		List<FinGenlegCalc> finGenlegCalcNewList = new ArrayList<>();
+		for (FinGenlegCalc item : finGenlegCalcList) {
+			FinGenlegCalc finGenlegCalc = new FinGenlegCalc();
+			BeanUtil.copyProperties(item, finGenlegCalc);
+			finGenlegCalc.setId(null);
+			finGenlegCalc.setAccmonth(finPeriodNew.getPeriodMonth());
+			finGenlegCalc.setAccyear(finPeriodNew.getPeriodYear());
+			//本期上期余额等于上期余额
+			finGenlegCalc.setAmountLastBlc(item.getAmountBlc());
+			finGenlegCalc.setAmountLastBlcUsd(item.getAmountUsdBlc());
+			//本期借,贷金额清零
+			finGenlegCalc.setAmountDr(new BigDecimal("0.00"));
+			finGenlegCalc.setAmountCr(new BigDecimal("0.00"));
+			finGenlegCalc.setAmountCrUsd(new BigDecimal("0.00"));
+			finGenlegCalc.setAmountCrUsd(new BigDecimal("0.00"));
+			//本期余额 = 上期余额+借-贷
+			finGenlegCalc.setAmountBlc(finGenlegCalc.getAmountLastBlc().add(finGenlegCalc.getAmountDr()).subtract(finGenlegCalc.getAmountCr()));
+			finGenlegCalc.setAmountUsdBlc(finGenlegCalc.getAmountLastBlcUsd().add(finGenlegCalc.getAmountDrUsd()).subtract(finGenlegCalc.getAmountCrUsd()));
+
+			//本期上期数量等于上期余额数量
+			finGenlegCalc.setQuantityLastBlc(item.getQuantityBlc());
+			//本期借,贷数量清零
+			finGenlegCalc.setQuantityDr(new BigDecimal("0.00"));
+			finGenlegCalc.setQuantityCr(new BigDecimal("0.00"));
+			//本期余额数量 = 上期余额数量+借-贷
+			finGenlegCalc.setQuantityBlc(finGenlegCalc.getQuantityLastBlc().add(finGenlegCalc.getQuantityDr()).subtract(finGenlegCalc.getQuantityCr()));
+			finGenlegCalcNewList.add(finGenlegCalc);
+		}
+		if (!finGenlegCalcNewList.isEmpty()) {
+			finGenlegCalcService.saveOrUpdateBatch(finGenlegCalcNewList);
+		}
+		List<FinGenleg> finGenlegList = finGenlegService.list(new LambdaQueryWrapper<FinGenleg>()
+			.eq(FinGenleg::getTenantId, AuthUtil.getTenantId())
+			.eq(FinGenleg::getAccyear, detail.getPeriodYear())
+			.eq(FinGenleg::getAccmonth, detail.getPeriodMonth()));
+		List<FinGenleg> finGenlegNewList = new ArrayList<>();
+		for (FinGenleg item : finGenlegList) {
+			FinGenleg finGenleg = new FinGenleg();
+			BeanUtil.copyProperties(item, finGenleg);
+			finGenleg.setId(null);
+			finGenleg.setAccmonth(finPeriodNew.getPeriodMonth());
+			finGenleg.setAccyear(finPeriodNew.getPeriodYear());
+			//本期上期余额等于上期余额
+			finGenleg.setAmountLastBlc(item.getAmountBlc());
+			finGenleg.setAmountLastBlcUsd(item.getAmountUsdBlc());
+			//本期借,贷金额清零
+			finGenleg.setAmountDr(new BigDecimal("0.00"));
+			finGenleg.setAmountCr(new BigDecimal("0.00"));
+			finGenleg.setAmountCrUsd(new BigDecimal("0.00"));
+			finGenleg.setAmountCrUsd(new BigDecimal("0.00"));
+			//本期余额 = 上期余额+借-贷
+			finGenleg.setAmountBlc(finGenleg.getAmountLastBlc().add(finGenleg.getAmountDr()).subtract(finGenleg.getAmountCr()));
+			finGenleg.setAmountUsdBlc(finGenleg.getAmountLastBlcUsd().add(finGenleg.getAmountDrUsd()).subtract(finGenleg.getAmountCrUsd()));
+
+			//本期上期数量等于上期余额数量
+			finGenleg.setQuantityLastBlc(item.getQuantityBlc());
+			//本期借,贷数量清零
+			finGenleg.setQuantityDr(new BigDecimal("0.00"));
+			finGenleg.setQuantityCr(new BigDecimal("0.00"));
+			//本期余额数量 = 上期余额数量+借-贷
+			finGenleg.setQuantityBlc(finGenleg.getQuantityLastBlc().add(finGenleg.getQuantityDr()).subtract(finGenleg.getQuantityCr()));
+			finGenlegNewList.add(finGenleg);
+		}
+		if (!finGenlegNewList.isEmpty()) {
+			finGenlegService.saveOrUpdateBatch(finGenlegNewList);
+		}
+		return R.data(detail);
 	}
 
 	@Override
@@ -519,25 +623,27 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setIsClosed(0);
 		detail.setCloseDate(null);
-		baseMapper.updateById(finPeriod);
-		LocalDate date = detail.getBeginDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-		// 获取下个月的第一天
-		LocalDate firstDayOfNextMonth = date.with(TemporalAdjusters.firstDayOfNextMonth());
-		// 获取下个月的最后一天
-		LocalDate lastDayOfNextMonth;
-		if (firstDayOfNextMonth.getMonthValue() == 12) {
-			lastDayOfNextMonth = firstDayOfNextMonth.withDayOfMonth(31);
-		} else {
-			lastDayOfNextMonth = firstDayOfNextMonth.with(TemporalAdjusters.lastDayOfMonth());
+		baseMapper.updateById(detail);
+		Integer periodYear = detail.getPeriodYear();
+		Integer periodMonth = detail.getPeriodMonth();
+		if (periodMonth == 12) {
+			periodMonth = 1;
+			periodYear += 1;
 		}
 		FinPeriod finPeriodNew = baseMapper.selectOne(new LambdaQueryWrapper<FinPeriod>()
 			.eq(FinPeriod::getTenantId, AuthUtil.getTenantId())
 			.eq(FinPeriod::getIsDeleted, 0)
 			.eq(FinPeriod::getBranchId, detail.getBranchId())
-			.eq(FinPeriod::getIsClosed, 1)
-			.eq(FinPeriod::getBeginDate, firstDayOfNextMonth)
-			.eq(FinPeriod::getEndDate, lastDayOfNextMonth));
+			.eq(FinPeriod::getIsClosed, 0)
+			.eq(FinPeriod::getPeriodYear, periodYear)
+			.eq(FinPeriod::getPeriodMonth, periodMonth + 1));
 		if (finPeriodNew != null) {
+			if (1 == finPeriodNew.getIsClosed()) {
+				throw new RuntimeException(periodYear + "年" + (periodMonth + 1) + "月期间已结转,操作失败");
+			}
+			if (1 == finPeriodNew.getLockingStatus()) {
+				throw new RuntimeException(periodYear + "年" + (periodMonth + 1) + "月期间已锁定,操作失败");
+			}
 			baseMapper.deleteById(finPeriodNew.getId());
 		} else {
 			List<FinPeriod> finPeriodList = baseMapper.selectList(new LambdaQueryWrapper<FinPeriod>()
@@ -548,7 +654,23 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 				throw new RuntimeException("未查到下期数据,操作失败!");
 			}
 		}
-		return R.data(finPeriod);
+		List<FinGenlegCalc> finGenlegCalcList = finGenlegCalcService.list(new LambdaQueryWrapper<FinGenlegCalc>()
+			.eq(FinGenlegCalc::getTenantId, AuthUtil.getTenantId())
+			.eq(FinGenlegCalc::getAccyear, detail.getPeriodYear())
+			.eq(FinGenlegCalc::getAccmonth, detail.getPeriodMonth()));
+		if (!finGenlegCalcList.isEmpty()) {
+			List<Long> ids = finGenlegCalcList.stream().map(FinGenlegCalc::getId).collect(Collectors.toList());
+			finGenlegCalcService.removeByIds(ids);
+		}
+		List<FinGenleg> finGenlegList = finGenlegService.list(new LambdaQueryWrapper<FinGenleg>()
+			.eq(FinGenleg::getTenantId, AuthUtil.getTenantId())
+			.eq(FinGenleg::getAccyear, detail.getPeriodYear())
+			.eq(FinGenleg::getAccmonth, detail.getPeriodMonth()));
+		if (!finGenlegList.isEmpty()) {
+			List<Long> ids = finGenlegList.stream().map(FinGenleg::getId).collect(Collectors.toList());
+			finGenlegService.removeByIds(ids);
+		}
+		return R.data(detail);
 	}
 
 	@Override
@@ -566,21 +688,18 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 				deptName = String.join(",", res.getData());
 			}
 		}
-		if (baseMapper.selectCount(new LambdaQueryWrapper<FinPeriod>()
-			.eq(FinPeriod::getTenantId, AuthUtil.getTenantId())
-			.eq(FinPeriod::getIsDeleted, 0)
-			.eq(FinPeriod::getBranchId, branchId)) > 0) {
-			throw new RuntimeException("本年度已有账期,请勿重复生成");
-		}
 		if (finPeriod.getId() == null) {
 			if (ObjectUtils.isNotNull(finPeriod.getBeginDate())) {
 				LocalDate date = finPeriod.getBeginDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 				finPeriod.setPeriodYear(date.getYear());
-				finPeriod.setPeriodMonth(date.lengthOfMonth());
+				finPeriod.setPeriodMonth(date.getMonthValue());
+				// 获取当前月的最后一天
+				LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
+				finPeriod.setEndDate(Date.from(lastDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
 			} else {
 				LocalDate date = LocalDate.now();
 				finPeriod.setPeriodYear(date.getYear());
-				finPeriod.setPeriodMonth(date.lengthOfMonth());
+				finPeriod.setPeriodMonth(date.getMonthValue());
 				// 获取当前月的第一天
 				LocalDate firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
 				// 获取当前月的最后一天
@@ -612,6 +731,20 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 				finPeriod.setPeriod(JSON.toJSONString(finPeriod.getPeriodVouchersTemplate()));
 			}
 		}
+		PeriodVouchersTemplate exchange = JSONObject.parseObject(finPeriod.getExchange(), PeriodVouchersTemplate.class);
+		if (exchange != null) {
+			exchange.setId(finPeriod.getId() + "");
+			exchange.setDate(finPeriod.getPeriodYear() + "-" + finPeriod.getPeriodMonth());
+			exchange.setStatus(finPeriod.getIsClosed());
+			finPeriod.setExchange(JSON.toJSONString(exchange));
+		}
+		PeriodVouchersTemplate period = JSONObject.parseObject(finPeriod.getPeriod(), PeriodVouchersTemplate.class);
+		if (period != null) {
+			period.setId(finPeriod.getId() + "");
+			period.setDate(finPeriod.getPeriodYear() + "-" + finPeriod.getPeriodMonth());
+			period.setStatus(finPeriod.getIsClosed());
+			finPeriod.setPeriod(JSON.toJSONString(period));
+		}
 		this.updateById(finPeriod);
 		return R.data(finPeriod);
 	}
@@ -629,8 +762,8 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 		detail.setUpdateUserName(AuthUtil.getUserName());
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setLockingStatus(0);
-		baseMapper.updateById(finPeriod);
-		return R.data(finPeriod);
+		baseMapper.updateById(detail);
+		return R.data(detail);
 	}
 
 	@Override
@@ -657,13 +790,17 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 		if (ObjectUtils.isNotNull(finPeriod.getBeginDate())) {
 			LocalDate date = finPeriod.getBeginDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 			finPeriod.setPeriodYear(date.getYear());
-			finPeriod.setPeriodMonth(date.lengthOfMonth());
+			finPeriod.setPeriodMonth(date.getMonthValue());
+			// 获取当前月的最后一天
+			LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
+			finPeriod.setEndDate(Date.from(lastDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
 		} else {
 			LocalDate date = LocalDate.now();
 			finPeriod.setPeriodYear(date.getYear());
-			finPeriod.setPeriodMonth(date.lengthOfMonth());
+			finPeriod.setPeriodMonth(date.getMonthValue());
 			// 获取当前月的第一天
 			LocalDate firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
+
 			// 获取当前月的最后一天
 			LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
 			finPeriod.setBeginDate(Date.from(firstDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
@@ -678,6 +815,48 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			finPeriod.setCreateDeptName(deptName);
 		}
 		this.saveOrUpdate(finPeriod);
+
+		PeriodVouchersTemplate exchange = new PeriodVouchersTemplate();
+		exchange.setId(finPeriod.getId() + "");
+		exchange.setStatus(0);
+		exchange.setBsType("FM-CURRENCY-PL-TRANSFER");
+		exchange.setVkno("转");
+		Accounts accountsExchange = accountsService.getOne(new LambdaQueryWrapper<Accounts>()
+			.eq(Accounts::getTenantId, AuthUtil.getTenantId())
+			.eq(Accounts::getCode, "550303")
+		);
+		if (null == accountsExchange) {
+			throw new RuntimeException("未找到到科目代码550303信息");
+		}
+		exchange.setPlAccCnm(accountsExchange.getCnName());
+		exchange.setPlAccFnm(accountsExchange.getCode() + "-" + accountsExchange.getFullName());
+		exchange.setPlAccNo(accountsExchange.getCode());
+		exchange.setPlAccID(accountsExchange.getId() + "");
+		exchange.setDescr(accountsExchange.getCnName() + "结转");
+		exchange.setAccItems(new ArrayList<>());
+		exchange.setDate(finPeriod.getPeriodYear() + "-" + finPeriod.getPeriodMonth());
+		finPeriod.setExchange(JSON.toJSONString(exchange));
+		PeriodVouchersTemplate period = new PeriodVouchersTemplate();
+		period.setId(finPeriod.getId() + "");
+		period.setStatus(0);
+		period.setBsType("FM-PERIOD-PL-TRANSFER");
+		period.setVkno("转");
+		Accounts accountsPeriod = accountsService.getOne(new LambdaQueryWrapper<Accounts>()
+			.eq(Accounts::getTenantId, AuthUtil.getTenantId())
+			.eq(Accounts::getCode, "550304")
+		);
+		if (null == accountsPeriod) {
+			throw new RuntimeException("未找到到科目代码550304信息");
+		}
+		period.setPlAccCnm(accountsPeriod.getCnName());
+		period.setPlAccFnm(accountsPeriod.getCode() + "-" + accountsPeriod.getFullName());
+		period.setPlAccNo(accountsPeriod.getCode());
+		period.setPlAccID(accountsPeriod.getId() + "");
+		period.setDescr(accountsPeriod.getCnName() + "结转");
+		period.setAccItems(new ArrayList<>());
+		period.setDate(finPeriod.getPeriodYear() + "-" + finPeriod.getPeriodMonth());
+		finPeriod.setPeriod(JSON.toJSONString(period));
+		this.updateById(finPeriod);
 		return R.data(finPeriod);
 	}
 
@@ -717,11 +896,11 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 		if (accItems.isEmpty()) {
 			throw new RuntimeException("模版科目明细不能为空");
 		}
+		List<PeriodExchangeRate> exchangeRateList = periodVouchersTemplate.getExchangeRateList();
+		if (exchangeRateList.isEmpty()) {
+			throw new RuntimeException("缺少汇率信息");
+		}
 		FinVouchers finVouchers = new FinVouchers();
-		List<BusinessType> businessTypeList = bBusinessTypeService.list(new LambdaQueryWrapper<BusinessType>()
-			.eq(BusinessType::getIsDeleted, 0)
-			.eq(BusinessType::getTenantId, AuthUtil.getTenantId())
-			.eq(BusinessType::getStatus, 0));
 		//创建凭证主表信息
 		String deptId = "";
 		String deptName = "";
@@ -734,29 +913,7 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 				deptName = String.join(",", res.getData());
 			}
 		}
-		BusinessType businessType = businessTypeList.stream().filter(e -> e.getCode().equals("PZDH")).findFirst().orElse(null);
-		if (businessType == null) {
-			throw new RuntimeException("未找到可用业务类型");
-		}
-		BusinessBillNo businessBillNo = new BusinessBillNo();
-		businessBillNo.setBusinessTypeId(businessType.getId());
-		businessBillNo.setCode("PZDH-Z");
-		R clientBillNo = businessBillNoService.getBillNoLos(businessBillNo);
-		if (!clientBillNo.isSuccess()) {
-			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-			throw new RuntimeException("生成订单编号失败");
-		}
-		finVouchers.setBillNo((String) clientBillNo.getData());
 		finVouchers.setVoucherType("转");
-		BusinessBillNo businessBillNo1 = new BusinessBillNo();
-		businessBillNo1.setBusinessTypeId(businessType.getId());
-		businessBillNo1.setCode("转");
-		R voucherNo = businessBillNoService.getVoucherNoLos(businessBillNo1);
-		if (!clientBillNo.isSuccess()) {
-			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-			throw new RuntimeException("生成凭证号失败");
-		}
-		finVouchers.setVoucherNo((String) voucherNo.getData());
 		finVouchers.setVoucherSource(periodVouchersTemplate.getBsType());
 		finVouchers.setVoucherDate(new Date());
 		LocalDate currentDate = LocalDate.now();
@@ -772,7 +929,6 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			finVouchers.setBranchId(branchId);
 			finVouchers.setCreateDeptName(deptName);
 		}
-		finVouchersService.save(finVouchers);
 		List<FinVouchersItems> finVouchersItemsList = new ArrayList<>();
 		//获取所需科目列表信息
 		String accountsCode = accItems.stream().map(PeriodVouchersAccItems::getAccNo).collect(Collectors.joining(","));
@@ -784,158 +940,574 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			List<FinGenlegCalc> finGenlegCalcList = finGenlegCalcService.list(new LambdaQueryWrapper<FinGenlegCalc>()
 				.eq(FinGenlegCalc::getTenantId, AuthUtil.getTenantId())
 				.eq(FinGenlegCalc::getBranchId, deptUtils.getDeptPid())
+				.eq(FinGenlegCalc::getAccyear, year)
+				.eq(FinGenlegCalc::getAccmonth, month)
 				.in(FinGenlegCalc::getAccId, ids));
-			/*List<FinGenleg> finGenlegList = finGenlegService.list(new LambdaQueryWrapper<FinGenleg>()
+			if (finGenlegCalcList.isEmpty()) {
+				throw new RuntimeException("未查到项目总账信息");
+			}
+			List<FinGenleg> finGenlegList = finGenlegService.list(new LambdaQueryWrapper<FinGenleg>()
 				.eq(FinGenleg::getTenantId, AuthUtil.getTenantId())
 				.eq(FinGenleg::getBranchId, deptUtils.getDeptPid())
-				.in(FinGenleg::getAccId, ids));*/
+				.eq(FinGenleg::getAccyear, year)
+				.eq(FinGenleg::getAccmonth, month)
+				.in(FinGenleg::getAccId, ids));
+			if (finGenlegList.isEmpty()) {
+				throw new RuntimeException("未查到总账信息");
+			}
 			int count = 0;
 			//循环复制凭证明细信息
 			for (Accounts item : accountsList) {
 				count++;
-				FinVouchersItems finVouchersItems = new FinVouchersItems();
-				finVouchersItems.setCreateTime(new Date());
-				finVouchersItems.setCreateUser(AuthUtil.getUserId());
-				finVouchersItems.setCreateUserName(AuthUtil.getUserName());
-				if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
-					finVouchersItems.setCreateDept(deptId);
-					finVouchersItems.setBranchId(branchId);
-					finVouchersItems.setCreateDeptName(deptName);
+				PeriodExchangeRate periodExchangeRate = exchangeRateList.stream()
+					.filter(e -> e.getCurCode().equals(item.getCurCode())).findFirst().orElse(null);
+				if (periodExchangeRate == null) {
+					throw new RuntimeException("未找到汇率信息");
 				}
-				finVouchersItems.setPid(finVouchers.getId());
-				finVouchersItems.setBillNo(finVouchers.getBillNo());
-				finVouchersItems.setVoucherSource(finVouchers.getVoucherSource());
-				finVouchersItems.setVoucherType(finVouchers.getVoucherType());
-				finVouchersItems.setVoucherNo(finVouchers.getVoucherNo());
-				finVouchersItems.setVoucherDate(finVouchers.getVoucherDate());
-				finVouchersItems.setAccountYear(finVouchers.getAccountYear());
-				finVouchersItems.setAccountMonth(finVouchers.getAccountMonth());
-				finVouchersItems.setAccountDay(finVouchers.getAccountDay());
-				finVouchersItems.setAccountId(item.getId());
-				finVouchersItems.setAccountCode(item.getCode());
-				finVouchersItems.setAccountCnName(item.getCnName());
-				finVouchersItems.setAccountEnName(item.getEnName());
-				finVouchersItems.setAccountProperty(item.getProperty());
-				finVouchersItems.setAccountLevel(item.getLevel());
-				finVouchersItems.setDc(item.getDc());
-				finVouchersItems.setCurCode(item.getCurCode());
-
 				if (1 == item.getIsCorp() || 1 == item.getIsDept() || 1 == item.getIsEmpl()) {
-
-				} else {
-
-				}
-
-				/*判断是否人民币,美元
-				 * 人民币 判断模版借贷方向与科目借贷方向是否一致 true D+D=正 D+C=负 C+C=正 C+D=负
-				 * 美元 判断模版借贷方向与科目借贷方向是否一致 true D+D=正 D+C=负 C+C=正 C+D=负
-				 * 借或贷金额为零时跳过本次循环
-				 * */
-				/*if ("CNY".equals(item.getCurCode())) {
-					finVouchersItems.setExrate(new BigDecimal("1"));
-					if ("D".equals(item.getDc())) {
-						if (new BigDecimal("0.00").compareTo(amount[count - 1]) != 0) {
-							finVouchersItems.setAmountDr(amount[count - 1]);
-						} else {
-							continue;
+					List<FinGenlegCalc> finGenlegCalcs = finGenlegCalcList.stream()
+						.filter(e -> e.getAccId().equals(item.getId()) && e.getCurCode().equals(item.getCurCode())).collect(Collectors.toList());
+					if (finGenlegCalcs.isEmpty()) {
+						throw new RuntimeException("未查到科目:" + item.getCnName() + "项目总账信息");
+					}
+					for (FinGenlegCalc calc : finGenlegCalcs) {
+						count++;
+						FinVouchersItems finVouchersItems = new FinVouchersItems();
+						finVouchersItems.setCreateTime(new Date());
+						finVouchersItems.setCreateUser(AuthUtil.getUserId());
+						finVouchersItems.setCreateUserName(AuthUtil.getUserName());
+						if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+							finVouchersItems.setCreateDept(deptId);
+							finVouchersItems.setBranchId(branchId);
+							finVouchersItems.setCreateDeptName(deptName);
 						}
-					} else {
-						if (new BigDecimal("0.00").compareTo(amount[count - 1]) != 0) {
-							finVouchersItems.setAmountCr(amount[count - 1]);
-						} else {
-							continue;
+						finVouchersItems.setBillNo(finVouchers.getBillNo());
+						finVouchersItems.setVoucherSource(finVouchers.getVoucherSource());
+						finVouchersItems.setVoucherType(finVouchers.getVoucherType());
+						finVouchersItems.setVoucherNo(finVouchers.getVoucherNo());
+						finVouchersItems.setVoucherDate(finVouchers.getVoucherDate());
+						finVouchersItems.setAccountYear(finVouchers.getAccountYear());
+						finVouchersItems.setAccountMonth(finVouchers.getAccountMonth());
+						finVouchersItems.setAccountDay(finVouchers.getAccountDay());
+						finVouchersItems.setAccountId(item.getId());
+						finVouchersItems.setAccountCode(item.getCode());
+						finVouchersItems.setAccountCnName(item.getCnName());
+						finVouchersItems.setAccountEnName(item.getEnName());
+						finVouchersItems.setAccountProperty(item.getProperty());
+						finVouchersItems.setAccountLevel(item.getLevel());
+						finVouchersItems.setDc(item.getDc());
+						finVouchersItems.setCurCode(item.getCurCode());
+						finVouchersItems.setLineNo(count);
+						finVouchersItems.setDescr(periodVouchersTemplate.getDescr());
+						//判断是否核算客户 true 向明细中客户字段复制
+						finVouchersItems.setIsCorp(item.getIsCorp());
+						if (1 == finVouchersItems.getIsCorp()) {
+							finVouchersItems.setCorpId(calc.getCorpId());
+							finVouchersItems.setCorpCnName(calc.getCorpCnName());
+							finVouchersItems.setCorpEnName(calc.getCorpEnName());
 						}
-					}
-				} else {
-					finVouchersItems.setExrate(periodVouchersTemplate.getExrate());
-					if ("D".equals(item.getDc())) {
-						if (new BigDecimal("0.00").compareTo(amount[count - 1]) != 0) {
-							finVouchersItems.setAmountDrUsd(amount[count - 1]);
-							finVouchersItems.setAmountDr(finVouchersItems.getAmountDrUsd().multiply(periodVouchersTemplate.getExrate()));
-						} else {
-							continue;
+						finVouchersItems.setIsDept(item.getIsDept());
+						//判断是否核算部门 true 向明细中部门字段复制
+						if (1 == finVouchersItems.getIsDept()) {
+							finVouchersItems.setDeptId(calc.getDeptId());
+							finVouchersItems.setDeptName(calc.getDeptName());
 						}
-					} else {
-						if (new BigDecimal("0.00").compareTo(amount[count - 1]) != 0) {
-							finVouchersItems.setAmountCrUsd(amount[count - 1]);
-							finVouchersItems.setAmountCr(finVouchersItems.getAmountCrUsd().multiply(periodVouchersTemplate.getExrate()));
+						finVouchersItems.setIsEmpl(item.getIsEmpl());
+						//判断是否核算职员 true 向明细中职员字段复制
+						if (1 == finVouchersItems.getIsEmpl()) {
+							finVouchersItems.setEmplId(calc.getEmplId());
+							finVouchersItems.setEmplName(calc.getEmplName());
+						}
+						if ("FM-CURRENCY-PL-TRANSFER".equals(periodVouchersTemplate.getBsType())) {
+							if (!"CNY".equals(item.getCurCode())) {
+								finVouchersItems.setExrate(periodExchangeRate.getExrate());
+								if ("D".equals(item.getDc())) {
+									BigDecimal amountDrUsdNew = periodExchangeRate.getExrate().multiply(calc.getAmountDrUsd());
+									BigDecimal amountDrUsdSubtract = calc.getAmountDr().subtract(amountDrUsdNew);
+									if (new BigDecimal("0.00").compareTo(amountDrUsdSubtract) != 0) {
+										finVouchersItems.setAmountDrUsd(amountDrUsdSubtract);
+										finVouchersItems.setAmountDr(finVouchersItems.getAmountDrUsd().multiply(periodExchangeRate.getExrate()));
+									} else {
+										continue;
+									}
+								} else {
+									BigDecimal amountCrUsdNew = periodExchangeRate.getExrate().multiply(calc.getAmountCrUsd());
+									BigDecimal amountCrUsdSubtract = calc.getAmountCr().subtract(amountCrUsdNew);
+									if (new BigDecimal("0.00").compareTo(amountCrUsdSubtract) != 0) {
+										finVouchersItems.setAmountCrUsd(amountCrUsdSubtract);
+										finVouchersItems.setAmountCr(finVouchersItems.getAmountCrUsd().multiply(periodExchangeRate.getExrate()));
+									} else {
+										continue;
+									}
+								}
+								finVouchersItems.setAmountDrLoc(ObjectUtils.isNull(finVouchersItems.getAmountDr()) ? new BigDecimal("0") : finVouchersItems.getAmountDr()
+									.add((ObjectUtils.isNull(finVouchersItems.getAmountDrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountDrUsd())).multiply(periodExchangeRate.getExrate()));
+								finVouchersItems.setAmountCrLoc(ObjectUtils.isNull(finVouchersItems.getAmountCr()) ? new BigDecimal("0") : finVouchersItems.getAmountCr()
+									.add((ObjectUtils.isNull(finVouchersItems.getAmountCrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountCrUsd())).multiply(periodExchangeRate.getExrate()));
+								finVouchersItemsList.add(finVouchersItems);
+							}
 						} else {
-							continue;
+							if (!"CNY".equals(item.getCurCode())) {
+								finVouchersItems.setExrate(periodExchangeRate.getExrate());
+								if ("D".equals(item.getDc())) {
+									if (new BigDecimal("0.00").compareTo(calc.getAmountDrUsd()) != 0) {
+										finVouchersItems.setAmountCrUsd(calc.getAmountDrUsd());
+										finVouchersItems.setAmountCr(finVouchersItems.getAmountCrUsd().multiply(periodExchangeRate.getExrate()));
+									} else {
+										continue;
+									}
+								} else {
+									if (new BigDecimal("0.00").compareTo(calc.getAmountCrUsd()) != 0) {
+										finVouchersItems.setAmountDrUsd(calc.getAmountCrUsd());
+										finVouchersItems.setAmountDr(finVouchersItems.getAmountDrUsd().multiply(periodExchangeRate.getExrate()));
+									} else {
+										continue;
+									}
+								}
+							} else {
+								finVouchersItems.setExrate(new BigDecimal("1"));
+								if ("D".equals(item.getDc())) {
+									if (new BigDecimal("0.00").compareTo(calc.getAmountDrUsd()) != 0) {
+										finVouchersItems.setAmountCr(calc.getAmountDrUsd());
+									} else {
+										continue;
+									}
+								} else {
+									if (new BigDecimal("0.00").compareTo(calc.getAmountCrUsd()) != 0) {
+										finVouchersItems.setAmountDr(calc.getAmountCrUsd());
+									} else {
+										continue;
+									}
+								}
+							}
+							finVouchersItems.setAmountDrLoc(ObjectUtils.isNull(finVouchersItems.getAmountDr()) ? new BigDecimal("0") : finVouchersItems.getAmountDr()
+								.add((ObjectUtils.isNull(finVouchersItems.getAmountDrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountDrUsd())).multiply(periodExchangeRate.getExrate()));
+							finVouchersItems.setAmountCrLoc(ObjectUtils.isNull(finVouchersItems.getAmountCr()) ? new BigDecimal("0") : finVouchersItems.getAmountCr()
+								.add((ObjectUtils.isNull(finVouchersItems.getAmountCrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountCrUsd())).multiply(periodExchangeRate.getExrate()));
+							finVouchersItemsList.add(finVouchersItems);
 						}
 					}
-				}
-				//计算借,贷人民币与美金合计人民币金额
-				finVouchersItems.setAmountDrLoc(ObjectUtils.isNull(finVouchersItems.getAmountDr()) ? new BigDecimal("0") : finVouchersItems.getAmountDr()
-					.add(bCurrencyService.converterCny("USD", ObjectUtils.isNull(finVouchersItems.getAmountDrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountDrUsd(), "D", "1")));
-				finVouchersItems.setAmountCrLoc(ObjectUtils.isNull(finVouchersItems.getAmountCr()) ? new BigDecimal("0") : finVouchersItems.getAmountCr()
-					.add(bCurrencyService.converterCny("USD", ObjectUtils.isNull(finVouchersItems.getAmountCrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountCrUsd(), "C", "1")));
-				finVouchersItems.setIsCorp(item.getIsCorp());
-				//判断是否核算客户 true 向明细中客户字段复制
-				if (1 == finVouchersItems.getIsCorp()) {
-					if (bCorps != null) {
-						finVouchersItems.setCorpId(bCorps.getId());
-						finVouchersItems.setCorpCnName(bCorps.getCnName());
-						finVouchersItems.setCorpEnName(bCorps.getEnName());
+				} else {
+					FinVouchersItems finVouchersItems = new FinVouchersItems();
+					finVouchersItems.setCreateTime(new Date());
+					finVouchersItems.setCreateUser(AuthUtil.getUserId());
+					finVouchersItems.setCreateUserName(AuthUtil.getUserName());
+					if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+						finVouchersItems.setCreateDept(deptId);
+						finVouchersItems.setBranchId(branchId);
+						finVouchersItems.setCreateDeptName(deptName);
 					}
-				}
-				finVouchersItems.setIsDept(item.getIsDept());
-				//判断是否核算部门 true 向明细中部门字段复制
-				if (1 == finVouchersItems.getIsDept()) {
-					if (dept != null) {
-						finVouchersItems.setDeptId(dept.getId());
-						finVouchersItems.setDeptName(dept.getDeptName());
+					finVouchersItems.setBillNo(finVouchers.getBillNo());
+					finVouchersItems.setVoucherSource(finVouchers.getVoucherSource());
+					finVouchersItems.setVoucherType(finVouchers.getVoucherType());
+					finVouchersItems.setVoucherNo(finVouchers.getVoucherNo());
+					finVouchersItems.setVoucherDate(finVouchers.getVoucherDate());
+					finVouchersItems.setAccountYear(finVouchers.getAccountYear());
+					finVouchersItems.setAccountMonth(finVouchers.getAccountMonth());
+					finVouchersItems.setAccountDay(finVouchers.getAccountDay());
+					finVouchersItems.setAccountId(item.getId());
+					finVouchersItems.setAccountCode(item.getCode());
+					finVouchersItems.setAccountCnName(item.getCnName());
+					finVouchersItems.setAccountEnName(item.getEnName());
+					finVouchersItems.setAccountProperty(item.getProperty());
+					finVouchersItems.setAccountLevel(item.getLevel());
+					finVouchersItems.setDc(item.getDc());
+					finVouchersItems.setCurCode(item.getCurCode());
+					FinGenleg finGenleg = finGenlegList.stream().filter(e -> e.getAccId().equals(item.getId())).findFirst().orElse(null);
+					if (finGenleg == null) {
+						throw new RuntimeException("未查到科目:" + item.getCnName() + "总账信息");
 					}
-				}
-				finVouchersItems.setIsEmpl(item.getIsEmpl());
-				//判断是否核算职员 true 向明细中职员字段复制
-				if (1 == finVouchersItems.getIsEmpl()) {
-					if (user != null) {
-						finVouchersItems.setEmplId(user.getId());
-						finVouchersItems.setEmplName(user.getName());
+					if ("FM-CURRENCY-PL-TRANSFER".equals(periodVouchersTemplate.getBsType())) {
+						if (!"CNY".equals(item.getCurCode())) {
+							finVouchersItems.setExrate(periodExchangeRate.getExrate());
+							if ("D".equals(item.getDc())) {
+								BigDecimal amountDrUsdNew = periodExchangeRate.getExrate().multiply(finGenleg.getAmountDrUsd());
+								BigDecimal amountDrUsdSubtract = finGenleg.getAmountDr().subtract(amountDrUsdNew);
+								if (new BigDecimal("0.00").compareTo(amountDrUsdSubtract) != 0) {
+									finVouchersItems.setAmountDrUsd(amountDrUsdSubtract);
+									finVouchersItems.setAmountDr(finVouchersItems.getAmountDrUsd().multiply(periodExchangeRate.getExrate()));
+								} else {
+									continue;
+								}
+							} else {
+								BigDecimal amountCrUsdNew = periodExchangeRate.getExrate().multiply(finGenleg.getAmountCrUsd());
+								BigDecimal amountCrUsdSubtract = finGenleg.getAmountCr().subtract(amountCrUsdNew);
+								if (new BigDecimal("0.00").compareTo(amountCrUsdSubtract) != 0) {
+									finVouchersItems.setAmountCrUsd(amountCrUsdSubtract);
+									finVouchersItems.setAmountCr(finVouchersItems.getAmountCrUsd().multiply(periodExchangeRate.getExrate()));
+								} else {
+									continue;
+								}
+							}
+							finVouchersItems.setAmountDrLoc(ObjectUtils.isNull(finVouchersItems.getAmountDr()) ? new BigDecimal("0") : finVouchersItems.getAmountDr()
+								.add((ObjectUtils.isNull(finVouchersItems.getAmountDrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountDrUsd())).multiply(periodExchangeRate.getExrate()));
+							finVouchersItems.setAmountCrLoc(ObjectUtils.isNull(finVouchersItems.getAmountCr()) ? new BigDecimal("0") : finVouchersItems.getAmountCr()
+								.add((ObjectUtils.isNull(finVouchersItems.getAmountCrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountCrUsd())).multiply(periodExchangeRate.getExrate()));
+							finVouchersItemsList.add(finVouchersItems);
+						}
 					} else {
-						if (userSrc != null) {
-							finVouchersItems.setEmplId(userSrc.getId());
-							finVouchersItems.setEmplName(userSrc.getCnName());
+						if (!"CNY".equals(item.getCurCode())) {
+							finVouchersItems.setExrate(periodExchangeRate.getExrate());
+							if ("D".equals(item.getDc())) {
+								if (new BigDecimal("0.00").compareTo(finGenleg.getAmountDrUsd()) != 0) {
+									finVouchersItems.setAmountCrUsd(finGenleg.getAmountDrUsd());
+									finVouchersItems.setAmountCr(finVouchersItems.getAmountCrUsd().multiply(periodExchangeRate.getExrate()));
+								} else {
+									continue;
+								}
+							} else {
+								if (new BigDecimal("0.00").compareTo(finGenleg.getAmountCrUsd()) != 0) {
+									finVouchersItems.setAmountDrUsd(finGenleg.getAmountCrUsd());
+									finVouchersItems.setAmountDr(finVouchersItems.getAmountDrUsd().multiply(periodExchangeRate.getExrate()));
+								} else {
+									continue;
+								}
+							}
+						} else {
+							finVouchersItems.setExrate(new BigDecimal("1"));
+							if ("D".equals(item.getDc())) {
+								if (new BigDecimal("0.00").compareTo(finGenleg.getAmountDrUsd()) != 0) {
+									finVouchersItems.setAmountCr(finGenleg.getAmountDrUsd());
+								} else {
+									continue;
+								}
+							} else {
+								if (new BigDecimal("0.00").compareTo(finGenleg.getAmountCrUsd()) != 0) {
+									finVouchersItems.setAmountDr(finGenleg.getAmountCrUsd());
+								} else {
+									continue;
+								}
+							}
 						}
+						finVouchersItems.setAmountDrLoc(ObjectUtils.isNull(finVouchersItems.getAmountDr()) ? new BigDecimal("0") : finVouchersItems.getAmountDr()
+							.add((ObjectUtils.isNull(finVouchersItems.getAmountDrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountDrUsd())).multiply(periodExchangeRate.getExrate()));
+						finVouchersItems.setAmountCrLoc(ObjectUtils.isNull(finVouchersItems.getAmountCr()) ? new BigDecimal("0") : finVouchersItems.getAmountCr()
+							.add((ObjectUtils.isNull(finVouchersItems.getAmountCrUsd()) ? new BigDecimal("0") : finVouchersItems.getAmountCrUsd())).multiply(periodExchangeRate.getExrate()));
+						finVouchersItemsList.add(finVouchersItems);
 					}
-				}*/
-				finVouchersItems.setLineNo(count);
-				finVouchersItems.setDescr(periodVouchersTemplate.getDescr());
-				finVouchersItemsList.add(finVouchersItems);
+				}
 			}
 		} else {
 			throw new RuntimeException("未找到对应科目信息");
 		}
-
-//		finVouchersItemsService.saveOrUpdateBatch(finVouchersItemsList);
 		BigDecimal amountDrCNY = new BigDecimal("0.00");
 		BigDecimal amountCrCNY = new BigDecimal("0.00");
 		BigDecimal amountDrUSD = new BigDecimal("0.00");
 		BigDecimal amountCrUSD = new BigDecimal("0.00");
+		BigDecimal amountDrLoc = new BigDecimal("0.00");
+		BigDecimal amountCrLoc = new BigDecimal("0.00");
 		amountDrCNY = amountDrCNY.add(finVouchersItemsList.stream()
 			.filter(e -> "CNY".equals(e.getCurCode()) && "D".equals(e.getDc())).map(FinVouchersItems::getAmountDr)
 			.filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
-		finVouchers.setAmountDr(amountDrCNY);
 		amountCrCNY = amountCrCNY.add(finVouchersItemsList.stream()
 			.filter(e -> "CNY".equals(e.getCurCode()) && "C".equals(e.getDc())).map(FinVouchersItems::getAmountCr)
 			.filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
-		finVouchers.setAmountCr(amountCrCNY);
 		amountDrUSD = amountDrUSD.add(finVouchersItemsList.stream()
-			.filter(e -> "USD".equals(e.getCurCode()) && "D".equals(e.getDc())).map(FinVouchersItems::getAmountDrUsd)
+			.filter(e -> !"CNY".equals(e.getCurCode()) && "D".equals(e.getDc())).map(FinVouchersItems::getAmountDrUsd)
 			.filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
-		finVouchers.setAmountDrUsd(amountDrUSD);
 		amountCrUSD = amountCrUSD.add(finVouchersItemsList.stream()
-			.filter(e -> "USD".equals(e.getCurCode()) && "C".equals(e.getDc())).map(FinVouchersItems::getAmountCrUsd)
+			.filter(e -> !"CNY".equals(e.getCurCode()) && "C".equals(e.getDc())).map(FinVouchersItems::getAmountCrUsd)
 			.filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
-		finVouchers.setAmountCrUsd(amountCrUSD);
-		finVouchers.setAmountDrLoc(amountDrCNY.add(bCurrencyService.converterCny("USD", amountDrUSD, "D", "1")));
-		finVouchers.setAmountCrLoc(amountCrCNY.add(bCurrencyService.converterCny("USD", amountCrUSD, "C", "1")));
-		finVouchers.setDescr(finVouchersItemsList.get(0).getDescr());
-		if (finVouchersItemsList.stream().anyMatch(e -> "USD".equals(e.getCurCode()))) {
+		amountDrLoc = amountDrLoc.add(finVouchersItemsList.stream()
+			.filter(e -> "D".equals(e.getDc())).map(FinVouchersItems::getAmountDrLoc)
+			.filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		amountCrLoc = amountCrLoc.add(finVouchersItemsList.stream()
+			.filter(e -> "C".equals(e.getDc())).map(FinVouchersItems::getAmountCrLoc)
+			.filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		finVouchers.setDescr(periodVouchersTemplate.getDescr());
+		if (finVouchersItemsList.stream().anyMatch(e -> !"CNY".equals(e.getCurCode()))) {
 			finVouchers.setIsForeign(1);
 		}
-		finVouchersService.updateById(finVouchers);
-		return null;
+		FinVouchersItems finVouchersItems = new FinVouchersItems();
+		finVouchersItems.setCreateTime(new Date());
+		finVouchersItems.setCreateUser(AuthUtil.getUserId());
+		finVouchersItems.setCreateUserName(AuthUtil.getUserName());
+		if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+			finVouchersItems.setCreateDept(deptId);
+			finVouchersItems.setBranchId(branchId);
+			finVouchersItems.setCreateDeptName(deptName);
+		}
+		finVouchersItems.setBillNo(finVouchers.getBillNo());
+		finVouchersItems.setVoucherSource(finVouchers.getVoucherSource());
+		finVouchersItems.setVoucherType(finVouchers.getVoucherType());
+		finVouchersItems.setVoucherNo(finVouchers.getVoucherNo());
+		finVouchersItems.setVoucherDate(finVouchers.getVoucherDate());
+		finVouchersItems.setAccountYear(finVouchers.getAccountYear());
+		finVouchersItems.setAccountMonth(finVouchers.getAccountMonth());
+		finVouchersItems.setAccountDay(finVouchers.getAccountDay());
+		Accounts accounts = accountsService.getById(periodVouchersTemplate.getPlAccID());
+		if (accounts == null) {
+			throw new RuntimeException("科目:" + periodVouchersTemplate.getPlAccCnm() + "不存在");
+		}
+		finVouchersItems.setAccountId(accounts.getId());
+		finVouchersItems.setAccountCode(accounts.getCode());
+		finVouchersItems.setAccountCnName(accounts.getCnName());
+		finVouchersItems.setAccountEnName(accounts.getEnName());
+		finVouchersItems.setAccountProperty(accounts.getProperty());
+		finVouchersItems.setAccountLevel(accounts.getLevel());
+		finVouchersItems.setDc(accounts.getDc());
+		finVouchersItems.setCurCode(accounts.getCurCode());
+		if (!"CNY".equals(accounts.getCurCode())) {
+			throw new RuntimeException("科目:" + periodVouchersTemplate.getPlAccCnm() + "币别不是CNY");
+		}
+		if ("FM-CURRENCY-PL-TRANSFER".equals(periodVouchersTemplate.getBsType())) {
+			BigDecimal subtract = amountDrLoc.subtract(amountCrLoc);
+			if ("D".equals(accounts.getDc())) {
+				finVouchersItems.setAmountDr(subtract);
+				finVouchersItems.setAmountDrLoc(subtract);
+			} else {
+				finVouchersItems.setAmountCr(subtract);
+				finVouchersItems.setAmountCrLoc(subtract);
+			}
+		} else {
+			BigDecimal subtract = amountDrLoc.subtract(amountCrLoc);
+			if ("D".equals(accounts.getDc())) {
+				finVouchersItems.setAmountCr(subtract);
+				finVouchersItems.setAmountCrLoc(subtract);
+			} else {
+				finVouchersItems.setAmountDr(subtract);
+				finVouchersItems.setAmountDrLoc(subtract);
+			}
+		}
+		finVouchersItemsList.add(finVouchersItems);
+		finVouchers.setAmountDr(amountDrCNY.add(finVouchersItems.getAmountDr()));
+		finVouchers.setAmountCr(amountCrCNY.add(finVouchersItems.getAmountCr()));
+		finVouchers.setAmountDrUsd(amountDrUSD.add(finVouchersItems.getAmountDrUsd()));
+		finVouchers.setAmountCrUsd(amountCrUSD.add(finVouchersItems.getAmountCrUsd()));
+		finVouchers.setAmountDrLoc(amountDrLoc.add(finVouchersItems.getAmountDrLoc()));
+		finVouchers.setAmountCrLoc(amountCrLoc.add(finVouchersItems.getAmountCrLoc()));
+		finVouchers.setFinVouchersItemsList(finVouchersItemsList);
+		return R.data(finVouchers);
+	}
+
+	@Override
+	public void export(FinPeriod finPeriod, HttpServletResponse response) {
+		if (finPeriod.getId() == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		FinPeriod detail = baseMapper.selectById(finPeriod.getId());
+		if (1 == detail.getLockingStatus()) {
+			throw new RuntimeException("该期间已锁定,请勿重复锁定!");
+		}
+		List<ReviewFailedExcel> reviewFailedExcelList = new ArrayList<>();
+		List<UnbookkeptExcel> unbookkeptExcelList = new ArrayList<>();
+		String beginDate = "";
+		String endDate = "";
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if (null != detail.getBeginDate()) {
+			beginDate = sdf.format(detail.getBeginDate());
+		} else {
+			throw new RuntimeException("该期间缺少开始时间,操作失败");
+		}
+		if (null != detail.getEndDate()) {
+			endDate = sdf.format(detail.getEndDate());
+		} else {
+			throw new RuntimeException("该期间缺少结束时间,操作失败");
+		}
+		List<Bills> billsList = billsService.list(new LambdaQueryWrapper<Bills>()
+			.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.eq(Bills::getIsDeleted, 0)
+			.eq(Bills::getBranchId, detail.getBranchId())
+			.apply("((business_type = 'SE' and etd >='" + beginDate + "' and etd <= '" + endDate + "' ) " +
+				"or (business_type = 'SI' and eta >='" + beginDate + "' and eta <= '" + endDate + "'))"));
+		if (!billsList.isEmpty()) {
+			List<Bills> bills = billsList.stream().filter(e -> e.getBillStatus().equals(3)).collect(Collectors.toList());
+			for (Bills item : bills) {
+				ReviewFailedExcel reviewFailedExcel = new ReviewFailedExcel();
+				if ("SE".equals(item.getBusinessType())) {
+					reviewFailedExcel.setBusinessType("海运出口");
+				} else {
+					reviewFailedExcel.setBusinessType("海运进口");
+				}
+				reviewFailedExcel.setBillNo(item.getBillNo());
+				reviewFailedExcel.setBusinessDate(item.getBillDate());
+				reviewFailedExcel.setMblno(item.getMblno());
+				reviewFailedExcel.setOperator(item.getOperatorName());
+				if ("SALES".equals(item.getSrcType())) {
+					reviewFailedExcel.setSalesperson(item.getSrcCnName());
+				}
+				reviewFailedExcelList.add(reviewFailedExcel);
+			}
+		}
+		List<AeaBills> aeaBillsList = aeaBillsService.list(new LambdaQueryWrapper<AeaBills>()
+			.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
+			.eq(AeaBills::getIsDeleted, 0)
+			.eq(AeaBills::getBranchId, detail.getBranchId())
+			.apply("((business_type = 'AE' and etd >='" + beginDate + "' and etd <= '" + endDate + "' ) " +
+				"or (business_type = 'AI' and eta >='" + beginDate + "' and eta <= '" + endDate + "'))"));
+		if (!aeaBillsList.isEmpty()) {
+			List<AeaBills> aeaBills = aeaBillsList.stream().filter(e -> e.getBillStatus().equals(3)).collect(Collectors.toList());
+			for (AeaBills item : aeaBills) {
+				ReviewFailedExcel reviewFailedExcel = new ReviewFailedExcel();
+				if ("AE".equals(item.getBusinessType())) {
+					reviewFailedExcel.setBusinessType("空运出口");
+				} else {
+					reviewFailedExcel.setBusinessType("空运进口");
+				}
+				reviewFailedExcel.setBillNo(item.getBillNo());
+				reviewFailedExcel.setBusinessDate(item.getBillDate());
+				reviewFailedExcel.setMblno(item.getMblno());
+				reviewFailedExcel.setOperator(item.getOperatorName());
+				if ("SALES".equals(item.getSrcType())) {
+					reviewFailedExcel.setSalesperson(item.getSrcCnName());
+				}
+				reviewFailedExcelList.add(reviewFailedExcel);
+			}
+		}
+		List<Amends> amendsList = amendsService.list(new LambdaQueryWrapper<Amends>()
+			.eq(Amends::getTenantId, AuthUtil.getTenantId())
+			.eq(Amends::getIsDeleted, 0)
+			.eq(Amends::getBranchId, detail.getBranchId())
+			.apply("((business_type = 'SEA' and etd >='" + beginDate + "' and etd <= '" + endDate + "' ) " +
+				"or (business_type = 'SIA' and eta >='" + beginDate + "' and eta <= '" + endDate + "')" +
+				"or (business_type = 'AEA' and etd >='" + beginDate + "' and etd <= '" + endDate + "')" +
+				"or (business_type = 'AIA' and eta >='" + beginDate + "' and eta <= '" + endDate + "'))"
+			));
+		if (!amendsList.isEmpty()) {
+			List<Amends> bills = amendsList.stream().filter(e -> e.getBillStatus().equals(3)).collect(Collectors.toList());
+			List<Bills> billsList1 = new ArrayList<>();
+			List<AeaBills> aeaBillsList1 = new ArrayList<>();
+			if (!bills.isEmpty()) {
+				List<Long> billsId = bills.stream().map(Amends::getOrigId).collect(Collectors.toList());
+				if (!billsId.isEmpty()) {
+					billsList1 = billsService.list(new LambdaQueryWrapper<Bills>()
+						.eq(Bills::getTenantId, AuthUtil.getTenantId())
+						.eq(Bills::getIsDeleted, 0)
+						.eq(Bills::getBranchId, detail.getBranchId())
+						.in(Bills::getId, billsId)
+					);
+				}
+				List<Long> aeaBillsId = bills.stream().map(Amends::getOrigId).collect(Collectors.toList());
+				if (!aeaBillsId.isEmpty()) {
+					aeaBillsList1 = aeaBillsService.list(new LambdaQueryWrapper<AeaBills>()
+						.eq(AeaBills::getTenantId, AuthUtil.getTenantId())
+						.eq(AeaBills::getIsDeleted, 0)
+						.eq(AeaBills::getBranchId, detail.getBranchId())
+						.in(AeaBills::getId, aeaBillsId));
+				}
+			}
+			for (Amends item : bills) {
+				ReviewFailedExcel reviewFailedExcel = new ReviewFailedExcel();
+				if ("AEA".equals(item.getBusinessType())) {
+					if (!aeaBillsList1.isEmpty()) {
+						AeaBills aeaBills = aeaBillsList1.stream().filter(e -> e.getId().equals(item.getOrigId())).findFirst().orElse(null);
+						if (aeaBills != null && "SALES".equals(aeaBills.getSrcType())) {
+							reviewFailedExcel.setSalesperson(aeaBills.getSrcCnName());
+						}
+					}
+					reviewFailedExcel.setBusinessType("空运出口Amends");
+				} else if ("AIA".equals(item.getBusinessType())) {
+					if (!aeaBillsList1.isEmpty()) {
+						AeaBills aeaBills = aeaBillsList1.stream().filter(e -> e.getId().equals(item.getOrigId())).findFirst().orElse(null);
+						if (aeaBills != null && "SALES".equals(aeaBills.getSrcType())) {
+							reviewFailedExcel.setSalesperson(aeaBills.getSrcCnName());
+						}
+					}
+					reviewFailedExcel.setBusinessType("空运进口Amends");
+				} else if ("SIA".equals(item.getBusinessType())) {
+					if (!billsList1.isEmpty()) {
+						Bills aeaBills = billsList1.stream().filter(e -> e.getId().equals(item.getOrigId())).findFirst().orElse(null);
+						if (aeaBills != null && "SALES".equals(aeaBills.getSrcType())) {
+							reviewFailedExcel.setSalesperson(aeaBills.getSrcCnName());
+						}
+					}
+					reviewFailedExcel.setBusinessType("海运进口Amends");
+				} else if ("SEA".equals(item.getBusinessType())) {
+					if (!billsList1.isEmpty()) {
+						Bills aeaBills = billsList1.stream().filter(e -> e.getId().equals(item.getOrigId())).findFirst().orElse(null);
+						if (aeaBills != null && "SALES".equals(aeaBills.getSrcType())) {
+							reviewFailedExcel.setSalesperson(aeaBills.getSrcCnName());
+						}
+					}
+					reviewFailedExcel.setBusinessType("海运出口Amends");
+				}
+				reviewFailedExcel.setBillNo(item.getBillNo());
+				reviewFailedExcel.setBusinessDate(item.getBillDate());
+				reviewFailedExcel.setMblno(item.getMblno());
+				reviewFailedExcel.setOperator(item.getOperatorName());
+				reviewFailedExcelList.add(reviewFailedExcel);
+			}
+		}
+		List<CustomsDeclaration> customsDeclarationList = customsDeclarationService.list(new LambdaQueryWrapper<CustomsDeclaration>()
+			.eq(CustomsDeclaration::getTenantId, AuthUtil.getTenantId())
+			.eq(CustomsDeclaration::getIsDeleted, 0)
+			.eq(CustomsDeclaration::getBranchId, detail.getBranchId())
+			.gt(CustomsDeclaration::getDeclareDate, detail.getBeginDate())
+			.lt(CustomsDeclaration::getDeclareDate, detail.getEndDate())
+		);
+		if (!customsDeclarationList.isEmpty()) {
+			List<CustomsDeclaration> bills = customsDeclarationList.stream().filter(e -> e.getBillStatus().equals(3)).collect(Collectors.toList());
+			for (CustomsDeclaration item : bills) {
+				ReviewFailedExcel reviewFailedExcel = new ReviewFailedExcel();
+				if ("BGSE".equals(item.getBusinessType())) {
+					reviewFailedExcel.setBusinessType("海运报关");
+				} else if ("BGSI".equals(item.getBusinessType())) {
+					reviewFailedExcel.setBusinessType("海运报关");
+				} else if ("BGAE".equals(item.getBusinessType())) {
+					reviewFailedExcel.setBusinessType("空运报关");
+				} else if ("BGAI".equals(item.getBusinessType())) {
+					reviewFailedExcel.setBusinessType("空运报关");
+				}
+				reviewFailedExcel.setBillNo(item.getBillNo());
+				reviewFailedExcel.setBusinessDate(item.getBillDate());
+				reviewFailedExcel.setMblno(item.getMblno());
+				reviewFailedExcel.setOperator(item.getCreateUserName());
+				if ("SALES".equals(item.getSrcType())) {
+					reviewFailedExcel.setSalesperson(item.getSrcCnName());
+				}
+				reviewFailedExcelList.add(reviewFailedExcel);
+			}
+		}
+		List<FinStlBills> finStlBillsList = finStlBillsService.list(new LambdaQueryWrapper<FinStlBills>()
+			.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
+			.eq(FinStlBills::getIsDeleted, 0)
+			.eq(FinStlBills::getBusinessType, "STL")
+			.eq(FinStlBills::getBranchId, detail.getBranchId())
+			.gt(FinStlBills::getBillDate, beginDate)
+			.lt(FinStlBills::getBillDate, endDate)
+		);
+		if (!finStlBillsList.isEmpty()) {
+			List<FinStlBills> bills = finStlBillsList.stream().filter(e -> e.getBillStatus().equals("3")).collect(Collectors.toList());
+			if (!bills.isEmpty()) {
+				List<Long> ids = bills.stream().map(FinStlBills::getId).collect(Collectors.toList());
+				if (!ids.isEmpty()) {
+					List<FinVouchers> finVouchersList = finVouchersService.list(new LambdaQueryWrapper<FinVouchers>()
+						.eq(FinVouchers::getTenantId, AuthUtil.getTenantId())
+						.eq(FinVouchers::getIsDeleted, 0)
+						.eq(FinVouchers::getBranchId, detail.getBranchId())
+						.in(FinVouchers::getSrcId, ids)
+						.gt(FinVouchers::getVoucherDate, beginDate)
+						.lt(FinVouchers::getVoucherDate, endDate));
+					for (FinStlBills item : bills) {
+						FinVouchers finVouchers = finVouchersList.stream().filter(e -> e.getSrcId().equals(item.getId())).findFirst().orElse(null);
+						if (finVouchers == null) {
+							ReviewFailedExcel reviewFailedExcel = new ReviewFailedExcel();
+							reviewFailedExcel.setBusinessType("结算中心");
+							reviewFailedExcel.setBillNo(item.getBillNo());
+							reviewFailedExcel.setBusinessDate(item.getBillDate());
+							reviewFailedExcel.setMblno(item.getMblno());
+							reviewFailedExcel.setOperator(item.getCreateUserName());
+							reviewFailedExcel.setSalesperson(item.getSalesName());
+							reviewFailedExcelList.add(reviewFailedExcel);
+						} else {
+							UnbookkeptExcel unbookkeptExcel = new UnbookkeptExcel();
+							unbookkeptExcel.setYear(finVouchers.getAccountYear() + "");
+							unbookkeptExcel.setMonth(finVouchers.getAccountMonth() + "");
+							unbookkeptExcel.setVoucherNumber(finVouchers.getVoucherNo());
+							unbookkeptExcel.setVoucherDate(finVouchers.getVoucherDate());
+							unbookkeptExcel.setOperator(finVouchers.getCreateUserName());
+							unbookkeptExcelList.add(unbookkeptExcel);
+						}
+					}
+				}
+			}
+		}
+		if (!reviewFailedExcelList.isEmpty()) {
+			ExcelUtil.export(response, "审核未通过", "审核未通过", BeanUtil.copy(reviewFailedExcelList, ReviewFailedExcel.class), ReviewFailedExcel.class);
+		}
+		if (!unbookkeptExcelList.isEmpty()) {
+			ExcelUtil.export(response, "凭证未记账", "凭证未记账", BeanUtil.copy(unbookkeptExcelList, UnbookkeptExcel.class), UnbookkeptExcel.class);
+		}
 	}
 
 }

+ 12 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/controller/FinVouchersController.java

@@ -162,4 +162,16 @@ public class FinVouchersController extends BladeController {
 	}
 
 
+	/**
+	 * 期间结转-财务凭证保存
+	 */
+	@PostMapping("/submitPeriod")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入finVouchers")
+	@RepeatSubmit
+	public R submitPeriod(@Valid @RequestBody FinVouchers finVouchers) {
+		return finVouchersService.submitPeriod(finVouchers);
+	}
+
+
 }

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/IFinVouchersService.java

@@ -70,4 +70,6 @@ public interface IFinVouchersService extends IService<FinVouchers> {
 	R revokeFinVouchers(String ids);
 
 	void removeIds(List<Long> longList);
+
+	R submitPeriod(FinVouchers finVouchers);
 }

+ 414 - 246
blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/impl/FinVouchersServiceImpl.java

@@ -283,21 +283,22 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 						FinGenlegCalc finGenlegCalc;
 						if (1 == accounts.getIsDept() || 1 == accounts.getIsCorp() || 1 == accounts.getIsEmpl()) {
 							finGenlegCalc = finGenlegCalcList.stream().filter(e -> e.getAccId().equals(item.getAccountId()) &&
-								e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())
-								&& ((1 == accounts.getIsDept() && e.getDeptId().equals(item.getDeptId())) ||
+									e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())
+									&& ((1 == accounts.getIsDept() && e.getDeptId().equals(item.getDeptId())) ||
 									(1 == accounts.getIsEmpl() && e.getIsEmpl().equals(item.getIsEmpl())) ||
 									(1 == accounts.getIsCorp() && e.getIsCorp().equals(item.getIsCorp()))))
 								.findFirst().orElse(null);
-						}else{
-							finGenlegCalc = finGenlegCalcList.stream().filter(e -> e.getAccId().equals(item.getAccountId()) &&
-								e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
+							finGenlegCalc = genlegAccountingFinGenlegCalc(accounts, item, finGenlegCalc);
+							if (ObjectUtils.isNotNull(finGenlegCalc)) {
+								finGenlegCalcListNew.add(finGenlegCalc);
+							}
 						}
-						genlegAccounting(accounts, item, finGenleg, finGenlegCalc);
-						if (finGenlegCalc != null) {
-							finGenlegCalcListNew.add(finGenlegCalc);
+						finGenleg = genlegAccountingFinGenleg(accounts, item, finGenleg);
+						if (ObjectUtils.isNotNull(finGenleg)) {
+							finGenlegListNew.add(finGenleg);
 						}
-						finGenlegListNew.add(finGenleg);
-						FinGenleg finGenlegP = finGenlegList.stream().filter(e -> e.getAccId().equals(finGenleg.getParentId()) &&
+						FinGenleg finalFinGenleg = finGenleg;
+						FinGenleg finGenlegP = finGenlegList.stream().filter(e -> e.getAccId().equals(finalFinGenleg.getParentId()) &&
 							e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
 						if (finGenlegP != null) {
 							List<FinGenleg> finGenlegs = new ArrayList<>();
@@ -526,67 +527,78 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 		}
 	}
 
-	private void genlegAccounting(Accounts accounts, FinVouchersItems item, FinGenleg finGenleg, FinGenlegCalc finGenlegCalc) {
+	private FinGenleg genlegAccountingFinGenleg(Accounts accounts, FinVouchersItems item, FinGenleg finGenleg) {
 		if (accounts == null) {
 			throw new RuntimeException("未找到科目信息,记账失败");
 		}
-		FinGenlegCalc finGenlegCalc1 = new FinGenlegCalc();
+		FinGenleg finGenleg1 = new FinGenleg();
+		finGenleg1.setCreateTime(new Date());
+		finGenleg1.setCreateUser(AuthUtil.getUserId());
+		finGenleg1.setCreateUserName(AuthUtil.getUserName());
+		finGenleg1.setCreateDept(AuthUtil.getDeptId());
+		finGenleg1.setCreateDeptName(deptUtils.getDept(AuthUtil.getDeptId()).getDeptName());
+		finGenleg1.setTenantId(AuthUtil.getTenantId());
+		finGenleg1.setBranchId(deptUtils.getDeptPid() + "");
+		finGenleg1.setAccyear(item.getAccountYear());
+		finGenleg1.setAccmonth(item.getAccountMonth());
+		finGenleg1.setAccId(accounts.getId());
+		finGenleg1.setParentId(accounts.getParentId());
+		finGenleg1.setAccCode(accounts.getCode());
+		finGenleg1.setParentCode(accounts.getParentCode());
+		finGenleg1.setCnName(accounts.getCnName());
+		finGenleg1.setEnName(accounts.getEnName());
+		finGenleg1.setFullName(accounts.getFullName());
+		finGenleg1.setProperty(accounts.getProperty());
+		finGenleg1.setLevel(accounts.getLevel());
+		finGenleg1.setDc(accounts.getDc());
+		finGenleg1.setIsDetail(accounts.getIsDetail());
+		finGenleg1.setSublegType(accounts.getSublegType());
+		finGenleg1.setDescr(accounts.getDescr());
+		finGenleg1.setIsCash(accounts.getIsCash());
+		finGenleg1.setIsCashEq(accounts.getIsCashEq());
+		finGenleg1.setIsBank(accounts.getIsBank());
+		finGenleg1.setIsDiary(accounts.getIsDiary());
+		finGenleg1.setIsStock(accounts.getIsStock());
+		finGenleg1.setIsForeign(accounts.getIsForeign());
+		finGenleg1.setCurCode(accounts.getCurCode());
+		finGenleg1.setExrate(accounts.getExrate());
+		finGenleg1.setIsQuantity(accounts.getIsQuantity());
+		finGenleg1.setUnitNo(accounts.getUnitNo());
+		finGenleg1.setPrice(accounts.getPrice());
+		finGenleg1.setIsBudget(accounts.getIsBudget());
+		finGenleg1.setAmountBudget(accounts.getAmountBudget());
+		finGenleg1.setAmountBudgetLoc(accounts.getAmountBudgetLoc());
+		finGenleg1.setIsCorp(accounts.getIsCorp());
+		finGenleg1.setIsDept(accounts.getIsDept());
+		finGenleg1.setIsEmpl(accounts.getIsEmpl());
+		finGenleg1.setIsItem(accounts.getIsItem());
+		finGenleg1.setItemClassifyId(accounts.getItemClassifyId());
+		finGenleg1.setItemClassify(accounts.getItemClassify());
+		finGenleg1.setAmountOpenDr(new BigDecimal("0"));
+		finGenleg1.setAmountOpenCr(new BigDecimal("0"));
+		finGenleg1.setAmountOpenBlc(new BigDecimal("0"));
+		finGenleg1.setAmountLastBlc(new BigDecimal("0"));
+		finGenleg1.setAmountYearDr(new BigDecimal("0"));
+		finGenleg1.setAmountYearCr(new BigDecimal("0"));
+		finGenleg1.setAmountOpenDrUsd(new BigDecimal("0"));
+		finGenleg1.setAmountOpenCrUsd(new BigDecimal("0"));
+		finGenleg1.setAmountOpenUsdBlc(new BigDecimal("0"));
+		finGenleg1.setAmountLastBlcUsd(new BigDecimal("0"));
+		finGenleg1.setAmountYearDrUsd(new BigDecimal("0"));
+		finGenleg1.setAmountYearCrUsd(new BigDecimal("0"));
+		finGenleg1.setQuantityOpenDr(new BigDecimal("0"));
+		finGenleg1.setQuantityOpenCr(new BigDecimal("0"));
+		finGenleg1.setQuantityOpenBlc(new BigDecimal("0"));
+		finGenleg1.setQuantityLastBlc(new BigDecimal("0"));
+		finGenleg1.setQuantityYearDr(new BigDecimal("0"));
+		finGenleg1.setQuantityYearCr(new BigDecimal("0"));
+		finGenleg1.setAmountDr(new BigDecimal("0"));
+		finGenleg1.setAmountCr(new BigDecimal("0"));
+		finGenleg1.setAmountDrUsd(new BigDecimal("0"));
+		finGenleg1.setAmountCrUsd(new BigDecimal("0"));
 		if (finGenleg == null) {
 			finGenleg = new FinGenleg();
-			finGenleg.setAccyear(item.getAccountYear());
-			finGenleg.setAccmonth(item.getAccountMonth());
-			finGenleg.setAccId(accounts.getId());
-			finGenleg.setParentId(accounts.getParentId());
-			finGenleg.setAccCode(accounts.getCode());
-			finGenleg.setParentCode(accounts.getParentCode());
-			finGenleg.setCnName(accounts.getCnName());
-			finGenleg.setEnName(accounts.getEnName());
-			finGenleg.setFullName(accounts.getFullName());
-			finGenleg.setProperty(accounts.getProperty());
-			finGenleg.setLevel(accounts.getLevel());
-			finGenleg.setDc(accounts.getDc());
-			finGenleg.setIsDetail(accounts.getIsDetail());
-			finGenleg.setSublegType(accounts.getSublegType());
-			finGenleg.setDescr(accounts.getDescr());
-			finGenleg.setIsCash(accounts.getIsCash());
-			finGenleg.setIsCashEq(accounts.getIsCashEq());
-			finGenleg.setIsBank(accounts.getIsBank());
-			finGenleg.setIsDiary(accounts.getIsDiary());
-			finGenleg.setIsStock(accounts.getIsStock());
-			finGenleg.setIsForeign(accounts.getIsForeign());
-			finGenleg.setCurCode(accounts.getCurCode());
-			finGenleg.setExrate(accounts.getExrate());
-			finGenleg.setIsQuantity(accounts.getIsQuantity());
-			finGenleg.setUnitNo(accounts.getUnitNo());
-			finGenleg.setPrice(accounts.getPrice());
-			finGenleg.setIsBudget(accounts.getIsBudget());
-			finGenleg.setAmountBudget(accounts.getAmountBudget());
-			finGenleg.setAmountBudgetLoc(accounts.getAmountBudgetLoc());
-			finGenleg.setIsCorp(accounts.getIsCorp());
-			finGenleg.setIsDept(accounts.getIsDept());
-			finGenleg.setIsEmpl(accounts.getIsEmpl());
-			finGenleg.setIsItem(accounts.getIsItem());
-			finGenleg.setItemClassifyId(accounts.getItemClassifyId());
-			finGenleg.setItemClassify(accounts.getItemClassify());
-			finGenleg.setAmountOpenDr(new BigDecimal("0"));
-			finGenleg.setAmountOpenCr(new BigDecimal("0"));
-			finGenleg.setAmountOpenBlc(new BigDecimal("0"));
-			finGenleg.setAmountLastBlc(new BigDecimal("0"));
-			finGenleg.setAmountYearDr(new BigDecimal("0"));
-			finGenleg.setAmountYearCr(new BigDecimal("0"));
-			finGenleg.setAmountOpenDrUsd(new BigDecimal("0"));
-			finGenleg.setAmountOpenCrUsd(new BigDecimal("0"));
-			finGenleg.setAmountOpenUsdBlc(new BigDecimal("0"));
-			finGenleg.setAmountLastBlcUsd(new BigDecimal("0"));
-			finGenleg.setAmountYearDrUsd(new BigDecimal("0"));
-			finGenleg.setAmountYearCrUsd(new BigDecimal("0"));
-			finGenleg.setQuantityOpenDr(new BigDecimal("0"));
-			finGenleg.setQuantityOpenCr(new BigDecimal("0"));
-			finGenleg.setQuantityOpenBlc(new BigDecimal("0"));
-			finGenleg.setQuantityLastBlc(new BigDecimal("0"));
-			finGenleg.setQuantityYearDr(new BigDecimal("0"));
-			finGenleg.setQuantityYearCr(new BigDecimal("0"));
-			BeanUtil.copyProperties(finGenleg, finGenlegCalc1);
+			BeanUtil.copyProperties(finGenleg1, finGenleg);
 		}
 		//上期本币余额(CNY)
 		BigDecimal amountLastBlc = finGenleg.getAmountLastBlc();
@@ -630,11 +642,19 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 				amountDrUsd = amountDrUsd.add(item.getAmountDrUsd());
 				//本年本币借方金额(CNY)
 				amountYearDrUsd = amountYearDrUsd.add(item.getAmountDrUsd());
+				//本期本币借方金额(CNY)
+				amountDr = amountDr.add(item.getAmountDrUsd().multiply(item.getExrate()));
+				//本年本币借方金额(CNY)
+				amountYearDr = amountYearDr.add(item.getAmountDrUsd().multiply(item.getExrate()));
 			} else {
 				//本期本币贷方金额(CNY)
 				amountCrUsd = amountCrUsd.add(item.getAmountCrUsd());
 				//本年本币贷方金额(CNY)
 				amountYearCrUsd = amountYearCrUsd.add(item.getAmountCrUsd());
+				//本期本币贷方金额(CNY)
+				amountCr = amountCr.add(item.getAmountCrUsd().multiply(item.getExrate()));
+				//本年本币贷方金额(CNY)
+				amountYearCr = amountYearCr.add(item.getAmountCrUsd().multiply(item.getExrate()));
 			}
 		}
 		if ("D".equals(finGenleg.getDc())) {
@@ -664,103 +684,184 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 		finGenleg.setAmountYearCrUsd(amountYearCrUsd);
 		//本期外币余额
 		finGenleg.setAmountUsdBlc(amountUsdBlc);
-		if (1 == accounts.getIsDept() || 1 == accounts.getIsCorp() || 1 == accounts.getIsEmpl()) {
-			if (finGenlegCalc == null) {
-				finGenlegCalc = finGenlegCalc1;
-			} else {
-				if (!finGenlegCalc.getCorpId().equals(item.getCorpId()) ||
-					!finGenlegCalc.getDeptId().equals(item.getDeptId()) ||
-					!finGenlegCalc.getEmplId().equals(item.getEmplId())) {
-					finGenlegCalc = finGenlegCalc1;
-				}
+		return finGenleg;
+	}
+
+	private FinGenlegCalc genlegAccountingFinGenlegCalc(Accounts accounts, FinVouchersItems item, FinGenlegCalc finGenlegCalc) {
+		if (accounts == null) {
+			throw new RuntimeException("未找到科目信息,记账失败");
+		}
+		FinGenleg finGenleg1 = new FinGenleg();
+		finGenleg1.setCreateTime(new Date());
+		finGenleg1.setCreateUser(AuthUtil.getUserId());
+		finGenleg1.setCreateUserName(AuthUtil.getUserName());
+		finGenleg1.setCreateDept(AuthUtil.getDeptId());
+		finGenleg1.setCreateDeptName(deptUtils.getDept(AuthUtil.getDeptId()).getDeptName());
+		finGenleg1.setTenantId(AuthUtil.getTenantId());
+		finGenleg1.setBranchId(deptUtils.getDeptPid() + "");
+		finGenleg1.setAccyear(item.getAccountYear());
+		finGenleg1.setAccmonth(item.getAccountMonth());
+		finGenleg1.setAccId(accounts.getId());
+		finGenleg1.setParentId(accounts.getParentId());
+		finGenleg1.setAccCode(accounts.getCode());
+		finGenleg1.setParentCode(accounts.getParentCode());
+		finGenleg1.setCnName(accounts.getCnName());
+		finGenleg1.setEnName(accounts.getEnName());
+		finGenleg1.setFullName(accounts.getFullName());
+		finGenleg1.setProperty(accounts.getProperty());
+		finGenleg1.setLevel(accounts.getLevel());
+		finGenleg1.setDc(accounts.getDc());
+		finGenleg1.setIsDetail(accounts.getIsDetail());
+		finGenleg1.setSublegType(accounts.getSublegType());
+		finGenleg1.setDescr(accounts.getDescr());
+		finGenleg1.setIsCash(accounts.getIsCash());
+		finGenleg1.setIsCashEq(accounts.getIsCashEq());
+		finGenleg1.setIsBank(accounts.getIsBank());
+		finGenleg1.setIsDiary(accounts.getIsDiary());
+		finGenleg1.setIsStock(accounts.getIsStock());
+		finGenleg1.setIsForeign(accounts.getIsForeign());
+		finGenleg1.setCurCode(accounts.getCurCode());
+		finGenleg1.setExrate(accounts.getExrate());
+		finGenleg1.setIsQuantity(accounts.getIsQuantity());
+		finGenleg1.setUnitNo(accounts.getUnitNo());
+		finGenleg1.setPrice(accounts.getPrice());
+		finGenleg1.setIsBudget(accounts.getIsBudget());
+		finGenleg1.setAmountBudget(accounts.getAmountBudget());
+		finGenleg1.setAmountBudgetLoc(accounts.getAmountBudgetLoc());
+		finGenleg1.setIsCorp(accounts.getIsCorp());
+		finGenleg1.setIsDept(accounts.getIsDept());
+		finGenleg1.setIsEmpl(accounts.getIsEmpl());
+		finGenleg1.setIsItem(accounts.getIsItem());
+		finGenleg1.setItemClassifyId(accounts.getItemClassifyId());
+		finGenleg1.setItemClassify(accounts.getItemClassify());
+		finGenleg1.setAmountOpenDr(new BigDecimal("0"));
+		finGenleg1.setAmountOpenCr(new BigDecimal("0"));
+		finGenleg1.setAmountOpenBlc(new BigDecimal("0"));
+		finGenleg1.setAmountLastBlc(new BigDecimal("0"));
+		finGenleg1.setAmountYearDr(new BigDecimal("0"));
+		finGenleg1.setAmountYearCr(new BigDecimal("0"));
+		finGenleg1.setAmountOpenDrUsd(new BigDecimal("0"));
+		finGenleg1.setAmountOpenCrUsd(new BigDecimal("0"));
+		finGenleg1.setAmountOpenUsdBlc(new BigDecimal("0"));
+		finGenleg1.setAmountLastBlcUsd(new BigDecimal("0"));
+		finGenleg1.setAmountYearDrUsd(new BigDecimal("0"));
+		finGenleg1.setAmountYearCrUsd(new BigDecimal("0"));
+		finGenleg1.setQuantityOpenDr(new BigDecimal("0"));
+		finGenleg1.setQuantityOpenCr(new BigDecimal("0"));
+		finGenleg1.setQuantityOpenBlc(new BigDecimal("0"));
+		finGenleg1.setQuantityLastBlc(new BigDecimal("0"));
+		finGenleg1.setQuantityYearDr(new BigDecimal("0"));
+		finGenleg1.setQuantityYearCr(new BigDecimal("0"));
+		finGenleg1.setAmountDr(new BigDecimal("0"));
+		finGenleg1.setAmountCr(new BigDecimal("0"));
+		finGenleg1.setAmountDrUsd(new BigDecimal("0"));
+		finGenleg1.setAmountCrUsd(new BigDecimal("0"));
+		if (finGenlegCalc == null) {
+			finGenlegCalc = new FinGenlegCalc();
+			BeanUtil.copyProperties(finGenleg1, finGenlegCalc);
+		} else {
+			if (!finGenlegCalc.getCorpId().equals(item.getCorpId()) ||
+				!finGenlegCalc.getDeptId().equals(item.getDeptId()) ||
+				!finGenlegCalc.getEmplId().equals(item.getEmplId())) {
+				finGenlegCalc = new FinGenlegCalc();
+				BeanUtil.copyProperties(finGenleg1, finGenlegCalc);
 			}
-			//上期本币余额(CNY)
-			BigDecimal amountLastBlcCalc = finGenlegCalc.getAmountLastBlc();
-			//本期本币借方金额(CNY)
-			BigDecimal amountDrCalc = finGenlegCalc.getAmountDr();
-			//本期本币贷方金额(CNY)
-			BigDecimal amountCrCalc = finGenlegCalc.getAmountCr();
-			//本年本币借方金额(CNY)
-			BigDecimal amountYearDrCalc = finGenlegCalc.getAmountYearDr();
-			//本年本币贷方金额(CNY)
-			BigDecimal amountYearCrCalc = finGenlegCalc.getAmountYearCr();
-			//本期本币余额(CNY)
-			BigDecimal amountBlcCalc;
-			//上期外币余额(USD)
-			BigDecimal amountLastBlcUsdCalc = finGenlegCalc.getAmountLastBlcUsd();
-			//本期外币借方金额
-			BigDecimal amountDrUsdCalc = finGenlegCalc.getAmountDrUsd();
-			//本期外币贷方金额
-			BigDecimal amountCrUsdCalc = finGenlegCalc.getAmountCrUsd();
-			//本年外币借方金额(USD)
-			BigDecimal amountYearDrUsdCalc = finGenlegCalc.getAmountYearDrUsd();
-			//本年外币贷方金额(USD)
-			BigDecimal amountYearCrUsdCalc = finGenlegCalc.getAmountYearCrUsd();
-			//本期外币余额
-			BigDecimal amountUsdBlcCalc;
-			if ("CNY".equals(item.getCurCode())) {
-				if ("D".equals(item.getDc())) {
-					//本期本币借方金额(CNY)
-					amountDrCalc = amountDrCalc.add(item.getAmountDr());
-					//本年本币借方金额(CNY)
-					amountYearDrCalc = amountYearDrCalc.add(item.getAmountDr());
-				} else {
-					//本期本币贷方金额(CNY)
-					amountCrCalc = amountCrCalc.add(item.getAmountCr());
-					//本年本币贷方金额(CNY)
-					amountYearCrCalc = amountYearCrCalc.add(item.getAmountCr());
-				}
+		}
+		//上期本币余额(CNY)
+		BigDecimal amountLastBlcCalc = finGenlegCalc.getAmountLastBlc();
+		//本期本币借方金额(CNY)
+		BigDecimal amountDrCalc = finGenlegCalc.getAmountDr();
+		//本期本币贷方金额(CNY)
+		BigDecimal amountCrCalc = finGenlegCalc.getAmountCr();
+		//本年本币借方金额(CNY)
+		BigDecimal amountYearDrCalc = finGenlegCalc.getAmountYearDr();
+		//本年本币贷方金额(CNY)
+		BigDecimal amountYearCrCalc = finGenlegCalc.getAmountYearCr();
+		//本期本币余额(CNY)
+		BigDecimal amountBlcCalc;
+		//上期外币余额(USD)
+		BigDecimal amountLastBlcUsdCalc = finGenlegCalc.getAmountLastBlcUsd();
+		//本期外币借方金额
+		BigDecimal amountDrUsdCalc = finGenlegCalc.getAmountDrUsd();
+		//本期外币贷方金额
+		BigDecimal amountCrUsdCalc = finGenlegCalc.getAmountCrUsd();
+		//本年外币借方金额(USD)
+		BigDecimal amountYearDrUsdCalc = finGenlegCalc.getAmountYearDrUsd();
+		//本年外币贷方金额(USD)
+		BigDecimal amountYearCrUsdCalc = finGenlegCalc.getAmountYearCrUsd();
+		//本期外币余额
+		BigDecimal amountUsdBlcCalc;
+		if ("CNY".equals(item.getCurCode())) {
+			if ("D".equals(accounts.getDc())) {
+				//本期本币借方金额(CNY)
+				amountDrCalc = amountDrCalc.add(item.getAmountDr());
+				//本年本币借方金额(CNY)
+				amountYearDrCalc = amountYearDrCalc.add(item.getAmountDr());
 			} else {
-				if ("D".equals(item.getDc())) {
-					//本期本币借方金额(CNY)
-					amountDrUsdCalc = amountDrUsdCalc.add(item.getAmountDrUsd());
-					//本年本币借方金额(CNY)
-					amountYearDrUsdCalc = amountYearDrUsdCalc.add(item.getAmountDrUsd());
-				} else {
-					//本期本币贷方金额(CNY)
-					amountCrUsdCalc = amountCrUsdCalc.add(item.getAmountCrUsd());
-					//本年本币贷方金额(CNY)
-					amountYearCrUsdCalc = amountYearCrUsdCalc.add(item.getAmountCrUsd());
-				}
+				//本期本币贷方金额(CNY)
+				amountCrCalc = amountCrCalc.add(item.getAmountCr());
+				//本年本币贷方金额(CNY)
+				amountYearCrCalc = amountYearCrCalc.add(item.getAmountCr());
 			}
-			if ("D".equals(finGenleg.getDc())) {
-				amountBlcCalc = amountLastBlcCalc.add(amountDrCalc).subtract(amountCrCalc);
-				amountUsdBlcCalc = amountLastBlcUsd.add(amountDrUsd).subtract(amountCrUsdCalc);
+		} else {
+			if ("D".equals(accounts.getDc())) {
+				//本期本币借方金额(USD)
+				amountDrUsdCalc = amountDrUsdCalc.add(item.getAmountDrUsd());
+				//本期本币借方金额(CNY)
+				amountDrCalc = amountDrCalc.add(item.getAmountDrUsd().multiply(item.getExrate()));
+				//本年本币借方金额(USD)
+				amountYearDrUsdCalc = amountYearDrUsdCalc.add(item.getAmountDrUsd());
+				//本年本币借方金额(CNY)
+				amountYearDrCalc = amountYearDrCalc.add(item.getAmountDrUsd().multiply(item.getExrate()));
 			} else {
-				amountBlcCalc = amountLastBlcCalc.subtract(amountDrCalc).add(amountCrCalc);
-				amountUsdBlcCalc = amountLastBlcUsdCalc.subtract(amountDrUsdCalc).add(amountCrUsdCalc);
+				//本期本币贷方金额(USD)
+				amountCrUsdCalc = amountCrUsdCalc.add(item.getAmountCrUsd());
+				//本年本币贷方金额(USD)
+				amountYearCrUsdCalc = amountYearCrUsdCalc.add(item.getAmountCrUsd());
+				//本期本币贷方金额(CNY)
+				amountCrCalc = amountCrCalc.add(item.getAmountCrUsd().multiply(item.getExrate()));
+				//本年本币贷方金额(CNY)
+				amountYearCrCalc = amountYearCrCalc.add(item.getAmountCrUsd().multiply(item.getExrate()));
 			}
-			//本期本币借方金额(CNY)
-			finGenlegCalc.setAmountDr(amountDrCalc);
-			//本期本币贷方金额(CNY)
-			finGenlegCalc.setAmountCr(amountCrCalc);
-			//本年本币借方金额(CNY)
-			finGenlegCalc.setAmountYearDr(amountYearDrCalc);
-			//本年本币贷方金额(CNY)
-			finGenlegCalc.setAmountYearCr(amountYearCrCalc);
-			//本期本币余额(CNY)
-			finGenlegCalc.setAmountBlc(amountBlcCalc);
-			//本期外币借方金额
-			finGenlegCalc.setAmountDrUsd(amountDrUsdCalc);
-			//本期外币贷方金额
-			finGenlegCalc.setAmountCrUsd(amountCrUsdCalc);
-			//本年外币借方金额(USD)
-			finGenlegCalc.setAmountYearDrUsd(amountYearDrUsdCalc);
-			//本年外币贷方金额(USD)
-			finGenlegCalc.setAmountYearCrUsd(amountYearCrUsdCalc);
-			//本期外币余额
-			finGenlegCalc.setAmountUsdBlc(amountUsdBlcCalc);
-			finGenlegCalc.setCorpId(item.getCorpId());
-			finGenlegCalc.setCorpCnName(item.getCorpCnName());
-			finGenlegCalc.setCorpEnName(item.getCorpEnName());
-			finGenlegCalc.setDeptId(item.getDeptId());
-			finGenlegCalc.setDeptName(item.getDeptName());
-			finGenlegCalc.setEmplId(item.getEmplId());
-			finGenlegCalc.setEmplName(item.getEmplName());
 		}
+		if ("D".equals(accounts.getDc())) {
+			amountBlcCalc = amountLastBlcCalc.add(amountDrCalc).subtract(amountCrCalc);
+			amountUsdBlcCalc = amountLastBlcCalc.add(amountDrUsdCalc).subtract(amountCrUsdCalc);
+		} else {
+			amountBlcCalc = amountLastBlcCalc.subtract(amountDrCalc).add(amountCrCalc);
+			amountUsdBlcCalc = amountLastBlcUsdCalc.subtract(amountDrUsdCalc).add(amountCrUsdCalc);
+		}
+		//本期本币借方金额(CNY)
+		finGenlegCalc.setAmountDr(amountDrCalc);
+		//本期本币贷方金额(CNY)
+		finGenlegCalc.setAmountCr(amountCrCalc);
+		//本年本币借方金额(CNY)
+		finGenlegCalc.setAmountYearDr(amountYearDrCalc);
+		//本年本币贷方金额(CNY)
+		finGenlegCalc.setAmountYearCr(amountYearCrCalc);
+		//本期本币余额(CNY)
+		finGenlegCalc.setAmountBlc(amountBlcCalc);
+		//本期外币借方金额
+		finGenlegCalc.setAmountDrUsd(amountDrUsdCalc);
+		//本期外币贷方金额
+		finGenlegCalc.setAmountCrUsd(amountCrUsdCalc);
+		//本年外币借方金额(USD)
+		finGenlegCalc.setAmountYearDrUsd(amountYearDrUsdCalc);
+		//本年外币贷方金额(USD)
+		finGenlegCalc.setAmountYearCrUsd(amountYearCrUsdCalc);
+		//本期外币余额
+		finGenlegCalc.setAmountUsdBlc(amountUsdBlcCalc);
+		finGenlegCalc.setCorpId(item.getCorpId());
+		finGenlegCalc.setCorpCnName(item.getCorpCnName());
+		finGenlegCalc.setCorpEnName(item.getCorpEnName());
+		finGenlegCalc.setDeptId(item.getDeptId());
+		finGenlegCalc.setDeptName(item.getDeptName());
+		finGenlegCalc.setEmplId(item.getEmplId());
+		finGenlegCalc.setEmplName(item.getEmplName());
+		return finGenlegCalc;
 	}
 
-	private void revokeGenlegAccounting(Accounts accounts, FinVouchersItems item, FinGenleg finGenleg, FinGenlegCalc finGenlegCalc) {
+	private FinGenleg revokeGenlegAccountingFinGenleg(Accounts accounts, FinVouchersItems item, FinGenleg finGenleg) {
 		if (accounts == null) {
 			throw new RuntimeException("未找到科目信息,记账失败");
 		}
@@ -809,11 +910,19 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 				amountDrUsd = amountDrUsd.subtract(item.getAmountDrUsd());
 				//本年本币借方金额(CNY)
 				amountYearDrUsd = amountYearDrUsd.subtract(item.getAmountDrUsd());
+				//本期本币借方金额(CNY)
+				amountDr = amountDr.subtract(item.getAmountDrUsd().multiply(item.getExrate()));
+				//本年本币借方金额(CNY)
+				amountYearDr = amountYearDr.subtract(item.getAmountDrUsd().multiply(item.getExrate()));
 			} else {
 				//本期本币贷方金额(CNY)
 				amountCrUsd = amountCrUsd.subtract(item.getAmountCrUsd());
 				//本年本币贷方金额(CNY)
 				amountYearCrUsd = amountYearCrUsd.subtract(item.getAmountCrUsd());
+				//本期本币贷方金额(CNY)
+				amountCr = amountCr.subtract(item.getAmountCrUsd().multiply(item.getExrate()));
+				//本年本币贷方金额(CNY)
+				amountYearCr = amountYearCr.subtract(item.getAmountCrUsd().multiply(item.getExrate()));
 			}
 		}
 		if ("D".equals(finGenleg.getDc())) {
@@ -843,94 +952,108 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 		finGenleg.setAmountYearCrUsd(amountYearCrUsd);
 		//本期外币余额
 		finGenleg.setAmountUsdBlc(amountUsdBlc);
-		if (1 == accounts.getIsDept() || 1 == accounts.getIsCorp() || 1 == accounts.getIsEmpl()) {
-			if (finGenlegCalc == null) {
-				throw new RuntimeException("未找项目总账信息,记账失败");
-			}
-			//上期本币余额(CNY)
-			BigDecimal amountLastBlcCalc = finGenlegCalc.getAmountLastBlc();
-			//本期本币借方金额(CNY)
-			BigDecimal amountDrCalc = finGenlegCalc.getAmountDr();
-			//本期本币贷方金额(CNY)
-			BigDecimal amountCrCalc = finGenlegCalc.getAmountCr();
-			//本年本币借方金额(CNY)
-			BigDecimal amountYearDrCalc = finGenlegCalc.getAmountYearDr();
-			//本年本币贷方金额(CNY)
-			BigDecimal amountYearCrCalc = finGenlegCalc.getAmountYearCr();
-			//本期本币余额(CNY)
-			BigDecimal amountBlcCalc;
-			//上期外币余额(USD)
-			BigDecimal amountLastBlcUsdCalc = finGenlegCalc.getAmountLastBlcUsd();
-			//本期外币借方金额
-			BigDecimal amountDrUsdCalc = finGenlegCalc.getAmountDrUsd();
-			//本期外币贷方金额
-			BigDecimal amountCrUsdCalc = finGenlegCalc.getAmountCrUsd();
-			//本年外币借方金额(USD)
-			BigDecimal amountYearDrUsdCalc = finGenlegCalc.getAmountYearDrUsd();
-			//本年外币贷方金额(USD)
-			BigDecimal amountYearCrUsdCalc = finGenlegCalc.getAmountYearCrUsd();
-			//本期外币余
-			BigDecimal amountUsdBlcCalc;
-			if ("CNY".equals(item.getCurCode())) {
-				if ("D".equals(item.getDc())) {
-					//本期本币借方金额(CNY)
-					amountDrCalc = amountDrCalc.subtract(item.getAmountDr());
-					//本年本币借方金额(CNY)
-					amountYearDrCalc = amountYearDrCalc.subtract(item.getAmountDr());
-				} else {
-					//本期本币贷方金额(CNY)
-					amountCrCalc = amountCrCalc.subtract(item.getAmountCr());
-					//本年本币贷方金额(CNY)
-					amountYearCrCalc = amountYearCrCalc.subtract(item.getAmountCr());
-				}
+		return finGenleg;
+	}
+
+	private FinGenlegCalc revokeGenlegAccountingFinGenlegCalc(Accounts accounts, FinVouchersItems item, FinGenlegCalc finGenlegCalc) {
+		if (accounts == null) {
+			throw new RuntimeException("未找到科目信息,记账失败");
+		}
+		if (finGenlegCalc == null) {
+			throw new RuntimeException("未找项目总账信息,记账失败");
+		}
+		//上期本币余额(CNY)
+		BigDecimal amountLastBlcCalc = finGenlegCalc.getAmountLastBlc();
+		//本期本币借方金额(CNY)
+		BigDecimal amountDrCalc = finGenlegCalc.getAmountDr();
+		//本期本币贷方金额(CNY)
+		BigDecimal amountCrCalc = finGenlegCalc.getAmountCr();
+		//本年本币借方金额(CNY)
+		BigDecimal amountYearDrCalc = finGenlegCalc.getAmountYearDr();
+		//本年本币贷方金额(CNY)
+		BigDecimal amountYearCrCalc = finGenlegCalc.getAmountYearCr();
+		//本期本币余额(CNY)
+		BigDecimal amountBlcCalc;
+		//上期外币余额(USD)
+		BigDecimal amountLastBlcUsdCalc = finGenlegCalc.getAmountLastBlcUsd();
+		//本期外币借方金额
+		BigDecimal amountDrUsdCalc = finGenlegCalc.getAmountDrUsd();
+		//本期外币贷方金
+		BigDecimal amountCrUsdCalc = finGenlegCalc.getAmountCrUsd();
+		//本年外币借方金额(USD)
+		BigDecimal amountYearDrUsdCalc = finGenlegCalc.getAmountYearDrUsd();
+		//本年外币贷方金额(USD)
+		BigDecimal amountYearCrUsdCalc = finGenlegCalc.getAmountYearCrUsd();
+		//本期外币余额
+		BigDecimal amountUsdBlcCalc;
+		if ("CNY".equals(item.getCurCode())) {
+			if ("D".equals(item.getDc())) {
+				//本期本币借方金额(CNY)
+				amountDrCalc = amountDrCalc.subtract(item.getAmountDr());
+				//本年本币借方金额(CNY)
+				amountYearDrCalc = amountYearDrCalc.subtract(item.getAmountDr());
 			} else {
-				if ("D".equals(item.getDc())) {
-					//本期本币借方金额(CNY)
-					amountDrUsdCalc = amountDrUsdCalc.subtract(item.getAmountDrUsd());
-					//本年本币借方金额(CNY)
-					amountYearDrUsdCalc = amountYearDrUsdCalc.subtract(item.getAmountDrUsd());
-				} else {
-					//本期本币贷方金额(CNY)
-					amountCrUsdCalc = amountCrUsdCalc.subtract(item.getAmountCrUsd());
-					//本年本币贷方金额(CNY)
-					amountYearCrUsdCalc = amountYearCrUsdCalc.subtract(item.getAmountCrUsd());
-				}
+				//本期本币贷方金额(CNY)
+				amountCrCalc = amountCrCalc.subtract(item.getAmountCr());
+				//本年本币贷方金额(CNY)
+				amountYearCrCalc = amountYearCrCalc.subtract(item.getAmountCr());
 			}
-			if ("D".equals(finGenleg.getDc())) {
-				amountBlcCalc = amountLastBlcCalc.subtract(amountDrCalc).add(amountCrCalc);
-				amountUsdBlcCalc = amountLastBlcUsd.subtract(amountDrUsd).add(amountCrUsdCalc);
+		} else {
+			if ("D".equals(item.getDc())) {
+				//本期本币借方金额(CNY)
+				amountDrUsdCalc = amountDrUsdCalc.subtract(item.getAmountDrUsd());
+				//本年本币借方金额(CNY)
+				amountYearDrUsdCalc = amountYearDrUsdCalc.subtract(item.getAmountDrUsd());
+				//本期本币借方金额(CNY)
+				amountDrCalc = amountDrCalc.subtract(item.getAmountDrUsd().multiply(item.getExrate()));
+				//本年本币借方金额(CNY)
+				amountYearDrCalc = amountYearDrCalc.subtract(item.getAmountDrUsd().multiply(item.getExrate()));
 			} else {
-				amountBlcCalc = amountLastBlcCalc.add(amountDrCalc).subtract(amountCrCalc);
-				amountUsdBlcCalc = amountLastBlcUsdCalc.add(amountDrUsdCalc).subtract(amountCrUsdCalc);
+				//本期本币贷方金额(CNY)
+				amountCrUsdCalc = amountCrUsdCalc.subtract(item.getAmountCrUsd());
+				//本年本币贷方金额(CNY)
+				amountYearCrUsdCalc = amountYearCrUsdCalc.subtract(item.getAmountCrUsd());
+				//本期本币贷方金额(CNY)
+				amountCrCalc = amountCrCalc.subtract(item.getAmountCrUsd().multiply(item.getExrate()));
+				//本年本币贷方金额(CNY)
+				amountYearCrCalc = amountYearCrCalc.subtract(item.getAmountCrUsd().multiply(item.getExrate()));
 			}
-			//本期本币借方金额(CNY)
-			finGenlegCalc.setAmountDr(amountDrCalc);
-			//本期本币贷方金额(CNY)
-			finGenlegCalc.setAmountCr(amountCrCalc);
-			//本年本币借方金额(CNY)
-			finGenlegCalc.setAmountYearDr(amountYearDrCalc);
-			//本年本币贷方金额(CNY)
-			finGenlegCalc.setAmountYearCr(amountYearCrCalc);
-			//本期本币余额(CNY)
-			finGenlegCalc.setAmountBlc(amountBlcCalc);
-			//本期外币借方金额
-			finGenlegCalc.setAmountDrUsd(amountDrUsdCalc);
-			//本期外币贷方金额
-			finGenlegCalc.setAmountCrUsd(amountCrUsdCalc);
-			//本年外币借方金额(USD)
-			finGenlegCalc.setAmountYearDrUsd(amountYearDrUsdCalc);
-			//本年外币贷方金额(USD)
-			finGenlegCalc.setAmountYearCrUsd(amountYearCrUsdCalc);
-			//本期外币余额
-			finGenlegCalc.setAmountUsdBlc(amountUsdBlcCalc);
-			finGenlegCalc.setCorpId(item.getCorpId());
-			finGenlegCalc.setCorpCnName(item.getCorpCnName());
-			finGenlegCalc.setCorpEnName(item.getCorpEnName());
-			finGenlegCalc.setDeptId(item.getDeptId());
-			finGenlegCalc.setDeptName(item.getDeptName());
-			finGenlegCalc.setEmplId(item.getEmplId());
-			finGenlegCalc.setEmplName(item.getEmplName());
 		}
+		if ("D".equals(accounts.getDc())) {
+			amountBlcCalc = amountLastBlcCalc.subtract(amountDrCalc).add(amountCrCalc);
+			amountUsdBlcCalc = amountLastBlcUsdCalc.subtract(amountDrUsdCalc).add(amountCrUsdCalc);
+		} else {
+			amountBlcCalc = amountLastBlcCalc.add(amountDrCalc).subtract(amountCrCalc);
+			amountUsdBlcCalc = amountLastBlcUsdCalc.add(amountDrUsdCalc).subtract(amountCrUsdCalc);
+		}
+		//本期本币借方金额(CNY)
+		finGenlegCalc.setAmountDr(amountDrCalc);
+		//本期本币贷方金额(CNY)
+		finGenlegCalc.setAmountCr(amountCrCalc);
+		//本年本币借方金额(CNY)
+		finGenlegCalc.setAmountYearDr(amountYearDrCalc);
+		//本年本币贷方金额(CNY)
+		finGenlegCalc.setAmountYearCr(amountYearCrCalc);
+		//本期本币余额(CNY)
+		finGenlegCalc.setAmountBlc(amountBlcCalc);
+		//本期外币借方金额
+		finGenlegCalc.setAmountDrUsd(amountDrUsdCalc);
+		//本期外币贷方金额
+		finGenlegCalc.setAmountCrUsd(amountCrUsdCalc);
+		//本年外币借方金额(USD)
+		finGenlegCalc.setAmountYearDrUsd(amountYearDrUsdCalc);
+		//本年外币贷方金额(USD)
+		finGenlegCalc.setAmountYearCrUsd(amountYearCrUsdCalc);
+		//本期外币余额
+		finGenlegCalc.setAmountUsdBlc(amountUsdBlcCalc);
+		finGenlegCalc.setCorpId(item.getCorpId());
+		finGenlegCalc.setCorpCnName(item.getCorpCnName());
+		finGenlegCalc.setCorpEnName(item.getCorpEnName());
+		finGenlegCalc.setDeptId(item.getDeptId());
+		finGenlegCalc.setDeptName(item.getDeptName());
+		finGenlegCalc.setEmplId(item.getEmplId());
+		finGenlegCalc.setEmplName(item.getEmplName());
+		return finGenlegCalc;
 	}
 
 	private List<FeeCenter> reconciliationFeeCenter(FinVouchers detail, List<FeeCenter> feeCenterList, int count) {
@@ -1004,16 +1127,17 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 									(1 == accounts.getIsEmpl() && e.getIsEmpl().equals(item.getIsEmpl())) ||
 									(1 == accounts.getIsCorp() && e.getIsCorp().equals(item.getIsCorp()))))
 								.findFirst().orElse(null);
-						}else{
-							finGenlegCalc = finGenlegCalcList.stream().filter(e -> e.getAccId().equals(item.getAccountId()) &&
-								e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
+							finGenlegCalc = revokeGenlegAccountingFinGenlegCalc(accounts, item, finGenlegCalc);
+							if (ObjectUtils.isNotNull(finGenlegCalc)){
+								finGenlegCalcListNew.add(finGenlegCalc);
+							}
 						}
-						revokeGenlegAccounting(accounts, item, finGenleg, finGenlegCalc);
-						if (finGenlegCalc != null) {
-							finGenlegCalcListNew.add(finGenlegCalc);
+						finGenleg = revokeGenlegAccountingFinGenleg(accounts, item, finGenleg);
+						if (ObjectUtils.isNotNull(finGenleg)) {
+							finGenlegListNew.add(finGenleg);
 						}
-						finGenlegListNew.add(finGenleg);
-						FinGenleg finGenlegP = finGenlegList.stream().filter(e -> e.getAccId().equals(finGenleg.getParentId()) &&
+						FinGenleg finalFinGenleg = finGenleg;
+						FinGenleg finGenlegP = finGenlegList.stream().filter(e -> e.getAccId().equals(finalFinGenleg.getParentId()) &&
 							e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
 						if (finGenlegP != null) {
 							List<FinGenleg> finGenlegs = new ArrayList<>();
@@ -1070,6 +1194,8 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public void removeIds(List<Long> ids) {
 		List<FinVouchers> finVouchersList = baseMapper.selectList(new LambdaQueryWrapper<FinVouchers>()
 			.eq(FinVouchers::getTenantId, AuthUtil.getTenantId())
@@ -1087,4 +1213,46 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 		baseMapper.deleteBatchIds(ids);
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public R submitPeriod(FinVouchers finVouchers) {
+		BusinessType businessType = bBusinessTypeService.getOne(new LambdaQueryWrapper<BusinessType>()
+			.eq(BusinessType::getTenantId, AuthUtil.getTenantId())
+			.eq(BusinessType::getIsDeleted, 0)
+			.eq(BusinessType::getStatus, 0)
+			.eq(BusinessType::getCode, "PZDH"));
+		if (businessType == null) {
+			throw new RuntimeException("未找到可用业务类型");
+		}
+		BusinessBillNo businessBillNo = new BusinessBillNo();
+		businessBillNo.setBusinessTypeId(businessType.getId());
+		businessBillNo.setCode("PZDH-Z");
+		R clientBillNo = businessBillNoService.getBillNoLos(businessBillNo);
+		if (!clientBillNo.isSuccess()) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			return R.fail(500, "生成订单编号失败");
+		}
+		finVouchers.setBillNo((String) clientBillNo.getData());
+		finVouchers.setVoucherType("转");
+		BusinessBillNo businessBillNo1 = new BusinessBillNo();
+		businessBillNo1.setBusinessTypeId(businessType.getId());
+		businessBillNo1.setCode("转");
+		R voucherNo = businessBillNoService.getVoucherNoLos(businessBillNo1);
+		if (!clientBillNo.isSuccess()) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			throw new RuntimeException("生成凭证号失败");
+		}
+		finVouchers.setVoucherNo((String) voucherNo.getData());
+		finVouchers.setVoucherDate(new Date());
+		this.saveOrUpdate(finVouchers);
+		if (ObjectUtils.isNotNull(finVouchers.getFinVouchersItemsList())) {
+			for (FinVouchersItems item : finVouchers.getFinVouchersItemsList()) {
+				item.setPid(finVouchers.getId());
+			}
+			finVouchersItemsService.saveOrUpdateBatch(finVouchers.getFinVouchersItemsList());
+		}
+		return R.data(finVouchers);
+	}
+
 }