feat: bug-996 齐套管理主物料新增一个【状态】属性字段

This commit is contained in:
曹鹏飞 2025-12-04 16:29:36 +08:00
parent 78f5224f67
commit bddbaaeb5e
20 changed files with 180 additions and 89 deletions

View File

@ -1,11 +1,13 @@
package com.nflg.wms.admin.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.nflg.wms.admin.service.BomControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.qo.BomSearchQO;
import com.nflg.wms.common.pojo.qo.BomUpdateQO;
import com.nflg.wms.common.pojo.qo.ScanTypeUpdateQO;
import com.nflg.wms.common.pojo.vo.BomMaterialVO;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
@ -32,7 +34,7 @@ public class BomController extends BaseController {
* 新增
*/
@PostMapping("add")
public ApiResult<Void> add(@Valid @RequestBody BomMaterialDTO request){
public ApiResult<Void> add(@Valid @RequestBody BomMaterialDTO request) {
bomControllerService.add(request);
return ApiResult.success();
}
@ -41,18 +43,38 @@ public class BomController extends BaseController {
* 更新
*/
@PostMapping("update")
public ApiResult<Void> update(@Valid @RequestBody BomUpdateQO request){
public ApiResult<Void> update(@Valid @RequestBody BomUpdateQO request) {
bomControllerService.update(request);
return ApiResult.success();
}
/**
* 更新出入库扫子码类型
*/
@PostMapping("updateScanType")
public ApiResult<Void> updateScanType(@Valid @RequestBody ScanTypeUpdateQO request) {
bomControllerService.updateScanType(request);
return ApiResult.success();
}
/**
* 搜索
* @param request 搜索参数
*/
@PostMapping("search")
public ApiResult<PageData<BomMaterialVO>> search(@Valid @RequestBody BomSearchQO request){
return ApiResult.success(bomControllerService.search(request));
public ApiResult<PageData<BomMaterialVO>> search(@Valid @RequestBody BomSearchQO request) {
PageData<BomMaterialVO> pageData = bomControllerService.search(request);
int index1 = 0;
for (BomMaterialVO it : pageData.getItems()) {
it.setIndex(++index1);
if (CollectionUtil.isNotEmpty(it.getChildren())) {
int index2 = 0;
for (BomMaterialVO child : it.getChildren()) {
child.setIndex(++index2);
}
}
}
return ApiResult.success(pageData);
}
/**
@ -62,7 +84,7 @@ public class BomController extends BaseController {
@Transactional
@PostMapping("import")
public ApiResult importFromExcel(HttpServletResponse response, @RequestParam(value = "file") MultipartFile file) throws IOException {
return bomControllerService.importFromExcel(response,file);
return bomControllerService.importFromExcel(response, file);
}
/**
@ -70,8 +92,8 @@ public class BomController extends BaseController {
* @param ids 选中的id集合
*/
@PostMapping("export")
public void exportSelect(HttpServletResponse response,@RequestBody(required = false) List<Long> ids) throws Exception {
bomControllerService.exportSelect(response,ids);
public void exportSelect(HttpServletResponse response, @RequestBody(required = false) List<Long> ids) throws Exception {
bomControllerService.exportSelect(response, ids);
}
/**
@ -79,8 +101,8 @@ public class BomController extends BaseController {
* @param request 搜索参数
*/
@PostMapping("exportSearch")
public void exportSearch(HttpServletResponse response,@Valid @RequestBody BomSearchQO request) throws Exception {
bomControllerService.exportSearch(response,request);
public void exportSearch(HttpServletResponse response, @Valid @RequestBody BomSearchQO request) throws Exception {
bomControllerService.exportSearch(response, request);
}
}

View File

@ -20,7 +20,6 @@ import com.nflg.wms.common.util.PageUtil;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsComponentPacking;
import com.nflg.wms.repository.entity.WmsComponentPackingItem;
import com.nflg.wms.repository.service.IParamConfigService;
import com.nflg.wms.repository.service.IWmsBomService;
import com.nflg.wms.repository.service.IWmsComponentPackingItemService;
import com.nflg.wms.repository.service.IWmsComponentPackingService;
@ -51,9 +50,6 @@ public class ComponentPackingController {
@Autowired
private SapService sapService;
@Resource
private IParamConfigService paramConfigService;
@Resource
private IWmsBomService bomService;
@ -200,13 +196,13 @@ public class ComponentPackingController {
if (CollectionUtil.isEmpty(tasks)) {
return ApiResult.success(Collections.emptyList());
}
boolean enableOutScanChild = paramConfigService.getEnableOutScanChild();
Integer type = bomService.getScanType(packing.getMatnr());
// 转换为 VO 对象
List<ComponentPackingItemPdaVO> daVos = tasks.stream()
.map(item1 -> {
ComponentPackingItemPdaVO vo = Convert.convert(ComponentPackingItemPdaVO.class, item1);
vo.setQiTao(bomService.isParent(vo.getIdnrk()));
if (vo.isQiTao() && enableOutScanChild) {
if (vo.isQiTao() && Objects.equals(type, 1)) {
vo.setChildren(bomService.getChildrenVO(vo.getIdnrk()));
}
return vo;

View File

@ -297,22 +297,27 @@ public class InProduceOrderController extends BaseController {
.throwMessage("该订单非待收货状态");
List<InProduceOrderItemVO> list = produceOrderItemService.getVOByOrderId(order.getId());
if (order.getList()) {
list = list.stream()
.filter(it -> !Objects.equals(it.getParentId(), 0L))
.collect(Collectors.groupingBy(InProduceOrderItemVO::getMaterialNo))
.values()
.stream().map(it -> {
InProduceOrderItemVO vo = it.get(0);
vo.setNum(it.stream().map(InProduceOrderItemVO::getNum).reduce(BigDecimal.ZERO, BigDecimal::add));
vo.setBinNos(binService.getBinNos(vo.getMaterialNo(), vo.getFactoryNo(), vo.getWarehouseNo()));
return vo;
}).toList();
List<InProduceOrderItemVO> datas = new ArrayList<>();
list.stream().filter(it -> Objects.equals(it.getParentId(), 0L)).forEach(it -> {
List<InProduceOrderItemVO> children = list.stream()
.filter(child -> Objects.equals(child.getParentId(), it.getId()))
.toList();
Integer type = bomService.getScanType(it.getMaterialNo());
children.forEach(child -> {
if (Objects.equals(type, 0)) {
child.setMustScan(false);
}
child.setBinNos(binService.getBinNos(child.getMaterialNo(), child.getFactoryNo(), child.getWarehouseNo()));
});
datas.addAll(children);
});
return ApiResult.success(datas);
} else {
list.forEach(it -> {
it.setBinNos(binService.getBinNos(it.getMaterialNo(), it.getFactoryNo(), it.getWarehouseNo()));
});
return ApiResult.success(list);
}
return ApiResult.success(list);
}
/**
@ -329,53 +334,64 @@ public class InProduceOrderController extends BaseController {
List<InProduceOrderItemVO> list = produceOrderItemService.getVOByOrderId(order.getId());
List<InProduceOrderItemVO> datas;
if (order.getList()) {
datas = list.stream()
.filter(it -> !Objects.equals(it.getParentId(), 0L))
.collect(Collectors.groupingBy(InProduceOrderItemVO::getMaterialNo))
.values()
.stream().map(it -> {
InProduceOrderItemVO vo = it.get(0);
vo.setNum(it.stream().map(InProduceOrderItemVO::getNum).reduce(BigDecimal.ZERO, BigDecimal::add));
vo.setBinNos(binService.getBinNos(vo.getMaterialNo(), vo.getFactoryNo(), vo.getWarehouseNo()));
return vo;
}).toList();
datas = new ArrayList<>();
list.stream().filter(it -> Objects.equals(it.getParentId(), 0L)).forEach(it -> {
List<InProduceOrderItemVO> children = list.stream()
.filter(child -> Objects.equals(child.getParentId(), it.getId()))
.toList();
Integer type = bomService.getScanType(it.getMaterialNo());
children.forEach(child -> {
if (Objects.equals(type, 0)) {
child.setMustScan(false);
}
});
datas.addAll(children);
});
} else {
datas = list;
}
List<String> materialNos = new ArrayList<>();
List<InMaterialScanRecord> records = new ArrayList<>();
datas.forEach(it -> {
BigDecimal num = BigDecimal.ZERO;
InProduceOrderReceiveMaterialQO materialQO = request.getItems().stream().filter(q -> StrUtil.equals(q.getMaterialNo(), it.getMaterialNo())).findFirst().orElse(null);
InProduceOrderReceiveMaterialQO materialQO = request.getItems()
.stream()
.filter(q -> Objects.equals(q.getId(), it.getId()))
.findFirst()
.orElse(null);
if (Objects.isNull(materialQO)) {
materialNos.add(it.getMaterialNo());
} else {
for (String qrCode : materialQO.getQrCodes()) {
MaterialQRCodeContentDTO content = NoUtil.getMaterialQRCodeContent(qrCode);
if (Objects.nonNull(content.getNum())) {
num = num.add(content.getNum());
VUtil.trueThrowBusinessError(it.isMustScan() && CollectionUtil.isEmpty(materialQO.getQrCodes()))
.throwMessage(materialQO.getMaterialNo() + "需要提供扫码信息");
if (it.isMustScan()) {
BigDecimal num = BigDecimal.ZERO;
for (String qrCode : materialQO.getQrCodes()) {
MaterialQRCodeContentDTO content = NoUtil.getMaterialQRCodeContent(qrCode);
if (Objects.nonNull(content.getNum())) {
num = num.add(content.getNum());
}
records.add(new InMaterialScanRecord()
.setSource(4)
.setSourceId(order.getId())
.setSourceItemId(it.getId())
.setTicketItemId(it.getId())
.setMaterialNo(it.getMaterialNo())
.setContent(qrCode)
.setBatchNo(content.getBatchNo())
.setSerialNo(content.getSerialNo())
.setUniqNo(content.getUniqNo())
.setFactoryNo(it.getFactoryNo())
.setWarehouseNo(it.getWarehouseNo())
.setBinNos(StrUtil.split(materialQO.getBinNos(), "/"))
.setNum(content.getNum())
.setUnit(it.getUnit())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now())
);
}
if (num.compareTo(it.getNum()) != 0) {
materialNos.add(it.getMaterialNo());
}
records.add(new InMaterialScanRecord()
.setSource(4)
.setSourceId(order.getId())
.setSourceItemId(it.getId())
.setTicketItemId(it.getId())
.setMaterialNo(it.getMaterialNo())
.setContent(qrCode)
.setBatchNo(content.getBatchNo())
.setSerialNo(content.getSerialNo())
.setUniqNo(content.getUniqNo())
.setFactoryNo(it.getFactoryNo())
.setWarehouseNo(it.getWarehouseNo())
.setBinNos(StrUtil.split(materialQO.getBinNos(), "/"))
.setNum(content.getNum())
.setUnit(it.getUnit())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now())
);
}
if (num.compareTo(it.getNum()) != 0) {
materialNos.add(it.getMaterialNo());
}
if (!order.getList()) {
//是否更改了储位

View File

@ -169,7 +169,6 @@ public class OutAssistanceController extends BaseController {
WmsOutAssistance order = outAssistanceService.lambdaQuery().eq(WmsOutAssistance::getNo, no).one();
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
List<WmsOutAssistanceItem> datas = outAssistanceItemService.getList(order.getId());
boolean enableOutScanChild = paramConfigService.getEnableOutScanChild();
return ApiResult.success(new OutProduce1VO()
.setId(order.getId())
.setAufnr(order.getEbeln())
@ -179,6 +178,7 @@ public class OutAssistanceController extends BaseController {
.setItems(datas.stream()
.filter(item -> item.getLeft().compareTo(BigDecimal.ZERO) > 0)
.map(item -> {
Integer type = bomService.getScanType(item.getMatnr1());
OutProduceItemVO vo = new OutProduceItemVO()
.setId(item.getId())
.setLgort2(order.getLgort1())
@ -188,7 +188,7 @@ public class OutAssistanceController extends BaseController {
.setMeins(item.getMeins())
.setNum(item.getLeft());
vo.setQiTao(bomService.isParent(item.getMatnr1()));
if (vo.isQiTao() && enableOutScanChild) {
if (vo.isQiTao() && Objects.equals(type, 1)) {
vo.setChildren(bomService.getChildrenVO(item.getMatnr1()));
}
return vo;

View File

@ -166,7 +166,6 @@ public class OutCostCenterController extends BaseController {
WmsOutCostcenter order = outCostcenterService.lambdaQuery().eq(WmsOutCostcenter::getNo, no).one();
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
List<WmsOutCostcenterItem> datas = outCostcenterItemService.getList(order.getId());
boolean enableOutScanChild = paramConfigService.getEnableOutScanChild();
return ApiResult.success(new OutProduce1VO()
.setId(order.getId())
.setAufnr(order.getAufnr())
@ -175,6 +174,7 @@ public class OutCostCenterController extends BaseController {
.setItems(datas.stream()
.filter(item -> item.getLeft().compareTo(BigDecimal.ZERO) > 0)
.map(item -> {
Integer type = bomService.getScanType(item.getMatnr());
OutProduceItemVO vo = new OutProduceItemVO()
.setId(item.getId())
.setLgort2(item.getLgort())
@ -184,7 +184,7 @@ public class OutCostCenterController extends BaseController {
.setNum(item.getLeft())
.setMeins(item.getMeins());
vo.setQiTao(bomService.isParent(item.getMatnr()));
if (vo.isQiTao() && enableOutScanChild) {
if (vo.isQiTao() && Objects.equals(type, 1)) {
vo.setChildren(bomService.getChildrenVO(item.getMatnr()));
}
return vo;

View File

@ -281,7 +281,7 @@ public class OutProduceController extends BaseController {
WmsOutProduce order = outProduceService.lambdaQuery().eq(WmsOutProduce::getNo, no).one();
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在");
List<WmsOutProduceItem> datas = outProduceItemService.getList(order.getId());
boolean enableOutScanChild = paramConfigService.getEnableOutScanChild();
Integer type = bomService.getScanType(order.getPlnbez());
return ApiResult.success(new OutProduce1VO()
.setId(order.getId())
.setAufnr(order.getAufnr())
@ -300,7 +300,7 @@ public class OutProduceController extends BaseController {
.setMeins(item.getMeins())
.setNum(item.getSqsl().subtract(item.getNum()));
vo.setQiTao(bomService.isParent(item.getMatnr()));
if (vo.isQiTao() && enableOutScanChild) {
if (vo.isQiTao() && Objects.equals(type, 1)) {
vo.setChildren(bomService.getChildrenVO(item.getMatnr()));
}
return vo;

View File

@ -202,7 +202,6 @@ public class TransferCompanyController extends BaseController {
VUtil.trueThrowBusinessError(datas.stream()
.noneMatch(item -> item.getLeft().compareTo(BigDecimal.ZERO) > 0)
).throwMessage("该订单的物料均已出库");
boolean enableOutScanChild = paramConfigService.getEnableOutScanChild();
return ApiResult.success(new TransferCompanyPdaVO()
.setBukrs(order.getBukrs())
.setReswk(order.getReswk())
@ -212,6 +211,7 @@ public class TransferCompanyController extends BaseController {
.setLgort1(order.getLgort())
.setItems(datas.stream()
.map(item -> {
Integer type = bomService.getScanType(item.getMatnr());
TransferCompanyPdaItemVO vo = new TransferCompanyPdaItemVO()
.setId(item.getId())
.setEbelp(item.getEbelp())
@ -221,7 +221,7 @@ public class TransferCompanyController extends BaseController {
.setNum(item.getLeft())
.setMeins(item.getMeins());
vo.setQiTao(bomService.isParent(item.getMatnr()));
if (vo.isQiTao() && enableOutScanChild) {
if (vo.isQiTao() && Objects.equals(type, 1)) {
vo.setChildren(bomService.getChildrenVO(item.getMatnr()));
}
return vo;

View File

@ -195,7 +195,6 @@ public class TransferFactoryController extends BaseController {
VUtil.trueThrowBusinessError(datas.stream()
.noneMatch(item -> item.getLeft().compareTo(BigDecimal.ZERO) > 0)
).throwMessage("该订单的物料均已出库");
boolean enableOutScanChild = paramConfigService.getEnableOutScanChild();
return ApiResult.success(new TransferFactoryPdaVO()
.setRsnum(order.getRsnum())
.setMblnr(order.getMblnr())
@ -204,6 +203,7 @@ public class TransferFactoryController extends BaseController {
.setFactoryNo(order.getWerks())
.setItems(datas.stream()
.map(item -> {
Integer type = bomService.getScanType(item.getMatnr());
TransferFactoryPdaItemVO vo = new TransferFactoryPdaItemVO()
.setId(item.getId())
.setMatnr(item.getMatnr())
@ -215,7 +215,7 @@ public class TransferFactoryController extends BaseController {
.setBinIn(StrUtil.join("/", storageService.getBinNos(item.getMatnr(), order.getWerks(), order.getUmlgo())))
.setBinOut(StrUtil.join("/", storageService.getBinNos(item.getMatnr(), order.getWerks(), order.getLgort())));
vo.setQiTao(bomService.isParent(item.getMatnr()));
if (vo.isQiTao() && enableOutScanChild) {
if (vo.isQiTao() && Objects.equals(type, 1)) {
vo.setChildren(bomService.getChildrenVO(item.getMatnr()));
}
return vo;

View File

@ -11,6 +11,7 @@ import com.nflg.wms.common.pojo.dto.BomImportExcelDTO;
import com.nflg.wms.common.pojo.dto.BomMaterialDTO;
import com.nflg.wms.common.pojo.qo.BomSearchQO;
import com.nflg.wms.common.pojo.qo.BomUpdateQO;
import com.nflg.wms.common.pojo.qo.ScanTypeUpdateQO;
import com.nflg.wms.common.pojo.vo.BomMaterialVO;
import com.nflg.wms.common.util.DateTimeUtil;
import com.nflg.wms.common.util.EecExcelUtil;
@ -70,6 +71,7 @@ public class BomControllerService {
.setDescribe(dto.getMaterialDesc())
.setDrawingNo(dto.getDrawingNo())
.setWeight(totalWight)
.setScanType(dto.getScanType())
.setNum(new BigDecimal(1))
.setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
@ -288,4 +290,11 @@ public class BomControllerService {
.addSheet(new ListSheet<>(datas))
.writeTo(response.getOutputStream());
}
public void updateScanType(ScanTypeUpdateQO request) {
bomService.lambdaUpdate()
.set(WmsBom::getScanType, request.getScanType())
.in(WmsBom::getId, request.getIds())
.update();
}
}

View File

@ -59,6 +59,12 @@ public class BomMaterialDTO {
@NotNull
private BigDecimal num;
/**
* 出入库是否扫子码0禁用1启用2仅入库启用
*/
@NotNull
private Integer scanType = 1;
/**
* 下级
*/

View File

@ -16,6 +16,12 @@ public class BomUpdateQO {
@NotNull
private Long id;
/**
* 出入库是否扫子码0禁用1启用2仅入库启用
*/
@NotNull
private Integer scanType = 1;
/**
* 子级物料
*/

View File

@ -1,7 +1,7 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
@ -9,6 +9,9 @@ import java.util.List;
@Data
public class InProduceOrderReceiveMaterialQO {
@NotNull
private Long id;
/**
* 物料编号
*/
@ -24,6 +27,5 @@ public class InProduceOrderReceiveMaterialQO {
/**
* 二维码列表
*/
@NotEmpty
private List<String> qrCodes;
}

View File

@ -0,0 +1,20 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
@Data
public class ScanTypeUpdateQO {
@NotEmpty
private List<Long> ids;
/**
* 出入库扫子码类型0禁用1启用2仅入库启用
*/
@NotNull
private Integer scanType;
}

View File

@ -67,4 +67,9 @@ public class BomMaterialVO {
* 子节点
*/
private List<BomMaterialVO> children;
/**
* 序号
*/
private Integer index;
}

View File

@ -65,4 +65,9 @@ public class InProduceOrderItemVO {
* 序列号
*/
private String sernr;
/**
* 是否必须扫码如果为false的话可以不扫码
*/
private boolean mustScan = true;
}

View File

@ -62,6 +62,11 @@ public class WmsBom implements Serializable {
*/
private BigDecimal weight;
/**
* 出入库是否扫子码0禁用1启用2仅入库启用
*/
private Integer scanType;
/**
* 创建人
*/

View File

@ -23,6 +23,4 @@ public interface IParamConfigService extends IService<ParamConfig> {
void updateConfig(ConfigUpdateQO request);
PageData<ParamConfigVO> search(SearchConfigQO request);
boolean getEnableOutScanChild();
}

View File

@ -33,4 +33,6 @@ public interface IWmsBomService extends IService<WmsBom> {
List<BomVO> getChildrenVO(String materialNo);
boolean isParent(String materialNo);
Integer getScanType(String materialNo);
}

View File

@ -104,12 +104,4 @@ public class ParamConfigServiceImpl extends ServiceImpl<ParamConfigMapper, Param
.setUpdateTime(d.getUpdateTime());
});
}
@Override
public boolean getEnableOutScanChild() {
return lambdaQuery()
.eq(ParamConfig::getCode, "EnableOutScanChild")
.eq(ParamConfig::getValue, "true")
.exists();
}
}

View File

@ -17,10 +17,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -180,4 +177,14 @@ public class WmsBomServiceImpl extends ServiceImpl<WmsBomMapper, WmsBom> impleme
.eq(WmsBom::getNo, materialNo)
.exists();
}
@Override
public Integer getScanType(String materialNo) {
return Optional.ofNullable(lambdaQuery()
.eq(WmsBom::getParentId, 0L)
.eq(WmsBom::getNo, materialNo)
.one()
).orElse(new WmsBom())
.getScanType();
}
}