浏览代码

1、采购合同功能接口

dongpo 7 月之前
父节点
当前提交
7d998fcb89
共有 11 个文件被更改,包括 417 次插入56 次删除
  1. 1 0
      yudao-module-finance/yudao-module-contract-api/src/main/java/cn/iocoder/yudao/module/contract/enums/ErrorCodeConstants.java
  2. 111 34
      yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/controller/admin/suppliercontract/SupplierContractController.java
  3. 2 4
      yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/controller/admin/suppliercontract/vo/SupplierContractCloseReqVO.java
  4. 5 0
      yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/controller/admin/suppliercontract/vo/SupplierContractSaveReqVO.java
  5. 2 2
      yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/controller/admin/suppliercontract/vo/SupplierContractStatusReqVO.java
  6. 8 2
      yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/dal/mysql/suppliercontract/SupplierContractHistoryMapper.java
  7. 20 0
      yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/dal/mysql/suppliercontract/SupplierContractMapper.java
  8. 56 3
      yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/service/suppliercontract/SupplierContractService.java
  9. 112 11
      yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/service/suppliercontract/SupplierContractServiceImpl.java
  10. 91 0
      yudao-module-finance/yudao-module-contract-biz/src/main/resources/mapper/suppliercontract/SupplierContractHistoryMapper.xml
  11. 9 0
      yudao-module-finance/yudao-module-contract-biz/src/main/resources/mapper/suppliercontract/SupplierContractMapper.xml

+ 1 - 0
yudao-module-finance/yudao-module-contract-api/src/main/java/cn/iocoder/yudao/module/contract/enums/ErrorCodeConstants.java

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 public interface ErrorCodeConstants {
     // ========== 采购合同信息 1_052_000_001 ==========
     ErrorCode SUPPLIER_CONTRACT_NOT_EXISTS = new ErrorCode(1_052_000_001, "采购合同信息不存在");
+    ErrorCode SUPPLIER_CONTRACT_NOT_CLOSED = new ErrorCode(1_052_000_002, "采购合同已经是开启状态");
     // ========== 采购合同历史信息 1_052_000_001 ==========
     ErrorCode SUPPLIER_CONTRACT_HISTORY_NOT_EXISTS = new ErrorCode(1_052_000_002, "采购合同历史信息不存在");
 }

+ 111 - 34
yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/controller/admin/suppliercontract/SupplierContractController.java

@@ -7,9 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractPageReqVO;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractRespVO;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractSaveReqVO;
+import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.*;
 import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractDO;
 import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractHistoryDO;
 import cn.iocoder.yudao.module.contract.enums.ContractStatusEnum;
@@ -25,7 +23,6 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springdoc.api.annotations.ParameterObject;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -88,7 +85,7 @@ public class SupplierContractController {
     @DeleteMapping("/delete")
     @Operation(summary = "删除采购合同信息")
     @ApiOperationSupport(order = 4)
-    @Parameter(name = "id", description = "编号", required = true)
+    @Parameter(name = "id", description = "主键id", required = true)
     // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:delete')")
     public CommonResult<Boolean> deleteSupplierContract(@RequestParam("id") Long id) {
         supplierContractService.deleteSupplierContract(id);
@@ -98,7 +95,7 @@ public class SupplierContractController {
     @GetMapping("/get")
     @Operation(summary = "获得采购合同信息")
     @ApiOperationSupport(order = 5)
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @Parameter(name = "id", description = "主键id", required = true, example = "1")
     // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:query')")
     public CommonResult<SupplierContractRespVO> getSupplierContract(@RequestParam("id") Long id) {
         SupplierContractDO supplierContract = supplierContractService.getSupplierContract(id);
@@ -150,55 +147,135 @@ public class SupplierContractController {
     // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:export')")
     @ApiAccessLog(operateType = EXPORT)
     public void exportSupplierContractExcel(@ParameterObject SupplierContractPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
+                                            HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
         List<SupplierContractRespVO> list = supplierContractService.getSupplierContractPage(pageReqVO).getList();
         // 导出 Excel
         ExcelUtils.write(response, "采购合同信息.xls", "数据", SupplierContractRespVO.class,
-                        list);
+                list);
     }
 
+    @PutMapping("/open")
+    @Operation(summary = "开启采购合同")
+    @ApiOperationSupport(order = 8)
+    @Parameter(name = "id", description = "主键id", required = true, example = "1")
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:update')")
+    public CommonResult<Boolean> openSupplierContract(@RequestParam("id") Long id) {
+        supplierContractService.openSupplierContract(id);
+        return success(true);
+    }
+
+    @PutMapping("/close")
+    @Operation(summary = "关闭采购合同")
+    @ApiOperationSupport(order = 9)
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:update')")
+    public CommonResult<Boolean> closeSupplierContract(@Valid @RequestBody SupplierContractCloseReqVO closeReqVO) {
+        supplierContractService.closeSupplierContract(closeReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/terminate")
+    @Operation(summary = "终止采购合同")
+    @ApiOperationSupport(order = 10)
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:update')")
+    public CommonResult<Boolean> terminateSupplierContract(@Valid @RequestBody SupplierContractTerminatedReqVO terminatedReqVO) {
+        supplierContractService.terminateSupplierContract(terminatedReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/editSupplierStatus")
+    @Operation(summary = "修改采购合同状态")
+    @ApiOperationSupport(order = 11)
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:update')")
+    public CommonResult<Boolean> editSupplierStatus(@Valid @RequestBody SupplierContractStatusReqVO statusReqVO) {
+        supplierContractService.editSupplierStatus(statusReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/alter")
+    @Operation(summary = "变更采购合同信息")
+    @ApiOperationSupport(order = 12)
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:update')")
+    public CommonResult<Boolean> alterSupplierContract(@Valid @RequestBody SupplierContractSaveReqVO updateReqVO) {
+        supplierContractService.alterSupplierContract(updateReqVO);
+        return success(true);
+    }
+
+
     // ==================== 子表(采购合同历史信息) ====================
 
     @GetMapping("/supplier-contract-history/page")
     @Operation(summary = "获得采购合同历史信息分页")
+    @ApiOperationSupport(order = 13)
     @Parameter(name = "code", description = "合同编号,年月日+uuid")
-    @PreAuthorize("@ss.hasPermission('contract:supplier-contract:query')")
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:query')")
     public CommonResult<PageResult<SupplierContractHistoryDO>> getSupplierContractHistoryPage(PageParam pageReqVO,
                                                                                               @RequestParam("code") String code) {
         return success(supplierContractService.getSupplierContractHistoryPage(pageReqVO, code));
     }
 
-    @PostMapping("/supplier-contract-history/create")
-    @Operation(summary = "创建采购合同历史信息")
-    @PreAuthorize("@ss.hasPermission('contract:supplier-contract:create')")
-    public CommonResult<Long> createSupplierContractHistory(@Valid @RequestBody SupplierContractHistoryDO supplierContractHistory) {
-        return success(supplierContractService.createSupplierContractHistory(supplierContractHistory));
-    }
+    // @PostMapping("/supplier-contract-history/create")
+    // @Operation(summary = "创建采购合同历史信息")
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:create')")
+    // public CommonResult<Long> createSupplierContractHistory(@Valid @RequestBody SupplierContractHistoryDO supplierContractHistory) {
+    //     return success(supplierContractService.createSupplierContractHistory(supplierContractHistory));
+    // }
 
-    @PutMapping("/supplier-contract-history/update")
-    @Operation(summary = "更新采购合同历史信息")
-    @PreAuthorize("@ss.hasPermission('contract:supplier-contract:update')")
-    public CommonResult<Boolean> updateSupplierContractHistory(@Valid @RequestBody SupplierContractHistoryDO supplierContractHistory) {
-        supplierContractService.updateSupplierContractHistory(supplierContractHistory);
-        return success(true);
-    }
+    // @PutMapping("/supplier-contract-history/update")
+    // @Operation(summary = "更新采购合同历史信息")
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:update')")
+    // public CommonResult<Boolean> updateSupplierContractHistory(@Valid @RequestBody SupplierContractHistoryDO supplierContractHistory) {
+    //     supplierContractService.updateSupplierContractHistory(supplierContractHistory);
+    //     return success(true);
+    // }
 
-    @DeleteMapping("/supplier-contract-history/delete")
-    @Parameter(name = "id", description = "编号", required = true)
-    @Operation(summary = "删除采购合同历史信息")
-    @PreAuthorize("@ss.hasPermission('contract:supplier-contract:delete')")
-    public CommonResult<Boolean> deleteSupplierContractHistory(@RequestParam("id") Long id) {
-        supplierContractService.deleteSupplierContractHistory(id);
-        return success(true);
-    }
+    // @DeleteMapping("/supplier-contract-history/delete")
+    // @Parameter(name = "id", description = "编号", required = true)
+    // @Operation(summary = "删除采购合同历史信息")
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:delete')")
+    // public CommonResult<Boolean> deleteSupplierContractHistory(@RequestParam("id") Long id) {
+    //     supplierContractService.deleteSupplierContractHistory(id);
+    //     return success(true);
+    // }
 
 	@GetMapping("/supplier-contract-history/get")
 	@Operation(summary = "获得采购合同历史信息")
-	@Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('contract:supplier-contract:query')")
-	public CommonResult<SupplierContractHistoryDO> getSupplierContractHistory(@RequestParam("id") Long id) {
-	    return success(supplierContractService.getSupplierContractHistory(id));
+    @ApiOperationSupport(order = 14)
+	@Parameter(name = "id", description = "主键id", required = true)
+    // @PreAuthorize("@ss.hasPermission('contract:supplier-contract:query')")
+	public CommonResult<SupplierContractRespVO> getSupplierContractHistory(@RequestParam("id") Long id) {
+        SupplierContractHistoryDO supplierContractHistory = supplierContractService.getSupplierContractHistory(id);
+        SupplierContractRespVO supplierContractRespVO = BeanUtils.toBean(supplierContractHistory, SupplierContractRespVO.class);
+
+        // 是否描述集合
+        Map<Integer, String> generalStatusMap = Arrays.stream(GeneralStatusEnum.values())
+                .collect(Collectors.toMap(GeneralStatusEnum::getStatus, GeneralStatusEnum::getName));
+        // 是否框架合同
+        supplierContractRespVO.setIsFrameContractDesc(generalStatusMap.getOrDefault(supplierContractHistory.getIsFrameContract(), "未知"));
+        // 负责人名称
+        EmployeeRespDTO ownerEmployee = employeeApi.getEmployeeById(supplierContractHistory.getOwnerEmployeeId());
+        if (Objects.nonNull(ownerEmployee)) {
+            supplierContractRespVO.setOwnerEmployeeName(ownerEmployee.getName());
+        }
+        // 部门名称
+        DeptRespDTO ownerDept = deptApi.getDept(supplierContractHistory.getDeptId());
+        if (Objects.nonNull(ownerDept)) {
+            supplierContractRespVO.setDeptName(ownerDept.getName());
+        }
+        // 合同状态描述
+        Map<String, String> contractStatusMap = Arrays.stream(ContractStatusEnum.values())
+                .collect(Collectors.toMap(ContractStatusEnum::getStatus, ContractStatusEnum::getDesc));
+        supplierContractRespVO.setContractStatusDesc(contractStatusMap.getOrDefault(supplierContractHistory.getContractStatus(), "未知"));
+        // 是否关闭
+        supplierContractRespVO.setClosedDesc(generalStatusMap.getOrDefault(supplierContractHistory.getClosed(), "未知"));
+        // 是否终止
+        supplierContractRespVO.setTerminateDesc(generalStatusMap.getOrDefault(supplierContractHistory.getTerminate(), "未知"));
+
+        // 附件
+        List<FileDTO> fileDTOList = fileApi.getFileDTOListByBiz(supplierContractHistory.getSupplierContractUuid());
+        supplierContractRespVO.setFileList(fileDTOList);
+
+        return success(supplierContractRespVO);
 	}
 
 }

+ 2 - 4
yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/controller/admin/suppliercontract/vo/SupplierContractCloseReqVO.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 
 @Schema(description = "管理后台 - 采购合同开启/关闭 Request VO")
@@ -13,11 +14,8 @@ public class SupplierContractCloseReqVO {
     @NotNull(message = "主键id不能为空")
     private Long id;
 
-    @Schema(description = "是否关闭 0开启 1关闭", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "是否关闭 0开启 1关闭不能为空")
-    private Integer closed;
-
     @Schema(description = "关闭原因", example = "不喜欢")
+    @NotBlank(message = "关闭原因不能为空")
     private String closeReason;
 
 }

+ 5 - 0
yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/controller/admin/suppliercontract/vo/SupplierContractSaveReqVO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -56,4 +57,8 @@ public class SupplierContractSaveReqVO {
 
     @Schema(description = "附件主键id", example = "[]")
     private List<Long> fileIdList;
+
+    @Schema(description = "是否变更 0否 1是,无需传递该参数", example = "0")
+    @JsonIgnore
+    private Integer isChange;
 }

+ 2 - 2
yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/controller/admin/suppliercontract/vo/SupplierContractStatusReqVO.java

@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 
 @Schema(description = "管理后台 - 采购合同修改状态 Request VO")
@@ -15,7 +15,7 @@ public class SupplierContractStatusReqVO {
     private Long id;
 
     @Schema(description = "合同状态:0、未归档;1、已归档;2、已完结", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    @NotEmpty(message = "合同状态:0、未归档;1、已归档;2、已完结不能为空")
+    @NotBlank(message = "合同状态:0、未归档;1、已归档;2、已完结不能为空")
     private String contractStatus;
 
 }

+ 8 - 2
yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/dal/mysql/suppliercontract/SupplierContractHistoryMapper.java

@@ -6,6 +6,9 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractHistoryDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 采购合同历史信息 Mapper
@@ -17,12 +20,15 @@ public interface SupplierContractHistoryMapper extends BaseMapperX<SupplierContr
 
     default PageResult<SupplierContractHistoryDO> selectPage(PageParam reqVO, String code) {
         return selectPage(reqVO, new LambdaQueryWrapperX<SupplierContractHistoryDO>()
-            .eq(SupplierContractHistoryDO::getSupplierContractCode, code)
-            .orderByDesc(SupplierContractHistoryDO::getId));
+                .eq(SupplierContractHistoryDO::getSupplierContractCode, code)
+                .orderByDesc(SupplierContractHistoryDO::getId));
     }
 
     default int deleteByCode(String code) {
         return delete(SupplierContractHistoryDO::getSupplierContractCode, code);
     }
 
+    long getPageCount(@Param("page") PageParam pageReqVO, @Param("code") String code);
+
+    List<SupplierContractHistoryDO> getPageList(@Param("page") PageParam pageReqVO, @Param("code") String code);
 }

+ 20 - 0
yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/dal/mysql/suppliercontract/SupplierContractMapper.java

@@ -34,7 +34,27 @@ public interface SupplierContractMapper extends BaseMapperX<SupplierContractDO>
                 .orderByDesc(SupplierContractDO::getId));
     }
 
+    /**
+     * 获取采购合同信息总数量
+     *
+     * @param pageReqVO 分页参数
+     * @return 采购合同信息分页总数量
+     */
     long getPageCount(@Param("page") SupplierContractPageReqVO pageReqVO);
 
+    /**
+     * 获取采购合同信息分页列表
+     *
+     * @param pageReqVO 分页参数
+     * @return 采购合同信息分页列表
+     */
     List<SupplierContractRespVO> getPageList(@Param("page") SupplierContractPageReqVO pageReqVO);
+
+    /**
+     * 物理删除采购合同信息
+     *
+     * @param id 编号
+     * @return 是否删除成功
+     */
+    Integer deleteSupplierContractOriginal(Long id);
 }

+ 56 - 3
yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/service/suppliercontract/SupplierContractService.java

@@ -2,9 +2,7 @@ package cn.iocoder.yudao.module.contract.service.suppliercontract;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractPageReqVO;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractRespVO;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractSaveReqVO;
+import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.*;
 import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractDO;
 import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractHistoryDO;
 
@@ -63,6 +61,44 @@ public interface SupplierContractService {
      */
     PageResult<SupplierContractRespVO> getSupplierContractPage(SupplierContractPageReqVO pageReqVO);
 
+    /**
+     * 开启采购合同
+     *
+     * @param id 采购合同id
+     * @return 影响行数
+     */
+    Integer openSupplierContract(Long id);
+
+
+    /**
+     * 关闭采购合同
+     *
+     * @param closeReqVO 关闭请求对象,包含关闭所需的必要信息
+     *                   如合同ID、关闭原因等
+     * @return 返回操作结果,通常是一个标识操作成功与否的整数
+     * 比如:1表示成功,0表示失败
+     */
+    Integer closeSupplierContract(SupplierContractCloseReqVO closeReqVO);
+
+    /**
+     * 终止采购合同
+     *
+     * @param terminatedReqVO 终止请求对象,包含了终止合同所需的各种信息,如合同ID、终止原因等
+     * @return 返回处理结果,通常是处理状态(如成功或失败)的标识,或者处理后的结果数据
+     */
+    Integer terminateSupplierContract(SupplierContractTerminatedReqVO terminatedReqVO);
+
+    /**
+     * 修改合同状态
+     *
+     * @param statusReqVO 供应商合同状态请求对象,包含要更新的状态信息
+     * @return 更新操作的状态码,表示成功与否
+     */
+    Integer editSupplierStatus(SupplierContractStatusReqVO statusReqVO);
+
+
+    SupplierContractDO getSupplierContractByCode(String supplierContractCode);
+
     // ==================== 子表(采购合同历史信息) ====================
 
     /**
@@ -96,6 +132,23 @@ public interface SupplierContractService {
      */
     void deleteSupplierContractHistory(Long id);
 
+    /**
+     * 物理删除采购合同信息
+     *
+     * @param id 编号
+     * @return 影响行数
+     */
+    Integer deleteSupplierContractOriginal(Long id);
+
+
+    /**
+     * 变更采购合同信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void alterSupplierContract(SupplierContractSaveReqVO updateReqVO);
+
+
 	/**
 	 * 获得采购合同历史信息
 	 *

+ 112 - 11
yudao-module-finance/yudao-module-contract-biz/src/main/java/cn/iocoder/yudao/module/contract/service/suppliercontract/SupplierContractServiceImpl.java

@@ -1,15 +1,13 @@
 package cn.iocoder.yudao.module.contract.service.suppliercontract;
 
 import cn.hutool.core.util.IdUtil;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.enums.GeneralStatusEnum;
 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractPageReqVO;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractRespVO;
-import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractSaveReqVO;
+import cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.*;
 import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractDO;
 import cn.iocoder.yudao.module.contract.dal.dataobject.suppliercontract.SupplierContractHistoryDO;
 import cn.iocoder.yudao.module.contract.dal.mysql.suppliercontract.SupplierContractHistoryMapper;
@@ -30,8 +28,7 @@ import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.contract.enums.ErrorCodeConstants.SUPPLIER_CONTRACT_HISTORY_NOT_EXISTS;
-import static cn.iocoder.yudao.module.contract.enums.ErrorCodeConstants.SUPPLIER_CONTRACT_NOT_EXISTS;
+import static cn.iocoder.yudao.module.contract.enums.ErrorCodeConstants.*;
 import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
 
 /**
@@ -88,11 +85,14 @@ public class SupplierContractServiceImpl implements SupplierContractService {
         // 合同状态:0未归档
         supplierContract.setContractStatus(ContractStatusEnum.UNARCHIVED.getStatus());
         // 是否关闭:0否
-        supplierContract.setClosed(CommonStatusEnum.ENABLE.getStatus());
+        supplierContract.setClosed(GeneralStatusEnum.DISABLE.getStatus());
         // 是否终止:0否
-        supplierContract.setTerminate(CommonStatusEnum.ENABLE.getStatus());
+        supplierContract.setTerminate(GeneralStatusEnum.DISABLE.getStatus());
         // 是否变更
-        supplierContract.setIsChange(CommonStatusEnum.ENABLE.getStatus());
+        if (Objects.isNull(createReqVO.getIsChange())) {
+            supplierContract.setIsChange(GeneralStatusEnum.DISABLE.getStatus());
+        }
+
         // 创建人
         supplierContract.setCreator(String.valueOf(loginEmployee.getId()));
 
@@ -136,7 +136,14 @@ public class SupplierContractServiceImpl implements SupplierContractService {
         supplierContractMapper.deleteById(id);
 
         // 删除子表
-        deleteSupplierContractHistoryByCode(supplierContractDO.getSupplierContractCode());
+        // deleteSupplierContractHistoryByCode(supplierContractDO.getSupplierContractCode());
+    }
+
+    @Override
+    public Integer deleteSupplierContractOriginal(Long id) {
+        // 校验存在
+        SupplierContractDO supplierContractDO = validateSupplierContractExists(id);
+        return supplierContractMapper.deleteSupplierContractOriginal(id);
     }
 
     private SupplierContractDO validateSupplierContractExists(Long id) {
@@ -170,11 +177,85 @@ public class SupplierContractServiceImpl implements SupplierContractService {
         return new PageResult<>(pageList, pageCount);
     }
 
+    @Override
+    public Integer openSupplierContract(Long id) {
+        SupplierContractDO supplierContractDO = validateSupplierContractExists(id);
+        if (GeneralStatusEnum.ENABLE.getStatus().equals(supplierContractDO.getClosed())) {
+            throw exception(SUPPLIER_CONTRACT_NOT_CLOSED);
+        }
+        SupplierContractDO build = SupplierContractDO.builder()
+                .id(id)
+                .closed(GeneralStatusEnum.ENABLE.getStatus())
+                .build();
+        return supplierContractMapper.updateById(build);
+    }
+
+    @Override
+    public Integer closeSupplierContract(SupplierContractCloseReqVO closeReqVO) {
+        SupplierContractDO supplierContractDO = validateSupplierContractExists(closeReqVO.getId());
+
+        if (GeneralStatusEnum.DISABLE.getStatus().equals(supplierContractDO.getClosed())) {
+            throw exception(new ErrorCode(SUPPLIER_CONTRACT_NOT_CLOSED.getCode(), "合同已经是关闭状态"));
+        }
+
+        SupplierContractDO build = SupplierContractDO.builder()
+                .id(closeReqVO.getId())
+                .closed(GeneralStatusEnum.DISABLE.getStatus())
+                .closeReason(closeReqVO.getCloseReason())
+                .build();
+
+        return supplierContractMapper.updateById(build);
+    }
+
+    @Override
+    public Integer terminateSupplierContract(SupplierContractTerminatedReqVO terminatedReqVO) {
+        SupplierContractDO supplierContractDO = validateSupplierContractExists(terminatedReqVO.getId());
+        if (GeneralStatusEnum.DISABLE.getStatus().equals(supplierContractDO.getTerminate())) {
+            throw exception(new ErrorCode(SUPPLIER_CONTRACT_NOT_CLOSED.getCode(), "合同已经是终止状态"));
+        }
+        SupplierContractDO build = SupplierContractDO.builder()
+                .id(terminatedReqVO.getId())
+                .terminate(GeneralStatusEnum.DISABLE.getStatus())
+                .terminateDate(terminatedReqVO.getTerminateDate())
+                .terminateReason(terminatedReqVO.getTerminateReason())
+                .build();
+        return supplierContractMapper.updateById(build);
+    }
+
+    @Override
+    public Integer editSupplierStatus(SupplierContractStatusReqVO statusReqVO) {
+        SupplierContractDO supplierContractDO = validateSupplierContractExists(statusReqVO.getId());
+
+        SupplierContractDO build = SupplierContractDO.builder()
+                .id(statusReqVO.getId())
+                .contractStatus(statusReqVO.getContractStatus())
+                .build();
+        return supplierContractMapper.updateById(build);
+    }
+
+    @Override
+    public SupplierContractDO getSupplierContractByCode(String supplierContractCode) {
+        return supplierContractMapper.selectOne(SupplierContractDO::getSupplierContractCode, supplierContractCode);
+    }
+
     // ==================== 子表(采购合同历史信息) ====================
 
     @Override
     public PageResult<SupplierContractHistoryDO> getSupplierContractHistoryPage(PageParam pageReqVO, String code) {
-        return supplierContractHistoryMapper.selectPage(pageReqVO, code);
+        pageReqVO.setPageNo((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize());
+
+        long pageCount = -1;
+        if (!PageParam.PAGE_SIZE_NONE.equals(pageReqVO.getPageSize())) {
+            pageCount = supplierContractHistoryMapper.getPageCount(pageReqVO, code);
+        }
+
+        if (pageCount == 0) {
+            return PageResult.empty();
+        }
+
+        List<SupplierContractHistoryDO> pageList = supplierContractHistoryMapper.getPageList(pageReqVO, code);
+
+        return new PageResult<>(pageList, pageCount);
     }
 
     @Override
@@ -204,6 +285,26 @@ public class SupplierContractServiceImpl implements SupplierContractService {
         return supplierContractHistoryMapper.selectById(id);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void alterSupplierContract(SupplierContractSaveReqVO updateReqVO) {
+        String supplierContractCode = updateReqVO.getSupplierContractCode();
+        SupplierContractDO supplierContract = this.getSupplierContractByCode(supplierContractCode);
+        if (Objects.isNull(supplierContract)) {
+            throw exception(SUPPLIER_CONTRACT_NOT_EXISTS);
+        }
+        // 物理删除原合同信息
+        this.deleteSupplierContractOriginal(supplierContract.getId());
+        // 添加到历史合同信息表中
+        SupplierContractHistoryDO supplierContractHistoryDO = BeanUtils.toBean(supplierContract, SupplierContractHistoryDO.class);
+        supplierContractHistoryDO.setId(null);
+        this.createSupplierContractHistory(supplierContractHistoryDO);
+        // 新增新合同
+        updateReqVO.setId(null);
+        updateReqVO.setIsChange(GeneralStatusEnum.ENABLE.getStatus());
+        this.createSupplierContract(updateReqVO);
+    }
+
     private void validateSupplierContractHistoryExists(Long id) {
         if (supplierContractHistoryMapper.selectById(id) == null) {
             throw exception(SUPPLIER_CONTRACT_HISTORY_NOT_EXISTS);

+ 91 - 0
yudao-module-finance/yudao-module-contract-biz/src/main/resources/mapper/suppliercontract/SupplierContractHistoryMapper.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.contract.dal.mysql.suppliercontract.SupplierContractHistoryMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+    <select id="getPageCount" resultType="java.lang.Long">
+        SELECT
+            count(fsch.id)
+        FROM
+            finance_supplier_contract_history fsch
+            LEFT JOIN employee_info ei ON ei.id = fsch.owner_employee_id AND ei.deleted = 0
+            LEFT JOIN system_dept sd ON sd.id = fsch.dept_id AND sd.deleted = 0
+            LEFT JOIN employee_info ei2 ON ei2.id = fsch.creator AND ei2.deleted = 0
+        WHERE
+            fsch.deleted = 0
+        <if test="code != null and code != ''">
+            AND fsch.supplier_contract_code = #{code}
+        </if>
+    </select>
+    <select id="getPageList"
+            resultType="cn.iocoder.yudao.module.contract.controller.admin.suppliercontract.vo.SupplierContractRespVO">
+        SELECT
+            fsch.id,
+            fsch.supplier_contract_uuid,
+            fsch.supplier_contract_code,
+            fsch.supplier_contract_name,
+            fsch.is_frame_contract,
+               CASE
+                   WHEN fsch.is_frame_contract = 1 THEN '是'
+                   WHEN fsch.is_frame_contract = 0 THEN '否'
+                   ELSE '未知'
+               END AS isFrameContractDesc,
+            fsch.supplier_id,
+            fsch.supplier_name,
+            fsch.start_date,
+            fsch.end_date,
+            fsch.money,
+            fsch.owner_employee_id,
+               ei.name AS ownerEmployeeName,
+            fsch.dept_id,
+               sd.name AS deptName,
+            fsch.contract_status,
+                CASE
+                    WHEN fsch.contract_status = 0 THEN '未归档'
+                    WHEN fsch.contract_status = 1 THEN '已归档'
+                    WHEN fsch.contract_status = 2 THEN '已完结'
+                    ELSE '未知'
+                END AS contractStatusDesc,
+            fsch.closed,
+               CASE
+                    WHEN fsch.closed = 1 THEN '是'
+                    WHEN fsch.closed = 0 THEN '否'
+                    ELSE '未知'
+                END AS closedDesc,
+            fsch.close_reason,
+            fsch.terminate,
+               CASE
+                   WHEN fsch.terminate = 1 THEN '是'
+                   WHEN fsch.terminate = 0 THEN '否'
+                   ELSE '未知'
+               END AS terminateDesc,
+            fsch.terminate_date,
+            fsch.terminate_reason,
+            fsch.is_change,
+            fsch.remarks,
+            fsch.creator,
+               ei2.name AS creatorName,
+            fsch.create_time
+        FROM
+            finance_supplier_contract_history fsch
+                LEFT JOIN employee_info ei ON ei.id = fsch.owner_employee_id AND ei.deleted = 0
+                LEFT JOIN system_dept sd ON sd.id = fsch.dept_id AND sd.deleted = 0
+                LEFT JOIN employee_info ei2 ON ei2.id = fsch.creator AND ei2.deleted = 0
+        WHERE
+            fsch.deleted = 0
+        <if test="code != null and code != ''">
+            AND fsch.supplier_contract_code = #{code}
+        </if>
+        ORDER BY
+            fsch.create_time
+        <if test="page.pageSize != -1">
+            LIMIT #{page.pageNo}, #{page.pageSize}
+        </if>
+    </select>
+</mapper>

+ 9 - 0
yudao-module-finance/yudao-module-contract-biz/src/main/resources/mapper/suppliercontract/SupplierContractMapper.xml

@@ -148,4 +148,13 @@
             LIMIT #{page.pageNo}, #{page.pageSize}
         </if>
     </select>
+
+    <delete id="deleteSupplierContractOriginal">
+        DELETE
+        FROM
+            finance_supplier_contract
+        WHERE
+            id = #{id}
+            AND deleted = 0
+    </delete>
 </mapper>