测试url,sply改为erp

This commit is contained in:
liss
2025-09-24 10:02:03 +08:00
parent 4b629100de
commit efab6957a3
26 changed files with 120 additions and 64 deletions

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP资产卡片")
@RestController
@RequestMapping("/sply/erp-asset")
@RequestMapping("/erp/erp-asset")
@Validated
public class ErpAssetController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP物料清单(BOM)")
@RestController
@RequestMapping("/sply/erp-bom")
@RequestMapping("/erp/erp-bom")
@Validated
public class ErpBomController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP物料清单(BOM)明细")
@RestController
@RequestMapping("/sply/erp-bom-detail")
@RequestMapping("/erp/erp-bom-detail")
@Validated
public class ErpBomDetailController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP公司")
@RestController
@RequestMapping("/sply/erp-company")
@RequestMapping("/erp/erp-company")
@Validated
public class ErpCompanyController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP成本中心")
@RestController
@RequestMapping("/sply/erp-costcenter")
@RequestMapping("/erp/erp-costcenter")
@Validated
public class ErpCostcenterController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP客商信息")
@RestController
@RequestMapping("/sply/erp-customer")
@RequestMapping("/erp/erp-customer")
@Validated
public class ErpCustomerController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP工厂")
@RestController
@RequestMapping("/sply/erp-factory")
@RequestMapping("/erp/erp-factory")
@Validated
public class ErpFactoryController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP内部订单")
@RestController
@RequestMapping("/sply/erp-internal-order")
@RequestMapping("/erp/erp-internal-order")
@Validated
public class ErpInternalOrderController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP物料信息")
@RestController
@RequestMapping("/sply/erp-material")
@RequestMapping("/erp/erp-material")
@Validated
public class ErpMaterialController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP工艺路线")
@RestController
@RequestMapping("/sply/erp-process")
@RequestMapping("/erp/erp-process")
@Validated
public class ErpProcessController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP工艺路线明细")
@RestController
@RequestMapping("/sply/erp-process-detail")
@RequestMapping("/erp/erp-process-detail")
@Validated
public class ErpProcessDetailController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP生产订单")
@RestController
@RequestMapping("/sply/erp-productive-order")
@RequestMapping("/erp/erp-productive-order")
@Validated
public class ErpProductiveOrderController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP生产版本")
@RestController
@RequestMapping("/sply/erp-productive-version")
@RequestMapping("/erp/erp-productive-version")
@Validated
public class ErpProductiveVersionController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP采购组织")
@RestController
@RequestMapping("/sply/erp-purchase-organization")
@RequestMapping("/erp/erp-purchase-organization")
@Validated
public class ErpPurchaseOrganizationController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP销售组织")
@RestController
@RequestMapping("/sply/erp-sales-organization")
@RequestMapping("/erp/erp-sales-organization")
@Validated
public class ErpSalesOrganizationController {

View File

@@ -30,7 +30,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - ERP库位")
@RestController
@RequestMapping("/sply/erp-warehouse")
@RequestMapping("/erp/erp-warehouse")
@Validated
public class ErpWarehouseController {

View File

@@ -20,7 +20,7 @@ public class ErpBomDetailPageReqVO extends PageParam {
private String childMaterialNumber;
@Schema(description = "子项物料描述")
private BigDecimal childMaterialDescription;
private String childMaterialDescription;
@Schema(description = "子项类别")
private String category;

View File

@@ -30,7 +30,7 @@ public class ErpBomDetailRespVO {
@Schema(description = "子项物料描述", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("子项物料描述")
private BigDecimal childMaterialDescription;
private String childMaterialDescription;
@Schema(description = "子项类别", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("子项类别")

View File

@@ -28,7 +28,7 @@ public class ErpBomDetailSaveReqVO {
@Schema(description = "子项物料描述", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "子项物料描述不能为空")
private BigDecimal childMaterialDescription;
private String childMaterialDescription;
@Schema(description = "子项类别", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "子项类别不能为空")

View File

@@ -60,8 +60,4 @@ public class ErpBomDO {
*/
@TableField("UNT")
private String unit;
@TableField(fill = FieldFill.INSERT)
private List<ErpBomDetailDO> erpBomDetailDOList;
}

View File

@@ -49,7 +49,7 @@ public class ErpBomDetailDO {
* 子项物料描述
*/
@TableField("CHD_MTRL_DSP")
private BigDecimal childMaterialDescription;
private String childMaterialDescription;
/**
* 子项类别
*/

View File

@@ -26,4 +26,5 @@ public interface ErpBomMapper extends BaseMapperX<ErpBomDO> {
.orderByDesc(ErpBomDO::getId));
}
Long insertGetId(ErpBomDO aDo);
}

View File

@@ -61,4 +61,5 @@ public interface ErpBomDetailService {
*/
PageResult<ErpBomDetailDO> getErpBomDetailPage(ErpBomDetailPageReqVO pageReqVO);
void saveOrUpdateErpBomDetail(List<ErpBomDetailDO> updateReqVO);
}

View File

@@ -3,16 +3,23 @@ package com.zt.plat.module.erp.service.erp;
import cn.hutool.core.collection.CollUtil;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.module.erp.common.conf.ErpConfig;
import com.zt.plat.module.erp.common.enums.OftenEnum;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBomDetailPageReqVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBomDetailRespVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBomDetailSaveReqVO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpBomDO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpBomDetailDO;
import com.zt.plat.module.erp.dal.mysql.erp.ErpBomDetailMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.module.erp.enums.ErrorCodeConstants.ERP_BOM_DETAIL_NOT_EXISTS;
@@ -29,6 +36,9 @@ public class ErpBomDetailServiceImpl implements ErpBomDetailService {
@Resource
private ErpBomDetailMapper erpBomDetailMapper;
@Resource
private ErpConfig erpConfig;
@Override
public ErpBomDetailRespVO createErpBomDetail(ErpBomDetailSaveReqVO createReqVO) {
// 插入
@@ -56,12 +66,12 @@ public class ErpBomDetailServiceImpl implements ErpBomDetailService {
}
@Override
public void deleteErpBomDetailListByIds(List<Long> ids) {
public void deleteErpBomDetailListByIds(List<Long> ids) {
// 校验存在
validateErpBomDetailExists(ids);
// 删除
erpBomDetailMapper.deleteByIds(ids);
}
}
private void validateErpBomDetailExists(List<Long> ids) {
List<ErpBomDetailDO> list = erpBomDetailMapper.selectByIds(ids);
@@ -86,4 +96,35 @@ public class ErpBomDetailServiceImpl implements ErpBomDetailService {
return erpBomDetailMapper.selectPage(pageReqVO);
}
@Override
public void saveOrUpdateErpBomDetail(List<ErpBomDetailDO> updateReqVO) {
String key = "erpMap" + OftenEnum.FuncnrEnum.BOM清单.getFuncnr()+ "Detail";
if (erpConfig.getRedisCacheMap(key).isEmpty()) {
initializeMap(key);
}
List<ErpBomDetailDO> toUpdate = new ArrayList<>();
List<ErpBomDetailDO> toInsert = new ArrayList<>();
Map<String, Long> existingNumbers = erpConfig.getRedisCacheMap(key);
// for (ErpBomDetailDO updateReqVO : updateReqVO){
// String mapKey = updateReqVO.getBomId() + "-" + updateReqVO.getErpBomId();
// if (existingNumbers.get(mapKey)!=null) {
//
// updateReqVO.setId(existingNumbers.get(mapKey));
// }
// }
// erpBomDetailMapper.saveOrUpdateErpBomDetail(updateReqVO);
}
private void initializeMap(String key) {
List<ErpBomDetailDO> assets = erpBomDetailMapper.selectList(new LambdaQueryWrapperX<ErpBomDetailDO>());
Map<String, Long> existingNumbers = new HashMap<>();
for (ErpBomDetailDO asset : assets) {
String mapKey = asset.getBomId() + "-" + asset.getErpBomId();
existingNumbers.put(mapKey, asset.getId());
}
erpConfig.addRedisCacheMap(key, existingNumbers);
}
}

View File

@@ -3,6 +3,7 @@ package com.zt.plat.module.erp.service.erp;
import cn.hutool.core.collection.CollUtil;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.module.erp.api.ErpExternalApi;
import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO;
import com.zt.plat.module.erp.common.conf.ErpConfig;
@@ -10,6 +11,7 @@ import com.zt.plat.module.erp.common.enums.OftenEnum;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBomPageReqVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBomRespVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBomSaveReqVO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpAssetDO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpBomDO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpBomDO;
import com.zt.plat.module.erp.dal.dataobject.erp.ErpBomDetailDO;
@@ -48,6 +50,9 @@ public class ErpBomServiceImpl implements ErpBomService {
@Resource
public ErpExternalApi erpExternalApi;
@Resource
private ErpBomDetailServiceImpl bomDetailService;
@Override
public ErpBomRespVO createErpBom(ErpBomSaveReqVO createReqVO) {
// 插入
@@ -112,13 +117,18 @@ public class ErpBomServiceImpl implements ErpBomService {
try {
OftenEnum.FuncnrEnum funcnrEnum = OftenEnum.FuncnrEnum.BOM清单;
String funcnr = funcnrEnum.getFuncnr();
String key = "erpMap" + funcnr;
if (erpConfig.getRedisCacheMap(key).isEmpty()) {
initializeMap(key);
}
Map<String, Object> req = new HashMap<>();
JSONArray dataArrayALL = new JSONArray();
List<String> redisCache = erpConfig.getRedisCache(OftenEnum.FuncnrEnum.工厂信息.getFuncnr());
String factKey = "erpMap" + OftenEnum.FuncnrEnum.工厂信息.getFuncnr();
Map<String, Long> redisCache = erpConfig.getRedisCacheMap(factKey);
if (CollUtil.isEmpty(redisCache)) {
return;
}
for (String factoryNumber : redisCache) {
for (String factoryNumber : redisCache.keySet()) {
req.put("WERKS", factoryNumber);
// 1. 调用ERP接口获取数据
JSONArray dataArray = erpConfig.fetchDataFromERP(funcnr, req);
@@ -143,14 +153,13 @@ public class ErpBomServiceImpl implements ErpBomService {
/**
* 处理数据,区分新增和更新
*/
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnr) {
String key = "erp" + funcnr.getFuncnr();
private ProcessingResult processData(JSONArray dataArray, OftenEnum.FuncnrEnum funcnrEnum) {
String key = "erpMap" + funcnrEnum.getFuncnr();
Map<String, Long> numbers = erpConfig.getRedisCacheMap(key);
Map<String, Long> numberDetails = erpConfig.getRedisCacheMap(key+"details");
List<ErpBomDO> toUpdate = new ArrayList<>();
List<ErpBomDO> toInsert = new ArrayList<>();
List<String> allnumbers = new ArrayList<>();
List<ErpBomDetailDO> erpBomDetailDOList = new ArrayList<>();
for (int i = 0; i < dataArray.size(); i++) {
JSONObject dataJson = dataArray.getJSONObject(i);
if (dataJson != null) {
@@ -162,42 +171,37 @@ public class ErpBomServiceImpl implements ErpBomService {
DO.setMaterialDescription(dataJson.getString("MAKTX"));
DO.setQuantity(dataJson.getBigDecimal("BMENG"));
DO.setUnit(dataJson.getString("BMEIN"));
String number =DO.getUpMaterial()+"-"+DO.getUseItem()+"-"+DO.getFactoryNumber();
if (numbers.get(number)!=null) {
String number = DO.getFactoryNumber() + "-" + DO.getUpMaterial() + "-" + DO.getUseItem();
if (numbers.get(number) != null) {
// 更新
DO.setId(numbers.get(number));
toUpdate.add(DO);
} else {
// 新增
toInsert.add(DO);
// 为了避免数据重复先将主表数据插入数据库再获取主表ID再插入子表数据
erpBomMapper.insert(DO);
numbers.put(number, DO.getId());
}
JSONArray dataJsonItem = dataJson.getJSONArray("ITEM");
if (dataJsonItem != null) {
List<ErpBomDetailDO> erpBomDetailDOList =new ArrayList<>();
for (int j = 0; j < dataJsonItem.size(); j++){
for (int j = 0; j < dataJsonItem.size(); j++) {
JSONObject dataJsonItemJson = dataJsonItem.getJSONObject(j);
ErpBomDetailDO detailDO = new ErpBomDetailDO();
String numberDel = number+dataJsonItemJson.getString("STVKN");
if (numberDetails.get( numberDel) != null){
detailDO.setId(Long.valueOf(numberDetails.get( numberDel)));
}
detailDO.setBomId(String.valueOf(numbers.get(number)));
detailDO.setBomId(String.valueOf(DO.getId()));
detailDO.setErpBomId(dataJsonItemJson.getString("STVKN"));
detailDO.setErpBomId(dataJsonItemJson.getString("IDNRK"));
detailDO.setErpBomId(dataJsonItemJson.getString("OJTXP"));
detailDO.setErpBomId(dataJsonItemJson.getString("POSTP"));
detailDO.setErpBomId(dataJsonItemJson.getString("MENGE"));
detailDO.setErpBomId(dataJsonItemJson.getString("MEINS"));
detailDO.setErpBomId(dataJsonItemJson.getString("WLCAT"));
detailDO.setChildMaterialNumber(dataJsonItemJson.getString("IDNRK"));
detailDO.setChildMaterialDescription(dataJsonItemJson.getString("OJTXP"));
detailDO.setCategory(dataJsonItemJson.getString("POSTP"));
detailDO.setQuantity(dataJsonItemJson.getBigDecimal("MENGE"));
detailDO.setUnit(dataJsonItemJson.getString("MEINS"));
detailDO.setIdentificationType(dataJsonItemJson.getString("WLCAT"));
erpBomDetailDOList.add(detailDO);
}
DO.setErpBomDetailDOList(erpBomDetailDOList);
}
}
}
return new ProcessingResult(toUpdate, toInsert, key, allnumbers);
return new ProcessingResult(toUpdate, erpBomDetailDOList,key, allnumbers);
}
/**
@@ -205,13 +209,12 @@ public class ErpBomServiceImpl implements ErpBomService {
*/
private void saveData(ProcessingResult result) {
// 批量新增和更新
if (!result.toInsert.isEmpty()) {
erpBomMapper.insertBatch(result.toInsert);
}
if (!result.toUpdate.isEmpty()) {
erpBomMapper.updateBatch(result.toUpdate);
}
erpConfig.updateRedisCache(result.key, result.allnumbers);
if (!result.erpBomDetailDOList.isEmpty()) {
bomDetailService.saveOrUpdateErpBomDetail(result.erpBomDetailDOList);
}
}
/**
@@ -219,34 +222,44 @@ public class ErpBomServiceImpl implements ErpBomService {
*/
private static class ProcessingResult {
private final List<ErpBomDO> toUpdate;
private final List<ErpBomDO> toInsert;
private final List<ErpBomDetailDO> erpBomDetailDOList;
private final String key;
private final List<String> allnumbers;
public ProcessingResult(List<ErpBomDO> toUpdate, List<ErpBomDO> toInsert, String key, List<String> allnumbers) {
public ProcessingResult(List<ErpBomDO> toUpdate, List<ErpBomDetailDO> erpBomDetailDOList, String key, List<String> allnumbers) {
this.toUpdate = toUpdate;
this.toInsert = toInsert;
this.erpBomDetailDOList = erpBomDetailDOList;
this.key = key;
this.allnumbers = allnumbers;
}
}
private void initializeMap(String key) {
List<ErpBomDO> assets = erpBomMapper.selectList(new LambdaQueryWrapperX<ErpBomDO>());
Map<String, Long> existingNumbers = new HashMap<>();
for (ErpBomDO asset : assets) {
String mapKey = asset.getFactoryNumber() + "-" + asset.getUpMaterial() + "-" + asset.getUseItem();
existingNumbers.put(mapKey, asset.getId());
}
erpConfig.addRedisCacheMap(key, existingNumbers);
}
@Override
public void submitDataToErp() {
ErpSubmitReqDTO reqDTO = new ErpSubmitReqDTO();
ErpSubmitReqDTO reqDTO = new ErpSubmitReqDTO();
reqDTO.setSrcsys("MOM");
reqDTO.setFuncnr("061");
reqDTO.setBskey("POTEST011");
reqDTO.setUsrid("cuibin");
reqDTO.setUsrnm("崔斌");
Map<String, Object> req = new HashMap<>();
Map<String, String> exte = new HashMap<>();
exte.put("zzhth", "成品采购合同0406-1-xt");
req.put("exte", exte);
Map<String, Object> head = new HashMap<>();
head.put("pur_group", "120");
head.put("purch_org", "3017");
@@ -258,7 +271,7 @@ public class ErpBomServiceImpl implements ErpBomService {
head.put("doc_type", "PO01");
head.put("zzhth", "成品采购合同0406-1-xt");
req.put("head", head);
List<Map<String, Object>> items = new ArrayList<>();
Map<String, Object> item = new HashMap<>();
item.put("material", "000000000000226986");
@@ -275,7 +288,7 @@ public class ErpBomServiceImpl implements ErpBomService {
req.put("item", items);
reqDTO.setReq(req);
ResponseEntity<String> response = erpExternalApi.submitDataToErp(reqDTO);
if (response.getStatusCode() == HttpStatus.OK){
if (response.getStatusCode() == HttpStatus.OK) {
log.info("ERP数据提交成功");
}
}

View File

@@ -9,6 +9,10 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<insert id="insertGetId">
</insert>
<update id="updateBatch">
<foreach collection="toUpdate" item="item" separator=";">
UPDATE sply_erp_fact