Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
潘荣晟
2025-10-15 17:58:02 +08:00
25 changed files with 586 additions and 37 deletions

View File

@@ -100,28 +100,28 @@ public class ContractController implements BusinessControllerMarker {
// TODO
@PostMapping("/download")
@Operation(summary = "下载文件")
@Operation(summary = "下载文件 TODO")
@PreAuthorize("@ss.hasPermission('base:contract:download')")
public void download() {
}
// TODO
@PostMapping("/preview")
@Operation(summary = "预览文件")
@Operation(summary = "预览文件 TODO")
@PreAuthorize("@ss.hasPermission('base:contract:preview')")
public void preview() {
}
// TODO
@PostMapping("/complete")
@Operation(summary = "完结")
@Operation(summary = "完结 TODO")
@PreAuthorize("@ss.hasPermission('base:contract:complete')")
public void complete() {
}
// TODO
@PostMapping("/archive")
@Operation(summary = "归档")
@Operation(summary = "归档 TODO")
@PreAuthorize("@ss.hasPermission('base:contract:archive')")
public void archive() {
}
@@ -135,7 +135,7 @@ public class ContractController implements BusinessControllerMarker {
// TODO
@PostMapping("/approval")
@Operation(summary = "合同审批")
@Operation(summary = "合同审批 TODO")
@PreAuthorize("@ss.hasPermission('base:contract:approval')")
public CommonResult<String> approval(@Valid @RequestBody ApprovalReqVO reqVO) {
return success(contractService.approval(reqVO));
@@ -143,7 +143,7 @@ public class ContractController implements BusinessControllerMarker {
// TODO
@PostMapping("/view/approval")
@Operation(summary = "查看审批")
@Operation(summary = "查看审批 TODO")
@PreAuthorize("@ss.hasPermission('base:contract:approval')")
public void viewApproval() {
}
@@ -154,4 +154,39 @@ public class ContractController implements BusinessControllerMarker {
public CommonResult<List<String>> submitErp(@RequestBody List<Long> ids) {
return success(contractService.submitErp(ids));
}
@GetMapping("/list/up-not-relation")
@Operation(summary = "获得上游未关联合同列表")
@PreAuthorize("@ss.hasPermission('base:contract:relation')")
public CommonResult<List<ContractRespVO>> getListUpNotRelation(@RequestParam("id") Long id) {
return success(contractService.getListUpNotRelation(id));
}
@GetMapping("/list/down-not-relation")
@Operation(summary = "获得下游未关联合同列表")
@PreAuthorize("@ss.hasPermission('base:contract:relation')")
public CommonResult<List<ContractRespVO>> getListDownNotRelation(@RequestParam("id") Long id) {
return success(contractService.getListDownNotRelation(id));
}
@GetMapping("/get/up-relation")
@Operation(summary = "获得上游关联的合同数据")
@PreAuthorize("@ss.hasPermission('base:contract:relation')")
public CommonResult<ContractRespVO> getUpRelation(@RequestParam("id") Long id) {
return success(contractService.getUpRelation(id));
}
@GetMapping("/get/down-relation")
@Operation(summary = "获得下游关联的合同数据")
@PreAuthorize("@ss.hasPermission('base:contract:relation')")
public CommonResult<ContractRespVO> getDownRelation(@RequestParam("id") Long id) {
return success(contractService.getDownRelation(id));
}
@PostMapping("/relation")
@Operation(summary = "关联合同")
@PreAuthorize("@ss.hasPermission('base:contract:relation')")
public CommonResult<Boolean> relation(@RequestBody RelationReqVo reqVo) {
return success(contractService.relation(reqVo));
}
}

View File

@@ -1,5 +1,6 @@
package com.zt.plat.module.contractorder.controller.admin.contract.vo.contract;
import cn.hutool.json.JSONArray;
import com.alibaba.excel.annotation.ExcelProperty;
import com.zt.plat.module.base.controller.admin.templtp.vo.TemplateInstanceDataSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -34,7 +35,7 @@ public class ContractSaveReqVO {
private String fileObject;
@Schema(description = "其它附件对象存储")
private String fileObjectOther;
private JSONArray fileObjectOther;
// 合同基本信息
@Schema(description = "甲方公司编号;如果是采购合同查询组织机构自动带出且与ERP(HTQDZTBH)对应如果是销售合同手动选择且与ERP(WLDWBH)对应。", example = "甲方公司编号")

View File

@@ -0,0 +1,18 @@
package com.zt.plat.module.contractorder.controller.admin.contract.vo.contract;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Schema(description = "管理后台 - 合同关联请求对象 Request VO")
@Data
public class RelationReqVo {
@Schema(description = "上游主键", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "上游主键不能为空")
private Long upId;
@Schema(description = "下游主键", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "下游主键不能为空")
private Long downId;
}

View File

@@ -0,0 +1,50 @@
package com.zt.plat.module.contractorder.dal.dataobject.contract;
import com.baomidou.mybatisplus.annotation.*;
import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO;
import lombok.*;
/**
* 业务关联 DO
*
* @author 后台管理-1
*/
@TableName("bse_sys_rel")
@KeySequence("bse_sys_rel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
/**
* 支持业务基类继承isBusiness=true 时继承 BusinessBaseDO否则继承 BaseDO
*/
public class SystemRelativityDO extends BusinessBaseDO {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
* 上游主键
*/
@TableField("UP_ID")
private Long upId;
/**
* 下游主键
*/
@TableField("DOWN_ID")
private Long downId;
/**
* 方式系统;内关联/系统外关联
*/
@TableField("WY")
private String way;
/**
* 类型;合同/订单
*/
@TableField("STS")
private String status;
}

View File

@@ -0,0 +1,14 @@
package com.zt.plat.module.contractorder.dal.mysql.contract;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
import com.zt.plat.module.contractorder.dal.dataobject.contract.SystemRelativityDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 业务关联 Mapper
*
* @author 后台管理-1
*/
@Mapper
public interface SystemRelativityMapper extends BaseMapperX<SystemRelativityDO> {
}

View File

@@ -119,4 +119,44 @@ public interface ContractService {
* @return 合同信息
*/
ContractRespVO getBySystemContractNumber(String systemContractNumber);
/**
* 获得上游未关联合同列表
*
* @param id 合同ID
* @return 上游未关联的合同列表
*/
List<ContractRespVO> getListUpNotRelation(Long id);
/**
* 获得下游未关联合同列表
*
* @param id 合同ID
* @return 下游未关联的合同列表
*/
List<ContractRespVO> getListDownNotRelation(Long id);
/**
* 获得上游关联的合同数据
*
* @param id 合同ID
* @return 关联的上游合同数据
*/
ContractRespVO getUpRelation(Long id);
/**
* 获得下游关联的合同数据
*
* @param id 合同ID
* @return 关联的下游合同数据
*/
ContractRespVO getDownRelation(Long id);
/**
* 关联合同
*
* @param reqVo 上下游合同ID
* @return 关联结果
*/
Boolean relation(RelationReqVo reqVo);
}

View File

@@ -42,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.stream.Collectors;
@@ -93,6 +94,8 @@ public class ContractServiceImpl implements ContractService {
private ErpCompanyService erpCompanyService;
@Resource
private ErpContractService erpContractService;
@Resource
private SystemRelativityMapper systemRelativityMapper;
@Override
public PageResult<ContractMainDO> getContractPage(ContractPageReqVO pageReqVO) {
@@ -462,6 +465,194 @@ public class ContractServiceImpl implements ContractService {
return respVO;
}
@Override
public List<ContractRespVO> getListUpNotRelation(Long id) {
// 查询合同信息
ContractMainDO contractMainDO = contractMainMapper.selectById(id);
if (contractMainDO == null) {
throw exception(CONTRACT_NOT_EXISTS);
}
// 收支性质
String direction = contractMainDO.getDirection();
// 甲方公司编号
String purchaseCompanyNumber = contractMainDO.getPurchaseCompanyNumber();
// 乙方公司编号
String salesCompanyNumber = contractMainDO.getSalesCompanyNumber();
// 已关联的上游合同id集合
List<SystemRelativityDO> systemRelativityDOS = systemRelativityMapper.selectList();
LinkedHashSet<Long> relationIds = new LinkedHashSet<>();
if (systemRelativityDOS!= null && !systemRelativityDOS.isEmpty()) {
systemRelativityDOS.forEach(systemRelativityDO -> {
relationIds.add(systemRelativityDO.getUpId());
});
}
// 返回结果集
List<ContractRespVO> result = new ArrayList<>();
if (DictEnum.ERP_RCV_DLVY_INCOME.getCode().equals(direction)) { // 收入
// 如果“收支性质”字段为收入,用“甲方公司编号”字段筛选“合同主信息”表中字段等于“乙方公司编号”的数据
if (StringUtils.isEmpty(purchaseCompanyNumber)) {
// 甲方公司编号不存在
throw exception(CONTRACT_DATA_NOT_EXISTS, TableFieldConstants.BSE_CTRT_MAIN_PRCH_CPN_NUM_LABEL);
}
// 查询条件
LambdaQueryWrapperX<ContractMainDO> conditon = new LambdaQueryWrapperX<>();
conditon.eq(ContractMainDO::getSalesCompanyNumber, purchaseCompanyNumber);
if (!relationIds.isEmpty()) {
conditon.notIn(ContractMainDO::getId, relationIds);
}
// 查询
List<ContractMainDO> contractMainDOS = contractMainMapper.selectList(conditon);
result = BeanUtils.toBean(contractMainDOS, ContractRespVO.class);
} else if (DictEnum.ERP_RCV_DLVY_EXPENSES.getCode().equals(direction)){ // 支出
// 如果“收支性质”字段为支出,用“乙方公司编号”字段筛选“合同主信息”表中字段等于“甲方公司编号”的数据
if (StringUtils.isEmpty(salesCompanyNumber)) {
// 乙方公司编号不存在
throw exception(CONTRACT_DATA_NOT_EXISTS, TableFieldConstants.BSE_CTRT_MAIN_SALE_CPN_NUM_LABEL);
}
// 查询条件
LambdaQueryWrapperX<ContractMainDO> conditon = new LambdaQueryWrapperX<>();
conditon.eq(ContractMainDO::getPurchaseCompanyNumber, salesCompanyNumber);
if (!relationIds.isEmpty()) {
conditon.notIn(ContractMainDO::getId, relationIds);
}
// 查询
List<ContractMainDO> contractMainDOS = contractMainMapper.selectList(conditon);
result = BeanUtils.toBean(contractMainDOS, ContractRespVO.class);
} else {
// 不存在的收支类型或收支类型为空
throw exception(CONTRACT_ERP_RCV_DLVY_NOT_EXISTS);
}
return result;
}
@Override
public List<ContractRespVO> getListDownNotRelation(Long id) {
// 查询合同信息
ContractMainDO contractMainDO = contractMainMapper.selectById(id);
if (contractMainDO == null) {
throw exception(CONTRACT_NOT_EXISTS);
}
// 收支性质
String direction = contractMainDO.getDirection();
// 甲方公司编号
String purchaseCompanyNumber = contractMainDO.getPurchaseCompanyNumber();
// 乙方公司编号
String salesCompanyNumber = contractMainDO.getSalesCompanyNumber();
// 已关联的上游合同id集合
List<SystemRelativityDO> systemRelativityDOS = systemRelativityMapper.selectList();
LinkedHashSet<Long> relationIds = new LinkedHashSet<>();
if (systemRelativityDOS!= null && !systemRelativityDOS.isEmpty()) {
systemRelativityDOS.forEach(systemRelativityDO -> {
relationIds.add(systemRelativityDO.getDownId());
});
}
// 返回结果集
List<ContractRespVO> result = new ArrayList<>();
if (DictEnum.ERP_RCV_DLVY_INCOME.getCode().equals(direction)) { // 收入
// 如果“收支性质”字段为收入,用“甲方公司编号”字段筛选“合同主信息”表中字段等于“乙方公司编号”的数据
if (StringUtils.isEmpty(purchaseCompanyNumber)) {
// 甲方公司编号不存在
throw exception(CONTRACT_DATA_NOT_EXISTS, TableFieldConstants.BSE_CTRT_MAIN_PRCH_CPN_NUM_LABEL);
}
// 查询条件
LambdaQueryWrapperX<ContractMainDO> conditon = new LambdaQueryWrapperX<>();
conditon.eq(ContractMainDO::getSalesCompanyNumber, purchaseCompanyNumber);
if (!relationIds.isEmpty()) {
conditon.notIn(ContractMainDO::getId, relationIds);
}
// 查询
List<ContractMainDO> contractMainDOS = contractMainMapper.selectList(conditon);
result = BeanUtils.toBean(contractMainDOS, ContractRespVO.class);
} else if (DictEnum.ERP_RCV_DLVY_EXPENSES.getCode().equals(direction)){ // 支出
// 如果“收支性质”字段为支出,用“乙方公司编号”字段筛选“合同主信息”表中字段等于“甲方公司编号”的数据
if (StringUtils.isEmpty(salesCompanyNumber)) {
// 乙方公司编号不存在
throw exception(CONTRACT_DATA_NOT_EXISTS, TableFieldConstants.BSE_CTRT_MAIN_SALE_CPN_NUM_LABEL);
}
// 查询条件
LambdaQueryWrapperX<ContractMainDO> conditon = new LambdaQueryWrapperX<>();
conditon.eq(ContractMainDO::getPurchaseCompanyNumber, salesCompanyNumber);
if (!relationIds.isEmpty()) {
conditon.notIn(ContractMainDO::getId, relationIds);
}
// 查询
List<ContractMainDO> contractMainDOS = contractMainMapper.selectList(conditon);
result = BeanUtils.toBean(contractMainDOS, ContractRespVO.class);
} else {
// 不存在的收支类型或收支类型为空
throw exception(CONTRACT_ERP_RCV_DLVY_NOT_EXISTS);
}
return result;
}
@Override
public ContractRespVO getUpRelation(Long id) {
// 查询合同信息
if (contractMainMapper.selectById(id) == null) {
throw exception(CONTRACT_NOT_EXISTS);
}
// 查询关联表
SystemRelativityDO systemRelativityDO = systemRelativityMapper.selectOne(TableFieldConstants.BSE_SYS_REL_DOWN_ID, id);
if (systemRelativityDO == null) {
return null;
}
// 上游合同ID
Long upId = systemRelativityDO.getUpId();
// 获取上游合同信息
ContractMainDO contractMainDO = contractMainMapper.selectById(upId);
if (contractMainDO == null) {
throw exception(CONTRACT_NOT_EXISTS);
}
return BeanUtils.toBean(contractMainDO, ContractRespVO.class);
}
@Override
public ContractRespVO getDownRelation(Long id) {
// 查询合同信息
if (contractMainMapper.selectById(id) == null) {
throw exception(CONTRACT_NOT_EXISTS);
}
// 查询关联表
SystemRelativityDO systemRelativityDO = systemRelativityMapper.selectOne(TableFieldConstants.BSE_SYS_REL_UP_ID, id);
if (systemRelativityDO == null) {
return null;
}
// 下游合同ID
Long upId = systemRelativityDO.getUpId();
// 获取下游合同信息
ContractMainDO contractMainDO = contractMainMapper.selectById(upId);
if (contractMainDO == null) {
throw exception(CONTRACT_NOT_EXISTS);
}
return BeanUtils.toBean(contractMainDO, ContractRespVO.class);
}
@Transactional
@Override
public Boolean update(ContractSaveReqVO reqVO) {
@@ -859,26 +1050,6 @@ public class ContractServiceImpl implements ContractService {
return "";
}
/**
* 获取合同ID集合
*
* @param contractName 合同名称
* @param contractPaperNumber 合同编号
* @return 合同ID集合
*/
private List<Long> getContractIds(String contractName, String contractPaperNumber) {
List<Long> contractIds = new ArrayList<>();
List<ContractMainDO> contractMainDOS = contractMainMapper.selectList(new LambdaQueryWrapperX<ContractMainDO>()
.likeIfPresent(ContractMainDO::getContractName, contractName)
.likeIfPresent(ContractMainDO::getContractPaperNumber, contractPaperNumber));
if (CollectionUtils.isNotEmpty(contractMainDOS)) {
contractIds = contractMainDOS.stream()
.map(contractMainDO -> contractMainDO.getId())
.collect(Collectors.toList());
}
return contractIds;
}
@Override
public List<NotRespVO> getNots(NotsQueryReqVO queryReqVO) {
// 查合同ID集合
@@ -1061,22 +1232,22 @@ public class ContractServiceImpl implements ContractService {
// 客商编号:SPLR_NUM 根据合同主表的收支方向判断如果为“支出”值为“ERP乙方公司编码”反之为“ERP甲方公司编码”
// 客商名称:SPLR_NAME 根据合同主表的收支方向判断如果为“支出”值为“ERP乙方公司名称”反之为“ERP甲方公司名称”
if (DictEnum.ERP_RCV_DLVY_EXPENSES.getCode().equals(contractMainDO.getDirection())) {
erpContractVO.setSupplierNumber(contractMainDO.getSalesCompanyNumber());
erpContractVO.setSupplierName(contractMainDO.getSalesCompanyName());
erpContractVO.setSupplierNumber(contractMainDO.getErpSalesCompanyNumber());
erpContractVO.setSupplierName(contractMainDO.getErpSalesCompanyName());
} else if (DictEnum.ERP_RCV_DLVY_INCOME.getCode().equals(contractMainDO.getDirection())) {
erpContractVO.setSupplierNumber(contractMainDO.getPurchaseCompanyNumber());
erpContractVO.setSupplierName(contractMainDO.getPurchaseCompanyName());
erpContractVO.setSupplierNumber(contractMainDO.getErpPurchaseCompanyNumber());
erpContractVO.setSupplierName(contractMainDO.getErpPurchaseCompanyName());
}
// 代理方:AGT
erpContractVO.setAgent(contractMainDO.getAgent());
// 合同实施主体编号:CTRT_IMPL_NUM 根据合同主表的收支方向判断如果为“支出”值为“ERP甲方公司编码”反之为“ERP乙方公司编码”
// 合同签订主体编号:CTRT_SGN_NUM 根据合同主表的收支方向判断如果为“支出”值为“ERP甲方公司名称”反之为“ERP乙方公司名称”
if (DictEnum.ERP_RCV_DLVY_EXPENSES.getCode().equals(contractMainDO.getDirection())) {
erpContractVO.setContractImplementNumber(contractMainDO.getPurchaseCompanyNumber());
erpContractVO.setContractSignNumber(contractMainDO.getPurchaseCompanyName());
erpContractVO.setContractImplementNumber(contractMainDO.getErpPurchaseCompanyNumber());
erpContractVO.setContractSignNumber(contractMainDO.getErpPurchaseCompanyName());
} else if (DictEnum.ERP_RCV_DLVY_INCOME.getCode().equals(contractMainDO.getDirection())) {
erpContractVO.setContractImplementNumber(contractMainDO.getSalesCompanyNumber());
erpContractVO.setContractSignNumber(contractMainDO.getSalesCompanyName());
erpContractVO.setContractImplementNumber(contractMainDO.getErpSalesCompanyNumber());
erpContractVO.setContractSignNumber(contractMainDO.getErpSalesCompanyName());
}
// 合同签订日期:SGN_DT
if (contractMainDO.getSignDate() != null) {
@@ -1171,6 +1342,16 @@ public class ContractServiceImpl implements ContractService {
return result;
}
@Override
public Boolean relation(RelationReqVo reqVo) {
SystemRelativityDO saveDO = new SystemRelativityDO();
saveDO.setStatus(DictEnum.BSE_SYS_REL_TP_CONTRACT.getCode());
saveDO.setUpId(reqVo.getUpId());
saveDO.setDownId(reqVo.getDownId());
int insert = systemRelativityMapper.insert(saveDO);
return insert > 0;
}
/**
* 校验合同内容
*
@@ -1393,4 +1574,24 @@ public class ContractServiceImpl implements ContractService {
}
return numPrefix + "-" + num;
}
/**
* 获取合同ID集合
*
* @param contractName 合同名称
* @param contractPaperNumber 合同编号
* @return 合同ID集合
*/
private List<Long> getContractIds(String contractName, String contractPaperNumber) {
List<Long> contractIds = new ArrayList<>();
List<ContractMainDO> contractMainDOS = contractMainMapper.selectList(new LambdaQueryWrapperX<ContractMainDO>()
.likeIfPresent(ContractMainDO::getContractName, contractName)
.likeIfPresent(ContractMainDO::getContractPaperNumber, contractPaperNumber));
if (CollectionUtils.isNotEmpty(contractMainDOS)) {
contractIds = contractMainDOS.stream()
.map(contractMainDO -> contractMainDO.getId())
.collect(Collectors.toList());
}
return contractIds;
}
}