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

@@ -10,16 +10,17 @@ import com.zt.plat.framework.common.exception.ErrorCode;
public interface ErrorCodeConstants { public interface ErrorCodeConstants {
// ========== 示例模块 1-001-000-000 ========== // ========== 示例模块 1-001-000-000 ==========
ErrorCode MATERIAL_OTHER_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode MATERIAL_OTHER_NOT_EXISTS = new ErrorCode(1_001_000_001, "物料不存在");
ErrorCode ELEMENT_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode ELEMENT_NOT_EXISTS = new ErrorCode(1_001_000_001, "金属元素不存在");
ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_001_000_001, "联系人不存在");
ErrorCode ACCOUNT_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode ACCOUNT_NOT_EXISTS = new ErrorCode(1_001_000_001, "账户条款不存在");
ErrorCode MATERIAL_DESTROY_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode MATERIAL_DESTROY_NOT_EXISTS = new ErrorCode(1_001_000_001, "物料回收率不存在");
ErrorCode MATERIAL_INFOMATION_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode MATERIAL_INFOMATION_NOT_EXISTS = new ErrorCode(1_001_000_001, "物料信息不存在");
ErrorCode COMPANY_RELATIVITY_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode COMPANY_RELATIVITY_NOT_EXISTS = new ErrorCode(1_001_000_001, "公司关系不存在");
ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1_001_000_001, "库位不存在");
ErrorCode FACTORY_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode WAREHOUSE_CODE_EXISTS = new ErrorCode(1_001_000_002, "库位编码已存在");
ErrorCode TAX_NOT_EXISTS = new ErrorCode(1_001_000_001, "示例不存在"); ErrorCode FACTORY_NOT_EXISTS = new ErrorCode(1_001_000_001, "工厂不存在");
ErrorCode TAX_NOT_EXISTS = new ErrorCode(1_001_000_001, "公司关系不存在");
ErrorCode BUSINESS_RULE_NOT_EXISTS = new ErrorCode(1_027_100_001, "规则模型不存在"); ErrorCode BUSINESS_RULE_NOT_EXISTS = new ErrorCode(1_027_100_001, "规则模型不存在");

View File

@@ -33,4 +33,10 @@ public interface WarehouseMapper extends BaseMapperX<WarehouseDO> {
} }
String selectMaxCode(); String selectMaxCode();
default WarehouseDO selectByCode(String code){
return selectOne(new LambdaQueryWrapperX<WarehouseDO>()
.eq(WarehouseDO::getCoding, code)
.last("LIMIT 1"));
};
} }

View File

@@ -16,6 +16,7 @@ import org.springframework.validation.annotation.Validated;
import java.util.List; import java.util.List;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.module.base.enums.ErrorCodeConstants.WAREHOUSE_CODE_EXISTS;
import static com.zt.plat.module.base.enums.ErrorCodeConstants.WAREHOUSE_NOT_EXISTS; import static com.zt.plat.module.base.enums.ErrorCodeConstants.WAREHOUSE_NOT_EXISTS;
/** /**
@@ -35,16 +36,17 @@ public class WarehouseServiceImpl implements WarehouseService {
// 插入 // 插入
WarehouseDO warehouse = BeanUtils.toBean(createReqVO, WarehouseDO.class); WarehouseDO warehouse = BeanUtils.toBean(createReqVO, WarehouseDO.class);
// 库位编码自动生成,格式 KW-0001,依次新增 // 库位编码自动生成,格式 KW-0001,依次新增
String maxCode = warehouseMapper.selectMaxCode(); // String maxCode = warehouseMapper.selectMaxCode();
if (maxCode == null) { // if (maxCode == null) {
warehouse.setCoding("KW-0001"); // warehouse.setCoding("KW-0001");
} else { // } else {
String prefix = "KW-"; // String prefix = "KW-";
String numberPart = maxCode.substring(prefix.length()); // String numberPart = maxCode.substring(prefix.length());
int nextNumber = Integer.parseInt(numberPart) + 1; // int nextNumber = Integer.parseInt(numberPart) + 1;
String nextCode = prefix + String.format("%04d", nextNumber); // String nextCode = prefix + String.format("%04d", nextNumber);
warehouse.setCoding(nextCode); // warehouse.setCoding(nextCode);
} // }
validateWarehouseCodeExists(warehouse.getCoding());
warehouseMapper.insert(warehouse); warehouseMapper.insert(warehouse);
// 返回 // 返回
return BeanUtils.toBean(warehouse, WarehouseRespVO.class); return BeanUtils.toBean(warehouse, WarehouseRespVO.class);
@@ -88,6 +90,13 @@ public class WarehouseServiceImpl implements WarehouseService {
} }
} }
private void validateWarehouseCodeExists(String code) {
WarehouseDO warehouse = warehouseMapper.selectByCode(code);
if (warehouse != null) {
throw exception(WAREHOUSE_CODE_EXISTS);
}
}
@Override @Override
public WarehouseDO getWarehouse(Long id) { public WarehouseDO getWarehouse(Long id) {
return warehouseMapper.selectById(id); return warehouseMapper.selectById(id);

View File

@@ -6,8 +6,24 @@ import lombok.Data;
@Data @Data
public class IntContractPageReq extends PageParam { public class IntContractPageReq extends PageParam {
@Schema(description = "合同编号")
private String contractCode; // 合同名称:模糊搜索
@Schema(description = "合同名称") @Schema(description = "合同名称")
private String contractName; 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.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays; import java.util.stream.Collectors;
import java.util.Iterator; import java.util.stream.Stream;
import java.util.List;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.framework.common.pojo.CommonResult.success; import static com.zt.plat.framework.common.pojo.CommonResult.success;
@@ -251,6 +252,12 @@ public class ContractApiImpl implements ContractApi {
return success(true); return success(true);
} }
/**
* 国贸合同信息未映射合同主信息字段保存到动态条款
*
* @param reqVO 国贸合同信息
* @param contractId 合同主信息ID
*/
private void saveIntContractFields(IntContract reqVO, Long contractId) { private void saveIntContractFields(IntContract reqVO, Long contractId) {
try { try {
@@ -371,10 +378,28 @@ public class ContractApiImpl implements ContractApi {
DictEnum.SPLY_BSN_TP_03BX.getCode() DictEnum.SPLY_BSN_TP_03BX.getCode()
) )
); );
// 合同编号 // 合同名称:模糊搜索
queryWrapperX.likeIfPresent(ContractMainDO::getContractPaperNumber, pageReq.getContractCode());
// 合同名称
queryWrapperX.likeIfPresent(ContractMainDO::getContractName, pageReq.getContractName()); 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); PageResult<ContractMainDO> pageResult = contractMainMapper.selectPage(pageReq, queryWrapperX);
@@ -388,94 +413,64 @@ public class ContractApiImpl implements ContractApi {
// 遍历查询结果,设置返回数据列表 // 遍历查询结果,设置返回数据列表
if (pageResult.getTotal() > 0) { if (pageResult.getTotal() > 0) {
pageResult.getList().forEach(contractMainDO -> { pageResult.getList().forEach(contractMainDO
-> resultList.add(getIntContractByMainId(contractMainDO.getId())));
// 合同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));
});
} }
return success(result); return success(result);
} }
private JSONArray getQueryFieldJsonArray(Long mainDOId, String fieldName) { /**
* 获取国贸合同信息通过合同主信息ID
JSONArray jsonArray = new JSONArray(); *
List<ContractOtherFormDO> forms = contractOtherFormMapper.selectList( * @param mainId 同主信息ID
* @return 国贸合同信息
*/
private IntContract getIntContractByMainId(Long mainId) {
// 合同动态条款查询
List<ContractOtherFormDO> otherFormDOs = contractOtherFormMapper.selectList(
new LambdaQueryWrapperX<ContractOtherFormDO>() new LambdaQueryWrapperX<ContractOtherFormDO>()
.eq(ContractOtherFormDO::getContractMainId, mainDOId) .eq(ContractOtherFormDO::getContractMainId, mainId)
.eq(ContractOtherFormDO::getFormNumber, fieldName)
); );
if (forms != null && !forms.isEmpty()) { // 合同动态条款明细查询
forms.forEach(form -> { List<ContractOtherFieldDO> otherFieldDOs = contractOtherFieldMapper.selectList(
List<ContractOtherFieldDO> fieldDOs = contractOtherFieldMapper.selectList(
new LambdaQueryWrapperX<ContractOtherFieldDO>() new LambdaQueryWrapperX<ContractOtherFieldDO>()
.eq(ContractOtherFieldDO::getContractMainId, mainDOId) .eq(ContractOtherFieldDO::getContractMainId, mainId)
.eq(ContractOtherFieldDO::getRelativityId, form.getId())
); );
if (fieldDOs != null && !fieldDOs.isEmpty()) {
JSONObject jsonObject = new JSONObject(); JSONObject resultJson = new JSONObject();
fieldDOs.forEach(field
-> jsonObject.putOnce(field.getFieldNumber(), field.getFieldValue())); // 设置主信息
jsonArray.add(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 jsonArray.isEmpty() ? null : jsonArray; return resultJson.toBean(IntContract.class);
} }
@Override @Override
@@ -509,6 +504,12 @@ public class ContractApiImpl implements ContractApi {
return CommonResult.success(purchaseOrderDetails); return CommonResult.success(purchaseOrderDetails);
} }
/**
* 国贸合同信息映射到合同主信息
*
* @param reqVO 国贸合同信息
* @return 合同主信息
*/
private ContractMainDO internationalToMainDO(IntContract reqVO) { private ContractMainDO internationalToMainDO(IntContract reqVO) {
// 合同主信息表映射 // 合同主信息表映射

View File

@@ -1,6 +1,7 @@
package com.zt.plat.module.erp.api; package com.zt.plat.module.erp.api;
import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.module.erp.api.dto.ErpMaterialDTO;
import com.zt.plat.module.erp.api.dto.ErpProductiveVersionReqDTO; import com.zt.plat.module.erp.api.dto.ErpProductiveVersionReqDTO;
import com.zt.plat.module.erp.api.dto.ErpQueryReqDTO; import com.zt.plat.module.erp.api.dto.ErpQueryReqDTO;
import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO; import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO;
@@ -12,6 +13,7 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -30,7 +32,11 @@ public interface ErpExternalApi {
@Operation(summary = "erp数据查询") @Operation(summary = "erp数据查询")
HashMap<String, Object> queryDataToErp(@Valid @RequestBody ErpQueryReqDTO reqDTO); HashMap<String, Object> queryDataToErp(@Valid @RequestBody ErpQueryReqDTO reqDTO);
@GetMapping(PREFIX + "/queryProductiveVersion") @PostMapping(PREFIX + "/queryProductiveVersion")
@Operation(summary = "生产版本数据查询") @Operation(summary = "生产版本数据查询")
CommonResult<String> getErpProductiveVersionByFM(@Valid @RequestBody ErpProductiveVersionReqDTO reqDTO); CommonResult<String> getErpProductiveVersionByFM(@Valid @RequestBody ErpProductiveVersionReqDTO reqDTO);
@GetMapping(PREFIX + "/getMaterialUnit")
@Operation(summary = "根据物料编码查询对应计量单位")
CommonResult<String> getMaterialUnit(@RequestParam("downCenterNumber") String downCenterNumber);
} }

View File

@@ -0,0 +1,75 @@
package com.zt.plat.module.erp.api.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - ERP物料数据 Response VO")
@Data
public class ErpMaterialDTO {
@Schema(description = "主键")
private Long id;
@Schema(description = "中铜物料编码;系统使用时使用该编码")
private String downCenterNumber;
@Schema(description = "物料编码")
private String materialNumber;
@Schema(description = "中铝物料编码")
private String centerNumber;
@Schema(description = "创建日期")
private LocalDateTime createDate;
@Schema(description = "物料类型", example = "2")
private String materialType;
@Schema(description = "物料大类组")
private String materialGroupDate;
@Schema(description = "外部物料小类组")
private String externalMaterialGroupDate;
@Schema(description = "计量单位编码")
private String unit;
@Schema(description = "计量单位描述")
private String unitDescription;
@Schema(description = "物料类型描述")
private String materialTypeDescription;
@Schema(description = "物料组描述")
private String materialGroupDescription;
@Schema(description = "外部物料小类组描述")
private String externalMaterialGroupDescription;
@Schema(description = "物料名称", example = "李四")
private String materialName;
@Schema(description = "物料长描述")
private String materialLengthDescription;
@Schema(description = "类型")
private String type;
@Schema(description = "金属元素缩写")
private String abbreviation;
@Schema(description = "金属元素名称", example = "赵六")
private String name;
@Schema(description = "金属元素编码")
private String coding;
@Schema(description = "品位单位")
private String gradeUnit;
@Schema(description = "小数位数")
private Long decimalValue;
}

View File

@@ -2,9 +2,12 @@ package com.zt.plat.module.erp.api;
import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.module.erp.api.dto.ErpMaterialDTO;
import com.zt.plat.module.erp.api.dto.ErpProductiveVersionReqDTO; import com.zt.plat.module.erp.api.dto.ErpProductiveVersionReqDTO;
import com.zt.plat.module.erp.api.dto.ErpQueryReqDTO; import com.zt.plat.module.erp.api.dto.ErpQueryReqDTO;
import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO; import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpMaterialRespVO;
import com.zt.plat.module.erp.service.erp.ErpMaterialService;
import com.zt.plat.module.erp.service.erp.ErpProductiveVersionService; import com.zt.plat.module.erp.service.erp.ErpProductiveVersionService;
import com.zt.plat.module.erp.utils.ErpConfig; import com.zt.plat.module.erp.utils.ErpConfig;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@@ -34,6 +37,9 @@ public class ErpExternalApiImpl implements ErpExternalApi {
private ErpConfig erpConfig; private ErpConfig erpConfig;
@Resource @Resource
private ErpProductiveVersionService erpProductiveVersionService; private ErpProductiveVersionService erpProductiveVersionService;
@Resource
private ErpMaterialService erpMaterialService;
@Override @Override
public HashMap<String, String> submitDataToErp(ErpSubmitReqDTO reqDTO) { public HashMap<String, String> submitDataToErp(ErpSubmitReqDTO reqDTO) {
@@ -52,4 +58,10 @@ public class ErpExternalApiImpl implements ErpExternalApi {
String productiveVersionNumber = erpProductiveVersionService.getErpProductiveVersionByFM(reqDTO); String productiveVersionNumber = erpProductiveVersionService.getErpProductiveVersionByFM(reqDTO);
return success(productiveVersionNumber); return success(productiveVersionNumber);
} }
@Override
public CommonResult<String> getMaterialUnit(String materialNumber) {
String materialUnit = erpMaterialService.getMaterialUnit(materialNumber);
return success(materialUnit);
}
} }

View File

@@ -2,6 +2,7 @@ package com.zt.plat.module.erp.controller.admin.erp.vo;
import com.zt.plat.framework.common.pojo.PageParam; import com.zt.plat.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
@@ -14,9 +15,11 @@ import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH
public class ErpProductiveOrderPageReqVO extends PageParam { public class ErpProductiveOrderPageReqVO extends PageParam {
@Schema(description = "公司编号") @Schema(description = "公司编号")
@NotEmpty(message = "公司编号不能为空")
private String companyNumber; private String companyNumber;
@Schema(description = "工厂编码") @Schema(description = "工厂编码")
@NotEmpty(message = "公司编号不能为空")
private String factoryNumber; private String factoryNumber;
@Schema(description = "工厂名称", example = "赵六") @Schema(description = "工厂名称", example = "赵六")
@@ -27,10 +30,12 @@ public class ErpProductiveOrderPageReqVO extends PageParam {
@Schema(description = "基本开始日期") @Schema(description = "基本开始日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@NotEmpty(message = "公司编号不能为空")
private LocalDateTime[] startDate; private LocalDateTime[] startDate;
@Schema(description = "基本完成日期") @Schema(description = "基本完成日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@NotEmpty(message = "公司编号不能为空")
private LocalDateTime[] endDate; private LocalDateTime[] endDate;
@Schema(description = "主产品物料编号") @Schema(description = "主产品物料编号")

View File

@@ -40,5 +40,11 @@ public interface ErpMaterialMapper extends BaseMapperX<ErpMaterialDO> {
String selectMaxCode(); String selectMaxCode();
Integer selectByErpMNumbers(List<String> erpMNumber); Integer countByErpMNumbers(List<String> erpMNumber);
default String getMaterialUnit(String downCenterNumber) {
return selectOne(new LambdaQueryWrapperX<ErpMaterialDO>()
.eq(ErpMaterialDO::getDownCenterNumber, downCenterNumber)
.last("limit 1")).getUnit();
}
} }

View File

@@ -30,6 +30,8 @@ public class ErpJob {
@Resource @Resource
private ErpProcessService erpProcessService; private ErpProcessService erpProcessService;
@Resource @Resource
private ErpProductiveOrderService erpProductiveOrderService;
@Resource
private ErpProductiveVersionService erpProductiveVersionService; private ErpProductiveVersionService erpProductiveVersionService;
@Resource @Resource
private ErpPurchaseOrganizationService erpPurchaseOrganizationService; private ErpPurchaseOrganizationService erpPurchaseOrganizationService;
@@ -50,6 +52,7 @@ public class ErpJob {
erpInternalOrderService.callErpRfcInterface(); erpInternalOrderService.callErpRfcInterface();
erpMaterialService.callErpRfcInterface(); erpMaterialService.callErpRfcInterface();
erpProcessService.callErpRfcInterface(); erpProcessService.callErpRfcInterface();
erpProductiveOrderService.callErpRfcInterface();
erpProductiveVersionService.callErpRfcInterface(); erpProductiveVersionService.callErpRfcInterface();
erpPurchaseOrganizationService.callErpRfcInterface(); erpPurchaseOrganizationService.callErpRfcInterface();
erpSalesOrganizationService.callErpRfcInterface(); erpSalesOrganizationService.callErpRfcInterface();

View File

@@ -1,6 +1,7 @@
package com.zt.plat.module.erp.service.erp; package com.zt.plat.module.erp.service.erp;
import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.erp.api.dto.ErpMaterialDTO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpMaterialPageReqVO; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpMaterialPageReqVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpMaterialRespVO; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpMaterialRespVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpMaterialSaveReqVO; import com.zt.plat.module.erp.controller.admin.erp.vo.ErpMaterialSaveReqVO;
@@ -64,4 +65,6 @@ public interface ErpMaterialService {
void callErpRfcInterface(); void callErpRfcInterface();
PageResult<ErpMaterialRespVO> getErpMaterialPageAndOther(ErpMaterialPageReqVO pageReqVO); PageResult<ErpMaterialRespVO> getErpMaterialPageAndOther(ErpMaterialPageReqVO pageReqVO);
String getMaterialUnit(String materialNumber);
} }

View File

@@ -9,6 +9,7 @@ import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.module.api.BaseApi; import com.zt.plat.module.api.BaseApi;
import com.zt.plat.module.api.dto.MaterialOtherDTO; import com.zt.plat.module.api.dto.MaterialOtherDTO;
import com.zt.plat.module.erp.api.dto.ErpMaterialDTO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpWarehouseDO; import com.zt.plat.module.erp.dal.dataobject.erp.ErpWarehouseDO;
import com.zt.plat.module.erp.utils.ErpConfig; import com.zt.plat.module.erp.utils.ErpConfig;
import com.zt.plat.module.erp.utils.MyRedisConfig; import com.zt.plat.module.erp.utils.MyRedisConfig;
@@ -124,7 +125,7 @@ public class ErpMaterialServiceImpl implements ErpMaterialService {
.collect(Collectors.toList()); .collect(Collectors.toList());
// 使用IN语句批量查询所有物料编码的数量 // 使用IN语句批量查询所有物料编码的数量
Integer countMap = erpMaterialMapper.selectByErpMNumbers(downCenterNumbers); Integer countMap = erpMaterialMapper.countByErpMNumbers(downCenterNumbers);
if (countMap > 1) { if (countMap > 1) {
throw exception(ERP_MATERIAL_OTHER_NOT_ALLOW_DELETE); throw exception(ERP_MATERIAL_OTHER_NOT_ALLOW_DELETE);
} }
@@ -175,6 +176,11 @@ public class ErpMaterialServiceImpl implements ErpMaterialService {
} }
} }
@Override
public String getMaterialUnit(String materialNumber) {
return erpMaterialMapper.getMaterialUnit(materialNumber);
}
@Override @Override
@Transactional @Transactional
@XxlJob("getErpMaterialTask") @XxlJob("getErpMaterialTask")

View File

@@ -6,6 +6,8 @@ import com.alibaba.fastjson.JSONObject;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpProductiveVersionPageReqVO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpProductiveVersionDO;
import com.zt.plat.module.erp.utils.ErpConfig; import com.zt.plat.module.erp.utils.ErpConfig;
import com.zt.plat.module.erp.utils.MyRedisConfig; import com.zt.plat.module.erp.utils.MyRedisConfig;
import com.zt.plat.module.erp.enums.OftenEnum; import com.zt.plat.module.erp.enums.OftenEnum;
@@ -102,82 +104,88 @@ public class ErpProductiveOrderServiceImpl implements ErpProductiveOrderService
@Override @Override
public PageResult<ErpProductiveOrderDO> getErpProductiveOrderPage(ErpProductiveOrderPageReqVO pageReqVO) { public PageResult<ErpProductiveOrderDO> getErpProductiveOrderPage(ErpProductiveOrderPageReqVO pageReqVO) {
OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.生产订单; return erpProductiveOrderMapper.selectPage(pageReqVO);
String funcnr = funcnrEnum.getFuncnr();
Map<String, Object> req = new HashMap<>();
// 构建查询参数
req.put("BUKRS", pageReqVO.getCompanyNumber());
req.put("WERKS", pageReqVO.getFactoryNumber());
// 处理日期参数
if (pageReqVO.getStartDate() != null) {
req.put("BEGDA", pageReqVO.getStartDate()[0].format(DateTimeFormatter.ofPattern("yyyyMMdd")));
}
if (pageReqVO.getEndDate() != null) {
req.put("ENDDA", pageReqVO.getEndDate()[0].format(DateTimeFormatter.ofPattern("yyyyMMdd")));
} }
// 调用ERP接口获取数据 //直接从erp查询生产订单
HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req); // @Override
JSONArray dataArray = (JSONArray) dataFromERP.get("E_RESP"); // public PageResult<ErpProductiveOrderDO> getErpProductiveOrderPage(ErpProductiveOrderPageReqVO pageReqVO) {
if (dataArray == null || dataArray.isEmpty()) { // OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.生产订单;
// 返回空结果而不是抛出异常 // String funcnr = funcnrEnum.getFuncnr();
return new PageResult<>(new ArrayList<>(), 0L); // Map<String, Object> req = new HashMap<>();
} //
// // 构建查询参数
List<ErpProductiveOrderDO> list = new ArrayList<>(); // req.put("BUKRS", pageReqVO.getCompanyNumber());
for (int i = 0; i < dataArray.size(); i++) { // req.put("WERKS", pageReqVO.getFactoryNumber());
JSONObject dataJson = dataArray.getJSONObject(i); //
if (dataJson != null) { // // 处理日期参数
ErpProductiveOrderDO orderDO = new ErpProductiveOrderDO(); // if (pageReqVO.getStartDate() != null) {
// req.put("BEGDA", pageReqVO.getStartDate()[0].format(DateTimeFormatter.ofPattern("yyyyMMdd")));
// 基本信息 // }
orderDO.setCompanyNumber(dataJson.getString("BUKRS")); // if (pageReqVO.getEndDate() != null) {
orderDO.setFactoryNumber(dataJson.getString("WERKS").trim()); // req.put("ENDDA", pageReqVO.getEndDate()[0].format(DateTimeFormatter.ofPattern("yyyyMMdd")));
orderDO.setFactoryName(dataJson.getString("NAME1")); // }
orderDO.setOrderNumber(dataJson.getString("AUFNR")); //
// // 调用ERP接口获取数据
// 日期处理 // HashMap<String, Object> dataFromERP = erpConfig.fetchDataFromERP(funcnr, req);
String plannedStartDate = dataJson.getString("GLTRP"); // JSONArray dataArray = (JSONArray) dataFromERP.get("E_RESP");
String actualStartDate = dataJson.getString("GSTRP"); // if (dataArray == null || dataArray.isEmpty()) {
// // 返回空结果而不是抛出异常
if (plannedStartDate != null && !plannedStartDate.equals("0000-00-00")) { // return new PageResult<>(new ArrayList<>(), 0L);
try { // }
orderDO.setStartDate(LocalDateTime.parse(plannedStartDate)); //
} catch (Exception e) { // List<ErpProductiveOrderDO> list = new ArrayList<>();
// 忽略日期解析错误 // for (int i = 0; i < dataArray.size(); i++) {
} // JSONObject dataJson = dataArray.getJSONObject(i);
} // if (dataJson != null) {
// ErpProductiveOrderDO orderDO = new ErpProductiveOrderDO();
if (actualStartDate != null && !actualStartDate.equals("0000-00-00")) { //
try { // // 基本信息
orderDO.setEndDate(LocalDateTime.parse(actualStartDate)); // orderDO.setCompanyNumber(dataJson.getString("BUKRS"));
} catch (Exception e) { // orderDO.setFactoryNumber(dataJson.getString("WERKS").trim());
// 忽略日期解析错误 // orderDO.setFactoryName(dataJson.getString("NAME1"));
} // orderDO.setOrderNumber(dataJson.getString("AUFNR"));
} //
// // 日期处理
// 物料和工艺信息 // String plannedStartDate = dataJson.getString("GLTRP");
orderDO.setMainMaterialNumber(dataJson.getString("STLBEZ")); // String actualStartDate = dataJson.getString("GSTRP");
orderDO.setUnit(dataJson.getString("GMEIN")); //
orderDO.setMaterialDescription(dataJson.getString("MAKTX")); // if (plannedStartDate != null && !plannedStartDate.equals("0000-00-00")) {
orderDO.setProcessingList(dataJson.getString("L_AFVC")); // try {
orderDO.setProcessingNumber(dataJson.getString("VORNR")); // orderDO.setStartDate(LocalDateTime.parse(plannedStartDate));
orderDO.setProcessingDescription(dataJson.getString("LTXA1")); // } catch (Exception e) {
orderDO.setObjectNumber(dataJson.getString("OBJID")); // // 忽略日期解析错误
orderDO.setWorkCenterNumber(dataJson.getString("ARBPL")); // }
orderDO.setWorkCenterDescription(dataJson.getString("KTEXT")); // }
orderDO.setCostcenterNumber(dataJson.getString("KOSTL")); //
orderDO.setCostcenterName(dataJson.getString("TEXT_C")); // if (actualStartDate != null && !actualStartDate.equals("0000-00-00")) {
// try {
list.add(orderDO); // orderDO.setEndDate(LocalDateTime.parse(actualStartDate));
} // } catch (Exception e) {
} // // 忽略日期解析错误
// }
// 返回分页结果 // }
return new PageResult<>(list, (long) list.size()); //
} // // 物料和工艺信息
// orderDO.setMainMaterialNumber(dataJson.getString("STLBEZ"));
// orderDO.setUnit(dataJson.getString("GMEIN"));
// orderDO.setMaterialDescription(dataJson.getString("MAKTX"));
// orderDO.setProcessingList(dataJson.getString("L_AFVC"));
// orderDO.setProcessingNumber(dataJson.getString("VORNR"));
// orderDO.setProcessingDescription(dataJson.getString("LTXA1"));
// orderDO.setObjectNumber(dataJson.getString("OBJID"));
// orderDO.setWorkCenterNumber(dataJson.getString("ARBPL"));
// orderDO.setWorkCenterDescription(dataJson.getString("KTEXT"));
// orderDO.setCostcenterNumber(dataJson.getString("KOSTL"));
// orderDO.setCostcenterName(dataJson.getString("TEXT_C"));
//
// list.add(orderDO);
// }
// }
//
// // 返回分页结果
// return new PageResult<>(list, (long) list.size());
// }
@Override @Override
@Transactional @Transactional

View File

@@ -22,10 +22,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -56,18 +53,18 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService {
// 插入 // 插入
ErpWarehouseDO warehouse = BeanUtils.toBean(createReqVO, ErpWarehouseDO.class); ErpWarehouseDO warehouse = BeanUtils.toBean(createReqVO, ErpWarehouseDO.class);
// 库位编码自动生成,格式 KW-0001,依次新增 // 库位编码自动生成,格式 KW-0001,依次新增
if (warehouse.getNumber() == null) { // if (warehouse.getNumber() == null) {
String maxCode = erpWarehouseMapper.selectMaxCode(); // String maxCode = erpWarehouseMapper.selectMaxCode();
if (maxCode == null) { // if (maxCode == null) {
warehouse.setNumber("KW-0001"); // warehouse.setNumber("KW-0001");
} else { // } else {
String prefix = "KW-"; // String prefix = "KW-";
String numberPart = maxCode.substring(prefix.length()); // String numberPart = maxCode.substring(prefix.length());
int nextNumber = Integer.parseInt(numberPart) + 1; // int nextNumber = Integer.parseInt(numberPart) + 1;
String nextCode = prefix + String.format("%04d", nextNumber); // String nextCode = prefix + String.format("%04d", nextNumber);
warehouse.setNumber(nextCode); // warehouse.setNumber(nextCode);
} // }
} // }
warehouse.setType("SPLY"); warehouse.setType("SPLY");
warehouse.setIsEnable("1"); warehouse.setIsEnable("1");
erpWarehouseMapper.insert(warehouse); erpWarehouseMapper.insert(warehouse);
@@ -120,7 +117,7 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService {
private void validateErpFactoryExistsNumber(String number, String factoryNumber) { private void validateErpFactoryExistsNumber(String number, String factoryNumber) {
List<ErpWarehouseDO> list = erpWarehouseMapper.selectList(new LambdaQueryWrapperX<ErpWarehouseDO>()).stream() List<ErpWarehouseDO> list = erpWarehouseMapper.selectList(new LambdaQueryWrapperX<ErpWarehouseDO>()).stream()
.filter(erpWarehouseDO -> erpWarehouseDO.getNumber().equals(number)) .filter(erpWarehouseDO -> erpWarehouseDO.getNumber().equals(number))
.filter(erpWarehouseDO -> erpWarehouseDO.getFactoryNumber().equals(factoryNumber)) .filter(erpWarehouseDO -> Objects.equals(erpWarehouseDO.getFactoryNumber(), factoryNumber))
.toList(); .toList();
if (!list.isEmpty()) { if (!list.isEmpty()) {
throw exception(ERP_WAREHOUSE_EXISTS); throw exception(ERP_WAREHOUSE_EXISTS);
@@ -230,6 +227,7 @@ public class ErpWarehouseServiceImpl implements ErpWarehouseService {
DO.setName(dataJson.getString("LGOBE")); DO.setName(dataJson.getString("LGOBE"));
DO.setNumber(dataJson.getString("LGORT").trim()); DO.setNumber(dataJson.getString("LGORT").trim());
DO.setFactoryNumber(dataJson.getString("WERKS")); DO.setFactoryNumber(dataJson.getString("WERKS"));
DO.setType("ERP");
String number = dataJson.getString("WERKS").trim() + "-" + dataJson.getString("LGORT").trim(); String number = dataJson.getString("WERKS").trim() + "-" + dataJson.getString("LGORT").trim();
if (numbers.get(number) != null) { if (numbers.get(number) != null) {
// 更新 // 更新

View File

@@ -100,13 +100,16 @@ public class ErpConfig {
String url = "http://" + erpAddress + "/api/rfc/post"; String url = "http://" + erpAddress + "/api/rfc/post";
// 构建请求参数 // 构建请求参数
JSONObject requestBody = new JSONObject(); JSONObject requestBody = new JSONObject();
requestBody.put("uuid", UUID.randomUUID().toString()); String uuid = UUID.randomUUID().toString();
requestBody.put("uuid", uuid);
requestBody.put("sapsys", sapsys); requestBody.put("sapsys", sapsys);
requestBody.put("srcsys", "DSC"); requestBody.put("srcsys", "DSC");
requestBody.put("funcnr", reqDTO.getFuncnr()); requestBody.put("funcnr", reqDTO.getFuncnr());
requestBody.put("bskey", reqDTO.getBskey()); requestBody.put("bskey", reqDTO.getBskey());
requestBody.put("usrid", reqDTO.getUsrid()); requestBody.put("usrid", reqDTO.getUsrid());
requestBody.put("usrnm", reqDTO.getUsrnm()); requestBody.put("usrnm", reqDTO.getUsrnm());
//todo 密码另行约定
// requestBody.put("sign", StrUtil.(uuid + sapsys + "密码另行约定"));
if (reqDTO.getReq() != null) { if (reqDTO.getReq() != null) {
requestBody.put("req", reqDTO.getReq()); requestBody.put("req", reqDTO.getReq());
} }

View File

@@ -33,6 +33,7 @@
WHERE DOWN_CTR_NUM = #{item.downCenterNumber} WHERE DOWN_CTR_NUM = #{item.downCenterNumber}
</foreach> </foreach>
</update> </update>
<select id="selectMaxCode" resultType="java.lang.String"> <select id="selectMaxCode" resultType="java.lang.String">
SELECT MAX(MTRL_CODE) FROM SPLY_ERP_MTRL SELECT MAX(MTRL_CODE) FROM SPLY_ERP_MTRL
</select> </select>
@@ -41,7 +42,7 @@
SELECT * FROM SPLY_ERP_MTRL WHERE MTRL_ID = #{erpMId} SELECT * FROM SPLY_ERP_MTRL WHERE MTRL_ID = #{erpMId}
</select> </select>
<select id="selectByErpMNumbers" resultType="java.lang.Integer"> <select id="countByErpMNumbers" resultType="java.lang.Integer">
SELECT COUNT(*) SELECT COUNT(*)
FROM sply_mtrl_oth FROM sply_mtrl_oth
WHERE ERP_MTRL_NUM IN WHERE ERP_MTRL_NUM IN