From f014ca7cf3931b30a47382bed6cc8a5e16a33f35 Mon Sep 17 00:00:00 2001 From: guojunyun Date: Sun, 21 Sep 2025 21:01:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=90=8C=E7=AE=A1=E7=90=86=E7=9B=B8?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums/ErrorCodeConstants.java | 7 +- .../contract/ContractDictTypeConstants.java | 14 + .../enums/contract/ContractStatusEnum.java | 67 +++++ .../enums/contract/ContractTypeEnum.java | 55 ++++ .../enums/contract/DateConstants.java | 7 + .../admin/contract/ContractController.java | 48 +++ .../preparaton/ContractDetailSaveReqVO.java | 45 +++ .../vo/preparaton/ContractPageReqVO.java | 38 +++ .../vo/preparaton/ContractPlanSaveReqVO.java | 33 +++ .../vo/preparaton/ContractRespVO.java | 215 ++++++++++++++ .../vo/preparaton/ContractSaveReqVO.java | 230 +++++++++++++++ .../dataobject/contract/ContractDetailDO.java | 76 +++++ .../dataobject/contract/ContractMainDO.java | 273 ++++++++++++++++++ .../dataobject/contract/ContractPlanDO.java | 62 ++++ .../mysql/contract/ContractDetailMapper.java | 14 + .../mysql/contract/ContractMainMapper.java | 27 ++ .../service/contract/ContractService.java | 31 ++ .../service/contract/ContractServiceImpl.java | 113 ++++++++ 18 files changed, 1352 insertions(+), 3 deletions(-) create mode 100644 yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractDictTypeConstants.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractStatusEnum.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractTypeEnum.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/DateConstants.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/ContractController.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractDetailSaveReqVO.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractPageReqVO.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractPlanSaveReqVO.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractRespVO.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractSaveReqVO.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractDetailDO.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractMainDO.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractPlanDO.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/mysql/contract/ContractDetailMapper.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/mysql/contract/ContractMainMapper.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/service/contract/ContractService.java create mode 100644 yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/service/contract/ContractServiceImpl.java diff --git a/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/ErrorCodeConstants.java b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/ErrorCodeConstants.java index a9d76de..97ad822 100644 --- a/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/ErrorCodeConstants.java +++ b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/ErrorCodeConstants.java @@ -11,7 +11,8 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; */ public interface ErrorCodeConstants { - // ========== 示例模块 1-001-000-000 ========== - ErrorCode EXAMPLE_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); - + // ========== 合同模块 1-027-000-000 ========== + ErrorCode CONTRACT_NUM_TRANSFINITE = new ErrorCode(1_027_000_000, "系统合同编号超限,最大合同编号:999999"); + ErrorCode CONTRACT_NAME_EXISTS = new ErrorCode(1_027_000_001, "合同名已存在"); + ErrorCode CONTRACT_PAPER_NUMBER_EXISTS = new ErrorCode(1_027_000_002, "合同编号已存在"); } diff --git a/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractDictTypeConstants.java b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractDictTypeConstants.java new file mode 100644 index 0000000..dbcce70 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractDictTypeConstants.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.contractorder.enums.contract; + +/** + * 合同字典类型常量 + * + * @author ZT + */ +public class ContractDictTypeConstants { + + // 合同状态 + public static String BSE_CTRT_STS = "BSE_CTRT_STS"; + // 合同类型(字典名:业务类型) + public static String BSN_TP = "BSN_TP"; +} diff --git a/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractStatusEnum.java b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractStatusEnum.java new file mode 100644 index 0000000..9228c3f --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractStatusEnum.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.contractorder.enums.contract; + +/** + * 合同状态枚举 + */ +public enum ContractStatusEnum { + + /** + * 合同状态-草稿 + */ + DRAFT("草稿","DRAFT","可以删除"), + /** + * 合同状态-正在审核 + */ + UNDER_REVIEW("正在审核","UNDER_REVIEW","不允许任何操作"), + /** + * 合同状态-执行中 + */ + IN_PROGRESS("执行中","IN_PROGRESS","可以终止、归档"), + /** + * 合同状态-已驳回 + */ + REJECTED("已驳回","REJECTED","可以删除"), + /** + * 合同状态-已终止 + */ + TERMINATED("已终止","TERMINATED","只允许归档"), + /** + * 合同状态-已归档 + */ + ARCHIVED("已归档","ARCHIVED","不允许任何操作"), + /** + * 合同状态-已删除 + */ + DELETED("已删除","DELETED","不允许任何操作"); + + ContractStatusEnum(String label, String code, String remark) { + this.label = label; + this.code = code; + this.remark = remark; + } + + /** + * 字典标签 + */ + private final String label; + /** + * 字典编码 + */ + private final String code; + /** + * 备注 + */ + private final String remark; + + public String getLabel() { + return label; + } + + public String getCode() { + return code; + } + + public String getRemark() { + return remark; + } +} diff --git a/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractTypeEnum.java b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractTypeEnum.java new file mode 100644 index 0000000..9e065f3 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/ContractTypeEnum.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.contractorder.enums.contract; + +/** + * 合同类型枚举 + */ +public enum ContractTypeEnum { + + /** + * 采购 + */ + PRCH("采购","PRCH",null), + /** + * 销售 + */ + SALE("销售","SALE",null), + /** + * 委托加工 + */ + ENTT("委托加工","ENTT",null), + /** + * 来料加工 + */ + MKE("来料加工","MKE",null); + + ContractTypeEnum(String label, String code, String remark) { + this.label = label; + this.code = code; + this.remark = remark; + } + + /** + * 字典标签 + */ + private final String label; + /** + * 字典编码 + */ + private final String code; + /** + * 备注 + */ + private final String remark; + + public String getLabel() { + return label; + } + + public String getCode() { + return code; + } + + public String getRemark() { + return remark; + } +} diff --git a/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/DateConstants.java b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/DateConstants.java new file mode 100644 index 0000000..70fef95 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-api/src/main/java/cn/iocoder/yudao/module/contractorder/enums/contract/DateConstants.java @@ -0,0 +1,7 @@ +package cn.iocoder.yudao.module.contractorder.enums.contract; + +public class DateConstants { + + // 日期格式 + public static final String DATE_FORMAT_YEAR_MONTH_DAY_8_BIT = "yyyyMMdd"; +} diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/ContractController.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/ContractController.java new file mode 100644 index 0000000..51bc352 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/ContractController.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.contractorder.controller.admin.contract; + +import cn.iocoder.yudao.framework.business.interceptor.BusinessControllerMarker; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton.ContractPageReqVO; +import cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton.ContractRespVO; +import cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton.ContractSaveReqVO; +import cn.iocoder.yudao.module.contractorder.dal.dataobject.contract.ContractMainDO; +import cn.iocoder.yudao.module.contractorder.service.contract.ContractService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Slf4j +@Tag(name = "管理后台 - 合同管理") +@RestController +@RequestMapping("/base/contract-order/contract") +@Validated +public class ContractController implements BusinessControllerMarker { + + @Resource + private ContractService contractService; + + @GetMapping("/page") + @Operation(summary = "获得合同分页列表") + @PreAuthorize("@ss.hasPermission('base:contract-main:query')") + public CommonResult> getContractPage(@Valid ContractPageReqVO pageReqVO) { + PageResult pageResult = contractService.getContractPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ContractRespVO.class)); + } + + @PostMapping("/create") + @Operation(summary = "新增合同") + @PreAuthorize("@ss.hasPermission('system:contract-main:create')") + public CommonResult createContract(@Valid @RequestBody ContractSaveReqVO reqVO) { + Long id = contractService.createContract(reqVO); + return success(id); + } +} diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractDetailSaveReqVO.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractDetailSaveReqVO.java new file mode 100644 index 0000000..6f6d90e --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractDetailSaveReqVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Schema(description = "管理后台 - 合同明细新增/修改 Request VO") +@Data +public class ContractDetailSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32609") + private Long id; + + @Schema(description = "合同主信息主键", example = "13595") + private Long contractMainId; + + @Schema(description = "物料名称", example = "张三") + private String materialName; + + @Schema(description = "物料编码") + private String materialNumber; + + @Schema(description = "数量") + private BigDecimal quantity; + + @Schema(description = "计量单位") + private String unit; + + @Schema(description = "含税单价", example = "28579") + private BigDecimal inTaxUnitPrice; + + @Schema(description = "金属元素缩写") + private String elementAbbreviation; + + @Schema(description = "金属元素名称", example = "赵六") + private String elementName; + + @Schema(description = "金属元素编码") + private String elementNumber; + + // 交货计划 + private List plans; +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractPageReqVO.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractPageReqVO.java new file mode 100644 index 0000000..6399cb6 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractPageReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 合同信息分页 Request VO") +@Data +public class ContractPageReqVO extends PageParam { + + @Schema(description = "合同名称;与ERP(HTMC)对应,校验唯一", example = "芋艿") + private String contractName; + + @Schema(description = "合同编号;与ERP(HTBH)对应,校验唯一") + private String contractPaperNumber; + + @Schema(description = "甲方公司名称", example = "王五") + private String purchaseCompanyName; + + @Schema(description = "乙方公司名称", example = "王五") + private String salesCompanyName; + + @Schema(description = "收支性质;与ERP(SZXZ)对应") + private String direction; + + @Schema(description = "签署日期;与ERP(HTQDRQ)对应") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] signDate; + + @Schema(description = "本币金额;与ERP(HTBWBZJE)对应") + private BigDecimal basicAmount; +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractPlanSaveReqVO.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractPlanSaveReqVO.java new file mode 100644 index 0000000..e5bb538 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractPlanSaveReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 交货计划条款新增/修改 Request VO") +@Data +public class ContractPlanSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27474") + private Long id; + + @Schema(description = "合同明细主键", example = "32763") + private Long contractDetailId; + + @Schema(description = "交货年份", requiredMode = Schema.RequiredMode.REQUIRED) + private Long contractDeliveryYear; + + @Schema(description = "交货月份") + private Long contractPlanDeliveryMonth; + + @Schema(description = "计划交货数量", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal contractPlanDeliveryQuantity; + + @Schema(description = "交货开始日期", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime contractDeliveryStartDate; + + @Schema(description = "交货结束日期", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime contractDeliveryEndDate; +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractRespVO.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractRespVO.java new file mode 100644 index 0000000..bca6128 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractRespVO.java @@ -0,0 +1,215 @@ +package cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 合同信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ContractRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "2090") + @ExcelProperty("主键") + private Long id; + + @Schema(description = "模板实例主键", example = "10196") + @ExcelProperty("模板实例主键") + private Long instanceId; + + @Schema(description = "系统合同编号;自动生成,校验唯一") + @ExcelProperty("系统合同编号;自动生成,校验唯一") + private String systemContractNumber; + + @Schema(description = "状态", example = "1") + @ExcelProperty("状态") + private String status; + + @Schema(description = "合同名称;与ERP(HTMC)对应,校验唯一", example = "芋艿") + @ExcelProperty("合同名称;与ERP(HTMC)对应,校验唯一") + private String contractName; + + @Schema(description = "合同编号;与ERP(HTBH)对应,校验唯一") + @ExcelProperty("合同编号;与ERP(HTBH)对应,校验唯一") + private String contractPaperNumber; + + @Schema(description = "是否虚拟合同;与ERP(SFXNHT)对应") + @ExcelProperty("是否虚拟合同;与ERP(SFXNHT)对应") + private String contractVirtual; + + @Schema(description = "是否先款后货") + @ExcelProperty("是否先款后货") + private String hasPayable; + + @Schema(description = "收支性质;与ERP(SZXZ)对应") + @ExcelProperty("收支性质;与ERP(SZXZ)对应") + private String direction; + + @Schema(description = "合同类型", example = "1") + @ExcelProperty("合同类型") + private String contractType; + + @Schema(description = "签署日期;与ERP(HTQDRQ)对应") + @ExcelProperty("签署日期;与ERP(HTQDRQ)对应") + private LocalDateTime signDate; + + @Schema(description = "开始日期;与ERP(HTQSRQ)对应") + @ExcelProperty("开始日期;与ERP(HTQSRQ)对应") + private LocalDateTime startDate; + + @Schema(description = "结束日期;与ERP(HTZZRQ)对应") + @ExcelProperty("结束日期;与ERP(HTZZRQ)对应") + private LocalDateTime endDate; + + @Schema(description = "签署地") + @ExcelProperty("签署地") + private String signPlace; + + @Schema(description = "甲方公司编号;如果是采购合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是销售合同,手动选择,且与ERP(WLDWBH)对应。") + @ExcelProperty("甲方公司编号;如果是采购合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是销售合同,手动选择,且与ERP(WLDWBH)对应。") + private String purchaseCompanyNumber; + + @Schema(description = "甲方公司名称", example = "王五") + @ExcelProperty("甲方公司名称") + private String purchaseCompanyName; + + @Schema(description = "甲方地址") + @ExcelProperty("甲方地址") + private String purchaseAddress; + + @Schema(description = "甲方法定代表人") + @ExcelProperty("甲方法定代表人") + private String purchaseLeader; + + @Schema(description = "乙方公司编号;如果是销售合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是采购合同,手动选择,且与ERP(WLDWBH)对应。") + @ExcelProperty("乙方公司编号;如果是销售合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是采购合同,手动选择,且与ERP(WLDWBH)对应。") + private String salesCompanyNumber; + + @Schema(description = "乙方公司名称", example = "王五") + @ExcelProperty("乙方公司名称") + private String salesCompanyName; + + @Schema(description = "乙方地址") + @ExcelProperty("乙方地址") + private String salesAddress; + + @Schema(description = "乙方企业负责人") + @ExcelProperty("乙方企业负责人") + private String salesPurchaseLeader; + + @Schema(description = "币种;与ERP(BZBH)对应") + @ExcelProperty("币种;与ERP(BZBH)对应") + private String currency; + + @Schema(description = "原币金额;与ERP(HTYBZJE)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额") + @ExcelProperty("原币金额;与ERP(HTYBZJE)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额") + private BigDecimal cooAmount; + + @Schema(description = "本币金额;与ERP(HTBWBZJE)对应") + @ExcelProperty("本币金额;与ERP(HTBWBZJE)对应") + private BigDecimal basicAmount; + + @Schema(description = "是否有履约保证金;为是,则保证金必填。") + @ExcelProperty("是否有履约保证金;为是,则保证金必填。") + private String hasDeposit; + + @Schema(description = "原币履约保证金;与ERP(LYBZJBGQYB)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额") + @ExcelProperty("原币履约保证金;与ERP(LYBZJBGQYB)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额") + private BigDecimal cooAmountDeposit; + + @Schema(description = "本币履约保证金;与ERP(LYBZJBGQBWB)对应") + @ExcelProperty("本币履约保证金;与ERP(LYBZJBGQBWB)对应") + private BigDecimal basicAmountDeposit; + + @Schema(description = "是否有预付款;与ERP(SFYYFK)对应") + @ExcelProperty("是否有预付款;与ERP(SFYYFK)对应") + private String hasPrepayment; + + @Schema(description = "预付款比例;与ERP(YFKBL)对应") + @ExcelProperty("预付款比例;与ERP(YFKBL)对应") + private BigDecimal prepaymentRatio; + + @Schema(description = "预付款金额;与ERP(YFKJE)对应") + @ExcelProperty("预付款金额;与ERP(YFKJE)对应") + private BigDecimal prepaymentAmount; + + @Schema(description = "是否有质保金;与ERP(SFHZBJ)对应") + @ExcelProperty("是否有质保金;与ERP(SFHZBJ)对应") + private String hasQualityAmount; + + @Schema(description = "质保金比例;与ERP(ZBJBL)对应") + @ExcelProperty("质保金比例;与ERP(ZBJBL)对应") + private BigDecimal qualityRatio; + + @Schema(description = "质保金金额;与ERP(BZJJE)对应") + @ExcelProperty("质保金金额;与ERP(BZJJE)对应") + private BigDecimal qualityAmount; + + @Schema(description = "补充协议类型;变更协议/增加条款", example = "1") + @ExcelProperty("补充协议类型;变更协议/增加条款") + private String replenishAgreementType; + + @Schema(description = "备注;与ERP(BZXX)对应") + @ExcelProperty("备注;与ERP(BZXX)对应") + private String remark; + + @Schema(description = "施工类型编号;与ERP(HTLXBH)对应,拓展信息") + @ExcelProperty("施工类型编号;与ERP(HTLXBH)对应,拓展信息") + private String constructionTypeNumber; + + @Schema(description = "施工类型名称;与ERP(HTLXMC)对应,拓展信息", example = "张三") + @ExcelProperty("施工类型名称;与ERP(HTLXMC)对应,拓展信息") + private String constructionTypeName; + + @Schema(description = "代理方;与ERP(ZLIFNR)对应,拓展信息") + @ExcelProperty("代理方;与ERP(ZLIFNR)对应,拓展信息") + private String zlifnr; + + @Schema(description = "类别;与ERP(HTLB)对应,拓展信息") + @ExcelProperty("类别;与ERP(HTLB)对应,拓展信息") + private String category; + + @Schema(description = "原币金额-变更后;与ERP(BGHHTYBZJE)对应,拓展信息") + @ExcelProperty("原币金额-变更后;与ERP(BGHHTYBZJE)对应,拓展信息") + private BigDecimal changeCooAmount; + + @Schema(description = "本币金额-变更后;与ERP(BGHHTBWBZJE)对应,拓展信息") + @ExcelProperty("本币金额-变更后;与ERP(BGHHTBWBZJE)对应,拓展信息") + private BigDecimal changeBasicAmount; + + @Schema(description = "原币履约保证金-变更后;与ERP(LYBZJBGHYB)对应,拓展信息") + @ExcelProperty("原币履约保证金-变更后;与ERP(LYBZJBGHYB)对应,拓展信息") + private BigDecimal changeCooAmountDeposit; + + @Schema(description = "本币履约保证金-变更后;与ERP(LYBZJBGHBWB)对应,拓展信息") + @ExcelProperty("本币履约保证金-变更后;与ERP(LYBZJBGHBWB)对应,拓展信息") + private BigDecimal changeBasicAmountDeposit; + + @Schema(description = "是否框架合同;与ERP(SFKJHT)对应,拓展信息") + @ExcelProperty("是否框架合同;与ERP(SFKJHT)对应,拓展信息") + private String isFramework; + + @Schema(description = "境内/境外;与ERP(JNJW)对应,拓展信息") + @ExcelProperty("境内/境外;与ERP(JNJW)对应,拓展信息") + private String jnjw; + + @Schema(description = "建筑服务发生地;与ERP(JZFWFSD)对应,拓展信息,销售合同,且类型为SAP02COSR必填") + @ExcelProperty("建筑服务发生地;与ERP(JZFWFSD)对应,拓展信息,销售合同,且类型为SAP02COSR必填") + private String architectureServicePlace; + + @Schema(description = "达到收款条件金额;与ERP(DDSKJE)对应,拓展信息,销售合同,且类型为SAP02COSR必填") + @ExcelProperty("达到收款条件金额;与ERP(DDSKJE)对应,拓展信息,销售合同,且类型为SAP02COSR必填") + private BigDecimal payeeConditionAmount; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "步骤") + @ExcelProperty("步骤") + private Integer step; +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractSaveReqVO.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractSaveReqVO.java new file mode 100644 index 0000000..21df898 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/controller/admin/contract/vo/preparaton/ContractSaveReqVO.java @@ -0,0 +1,230 @@ +package cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; + +@Schema(description = "管理后台 - 合同信息新增/修改 Request VO") +@Data +public class ContractSaveReqVO { + + @Schema(description = "主键") + @ExcelProperty("主键") + private Long id; + + @NotNull(message = "步骤不能为空") + @Schema(description = "步骤", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("步骤") + private Integer step; + + // 合同基本信息 + @Schema(description = "甲方公司编号;如果是采购合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是销售合同,手动选择,且与ERP(WLDWBH)对应。") + @ExcelProperty("甲方公司编号;如果是采购合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是销售合同,手动选择,且与ERP(WLDWBH)对应。") + private String purchaseCompanyNumber; + + @Schema(description = "甲方公司名称", example = "王五") + @ExcelProperty("甲方公司名称") + private String purchaseCompanyName; + + @Schema(description = "甲方地址") + @ExcelProperty("甲方地址") + private String purchaseAddress; + + @Schema(description = "甲方法定代表人") + @ExcelProperty("甲方法定代表人") + private String purchaseLeader; + + @Schema(description = "乙方公司编号;如果是销售合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是采购合同,手动选择,且与ERP(WLDWBH)对应。") + @ExcelProperty("乙方公司编号;如果是销售合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是采购合同,手动选择,且与ERP(WLDWBH)对应。") + private String salesCompanyNumber; + + @Schema(description = "乙方公司名称", example = "王五") + @ExcelProperty("乙方公司名称") + private String salesCompanyName; + + @Schema(description = "乙方地址") + @ExcelProperty("乙方地址") + private String salesAddress; + + @Schema(description = "乙方企业负责人") + @ExcelProperty("乙方企业负责人") + private String salesPurchaseLeader; + + @NotBlank(message = "合同名称不能为空") + @Size(max = 90, message = "合同名称长度不能超过90个字符") + @Schema(description = "合同名称;与ERP(HTMC)对应,校验唯一", example = "芋艿") + @ExcelProperty("合同名称;与ERP(HTMC)对应,校验唯一") + private String contractName; + + @Schema(description = "合同编号;与ERP(HTBH)对应,校验唯一") + @ExcelProperty("合同编号;与ERP(HTBH)对应,校验唯一") + private String contractPaperNumber; + + @NotBlank(message = "合同类型不能为空") + @Schema(description = "合同类型", example = "PRCH") + @ExcelProperty("合同类型") + private String contractType; + + @Schema(description = "收支性质;与ERP(SZXZ)对应") + @ExcelProperty("收支性质;与ERP(SZXZ)对应") + private String direction; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @JsonFormat(timezone = TIME_ZONE_DEFAULT, pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "签署日期;与ERP(HTQDRQ)对应") + @ExcelProperty("签署日期;与ERP(HTQDRQ)对应") + private LocalDateTime signDate; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @JsonFormat(timezone = TIME_ZONE_DEFAULT, pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "开始日期;与ERP(HTQSRQ)对应") + @ExcelProperty("开始日期;与ERP(HTQSRQ)对应") + private LocalDateTime startDate; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @JsonFormat(timezone = TIME_ZONE_DEFAULT, pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "结束日期;与ERP(HTZZRQ)对应") + @ExcelProperty("结束日期;与ERP(HTZZRQ)对应") + private LocalDateTime endDate; + + @Schema(description = "签署地") + @ExcelProperty("签署地") + private String signPlace; + + // 金额信息 + @Schema(description = "币种;与ERP(BZBH)对应") + @ExcelProperty("币种;与ERP(BZBH)对应") + private String currency; + + @Schema(description = "本币金额;与ERP(HTBWBZJE)对应") + @ExcelProperty("本币金额;与ERP(HTBWBZJE)对应") + private BigDecimal basicAmount; + + @Schema(description = "原币金额;与ERP(HTYBZJE)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额") + @ExcelProperty("原币金额;与ERP(HTYBZJE)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额") + private BigDecimal cooAmount; + + @Schema(description = "是否有履约保证金;为是,则保证金必填。") + @ExcelProperty("是否有履约保证金;为是,则保证金必填。") + private String hasDeposit; + + @Schema(description = "原币履约保证金;与ERP(LYBZJBGQYB)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额") + @ExcelProperty("原币履约保证金;与ERP(LYBZJBGQYB)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额") + private BigDecimal cooAmountDeposit; + + @Schema(description = "本币履约保证金-变更后;与ERP(LYBZJBGHBWB)对应,拓展信息") + @ExcelProperty("本币履约保证金-变更后;与ERP(LYBZJBGHBWB)对应,拓展信息") + private BigDecimal changeBasicAmountDeposit; + + @Schema(description = "是否有预付款;与ERP(SFYYFK)对应") + @ExcelProperty("是否有预付款;与ERP(SFYYFK)对应") + private String hasPrepayment; + + @Schema(description = "预付款比例;与ERP(YFKBL)对应") + @ExcelProperty("预付款比例;与ERP(YFKBL)对应") + private BigDecimal prepaymentRatio; + + @Schema(description = "预付款金额;与ERP(YFKJE)对应") + @ExcelProperty("预付款金额;与ERP(YFKJE)对应") + private BigDecimal prepaymentAmount; + + @Schema(description = "是否有质保金;与ERP(SFHZBJ)对应") + @ExcelProperty("是否有质保金;与ERP(SFHZBJ)对应") + private String hasQualityAmount; + + @Schema(description = "质保金比例;与ERP(ZBJBL)对应") + @ExcelProperty("质保金比例;与ERP(ZBJBL)对应") + private BigDecimal qualityRatio; + + @Schema(description = "质保金金额;与ERP(BZJJE)对应") + @ExcelProperty("质保金金额;与ERP(BZJJE)对应") + private BigDecimal qualityAmount; + + @Schema(description = "是否先款后货") + @ExcelProperty("是否先款后货") + private String hasPayable; + + @Schema(description = "备注;与ERP(BZXX)对应") + @ExcelProperty("备注;与ERP(BZXX)对应") + private String remark; + + // 物料信息 + private List detail; + + // 扩展信息 + @Schema(description = "原币金额-变更后;与ERP(BGHHTYBZJE)对应,拓展信息") + @ExcelProperty("原币金额-变更后;与ERP(BGHHTYBZJE)对应,拓展信息") + private BigDecimal changeCooAmount; + + @Schema(description = "本币金额-变更后;与ERP(BGHHTBWBZJE)对应,拓展信息") + @ExcelProperty("本币金额-变更后;与ERP(BGHHTBWBZJE)对应,拓展信息") + private BigDecimal changeBasicAmount; + + @Schema(description = "原币履约保证金-变更后;与ERP(LYBZJBGHYB)对应,拓展信息") + @ExcelProperty("原币履约保证金-变更后;与ERP(LYBZJBGHYB)对应,拓展信息") + private BigDecimal changeCooAmountDeposit; + + @Schema(description = "本币履约保证金;与ERP(LYBZJBGQBWB)对应") + @ExcelProperty("本币履约保证金;与ERP(LYBZJBGQBWB)对应") + private BigDecimal basicAmountDeposit; + + @Schema(description = "是否框架合同;与ERP(SFKJHT)对应,拓展信息") + @ExcelProperty("是否框架合同;与ERP(SFKJHT)对应,拓展信息") + private String isFramework; + + @Schema(description = "境内/境外;与ERP(JNJW)对应,拓展信息") + @ExcelProperty("境内/境外;与ERP(JNJW)对应,拓展信息") + private String jnjw; + + @Schema(description = "施工类型编号;与ERP(HTLXBH)对应,拓展信息") + @ExcelProperty("施工类型编号;与ERP(HTLXBH)对应,拓展信息") + private String constructionTypeNumber; + + @Schema(description = "施工类型名称;与ERP(HTLXMC)对应,拓展信息", example = "张三") + @ExcelProperty("施工类型名称;与ERP(HTLXMC)对应,拓展信息") + private String constructionTypeName; + + @Schema(description = "代理方;与ERP(ZLIFNR)对应,拓展信息") + @ExcelProperty("代理方;与ERP(ZLIFNR)对应,拓展信息") + private String zlifnr; + + @Schema(description = "类别;与ERP(HTLB)对应,拓展信息") + @ExcelProperty("类别;与ERP(HTLB)对应,拓展信息") + private String category; + + // 模板部分查询 + @Schema(description = "模板实例主键", example = "10196") + @ExcelProperty("模板实例主键") + private Long instanceId; + // 合同动态表单 + // 合同动态条款 + + // TODO 未确认字段 + @Schema(description = "是否虚拟合同;与ERP(SFXNHT)对应") + @ExcelProperty("是否虚拟合同;与ERP(SFXNHT)对应") + private String contractVirtual; + + @Schema(description = "补充协议类型;变更协议/增加条款", example = "1") + @ExcelProperty("补充协议类型;变更协议/增加条款") + private String replenishAgreementType; + + @Schema(description = "建筑服务发生地;与ERP(JZFWFSD)对应,拓展信息,销售合同,且类型为SAP02COSR必填") + @ExcelProperty("建筑服务发生地;与ERP(JZFWFSD)对应,拓展信息,销售合同,且类型为SAP02COSR必填") + private String architectureServicePlace; + + @Schema(description = "达到收款条件金额;与ERP(DDSKJE)对应,拓展信息,销售合同,且类型为SAP02COSR必填") + @ExcelProperty("达到收款条件金额;与ERP(DDSKJE)对应,拓展信息,销售合同,且类型为SAP02COSR必填") + private BigDecimal payeeConditionAmount; +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractDetailDO.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractDetailDO.java new file mode 100644 index 0000000..2dd8e3f --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractDetailDO.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.module.contractorder.dal.dataobject.contract; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BusinessBaseDO; +import com.baomidou.mybatisplus.annotation.*; +import lombok.*; +import java.math.BigDecimal; + +/** + * 合同明细 DO + * + * @author 后台管理 + */ +@TableName("bse_ctrt_dtl") +@KeySequence("bse_ctrt_dtl_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +/** + * 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO + */ +public class ContractDetailDO extends BusinessBaseDO { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + /** + * 合同主信息主键 + */ + @TableField("CTRT_MAIN_ID") + private Long contractMainId; + /** + * 物料名称 + */ + @TableField("MTRL_NAME") + private String materialName; + /** + * 物料编码 + */ + @TableField("MTRL_NUM") + private String materialNumber; + /** + * 数量 + */ + @TableField("QTY") + private BigDecimal quantity; + /** + * 计量单位 + */ + @TableField("UNT") + private String unit; + /** + * 含税单价 + */ + @TableField("IN_TAX_UPRC") + private BigDecimal inTaxUnitPrice; + /** + * 金属元素缩写 + */ + @TableField("ELEM_ABBR") + private String elementAbbreviation; + /** + * 金属元素名称 + */ + @TableField("ELEM_NAME") + private String elementName; + /** + * 金属元素编码 + */ + @TableField("ELEM_NUM") + private String elementNumber; +} diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractMainDO.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractMainDO.java new file mode 100644 index 0000000..0f21de7 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractMainDO.java @@ -0,0 +1,273 @@ +package cn.iocoder.yudao.module.contractorder.dal.dataobject.contract; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BusinessBaseDO; +import com.baomidou.mybatisplus.annotation.*; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 合同主信息 DO + * + * @author 后台管理 + */ +@TableName("bse_ctrt_main") +@KeySequence("bse_ctrt_main_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +/** + * 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO + */ +public class ContractMainDO extends BusinessBaseDO { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + /** + * 模板实例主键 + */ + @TableField("INSC_ID") + private Long instanceId; + /** + * 系统合同编号;自动生成,校验唯一 + */ + @TableField("SYS_CTRT_NUM") + private String systemContractNumber; + /** + * 状态 + */ + @TableField("STS") + private String status; + /** + * 合同名称;与ERP(HTMC)对应,校验唯一 + */ + @TableField("CTRT_NAME") + private String contractName; + /** + * 合同编号;与ERP(HTBH)对应,校验唯一 + */ + @TableField("CTRT_PPR_NUM") + private String contractPaperNumber; + /** + * 是否虚拟合同;与ERP(SFXNHT)对应 + */ + @TableField("CTRT_VRTL") + private String contractVirtual; + /** + * 是否先款后货 + */ + @TableField("HS_PYBL") + private String hasPayable; + /** + * 收支性质;与ERP(SZXZ)对应 + */ + @TableField("DRCT") + private String direction; + /** + * 合同类型 + */ + @TableField("CTRT_TP") + private String contractType; + /** + * 签署日期;与ERP(HTQDRQ)对应 + */ + @TableField("SGN_DT") + private LocalDateTime signDate; + /** + * 开始日期;与ERP(HTQSRQ)对应 + */ + @TableField("STRT_DT") + private LocalDateTime startDate; + /** + * 结束日期;与ERP(HTZZRQ)对应 + */ + @TableField("END_DT") + private LocalDateTime endDate; + /** + * 签署地 + */ + @TableField("SGN_PLCE") + private String signPlace; + /** + * 甲方公司编号;如果是采购合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是销售合同,手动选择,且与ERP(WLDWBH)对应。 + */ + @TableField("PRCH_CPN_NUM") + private String purchaseCompanyNumber; + /** + * 甲方公司名称 + */ + @TableField("PRCH_CPN_NAME") + private String purchaseCompanyName; + /** + * 甲方地址 + */ + @TableField("PRCH_ADR") + private String purchaseAddress; + /** + * 甲方法定代表人 + */ + @TableField("PRCH_LDR") + private String purchaseLeader; + /** + * 乙方公司编号;如果是销售合同,查询组织机构自动带出,且与ERP(HTQDZTBH)对应,如果是采购合同,手动选择,且与ERP(WLDWBH)对应。 + */ + @TableField("SALE_CPN_NUM") + private String salesCompanyNumber; + /** + * 乙方公司名称 + */ + @TableField("SALE_CPN_NAME") + private String salesCompanyName; + /** + * 乙方地址 + */ + @TableField("SALE_ADR") + private String salesAddress; + /** + * 乙方企业负责人 + */ + @TableField("SALE_PRCH_LDR") + private String salesPurchaseLeader; + /** + * 币种;与ERP(BZBH)对应 + */ + @TableField("CUR") + private String currency; + /** + * 原币金额;与ERP(HTYBZJE)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额 + */ + @TableField("COO_AMT") + private BigDecimal cooAmount; + /** + * 本币金额;与ERP(HTBWBZJE)对应 + */ + @TableField("BSC_AMT") + private BigDecimal basicAmount; + /** + * 是否有履约保证金;为是,则保证金必填。 + */ + @TableField("HS_DPST") + private String hasDeposit; + /** + * 原币履约保证金;与ERP(LYBZJBGQYB)对应,币种不是人民币时,显示并手动填写,如果是人民币,隐藏且等于本币金额 + */ + @TableField("COO_AMT_DPST") + private BigDecimal cooAmountDeposit; + /** + * 本币履约保证金;与ERP(LYBZJBGQBWB)对应 + */ + @TableField("BSC_AMT_DPST") + private BigDecimal basicAmountDeposit; + /** + * 是否有预付款;与ERP(SFYYFK)对应 + */ + @TableField("HS_PPYM") + private String hasPrepayment; + /** + * 预付款比例;与ERP(YFKBL)对应 + */ + @TableField("PPYM_RTIO") + private BigDecimal prepaymentRatio; + /** + * 预付款金额;与ERP(YFKJE)对应 + */ + @TableField("PPYM_AMT") + private BigDecimal prepaymentAmount; + /** + * 是否有质保金;与ERP(SFHZBJ)对应 + */ + @TableField("HS_QLT_AMT") + private String hasQualityAmount; + /** + * 质保金比例;与ERP(ZBJBL)对应 + */ + @TableField("QLT_RTIO") + private BigDecimal qualityRatio; + /** + * 质保金金额;与ERP(BZJJE)对应 + */ + @TableField("QLT_AMT") + private BigDecimal qualityAmount; + /** + * 补充协议类型;变更协议/增加条款 + */ + @TableField("RPL_AGR_TP") + private String replenishAgreementType; + /** + * 备注;与ERP(BZXX)对应 + */ + @TableField("RMK") + private String remark; + /** + * 施工类型编号;与ERP(HTLXBH)对应,拓展信息 + */ + @TableField("CON_TP_NUM") + private String constructionTypeNumber; + /** + * 施工类型名称;与ERP(HTLXMC)对应,拓展信息 + */ + @TableField("CON_TP_NAME") + private String constructionTypeName; + /** + * 代理方;与ERP(ZLIFNR)对应,拓展信息 + */ + @TableField("ZLIFNR") + private String zlifnr; + /** + * 类别;与ERP(HTLB)对应,拓展信息 + */ + @TableField("CTGR") + private String category; + /** + * 原币金额-变更后;与ERP(BGHHTYBZJE)对应,拓展信息 + */ + @TableField("CHG_COO_AMT") + private BigDecimal changeCooAmount; + /** + * 本币金额-变更后;与ERP(BGHHTBWBZJE)对应,拓展信息 + */ + @TableField("CHG_BSC_AMT") + private BigDecimal changeBasicAmount; + /** + * 原币履约保证金-变更后;与ERP(LYBZJBGHYB)对应,拓展信息 + */ + @TableField("CHG_COO_AMT_DPST") + private BigDecimal changeCooAmountDeposit; + /** + * 本币履约保证金-变更后;与ERP(LYBZJBGHBWB)对应,拓展信息 + */ + @TableField("CHG_BSC_AMT_DPST") + private BigDecimal changeBasicAmountDeposit; + /** + * 是否框架合同;与ERP(SFKJHT)对应,拓展信息 + */ + @TableField("IS_FMWK") + private String isFramework; + /** + * 境内/境外;与ERP(JNJW)对应,拓展信息 + */ + @TableField("JNJW") + private String jnjw; + /** + * 建筑服务发生地;与ERP(JZFWFSD)对应,拓展信息,销售合同,且类型为SAP02COSR必填 + */ + @TableField("ARCH_SVC_PLCE") + private String architectureServicePlace; + /** + * 达到收款条件金额;与ERP(DDSKJE)对应,拓展信息,销售合同,且类型为SAP02COSR必填 + */ + @TableField("PYEE_CND_AMT") + private BigDecimal payeeConditionAmount; + /** + * 步骤 + */ + @TableField("STP") + private Integer step; +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractPlanDO.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractPlanDO.java new file mode 100644 index 0000000..e847454 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/dataobject/contract/ContractPlanDO.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.contractorder.dal.dataobject.contract; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BusinessBaseDO; +import com.baomidou.mybatisplus.annotation.*; +import lombok.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 交货计划条款 DO + * + * @author 后台管理 + */ +@TableName("bse_ctrt_pln") +@KeySequence("bse_ctrt_pln_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +/** + * 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO + */ +public class ContractPlanDO extends BusinessBaseDO { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + /** + * 合同明细主键 + */ + @TableField("CTRT_DTL_ID") + private Long contractDetailId; + /** + * 交货年份 + */ + @TableField("CTRT_DLVY_YR") + private Long contractDeliveryYear; + /** + * 交货月份 + */ + @TableField("CTRT_PLN_DLVY_MNT") + private Long contractPlanDeliveryMonth; + /** + * 计划交货数量 + */ + @TableField("CTRT_PLN_DLVY_QTY") + private BigDecimal contractPlanDeliveryQuantity; + /** + * 交货开始日期 + */ + @TableField("CTRT_DLVY_STRT_DT") + private LocalDateTime contractDeliveryStartDate; + /** + * 交货结束日期 + */ + @TableField("CTRT_DLVY_END_DT") + private LocalDateTime contractDeliveryEndDate; +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/mysql/contract/ContractDetailMapper.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/mysql/contract/ContractDetailMapper.java new file mode 100644 index 0000000..71fbe57 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/mysql/contract/ContractDetailMapper.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.contractorder.dal.mysql.contract; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.contractorder.dal.dataobject.contract.ContractDetailDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 合同明细 Mapper + * + * @author 后台管理 + */ +@Mapper +public interface ContractDetailMapper extends BaseMapperX { +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/mysql/contract/ContractMainMapper.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/mysql/contract/ContractMainMapper.java new file mode 100644 index 0000000..9dd2903 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/dal/mysql/contract/ContractMainMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.contractorder.dal.mysql.contract; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton.ContractPageReqVO; +import cn.iocoder.yudao.module.contractorder.dal.dataobject.contract.ContractMainDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 合同主信息 Mapper + * + * @author 后台管理 + */ +@Mapper +public interface ContractMainMapper extends BaseMapperX { + default PageResult selectContractPage(ContractPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(ContractMainDO::getContractName, reqVO.getContractName()) + .eqIfPresent(ContractMainDO::getContractPaperNumber, reqVO.getContractPaperNumber()) + .eqIfPresent(ContractMainDO::getDirection, reqVO.getDirection()) + .betweenIfPresent(ContractMainDO::getSignDate, reqVO.getSignDate()) + .likeIfPresent(ContractMainDO::getPurchaseCompanyName, reqVO.getPurchaseCompanyName()) + .eqIfPresent(ContractMainDO::getBasicAmount, reqVO.getBasicAmount()) + .orderByDesc(ContractMainDO::getCreateTime)); + } +} \ No newline at end of file diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/service/contract/ContractService.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/service/contract/ContractService.java new file mode 100644 index 0000000..a1c42e7 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/service/contract/ContractService.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.contractorder.service.contract; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton.ContractPageReqVO; +import cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton.ContractSaveReqVO; +import cn.iocoder.yudao.module.contractorder.dal.dataobject.contract.ContractMainDO; +import jakarta.validation.Valid; + +/** + * 后台合同编制 Service 接口 + * + * @author ZT + */ +public interface ContractService { + + /** + * 获得合同分页列表 + * + * @param pageReqVO 分页条件 + * @return 分页列表 + */ + PageResult getContractPage(@Valid ContractPageReqVO pageReqVO); + + /** + * 新增合同 + * + * @param reqVO 用户信息 + * @return 合同ID + */ + Long createContract(@Valid ContractSaveReqVO reqVO); +} diff --git a/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/service/contract/ContractServiceImpl.java b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/service/contract/ContractServiceImpl.java new file mode 100644 index 0000000..77f2532 --- /dev/null +++ b/yudao-module-contract-order/yudao-module-contract-order-server/src/main/java/cn/iocoder/yudao/module/contractorder/service/contract/ContractServiceImpl.java @@ -0,0 +1,113 @@ +package cn.iocoder.yudao.module.contractorder.service.contract; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.tenant.core.context.CompanyContextHolder; +import cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton.ContractPageReqVO; +import cn.iocoder.yudao.module.contractorder.controller.admin.contract.vo.preparaton.ContractSaveReqVO; +import cn.iocoder.yudao.module.contractorder.dal.dataobject.contract.ContractMainDO; +import cn.iocoder.yudao.module.contractorder.dal.mysql.contract.ContractMainMapper; +import cn.iocoder.yudao.module.contractorder.enums.contract.ContractStatusEnum; +import cn.iocoder.yudao.module.contractorder.enums.contract.DateConstants; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.contractorder.enums.ErrorCodeConstants.*; + +/** + * 后台合同编制 Service 实现类 + * + * @author ZT + */ +@Slf4j +@Service +public class ContractServiceImpl implements ContractService { + + @Resource + private ContractMainMapper contractMainMapper; + + @Override + public PageResult getContractPage(ContractPageReqVO pageReqVO) { + return contractMainMapper.selectContractPage(pageReqVO); + } + + @Override + public Long createContract(ContractSaveReqVO reqVO) { + + // 校验合同名称是否存在 + ContractMainDO contract = contractMainMapper.selectOne("CTRT_NAME", reqVO.getContractName()); + if (contract != null) { + throw exception(CONTRACT_NAME_EXISTS); + } + + if (StringUtils.isNotEmpty(reqVO.getContractPaperNumber())) { + // 校验合同编号是否存在 + contract = contractMainMapper.selectOne("CTRT_PPR_NUM", reqVO.getContractPaperNumber()); + if (contract != null) { + throw exception(CONTRACT_PAPER_NUMBER_EXISTS); + } + } + + // 合同主信息 + ContractMainDO contractMainDO = BeanUtils.toBean(reqVO, ContractMainDO.class); + // 合同状态保存为草稿 + contractMainDO.setStatus(ContractStatusEnum.DRAFT.getCode()); + // 生成系统合同编号 + contractMainDO.setSystemContractNumber(generateSystemContractNumber(reqVO.getContractType())); + + // 保存合同主信息 + contractMainMapper.insert(contractMainDO); + + System.out.println(contractMainDO); + return contractMainDO.getId(); + } + + /** + * 生成系统合同编号 + * + * 单据号生成规则说明 + * 单据名称(拼音)-类型-公司编码-年月日-六位编号 + * 如请款单: QKD-ZGQK-3000-20250915-00001 + * + * @param contractType 合同类型 + * + * @return 系统合同编号 + */ + private String generateSystemContractNumber(String contractType) { + + // 单据名称(拼音) + String documentName = "XTHT"; + // 公司编码 + String companyId = CompanyContextHolder.getCompanyId().toString(); + // 年月日 + String yearMounth8Bit = LocalDate.now() + .format(DateTimeFormatter.ofPattern(DateConstants.DATE_FORMAT_YEAR_MONTH_DAY_8_BIT)); + // 查询最大编号 + String numPrefix = documentName+"-"+contractType+"-"+companyId+"-"+yearMounth8Bit; + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.likeRight("SYS_CTRT_NUM", numPrefix); + queryWrapper.orderByDesc("SYS_CTRT_NUM"); + queryWrapper.last("limit 1"); + ContractMainDO contract = contractMainMapper.selectOne(queryWrapper); + // 获取最大的6位编号+1作为生成的编号 + String num = null; + if (contract == null) { + num = "000001"; + } else { + String[] systemContractNumberSplit = contract.getSystemContractNumber().split("-"); + int numInt = Integer.parseInt(systemContractNumberSplit[systemContractNumberSplit.length - 1]) + 1; + if (numInt > 999999) { + throw exception(CONTRACT_NUM_TRANSFINITE); + } + num = String.format("%06d", numInt); + } + return numPrefix + "-" + num; + } +}