add:增加ERP单据定时同步功能。

This commit is contained in:
2024-11-20 20:17:15 +08:00
parent 6d4e264b3b
commit e05e469a85
3 changed files with 182 additions and 99 deletions

View File

@@ -2,10 +2,18 @@ package org.nl.wms.external_system.erp;
import com.alibaba.fastjson.JSON;
//import com.kingdee.bos.webapi.entity.*;
//import com.kingdee.bos.webapi.sdk.K3CloudApi;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.kingdee.bos.webapi.entity.*;
import com.kingdee.bos.webapi.sdk.K3CloudApi;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.wms.base_manage.bsrealstorattr.service.impl.StIvtBsrealstorattrServiceImpl;
import org.nl.wms.base_manage.customer.service.impl.BmCustomerServiceImpl;
import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
import org.nl.wms.base_manage.material.service.impl.MdMeMaterialbaseServiceImpl;
import org.nl.wms.base_manage.supplier.service.IBmSupplierService;
import org.nl.wms.external_system.erp.dto.ErpQuery;
import org.nl.wms.external_system.erp.dto.ErpSec;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
@@ -40,57 +48,122 @@ public class SyncErpService {
@Autowired
ErpSec erpSec;
@Autowired
MdMeMaterialbaseServiceImpl mdMeMaterialbaseServiceImpl;
@Autowired
private IBmSupplierService supplierService;
@Autowired
private BmCustomerServiceImpl bmCustomerServiceImpl;
@Autowired
private StIvtBsrealstorattrServiceImpl stIvtBsrealstorattrServiceImpl;
public List<Object> syncDataTest(SyncFormMapping syncFormMapping) {
List<MdMeMaterialbase> list = mdMeMaterialbaseServiceImpl.list(new LambdaQueryWrapper<MdMeMaterialbase>().lt(MdMeMaterialbase::getMaterial_id, "80000"));
list.forEach(r -> {
syncDataTest(r.getMaterial_code());
});
return null;
}
public List<Object> syncDataTest(String fNumber) {
List<Object> result = new ArrayList<>();
try {
String sd = String.format("FNumber ='%s'", fNumber);
IdentifyInfo identifyInfo = new IdentifyInfo();
BeanUtils.copyProperties(erpSec, identifyInfo);
K3CloudApi cloudApi = new K3CloudApi(identifyInfo);
String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
ErpQuery query = new ErpQuery();
query.setFilterString(sd);
query.setFormId("BD_MATERIAL");
query.setFieldKeys("FMATERIALID,FNumber");
//query.setLimit(10);
String jsonString = JSON.toJSONString(query);
List<List<Object>> lists = cloudApi.executeBillQuery(jsonString);
log.info("同步ERP结果" + lists.size());
List<String> ids = new ArrayList<>();
List<Object> firstList = lists.get(0);
for (Object r : firstList) {
String fid = r.toString();
if (StringUtils.isEmpty(fid)) {
throw new RuntimeException("单据同步失败,没有找到FID");
}
ids.add(fid);
}
if (ids.size() > 1) {
List<MdMeMaterialbase> sds = mdMeMaterialbaseServiceImpl.list(new LambdaQueryWrapper<MdMeMaterialbase>().eq(MdMeMaterialbase::getMaterial_code, ids.get(1)));
if (ObjectUtils.isNotEmpty(sds)) {
if (StringUtils.isNotBlank(ids.get(0)) && StringUtils.isNotBlank(ids.get(1))) {
String id = ids.get(0);
String code = ids.get(1);
if (code.contains(".")) {
LambdaUpdateWrapper<MdMeMaterialbase> data = new LambdaUpdateWrapper<>();
data.eq(MdMeMaterialbase::getMaterial_code, code);
data.set(MdMeMaterialbase::getMaterial_id, id);
mdMeMaterialbaseServiceImpl.update(data);
}
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException("同步失败:" + ex.getMessage());
}
return result;
}
public List<Object> syncData(SyncFormMapping syncFormMapping) {
List<Object> result = new ArrayList<>();
try {
// log.info("开始同步ERP" + syncFormMapping.getForm_name());
// IdentifyInfo identifyInfo = new IdentifyInfo();
// BeanUtils.copyProperties(erpSec, identifyInfo);
// K3CloudApi cloudApi = new K3CloudApi(identifyInfo);
// String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
// String filterString = "FCreateDate >= '" + today + " 00:00:00' and FCreateDate <= '" + today + " 23:59:59'";
// ErpQuery query = new ErpQuery();
// query.setFilterString(filterString);
// //query.setFormId(syncFormMapping.getForm_type());
// query.setFormId("PRD_INSTOCK");
// query.setFieldKeys("FID");
// query.setLimit(2000);
// String jsonString = JSON.toJSONString(query);
// List<List<Object>> lists = cloudApi.executeBillQuery(jsonString);
// log.info("同步ERP结果" + lists.size());
// Set<String> ids = new HashSet<>();
// for (List<Object> list : lists) {
// for (Object r : list) {
// String fid = r.toString();
// if (StringUtils.isEmpty(fid)) {
// throw new RuntimeException("单据同步失败,没有找到FID");
// }
// ids.add(fid);
// }
// }
// OperateParam param = new OperateParam();
// Map<String, String> error = new HashMap<>();
// for (String id : ids) {
// param.setId(id);
// OperatorResult view = cloudApi.view("PRD_INSTOCK", param);
// RepoStatus status = view.getResult().getResponseStatus();
// if (status.isIsSuccess()) {
// result.add(view.getResult().getResult());
// } else {
// ArrayList<RepoError> errors = status.getErrors();
// String errorMsg = errors.stream().map(RepoError::getMessage).collect(Collectors.joining(","));
// error.put(id, errorMsg);
// }
// }
// if (!CollectionUtils.isEmpty(error)){
// log.info("ERP单据同步同步失败:{}", error);
// }
}catch (Exception ex){
log.info("开始同步ERP" + syncFormMapping.getForm_name());
IdentifyInfo identifyInfo = new IdentifyInfo();
BeanUtils.copyProperties(erpSec, identifyInfo);
K3CloudApi cloudApi = new K3CloudApi(identifyInfo);
String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//String filterString = "FCreateDate >= '" + today + " 00:00:00' and FCreateDate <= '" + today + " 23:59:59'";
ErpQuery query = new ErpQuery();
// query.setFilterString(filterString);
//query.setFormId(syncFormMapping.getForm_type());
query.setFormId("BD_MATERIAL");
query.setFieldKeys("FMATERIALID,FNumber");
query.setLimit(10);
String jsonString = JSON.toJSONString(query);
List<List<Object>> lists = cloudApi.executeBillQuery(jsonString);
log.info("同步ERP结果" + lists.size());
Set<String> ids = new HashSet<>();
for (List<Object> list : lists) {
for (Object r : list) {
String fid = r.toString();
if (StringUtils.isEmpty(fid)) {
throw new RuntimeException("单据同步失败,没有找到FID");
}
ids.add(fid);
}
}
OperateParam param = new OperateParam();
Map<String, String> error = new HashMap<>();
for (String id : ids) {
param.setId(id);
OperatorResult view = cloudApi.view("BD_MATERIAL", param);
RepoStatus status = view.getResult().getResponseStatus();
if (status.isIsSuccess()) {
result.add(view.getResult().getResult());
} else {
ArrayList<RepoError> errors = status.getErrors();
String errorMsg = errors.stream().map(RepoError::getMessage).collect(Collectors.joining(","));
error.put(id, errorMsg);
}
}
if (!CollectionUtils.isEmpty(error)) {
log.info("ERP单据同步同步失败:{}", error);
}
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException("同步失败:"+ex.getMessage());
throw new RuntimeException("同步失败:" + ex.getMessage());
}
log.info(result.toString());
return result;
}

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
@@ -14,10 +15,9 @@ import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.*;
import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import org.nl.wms.pm_manage.form_data.service.dao.PmFormData;
import org.nl.wms.pm_manage.form_data.service.dao.mapper.PmFormDataMapper;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.pm_manage.form_data.service.dto.FormDataQuery;
import org.nl.wms.pm_manage.form_data.service.dto.PmFormDataDto;
import org.nl.wms.sync_manage.service.form_mapping.ISyncFormMappingService;
@@ -73,62 +73,67 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
}
@Override
public List<PmFormData> syncAnalyse(SyncFormMapping formMapping, String sourceString) {
BmFormStruc one = formStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("form_type", formMapping.getForm_type()));
if (one == null) {
throw new BadRequestException("当前表单无配置信息" + formMapping.getForm_type());
}
List<PmFormData> result = new ArrayList<>();
Boolean dtlSplit = formMapping.getDtl_split();
//直接取
JSONObject sourceData = JSONObject.parseObject(sourceString);;
// if (StringUtils.isNotEmpty(convertJson)){
// sourceData = JSONObject.parseObject(sourceString).getJSONObject("Model");
// }else {
// sourceData = JSONObject.parseObject(sourceString);
// }
if (dtlSplit){
List<JSONObject> items_arr = mappingParseList(formMapping.getMapping_json(), one, sourceData);
for (int i = 0; i < items_arr.size(); i++) {
JSONObject itemTarget = items_arr.get(i);
itemTarget.put("id", IdUtil.getStringId());
itemTarget.put("code", CodeUtil.getNewCode(formMapping.getForm_type()));
itemTarget.put("create_time", DateUtil.now());
itemTarget.put("create_name", SecurityUtils.getCurrentNickName());
PmFormData dtl = itemTarget.toJavaObject(PmFormData.class);
result.add(dtl);
try {
BmFormStruc one = formStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("form_type", formMapping.getForm_type()));
if (one == null) {
throw new BadRequestException("当前表单无配置信息" + formMapping.getForm_type());
}
}else {
JSONObject target = mappingParse(formMapping.getMapping_json(), one, sourceData);
Object items = target.remove("item");
target.put("id",
StringUtils.isEmpty(target.getString("biz_id"))
?IdUtil.getStringId():target.getString("biz_id"));
target.put("code",
StringUtils.isEmpty(target.getString("biz_code"))
?CodeUtil.getNewCode(formMapping.getForm_type()):target.getString("biz_code"));
target.put("create_time", DateUtil.now());
target.put("create_name", SecurityUtils.getCurrentNickName());
PmFormData mst = target.toJavaObject(PmFormData.class);
result.add(mst);
if (items != null) {
JSONArray items_arr = (JSONArray) items;
List<PmFormData> result = new ArrayList<>();
Boolean dtlSplit = formMapping.getDtl_split();
//直接取
JSONObject sourceData = JSONObject.parseObject(sourceString);
// if (StringUtils.isNotEmpty(convertJson)){
// sourceData = JSONObject.parseObject(sourceString).getJSONObject("Model");
// }else {
// sourceData = JSONObject.parseObject(sourceString);
// }
if (dtlSplit) {
List<JSONObject> items_arr = mappingParseList(formMapping.getMapping_json(), one, sourceData);
for (int i = 0; i < items_arr.size(); i++) {
JSONObject itemTarget = items_arr.getJSONObject(i);
itemTarget.put("id",
StringUtils.isEmpty(itemTarget.getString("biz_id"))
?IdUtil.getStringId():itemTarget.getString("biz_id"));
if (StringUtils.isNotEmpty(itemTarget.getString("biz_code"))) {
itemTarget.getString("biz_code");
}
JSONObject itemTarget = items_arr.get(i);
itemTarget.put("id", IdUtil.getStringId());
itemTarget.put("code", CodeUtil.getNewCode(formMapping.getForm_type()));
itemTarget.put("create_time", DateUtil.now());
itemTarget.put("create_name", SecurityUtils.getCurrentNickName());
itemTarget.put("parent_id", mst.getId());
PmFormData dtl = itemTarget.toJavaObject(PmFormData.class);
result.add(dtl);
}
} else {
JSONObject target = mappingParse(formMapping.getMapping_json(), one, sourceData);
Object items = target.remove("item");
target.put("id",
StringUtils.isEmpty(target.getString("biz_id"))
? IdUtil.getStringId() : target.getString("biz_id"));
target.put("code",
StringUtils.isEmpty(target.getString("biz_code"))
? CodeUtil.getNewCode(formMapping.getForm_type()) : target.getString("biz_code"));
target.put("create_time", DateUtil.now());
target.put("create_name", SecurityUtils.getCurrentNickName());
PmFormData mst = target.toJavaObject(PmFormData.class);
result.add(mst);
if (items != null) {
JSONArray items_arr = (JSONArray) items;
for (int i = 0; i < items_arr.size(); i++) {
JSONObject itemTarget = items_arr.getJSONObject(i);
itemTarget.put("id",
StringUtils.isEmpty(itemTarget.getString("biz_id"))
? IdUtil.getStringId() : itemTarget.getString("biz_id"));
if (StringUtils.isNotEmpty(itemTarget.getString("biz_code"))) {
itemTarget.getString("biz_code");
}
itemTarget.put("create_time", DateUtil.now());
itemTarget.put("create_name", SecurityUtils.getCurrentNickName());
itemTarget.put("parent_id", mst.getId());
PmFormData dtl = itemTarget.toJavaObject(PmFormData.class);
result.add(dtl);
}
}
}
return result;
} catch (Exception ex) {
log.error("ERP单据解析异常" + ex.getMessage());
return null;
}
return result;
}
@Override

View File

@@ -1,6 +1,7 @@
package org.nl.wms.sync_manage.controller.form_mapping;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -46,6 +47,7 @@ import java.util.List;
*/
@RestController
@RequestMapping("api/syncFormMapping")
@SaIgnore
public class SyncFormMappingController {
@@ -114,10 +116,13 @@ public class SyncFormMappingController {
//参数判读,参数解析,调用参数入库
SyncFormMapping syncFormMapping = form.toJavaObject(SyncFormMapping.class);
List<Object> objects = syncErpService.syncData(syncFormMapping);
List<PmFormData> pmFormDatas = formDataService.syncAnalyse(syncFormMapping, JSON.toJSONString(objects));
formDataService.saveBatch(pmFormDatas);
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
List<PmFormData> pmFormDatas = formDataService.syncAnalyse(syncFormMapping, JSON.toJSONString(objects));
formDataService.saveBatch(pmFormDatas);
return new ResponseEntity<>(TableDataInfo.build(objects),HttpStatus.OK);
}
}