rev:修复单据更新库存变动逻辑?后续考虑库存变动统一在变动这边做现在只处理记录

This commit is contained in:
zhangzq
2024-07-09 14:52:12 +08:00
parent 7607eeb6f4
commit 40c7825a96
27 changed files with 494 additions and 57 deletions

View File

@@ -34,12 +34,13 @@ public enum StatusEnum {
IOBILL_TYPE_IN(ForkMap.of("生产入库", "10","inStorageTask", "调拨入库", "11","inStorageTask", "退货入库", "12","inStorageTask","拣选回库", "13","inStorageTask","盘点入库", "14","inStorageTask","托盘入库", "30","inStorageTask")),
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20","outStorageTask","生产出库", "21","outStorageTask", "调拨出库", "22","outStorageTask","拣选出库", "23","conveyorOutStorageTask","盘点出库", "24","outStorageTask","出库拣选", "25","toPickPlatformTask","托盘出库", "40","outStorageTask")),
IOBILL_TYPE_MOVE(ForkMap.of("移库", "50","moveStorageTask")),
EXT_TASK_TYPE(ForkMap.of("盘点", "60","moveStorageTask")),
profit_loss(ForkMap.of("盘亏", "0",null,"盘盈", "1",null,"实盘", "2",null)),
/**
* 任务类型
*/
TASK_TYPE(ForkMap.pushAll(IOBILL_TYPE_IN.code,IOBILL_TYPE_OUT.code,IOBILL_TYPE_MOVE.code)),
TASK_TYPE(ForkMap.pushAll(IOBILL_TYPE_IN.code,IOBILL_TYPE_OUT.code,IOBILL_TYPE_MOVE.code,EXT_TASK_TYPE.code)),
ACS_TYPE(ForkMap.of("立库", "10",null
,"海柔", "20",null

View File

@@ -94,6 +94,7 @@ public class StIvtBsrealstorattrController {
int = config.getInteger("z");
String sect_code = config.getString("sect_code");
String stor_code = config.getString("stor_code");
String pre = config.getString("pre");
String now = DateUtil.now();
ArrayList<StIvtStructattr> list = new ArrayList<>();
for (int x = 1; x <= ; x++) {
@@ -103,9 +104,10 @@ public class StIvtBsrealstorattrController {
attr.setId(IdUtil.getStringId());
attr.setSect_code(sect_code);
attr.setStor_code(stor_code);
String nx = (x < 10) ? "0" + x : "" + x;
String ny = (y < 10) ? "0" + y : "" + y;
String nz = (z < 10) ? "0" + z : "" + z;
attr.setStruct_code("L0"+x+"-"+ny+"-"+nz);
attr.setStruct_code(pre+nx+"-"+ny+"-"+nz);
attr.setStruct_name(x+""+y+""+z+"");
attr.setCreate_id("1");
attr.setRow_num(x);

View File

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.entity.PageQuery;
import org.nl.wms.base_manage.bsrealstorattr.service.IStIvtBsrealstorattrService;
import org.nl.wms.base_manage.sect.service.IStIvtSectattrService;
import org.nl.wms.base_manage.sect.service.dao.StIvtSectattr;
import org.nl.wms.base_manage.sect.service.dto.SectQuery;
@@ -15,6 +16,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -35,10 +37,12 @@ public class StIvtSectattrController {
*/
@Autowired
private IStIvtSectattrService iStIvtSectattrService;
@Autowired
private IStIvtBsrealstorattrService iStIvtBsrealstorattrService;
@GetMapping
public ResponseEntity<Object> query(SectQuery query, PageQuery page) {
return new ResponseEntity<>(iStIvtSectattrService.pageQuery(query, page), HttpStatus.OK);
return new ResponseEntity<>(TableDataInfo.build(iStIvtSectattrService.page(page.build(),query.build())), HttpStatus.OK);
}
@PostMapping
@@ -55,7 +59,9 @@ public class StIvtSectattrController {
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody Long[] ids) {
iStIvtSectattrService.deleteAll(ids);
if (ids.length>0){
iStIvtSectattrService.removeByIds(Arrays.asList(ids));
}
return new ResponseEntity<>(HttpStatus.OK);
}

View File

@@ -54,7 +54,7 @@ public class StIvtSectattr implements Serializable {
/**
* 仓库标识
*/
private String stor_id;
private String stor_code;
/**
* 仓库类型

View File

@@ -5,6 +5,7 @@ import org.nl.common.domain.entity.BaseQuery;
import org.nl.common.domain.entity.QParam;
import org.nl.common.enums.QueryTEnum;
import org.nl.wms.base_manage.bsrealstorattr.service.dao.StIvtBsrealstorattr;
import org.nl.wms.base_manage.sect.service.dao.StIvtSectattr;
/**
* 仓库查询条件
@@ -12,7 +13,7 @@ import org.nl.wms.base_manage.bsrealstorattr.service.dao.StIvtBsrealstorattr;
* @Date 2023/11/10 14:49
*/
@Data
public class SectQuery extends BaseQuery<StIvtBsrealstorattr> {
public class SectQuery extends BaseQuery<StIvtSectattr> {
/**
* 仓库编码

View File

@@ -59,7 +59,6 @@ public class StIvtSectattrServiceImpl extends ServiceImpl<StIvtSectattrMapper, S
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(StIvtSectattr dao) {
StIvtSectattr isDao = this.getOne(
@@ -80,7 +79,7 @@ public class StIvtSectattrServiceImpl extends ServiceImpl<StIvtSectattrMapper, S
dao.setUpdate_time(DateUtil.now());
dao.setCreate_time(DateUtil.now());
StIvtBsrealstorattr attrDao = iStIvtBsrealstorattrService.getById(dao.getStor_id());
StIvtBsrealstorattr attrDao = iStIvtBsrealstorattrService.getOne(new QueryWrapper<StIvtBsrealstorattr>().eq("stor_code",dao.getStor_code()));
dao.setStor_type(attrDao.getStor_type_scode());
this.save(dao);
@@ -89,18 +88,14 @@ public class StIvtSectattrServiceImpl extends ServiceImpl<StIvtSectattrMapper, S
@Override
@Transactional(rollbackFor = Exception.class)
public void update(StIvtSectattr dao) {
StIvtSectattr isDao = this.getById(dao.getSect_id());
if (isDao == null) {
throw new BadRequestException("被删除或无权限,操作失败!");
}
dao.setUpdate_id(SecurityUtils.getCurrentUserId());
dao.setUpdate_name(SecurityUtils.getCurrentNickName());
dao.setUpdate_time(DateUtil.now());
StIvtBsrealstorattr attrDao = iStIvtBsrealstorattrService.getById(dao.getStor_id());
StIvtBsrealstorattr attrDao = iStIvtBsrealstorattrService.getOne(new QueryWrapper<StIvtBsrealstorattr>().eq("stor_code",dao.getStor_code()));
dao.setStor_type(attrDao.getStor_type_scode());
this.updateById(dao);

View File

@@ -68,7 +68,7 @@ public class OutStorageTask extends AbstractTask {
throw new BadRequestException("创建任务失败:方法请求参数不能为空");
}
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.ne("status", StatusEnum.FORM_STATUS.code("完成")));
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
}

View File

@@ -45,24 +45,31 @@ public class ExecuteFlowActivityBehavior extends FlowNodeActivityBehavior<JSONOb
ExecuteFlow.DataSourceEnum dataSource = executeFlow.getDataSource();
switch (dataSource){
case FLOWNODE:
sourceData = one.getForm_data().getJSONObject("t");
sourceData = one.getForm_data();
break;
case DATASORUCE:
PmFormData formData = iPmFormDataService.getOne(new QueryWrapper<PmFormData>()
.eq("id", one.getForm_id()).eq("form_type", one.getForm_type()));
sourceData = (JSONObject) JSON.toJSON(formData);
JSONObject jsonObject = new JSONObject();
jsonObject.put("t", JSON.toJSON(formData));
jsonObject.put("form_type",formData.getForm_type());
jsonObject.put("form_id",formData.getId());
sourceData = jsonObject;
break;
default:
throw new IllegalStateException("Unexpected value: " + dataSource);
}
String skipExpression = executeFlow.getSkipExpression();
if (StringUtils.isNotEmpty(skipExpression)) {
Boolean parse = SpelUtil.parse(sourceData, skipExpression, Boolean.class);
Boolean parse = SpelUtil.parse(sourceData.getJSONObject("t"), skipExpression, Boolean.class);
if (!parse){
throw new BadRequestException("当前中转节点数据校验不通过"+skipExpression+",无法跳转到下个节点");
}
}
//处理流程线:将结果值封装
entity.setT(sourceData);
entity.setForm_id(one.getForm_id());
entity.setForm_type(one.getForm_type());
super.execute(entity);
}

View File

@@ -3,6 +3,7 @@ package org.nl.wms.flow_manage.flow.framework.engine.behavior.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
@@ -88,7 +89,11 @@ public class StartEventActivityBehavior extends FlowNodeActivityBehavior {
execution.setCreate_time(DateUtil.now());
execution.setStatus(StatusEnum.FLOW_STATUS.code("启动"));
iActRuExecutionService.save(execution);
if (StringUtils.isNotEmpty(entity.getParent_id())){
iActRuExecutionService.update(new UpdateWrapper<ActRuExecution>()
.set("has",true)
.eq("proc_inst_id",entity.getParent_id()));
}
entity.setProc_inst_id(execution.getProc_inst_id());
}

View File

@@ -4,8 +4,11 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.queue.CircularFifoQueue;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.nl.common.domain.exception.BadRequestException;
@@ -17,9 +20,11 @@ import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.TypeHandler;
import org.nl.wms.pm_manage.form_data.service.dto.PmFormDataDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.ConcurrentLinkedQueue;
/*
* @author ZZQ
@@ -34,7 +39,6 @@ public class MappingHandler extends TypeHandler<JSONObject, JSONObject> {
public JSONObject handler(List<String> param, JSONObject data, BmFormStruc form_struc) {
log.info("映射信息:数据:{},映射关系:{},目标表结构:{}",data.toJSONString(),param.toString(),form_struc.getForm_type()+"_"+form_struc.getForm_param().toJSONString());
JSONObject resultT = new JSONObject();
JSONObject mapping = JSONObject.parseObject(param.size()==1?param.get(0):param.remove(0));
JSONObject sourceFormData = new JSONObject(data.getJSONObject("t"));
//数据平铺

View File

@@ -66,12 +66,11 @@ public class StorageChangesProcessHandler implements ClassProcess {
//基于单据变动
Map<String, String> spelMap = new HashMap<>();
Map<String, String> valueMap = new HashMap<>();
// "start_struct_code","end_struct_code","change_qty"
for (String base_field : Base_Fields) {
String skip = param.getString("base_field");
if (skip.contains("#M")){
spelMap.put(base_field,skip);
}else {
valueMap.put(base_field,skip);
String skip = param.getString(base_field);
if (StringUtils.isNotEmpty(skip)){
(skip.contains("#M") ? spelMap : valueMap).put(base_field,skip);
}
}
if (!CollectionUtils.isEmpty(spelMap)){
@@ -80,12 +79,12 @@ public class StorageChangesProcessHandler implements ClassProcess {
}
String start_struct_code = valueMap.get("start_struct_code");
String end_struct_code = valueMap.get("end_struct_code");
String change_qty = StringUtils.isEmpty(valueMap.get("change_qty"))?null:valueMap.get("change_qty");
BigDecimal change_qty = StringUtils.isEmpty(valueMap.get("change_qty"))?null:new BigDecimal(valueMap.get("change_qty"));
if (StringUtils.isNotEmpty(start_struct_code)){
iStIvtStructattrService.changeStruct(start_struct_code,vehicle_code,param.getString("task_type"), new BigDecimal(change_qty),Boolean.FALSE);
iStIvtStructattrService.changeStruct(start_struct_code,vehicle_code,param.getString("task_type"), change_qty,Boolean.FALSE);
}
if (StringUtils.isNotEmpty(end_struct_code)){
iStIvtStructattrService.changeStruct(end_struct_code,vehicle_code,param.getString("task_type"), new BigDecimal(change_qty),Boolean.TRUE);
iStIvtStructattrService.changeStruct(end_struct_code,vehicle_code,param.getString("task_type"), change_qty,change_qty.intValue()<0?Boolean.FALSE:Boolean.TRUE);
}
}
return from;

View File

@@ -39,6 +39,10 @@ public class ActRuExecution implements Serializable {
* 父流程id
*/
private String parent_id;
/**
* 是否含有子流程
*/
private Boolean has;
/**
* 当前实例对应版本的部署id

View File

@@ -50,8 +50,8 @@ public class ActRuExecutionServiceImpl extends ServiceImpl<ActRuExecutionMapper,
QueryWrapper<ActRuExecution> build = (QueryWrapper) query.build();
build.isNull("parent_id");
Page<ActRuExecution> executionPage = this.page(page.build(), build);
List<ActRuExecution> records = executionPage.getRecords();
this.findChildren(records);
// List<ActRuExecution> records = executionPage.getRecords();
// this.findChildren(records);
return TableDataInfo.build(executionPage);
}

View File

@@ -95,16 +95,13 @@ public class CheckController {
@Log("盘点完成")
public ResponseEntity<Object> checkFinish(@RequestBody JSONObject param) {
//TODO:明细校验
PmFormData pmFormData = param.toJavaObject(PmFormData.class);
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("status", StatusEnum.FORM_STATUS.code("已分配"))
.set("form_data",param.getJSONObject("form_data").toJSONString())
.eq("id",param.getString("id")));
checkStorageService.checkFinish(param);
return new ResponseEntity<>(HttpStatus.OK);
}
@DeleteMapping()
@Log("删除盘点单")
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
checkStorageService.delete(ids);
return new ResponseEntity<>(HttpStatus.OK);

View File

@@ -3,15 +3,18 @@ package org.nl.wms.stor_manage.checkStorage.service;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.function.PermeateFunction;
import org.nl.common.publish.BussEventMulticaster;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.flow_manage.flow.framework.entity.ExecutionDto;
import org.nl.wms.flow_manage.monitor.event.FlowContinueEvent;
import org.nl.wms.flow_manage.monitor.event.FlowStartEvent;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
@@ -24,6 +27,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -124,7 +128,6 @@ public class CheckStorageService {
.eq("id",mst.getId()));
});
BussEventMulticaster.Publish(startEvent);
}
private List<ExecutionDto> packageT(JSONObject current,String itemField){
String id = current.getString(itemField);
@@ -146,4 +149,31 @@ public class CheckStorageService {
}
return null;
}
public void checkFinish(JSONObject form){
List<PmFormData> dtls = iFormDataService.getByParentId(form.getString("id"));
List<String> tmpCollect = dtls.stream().map(PmFormData::getVehicle_code).collect(Collectors.toList());
Map<String, String> vehicleMap = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
.select("vehicle_code", "proc_inst_id")
.in("vehicle_code", tmpCollect)
.last("group by vehicle_code")).stream().collect(HashMap::new, (formMap, o) -> {
formMap.put(o.getVehicle_code(), o.getProc_inst_id());
}, HashMap::putAll);
//更新载具物料关系
for (PmFormData dtl : dtls) {
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("qty",dtl.getForm_data().getBigDecimal("change_qty"))
.eq("vehicle_code",dtl.getVehicle_code()));
}
for (PmFormData dtl : dtls) {
FlowContinueEvent continueEvent = new FlowContinueEvent(vehicleMap.get(dtl.getVehicle_code()), null, null);
continueEvent.setCallback(emp->{
iFormDataService.update(new UpdateWrapper<PmFormData>()
.set("status",StatusEnum.FORM_STATUS.code("执行中"))
.eq("id",dtl.getId()));
});
BussEventMulticaster.Publish(continueEvent);
}
}
}

View File

@@ -86,7 +86,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
record.setMaterial_id(vehicleMater.getMaterial_id());
record.setPcsn(vehicleMater.getPcsn());
record.setQty(vehicleMater.getQty());
record.setChange_qty(change_qty==null?vehicleMater.getQty():change_qty);
record.setChange_qty(change_qty==null?vehicleMater.getQty():change_qty.abs());
record.setTask_type(task_type);
record.setFrozen_qty(vehicleMater.getFrozen_qty());
record.setSource_form_type(vehicleMater.getSource_form_type());