add:单据同步

This commit is contained in:
zhangzq
2024-05-14 09:47:43 +08:00
parent 4b54222103
commit 1e2da6f427
7 changed files with 166 additions and 122 deletions

View File

@@ -4,7 +4,9 @@ import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import org.nl.common.domain.exception.BadRequestException;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.SpelEvaluationException;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
@@ -14,9 +16,11 @@ import java.util.Map;
/*
* @author ZZQ
* @Date 2024/5/13 16:23
* 批量解析时如果有一个映射结果为null则会抛异常Cannot index into a null value后续确认是否跳过
*/
public class SpelUtil {
//SpelExpressionParser方法是否线程安全
private static SpelExpressionParser SPEL_PARSER = new SpelExpressionParser();
public static void main(String[] args) {
@@ -34,7 +38,7 @@ public class SpelUtil {
model.put("FARRAY", FARRAY);
FARRAY.add(MapOf.of("ARR1","子子子数字"));
FARRAY.add(MapOf.of("ARR2","子子子数字2"));
Map parse = SpelUtil.parse(source, MapOf.of("FID", "#M['FID']", "ARR1", "#M['Model']['FARRAY'][1]['ARR2']"));
Map parse = SpelUtil.parse(source, MapOf.of("FID", "#M['FID']", "SSD", "#M['Model']['FDATA']","ARR1", "#M['Model']['FARRAY2'][1]['ARR2']"));
System.out.println(parse.toString());
/*
{
@@ -73,8 +77,13 @@ public class SpelUtil {
for (String field : fieldSkip.keySet()) {
String skip = fieldSkip.get(field);
Expression expression = SpelUtil.SPEL_PARSER.parseExpression(skip);
String value = expression.getValue(context, String.class);
result.put(field,value);
try {
String value = expression.getValue(context, String.class);
result.put(field,value);
}catch (SpelEvaluationException ex){
throw new BadRequestException("当前业务数据没有映射字段"+field+" 对应的数据"+skip);
}
}
return result;
}

View File

@@ -30,7 +30,7 @@ import java.util.Map;
/**
* <p>
* 前端控制器
* 前端控制器
* </p>
*
* @author generator
@@ -41,14 +41,15 @@ import java.util.Map;
@SaIgnore
public class BmFormStrucController {
private static Map<String, String> BASE_FORM = MapOf.of("biz_id", "业务单据单据id"
, "biz_code", "业务单据编号"
, "biz_date", "业务单据日期"
, "biz_status", "业务单据状态"
, "material_id", "物料id"
, "qty", "数量"
, "unit_id", "单位"
, "vehicle_code", "载具");
private static Map<String,String> BASE_FORM = MapOf.of("biz_id","业务单据单据id"
,"biz_code","业务单据编号"
,"biz_date","业务单据日期"
,"biz_status","业务单据状态"
,"material_id","物料id"
,"qty","数量"
,"unit_id","单位"
,"pcsn","批次"
,"vehicle_code","载具");
@Autowired
IBmFormStrucService iBmFormStrucService;
@@ -56,15 +57,13 @@ public class BmFormStrucController {
IPmFormDataService iPmFormDataService;
@GetMapping
public ResponseEntity<Object> queryAll(FormStrucQuery query, PageQuery pageQuery) {
//iBmFormStrucService.queryAll(query, pageQuery);
public ResponseEntity<Object> queryAll(FormStrucQuery query, PageQuery pageQuery){
//参数判读,参数解析,调用参数入库
//Page<BmFormStruc> page = iBmFormStrucService.page(pageQuery.build(), query.build());
return new ResponseEntity<>(iBmFormStrucService.queryAll(query, pageQuery), HttpStatus.OK);
Page<BmFormStruc> page = iBmFormStrucService.page(pageQuery.build(), query.build());
return new ResponseEntity<>(TableDataInfo.build(page),HttpStatus.OK);
}
@PostMapping
public ResponseEntity<Object> save(@RequestBody JSONObject param) {
public ResponseEntity<Object> save(@RequestBody JSONObject param){
//参数判读,参数解析,调用参数入库
BmFormStruc formStruc = param.toJavaObject(BmFormStruc.class);
formStruc.setCreate_time(DateUtil.now());
@@ -73,77 +72,76 @@ public class BmFormStrucController {
iBmFormStrucService.save(formStruc);
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/delete")
public ResponseEntity<Object> delete(List<String> types) {
public ResponseEntity<Object> delete(List<String> types){
//参数判读,参数解析,调用参数入库
int dataCount = iPmFormDataService.count(new QueryWrapper<PmFormData>().in("form_type", types));
if (dataCount > 0) {
if (dataCount>0){
throw new BadRequestException("当前表单存在业务数据,不允许删除");
}
iBmFormStrucService.remove(new QueryWrapper<BmFormStruc>().in("form_type", types));
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/getTypes")
public ResponseEntity<Object> getTypes() {
public ResponseEntity<Object> getTypes(){
//参数判读,参数解析,调用参数入库
List<Map<String, Object>> select = iBmFormStrucService.listMaps(new QueryWrapper<BmFormStruc>().select("form_type", "form_name").groupBy("form_type"));
List<Map> list = new ArrayList<>();
for (Map<String, Object> map : select) {
list.add(MapOf.of("lable", map.get("form_name"), "value", map.get("form_type")));
list.add(MapOf.of("lable",map.get("form_name"),"value",map.get("form_type")));
}
return new ResponseEntity<>(list, HttpStatus.OK);
return new ResponseEntity<>(list,HttpStatus.OK);
}
/**
* @ONLY:动态表单表头信息 数据结构:{"type":xxx,"name":xxx,"desc":xxx,"item":{"desc":"描述"}}
* @ONLY:动态表单表头信息
* 数据结构:{"type":xxx,"name":xxx,"desc":xxx,"item":{"desc":"描述"}}
*/
@GetMapping("/formColumns/{form_type}")
public ResponseEntity<Object> formColumns(@PathVariable String form_type) {
public ResponseEntity<Object> formColumns(@PathVariable String form_type){
//参数判读,参数解析,调用参数入库
List<Map> items = new ArrayList<>();
BmFormStruc form_struc = iBmFormStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("form_type", form_type));
if (form_struc != null) {
if (form_struc!=null){
JSONObject form_param = form_struc.getForm_param();
for (String key : form_param.keySet()) {
items.add(MapOf.of("lable", form_param.get(key), "value", key));
items.add(MapOf.of("lable",form_param.get(key),"value",key));
}
}
return new ResponseEntity<>(items, HttpStatus.OK);
return new ResponseEntity<>(items,HttpStatus.OK);
}
/**
* @ONLY:只用于获取表单同步配置接口
* @param form_type
* @return
* @ONLY:只用于获取表单同步配置接口
*/
@GetMapping("/tableColumns/{form_type}")
public ResponseEntity<Object> tableColumns(@PathVariable String form_type) {
public ResponseEntity<Object> tableColumns(@PathVariable String form_type){
//参数判读,参数解析,调用参数入库
BmFormStruc form_struc = iBmFormStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("form_type", form_type));
HashMap result = MapOf.of("has_child", form_struc.getHas_child(), "form_type", form_struc.getForm_type(), "form_name", form_struc.getForm_name(), "form_desc", form_struc.getForm_desc());
HashMap result = MapOf.of("has_child",form_struc.getHas_child(),"form_type", form_struc.getForm_type(), "form_name", form_struc.getForm_name(), "form_desc", form_struc.getForm_desc());
JSONObject form_param = form_struc.getForm_param();
form_param.putAll(BASE_FORM);
List<Map> items = new ArrayList<>();
for (String key : form_param.keySet()) {
items.add(MapOf.of("lable", form_param.get(key), "value", key));
items.add(MapOf.of("lable",form_param.get(key),"value",key));
}
if (form_struc.getHas_child()) {
if (form_struc.getHas_child()){
List<Map> dtl_items = new ArrayList<>();
BmFormStruc child_struc = iBmFormStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("parent_id", form_struc.getForm_type()));
if (child_struc != null) {
JSONObject child_param = child_struc.getForm_param();
child_param.putAll(BASE_FORM);
for (String key : child_param.keySet()) {
dtl_items.add(MapOf.of("lable", form_param.get(key), "value", key));
}
result.put("dtl_item", dtl_items);
BmFormStruc child_struc = iBmFormStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("parent_id", form_struc.getId()));
if (child_struc == null){
throw new BadRequestException("当前表单配置异常:无子表配置信息");
}
JSONObject child_param = child_struc.getForm_param();
child_param.putAll(BASE_FORM);
for (String key : child_param.keySet()) {
dtl_items.add(MapOf.of("lable",child_param.get(key),"value",key));
}
result.put("dtl_item",dtl_items);
}
result.put("item", items);
return new ResponseEntity<>(result, HttpStatus.OK);
result.put("item",items);
return new ResponseEntity<>(result,HttpStatus.OK);
}
}

View File

@@ -1,21 +1,22 @@
package org.nl.wms.pm_manage.form_data.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService;
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.dto.FormDataQuery;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <p>

View File

@@ -1,11 +1,12 @@
package org.nl.wms.pm_manage.form_data.service.impl;
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 org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.ListOf;
import org.nl.common.utils.SpelUtil;
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.dao.PmFormData;
@@ -20,8 +21,6 @@ import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
/**
* <p>
@@ -52,71 +51,91 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
@Override
public Integer syncFormData(String form_type, String dataString) {
SyncFormMapping syncFormMapping = iSyncFormMappingService.getOne(new QueryWrapper<SyncFormMapping>().eq("form_type", form_type));
BmFormStruc one = formStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("form_type", form_type));
Assert.notNull(one,"当前单据类型未定义"+form_type);
List<PmFormData> saves = new ArrayList<>();
//TODO: 查询同步配置表获取表单的同步处理SourceDataTypeHandler分为字段映射跟class类处理脚本处理
PmFormData formData = new PmFormData();
saves.add(formData);
if (one.getHas_child()){
BmFormStruc item = formStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("parent_id", one.getId()));
String[] split = dataString.split(",");
for (String itemData : split) {
// PmFormData itemForm = SourceDataTypeHandlerMap.get(form_type).sourceHandler(itemData, syncFormMapping);
PmFormData itemForm=new PmFormData();
itemForm.setParent_id(formData.getId());
saves.add(itemForm);
}
if (StringUtils.isEmpty(form_type)||StringUtils.isEmpty(dataString)){
throw new BadRequestException("请求参数不能为空");
}
this.saveBatch(saves);
return saves.size();
SyncFormMapping syncFormMapping = iSyncFormMappingService.getOne(new QueryWrapper<SyncFormMapping>().eq("form_type", form_type));
if (syncFormMapping == null){
throw new BadRequestException("当前表单无同步配置信息");
}
List<PmFormData> pmFormDatas = this.syncAnalyse(syncFormMapping, dataString);
this.saveBatch(pmFormDatas);
return pmFormDatas.size();
}
@Override
public List<PmFormData> syncAnalyse(SyncFormMapping formMapping, String dataString) {
public List<PmFormData> syncAnalyse(SyncFormMapping formMapping, String sourceString) {
BmFormStruc one = formStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("form_type", formMapping.getForm_type()));
//目标数据
JSONObject dataJson = JSONObject.parseObject(dataString);
if (StringUtils.isNotEmpty(one.getConvert_json())){
dataJson = dataJson.getJSONObject(one.getConvert_json());
if (one==null){
throw new BadRequestException("当前表单无配置信息"+formMapping.getForm_type());
}
Map<String, JSONObject> itemMapping = formMapping.getMapping_json().stream().collect(HashMap::new, (formMap, o) -> {
List<PmFormData> result = new ArrayList<>();
JSONObject sourceData = JSONObject.parseObject(sourceString);
if (StringUtils.isNotEmpty(one.getConvert_json())){
sourceData = sourceData.getJSONObject(one.getConvert_json());
}
JSONObject target = mappingParse(formMapping.getMapping_json(), one,sourceData );
Object items = target.remove("item");
target.put("id", IdUtil.getStringId());
target.put("code", CodeUtil.getNewCode(formMapping.getForm_type()));
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", 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);
}
}
return result;
}
private JSONObject mappingParse(JSONArray mapping_json, BmFormStruc formStruc, JSONObject sourceData){
if (CollectionUtils.isEmpty(sourceData)){
throw new BadRequestException("当前业务数据为空");
}
//暂时只有两层
JSONArray mst_mapping_json = (JSONArray)mapping_json.remove(0);
Map<String, JSONObject> fieldMapping = mst_mapping_json.stream().collect(HashMap::new, (formMap, o) -> {
JSONObject item = (JSONObject) o;
formMap.put(item.getString("value"), item);
}, HashMap::putAll);
//基础字段
Set<String> fields = ListOf.ofSet(one.getBiz_code()
, one.getBiz_id()
, one.getBiz_code()
, one.getBiz_status()
, one.getMaterial_id()
, one.getPcsn()
, one.getVehicle_code()
, one.getUnit_id()
, one.getQty());
//查询目标表字段
JSONObject returnObj = new JSONObject();
//基础字段映射:如果只有一个就不迭代
Map<String, String> map = new HashMap<>();
JSONObject targetData = mappingParse(fields, itemMapping, dataJson);
//查询表单配置表获取自定义json:自定义字段参数获取
JSONObject form_param = one.getForm_param();
Set<String> fields = ListOf.ofSet(formStruc.getBiz_code(), formStruc.getBiz_id(), formStruc.getBiz_code(), formStruc.getBiz_status(), formStruc.getMaterial_id(), formStruc.getPcsn(), formStruc.getVehicle_code(), formStruc.getUnit_id(), formStruc.getQty());
JSONObject data = fieldMapping(fields, fieldMapping, sourceData);
JSONObject form_param = formStruc.getForm_param();
if (form_param!=null){
JSONObject form_data = mappingParse(form_param.keySet(), itemMapping, dataJson);
targetData.put("form_data",form_data);
JSONObject form_data = fieldMapping(form_param.keySet(), fieldMapping, sourceData);
data.put("form_data",form_data);
}
return null;
if (formStruc.getHas_child()){
BmFormStruc itemStruc = formStrucService.getOne(new QueryWrapper<BmFormStruc>().eq("parent_id", formStruc.getId()));
JSONArray sourceDtls = sourceData.getJSONArray(itemStruc.getConvert_json());
JSONArray dtls = new JSONArray();
for (int i = 0; i < sourceDtls.size(); i++) {
dtls.add(this.mappingParse(mapping_json, itemStruc, sourceDtls.getJSONObject(i)));
}
data.put("item",dtls);
}
return data;
}
private JSONObject mappingParse(Set<String> fields,Map<String, JSONObject> itemMapping,JSONObject sourceData){
private JSONObject fieldMapping(Set<String> fields, Map<String, JSONObject> fieldMapping, JSONObject sourceData){
Map<String, String> SpelMap = new HashMap<>();
JSONObject data = new JSONObject();
for (String field : fields) {
if (StringUtils.isNotEmpty(field)){
JSONObject itemMappingConfig = itemMapping.get(field);
JSONObject itemMappingConfig = fieldMapping.get(field);
if (itemMappingConfig == null){
throw new BadRequestException(String.format("当前表单没有配置字段:%s 映射", new String[]{field}));
}
@@ -126,12 +145,12 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
}else {
data.put(field,sourceData.getString(itemMappingConfig.getString("mapping_field")));
}
if (!CollectionUtils.isEmpty(SpelMap)){
Map<String, String> parse = SpelUtil.parse(sourceData, SpelMap);
data.putAll(parse);
}
}
}
if (!CollectionUtils.isEmpty(SpelMap)){
Map<String, String> parse = SpelUtil.parse(sourceData, SpelMap);
data.putAll(parse);
}
return data;
}
}

View File

@@ -5,8 +5,10 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.FileUtil;
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.sync_manage.service.field_mapping.dto.MappingQuery;
import org.nl.wms.sync_manage.service.form_mapping.ISyncFormMappingService;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
@@ -22,6 +24,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
* <p>
@@ -44,9 +47,9 @@ public class SyncFormMappingController {
@Autowired
ISyncFormMappingService iSyncFormMappingService;
private ISyncFormMappingService iSyncFormMappingService;
@Autowired
IPmFormDataService formDataService;
private IPmFormDataService formDataService;
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
@@ -81,12 +84,16 @@ public class SyncFormMappingController {
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/syncData")
public ResponseEntity<Object> syncData(@RequestBody JSONObject syncFormMapping) {
SyncFormMapping mapping = syncFormMapping.toJavaObject(SyncFormMapping.class);
String data = FileUtil.readString("/Users/mima0000/Desktop/formdata.txt", "UTF_8");
formDataService.syncFormData(mapping.getForm_type(),data);
return new ResponseEntity<>(HttpStatus.OK);
@PostMapping("/syncAnalyse")
public ResponseEntity<Object> syncAnalyse(@RequestBody JSONObject form){
//参数判读,参数解析,调用参数入库
Object analyseData = form.remove("analyseData");
if (analyseData == null){
throw new BadRequestException("解析数据不能为空");
}
List<PmFormData> pmFormDatas = formDataService.syncAnalyse(form.toJavaObject(SyncFormMapping.class), (String) analyseData);
return new ResponseEntity<>(TableDataInfo.build(pmFormDatas),HttpStatus.CREATED);
}
}

View File

@@ -61,6 +61,13 @@ export function syncData(data) {
data
})
}
export function syncAnalyse(data) {
return request({
url: 'api/syncFormMapping/syncAnalyse',
method: 'post',
data
})
}
export default {
add,
@@ -70,5 +77,6 @@ export default {
updateRows,
getAllTableName,
tableColumns,
syncData
syncData,
syncAnalyse
}

View File

@@ -133,18 +133,18 @@
title="表单同步测试"
:visible.sync=syncShow
width="600px"
@close="syncTestCannel"
@close="syncAnalyseCannel"
>
<el-form ref="form" :model="syncForm" :rules="rules" size="mini" label-width="50px">
<el-form-item label="表单:" prop="occupystruct_qty">
<el-input disabled v-model="syncForm.form_name" :precision="0" style="width: 150px;" />
</el-form-item>
<el-form-item label="测试数据" prop="testData">
<el-input type="textarea" v-model="syncForm.testData" :precision="0" style="width: 450px;" />
<el-form-item label="测试数据" prop="analyseData">
<el-input type="textarea" v-model="syncForm.analyseData" :precision="0" style="width: 450px;" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="crud.cu === 2" type="primary" @click="syncTestSubmit">同步</el-button>
<el-button :loading="crud.cu === 2" type="primary" @click="syncAnalyseSubmit">同步解析</el-button>
</div>
</el-dialog>
<!--表格渲染-->
@@ -295,10 +295,12 @@ export default {
this.syncShow = true
this.syncForm = row
},
syncTestSubmit(){
this.crud.notify('操作成功'+row.form_type, CRUD.NOTIFICATION_TYPE.SUCCESS)
syncAnalyseSubmit(){
crudFormMapping.syncAnalyse(this.syncForm).then(res => {
this.crud.notify('解析成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
})
},
syncTestCannel(){
syncAnalyseCannel(){
this.syncForm = {}
}
}