feat(invoice): 添加发票管理和发票明细管理功能

- 新增 InvoiceController 和 InvoiceDetailController 控制器
- 新增 InvoiceDto、CreateInvoiceDto、UpdateInvoiceDto等数据传输对象
- 新增 InvoiceEntity 和 InvoiceDetailEntity 实体类
- 新增 InvoiceMapper 和 InvoiceDetailMapper 映射接口- 新增 InvoiceRepository 和 InvoiceDetailRepository 仓库接口
- 新增 InvoiceService 和 InvoiceDetailService 服务类
- 新增发票识别和上传功能
This commit is contained in:
2025-02-23 21:27:36 +08:00
parent b7ddbd0a31
commit d7806e882c
18 changed files with 908 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
package cn.lihongjie.coal.invoice.controller;
import cn.lihongjie.coal.annotation.OrgScope;
import cn.lihongjie.coal.annotation.SysLog;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.invoice.dto.CreateInvoiceDto;
import cn.lihongjie.coal.invoice.dto.InvoiceDto;
import cn.lihongjie.coal.invoice.dto.UpdateInvoiceDto;
import cn.lihongjie.coal.invoice.service.InvoiceService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/invoice")
@SysLog(module = "发票管理")
@Slf4j
@OrgScope
public class InvoiceController {
@Autowired private InvoiceService service;
@PostMapping("/create")
public InvoiceDto create(@RequestBody CreateInvoiceDto request) {
return this.service.create(request);
}
@PostMapping("/update")
public InvoiceDto update(@RequestBody UpdateInvoiceDto request) {
return this.service.update(request);
}
@PostMapping("/delete")
public Object delete(@RequestBody IdRequest request) {
this.service.delete(request);
return true;
}
@PostMapping("/getById")
public InvoiceDto getById(@RequestBody IdRequest request) {
return this.service.getById(request.getId());
}
@PostMapping("/list")
public Page<InvoiceDto> list(@RequestBody CommonQuery request) {
return this.service.list(request);
}
@PostMapping("/archive")
public Object archive(@RequestBody IdRequest request) {
this.service.archive(request);
return true;
}
@PostMapping("/unarchive")
public Object unarchive(@RequestBody IdRequest request) {
this.service.unarchive(request);
return true;
}
@PostMapping("/uploadNew")
@Operation(summary = "上传新发票")
public Object uploadNew(@RequestBody IdRequest request) {
this.service.uploadNew(request);
return true;
}
}

View File

@@ -0,0 +1,8 @@
package cn.lihongjie.coal.invoice.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
@Data
public class CreateInvoiceDto extends OrgCommonDto {}

View File

@@ -0,0 +1,106 @@
package cn.lihongjie.coal.invoice.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import cn.lihongjie.coal.common.DictCode;
import cn.lihongjie.coal.file.entity.FileEntity;
import cn.lihongjie.coal.invoiceDetail.dto.InvoiceDetailDto;
import cn.lihongjie.coal.pojoProcessor.DictTranslate;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import lombok.Data;
import org.hibernate.annotations.Comment;
import java.util.List;
@Data
public class InvoiceDto extends OrgCommonDto {
@Comment("发票代码")
private String invoiceCode;
@Comment("发票号码")
private String invoiceNumber;
@Comment("开票日期")
private String invoiceDate;
@Comment("机器编码")
private String machineCode;
@Comment("校验码")
private String checkCode;
@Comment("受票方名称")
private String purchaserName;
@Comment("密码区")
private String passwordArea;
@Comment("不含税金额")
private String invoiceAmountPreTax;
@Comment("发票税额")
private String invoiceTax;
@Comment("大写金额")
private String totalAmountInWords;
@Comment("发票金额")
private String totalAmount;
@Comment("销售方名称")
private String sellerName;
@Comment("销售方税号")
private String sellerTaxNumber;
@Comment("销售方地址、电话")
private String sellerContactInfo;
@Comment("销售方开户行、账号")
private String sellerBankAccountInfo;
@Comment("开票人")
private String drawer;
@Comment("标题")
private String title;
@Comment("发票类型")
private String invoiceType;
@Comment("联次")
private String formType;
@Comment("机打发票代码")
private String printedInvoiceCode;
@Comment("机打发票号码")
private String printedInvoiceNumber;
@Comment("受票方开户行、账号")
private String purchaserBankAccountInfo;
@Comment("受票方地址、电话")
private String purchaserContactInfo;
@Comment("受票方税号")
private String purchaserTaxNumber;
@Comment("收款人")
private String recipient;
@Comment("备注")
private String remarks;
@Comment("复核人")
private String reviewer;
@Comment("特殊标识信息")
private String specialTag;
@OneToMany
private List<InvoiceDetailDto> invoiceDetails;
@ManyToOne
private FileEntity file;
private String archiveStatus;
@DictTranslate(dictKey = DictCode.ARCHIVESTATUS)
private String archiveStatusName;
}

View File

@@ -0,0 +1,8 @@
package cn.lihongjie.coal.invoice.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
@Data
public class UpdateInvoiceDto extends OrgCommonDto {}

View File

@@ -0,0 +1,129 @@
package cn.lihongjie.coal.invoice.entity;
import cn.lihongjie.coal.base.entity.OrgCommonEntity;
import cn.lihongjie.coal.file.entity.FileEntity;
import cn.lihongjie.coal.invoiceDetail.entity.InvoiceDetailEntity;
import jakarta.persistence.*;
import lombok.Data;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.Comment;
import java.util.List;
/**
* invoiceCode string 发票代码。 invoiceNumber string 发票号码。 invoiceDate string 开票日期。 machineCode string
* 机器编码。 checkCode string 校验码。 purchaserName string 受票方名称。 passwordArea string 密码区。
* invoiceAmountPreTax string 不含税金额。 invoiceTax string 发票税额。 totalAmountInWords string 大写金额。
* totalAmount string 发票金额。 sellerName string 销售方名称。 sellerTaxNumber string 销售方税号。 sellerContactInfo
* string 销售方地址、电话。 sellerBankAccountInfo string 销售方开户行、账号。 drawer string 开票人。 title string 标题。
* invoiceType string 发票类型(数电专用发票、数电普通发票、电子普通发票、电子专用发票、专用发票、普通发票、通用发票)。 formType string 联次。
* printedInvoiceCode string 机打发票代码。 printedInvoiceNumber string 机打发票号码。 purchaserBankAccountInfo
* string 受票方开户行、账号。 purchaserContactInfo string 受票方地址、电话。 purchaserTaxNumber string 受票方税号。
* recipient string 收款人。 remarks string 备注。 reviewer string 复核人。 specialTag string 特殊标识信息。
* invoiceDetails list 发票详单。
*/
@Data
@Entity
@Table(
indexes =
@jakarta.persistence.Index(
name = "idx_invoice_org_id",
columnList = "organization_id"))
public class InvoiceEntity extends OrgCommonEntity {
@Comment("发票代码")
private String invoiceCode;
@Comment("发票号码")
private String invoiceNumber;
@Comment("开票日期")
private String invoiceDate;
@Comment("机器编码")
private String machineCode;
@Comment("校验码")
private String checkCode;
@Comment("受票方名称")
private String purchaserName;
@Comment("密码区")
private String passwordArea;
@Comment("不含税金额")
private String invoiceAmountPreTax;
@Comment("发票税额")
private String invoiceTax;
@Comment("大写金额")
private String totalAmountInWords;
@Comment("发票金额")
private String totalAmount;
@Comment("销售方名称")
private String sellerName;
@Comment("销售方税号")
private String sellerTaxNumber;
@Comment("销售方地址、电话")
private String sellerContactInfo;
@Comment("销售方开户行、账号")
private String sellerBankAccountInfo;
@Comment("开票人")
private String drawer;
@Comment("标题")
private String title;
@Comment("发票类型")
private String invoiceType;
@Comment("联次")
private String formType;
@Comment("机打发票代码")
private String printedInvoiceCode;
@Comment("机打发票号码")
private String printedInvoiceNumber;
@Comment("受票方开户行、账号")
private String purchaserBankAccountInfo;
@Comment("受票方地址、电话")
private String purchaserContactInfo;
@Comment("受票方税号")
private String purchaserTaxNumber;
@Comment("收款人")
private String recipient;
@Comment("备注")
private String remarks;
@Comment("复核人")
private String reviewer;
@Comment("特殊标识信息")
private String specialTag;
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
private List<InvoiceDetailEntity> invoiceDetails;
@ManyToOne private FileEntity file;
@Comment("归档状态")
@ColumnDefault("'0'")
private String archiveStatus = "0";
}

View File

@@ -0,0 +1,19 @@
package cn.lihongjie.coal.invoice.mapper;
import cn.lihongjie.coal.base.mapper.BaseMapper;
import cn.lihongjie.coal.base.mapper.CommonEntityMapper;
import cn.lihongjie.coal.base.mapper.CommonMapper;
import cn.lihongjie.coal.invoice.dto.CreateInvoiceDto;
import cn.lihongjie.coal.invoice.dto.InvoiceDto;
import cn.lihongjie.coal.invoice.dto.UpdateInvoiceDto;
import cn.lihongjie.coal.invoice.entity.InvoiceEntity;
import org.mapstruct.Mapper;
import org.mapstruct.control.DeepClone;
@Mapper(
componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING,
uses = {CommonMapper.class, CommonEntityMapper.class},
mappingControl = DeepClone.class)
public interface InvoiceMapper
extends BaseMapper<InvoiceEntity, InvoiceDto, CreateInvoiceDto, UpdateInvoiceDto> {}

View File

@@ -0,0 +1,15 @@
package cn.lihongjie.coal.invoice.repository;
import cn.lihongjie.coal.base.dao.BaseRepository;
import cn.lihongjie.coal.invoice.entity.InvoiceEntity;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface InvoiceRepository extends BaseRepository<InvoiceEntity> {
@Query("select false")
boolean isLinked(List<String> ids);
}

View File

@@ -0,0 +1,189 @@
package cn.lihongjie.coal.invoice.service;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.base.service.BaseService;
import cn.lihongjie.coal.common.Ctx;
import cn.lihongjie.coal.dbFunctions.DbFunctionService;
import cn.lihongjie.coal.exception.BizException;
import cn.lihongjie.coal.file.service.FileService;
import cn.lihongjie.coal.invoice.dto.CreateInvoiceDto;
import cn.lihongjie.coal.invoice.dto.InvoiceDto;
import cn.lihongjie.coal.invoice.dto.UpdateInvoiceDto;
import cn.lihongjie.coal.invoice.entity.InvoiceEntity;
import cn.lihongjie.coal.invoice.mapper.InvoiceMapper;
import cn.lihongjie.coal.invoice.repository.InvoiceRepository;
import com.aliyun.ocr_api20210707.models.RecognizeInvoiceResponse;
import com.aliyun.ocr_api20210707.models.RecognizeInvoiceResponseBody;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import lombok.Cleanup;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
@Service
@Slf4j
@Transactional
public class InvoiceService extends BaseService<InvoiceEntity, InvoiceRepository> {
@Autowired ObjectMapper objectMapper;
@Autowired FileService fileService;
@Autowired com.aliyun.ocr_api20210707.Client ocrClient;
@Autowired private InvoiceRepository repository;
@Autowired private InvoiceMapper mapper;
@Autowired private ConversionService conversionService;
@Autowired private DbFunctionService dbFunctionService;
public InvoiceDto create(CreateInvoiceDto request) {
InvoiceEntity entity = mapper.toEntity(request);
this.repository.save(entity);
return getById(entity.getId());
}
public InvoiceDto update(UpdateInvoiceDto request) {
InvoiceEntity entity = this.repository.get(request.getId());
if (this.repository.containArchived(request.getId())) {
throw new BizException("部分数据已归档,无法编辑或删除");
}
this.mapper.updateEntity(entity, request);
this.repository.save(entity);
return getById(entity.getId());
}
public void delete(IdRequest request) {
if (this.repository.containArchived(request)) {
throw new BizException("部分数据已归档,无法编辑或删除");
}
boolean linked = this.repository.isLinked(request.getIds());
if (linked) {
throw new BizException("数据已被关联,无法删除");
}
this.repository.deleteAllById(request.getIds());
}
public InvoiceDto getById(String id) {
InvoiceEntity entity = repository.get(id);
return mapper.toDto(entity);
}
public Page<InvoiceDto> list(CommonQuery query) {
Page<InvoiceEntity> page =
repository.findAll(
query.specification(conversionService),
PageRequest.of(
query.getPageNo(),
query.getPageSize(),
Sort.by(query.getOrders())));
return page.map(this.mapper::toDto);
}
public void archive(IdRequest dto) {
this.repository.archive(dto);
}
public void unarchive(IdRequest dto) {
this.repository.unArchive(dto);
}
@SneakyThrows
public Object uploadNew(IdRequest request) {
@Cleanup InputStream download = fileService.download(request.getId());
InvoiceEntity invoice = ocr(download);
if (exists(invoice)) {
throw new BizException("发票已经存在: 发票代码 " + invoice.getInvoiceCode());
}
if (CollectionUtils.isNotEmpty(invoice.getInvoiceDetails())) {
invoice.getInvoiceDetails()
.forEach(
detail -> {
detail.setInvoice(invoice);
});
}
this.repository.save(invoice);
return getById(invoice.getId());
}
private boolean exists(InvoiceEntity invoice) {
return this.repository.count(
new Specification<InvoiceEntity>() {
@Override
public Predicate toPredicate(
Root<InvoiceEntity> root,
CriteriaQuery<?> query,
CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.and(
criteriaBuilder.equal(
root.get("invoiceCode"), invoice.getInvoiceCode()),
criteriaBuilder.equal(
root.get("invoiceNumber"),
invoice.getInvoiceNumber()),
criteriaBuilder.equal(
root.get("organizationId"),
Ctx.currentUser().getOrganizationId()));
}
})
> 0;
}
private InvoiceEntity ocr(InputStream download) throws Exception {
com.aliyun.ocr_api20210707.models.RecognizeInvoiceRequest recognizeInvoiceRequest =
new com.aliyun.ocr_api20210707.models.RecognizeInvoiceRequest();
recognizeInvoiceRequest.setBody(download);
com.aliyun.teautil.models.RuntimeOptions runtime =
new com.aliyun.teautil.models.RuntimeOptions();
RecognizeInvoiceResponse recognizeInvoiceResponse =
ocrClient.recognizeInvoiceWithOptions(recognizeInvoiceRequest, runtime);
Integer statusCode = recognizeInvoiceResponse.getStatusCode();
if (statusCode != 200) {
log.info("response {}", recognizeInvoiceResponse);
throw new BizException("发票识别失败");
}
RecognizeInvoiceResponseBody body = recognizeInvoiceResponse.getBody();
JsonNode jsonNode = objectMapper.readTree(body.getData());
JsonNode dataNode = jsonNode.get("data");
InvoiceEntity invoiceEntity = objectMapper.convertValue(dataNode, InvoiceEntity.class);
return invoiceEntity;
}
}

View File

@@ -0,0 +1,66 @@
package cn.lihongjie.coal.invoiceDetail.controller;
import cn.lihongjie.coal.annotation.OrgScope;
import cn.lihongjie.coal.annotation.SysLog;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.invoiceDetail.dto.CreateInvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.dto.InvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.dto.UpdateInvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.service.InvoiceDetailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/invoiceDetail")
@SysLog(module = "发票明细")
@Slf4j
@OrgScope
public class InvoiceDetailController {
@Autowired private InvoiceDetailService service;
@PostMapping("/create")
public InvoiceDetailDto create(@RequestBody CreateInvoiceDetailDto request) {
return this.service.create(request);
}
@PostMapping("/update")
public InvoiceDetailDto update(@RequestBody UpdateInvoiceDetailDto request) {
return this.service.update(request);
}
@PostMapping("/delete")
public Object delete(@RequestBody IdRequest request) {
this.service.delete(request);
return true;
}
@PostMapping("/getById")
public InvoiceDetailDto getById(@RequestBody IdRequest request) {
return this.service.getById(request.getId());
}
@PostMapping("/list")
public Page<InvoiceDetailDto> list(@RequestBody CommonQuery request) {
return this.service.list(request);
}
@PostMapping("/archive")
public Object archive(@RequestBody IdRequest request) {
this.service.archive(request);
return true;
}
@PostMapping("/unarchive")
public Object unarchive(@RequestBody IdRequest request) {
this.service.unarchive(request);
return true;
}
}

View File

@@ -0,0 +1,8 @@
package cn.lihongjie.coal.invoiceDetail.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
@Data
public class CreateInvoiceDetailDto extends OrgCommonDto {}

View File

@@ -0,0 +1,48 @@
package cn.lihongjie.coal.invoiceDetail.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import cn.lihongjie.coal.base.dto.SimpleDto;
import cn.lihongjie.coal.common.DictCode;
import cn.lihongjie.coal.pojoProcessor.DictTranslate;
import jakarta.persistence.ManyToOne;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
public class InvoiceDetailDto extends OrgCommonDto {
@ManyToOne
private SimpleDto invoice;
@Comment("名称")
private String itemName;
@Comment("规格型号")
private String specification;
@Comment("单位")
private String unit;
@Comment("数量")
private String quantity;
@Comment("单价")
private Double unitPrice;
@Comment("金额")
private Double amount;
@Comment("税率")
private Double taxRate;
@Comment("税额")
private Double tax;
private String archiveStatus;
@DictTranslate(dictKey = DictCode.ARCHIVESTATUS)
private String archiveStatusName;
}

View File

@@ -0,0 +1,8 @@
package cn.lihongjie.coal.invoiceDetail.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
@Data
public class UpdateInvoiceDetailDto extends OrgCommonDto {}

View File

@@ -0,0 +1,59 @@
package cn.lihongjie.coal.invoiceDetail.entity;
import cn.lihongjie.coal.base.entity.OrgCommonEntity;
import cn.lihongjie.coal.invoice.entity.InvoiceEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Data;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.Comment;
/**
* itemName string 货物或应税劳务、服务名称。 specification string 规格型号。 unit string 单位。 quantity string 数量。
* unitPrice string 单价。 amount string 金额。 taxRate string 税率。 tax string 税额。
*/
@Data
@Entity
@Table(
indexes =
@jakarta.persistence.Index(
name = "idx_invoiceDetail_org_id",
columnList = "organization_id"))
public class InvoiceDetailEntity extends OrgCommonEntity {
@ManyToOne
private InvoiceEntity invoice;
@Comment("名称")
private String itemName;
@Comment("规格型号")
private String specification;
@Comment("单位")
private String unit;
@Comment("数量")
private String quantity;
@Comment("单价")
private Double unitPrice;
@Comment("金额")
private Double amount;
@Comment("税率")
private Double taxRate;
@Comment("税额")
private Double tax;
@Comment("归档状态")
@ColumnDefault("'0'")
private String archiveStatus = "0";
}

View File

@@ -0,0 +1,23 @@
package cn.lihongjie.coal.invoiceDetail.mapper;
import cn.lihongjie.coal.base.mapper.BaseMapper;
import cn.lihongjie.coal.base.mapper.CommonEntityMapper;
import cn.lihongjie.coal.base.mapper.CommonMapper;
import cn.lihongjie.coal.invoiceDetail.dto.CreateInvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.dto.InvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.dto.UpdateInvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.entity.InvoiceDetailEntity;
import org.mapstruct.Mapper;
import org.mapstruct.control.DeepClone;
@Mapper(
componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING,
uses = {CommonMapper.class, CommonEntityMapper.class},
mappingControl = DeepClone.class)
public interface InvoiceDetailMapper
extends BaseMapper<
InvoiceDetailEntity,
InvoiceDetailDto,
CreateInvoiceDetailDto,
UpdateInvoiceDetailDto> {}

View File

@@ -0,0 +1,15 @@
package cn.lihongjie.coal.invoiceDetail.repository;
import cn.lihongjie.coal.base.dao.BaseRepository;
import cn.lihongjie.coal.invoiceDetail.entity.InvoiceDetailEntity;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface InvoiceDetailRepository extends BaseRepository<InvoiceDetailEntity> {
@Query("select false")
boolean isLinked(List<String> ids);
}

View File

@@ -0,0 +1,94 @@
package cn.lihongjie.coal.invoiceDetail.service;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.base.service.BaseService;
import cn.lihongjie.coal.dbFunctions.DbFunctionService;
import cn.lihongjie.coal.exception.BizException;
import cn.lihongjie.coal.invoiceDetail.dto.CreateInvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.dto.InvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.dto.UpdateInvoiceDetailDto;
import cn.lihongjie.coal.invoiceDetail.entity.InvoiceDetailEntity;
import cn.lihongjie.coal.invoiceDetail.mapper.InvoiceDetailMapper;
import cn.lihongjie.coal.invoiceDetail.repository.InvoiceDetailRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Slf4j
@Transactional
public class InvoiceDetailService
extends BaseService<InvoiceDetailEntity, InvoiceDetailRepository> {
@Autowired private InvoiceDetailRepository repository;
@Autowired private InvoiceDetailMapper mapper;
@Autowired private ConversionService conversionService;
@Autowired private DbFunctionService dbFunctionService;
public InvoiceDetailDto create(CreateInvoiceDetailDto request) {
InvoiceDetailEntity entity = mapper.toEntity(request);
this.repository.save(entity);
return getById(entity.getId());
}
public InvoiceDetailDto update(UpdateInvoiceDetailDto request) {
InvoiceDetailEntity entity = this.repository.get(request.getId());
if (this.repository.containArchived(request.getId())) {
throw new BizException("部分数据已归档,无法编辑或删除");
}
this.mapper.updateEntity(entity, request);
this.repository.save(entity);
return getById(entity.getId());
}
public void delete(IdRequest request) {
if (this.repository.containArchived(request)) {
throw new BizException("部分数据已归档,无法编辑或删除");
}
boolean linked = this.repository.isLinked(request.getIds());
if (linked) {
throw new BizException("数据已被关联,无法删除");
}
this.repository.deleteAllById(request.getIds());
}
public InvoiceDetailDto getById(String id) {
InvoiceDetailEntity entity = repository.get(id);
return mapper.toDto(entity);
}
public Page<InvoiceDetailDto> list(CommonQuery query) {
Page<InvoiceDetailEntity> page =
repository.findAll(
query.specification(conversionService),
PageRequest.of(
query.getPageNo(),
query.getPageSize(),
Sort.by(query.getOrders())));
return page.map(this.mapper::toDto);
}
public void archive(IdRequest dto) {
this.repository.archive(dto);
}
public void unarchive(IdRequest dto) {
this.repository.unArchive(dto);
}
}

View File

@@ -0,0 +1,19 @@
package scripts.dict
import cn.lihongjie.coal.base.dto.CommonQuery
import cn.lihongjie.coal.invoiceDetail.controller.InvoiceDetailController
import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.context.ApplicationContext
ApplicationContext ioc = ioc
def controller = ioc.getBean(InvoiceDetailController.class)
def objectMapper = ioc.getBean(ObjectMapper.class) as ObjectMapper
return controller.list(params!=null ? objectMapper.convertValue(params, CommonQuery.class ) : new CommonQuery())

View File

@@ -0,0 +1,19 @@
package scripts.dict
import cn.lihongjie.coal.base.dto.CommonQuery
import cn.lihongjie.coal.invoice.controller.InvoiceController
import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.context.ApplicationContext
ApplicationContext ioc = ioc
def controller = ioc.getBean(InvoiceController.class)
def objectMapper = ioc.getBean(ObjectMapper.class) as ObjectMapper
return controller.list(params!=null ? objectMapper.convertValue(params, CommonQuery.class ) : new CommonQuery())