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

This commit is contained in:
潘荣晟
2025-11-04 16:48:17 +08:00
17 changed files with 368 additions and 209 deletions

View File

@@ -6,8 +6,24 @@ import lombok.Data;
@Data
public class IntContractPageReq extends PageParam {
@Schema(description = "合同编号")
private String contractCode;
// 合同名称:模糊搜索
@Schema(description = "合同名称")
private String contractName;
// 合同有效期起:日期选择
@Schema(description = "合同有效期起")
private String contractStartDate;
// 合同有效期止:日期选择
@Schema(description = "合同有效期止")
private String contractEndDate;
// 合同版本号:精确搜索 TODO 不确定
// 签约地:模糊搜索
@Schema(description = "签约地")
private String signSite;
// 经办人姓名:模糊搜索
@Schema(description = "经办人姓名")
private String createdUserName;
// 签约日期: 模糊搜索
@Schema(description = "签约日期")
private String signDate;
}

View File

@@ -42,12 +42,13 @@ import org.springframework.web.bind.annotation.RestController;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.framework.common.pojo.CommonResult.success;
@@ -251,6 +252,12 @@ public class ContractApiImpl implements ContractApi {
return success(true);
}
/**
* 国贸合同信息未映射合同主信息字段保存到动态条款
*
* @param reqVO 国贸合同信息
* @param contractId 合同主信息ID
*/
private void saveIntContractFields(IntContract reqVO, Long contractId) {
try {
@@ -371,10 +378,28 @@ public class ContractApiImpl implements ContractApi {
DictEnum.SPLY_BSN_TP_03BX.getCode()
)
);
// 合同编号
queryWrapperX.likeIfPresent(ContractMainDO::getContractPaperNumber, pageReq.getContractCode());
// 合同名称
// 合同名称:模糊搜索
queryWrapperX.likeIfPresent(ContractMainDO::getContractName, pageReq.getContractName());
// 合同有效期起:日期选择
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
queryWrapperX.geIfPresent(ContractMainDO::getStartDate,
pageReq.getContractStartDate() != null
? LocalDateTime.of(LocalDate.parse(pageReq.getContractStartDate(), formatter), LocalTime.MIN)
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
: null);
// 合同有效期止:日期选择
queryWrapperX.leIfPresent(ContractMainDO::getEndDate,
pageReq.getContractEndDate() != null
? LocalDateTime.of(LocalDate.parse(pageReq.getContractEndDate(), formatter), LocalTime.MAX)
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
: null);
// 签约地:模糊搜索
queryWrapperX.likeIfPresent(ContractMainDO::getSignPlace, pageReq.getSignSite());
// 经办人姓名:模糊搜索
// 签约日期: 模糊搜索
if (pageReq.getSignDate() != null) {
queryWrapperX.apply("to_char(SGN_DT, 'yyyymmdd') like concat('%',{0},'%')", pageReq.getSignDate());
}
// 查询
PageResult<ContractMainDO> pageResult = contractMainMapper.selectPage(pageReq, queryWrapperX);
@@ -388,94 +413,64 @@ public class ContractApiImpl implements ContractApi {
// 遍历查询结果,设置返回数据列表
if (pageResult.getTotal() > 0) {
pageResult.getList().forEach(contractMainDO -> {
// 合同ID
Long mainDOId = contractMainDO.getId();
// 合同主信息
List<ContractOtherFieldDO> mainFields = contractOtherFieldMapper.selectList(
new LambdaQueryWrapperX<ContractOtherFieldDO>()
.eq(ContractOtherFieldDO::getContractMainId, mainDOId)
.isNull(ContractOtherFieldDO::getRelativityId)
);
JSONObject resultJson = new JSONObject();
mainFields.forEach(field
-> resultJson.putOnce(field.getFieldNumber(), field.getFieldValue()));
// 附件清单列表
List<ContractOtherFormDO> attachForms = contractOtherFormMapper.selectList(
new LambdaQueryWrapperX<ContractOtherFormDO>()
.eq(ContractOtherFormDO::getContractMainId, mainDOId)
.eq(ContractOtherFormDO::getFormNumber, "attachList")
);
if (attachForms != null && !attachForms.isEmpty()) {
JSONArray jsonArray = new JSONArray();
attachForms.forEach(form -> {
ContractOtherFieldDO fieldDO = contractOtherFieldMapper.selectOne(
new LambdaQueryWrapperX<ContractOtherFieldDO>()
.eq(ContractOtherFieldDO::getContractMainId, mainDOId)
.eq(ContractOtherFieldDO::getRelativityId, form.getId())
);
if (fieldDO != null) {
jsonArray.add(fieldDO.getFieldValue());
}
});
if (!jsonArray.isEmpty()) {
resultJson.putOnce("attachList", jsonArray);
}
}
// 客商信息
resultJson.putOnce("partnerList", getQueryFieldJsonArray(mainDOId, "partnerList"));
// 收发港/站点
resultJson.putOnce("goodsSiteList", getQueryFieldJsonArray(mainDOId, "goodsSiteList"));
// 货物装卸要求
resultJson.putOnce("loadingRequirementsList", getQueryFieldJsonArray(mainDOId, "loadingRequirementsList"));
// 收付款账号
resultJson.putOnce("accountList", getQueryFieldJsonArray(mainDOId, "accountList"));
// 费用明细
resultJson.putOnce("freightList", getQueryFieldJsonArray(mainDOId, "freightList"));
// 服务费用项目
resultJson.putOnce("serviceFeeList", getQueryFieldJsonArray(mainDOId, "serviceFeeList"));
// 仓库明细
resultJson.putOnce("storgeList", getQueryFieldJsonArray(mainDOId, "storgeList"));
// 接货地址
resultJson.putOnce("receivingAddrList", getQueryFieldJsonArray(mainDOId, "receivingAddrList"));
// 添加到结果集
resultList.add(resultJson.toBean(IntContract.class));
});
pageResult.getList().forEach(contractMainDO
-> resultList.add(getIntContractByMainId(contractMainDO.getId())));
}
return success(result);
}
private JSONArray getQueryFieldJsonArray(Long mainDOId, String fieldName) {
JSONArray jsonArray = new JSONArray();
List<ContractOtherFormDO> forms = contractOtherFormMapper.selectList(
/**
* 获取国贸合同信息通过合同主信息ID
*
* @param mainId 同主信息ID
* @return 国贸合同信息
*/
private IntContract getIntContractByMainId(Long mainId) {
// 合同动态条款查询
List<ContractOtherFormDO> otherFormDOs = contractOtherFormMapper.selectList(
new LambdaQueryWrapperX<ContractOtherFormDO>()
.eq(ContractOtherFormDO::getContractMainId, mainDOId)
.eq(ContractOtherFormDO::getFormNumber, fieldName)
.eq(ContractOtherFormDO::getContractMainId, mainId)
);
// 合同动态条款明细查询
List<ContractOtherFieldDO> otherFieldDOs = contractOtherFieldMapper.selectList(
new LambdaQueryWrapperX<ContractOtherFieldDO>()
.eq(ContractOtherFieldDO::getContractMainId, mainId)
);
if (forms != null && !forms.isEmpty()) {
forms.forEach(form -> {
List<ContractOtherFieldDO> fieldDOs = contractOtherFieldMapper.selectList(
new LambdaQueryWrapperX<ContractOtherFieldDO>()
.eq(ContractOtherFieldDO::getContractMainId, mainDOId)
.eq(ContractOtherFieldDO::getRelativityId, form.getId())
);
if (fieldDOs != null && !fieldDOs.isEmpty()) {
JSONObject jsonObject = new JSONObject();
fieldDOs.forEach(field
-> jsonObject.putOnce(field.getFieldNumber(), field.getFieldValue()));
jsonArray.add(jsonObject);
}
});
}
return jsonArray.isEmpty() ? null : jsonArray;
JSONObject resultJson = new JSONObject();
// 设置主信息
otherFieldDOs.stream()
.filter(otherFieldDO -> otherFieldDO.getRelativityId() == null)
.forEach(otherFieldDO
-> resultJson.putOnce(otherFieldDO.getFieldNumber(), otherFieldDO.getFieldValue()));
// 设置明细信息
otherFormDOs.stream()
.collect(Collectors.groupingBy(ContractOtherFormDO::getFormNumber))
.forEach((key, value) -> {
JSONArray detailsJson = new JSONArray();
value.forEach(detail -> {
// 根据条款id筛选条款明细
Stream<ContractOtherFieldDO> stream = otherFieldDOs.stream()
.filter(otherFieldDO
-> Objects.equals(otherFieldDO.getRelativityId(), detail.getId()));
if ("attachList".equals(key)) {
// 基础数据类型
stream.forEach(otherFieldDO
-> detailsJson.add(otherFieldDO.getFieldValue()));
} else {
// 对象数据类型
JSONObject detailJson = new JSONObject();
stream.forEach(otherFieldDO
-> detailJson.putOnce(otherFieldDO.getFieldNumber(), otherFieldDO.getFieldValue()));
detailsJson.add(detailJson);
}
});
resultJson.putOnce(key, detailsJson);
});
return resultJson.toBean(IntContract.class);
}
@Override
@@ -509,6 +504,12 @@ public class ContractApiImpl implements ContractApi {
return CommonResult.success(purchaseOrderDetails);
}
/**
* 国贸合同信息映射到合同主信息
*
* @param reqVO 国贸合同信息
* @return 合同主信息
*/
private ContractMainDO internationalToMainDO(IntContract reqVO) {
// 合同主信息表映射