纪新园 1 год назад
Родитель
Сommit
c266ae26cd
13 измененных файлов с 724 добавлено и 73 удалено
  1. 3 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/acc/entity/Accounts.java
  2. 21 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/genleg/dto/PeriodVouchersAccItems.java
  3. 30 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/genleg/dto/PeriodVouchersTemplate.java
  4. 23 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/genleg/entity/FinPeriod.java
  5. 1 0
      blade-service/blade-data/src/main/java/org/springblade/data/michelinApi/service/impl/MichelinServiceImpl.java
  6. 13 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/acc/controller/AccountsController.java
  7. 3 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/acc/service/IAccountsService.java
  8. 33 4
      blade-service/blade-los/src/main/java/org/springblade/los/basic/acc/service/impl/AccountsServiceImpl.java
  9. 22 4
      blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/controller/FinPeriodController.java
  10. 8 1
      blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/service/IFinPeriodService.java
  11. 439 45
      blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/service/impl/FinPeriodServiceImpl.java
  12. 92 8
      blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/impl/FinVouchersServiceImpl.java
  13. 36 11
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java

+ 3 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/acc/entity/Accounts.java

@@ -372,4 +372,7 @@ public class Accounts implements Serializable {
 
 	@TableField(exist = false)
 	private String count;
+
+	@TableField(exist = false)
+	private String type;
 }

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

@@ -0,0 +1,21 @@
+package org.springblade.los.finance.genleg.dto;
+
+import lombok.Data;
+
+/**
+ * @author :jixinyuan
+ * @date ;2024/5/21
+ */
+@Data
+public class PeriodVouchersAccItems {
+
+	private String id;
+	private String accID;
+	private String accNo;
+	private String cnm;
+	private String fnm;
+	private String dc;
+	private String fcyNo;
+	private String selected;
+
+}

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

@@ -0,0 +1,30 @@
+package org.springblade.los.finance.genleg.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author :jixinyuan
+ * @date : 2024/5/21
+ */
+@Data
+public class PeriodVouchersTemplate {
+
+
+	private String id;
+	private String vkno;
+	private String bsType;
+	private String plAccID;
+	private String plAccNo;
+	private String plAccCnm;
+	private String plAccFnm;
+	private String descr;
+	private String remark;
+	private String date;
+	private Integer status;
+	private BigDecimal exrate;
+	private List<PeriodVouchersAccItems> accItems;
+
+}

+ 23 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/genleg/entity/FinPeriod.java

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.los.finance.genleg.dto.PeriodVouchersTemplate;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -163,5 +164,27 @@ public class FinPeriod implements Serializable {
 	@ApiModelProperty(value = "是否锁定")
 	private Integer lockingStatus;
 
+	/**
+	 * 汇兑损益模版
+	 */
+	@ApiModelProperty(value = "汇兑损益模版")
+	private String exchange;
+
+	/**
+	 * 期间损益模版
+	 */
+	@ApiModelProperty(value = "期间损益模版")
+	private String period;
+
+	@TableField(exist = false)
+	private String periodDate;
+
+	@TableField(exist = false)
+	private String type;
+
+	@TableField(exist = false)
+	private PeriodVouchersTemplate periodVouchersTemplate;
+
+
 
 }

+ 1 - 0
blade-service/blade-data/src/main/java/org/springblade/data/michelinApi/service/impl/MichelinServiceImpl.java

@@ -76,6 +76,7 @@ public class MichelinServiceImpl implements IMichelinService {
 										res = externalOrderService.save(order);
 										System.out.println("==============保存数据是否成功:===============" + res);
 									}else{
+										res = false;
 										System.out.println("==============废弃数据:===============" + order);
 									}
 								}

+ 13 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/acc/controller/AccountsController.java

@@ -37,6 +37,7 @@ import org.springblade.los.basic.acc.entity.Accounts;
 import org.springblade.los.basic.acc.service.IAccountsService;
 import org.springblade.los.basic.acc.vo.AccountsDetail;
 import org.springblade.los.basic.acc.vo.AccountsVO;
+import org.springblade.los.finance.genleg.dto.PeriodVouchersAccItems;
 import org.springblade.los.finance.vouchers.entity.FinVouchersItems;
 import org.springblade.los.finance.vouchers.service.IFinVouchersItemsService;
 import org.springframework.web.bind.annotation.*;
@@ -208,4 +209,16 @@ public class AccountsController extends BladeController {
 		return R.data(pages);
 	}
 
+
+	/**
+	 * 获取科目明细
+	 */
+	@GetMapping("/getAccountsItemsList")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入accounts")
+	public R<List<PeriodVouchersAccItems>> getAccountsItemsList(Accounts accounts) {
+		List<PeriodVouchersAccItems> detail = accountsService.getAccountsItemsList(accounts);
+		return R.data(detail);
+	}
+
 }

+ 3 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/acc/service/IAccountsService.java

@@ -22,6 +22,7 @@ import org.springblade.los.basic.acc.vo.AccountsDetail;
 import org.springblade.los.basic.acc.vo.AccountsVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.los.finance.genleg.dto.PeriodVouchersAccItems;
 
 import java.util.List;
 
@@ -84,4 +85,6 @@ public interface IAccountsService extends IService<Accounts> {
 	Long getAccountsCode(Long code);
 
     IPage<AccountsDetail> accountsDetailsList(IPage<AccountsDetail> page, AccountsDetail accountsDetail);
+
+	List<PeriodVouchersAccItems> getAccountsItemsList(Accounts accounts);
 }

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

@@ -38,6 +38,7 @@ import org.springblade.los.basic.acc.service.IAccItemsOpenblcService;
 import org.springblade.los.basic.acc.service.IAccountsService;
 import org.springblade.los.basic.acc.vo.AccountsDetail;
 import org.springblade.los.basic.acc.vo.AccountsVO;
+import org.springblade.los.finance.genleg.dto.PeriodVouchersAccItems;
 import org.springblade.los.finance.genleg.entity.FinGenleg;
 import org.springblade.los.finance.genleg.mapper.FinGenlegMapper;
 import org.springblade.los.finance.vouchers.entity.FinVouchersItems;
@@ -97,8 +98,8 @@ public class AccountsServiceImpl extends ServiceImpl<AccountsMapper, Accounts> i
 		String branchId = deptUtils.getDeptPid() + "";
 		//获取部门ids对应中文名
 		if (ObjectUtils.isNotNull(deptUtils.getDeptPid())) {
-			deptId = deptUtils.getDeptPid()+"";
-			R<List<String>> res = sysClient.getDeptNames(deptUtils.getDeptPid()+"");
+			deptId = deptUtils.getDeptPid() + "";
+			R<List<String>> res = sysClient.getDeptNames(deptUtils.getDeptPid() + "");
 			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
 				deptName = String.join(",", res.getData());
 			}
@@ -125,9 +126,9 @@ public class AccountsServiceImpl extends ServiceImpl<AccountsMapper, Accounts> i
 			accounts.setCreateUserName(AuthUtil.getUserName());
 			//获取部门ids对应中文名
 			if (ObjectUtils.isNotNull(deptUtils.getDeptPid())) {
-				accounts.setCreateDept(deptUtils.getDeptPid()+"");
+				accounts.setCreateDept(deptUtils.getDeptPid() + "");
 				accounts.setBranchId(branchId);
-				R<List<String>> res = sysClient.getDeptNames(deptUtils.getDeptPid()+"");
+				R<List<String>> res = sysClient.getDeptNames(deptUtils.getDeptPid() + "");
 				if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
 					accounts.setCreateDeptName(deptName);
 				}
@@ -438,6 +439,34 @@ public class AccountsServiceImpl extends ServiceImpl<AccountsMapper, Accounts> i
 		return page.setRecords(accountsDetailList);
 	}
 
+	@Override
+	public List<PeriodVouchersAccItems> getAccountsItemsList(Accounts accounts) {
+		LambdaQueryWrapper<Accounts> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Accounts::getTenantId, AuthUtil.getTenantId())
+			.eq(Accounts::getBranchId, deptUtils.getDeptPid())
+			.eq(Accounts::getIsDetail, 1);
+		if ("1".equals(accounts.getType())) {
+			lambdaQueryWrapper.apply("cur_code != 'CNY'");
+		} else {
+			lambdaQueryWrapper.apply("find_in_set(property,'2,4')");
+		}
+		List<Accounts> accountsList = baseMapper.selectList(lambdaQueryWrapper);
+		List<PeriodVouchersAccItems> list = new ArrayList<>();
+		for (Accounts item : accountsList) {
+			PeriodVouchersAccItems periodVouchersAccItems = new PeriodVouchersAccItems();
+			periodVouchersAccItems.setId(item.getId() + "");
+			periodVouchersAccItems.setAccID(item.getId() + "");
+			periodVouchersAccItems.setAccNo(item.getCode());
+			periodVouchersAccItems.setCnm(item.getCnName());
+			periodVouchersAccItems.setFnm(item.getFullName());
+			periodVouchersAccItems.setDc(item.getDc());
+			periodVouchersAccItems.setFcyNo(item.getCurCode());
+			periodVouchersAccItems.setSelected("true");
+			list.add(periodVouchersAccItems);
+		}
+		return list;
+	}
+
 	private void selectSuperiorCode(Accounts accounts, Long parentId) {
 		Accounts accounts1 = baseMapper.selectById(parentId);
 		if (accounts1 != null) {

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

@@ -28,6 +28,7 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+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;
@@ -56,7 +57,7 @@ public class FinPeriodController extends BladeController {
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "详情", notes = "传入finPeriod")
 	public R<FinPeriod> detail(FinPeriod finPeriod) {
-		FinPeriod detail = finPeriodService.getOne(Condition.getQueryWrapper(finPeriod));
+		FinPeriod detail = finPeriodService.detail(finPeriod);
 		return R.data(detail);
 	}
 
@@ -68,6 +69,9 @@ public class FinPeriodController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入finPeriod")
 	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());
+		}
 		return R.data(pages);
 	}
 
@@ -127,11 +131,18 @@ public class FinPeriodController extends BladeController {
 
 	@PostMapping("/init")
 	@ApiOperationSupport(order = 9)
-	@ApiOperation(value = "初始化期间", notes = "传入periodType, periodSubtype")
+	@ApiOperation(value = "清除选定财务账", notes = "传入periodType, periodSubtype")
 	public R init(@Valid @RequestBody FinPeriod finPeriod) {
 		return finPeriodService.init(finPeriod);
 	}
 
+	@PostMapping("/open")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "开账", notes = "传入periodType, periodSubtype")
+	public R open(@Valid @RequestBody FinPeriod finPeriod) {
+		return finPeriodService.open(finPeriod);
+	}
+
 	@PostMapping("/locking")
 	@ApiOperationSupport(order = 9)
 	@ApiOperation(value = "业务锁定", notes = "传入id")
@@ -149,8 +160,8 @@ public class FinPeriodController extends BladeController {
 	@GetMapping("/currentPeriod")
 	@ApiOperationSupport(order = 10)
 	@ApiOperation(value = "查询当前活动期间", notes = "传入periodType, periodSubtype")
-	public R currentPeriod(FinPeriod finPeriod, Query query) {
-		return finPeriodService.currentPeriod(query, finPeriod);
+	public R currentPeriod(FinPeriod finPeriod) {
+		return finPeriodService.currentPeriod(finPeriod);
 	}
 
 	@PostMapping("/close")
@@ -166,4 +177,11 @@ public class FinPeriodController extends BladeController {
 	public R unclose(@Valid @RequestBody FinPeriod finPeriod) {
 		return finPeriodService.unclose(finPeriod);
 	}
+
+	@PostMapping("/generateVouchers")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "生成凭证", notes = "传入periodVouchersTemplate")
+	public R generateVouchers(@Valid @RequestBody PeriodVouchersTemplate periodVouchersTemplate) {
+		return finPeriodService.generateVouchers(periodVouchersTemplate);
+	}
 }

+ 8 - 1
blade-service/blade-los/src/main/java/org/springblade/los/finance/genleg/service/IFinPeriodService.java

@@ -18,6 +18,7 @@ package org.springblade.los.finance.genleg.service;
 
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.los.finance.genleg.dto.PeriodVouchersTemplate;
 import org.springblade.los.finance.genleg.entity.FinPeriod;
 import org.springblade.los.finance.genleg.vo.FinPeriodVO;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -44,7 +45,7 @@ public interface IFinPeriodService extends IService<FinPeriod> {
 
 	R locking(FinPeriod finPeriod);
 
-	R currentPeriod(Query query,FinPeriod finPeriod);
+	R currentPeriod(FinPeriod finPeriod);
 
 	R close(FinPeriod finPeriod);
 
@@ -53,4 +54,10 @@ public interface IFinPeriodService extends IService<FinPeriod> {
 	R submit(FinPeriod finPeriod);
 
 	R revokeLocking(FinPeriod finPeriod);
+
+	R open(FinPeriod finPeriod);
+
+	FinPeriod detail(FinPeriod finPeriod);
+
+	R generateVouchers(PeriodVouchersTemplate periodVouchersTemplate);
 }

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

@@ -16,16 +16,24 @@
  */
 package org.springblade.los.finance.genleg.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 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.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 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;
@@ -36,18 +44,27 @@ 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.PeriodVouchersAccItems;
+import org.springblade.los.finance.genleg.dto.PeriodVouchersTemplate;
+import org.springblade.los.finance.genleg.entity.FinGenleg;
+import org.springblade.los.finance.genleg.entity.FinGenlegCalc;
 import org.springblade.los.finance.genleg.entity.FinPeriod;
 import org.springblade.los.finance.genleg.mapper.FinPeriodMapper;
+import org.springblade.los.finance.genleg.service.IFinGenlegCalcService;
+import org.springblade.los.finance.genleg.service.IFinGenlegService;
 import org.springblade.los.finance.genleg.service.IFinPeriodService;
 import org.springblade.los.finance.genleg.vo.FinPeriodVO;
 import org.springblade.los.finance.stl.entity.FinStlBills;
 import org.springblade.los.finance.stl.service.IFinStlBillsService;
 import org.springblade.los.finance.vouchers.entity.FinVouchers;
+import org.springblade.los.finance.vouchers.entity.FinVouchersItems;
 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 java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.temporal.TemporalAdjusters;
@@ -83,6 +100,19 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 
 	private final IFinVouchersService finVouchersService;
 
+	private final IFinGenlegCalcService finGenlegCalcService;
+
+	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) {
 		return page.setRecords(baseMapper.selectFinPeriodPage(page, finPeriod));
@@ -92,53 +122,73 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 	@Transactional(rollbackFor = Exception.class)
 	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R init(FinPeriod finPeriod) {
-		String deptId = "";
-		String deptName = "";
-		String branchId = deptUtils.getDeptPid() + "";
-		//获取部门ids对应中文名
-		if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
-			deptId = AuthUtil.getDeptId();
-			R<List<String>> res = sysClient.getDeptNames(AuthUtil.getDeptId());
-			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
-				deptName = String.join(",", res.getData());
-			}
-		}
-		if (baseMapper.selectCount(new LambdaQueryWrapper<FinPeriod>()
+		List<FinPeriod> finPeriodList = baseMapper.selectList(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());
-			} else {
-				LocalDate date = LocalDate.now();
-				finPeriod.setPeriodYear(date.getYear());
-				finPeriod.setPeriodMonth(date.lengthOfMonth());
-				// 获取当前月的第一天
-				LocalDate firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
-				// 获取当前月的最后一天
-				LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
-				finPeriod.setBeginDate(Date.from(firstDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
-				finPeriod.setEndDate(Date.from(lastDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+			.eq(FinPeriod::getBranchId, deptUtils.getDeptPid())
+			.gt(FinPeriod::getBeginDate, finPeriod.getBeginDate())
+		);
+		if (!finPeriodList.isEmpty()) {
+			FinPeriod detail = baseMapper.selectOne(new LambdaQueryWrapper<FinPeriod>()
+				.eq(FinPeriod::getTenantId, AuthUtil.getTenantId())
+				.eq(FinPeriod::getIsDeleted, 0)
+				.eq(FinPeriod::getBranchId, deptUtils.getDeptPid())
+				.eq(FinPeriod::getBeginDate, finPeriod.getBeginDate()));
+			if (detail != null) {
+				List<Long> ids = finPeriodList.stream().map(FinPeriod::getId).filter(id -> !id.equals(detail.getId())).distinct().collect(Collectors.toList());
+				if (!ids.isEmpty()) {
+					baseMapper.deleteBatchIds(ids);
+				}
+				detail.setIsClosed(0);
+				detail.setCloseDate(null);
+				detail.setLockingStatus(0);
+				detail.setUpdateUser(AuthUtil.getUserId());
+				detail.setUpdateUserName(AuthUtil.getUserName());
+				detail.setUpdateTime(new Date());
+				baseMapper.updateById(detail);
 			}
-			finPeriod.setCreateTime(new Date());
-			finPeriod.setCreateUser(AuthUtil.getUserId());
-			finPeriod.setCreateUserName(AuthUtil.getUserName());
-			if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
-				finPeriod.setCreateDept(deptId);
-				finPeriod.setBranchId(branchId);
-				finPeriod.setCreateDeptName(deptName);
+			List<FinVouchers> finVouchersList = finVouchersService.list(new LambdaQueryWrapper<FinVouchers>()
+				.eq(FinVouchers::getTenantId, AuthUtil.getTenantId())
+				.eq(FinVouchers::getIsDeleted, 0)
+				.eq(FinVouchers::getBranchId, deptUtils.getDeptPid())
+				.gt(FinVouchers::getVoucherDate, finPeriod.getBeginDate()));
+			if (!finVouchersList.isEmpty()) {
+				for (FinVouchers item : finVouchersList) {
+					item.setVoucherStatus(0);
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setUpdateUserName(AuthUtil.getUserName());
+					item.setUpdateTime(new Date());
+				}
+				finVouchersService.updateBatchById(finVouchersList);
+			}
+			LocalDate date = finPeriod.getBeginDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+			Integer periodYear = date.getYear();
+			Integer periodMonth = date.lengthOfMonth();
+			List<FinGenlegCalc> finGenlegCalcList = finGenlegCalcService.list(new LambdaQueryWrapper<FinGenlegCalc>()
+				.eq(FinGenlegCalc::getTenantId, AuthUtil.getTenantId())
+				.eq(FinGenlegCalc::getBranchId, deptUtils.getDeptPid())
+				.gt(FinGenlegCalc::getAccyear, periodYear)
+				.ge(FinGenlegCalc::getAccmonth, periodMonth)
+			);
+			if (!finGenlegCalcList.isEmpty()) {
+				List<Long> ids = finGenlegCalcList.stream().map(FinGenlegCalc::getId).distinct().collect(Collectors.toList());
+				if (!ids.isEmpty()) {
+					finGenlegCalcService.removeByIds(ids);
+				}
+			}
+			List<FinGenleg> finGenlegList = finGenlegService.list(new LambdaQueryWrapper<FinGenleg>()
+				.eq(FinGenleg::getTenantId, AuthUtil.getTenantId())
+				.eq(FinGenleg::getBranchId, deptUtils.getDeptPid())
+				.gt(FinGenleg::getAccyear, periodYear)
+				.ge(FinGenleg::getAccmonth, periodMonth)
+			);
+			if (!finGenlegCalcList.isEmpty()) {
+				List<Long> ids = finGenlegList.stream().map(FinGenleg::getId).distinct().collect(Collectors.toList());
+				if (!ids.isEmpty()) {
+					finGenlegService.removeByIds(ids);
+				}
 			}
-		} else {
-			finPeriod.setUpdateUser(AuthUtil.getUserId());
-			finPeriod.setUpdateTime(new Date());
-			finPeriod.setUpdateUserName(AuthUtil.getUserName());
 		}
-		this.saveOrUpdate(finPeriod);
 		return R.data(finPeriod);
 	}
 
@@ -366,8 +416,20 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 	}
 
 	@Override
-	public R currentPeriod(Query query, FinPeriod finPeriod) {
-		return null;
+	public R currentPeriod(FinPeriod finPeriod) {
+		FinPeriod detail = baseMapper.selectOne(new LambdaQueryWrapper<FinPeriod>()
+			.eq(FinPeriod::getTenantId, AuthUtil.getTenantId())
+			.eq(FinPeriod::getIsDeleted, 0)
+			.eq(FinPeriod::getIsClosed, 0)
+		);
+		List<PeriodVouchersTemplate> list = new ArrayList<>();
+		if (detail != null) {
+			PeriodVouchersTemplate exchange = JSONObject.parseObject(detail.getExchange(), PeriodVouchersTemplate.class);
+			list.add(exchange);
+			PeriodVouchersTemplate period = JSONObject.parseObject(detail.getPeriod(), PeriodVouchersTemplate.class);
+			list.add(period);
+		}
+		return R.data(list);
 	}
 
 	@Override
@@ -389,6 +451,14 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 		detail.setUpdateUser(AuthUtil.getUserId());
 		detail.setIsClosed(1);
 		detail.setCloseDate(new Date());
+		if (ObjectUtils.isNotNull(detail.getPeriodVouchersTemplate())) {
+			detail.getPeriodVouchersTemplate().setStatus(detail.getIsClosed());
+			if ("FM-CURRENCY-PL-TRANSFER".equals(detail.getPeriodVouchersTemplate().getBsType())) {
+				detail.setExchange(JSON.toJSONString(detail.getPeriodVouchersTemplate()));
+			} else {
+				detail.setPeriod(JSON.toJSONString(detail.getPeriodVouchersTemplate()));
+			}
+		}
 		baseMapper.updateById(finPeriod);
 
 		List<FinVouchers> finVouchersList = finVouchersService.list(new LambdaQueryWrapper<FinVouchers>()
@@ -421,6 +491,14 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			finPeriodNew.setBeginDate(Date.from(firstDayOfNextMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
 			finPeriodNew.setEndDate(Date.from(lastDayOfNextMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
 		}
+		if (ObjectUtils.isNotNull(detail.getPeriodVouchersTemplate())) {
+			finPeriodNew.setPeriodVouchersTemplate(detail.getPeriodVouchersTemplate());
+			if ("FM-CURRENCY-PL-TRANSFER".equals(detail.getPeriodVouchersTemplate().getBsType())) {
+				finPeriodNew.setExchange(JSON.toJSONString(finPeriodNew.getPeriodVouchersTemplate()));
+			} else {
+				finPeriodNew.setPeriod(JSON.toJSONString(finPeriodNew.getPeriodVouchersTemplate()));
+			}
+		}
 		this.submit(finPeriodNew);
 		return R.data(finPeriod);
 	}
@@ -524,6 +602,17 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 			finPeriod.setUpdateUserName(AuthUtil.getUserName());
 		}
 		this.saveOrUpdate(finPeriod);
+		if (ObjectUtils.isNotNull(finPeriod.getPeriodVouchersTemplate())) {
+			finPeriod.getPeriodVouchersTemplate().setId(finPeriod.getId() + "");
+			finPeriod.getPeriodVouchersTemplate().setStatus(finPeriod.getIsClosed());
+			finPeriod.getPeriodVouchersTemplate().setDate(finPeriod.getPeriodYear() + "-" + finPeriod.getPeriodMonth());
+			if ("FM-CURRENCY-PL-TRANSFER".equals(finPeriod.getPeriodVouchersTemplate().getBsType())) {
+				finPeriod.setExchange(JSON.toJSONString(finPeriod.getPeriodVouchersTemplate()));
+			} else {
+				finPeriod.setPeriod(JSON.toJSONString(finPeriod.getPeriodVouchersTemplate()));
+			}
+		}
+		this.updateById(finPeriod);
 		return R.data(finPeriod);
 	}
 
@@ -544,4 +633,309 @@ public class FinPeriodServiceImpl extends ServiceImpl<FinPeriodMapper, FinPeriod
 		return R.data(finPeriod);
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public R open(FinPeriod finPeriod) {
+		String deptId = "";
+		String deptName = "";
+		String branchId = deptUtils.getDeptPid() + "";
+		//获取部门ids对应中文名
+		if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+			deptId = AuthUtil.getDeptId();
+			R<List<String>> res = sysClient.getDeptNames(AuthUtil.getDeptId());
+			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
+				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 (ObjectUtils.isNotNull(finPeriod.getBeginDate())) {
+			LocalDate date = finPeriod.getBeginDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+			finPeriod.setPeriodYear(date.getYear());
+			finPeriod.setPeriodMonth(date.lengthOfMonth());
+		} else {
+			LocalDate date = LocalDate.now();
+			finPeriod.setPeriodYear(date.getYear());
+			finPeriod.setPeriodMonth(date.lengthOfMonth());
+			// 获取当前月的第一天
+			LocalDate firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
+			// 获取当前月的最后一天
+			LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
+			finPeriod.setBeginDate(Date.from(firstDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+			finPeriod.setEndDate(Date.from(lastDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+		}
+		finPeriod.setCreateTime(new Date());
+		finPeriod.setCreateUser(AuthUtil.getUserId());
+		finPeriod.setCreateUserName(AuthUtil.getUserName());
+		if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+			finPeriod.setCreateDept(deptId);
+			finPeriod.setBranchId(branchId);
+			finPeriod.setCreateDeptName(deptName);
+		}
+		this.saveOrUpdate(finPeriod);
+		return R.data(finPeriod);
+	}
+
+	@Override
+	public FinPeriod detail(FinPeriod finPeriod) {
+		FinPeriod detail = baseMapper.selectById(finPeriod.getId());
+		if (detail != null) {
+			if ("FM-CURRENCY-PL-TRANSFER".equals(finPeriod.getType())) {
+				PeriodVouchersTemplate exchange = JSONObject.parseObject(detail.getExchange(), PeriodVouchersTemplate.class);
+				detail.setPeriodVouchersTemplate(exchange);
+			} else {
+				PeriodVouchersTemplate period = JSONObject.parseObject(detail.getPeriod(), PeriodVouchersTemplate.class);
+				detail.setPeriodVouchersTemplate(period);
+			}
+		}
+		return detail;
+	}
+
+	@Override
+	public R generateVouchers(PeriodVouchersTemplate periodVouchersTemplate) {
+		if (ObjectUtils.isNull(periodVouchersTemplate.getDate())) {
+			throw new RuntimeException("模板数据错误,请联系管理员");
+		}
+		String[] arr = periodVouchersTemplate.getDate().split("-");
+		Integer year = Integer.parseInt(arr[0]);
+		Integer month = Integer.parseInt(arr[1]);
+		if (finVouchersService.count(new LambdaQueryWrapper<FinVouchers>()
+			.eq(FinVouchers::getTenantId, AuthUtil.getTenantId())
+			.eq(FinVouchers::getIsDeleted, 0)
+			.eq(FinVouchers::getAccountYear, year)
+			.eq(FinVouchers::getAccountMonth, month)
+			.eq(FinVouchers::getVoucherType, periodVouchersTemplate.getVkno())
+			.eq(FinVouchers::getVoucherSource, periodVouchersTemplate.getBsType())) > 0) {
+			throw new RuntimeException("凭证已生成,请勿重复生成");
+		}
+		List<PeriodVouchersAccItems> accItems = periodVouchersTemplate.getAccItems();
+		if (accItems.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 = "";
+		String branchId = deptUtils.getDeptPid() + "";
+		//获取部门ids对应中文名
+		if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+			deptId = AuthUtil.getDeptId();
+			R<List<String>> res = sysClient.getDeptNames(AuthUtil.getDeptId());
+			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
+				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();
+		finVouchers.setAccountYear(currentDate.getYear());
+		finVouchers.setAccountMonth(currentDate.getMonthValue());
+		finVouchers.setAccountDay(currentDate.getDayOfMonth());
+		finVouchers.setCreateTime(new Date());
+		finVouchers.setCreateUser(AuthUtil.getUserId());
+		finVouchers.setCreateUserName(AuthUtil.getUserName());
+		finVouchers.setSrcId(Long.parseLong(periodVouchersTemplate.getId()));
+		if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+			finVouchers.setCreateDept(deptId);
+			finVouchers.setBranchId(branchId);
+			finVouchers.setCreateDeptName(deptName);
+		}
+		finVouchersService.save(finVouchers);
+		List<FinVouchersItems> finVouchersItemsList = new ArrayList<>();
+		//获取所需科目列表信息
+		String accountsCode = accItems.stream().map(PeriodVouchersAccItems::getAccNo).collect(Collectors.joining(","));
+		List<Accounts> accountsList = accountsService.list(new LambdaQueryWrapper<Accounts>()
+			.eq(Accounts::getStatus, 0)
+			.apply("find_in_set(code,'" + accountsCode + "')"));
+		if (!accountsList.isEmpty()) {
+			List<Long> ids = accountsList.stream().map(Accounts::getId).collect(Collectors.toList());
+			List<FinGenlegCalc> finGenlegCalcList = finGenlegCalcService.list(new LambdaQueryWrapper<FinGenlegCalc>()
+				.eq(FinGenlegCalc::getTenantId, AuthUtil.getTenantId())
+				.eq(FinGenlegCalc::getBranchId, deptUtils.getDeptPid())
+				.in(FinGenlegCalc::getAccId, ids));
+			/*List<FinGenleg> finGenlegList = finGenlegService.list(new LambdaQueryWrapper<FinGenleg>()
+				.eq(FinGenleg::getTenantId, AuthUtil.getTenantId())
+				.eq(FinGenleg::getBranchId, deptUtils.getDeptPid())
+				.in(FinGenleg::getAccId, ids));*/
+			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);
+				}
+				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;
+						}
+					} else {
+						if (new BigDecimal("0.00").compareTo(amount[count - 1]) != 0) {
+							finVouchersItems.setAmountCr(amount[count - 1]);
+						} else {
+							continue;
+						}
+					}
+				} 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;
+						}
+					} else {
+						if (new BigDecimal("0.00").compareTo(amount[count - 1]) != 0) {
+							finVouchersItems.setAmountCrUsd(amount[count - 1]);
+							finVouchersItems.setAmountCr(finVouchersItems.getAmountCrUsd().multiply(periodVouchersTemplate.getExrate()));
+						} else {
+							continue;
+						}
+					}
+				}
+				//计算借,贷人民币与美金合计人民币金额
+				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());
+					}
+				}
+				finVouchersItems.setIsDept(item.getIsDept());
+				//判断是否核算部门 true 向明细中部门字段复制
+				if (1 == finVouchersItems.getIsDept()) {
+					if (dept != null) {
+						finVouchersItems.setDeptId(dept.getId());
+						finVouchersItems.setDeptName(dept.getDeptName());
+					}
+				}
+				finVouchersItems.setIsEmpl(item.getIsEmpl());
+				//判断是否核算职员 true 向明细中职员字段复制
+				if (1 == finVouchersItems.getIsEmpl()) {
+					if (user != null) {
+						finVouchersItems.setEmplId(user.getId());
+						finVouchersItems.setEmplName(user.getName());
+					} else {
+						if (userSrc != null) {
+							finVouchersItems.setEmplId(userSrc.getId());
+							finVouchersItems.setEmplName(userSrc.getCnName());
+						}
+					}
+				}*/
+				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");
+		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(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(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()))) {
+			finVouchers.setIsForeign(1);
+		}
+		finVouchersService.updateById(finVouchers);
+		return null;
+	}
+
 }

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

@@ -24,6 +24,7 @@ import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.basic.acc.entity.Accounts;
 import org.springblade.los.basic.acc.service.IAccountsService;
@@ -232,8 +233,8 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 				.filter(e -> "USD".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","2")));
-			finVouchers.setAmountCrLoc(amountCrCNY.add(bCurrencyService.converterCny("USD", amountCrUSD, "C","2")));
+			finVouchers.setAmountDrLoc(amountDrCNY.add(bCurrencyService.converterCny("USD", amountDrUSD, "D", "2")));
+			finVouchers.setAmountCrLoc(amountCrCNY.add(bCurrencyService.converterCny("USD", amountCrUSD, "C", "2")));
 		}
 		this.saveOrUpdate(finVouchers);
 		return R.data(finVouchers);
@@ -279,8 +280,18 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 					if (accounts != null) {
 						FinGenleg finGenleg = finGenlegList.stream().filter(e -> e.getAccId().equals(item.getAccountId()) &&
 							e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
-						FinGenlegCalc finGenlegCalc = finGenlegCalcList.stream().filter(e -> e.getAccId().equals(item.getAccountId()) &&
-							e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
+						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())) ||
+									(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);
+						}
 						genlegAccounting(accounts, item, finGenleg, finGenlegCalc);
 						if (finGenlegCalc != null) {
 							finGenlegCalcListNew.add(finGenlegCalc);
@@ -429,6 +440,7 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 			genlegAccountingFor(item, finGenlegP, finGenlegList, finGenlegs);
 		}
 	}
+
 	private void revokeGenlegAccountingFor(FinVouchersItems item, FinGenleg finGenleg, List<FinGenleg> finGenlegList, List<FinGenleg> finGenlegs) {
 		//上期本币余额(CNY)
 		BigDecimal amountLastBlc = finGenleg.getAmountLastBlc();
@@ -518,8 +530,63 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 		if (accounts == null) {
 			throw new RuntimeException("未找到科目信息,记账失败");
 		}
+		FinGenlegCalc finGenlegCalc1 = new FinGenlegCalc();
 		if (finGenleg == null) {
-			throw new RuntimeException("未找总账信息,记账失败");
+			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);
 		}
 		//上期本币余额(CNY)
 		BigDecimal amountLastBlc = finGenleg.getAmountLastBlc();
@@ -599,7 +666,13 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 		finGenleg.setAmountUsdBlc(amountUsdBlc);
 		if (1 == accounts.getIsDept() || 1 == accounts.getIsCorp() || 1 == accounts.getIsEmpl()) {
 			if (finGenlegCalc == null) {
-				throw new RuntimeException("未找项目总账信息,记账失败");
+				finGenlegCalc = finGenlegCalc1;
+			} else {
+				if (!finGenlegCalc.getCorpId().equals(item.getCorpId()) ||
+					!finGenlegCalc.getDeptId().equals(item.getDeptId()) ||
+					!finGenlegCalc.getEmplId().equals(item.getEmplId())) {
+					finGenlegCalc = finGenlegCalc1;
+				}
 			}
 			//上期本币余额(CNY)
 			BigDecimal amountLastBlcCalc = finGenlegCalc.getAmountLastBlc();
@@ -686,6 +759,7 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 			finGenlegCalc.setEmplName(item.getEmplName());
 		}
 	}
+
 	private void revokeGenlegAccounting(Accounts accounts, FinVouchersItems item, FinGenleg finGenleg, FinGenlegCalc finGenlegCalc) {
 		if (accounts == null) {
 			throw new RuntimeException("未找到科目信息,记账失败");
@@ -922,8 +996,18 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 					if (accounts != null) {
 						FinGenleg finGenleg = finGenlegList.stream().filter(e -> e.getAccId().equals(item.getAccountId()) &&
 							e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
-						FinGenlegCalc finGenlegCalc = finGenlegCalcList.stream().filter(e -> e.getAccId().equals(item.getAccountId()) &&
-							e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
+						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())) ||
+									(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);
+						}
 						revokeGenlegAccounting(accounts, item, finGenleg, finGenlegCalc);
 						if (finGenlegCalc != null) {
 							finGenlegCalcListNew.add(finGenlegCalc);

+ 36 - 11
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java

@@ -509,7 +509,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						if ("已取消".equals(items.getStatus())) {
 							items.setBalanceAmount(new BigDecimal("0.00"));
 						} else {
-							if ("TKXS".equals(item.getBsType()) || "TKCG".equals(item.getBsType())) {
+							if ("TKXS".equals(item.getBsType())) {
 								if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0 &&
 									new BigDecimal("0.00").compareTo(items.getFreight()) != 0) {
 									items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("-5.00")));
@@ -523,8 +523,10 @@ public class StatisticsServiceImpl implements IStatisticsService {
 									amount = new BigDecimal("0.00");
 								}
 							} else {
-								if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
-									items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("5.00")));
+								if ("XS".equals(item.getBsType())){
+									if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
+										items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("5.00")));
+									}
 								}
 								if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
 									items.setBalanceAmount(new BigDecimal("0.00"));
@@ -635,16 +637,39 @@ public class StatisticsServiceImpl implements IStatisticsService {
 				if (!saleDetailDtoList.isEmpty()) {
 					BigDecimal amount = item.getPaymentAmountTl();
 					BigDecimal number = saleDetailDtoList.stream().map(SaleDetailDto::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+					number = number.abs();
+					amount = amount.abs();
 					for (SaleDetailDto items : saleDetailDtoList) {
-						if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
-							items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("5.00")));
-						}
-						if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
-							items.setBalanceAmount(amount.subtract(items.getSubTotalMoney()));
-							amount = amount.subtract(items.getSubTotalMoney());
+						if ("已取消".equals(items.getStatus())) {
+							items.setBalanceAmount(new BigDecimal("0.00"));
 						} else {
-							items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
-							amount = new BigDecimal("0.00");
+							if ("TKXS".equals(item.getBsType())) {
+								if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0 &&
+									new BigDecimal("0.00").compareTo(items.getFreight()) != 0) {
+									items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("-5.00")));
+								}
+								items.setFreight(new BigDecimal("0.00").subtract(items.getFreight()));
+								if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
+									items.setBalanceAmount(new BigDecimal("0.00"));
+									amount = amount.subtract(items.getSubTotalMoney().abs());
+								} else {
+									items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
+									amount = new BigDecimal("0.00");
+								}
+							} else {
+								if ("XS".equals(item.getBsType())){
+									if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
+										items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("5.00")));
+									}
+								}
+								if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
+									items.setBalanceAmount(new BigDecimal("0.00"));
+									amount = amount.subtract(items.getSubTotalMoney());
+								} else {
+									items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
+									amount = new BigDecimal("0.00");
+								}
+							}
 						}
 					}
 				}