opt:1.优化单据回传查询;2.优化用料单实时查询,实时更新;

3.优化失败单据回传字段序列化顺序混乱;
4.手动同步数量限制,模糊搜索;
This commit is contained in:
2025-03-06 20:03:21 +08:00
parent d633021734
commit 70bb1aae8f
9 changed files with 176 additions and 71 deletions

View File

@@ -70,6 +70,10 @@ public class SyncReceiptProcessHandler implements ClassProcess {
}
handleBillEntity(pmFormData.getForm_type(), formData);
String json = formData.toJSONString();
LambdaUpdateWrapper<PmFormData> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PmFormData::getId, pmFormData.getId());
updateWrapper.set(PmFormData::getUpdate_time, DateUtil.now());
updateWrapper.set(PmFormData::getErp_data, json);
try {
IdentifyInfo identifyInfo = new IdentifyInfo();
BeanUtils.copyProperties(erpSec, identifyInfo);
@@ -90,21 +94,15 @@ public class SyncReceiptProcessHandler implements ClassProcess {
.map(error -> ((JSONObject) error).getString("Message"))
.collect(Collectors.joining("; "));
}
LambdaUpdateWrapper<PmFormData> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PmFormData::getId, pmFormData.getId());
updateWrapper.set(PmFormData::getUpdate_time, DateUtil.now());
if (isSuccess) {
updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成"));
updateWrapper.set(PmFormData::getRemark, "回执单创建成功,回传Erp数据为:" + responseStatus.getJSONArray("SuccessEntitys").toJSONString());
Log.error("回传Erp数据为:" + json + ",传输数据为:");
} else {
updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("暂停"));
updateWrapper.set(PmFormData::getRemark, "回执单创建失败,原因为:" + errorMessages + ",回传Erp数据为:" + json);
Log.error("回传Erp数据为:" + json + ",传输数据为:");
}
iPmFormDataService.update(updateWrapper);
} catch (Exception ex) {
LambdaUpdateWrapper<PmFormData> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PmFormData::getId, pmFormData.getId());
updateWrapper.set(PmFormData::getRemark, "回执单创建失败,原因为:" + ex.getMessage() + ",回传Erp数据为:" + json);
iPmFormDataService.update(updateWrapper);

View File

@@ -3,15 +3,18 @@ package org.nl.wms.pm_manage.form_data.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.commons.lang3.ObjectUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.SecurityUtils;
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.dto.FormDataQuery;
@@ -22,6 +25,8 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
/**
* <p>
@@ -69,10 +74,30 @@ public class PmFormDataController {
}
@GetMapping("/getSonFormData/{id}")
public ResponseEntity<Object> getSonDtlFormData(@PathVariable String id){
public ResponseEntity<Object> getSonDtlFormData(@PathVariable String id) {
//参数判读,参数解析,调用参数入库
//Page<BmFormStruc> page = iBmFormStrucService.page(pageQuery.build(), query.build());
return new ResponseEntity<>(iPmFormDataService.getSonDtlFormData(id),HttpStatus.OK);
return new ResponseEntity<>(iPmFormDataService.getSonDtlFormData(id), HttpStatus.OK);
}
@PostMapping("/confirmStatus")
@SaIgnore
@Log("单据完成")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity<Object> confirmStatus(@RequestBody JSONObject form) {
JSONArray data = form.getJSONArray("data");
if (!ObjectUtils.isEmpty(data)) {
Set<String> ids = data.stream()
.map(item -> (String) item)
.collect(Collectors.toSet());
iPmFormDataService.update(
new LambdaUpdateWrapper<PmFormData>()
.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成"))
.in(PmFormData::getId, ids)
);
}
return new ResponseEntity<>(HttpStatus.OK);
}

View File

@@ -3,9 +3,9 @@ package org.nl.wms.pm_manage.form_data.service.dao;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import org.nl.common.domain.mybatis.handler.FastjsonSortTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nl.common.domain.mybatis.handler.FastjsonSortTypeHandler;
import org.nl.common.enums.StatusEnum;
import java.io.Serializable;
@@ -351,4 +351,11 @@ public class PmFormData implements Serializable {
private String taxPrice;
/**
* 自定义表单字段
*/
@TableField(typeHandler = FastjsonSortTypeHandler.class)
private JSONObject erp_data = new JSONObject();
}

View File

@@ -112,16 +112,19 @@
md_me_materialbase.single_weight
FROM
pm_form_data
left join md_me_materialbase on pm_form_data.material_id = md_me_materialbase.material_id
left join md_me_materialbase on pm_form_data.material_id = md_me_materialbase.material_id
<where>
<if test="query.search != null and query.search != ''">
and form_data LIKE '%${query.search}%'
and form_data LIKE '%${query.search}%'
</if>
<if test="query.form_type != null and query.form_type != ''">
and form_type = #{query.form_type}
</if>
<if test="query.pcsn != null and query.pcsn != ''">
and pcsn = #{query.pcsn}
</if>
<if test="query.code != null and query.code != ''">
and code = #{query.code}
and code LIKE '%${query.code}'
</if>
<if test="query.mater != null and query.mater != ''">
and md_me_materialbase.material_code like '%${query.mater}%'
@@ -142,7 +145,7 @@
and parent_id = #{query.parent_id}
</if>
<if test="query.form_query != null and query.form_query.size() > 0">
<foreach collection="query.form_query" item="value" index="key" >
<foreach collection="query.form_query" item="value" index="key">
<if test="value != null and value != ''">
and JSON_CONTAINS(form_data, '{"${key}":"${value}"}')
</if>

View File

@@ -19,6 +19,7 @@ public class FormDataQuery extends BaseQuery<PmFormData> {
private String bill_code;
private String site_code;
private String search;
private String pcsn;
private String parent_id;
private String mater;
private String[] status;

View File

@@ -113,13 +113,15 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
* 手动推送回执单据
*/
@Override
public String syncFeedBack(JSONObject jsonData) {
public String syncFeedBack(JSONObject form) {
//执行回传单
PmFormData pmFormData = jsonData.toJavaObject(PmFormData.class);
JSONArray jsonData = form.getJSONArray("data");
PmFormData pmFormData = jsonData.getObject(0, PmFormData.class);
if (Integer.parseInt(pmFormData.getStatus()) > 30) {
throw new BadRequestException("该单据状态为已完成,无需再次回传!");
}
JSONObject formData = pmFormData.getForm_data();
PmFormData data = iPmFormDataService.getById(pmFormData.getId());
JSONObject formData = data.getErp_data();
//要回传的json数据
String formid = formData.getString("formid");
if (StringUtils.isEmpty(formid)) {
@@ -275,7 +277,9 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
List<SyncFormMapping> list = iSyncFormMappingService.list(new LambdaQueryWrapper<SyncFormMapping>().eq(SyncFormMapping::getForm_type, query.getForm_type()));
JSONArray mappingJson = list.get(0).getMapping_json();
String mappingString = JSON.toJSONString(mappingJson);
syncErpBillsScheduleService.syncData(mappingString, list.get(0).getForm_type(), list.get(0).getDtl_split(), query.getCode());
syncErpBillsScheduleService.syncData(mappingString, list.get(0).getForm_type(), list.get(0).getDtl_split(), query.getCode(),true);
//一张单据会多次更新或新增明细,明细物料出库一次不能直接标记为完成,取消完成状态筛选
query.setStatus(null);
List<PmFormDataDto> pmFormData = this.baseMapper.queryTree2(query);
if (ObjectUtil.isNotEmpty(pmFormData)) {
handleFormDatas(pmFormData);
@@ -321,23 +325,25 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
private void handleFormDatas(List<PmFormDataDto> pmFormDataDtos) {
List<String> parents = pmFormDataDtos.stream().map(PmFormDataDto::getId).collect(Collectors.toList());
List<PmFormDataDto> childs = this.baseMapper.selectChilds(parents);
//过滤非料箱与托盘库
String stockId = "";
if (pmFormDataDtos.get(0).getCode().contains("PPBOM")) {
stockId = "stock_Id";
} else if (pmFormDataDtos.get(0).getCode().contains("JDSCLLSQ")) {
stockId = "stockId";
} else if (pmFormDataDtos.get(0).getCode().contains("ZJDB")) {
stockId = "SrcStockId_Id";
}
if (StringUtils.isNotBlank(stockId)) {
String finalStockId = stockId;
childs.removeIf(r ->
!new HashSet<>(Arrays.asList("1233925", "1233926"))
.contains(r.getForm_data().getString(finalStockId))
);
}
if (!CollectionUtils.isEmpty(childs)) {
if (StringUtils.isNotBlank(pmFormDataDtos.get(0).getCode())) {
//过滤非料箱与托盘库
String stockId = "";
if (pmFormDataDtos.get(0).getCode().contains("PPBOM")) {
stockId = "stock_Id";
} else if (pmFormDataDtos.get(0).getCode().contains("JDSCLLSQ")) {
stockId = "stockId";
} else if (pmFormDataDtos.get(0).getCode().contains("ZJDB")) {
stockId = "SrcStockId_Id";
}
if (StringUtils.isNotBlank(stockId)) {
String finalStockId = stockId;
childs.removeIf(r ->
!new HashSet<>(Arrays.asList("1233925", "1233926"))
.contains(r.getForm_data().getString(finalStockId))
);
}
}
Map<String, List<PmFormDataDto>> childMap = childs.stream().collect(Collectors.groupingBy(PmFormDataDto::getParent_id));
for (PmFormDataDto dataDto : pmFormDataDtos) {
String productArea = dataDto.getForm_data().getString("product_area");
@@ -358,7 +364,7 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
public PmFormDataDto queryErpCode(String code, String stor_code) {
FormDataQuery query = new FormDataQuery();
query.setCode(code);
query.setStatus(new String[]{StatusEnum.FORM_STATUS.code("生成"), StatusEnum.FORM_STATUS.code("执行中")});
// query.setStatus(new String[]{StatusEnum.FORM_STATUS.code("生成"), StatusEnum.FORM_STATUS.code("执行中")});
List<PmFormDataDto> pmFormDataDtos = this.baseMapper.queryTree2(query);
if (CollectionUtils.isEmpty(pmFormDataDtos)) {
throw new BadRequestException(code + "单据编码不存在或已经完成入库");

View File

@@ -112,17 +112,15 @@ public class SyncErpBillsScheduleService {
for (SyncFormMapping m : list) {
JSONArray mappingJson = m.getMapping_json();
String mappingString = JSON.toJSONString(mappingJson);
syncData(mappingString, m.getForm_type(), m.getDtl_split(), "");
syncData(mappingString, m.getForm_type(), m.getDtl_split(), "", false);
}
} finally {
LuceneAppender.traceIdTL.remove();
}
}
/**
* 自动同步
*/
public void syncData(String mappingJson, String formType, Boolean dtlSplit, String billCode) {
public void syncData(String mappingJson, String formType, Boolean dtlSplit, String billCode, Boolean isManual) {
boolean islock = lock.tryLock();
try {
if (islock) {
@@ -136,18 +134,22 @@ public class SyncErpBillsScheduleService {
String sevenDaysAgo = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
String filterString;
if (StringUtils.isNotBlank(billCode)) {
filterString = "FBillNo = '" + billCode + "'";
filterString = "FBillNo like '%" + billCode + "'";
} else {
filterString = getFilterString(formType, "", sevenDaysAgo, today);
}
query.setFilterString(filterString);
query.setFormId(formType);
query.setFieldKeys("FID");
query.setLimit(0);
if (isManual) {
query.setLimit(1);
} else {
query.setLimit(0);
}
result = erpServiceUtils.queryBills(query);
if (ObjectUtils.isNotEmpty(result)) {
K3CloudApi k3CloudApi = erpServiceUtils.getCloudApi();
handleBills(mappingJson, formType, dtlSplit, errorMsg, result, k3CloudApi);
handleBills(mappingJson, formType, dtlSplit, errorMsg, result, k3CloudApi, isManual);
}
}
} catch (Exception ex) {
@@ -198,11 +200,11 @@ public class SyncErpBillsScheduleService {
query.setFilterString(filterString);
query.setFormId(formType);
query.setFieldKeys("FID");
query.setLimit(0);
query.setLimit(10);
result = erpServiceUtils.queryBills(query);
if (ObjectUtils.isNotEmpty(result)) {
K3CloudApi k3CloudApi = erpServiceUtils.getCloudApi();
handleBills(mappingJson, formType, dtlSplit, errorMsg, result, k3CloudApi);
handleBills(mappingJson, formType, dtlSplit, errorMsg, result, k3CloudApi, true);
}
if (!CollectionUtils.isEmpty(errorMsg)) {
throw new BadRequestException("同步成功" + (result.size() - errorMsg.size()) + "条,失败信息:" + errorMsg.toString());
@@ -224,7 +226,7 @@ public class SyncErpBillsScheduleService {
private static String getFilterString(String formType, String code, String timeStart, String timeEnd) {
String filterString;
if (StringUtils.isNotBlank(code)) {
filterString = "FBillNo = '" + code + "'";
filterString = "FBillNo like '%" + code + "'";
} else {
filterString = BILL_ORG_MAPPING.get(formType) + " = '750572' ";
if ("ka7c19edf9d4b4b39b8cc4a06802163b0".equals(formType)) {
@@ -241,7 +243,7 @@ public class SyncErpBillsScheduleService {
return filterString;
}
private void handleBills(String mappingJson, String formType, Boolean dtlSplit, Map errorMsg, JSONArray result, K3CloudApi cloudApi) {
private void handleBills(String mappingJson, String formType, Boolean dtlSplit, Map errorMsg, JSONArray result, K3CloudApi cloudApi, Boolean isManual) {
//物料同步
SyncFormMapping syncFormMapping = syncFormMappingServiceImpl.getOne(new LambdaQueryWrapper<SyncFormMapping>().in(SyncFormMapping::getForm_type, "BD_MATERIAL"));
String materialMappingString = JSON.toJSONString(syncFormMapping.getMapping_json());
@@ -296,11 +298,11 @@ public class SyncErpBillsScheduleService {
for (PmFormData f : mainBill) {
//存在ID主单据不新增不修改修改未出库单据的明细
String id = f.getId() + "$" + f.getForm_type();
if (exitFormDataList.contains(id)) {
//实时扫描则同步修改未出库的用料清单单据
if (exitFormDataList.contains(id) && isManual) {
//单据明细
if (StringUtils.isBlank(f.getCode())) {
PmFormData existDtlData = formDataService.getOne(new QueryWrapper<PmFormData>().eq("id", id).select("qty"));
//同步修改未出库单据
//existDtlData.getQty().compareTo(BigDecimal.ZERO) > 0||f.getPlan_qty().compareTo(f.getAssign_qty()) > 0
if (existDtlData.getQty() != null) {
if (existDtlData.getQty().compareTo(BigDecimal.ZERO) > 0) {

View File

@@ -60,4 +60,12 @@ export function getSonFormData(id) {
})
}
export default { add, edit, del, getFormType, getParentFormTypes, getParentFormTypesByDesc, getSonFormData, syncFeedBack }
export function confirm(data) {
return request({
url: '/api/pmFormData/confirmStatus',
method: 'post',
data
})
}
export default { add, edit, del, getFormType, getParentFormTypes, getParentFormTypesByDesc, getSonFormData, syncFeedBack, confirm }

View File

@@ -56,6 +56,16 @@
class="filter-item"
/>
</el-form-item>
<el-form-item label="批次">
<el-input
v-model="query.pcsn"
clearable
size="mini"
placeholder="请输入批次"
prefix-icon="el-icon-search"
class="filter-item"
/>
</el-form-item>
<el-form-item label="单据日期" prop="analyseData">
<el-date-picker
v-model="query.datepick"
@@ -88,6 +98,17 @@
>
手动回传
</el-button>
<el-button
slot="right"
class="filter-item"
type="warning"
icon="el-icon-check"
size="mini"
:disabled="!currentRow"
@click="confirm"
>
处理完成
</el-button>
</crudOperation>
<el-dialog
@@ -124,7 +145,7 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="" prop="pcsn">
<el-form-item label="" prop="pcsn">
<el-input v-model="form.pcsn" style="width: 150px;" />
</el-form-item>
</el-col>
@@ -154,7 +175,12 @@
@selection-change="handleDtlCurrentChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="code" label="单据编码" show-overflow-tooltip width="120">
<el-table-column
prop="code"
label="单据编码"
show-overflow-tooltip
:min-width="flexWidth('code',crud.data,'单据编码')"
>
<template slot-scope="scope">
<el-link v-if="scope.row.hasChildren" type="warning" @click="toView(scope.row)">{{
scope.row.code
@@ -171,21 +197,31 @@
</template>
</template>
</el-table-column>
<el-table-column prop="vehicle_code" label="载具编号" show-overflow-tooltip width="120" />
<!-- <el-table-column prop="vehicle_code" label="载具编号" show-overflow-tooltip width="120" />-->
<el-table-column prop="qty" label="物料数量" show-overflow-tooltip />
<el-table-column prop="material_code" label="物料编码" show-overflow-tooltip width="120" />
<el-table-column prop="material_name" label="物料名称" show-overflow-tooltip width="120" />
<el-table-column prop="material_spec" label="物料规格" show-overflow-tooltip width="120" />
<el-table-column prop="pcsn" label="批次" show-overflow-tooltip width="120" />
<el-table-column prop="unit_id" label="单位" show-overflow-tooltip width="120" />
<el-table-column prop="source_form_id" label="源单编码" show-overflow-tooltip width="120" />
<el-table-column prop="source_form_type" label="源单类型" show-overflow-tooltip width="130" />
<el-table-column prop="parent_id" label="父单据数据id" show-overflow-tooltip width="120" />
<el-table-column
prop="material_code"
label="物料编码"
show-overflow-tooltip
:min-width="flexWidth('material_code',crud.data,'物料编码')"
/>
<el-table-column
prop="material_name"
label="物料名称"
:min-width="flexWidth('material_name',crud.data,'物料名称')"
/>
<!-- <el-table-column prop="material_spec" label="物料规格" show-overflow-tooltip width="120" />-->
<el-table-column prop="pcsn" label="批次" show-overflow-tooltip :min-width="flexWidth('pcsn',crud.data,'批次')" />
<!-- <el-table-column prop="unit_id" label="单位" show-overflow-tooltip width="120" />-->
<!-- <el-table-column prop="parent_id" label="父单据数据id" show-overflow-tooltip width="120" />-->
<el-table-column prop="create_time" label="创建时间" width="140" />
<el-table-column prop="remark" label="备注" show-overflow-tooltip width="210" />
<el-table-column label="ERP回传数据" show-overflow-tooltip width="210">
<template slot-scope="scope">{{ scope.row.form_data }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" show-overflow-tooltip width="210" />
<el-table-column prop="create_time" label="创建时间" />
<el-table-column prop="source_form_type" label="源单类型" show-overflow-tooltip width="130" />
<el-table-column prop="source_form_id" label="源单编码" show-overflow-tooltip width="120" />
<el-table-column prop="proc_inst_id" label="对应流程实例id" show-overflow-tooltip width="120" />
<el-table-column
v-permission="['admin','Classstandard:edit','Classstandard:del']"
@@ -223,6 +259,7 @@ import pagination from '@crud/Pagination'
import formstruc from '@/views/wms/config_manage/formStruc/formstruc'
import ViewDialog from './ViewDialog'
import crudClassstandard from '@/views/wms/base_manage/class_standard/classstandard'
import crudbucketrecord from '@/views/wms/md_manage/group_dick/groupdick'
// import UploadDialog from './UploadDialog'
const defaultForm = {
@@ -362,10 +399,19 @@ export default {
this.$refs.viewDialog.setForm(row)
}
},
syncFeedBack(row) {
crudFormData.syncFeedBack(JSON.stringify(this.currentRow))
syncFeedBack() {
if (this.currentRow.length === 0) {
this.crud.notify('请选择一行单据', CRUD.NOTIFICATION_TYPE.INFO)
return
}
if (this.currentRow.length > 1) {
this.crud.notify('请确认只选择一行单据', CRUD.NOTIFICATION_TYPE.INFO)
return
}
const param = {}
param.data = this.currentRow
crudFormData.syncFeedBack(param)
.then(res => {
debugger
this.crud.notify(res) // 使用后端返回的消息
})
.catch(error => {
@@ -373,12 +419,21 @@ export default {
})
},
handleDtlCurrentChange(val) {
console.log(val)
if (val.length == 1) {
this.currentRow = val[0]
} else {
this.currentRow = null
this.currentRow = val
}, confirm() {
if (this.currentRow.length === 0) {
this.crud.notify('请选择一行单据', CRUD.NOTIFICATION_TYPE.INFO)
return
}
const ids = this.currentRow.map(row => row.id)
// 构造参数
const param = {
data: ids // 将提取的 id 数组赋值给 param.data
}
crudFormData.confirm(param).then(res => {
this.crud.notify('单据处理成功!', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.crud.toQuery()
})
}
}
}