diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java index 82220f1..5ee249e 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/ContractManage.java @@ -22,6 +22,8 @@ */ package org.springblade.transport.pojo.entity; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -107,9 +109,11 @@ public class ContractManage extends TenantEntity { private Integer legalSealFlag; @Schema(description = "一式份数") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) private Integer copyCount; @Schema(description = "回款账期(天)") + @TableField(insertStrategy = FieldStrategy.ALWAYS, updateStrategy = FieldStrategy.ALWAYS) private Integer paymentDays; @Schema(description = "合同阶段") diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CustomerArchive.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CustomerArchive.java index c0a94e0..af2b719 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CustomerArchive.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/CustomerArchive.java @@ -22,6 +22,8 @@ */ package org.springblade.transport.pojo.entity; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -93,6 +95,7 @@ public class CustomerArchive extends TenantEntity { private String deptName; @Schema(description = "开票税点") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private BigDecimal invoiceTaxRate; @Schema(description = "经营范围") @@ -102,9 +105,11 @@ public class CustomerArchive extends TenantEntity { private String businessTermType; @Schema(description = "营业期限截止日") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private LocalDate businessEndDate; @Schema(description = "注册资金(万元)") + @TableField(updateStrategy = FieldStrategy.ALWAYS) private BigDecimal registeredCapital; @Schema(description = "客商负责人") diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java index 06179d8..fc429ff 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ContractManageVO.java @@ -55,6 +55,10 @@ public class ContractManageVO extends ContractManage { @Schema(description = "到期快捷筛选") private String expireScope; + @TableField(exist = false) + @Schema(description = "生效类型筛选") + private String effectiveType; + @TableField(exist = false) @Schema(description = "创建人姓名") private String createUserName; diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectApplyVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectApplyVO.java index 1fbed13..96559ad 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectApplyVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/ProjectApplyVO.java @@ -71,4 +71,8 @@ public class ProjectApplyVO extends ProjectApply { @Schema(description = "变更类型") private String changeType; + @TableField(exist = false) + @Schema(description = "是否仅查询可用于临时额度申请的项目") + private Boolean temporaryCreditLimitSelectable; + } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExcel.java b/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExcel.java index a2e023a..b72d4d5 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExcel.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExcel.java @@ -56,41 +56,41 @@ public class AirportMasterExcel implements Serializable { @ExcelProperty("编码") private String code; - @ExcelProperty("IATA编码") + @ExcelProperty("IATA编码*") private String iataCode; - @ExcelProperty("ICAO代码") + @ExcelProperty("ICAO代码*") private String icaoCode; - @ExcelProperty("机场标准名称") + @ExcelProperty("机场标准名称*") private String name; @ExcelProperty("机场简称") private String shortName; - @ExcelProperty("所属省份") + @ExcelProperty("所属省份*") private String provinceName; - @ExcelProperty("所属城市") + @ExcelProperty("所属城市*") private String cityName; - @ExcelProperty("所属区县") + @ExcelProperty("所属区县*") private String districtName; - @ExcelProperty("行政区划") - private String regionName; - @ExcelProperty("详细地址") private String detailAddress; - @ExcelProperty("经度") + @ExcelProperty("经度*") @NumberFormat("0.000000") private BigDecimal longitude; - @ExcelProperty("纬度") + @ExcelProperty("纬度*") @NumberFormat("0.000000") private BigDecimal latitude; + @ExcelProperty("行政区划编号") + private String regionCode; + @ExcelProperty("数据来源") private String dataSource; diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExcel.java b/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExcel.java index b91a170..d4915b4 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExcel.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExcel.java @@ -54,30 +54,27 @@ public class RailwayStationExcel implements Serializable { @ExcelProperty("编码") private String code; - @ExcelProperty("TMIS国标编码") + @ExcelProperty("TMIS国标编码*") private String tmisCode; - @ExcelProperty("电报码") + @ExcelProperty("电报码*") private String telegraphCode; - @ExcelProperty("车站名称") + @ExcelProperty("车站名称*") private String name; // @ExcelProperty("所属铁路线路") // private String railwayLine; - @ExcelProperty("所属省份") + @ExcelProperty("所属省份*") private String provinceName; - @ExcelProperty("所属城市") + @ExcelProperty("所属城市*") private String cityName; - @ExcelProperty("所属区县") + @ExcelProperty("所属区县*") private String districtName; - @ExcelProperty("行政区划") - private String regionName; - @ExcelProperty("详细地址") private String detailAddress; @@ -87,6 +84,9 @@ public class RailwayStationExcel implements Serializable { @ExcelProperty("纬度") private String latitude; + @ExcelProperty("行政区划编号") + private String regionCode; + @ExcelProperty("数据来源") private String dataSource; diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/FeeItemMapper.xml b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/FeeItemMapper.xml index a7c051e..fadca0b 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/FeeItemMapper.xml +++ b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/FeeItemMapper.xml @@ -8,6 +8,8 @@ + + @@ -18,29 +20,33 @@ diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/RegionMapper.xml b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/RegionMapper.xml index e0694e6..4a800f0 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/RegionMapper.xml +++ b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/RegionMapper.xml @@ -71,6 +71,9 @@ and region.name like concat(concat('%', #{param2.name}),'%') + + and region.level = #{param2.regionLevel} + ORDER BY region.sort ASC, region.code ASC @@ -95,6 +98,9 @@ and region.name like concat(concat('%', #{param2.name}),'%') + + and region.level = #{param2.regionLevel} + ORDER BY region.sort ASC, region.code ASC diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractManageController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractManageController.java index bb3e04f..4b8ba6c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractManageController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ContractManageController.java @@ -143,29 +143,36 @@ public class ContractManageController extends BladeController { return R.status(contractManageService.terminate(id, reason)); } - @PostMapping("/copy") + @PostMapping("/update-attachments") @ApiOperationSupport(order = 12) + @Operation(summary = "更新合同附件", description = "传入合同id及附件信息") + public R updateAttachments(@RequestBody ContractManage contractManage) { + return R.status(contractManageService.updateAttachments(contractManage)); + } + + @PostMapping("/copy") + @ApiOperationSupport(order = 13) @Operation(summary = "复制合同", description = "传入id") public R copy(@Parameter(description = "主键", required = true) @RequestParam Long id) { return R.data(contractManageService.copy(id)); } @PostMapping("/remove") - @ApiOperationSupport(order = 13) + @ApiOperationSupport(order = 14) @Operation(summary = "逻辑删除", description = "传入ids") public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { return R.status(contractManageService.removeDraft(ids)); } @GetMapping("/expire-stats") - @ApiOperationSupport(order = 14) + @ApiOperationSupport(order = 15) @Operation(summary = "到期统计", description = "传入contractManage") public R> expireStats(ContractManageVO contractManage) { return R.data(contractManageService.expireStats(contractManage)); } @GetMapping("/export-contract-manage") - @ApiOperationSupport(order = 15) + @ApiOperationSupport(order = 16) @Operation(summary = "导出合同管理") public void exportContractManage(ContractManageVO contractManage, @RequestParam(required = false) String ids, HttpServletResponse response) { List list = contractManageService.exportContractManage(contractManage, ids); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractManageService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractManageService.java index 32b8efc..801ce23 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractManageService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IContractManageService.java @@ -48,6 +48,7 @@ public interface IContractManageService extends BaseService { boolean reject(Long id); boolean withdraw(Long id); boolean startChange(Long id, String changeContent, String changeReason); + boolean updateAttachments(ContractManage contractManage); boolean terminate(Long id, String reason); boolean removeDraft(String ids); ContractManageVO copy(Long id); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java index d24c239..d61c6ce 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ContractManageServiceImpl.java @@ -49,7 +49,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; /** * 合同管理 服务实现类 @@ -193,7 +192,8 @@ public class ContractManageServiceImpl extends BaseServiceImpl expireStats(ContractManageVO contractManage) { List contracts = list(buildQuery(contractManage)); - return contracts.stream() + Map stats = new LinkedHashMap<>(); + stats.put("all", (long) contracts.size()); + stats.put("within30", 0L); + stats.put("within90", 0L); + stats.put("over90", 0L); + stats.put("expired", 0L); + contracts.stream() .filter(item -> item.getEndDate() != null) - .collect(Collectors.groupingBy(item -> expireScope(item.getEndDate()), Collectors.counting())); + .map(item -> expireScope(item.getEndDate())) + .forEach(scope -> stats.computeIfPresent(scope, (key, count) -> count + 1)); + return stats; } @Override @@ -298,9 +319,58 @@ public class ContractManageServiceImpl extends BaseServiceImpl queryWrapper, String effectiveType) { + if (Func.isEmpty(effectiveType)) { + return; + } + LocalDate today = LocalDate.now(); + switch (effectiveType) { + case "not_effective" -> queryWrapper.and(wrapper -> wrapper + .notIn(ContractManage::getApprovalStatus, STATUS_APPROVED, STATUS_CHANGE_APPROVED) + .or(item -> item.eq(ContractManage::getContractStage, STAGE_TEMPORARY) + .gt(ContractManage::getTemporaryStartDate, today)) + .or(item -> item.ne(ContractManage::getContractStage, STAGE_TEMPORARY) + .gt(ContractManage::getStartDate, today))); + case "temporary_effective" -> queryWrapper.eq(ContractManage::getContractStage, STAGE_TEMPORARY) + .in(ContractManage::getApprovalStatus, STATUS_APPROVED, STATUS_CHANGE_APPROVED) + .and(wrapper -> wrapper.isNull(ContractManage::getTemporaryStartDate) + .or().le(ContractManage::getTemporaryStartDate, today)) + .and(wrapper -> wrapper.isNull(ContractManage::getTemporaryEndDate) + .or().ge(ContractManage::getTemporaryEndDate, today)); + case "formal_effective" -> queryWrapper.eq(ContractManage::getContractStage, STAGE_FORMAL) + .in(ContractManage::getApprovalStatus, STATUS_APPROVED, STATUS_CHANGE_APPROVED) + .and(wrapper -> wrapper.isNull(ContractManage::getStartDate) + .or().le(ContractManage::getStartDate, today)) + .and(wrapper -> wrapper.isNull(ContractManage::getEndDate) + .or().ge(ContractManage::getEndDate, today)); + case "expired" -> queryWrapper.in(ContractManage::getApprovalStatus, STATUS_APPROVED, STATUS_CHANGE_APPROVED) + .and(wrapper -> wrapper.eq(ContractManage::getContractStage, STAGE_TEMPORARY) + .lt(ContractManage::getTemporaryEndDate, today) + .or(wrapper2 -> wrapper2.ne(ContractManage::getContractStage, STAGE_TEMPORARY) + .lt(ContractManage::getEndDate, today))); + default -> throw new ServiceException("无效的生效类型筛选条件"); + } + } + + private void applyExpireScope(LambdaQueryWrapper queryWrapper, String expireScope) { + if (Func.isEmpty(expireScope)) { + return; + } + LocalDate today = LocalDate.now(); + switch (expireScope) { + case "within30" -> queryWrapper.ge(ContractManage::getEndDate, today).le(ContractManage::getEndDate, today.plusDays(30)); + case "within90" -> queryWrapper.gt(ContractManage::getEndDate, today.plusDays(30)).le(ContractManage::getEndDate, today.plusDays(90)); + case "over90" -> queryWrapper.gt(ContractManage::getEndDate, today.plusDays(90)); + case "expired" -> queryWrapper.lt(ContractManage::getEndDate, today); + default -> throw new ServiceException("无效的到期筛选条件"); + } + } + private void prepareCreateOrUpdate(ContractManage contractManage) { if (Func.isEmpty(contractManage.getId())) { if (Func.isEmpty(contractManage.getContractNo())) { @@ -346,14 +416,35 @@ public class ContractManageServiceImpl extends BaseServiceImpllambdaQuery() + .eq(ContractManage::getIsDeleted, 0) + .eq(ContractManage::getContractName, contractManage.getContractName()) + .ne(Func.isNotEmpty(contractManage.getId()), ContractManage::getId, contractManage.getId())); + if (count > 0) { + throw new ServiceException("合同名称已存在"); + } + } + private void validateTemporary(ContractManage contractManage) { TransportBusinessSupport.validateRequired(contractManage.getSignType(), "请选择签约类型"); } @@ -447,18 +538,19 @@ public class ContractManageServiceImpl extends BaseServiceImpl contacts) { @@ -437,11 +442,14 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl details = scoreVO.getDetails() == null ? new ArrayList<>() : scoreVO.getDetails(); for (int detailIndex = 0; detailIndex < details.size(); detailIndex++) { @@ -455,16 +463,29 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl customerIds) { + deleteDetail(customerIds, true); + } + + private void deleteDetail(List customerIds, boolean deleteScores) { contactMapper.update(null, Wrappers.lambdaUpdate().in(CustomerContact::getCustomerId, customerIds).set(CustomerContact::getIsDeleted, 1)); receiptAccountMapper.update(null, Wrappers.lambdaUpdate().in(CustomerReceiptAccount::getCustomerId, customerIds).set(CustomerReceiptAccount::getIsDeleted, 1)); invoiceInfoMapper.update(null, Wrappers.lambdaUpdate().in(CustomerInvoiceInfo::getCustomerId, customerIds).set(CustomerInvoiceInfo::getIsDeleted, 1)); - List scores = creditScoreMapper.selectList(Wrappers.lambdaQuery().in(CustomerCreditScore::getCustomerId, customerIds).eq(CustomerCreditScore::getIsDeleted, 0)); + if (deleteScores) { + deleteScores(customerIds); + } + } + + private void deleteScores(List customerIds) { + List scores = creditScoreMapper.selectList(Wrappers.lambdaQuery() + .in(CustomerCreditScore::getCustomerId, customerIds) + .and(wrapper -> wrapper.ne(CustomerCreditScore::getIsDeleted, 1).or().isNull(CustomerCreditScore::getIsDeleted))); if (Func.isNotEmpty(scores)) { List scoreIds = scores.stream().map(CustomerCreditScore::getId).toList(); creditScoreDetailMapper.update(null, Wrappers.lambdaUpdate().in(CustomerCreditScoreDetail::getScoreId, scoreIds).set(CustomerCreditScoreDetail::getIsDeleted, 1)); @@ -502,7 +523,7 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl loadScores(Long customerId) { List scores = creditScoreMapper.selectList(Wrappers.lambdaQuery() .eq(CustomerCreditScore::getCustomerId, customerId) - .and(wrapper -> wrapper.eq(CustomerCreditScore::getIsDeleted, 0).or().isNull(CustomerCreditScore::getIsDeleted)) + .and(wrapper -> wrapper.ne(CustomerCreditScore::getIsDeleted, 1).or().isNull(CustomerCreditScore::getIsDeleted)) .orderByDesc(CustomerCreditScore::getScoreDate) .orderByDesc(CustomerCreditScore::getCreateTime)); if (Func.isEmpty(scores)) { @@ -511,7 +532,7 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl scoreIds = scores.stream().map(CustomerCreditScore::getId).toList(); Map> detailMap = creditScoreDetailMapper.selectList(Wrappers.lambdaQuery() .in(CustomerCreditScoreDetail::getScoreId, scoreIds) - .and(wrapper -> wrapper.eq(CustomerCreditScoreDetail::getIsDeleted, 0).or().isNull(CustomerCreditScoreDetail::getIsDeleted)) + .and(wrapper -> wrapper.ne(CustomerCreditScoreDetail::getIsDeleted, 1).or().isNull(CustomerCreditScoreDetail::getIsDeleted)) .orderByAsc(CustomerCreditScoreDetail::getSort)) .stream() .map(detail -> Objects.requireNonNull(BeanUtil.copyProperties(detail, CustomerCreditScoreDetailVO.class))) @@ -539,6 +560,14 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java index 08db9a5..68d00ed 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ProjectApplyServiceImpl.java @@ -83,6 +83,7 @@ public class ProjectApplyServiceImpl extends BaseServiceImpl