纪新园 2 лет назад
Родитель
Сommit
608d037486
20 измененных файлов с 901 добавлено и 29 удалено
  1. 34 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/dto/FinInvoiceItemDetailDTO.java
  2. 158 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/entity/FinInvoiceItemDetail.java
  3. 7 1
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/entity/FinInvoices.java
  4. 36 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/vo/FinInvoiceItemDetailVO.java
  5. 62 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/dto/FinStlBillsItemsReports.java
  6. 36 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBills.java
  7. 13 3
      blade-service/blade-los/src/main/java/org/springblade/los/basic/corps/controller/CorpsInvoiceHeaderController.java
  8. 153 3
      blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/service/impl/ReportsServiceImpl.java
  9. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  10. 1 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterServiceImpl.java
  11. 126 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/controller/FinInvoiceItemDetailController.java
  12. 20 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/controller/FinInvoicesController.java
  13. 42 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/mapper/FinInvoiceItemDetailMapper.java
  14. 32 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/mapper/FinInvoiceItemDetailMapper.xml
  15. 41 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/IFinInvoiceItemDetailService.java
  16. 14 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/IFinInvoicesService.java
  17. 41 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoiceItemDetailServiceImpl.java
  18. 64 13
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java
  19. 18 9
      blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/controller/FinStlBillsController.java
  20. 1 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/impl/FinStlBillsServiceImpl.java

+ 34 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/dto/FinInvoiceItemDetailDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.finance.invoices.dto;
+
+import org.springblade.los.finance.invoices.entity.FinInvoiceItemDetail;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 业务-发票明细数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2023-12-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FinInvoiceItemDetailDTO extends FinInvoiceItemDetail {
+	private static final long serialVersionUID = 1L;
+
+}

+ 158 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/entity/FinInvoiceItemDetail.java

@@ -0,0 +1,158 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.finance.invoices.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 业务-发票明细实体类
+ *
+ * @author BladeX
+ * @since 2023-12-27
+ */
+@Data
+@TableName("los_fin_invoice_item_detail")
+@ApiModel(value = "FinInvoiceItemDetail对象", description = "业务-发票明细")
+public class FinInvoiceItemDetail implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+	/**
+	 * 主表主键
+	 */
+	@ApiModelProperty(value = "主表主键")
+	private Long pid;
+	/**
+	 * 来源id
+	 */
+	@ApiModelProperty(value = "来源id")
+	private String srcId;
+	/**
+	 * 项目名称id
+	 */
+	@ApiModelProperty(value = "项目名称id")
+	private String serverId;
+	/**
+	 * 规格型号
+	 */
+	@ApiModelProperty(value = "规格型号")
+	private String typeno;
+	/**
+	 * 单位
+	 */
+	@ApiModelProperty(value = "单位")
+	private String unit;
+	/**
+	 * 数量
+	 */
+	@ApiModelProperty(value = "数量")
+	private BigDecimal number;
+	/**
+	 * 单价(含税)
+	 */
+	@ApiModelProperty(value = "单价(含税)")
+	private BigDecimal price;
+	/**
+	 * 金额(含税)
+	 */
+	@ApiModelProperty(value = "金额(含税)")
+	private BigDecimal amount;
+	/**
+	 * 税率
+	 */
+	@ApiModelProperty(value = "税率")
+	private BigDecimal amountRate;
+	/**
+	 * 税额
+	 */
+	@ApiModelProperty(value = "税额")
+	private BigDecimal amountTax;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private String createUserName;
+	/**
+	 * 创建部门
+	 */
+	@ApiModelProperty(value = "创建部门")
+	private Long createDept;
+	/**
+	 * 创建部门
+	 */
+	@ApiModelProperty(value = "创建部门")
+	private String createDeptName;
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private String updateUserName;
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+	/**
+	 * 状态(-1 初始化 0 正常 1停用)
+	 */
+	@ApiModelProperty(value = "状态(-1 初始化 0 正常 1停用)")
+	private Integer status;
+	/**
+	 * 是否已删除(0 否 1是)
+	 */
+	@ApiModelProperty(value = "是否已删除(0 否 1是)")
+	@TableLogic(value = "0", delval = "1")
+	private Integer isDeleted;
+	/**
+	 * 项目
+	 */
+	@ApiModelProperty(value = "项目")
+	private String serverName;
+
+	/**
+	 * 租户
+	 */
+	@ApiModelProperty(value = "租户")
+	private String tenantId;
+
+
+}

+ 7 - 1
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/entity/FinInvoices.java

@@ -480,12 +480,18 @@ public class FinInvoices implements Serializable {
 	private String tenantId;
 
 	/**
-	 * 业务-发明细
+	 * 业务-发费用明细
 	 */
 	@TableField(exist = false)
 	private List<FinInvoicesItems> finInvoicesItemsList;
 
 	/**
+	 * 业务-发票明细
+	 */
+	@TableField(exist = false)
+	private List<FinInvoiceItemDetail> finInvoiceItemDetailList;
+
+	/**
 	 * 编码生成code
 	 */
 	@TableField(exist = false)

+ 36 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/vo/FinInvoiceItemDetailVO.java

@@ -0,0 +1,36 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.finance.invoices.vo;
+
+import org.springblade.los.finance.invoices.entity.FinInvoiceItemDetail;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 业务-发票明细视图实体类
+ *
+ * @author BladeX
+ * @since 2023-12-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "FinInvoiceItemDetailVO对象", description = "业务-发票明细")
+public class FinInvoiceItemDetailVO extends FinInvoiceItemDetail {
+	private static final long serialVersionUID = 1L;
+
+}

+ 62 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/dto/FinStlBillsItemsReports.java

@@ -0,0 +1,62 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.finance.stl.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 业务-财务对账单和结算单明细实体类
+ *
+ * @author BladeX
+ * @since 2023-11-10
+ */
+@Data
+public class FinStlBillsItemsReports implements Serializable {
+
+	/**
+	 * 单据编号
+	 */
+	private String billNo;
+	/**
+	 * MB/L NO
+	 */
+	private String mblno;
+	/**
+	 * 集装箱箱型箱数英文, 1*20GP,2*40HC
+	 */
+	private String quantityCntrTypesDescr;
+
+	/**
+	 * 金额
+	 */
+	private BigDecimal amount;
+
+	/**
+	 * 金额usd
+	 */
+	private BigDecimal amountUsd;
+
+	/**
+	 * 利润
+	 */
+	private BigDecimal amountProfit;
+
+
+}

+ 36 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBills.java

@@ -24,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.los.finance.stl.dto.FinStlBillsItemsReports;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
@@ -113,6 +114,11 @@ public class FinStlBills implements Serializable {
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date billDate;
 	/**
+	 * 对账/结算日期
+	 */
+	@TableField(exist = false)
+	private List<String> billDateList;
+	/**
 	 * 客户 id
 	 */
 	@ApiModelProperty(value = "客户 id")
@@ -482,15 +488,29 @@ public class FinStlBills implements Serializable {
 	 * 预收时间
 	 */
 	@ApiModelProperty(value = "预收时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date estimatedTime;
 
 	/**
+	 * 预收时间
+	 */
+	@TableField(exist = false)
+	private List<String> estimatedTimeList;
+
+	/**
 	 * 财务对账单和结算单明细
 	 */
 	@TableField(exist = false)
 	private List<FinStlBillsItems> finStlBillsItemsList;
 
 	/**
+	 * 明细打印
+	 */
+	@TableField(exist = false)
+	private List<FinStlBillsItemsReports> finStlBillsItemsReportsList;
+
+	/**
 	 * 财务结算单凭证明细
 	 */
 	@TableField(exist = false)
@@ -518,5 +538,21 @@ public class FinStlBills implements Serializable {
 	@TableField(exist = false)
 	private String pageLabel;
 
+	//是否有协议
+	@TableField(exist = false)
+	private String agreement;
+
+	//接单客户
+	@TableField(exist = false)
+	private String billCorpName;
+
+	//客户票结/月结
+	@TableField(exist = false)
+	private String billCorpNameAgreement;
+
+	//欠费金额
+	@TableField(exist = false)
+	private BigDecimal amountOwed;
+
 
 }

+ 13 - 3
blade-service/blade-los/src/main/java/org/springblade/los/basic/corps/controller/CorpsInvoiceHeaderController.java

@@ -16,17 +16,22 @@
  */
 package org.springblade.los.basic.corps.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
+
 import javax.validation.Valid;
 
 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.Func;
+import org.springblade.los.basic.corps.entity.BCorpsBank;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.los.basic.corps.entity.CorpsInvoiceHeader;
@@ -66,7 +71,12 @@ public class CorpsInvoiceHeaderController extends BladeController {
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "分页", notes = "传入corpsInvoiceHeader")
 	public R<IPage<CorpsInvoiceHeader>> list(CorpsInvoiceHeader corpsInvoiceHeader, Query query) {
-		IPage<CorpsInvoiceHeader> pages = corpsInvoiceHeaderService.page(Condition.getPage(query), Condition.getQueryWrapper(corpsInvoiceHeader));
+		LambdaQueryWrapper<CorpsInvoiceHeader> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(CorpsInvoiceHeader::getTenantId, AuthUtil.getTenantId())
+			.eq(CorpsInvoiceHeader::getIsDeleted, 0)
+			.eq(CorpsInvoiceHeader::getPid, corpsInvoiceHeader.getPid())
+			.eq(ObjectUtils.isNotNull(corpsInvoiceHeader.getInvoiceHeader()), CorpsInvoiceHeader::getInvoiceHeader, corpsInvoiceHeader.getInvoiceHeader());
+		IPage<CorpsInvoiceHeader> pages = corpsInvoiceHeaderService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}
 
@@ -111,7 +121,7 @@ public class CorpsInvoiceHeaderController extends BladeController {
 		return R.status(corpsInvoiceHeaderService.saveOrUpdate(corpsInvoiceHeader));
 	}
 
-	
+
 	/**
 	 * 删除 客户发票
 	 */
@@ -122,5 +132,5 @@ public class CorpsInvoiceHeaderController extends BladeController {
 		return R.status(corpsInvoiceHeaderService.removeByIds(Func.toLongList(ids)));
 	}
 
-	
+
 }

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

@@ -33,14 +33,26 @@ import org.springblade.los.basic.reports.service.IReportsService;
 import org.springblade.los.basic.reports.vo.ReportsVO;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.service.IBillsService;
+import org.springblade.los.finance.agreement.entity.AgreementPrice;
+import org.springblade.los.finance.agreement.entity.AgreementPriceItems;
+import org.springblade.los.finance.agreement.service.IAgreementPriceItemsService;
+import org.springblade.los.finance.agreement.service.IAgreementPriceService;
 import org.springblade.los.finance.fee.dto.FeeCenterReports;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
+import org.springblade.los.finance.stl.dto.FinStlBillsItemsReports;
+import org.springblade.los.finance.stl.entity.FinStlBills;
+import org.springblade.los.finance.stl.entity.FinStlBillsItems;
+import org.springblade.los.finance.stl.service.IFinStlBillsItemsService;
+import org.springblade.los.finance.stl.service.IFinStlBillsService;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -61,8 +73,16 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 
 	private final IFeeCenterService feeCenterService;
 
+	private final IFinStlBillsService finStlBillsService;
+
+	private final IFinStlBillsItemsService finStlBillsItemsService;
+
 	private final IBCurrencyService ibCurrencyService;
 
+	private final IAgreementPriceService agreementPriceService;
+
+	private final IAgreementPriceItemsService agreementPriceItemsService;
+
 
 	@Override
 	public IPage<ReportsVO> selectReportsPage(IPage<ReportsVO> page, ReportsVO reports) {
@@ -263,13 +283,13 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 						}
 						bills.setFeeCenterList(feeCenterReportList);
 					}
-					list.add(0,bills);
+					list.add(0, bills);
 				} else if ("MH".equals(bills.getBillType())) {
 					Bills details = billsService.getOne(new LambdaQueryWrapper<Bills>()
 						.eq(Bills::getId, bills.getMasterId())
 						.eq(Bills::getTenantId, AuthUtil.getTenantId())
 						.eq(Bills::getIsDeleted, 0));
-					if (details != null){
+					if (details != null) {
 						List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 							.eq(FeeCenter::getPid, bills.getId())
 							.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
@@ -401,7 +421,7 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 							feeCenterReportList.add(feeCenterReports);
 						}
 						details.setFeeCenterList(feeCenterReportList);
-						list.add(0,details);
+						list.add(0, details);
 					}
 				}
 				map.put("data", list);
@@ -653,8 +673,138 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 			} else {
 				map.put("data", null);
 			}
+		} else if ("付费申请".equals(reportCode) && "付费申请".equals(groupCode)) {
+			FinStlBills finStlBills = finStlBillsService.getById(billId);
+			if (finStlBills != null) {
+				finStlBills.setBankAccountBank(finStlBills.getBankAccountBank() + "/" + finStlBills.getBankAccountNo());
+				if (agreementPriceService.count(new LambdaQueryWrapper<AgreementPrice>()
+					.eq(AgreementPrice::getTenantId, AuthUtil.getTenantId())
+					.eq(AgreementPrice::getIsDeleted, 0)
+					.eq(AgreementPrice::getStatus, 0)
+					.eq(AgreementPrice::getCorpId, finStlBills.getCorpId())) > 0) {
+					finStlBills.setAgreement("是");
+				} else {
+					finStlBills.setAgreement("否");
+				}
+				BigDecimal amountC = new BigDecimal("0.00");
+				BigDecimal amountD = new BigDecimal("0.00");
+				List<FeeCenter> feeCenterListC = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getDc, "C")
+					.eq(FeeCenter::getAccStatus, "1")
+					.apply("amount != stl_ttl_amount")
+					.eq(FeeCenter::getCorpId, finStlBills.getCorpId()));
+				if (feeCenterListC.size() > 0) {
+					amountC = feeCenterListC.stream().map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+				}
+				List<FeeCenter> feeCenterListD = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getDc, "D")
+					.eq(FeeCenter::getAccStatus, "1")
+					.apply("amount != stl_ttl_amount")
+					.eq(FeeCenter::getCorpId, finStlBills.getCorpId()));
+				if (feeCenterListD.size() > 0) {
+					amountD = feeCenterListD.stream().map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+				}
+				finStlBills.setAmountOwed(amountC.subtract(amountD));
+				List<FinStlBillsItemsReports> finStlBillsItemsReportsList = new ArrayList<>();
+				LambdaQueryWrapper<FinStlBillsItems> lambdaQueryWrapper = new LambdaQueryWrapper<FinStlBillsItems>()
+					.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
+					.eq(FinStlBillsItems::getIsDeleted, 0)
+					.eq(FinStlBillsItems::getPid, finStlBills.getId());
+				List<FinStlBillsItems> finStlBillsItems = finStlBillsItemsService.list(lambdaQueryWrapper);
+				if (finStlBillsItems.size() > 0) {
+					List<FinStlBillsItems> reducelList = finStlBillsItems.stream().filter(distinctByKey(FinStlBillsItems::getMblno)).collect(Collectors.toList());
+					List<Bills> billsList = new ArrayList<>();
+					if (reducelList.size() > 0) {
+						String mblno = reducelList.stream().map(FinStlBillsItems::getMblno).collect(Collectors.joining(","));
+						billsList = billsService.list(new LambdaQueryWrapper<Bills>()
+							.eq(Bills::getTenantId, AuthUtil.getTenantId())
+							.eq(Bills::getIsDeleted, 0)
+							.apply("find_in_set(mblno,'" + mblno + "')"));
+
+						if (billsList.size() > 0) {
+							List<Long> billCorpId = billsList.stream().map(Bills::getCorpId).distinct().collect(Collectors.toList());
+							List<AgreementPriceItems> agreementPriceItemsList = new ArrayList<>();
+							List<AgreementPrice> agreementPriceList = agreementPriceService.list(new LambdaQueryWrapper<AgreementPrice>()
+								.eq(AgreementPrice::getTenantId, AuthUtil.getTenantId())
+								.eq(AgreementPrice::getIsDeleted, 0)
+								.eq(AgreementPrice::getStatus, 0)
+								.in(AgreementPrice::getCorpId, billCorpId));
+							if (agreementPriceList.size() > 0) {
+								List<Long> ids = agreementPriceList.stream().map(AgreementPrice::getId).collect(Collectors.toList());
+								agreementPriceItemsList = agreementPriceItemsService.list(new LambdaQueryWrapper<AgreementPriceItems>()
+									.eq(AgreementPriceItems::getTenantId, AuthUtil.getTenantId())
+									.eq(AgreementPriceItems::getIsDeleted, 0)
+									.eq(AgreementPriceItems::getStatus, 0)
+									.in(AgreementPriceItems::getPid, ids));
+							}
+							StringBuilder billCorpName = new StringBuilder();
+							StringBuilder billCorpNameAgreement = new StringBuilder();
+							for (Bills item : billsList) {
+								billCorpName.append(item.getCorpCnName()).append("/");
+								AgreementPrice agreementPrice = agreementPriceList.stream().filter(e -> e.getCorpId().equals(item.getCorpId())).findFirst().orElse(null);
+								if (agreementPrice != null) {
+									AgreementPriceItems agreementPriceItems = agreementPriceItemsList.stream().filter(e -> e.getPid().equals(agreementPrice.getId())).findFirst().orElse(null);
+									if (agreementPriceItems != null) {
+										billCorpNameAgreement.append(agreementPriceItems.getSettlementPeriodName()).append("/");
+									} else {
+										billCorpNameAgreement.append("无").append("/");
+									}
+								} else {
+									billCorpNameAgreement.append("无").append("/");
+								}
+							}
+							finStlBills.setBillCorpName(billCorpName.toString());
+							finStlBills.setBillCorpNameAgreement(billCorpNameAgreement.toString());
+						}
+					}
+					for (FinStlBillsItems item : reducelList) {
+						FinStlBillsItemsReports finStlBillsItemsReports = new FinStlBillsItemsReports();
+						finStlBillsItemsReports.setQuantityCntrTypesDescr(item.getQuantityCntrTypesDescr());
+						finStlBillsItemsReports.setMblno(item.getMblno());
+						finStlBillsItemsReports.setBillNo(item.getBillNo());
+						BigDecimal currentStlAmountD = finStlBillsItems.stream()
+							.filter(e -> e.getMblno().equals(item.getMblno()) && "D".equals(e.getDc()) && "CNY".equals(e.getCurCode()))
+							.map(FinStlBillsItems::getCurrentStlAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal currentStlAmountC = finStlBillsItems.stream()
+							.filter(e -> e.getMblno().equals(item.getMblno()) && "C".equals(e.getDc()) && "CNY".equals(e.getCurCode()))
+							.map(FinStlBillsItems::getCurrentStlAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal currentStlAmountUsdD = finStlBillsItems.stream()
+							.filter(e -> e.getMblno().equals(item.getMblno()) && "D".equals(e.getDc()) && "USD".equals(e.getCurCode()))
+							.map(FinStlBillsItems::getCurrentStlAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal currentStlAmountUsdC = finStlBillsItems.stream()
+							.filter(e -> e.getMblno().equals(item.getMblno()) && "C".equals(e.getDc()) && "USD".equals(e.getCurCode()))
+							.map(FinStlBillsItems::getCurrentStlAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+						finStlBillsItemsReports.setAmount(currentStlAmountC.subtract(currentStlAmountD).abs());
+						finStlBillsItemsReports.setAmountUsd(currentStlAmountUsdC.subtract(currentStlAmountUsdD).abs());
+						if (billsList.size() > 0) {
+							Bills bills = billsList.stream().filter(e -> e.getMblno().equals(item.getMblno())).findFirst().orElse(null);
+							if (bills != null) {
+								finStlBillsItemsReports.setAmountProfit(bills.getAmountCrLoc().subtract(bills.getAmountDrLoc()));
+							}
+						} else {
+							finStlBillsItemsReports.setAmountProfit(new BigDecimal("0.00"));
+						}
+						finStlBillsItemsReportsList.add(finStlBillsItemsReports);
+					}
+				}
+				finStlBills.setAmountSubLoc(finStlBills.getAmountSubLoc().abs());
+				finStlBills.setFinStlBillsItemsReportsList(finStlBillsItemsReportsList);
+				map.put("data", finStlBills);
+			} else {
+				map.put("data", null);
+			}
 		}
 		return R.data(map);
 	}
 
+
+	private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
+		Set<Object> seen = ConcurrentHashMap.newKeySet();
+		return t -> seen.add(keyExtractor.apply(t));
+	}
+
 }

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

@@ -313,6 +313,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				item.setPayplace(bills.getMpayplace());
 				item.setRefno(bills.getRefno());
 				item.setBookingNo(bills.getBookingNo());
+				item.setCntrNo(bills.getQuantityCntrTypesDescr());
 				if ("USD".equals(item.getCurCode())) {
 					amountCrUsd = amountCrUsd.add(item.getAmount());
 				} else if ("CNY".equals(item.getCurCode())) {
@@ -361,6 +362,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				item.setPayplace(bills.getMpayplace());
 				item.setRefno(bills.getRefno());
 				item.setBookingNo(bills.getBookingNo());
+				item.setCntrNo(bills.getQuantityCntrTypesDescr());
 				if ("USD".equals(item.getCurCode())) {
 					amountDrUsd = amountDrUsd.add(item.getAmount());
 				} else if ("CNY".equals(item.getCurCode())) {

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

@@ -190,6 +190,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 				feeCenter.setElementsCode(items.getElementsCode());
 
 				feeCenter.setPid(bills.getId());
+				feeCenter.setCntrNo(bills.getQuantityCntrTypesDescr());
 				feeCenter.setBillNo(bills.getBillNo());
 				feeCenter.setBusinessType(bills.getBusinessType());
 				feeCenter.setBillType(bills.getBillType());

+ 126 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/controller/FinInvoiceItemDetailController.java

@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.finance.invoices.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+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.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.los.finance.invoices.entity.FinInvoiceItemDetail;
+import org.springblade.los.finance.invoices.vo.FinInvoiceItemDetailVO;
+import org.springblade.los.finance.invoices.service.IFinInvoiceItemDetailService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 业务-发票明细 控制器
+ *
+ * @author BladeX
+ * @since 2023-12-27
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/fininvoiceitemdetail")
+@Api(value = "业务-发票明细", tags = "业务-发票明细接口")
+public class FinInvoiceItemDetailController extends BladeController {
+
+	private final IFinInvoiceItemDetailService finInvoiceItemDetailService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入finInvoiceItemDetail")
+	public R<FinInvoiceItemDetail> detail(FinInvoiceItemDetail finInvoiceItemDetail) {
+		FinInvoiceItemDetail detail = finInvoiceItemDetailService.getOne(Condition.getQueryWrapper(finInvoiceItemDetail));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 业务-发票明细
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入finInvoiceItemDetail")
+	public R<IPage<FinInvoiceItemDetail>> list(FinInvoiceItemDetail finInvoiceItemDetail, Query query) {
+		IPage<FinInvoiceItemDetail> pages = finInvoiceItemDetailService.page(Condition.getPage(query), Condition.getQueryWrapper(finInvoiceItemDetail));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 业务-发票明细
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入finInvoiceItemDetail")
+	public R<IPage<FinInvoiceItemDetailVO>> page(FinInvoiceItemDetailVO finInvoiceItemDetail, Query query) {
+		IPage<FinInvoiceItemDetailVO> pages = finInvoiceItemDetailService.selectFinInvoiceItemDetailPage(Condition.getPage(query), finInvoiceItemDetail);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 业务-发票明细
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入finInvoiceItemDetail")
+	public R save(@Valid @RequestBody FinInvoiceItemDetail finInvoiceItemDetail) {
+		return R.status(finInvoiceItemDetailService.save(finInvoiceItemDetail));
+	}
+
+	/**
+	 * 修改 业务-发票明细
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入finInvoiceItemDetail")
+	public R update(@Valid @RequestBody FinInvoiceItemDetail finInvoiceItemDetail) {
+		return R.status(finInvoiceItemDetailService.updateById(finInvoiceItemDetail));
+	}
+
+	/**
+	 * 新增或修改 业务-发票明细
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入finInvoiceItemDetail")
+	public R submit(@Valid @RequestBody FinInvoiceItemDetail finInvoiceItemDetail) {
+		return R.status(finInvoiceItemDetailService.saveOrUpdate(finInvoiceItemDetail));
+	}
+
+	
+	/**
+	 * 删除 业务-发票明细
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(finInvoiceItemDetailService.removeByIds(Func.toLongList(ids)));
+	}
+
+	
+}

+ 20 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/controller/FinInvoicesController.java

@@ -217,5 +217,25 @@ public class FinInvoicesController extends BladeController {
 		return R.success("操作成功");
 	}
 
+	/**
+	 * 生成发票信息
+	 */
+	@PostMapping("/generateFinInvoicesDetail")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入finInvoices")
+	public R generateFinInvoicesDetail(@Valid @RequestBody FinInvoices finInvoices) {
+		return finInvoicesService.generateFinInvoicesDetail(finInvoices);
+	}
+
+	/**
+	 * 撤销发票信息
+	 */
+	@PostMapping("/revokeFinInvoicesDetail")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入finInvoices")
+	public R revokeFinInvoicesDetail(@Valid @RequestBody FinInvoices finInvoices) {
+		return finInvoicesService.revokeFinInvoicesDetail(finInvoices);
+	}
+
 
 }

+ 42 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/mapper/FinInvoiceItemDetailMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.finance.invoices.mapper;
+
+import org.springblade.los.finance.invoices.entity.FinInvoiceItemDetail;
+import org.springblade.los.finance.invoices.vo.FinInvoiceItemDetailVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 业务-发票明细 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2023-12-27
+ */
+public interface FinInvoiceItemDetailMapper extends BaseMapper<FinInvoiceItemDetail> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param finInvoiceItemDetail
+	 * @return
+	 */
+	List<FinInvoiceItemDetailVO> selectFinInvoiceItemDetailPage(IPage page, FinInvoiceItemDetailVO finInvoiceItemDetail);
+
+}

+ 32 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/mapper/FinInvoiceItemDetailMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.los.finance.invoices.mapper.FinInvoiceItemDetailMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="finInvoiceItemDetailResultMap" type="org.springblade.los.finance.invoices.entity.FinInvoiceItemDetail">
+        <id column="id" property="id"/>
+        <result column="pid" property="pid"/>
+        <result column="server_id" property="serverId"/>
+        <result column="typeno" property="typeno"/>
+        <result column="unit" property="unit"/>
+        <result column="number" property="number"/>
+        <result column="price" property="price"/>
+        <result column="amount" property="amount"/>
+        <result column="amount_rate" property="amountRate"/>
+        <result column="amount_tax" property="amountTax"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="server_name" property="serverName"/>
+    </resultMap>
+
+
+    <select id="selectFinInvoiceItemDetailPage" resultMap="finInvoiceItemDetailResultMap">
+        select * from los_fin_invoice_item_detail where is_deleted = 0
+    </select>
+
+</mapper>

+ 41 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/IFinInvoiceItemDetailService.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.finance.invoices.service;
+
+import org.springblade.los.finance.invoices.entity.FinInvoiceItemDetail;
+import org.springblade.los.finance.invoices.vo.FinInvoiceItemDetailVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 业务-发票明细 服务类
+ *
+ * @author BladeX
+ * @since 2023-12-27
+ */
+public interface IFinInvoiceItemDetailService extends IService<FinInvoiceItemDetail> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param finInvoiceItemDetail
+	 * @return
+	 */
+	IPage<FinInvoiceItemDetailVO> selectFinInvoiceItemDetailPage(IPage<FinInvoiceItemDetailVO> page, FinInvoiceItemDetailVO finInvoiceItemDetail);
+
+}

+ 14 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/IFinInvoicesService.java

@@ -85,4 +85,18 @@ public interface IFinInvoicesService extends IService<FinInvoices> {
 	void passCancel(Long id);
 
 	FinInvoices approveDetail(FinInvoices finInvoices);
+
+	/**
+	 * 生成发票信息
+	 * @param finInvoices
+	 * @return
+	 */
+	R generateFinInvoicesDetail(FinInvoices finInvoices);
+
+	/**
+	 * 撤销发票信息
+	 * @param finInvoices
+	 * @return
+	 */
+	R revokeFinInvoicesDetail(FinInvoices finInvoices);
 }

+ 41 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoiceItemDetailServiceImpl.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.finance.invoices.service.impl;
+
+import org.springblade.los.finance.invoices.entity.FinInvoiceItemDetail;
+import org.springblade.los.finance.invoices.vo.FinInvoiceItemDetailVO;
+import org.springblade.los.finance.invoices.mapper.FinInvoiceItemDetailMapper;
+import org.springblade.los.finance.invoices.service.IFinInvoiceItemDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 业务-发票明细 服务实现类
+ *
+ * @author BladeX
+ * @since 2023-12-27
+ */
+@Service
+public class FinInvoiceItemDetailServiceImpl extends ServiceImpl<FinInvoiceItemDetailMapper, FinInvoiceItemDetail> implements IFinInvoiceItemDetailService {
+
+	@Override
+	public IPage<FinInvoiceItemDetailVO> selectFinInvoiceItemDetailPage(IPage<FinInvoiceItemDetailVO> page, FinInvoiceItemDetailVO finInvoiceItemDetail) {
+		return page.setRecords(baseMapper.selectFinInvoiceItemDetailPage(page, finInvoiceItemDetail));
+	}
+
+}

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

@@ -30,17 +30,15 @@ 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.sea.entity.Bills;
-import org.springblade.los.business.sea.mapper.BillsMapper;
-import org.springblade.los.check.service.IAuditPathsActsService;
-import org.springblade.los.check.service.IAuditPathsLevelsService;
-import org.springblade.los.check.service.IAuditProecessService;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.entity.FinAccBills;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
 import org.springblade.los.finance.fee.service.IFinAccBillsService;
+import org.springblade.los.finance.invoices.entity.FinInvoiceItemDetail;
 import org.springblade.los.finance.invoices.entity.FinInvoices;
 import org.springblade.los.finance.invoices.entity.FinInvoicesItems;
 import org.springblade.los.finance.invoices.mapper.FinInvoicesMapper;
+import org.springblade.los.finance.invoices.service.IFinInvoiceItemDetailService;
 import org.springblade.los.finance.invoices.service.IFinInvoicesItemsService;
 import org.springblade.los.finance.invoices.service.IFinInvoicesService;
 import org.springblade.los.finance.invoices.vo.FinInvoicesVO;
@@ -81,13 +79,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 
 	private final IFinAccBillsService finAccBillsService;
 
-	private final BillsMapper billsMapper;
-
-	private final IAuditPathsActsService auditPathsActsService;
-
-	private final IAuditPathsLevelsService auditPathsLevelsService;
-
-	private final IAuditProecessService auditProecessService;
+	private final IFinInvoiceItemDetailService finInvoiceItemDetailService;
 
 	@Override
 	public IPage<FinInvoicesVO> selectFinInvoicesPage(IPage<FinInvoicesVO> page, FinInvoicesVO finInvoices) {
@@ -212,6 +204,11 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 			.eq(FinInvoicesItems::getTenantId, AuthUtil.getTenantId())
 			.eq(FinInvoicesItems::getPid, detail.getId())
 		));
+		detail.setFinInvoiceItemDetailList(finInvoiceItemDetailService.list(new LambdaQueryWrapper<FinInvoiceItemDetail>()
+			.eq(FinInvoiceItemDetail::getIsDeleted, 0)
+			.eq(FinInvoiceItemDetail::getTenantId, AuthUtil.getTenantId())
+			.eq(FinInvoiceItemDetail::getPid, detail.getId())
+		));
 		return detail;
 	}
 
@@ -551,7 +548,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		}*/
 		List<FeeCenter> feeCenterList = new ArrayList<>();
 		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
-			for (FinInvoicesItems item: finInvoices.getFinInvoicesItemsList()){
+			for (FinInvoicesItems item : finInvoices.getFinInvoicesItemsList()) {
 				FinAccBills finAccBills = finAccBillsService.getById(item.getAccBillId());
 				if (finAccBills == null) {
 					throw new RuntimeException("未找到账单明细,操作失败");
@@ -616,7 +613,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		}*/
 		List<FeeCenter> feeCenterList = new ArrayList<>();
 		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
-			for (FinInvoicesItems item: finInvoices.getFinInvoicesItemsList()){
+			for (FinInvoicesItems item : finInvoices.getFinInvoicesItemsList()) {
 				FinAccBills finAccBills = finAccBillsService.getById(item.getAccBillId());
 				if (finAccBills == null) {
 					throw new RuntimeException("未找到账单明细,操作失败");
@@ -711,8 +708,62 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				.eq(FinInvoicesItems::getTenantId, AuthUtil.getTenantId())
 				.eq(FinInvoicesItems::getPid, detail.getId())
 			));
+			detail.setFinInvoiceItemDetailList(finInvoiceItemDetailService.list(new LambdaQueryWrapper<FinInvoiceItemDetail>()
+				.eq(FinInvoiceItemDetail::getIsDeleted, 0)
+				.eq(FinInvoiceItemDetail::getTenantId, AuthUtil.getTenantId())
+				.eq(FinInvoiceItemDetail::getPid, detail.getId())
+			));
 		}
 		return detail;
 	}
 
+	@Override
+	public R generateFinInvoicesDetail(FinInvoices finInvoices) {
+		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
+			FinInvoiceItemDetail finInvoiceItemDetail = new FinInvoiceItemDetail();
+			finInvoiceItemDetail.setCreateUser(AuthUtil.getUserId());
+			finInvoiceItemDetail.setCreateUserName(AuthUtil.getUserName());
+			finInvoiceItemDetail.setCreateTime(new Date());
+			finInvoiceItemDetail.setTenantId(AuthUtil.getTenantId());
+			finInvoiceItemDetail.setPid(finInvoices.getId());
+			finInvoiceItemDetail.setNumber(new BigDecimal("1"));
+			BigDecimal amount = finInvoices.getFinInvoicesItemsList().stream().map(FinInvoicesItems::getCurrentAmountLoc).filter(Objects::nonNull)
+				.reduce(BigDecimal.ZERO, BigDecimal::add);
+			finInvoiceItemDetail.setAmount(amount);
+			finInvoiceItemDetail.setPrice(amount);
+			StringBuilder srcIds = new StringBuilder();
+			for (FinInvoicesItems item : finInvoices.getFinInvoicesItemsList()) {
+				srcIds.append(item.getId()).append(",");
+				item.setStatus(1);
+				item.setUpdateTime(new Date());
+				item.setUpdateUser(AuthUtil.getUserId());
+				item.setUpdateUserName(AuthUtil.getUserName());
+			}
+			if (srcIds.length() > 0) {
+				finInvoiceItemDetail.setSrcId(srcIds.substring(0, srcIds.length() - 1));
+			}
+			finInvoicesItemsService.saveOrUpdateBatch(finInvoices.getFinInvoicesItemsList());
+			finInvoiceItemDetailService.saveOrUpdate(finInvoiceItemDetail);
+			return R.data(finInvoiceItemDetail);
+		} else {
+			throw new RuntimeException("请选择费用明细");
+		}
+	}
+
+	@Override
+	public R revokeFinInvoicesDetail(FinInvoices finInvoices) {
+		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
+			for (FinInvoicesItems item : finInvoices.getFinInvoicesItemsList()) {
+				item.setStatus(0);
+				item.setUpdateTime(new Date());
+				item.setUpdateUser(AuthUtil.getUserId());
+				item.setUpdateUserName(AuthUtil.getUserName());
+			}
+			finInvoicesItemsService.saveOrUpdateBatch(finInvoices.getFinInvoicesItemsList());
+			return R.data(finInvoices.getFinInvoicesItemsList());
+		} else {
+			throw new RuntimeException("请选择费用明细");
+		}
+	}
+
 }

+ 18 - 9
blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/controller/FinStlBillsController.java

@@ -31,6 +31,7 @@ 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.Func;
+import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.finance.stl.entity.FinStlBills;
 import org.springblade.los.finance.stl.service.IFinStlBillsService;
 import org.springblade.los.finance.stl.vo.FinStlBillsVO;
@@ -74,6 +75,8 @@ public class FinStlBillsController extends BladeController {
 		lambdaQueryWrapper.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
 			.eq(FinStlBills::getIsDeleted, 0)
 			.like(ObjectUtils.isNotNull(finStlBills.getBillNo()), FinStlBills::getBillNo, finStlBills.getBillNo())
+			.like(ObjectUtils.isNotNull(finStlBills.getRemarks()), FinStlBills::getRemarks, finStlBills.getRemarks())
+			.like(ObjectUtils.isNotNull(finStlBills.getCollectionSituation()), FinStlBills::getCollectionSituation, finStlBills.getCollectionSituation())
 			.eq(ObjectUtils.isNotNull(finStlBills.getBusinessType()), FinStlBills::getBusinessType, finStlBills.getBusinessType())
 			.eq(ObjectUtils.isNotNull(finStlBills.getBusinessTypes()), FinStlBills::getBusinessTypes, finStlBills.getBusinessTypes())
 			.like(ObjectUtils.isNotNull(finStlBills.getBusinessNo()), FinStlBills::getBusinessNo, finStlBills.getBusinessNo())
@@ -84,6 +87,8 @@ public class FinStlBillsController extends BladeController {
 			.like(ObjectUtils.isNotNull(finStlBills.getSalesName()), FinStlBills::getSalesName, finStlBills.getSalesName())
 			.eq(ObjectUtils.isNotNull(finStlBills.getDc()), FinStlBills::getDc, finStlBills.getDc())
 			.eq(ObjectUtils.isNotNull(finStlBills.getCurCode()), FinStlBills::getCurCode, finStlBills.getCurCode())
+			.and(ObjectUtils.isNotNull(finStlBills.getVesselCnName()), i -> i.like(FinStlBills::getVesselCnName, finStlBills.getVesselCnName()).or()
+				.like(FinStlBills::getVesselEnName, finStlBills.getVesselCnName()))
 			.like(ObjectUtils.isNotNull(finStlBills.getVoyageNo()), FinStlBills::getVoyageNo, finStlBills.getVoyageNo())
 			.like(ObjectUtils.isNotNull(finStlBills.getMblno()), FinStlBills::getMblno, finStlBills.getMblno())
 			.like(ObjectUtils.isNotNull(finStlBills.getHblno()), FinStlBills::getHblno, finStlBills.getHblno())
@@ -94,15 +99,19 @@ public class FinStlBillsController extends BladeController {
 			.eq((ObjectUtils.isNotNull(finStlBills.getIsCleared()) && finStlBills.getIsCleared() != 0), FinStlBills::getIsCleared, finStlBills.getIsCleared())
 			.eq((ObjectUtils.isNotNull(finStlBills.getIsInvoice()) && finStlBills.getIsInvoice() != 0), FinStlBills::getIsInvoice, finStlBills.getIsInvoice())
 			.like(ObjectUtils.isNotNull(finStlBills.getVoucherNo()), FinStlBills::getVoucherNo, finStlBills.getVoucherNo())
-
-			.eq(ObjectUtils.isNotNull(finStlBills.getCorpCnName()), FinStlBills::getCorpCnName, finStlBills.getCorpCnName())
+			.and(ObjectUtils.isNotNull(finStlBills.getCorpCnName()), i -> i.like(FinStlBills::getCorpCnName, finStlBills.getCorpCnName()).or()
+				.like(FinStlBills::getCorpEnName, finStlBills.getCorpCnName()))
 			.eq(ObjectUtils.isNotNull(finStlBills.getFeeCnName()), FinStlBills::getFeeCnName, finStlBills.getFeeCnName())
-			.eq(ObjectUtils.isNotNull(finStlBills.getVesselCnName()), FinStlBills::getVesselCnName, finStlBills.getVesselCnName())
-
-			.eq(ObjectUtils.isNotNull(finStlBills.getVoucherDate()), FinStlBills::getVoucherDate, finStlBills.getVoucherDate())
-			.eq(ObjectUtils.isNotNull(finStlBills.getBillDate()), FinStlBills::getBillDate, finStlBills.getBillDate())
-
-			.orderByDesc(FinStlBills::getCreateTime);
+			.eq(ObjectUtils.isNotNull(finStlBills.getVoucherDate()), FinStlBills::getVoucherDate, finStlBills.getVoucherDate());
+		if (ObjectUtils.isNotNull(finStlBills.getBillDateList()) && finStlBills.getBillDateList().size() > 0) {
+			lambdaQueryWrapper.ge(FinStlBills::getBillDate, finStlBills.getBillDateList().get(0));
+			lambdaQueryWrapper.le(FinStlBills::getBillDate, finStlBills.getBillDateList().get(1));
+		}
+		if (ObjectUtils.isNotNull(finStlBills.getEstimatedTimeList()) && finStlBills.getEstimatedTimeList().size() > 0) {
+			lambdaQueryWrapper.ge(FinStlBills::getEstimatedTime, finStlBills.getEstimatedTimeList().get(0));
+			lambdaQueryWrapper.le(FinStlBills::getEstimatedTime, finStlBills.getEstimatedTimeList().get(1));
+		}
+		lambdaQueryWrapper.orderByDesc(FinStlBills::getCreateTime);
 		IPage<FinStlBills> pages = finStlBillsService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}
@@ -292,7 +301,7 @@ public class FinStlBillsController extends BladeController {
 	@ApiOperationSupport(order = 16)
 	@RepeatSubmit
 	public R generateFinStlBills(@RequestParam("billId") String billId, @RequestParam("dc") String dc) {
-		return finStlBillsService.generateFinStlBills(billId,dc);
+		return finStlBillsService.generateFinStlBills(billId, dc);
 	}
 
 

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

@@ -162,6 +162,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				return R.fail(500, "生成订单编号失败");
 			}
 			finStlBills.setBillNo((String) clientBillNo.getData());
+			finStlBills.setBillDate(new Date());
 			finStlBills.setCreateTime(new Date());
 			finStlBills.setCreateUser(AuthUtil.getUserId());
 			finStlBills.setCreateUserName(AuthUtil.getUserName());