Compare commits

...

9 Commits

Author SHA1 Message Date
曹鹏飞 bf8e9baea9 refactor(repository): 调整结构化包装订单托盘项实体和查询逻辑
- 移除 WmsStructuralPackageOrderTrayItem 实体中的图片和图号字段
- 修改 getListByTrayId 查询方法,添加物料表关联并获取图片和图号信息
- 更新 SQL 查询语句以从物料表获取图片和图号数据
- 保持 getSimpleListByTrayNo 方法的基本查询逻辑不变
2026-03-24 17:09:20 +08:00
曹鹏飞 b4cdc6387e feat(wms): 添加订单项数量修改功能
- 在PurchaseReturnController中新增updateItemNum方法用于修改采购退货订单项数量
- 在TransferCompanyController中新增updateItemNum方法用于修改转储公司订单项数量
- 在TransferFactoryController中新增updateItemNum方法用于修改工厂调拨订单项数量
- 新增UpdateItemNumRequest请求类用于接收数量修改参数
- 添加业务逻辑验证确保修改后的数量不低于最小限制值
- 更新TransferCompanyItemVO和TransferFactoryItemVO添加数量限制相关字段
2026-03-24 16:47:13 +08:00
曹鹏飞 f2bccd0a4a Merge remote-tracking branch '惠信/dev_zhangke' into develop 2026-03-24 16:24:49 +08:00
曹鹏飞 680269fea5 feat(wms): 添加订单项数量修改功能并优化相关实体类
- 在ApplyReturnRequestItemVO中添加剩余数量和领料数量最小值字段
- 在OutAssistanceItemVO、OutCostcenterInfoItemVO中添加领料数量最小值计算逻辑
- 在OutProduceInfoItemVO中添加申请数量最小值计算逻辑
- 新增UpdateItemNumRequest请求类用于接收数量修改参数
- 在OutAssistanceController、OutCostCenterController、OutProduceController中添加updateItemNum接口
- 修复OutProduceController中解锁库存方法的注释问题
- 在测试类中添加数量计算验证逻辑
2026-03-24 16:24:13 +08:00
zhangke 96db2fb197 采购退库更新 2026-03-24 16:17:37 +08:00
曹鹏飞 2135376540 Merge remote-tracking branch '惠信/develop' into develop 2026-03-24 14:24:11 +08:00
曹鹏飞 272387f51b Merge remote-tracking branch '惠信/develop' into develop 2026-03-24 14:22:05 +08:00
曹鹏飞 3da437390c Merge remote-tracking branch '惠信/develop' into develop 2026-03-24 14:08:52 +08:00
曹鹏飞 66c2b31255 feat(dependency): 添加Redisson依赖并优化全局异常处理
- 在nflg-wms-srm-receive模块中添加Redisson分布式锁依赖
- 在GlobalRestControllerAdvice中重构异常日志记录方式,统一使用printLog方法
- 引入ExceptionUtil工具类增强异常堆栈信息输出
- 在TestController中添加业务异常测试接口用于验证异常处理逻辑
- 修复DeploySitTest中字符串截取方法的参数间距问题
2026-03-24 14:08:36 +08:00
28 changed files with 372 additions and 126 deletions

View File

@ -1651,6 +1651,7 @@ public class NormalPGIController extends BaseController {
// 首先判断当前包是否已经收货了 // 首先判断当前包是否已经收货了
WmsPackage pacageScanVO = wmsPackageService.lambdaQuery().eq(WmsPackage::getPackageCode, request.getPackageCode()) WmsPackage pacageScanVO = wmsPackageService.lambdaQuery().eq(WmsPackage::getPackageCode, request.getPackageCode())
.one(); .one();
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request.getItems())).throwMessage("没有收货的物料信息");
VUtil.trueThrowBusinessError(ObjectUtil.isNull(pacageScanVO)).throwMessage("打包码不存在"); VUtil.trueThrowBusinessError(ObjectUtil.isNull(pacageScanVO)).throwMessage("打包码不存在");
VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 0).throwMessage("此打包码尚未打包"); VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 0).throwMessage("此打包码尚未打包");
VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 2).throwMessage("此打包码已完成收货"); VUtil.trueThrowBusinessError(pacageScanVO.getPackageStatus() == 2).throwMessage("此打包码已完成收货");

View File

@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO; import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.request.UpdateItemNumRequest;
import com.nflg.wms.admin.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.InventoryForOutRepository;
import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
@ -168,6 +169,22 @@ public class OutAssistanceController extends BaseController {
return ApiResult.success(vo); return ApiResult.success(vo);
} }
/**
* 修改订单项数量
*/
@PostMapping("updateItemNum")
public ApiResult<Void> updateItemNum(@Valid @RequestBody UpdateItemNumRequest request) {
WmsOutAssistanceItem item = outAssistanceItemService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项不存在");
BigDecimal min = item.getNum().subtract(item.getLeft());
VUtil.trueThrowBusinessError(request.getNum().compareTo(min) < 0).throwMessage("数量不能小于" + min);
BigDecimal difference = request.getNum().subtract(item.getNum());
item.setLeft(item.getLeft().add(difference));
item.setNum(request.getNum());
outAssistanceItemService.updateById(item);
return ApiResult.success();
}
/** /**
* 获取订单项PDA使用 * 获取订单项PDA使用
*/ */
@ -433,7 +450,7 @@ public class OutAssistanceController extends BaseController {
); );
Map<String, List<OutMaterialScanRecord>> dmaps = records.stream().collect(Collectors.groupingBy(OutMaterialScanRecord::getKey7)); Map<String, List<OutMaterialScanRecord>> dmaps = records.stream().collect(Collectors.groupingBy(OutMaterialScanRecord::getKey7));
OptRecordDTO optRecordDTO = new OptRecordDTO(); OptRecordDTO optRecordDTO = new OptRecordDTO();
optRecordDTO.setOperationType((short)1); optRecordDTO.setOperationType((short) 1);
optRecordDTO.setOrderId(order.getNo()); optRecordDTO.setOrderId(order.getNo());
optRecordService.add(optRecordDTO); optRecordService.add(optRecordDTO);
SubcontractedOrderConfirmDTO dto = sapService.zwm3a04(new SubcontractedOrderConfirmQO() SubcontractedOrderConfirmDTO dto = sapService.zwm3a04(new SubcontractedOrderConfirmQO()

View File

@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO; import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.request.UpdateItemNumRequest;
import com.nflg.wms.admin.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.InventoryForOutRepository;
import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
@ -171,6 +172,22 @@ public class OutCostCenterController extends BaseController {
return ApiResult.success(vo); return ApiResult.success(vo);
} }
/**
* 修改订单项数量
*/
@PostMapping("updateItemNum")
public ApiResult<Void> updateItemNum(@Valid @RequestBody UpdateItemNumRequest request) {
WmsOutCostcenterItem item = outCostcenterItemService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项不存在");
BigDecimal min = item.getNum().subtract(item.getLeft());
VUtil.trueThrowBusinessError(request.getNum().compareTo(min) < 0).throwMessage("数量不能小于" + min);
BigDecimal difference = request.getNum().subtract(item.getNum());
item.setLeft(item.getLeft().add(difference));
item.setNum(request.getNum());
outCostcenterItemService.updateById(item);
return ApiResult.success();
}
/** /**
* 获取订单项PDA使用 * 获取订单项PDA使用
*/ */

View File

@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO; import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.request.UpdateItemNumRequest;
import com.nflg.wms.admin.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.InventoryForOutRepository;
import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
@ -267,23 +268,25 @@ public class OutProduceController extends BaseController {
return ApiResult.success(outProduceService.search(request)); return ApiResult.success(outProduceService.search(request));
} }
/** // /**
* 解锁库存根据订单 // * 解锁库存根据订单
*/ // * @deprecated 不需要这个方法了
@PostMapping("0/releaseNumByOrder") // */
public ApiResult<Void> releaseNumByOrder(@Valid @RequestBody @NotEmpty List<Long> ids) { // @PostMapping("0/releaseNumByOrder")
outProduceService.releaseNum(ids); // public ApiResult<Void> releaseNumByOrder(@Valid @RequestBody @NotEmpty List<Long> ids) {
return ApiResult.success(); // outProduceService.releaseNum(ids);
} // return ApiResult.success();
// }
/** //
* 解锁库存根据明细 // /**
*/ // * 解锁库存根据明细
@PostMapping("0/releaseNumByItem") // * @deprecated 不需要这个方法了
public ApiResult<Void> releaseNumByItem(@Valid @RequestBody @NotEmpty List<Long> ids) { // */
outProduceItemService.releaseNum(ids); // @PostMapping("0/releaseNumByItem")
return ApiResult.success(); // public ApiResult<Void> releaseNumByItem(@Valid @RequestBody @NotEmpty List<Long> ids) {
} // outProduceItemService.releaseNum(ids);
// return ApiResult.success();
// }
/** /**
* 修改备注 * 修改备注
@ -321,6 +324,21 @@ public class OutProduceController extends BaseController {
return ApiResult.success(vo); return ApiResult.success(vo);
} }
/**
* 修改订单项数量
*/
@PostMapping("updateItemNum")
public ApiResult<Void> updateItemNum(@Valid @RequestBody UpdateItemNumRequest request) {
WmsOutProduceItem item = outProduceItemService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项不存在");
VUtil.trueThrowBusinessError(request.getNum().compareTo(item.getNum()) < 0).throwMessage("数量不能小于" + item.getNum());
BigDecimal difference = request.getNum().subtract(item.getSqsl());
item.setLockNum(item.getLockNum().add(difference));
item.setSqsl(request.getNum());
outProduceItemService.updateById(item);
return ApiResult.success();
}
/** /**
* 获取订单项PDA使用 * 获取订单项PDA使用
*/ */

View File

@ -109,6 +109,7 @@ public class OutPurchaseController extends BaseController {
.gt(WmsReturnRequestItem::getLeft, 0) .gt(WmsReturnRequestItem::getLeft, 0)
.list(); .list();
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(items)).throwMessage("所有物料均已完成"); VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(items)).throwMessage("所有物料均已完成");
order.setPoNum(items.get(0).getPoNumberNew());
ZWM3A05VO vo = new ZWM3A05VO() ZWM3A05VO vo = new ZWM3A05VO()
.setPurchaseOrderId(order.getId()) .setPurchaseOrderId(order.getId())
.setLifnr(order.getSupplierCode()) .setLifnr(order.getSupplierCode())

View File

@ -8,6 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO; import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.request.UpdateItemNumRequest;
import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService;
import com.nflg.wms.admin.service.SapService; import com.nflg.wms.admin.service.SapService;
import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.PdfGeneratorUtil;
@ -76,6 +77,7 @@ public class PurchaseReturnController extends BaseController {
/** /**
* 获取送货单的入库信息 * 获取送货单的入库信息
*
* @param request * @param request
* @return * @return
*/ */
@ -93,6 +95,7 @@ public class PurchaseReturnController extends BaseController {
/** /**
* 获取退货申请单详情 * 获取退货申请单详情
*
* @param request * @param request
* @return * @return
*/ */
@ -107,8 +110,25 @@ public class PurchaseReturnController extends BaseController {
return ApiResult.success(vos); return ApiResult.success(vos);
} }
/**
* 修改订单项数量
*/
@PostMapping("updateItemNum")
public ApiResult<Void> updateItemNum(@Valid @RequestBody UpdateItemNumRequest request) {
WmsReturnRequestItem item = returnRequestItemService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项不存在");
BigDecimal min = item.getRequestQuantity().subtract(item.getLeft());
VUtil.trueThrowBusinessError(request.getNum().compareTo(min) < 0).throwMessage("数量不能小于" + min);
BigDecimal difference = request.getNum().subtract(item.getRequestQuantity());
item.setLeft(item.getLeft().add(difference));
item.setRequestQuantity(request.getNum());
returnRequestItemService.updateById(item);
return ApiResult.success();
}
/** /**
* 获取送货单的入库信息 * 获取送货单的入库信息
*
* @param request * @param request
* @return * @return
*/ */
@ -121,6 +141,7 @@ public class PurchaseReturnController extends BaseController {
/** /**
* 新增退货申请单 * 新增退货申请单
*
* @param request * @param request
* @return * @return
*/ */
@ -140,6 +161,7 @@ public class PurchaseReturnController extends BaseController {
/** /**
* 删除申请单 * 删除申请单
*
* @param request * @param request
* @return * @return
*/ */
@ -160,6 +182,7 @@ public class PurchaseReturnController extends BaseController {
/** /**
* 审核申请单 * 审核申请单
*
* @param request * @param request
* @return * @return
*/ */
@ -193,7 +216,7 @@ public class PurchaseReturnController extends BaseController {
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(returnRequestItems)) VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(returnRequestItems))
.throwMessage("没有有效的数据"); .throwMessage("没有有效的数据");
if (request.getApprovalStatus().equals(1)) { if (request.getApprovalStatus().equals(1)) {
if (request.getDocumentType().equals(1)) { //25 if (request.getDocumentType().equals(1)) { //25 仅退货
ZWM3A25HeadDTO headDTO25 = new ZWM3A25HeadDTO(); ZWM3A25HeadDTO headDTO25 = new ZWM3A25HeadDTO();
List<ZWM3A25ItemDTO> itemDTOList25 = new ArrayList<>(); List<ZWM3A25ItemDTO> itemDTOList25 = new ArrayList<>();
headDTO25.setReturnType("2"); headDTO25.setReturnType("2");
@ -212,7 +235,18 @@ public class PurchaseReturnController extends BaseController {
} }
ZWM3A25ReturnDTO zwm3a25ReturnDTO = sapService.ZWM3A25(headDTO25, itemDTOList25); ZWM3A25ReturnDTO zwm3a25ReturnDTO = sapService.ZWM3A25(headDTO25, itemDTOList25);
log.info(" zwm3a25ReturnDTO: " + JSONUtil.toJsonStr(zwm3a25ReturnDTO)); log.info(" zwm3a25ReturnDTO: " + JSONUtil.toJsonStr(zwm3a25ReturnDTO));
} else if (request.getDocumentType().equals(2)) { //24 zwm3a25ReturnDTO.getItemReturnDTOList().forEach(item -> {
String materialNo = item.getMatnr().replace("00000000","");
WmsReturnRequestItem dbItem = returnRequestItems.stream()
.filter(it -> StrUtil.equals(it.getMaterialCode(), materialNo)
)
.findFirst()
.get();
dbItem.setPoLineNumberNew(item.getEbelp());
dbItem.setPoNumberNew(item.getEbeln());
});
returnRequestItemService.updateBatchById(returnRequestItems);
} else if (request.getDocumentType().equals(2)) { //24 退换货
ZWM3A24HeadDTO headDTO24 = new ZWM3A24HeadDTO(); ZWM3A24HeadDTO headDTO24 = new ZWM3A24HeadDTO();
List<ZWM3A24ItemDTO> itemDTOList24 = new ArrayList<>(); List<ZWM3A24ItemDTO> itemDTOList24 = new ArrayList<>();
headDTO24.setReturnType("1"); headDTO24.setReturnType("1");
@ -230,22 +264,24 @@ public class PurchaseReturnController extends BaseController {
} }
ZWM3A24ReturnDTO retrunDto24 = sapService.ZWM3A24(headDTO24, itemDTOList24); ZWM3A24ReturnDTO retrunDto24 = sapService.ZWM3A24(headDTO24, itemDTOList24);
log.info(" zwm3a24ReturnDTO: " + JSONUtil.toJsonStr(retrunDto24)); log.info(" zwm3a24ReturnDTO: " + JSONUtil.toJsonStr(retrunDto24));
retrunDto24.getItemReturnDTOList().forEach(item -> { for (ZWM3A24ItemReturnDTO item : retrunDto24.getItemReturnDTOList()) {
WmsReturnRequestItem dbItem=returnRequestItems.stream() if (Objects.equals(item.getRetpo(), "X")) {
.filter(it -> StrUtil.equals(it.getMaterialCode(), item.getMatnr()) String materialNo = item.getMatnr().replace("00000000","");
&& Objects.equals(Integer.parseInt(it.getPoLineNumber()), item.getEbelp_old()) WmsReturnRequestItem dbItem = returnRequestItems.stream()
) .filter(it -> it.getMaterialCode().equals(materialNo))
.findFirst() .findFirst().orElse( null);
.get(); dbItem.setPoLineNumberNew(item.getEbelp());
dbItem.setPoLineNumberNew(item.getEbelp_new()); dbItem.setPoNumberNew(item.getEbeln());
}); returnRequestItemService.updateBatchById(returnRequestItems);
returnRequestItemService.updateBatchById(returnRequestItems); }
}
} }
} }
//修改状态 //修改状态
returnRequestService.lambdaUpdate() returnRequestService.lambdaUpdate()
.set(WmsReturnRequest::getApprovalStatus, request.getApprovalStatus()) .set(WmsReturnRequest::getApprovalStatus, request.getApprovalStatus())
.set(WmsReturnRequest::getDocumentType,request.getDocumentType()) .set(WmsReturnRequest::getDocumentType, request.getDocumentType())
.set(WmsReturnRequest::getApproveTime, LocalDateTime.now()) .set(WmsReturnRequest::getApproveTime, LocalDateTime.now())
.set(WmsReturnRequest::getApproverId, UserUtil.getUserId()) .set(WmsReturnRequest::getApproverId, UserUtil.getUserId())
.set(WmsReturnRequest::getApproverName, UserUtil.getUserName()) .set(WmsReturnRequest::getApproverName, UserUtil.getUserName())
@ -256,6 +292,7 @@ public class PurchaseReturnController extends BaseController {
/** /**
* 码验证 * 码验证
*
* @param qrCodeMaster * @param qrCodeMaster
* @return * @return
*/ */
@ -301,6 +338,7 @@ public class PurchaseReturnController extends BaseController {
/** /**
* 保存申请单 * 保存申请单
*
* @return * @return
*/ */
private List<InventoryLockVO> SaveApply(List<PurchaseReturnDTO> purchaseReturnDTOList, Short dataSource) { private List<InventoryLockVO> SaveApply(List<PurchaseReturnDTO> purchaseReturnDTOList, Short dataSource) {
@ -357,6 +395,7 @@ public class PurchaseReturnController extends BaseController {
/** /**
* 申请退货(PDA) * 申请退货(PDA)
*
* @param request * @param request
* @return * @return
*/ */
@ -455,17 +494,17 @@ public class PurchaseReturnController extends BaseController {
if (CollectionUtil.isEmpty(inventoryLockVOS)) { if (CollectionUtil.isEmpty(inventoryLockVOS)) {
return ApiResult.success(); return ApiResult.success();
} else { } else {
throw new DataAlertException(STATE.OutOfStock, inventoryLockVOS); return ApiResult.errorWithExtras(STATE.OutOfStock, inventoryLockVOS);
} }
} }
/** /**
* 扫码获取扫码信息 * 扫码获取扫码信息
*
* @param request * @param request
* @return * @return
* @author * @author
*
*/ */
@PostMapping("pda/scan") @PostMapping("pda/scan")
@ApiMark(moduleName = "扫码", apiName = "扫码获取扫码信息") @ApiMark(moduleName = "扫码", apiName = "扫码获取扫码信息")
@ -485,6 +524,14 @@ public class PurchaseReturnController extends BaseController {
@GetMapping("exportTicket") @GetMapping("exportTicket")
public void exportTicket(HttpServletResponse response, @Valid @RequestParam @NotNull Long id) throws Exception { public void exportTicket(HttpServletResponse response, @Valid @RequestParam @NotNull Long id) throws Exception {
WmsReturnRequest order = returnRequestService.getById(id); WmsReturnRequest order = returnRequestService.getById(id);
List<WmsReturnRequestItem> orderItem = returnRequestItemService.lambdaQuery()
.eq(WmsReturnRequestItem::getApplicationId, id)
.list();
if(CollectionUtil.isNotEmpty(orderItem))
{
order.setPoNum(orderItem.get(0).getPoNumberNew());
}
VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("申请单不存在"); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("申请单不存在");
VUtil.trueThrowBusinessError(order.getApprovalStatus() != 1).throwMessage("申请单未审核通过"); VUtil.trueThrowBusinessError(order.getApprovalStatus() != 1).throwMessage("申请单未审核通过");
UserSupplier supplier = userSupplierService.getByCode(order.getSupplierCode()); UserSupplier supplier = userSupplierService.getByCode(order.getSupplierCode());

View File

@ -5,10 +5,12 @@ import com.nflg.wms.admin.service.SapService;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.dto.LdapDepartmentDTO; import com.nflg.wms.common.pojo.dto.LdapDepartmentDTO;
import com.nflg.wms.common.pojo.dto.LdapUserDTO; import com.nflg.wms.common.pojo.dto.LdapUserDTO;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.service.ILanguageService; import com.nflg.wms.repository.service.ILanguageService;
import com.nflg.wms.starter.BaseController; import com.nflg.wms.starter.BaseController;
import com.sap.conn.jco.JCoException; import com.sap.conn.jco.JCoException;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.metadata.ValidateUnwrappedValue;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -76,4 +78,10 @@ public class TestController extends BaseController {
String ids=basdeSerialNumberControllerService.generateSerialNumber(0); String ids=basdeSerialNumberControllerService.generateSerialNumber(0);
return ApiResult.success(ids); return ApiResult.success(ids);
} }
@GetMapping("/businessError")
public void testThrowBusinessError() throws Exception {
int a=0;
Integer b =100/a;
}
} }

View File

@ -10,6 +10,7 @@ import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO; import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17Item1DTO; import com.nflg.wms.admin.pojo.dto.ZWM3A17Item1DTO;
import com.nflg.wms.admin.pojo.dto.ZWM3A17Item2DTO; import com.nflg.wms.admin.pojo.dto.ZWM3A17Item2DTO;
import com.nflg.wms.admin.pojo.request.UpdateItemNumRequest;
import com.nflg.wms.admin.repository.InMaterialScanRecordRespository; import com.nflg.wms.admin.repository.InMaterialScanRecordRespository;
import com.nflg.wms.admin.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.InventoryForOutRepository;
import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository;
@ -223,6 +224,22 @@ public class TransferCompanyController extends BaseController {
return ApiResult.success(vo); return ApiResult.success(vo);
} }
/**
* 修改订单项数量
*/
@PostMapping("updateItemNum")
public ApiResult<Void> updateItemNum(@Valid @RequestBody UpdateItemNumRequest request) {
WmsTransferCompanyItem item = transferCompanyItemService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项不存在");
BigDecimal min = item.getNum().subtract(item.getLeft());
VUtil.trueThrowBusinessError(request.getNum().compareTo(min) < 0).throwMessage("数量不能小于" + min);
BigDecimal difference = request.getNum().subtract(item.getNum());
item.setLeft(item.getLeft().add(difference));
item.setNum(request.getNum());
transferCompanyItemService.updateById(item);
return ApiResult.success();
}
/** /**
* 获取转储单PDA使用 * 获取转储单PDA使用
*/ */

View File

@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.nflg.wms.admin.pojo.dto.PdfPageDTO; import com.nflg.wms.admin.pojo.dto.PdfPageDTO;
import com.nflg.wms.admin.pojo.request.UpdateItemNumRequest;
import com.nflg.wms.admin.repository.InMaterialScanRecordRespository; import com.nflg.wms.admin.repository.InMaterialScanRecordRespository;
import com.nflg.wms.admin.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.InventoryForOutRepository;
import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository;
@ -221,6 +222,22 @@ public class TransferFactoryController extends BaseController {
return ApiResult.success(vo); return ApiResult.success(vo);
} }
/**
* 修改订单项数量
*/
@PostMapping("updateItemNum")
public ApiResult<Void> updateItemNum(@Valid @RequestBody UpdateItemNumRequest request) {
WmsTransferFactoryItem item = transferFactoryItemService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项不存在");
BigDecimal min = item.getNum().subtract(item.getLeft());
VUtil.trueThrowBusinessError(request.getNum().compareTo(min) < 0).throwMessage("数量不能小于" + min);
BigDecimal difference = request.getNum().subtract(item.getNum());
item.setLeft(item.getLeft().add(difference));
item.setNum(request.getNum());
transferFactoryItemService.updateById(item);
return ApiResult.success();
}
/** /**
* 获取调拨单PDA使用 * 获取调拨单PDA使用
*/ */

View File

@ -0,0 +1,21 @@
package com.nflg.wms.admin.pojo.request;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class UpdateItemNumRequest {
@NotNull
private Long id;
/**
* 新的数量
*/
@NotNull
@Min(value = 0)
private BigDecimal num;
}

View File

@ -3,26 +3,38 @@ package com.nflg.wms.admin;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.nflg.wms.common.util.DateTimeUtil; import com.nflg.wms.common.util.DateTimeUtil;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.util.Assert;
import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
public class ATest { public class ATest {
@Test @Test
public void test1(){ public void test1() {
Long index=2L; Long index = 2L;
System.out.println("K"+ StrUtil.padPre(String.valueOf(index),6,"0")); System.out.println("K" + StrUtil.padPre(String.valueOf(index), 6, "0"));
} }
@Test @Test
public void test2(){ public void test2() {
String index="0000"; String index = "0000";
System.out.println(StrUtil.removeAllPrefix(index,"0")); System.out.println(StrUtil.removeAllPrefix(index, "0"));
} }
@Test @Test
public void test3(){ public void test3() {
String date=DateTimeUtil.format(LocalDateTime.now(), "yyMMdd"); String date = DateTimeUtil.format(LocalDateTime.now(), "yyMMdd");
System.out.println(date); System.out.println(date);
} }
@Test
public void test4() {
BigDecimal num1 = new BigDecimal("5");
BigDecimal num2 = new BigDecimal("2");
BigDecimal left = new BigDecimal("3");
BigDecimal a = left.add(num2.subtract(num1));
System.out.println(a);
Assert.isTrue(a.compareTo(BigDecimal.ZERO) == 0, "数量错误");
}
} }

View File

@ -12,35 +12,30 @@ public class ZWM3A24ItemReturnDTO{
*/ */
private String werks; private String werks;
/**
* 原订单行号
*/
private Integer ebelp_old;
/** /**
* 单行号 * 定单行号
*/ */
private Integer ebelp_new; private Integer ebelp;
/** /**
* 库存地点 * 库存地点
*/ */
private String lgort; private String lgort;
// /** /**
// * 物料描述短文本 * 物料描述短文本
// */ */
// private String maktx; private String maktx;
// /** /**
// * 退货项目 * 退货项目
// */ */
// private String retpo; private String retpo;
// /** /**
// * 采购凭证号 * 采购凭证号
// */ */
// private String ebeln; private String ebeln;
/** /**
* 物料号 * 物料号

View File

@ -5,39 +5,39 @@ import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
@Data @Data
public class ZWM3A25ItemDTO{ public class ZWM3A25ItemDTO {
/** /**
* 工厂 * 工厂
*/ */
private String werks; private String werks;
/** /**
* 数量 * 数量
*/ */
private BigDecimal menge_Ret; private BigDecimal menge_Ret;
/** /**
* 消息 * 消息
*/ */
private String msg; private String msg;
/** /**
* 库存地点 * 库存地点
*/ */
private String lgort; private String lgort;
/** /**
* 新单行号 * 新单行号
*/ */
//private String ebelpNew; private String ebelpNew;
/** /**
* 物料号 * 物料号
*/ */
private String matnr; private String matnr;
/** /**
* 原订单行号 * 原订单行号
*/ */
private Integer ebelp_old; private Integer ebelp_old;
} }

View File

@ -11,9 +11,9 @@ public class ZWM3A25ItemReturnDTO{
private String werks; private String werks;
/** /**
* 退货单明细 * 新的采购单行号
*/ */
private String ebelp; private Integer ebelp;
/** /**
* 库存地点 * 库存地点

View File

@ -11,7 +11,7 @@ import java.util.List;
@Accessors(chain = true) @Accessors(chain = true)
public class QRCodeSearchQO { public class QRCodeSearchQO {
/** /**
* 包装编号 * 物料码编号
*/ */
@NotNull @NotNull
@NotBlank @NotBlank

View File

@ -1,5 +1,6 @@
package com.nflg.wms.common.pojo.vo; package com.nflg.wms.common.pojo.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -56,6 +57,20 @@ public class ApplyReturnRequestItemVO {
*/ */
private BigDecimal requestQuantity; private BigDecimal requestQuantity;
/**
* 剩余数量
*/
private BigDecimal left;
/**
* 领料数量最小值
*/
private BigDecimal requestQuantityLimit;
public BigDecimal getRequestQuantityLimit() {
return requestQuantity.subtract(left);
}
/** /**
* 出库状态 * 出库状态
*/ */

View File

@ -111,6 +111,15 @@ public class OutAssistanceItemVO {
*/ */
private BigDecimal left; private BigDecimal left;
/**
* 领料数量最小值
*/
private BigDecimal numLimit;
public BigDecimal getNumLimit() {
return num.subtract(left);
}
/** /**
* 发货仓库 * 发货仓库
*/ */

View File

@ -105,4 +105,13 @@ public class OutCostcenterInfoItemVO {
* 待领数量 * 待领数量
*/ */
private BigDecimal left; private BigDecimal left;
/**
* 领料数量最小值
*/
private BigDecimal numLimit;
public BigDecimal getNumLimit() {
return num.subtract(left);
}
} }

View File

@ -126,6 +126,15 @@ public class OutProduceInfoItemVO {
*/ */
private BigDecimal lockNum; private BigDecimal lockNum;
/**
* 申请数量最小值
*/
private BigDecimal sqslLimit;
public BigDecimal getSqslLimit() {
return num;
}
/** /**
* 已领数量 * 已领数量
*/ */

View File

@ -140,6 +140,15 @@ public class TransferCompanyItemVO {
return num.subtract(left); return num.subtract(left);
} }
/**
* 转储数量最小值
*/
private BigDecimal numLimit;
public BigDecimal getNumLimit() {
return outNum;
}
/** /**
* 已入库数量 * 已入库数量
*/ */

View File

@ -125,6 +125,15 @@ public class TransferFactoryItemVO {
return num.subtract(left); return num.subtract(left);
} }
/**
* 调库数量最小值
*/
private BigDecimal numLimit;
public BigDecimal getNumLimit() {
return num.subtract(left);
}
/** /**
* 已入库数量 * 已入库数量
*/ */

View File

@ -78,17 +78,6 @@ public class WmsReturnRequestItem implements Serializable {
*/ */
private BigDecimal requestQuantity; private BigDecimal requestQuantity;
/**
* 剩余数量
*/
@TableField(value = "\"left\"")
private BigDecimal left;
/**
* sap过账的行号
*/
private Integer poLineNumberNew;
/** /**
* 出库状态 * 出库状态
*/ */
@ -128,4 +117,20 @@ public class WmsReturnRequestItem implements Serializable {
* 单位 * 单位
*/ */
private String unit; private String unit;
/**
* 剩余数量
*/
@TableField(value ="\"left\"")
private BigDecimal left;
/**
* sap过账的行号
*/
private Integer poLineNumberNew;
/**
* 新的采购单号
*/
private String poNumberNew;
} }

View File

@ -74,15 +74,15 @@ public class WmsStructuralPackageOrderTrayItem implements Serializable {
*/ */
private BigDecimal storeNum; private BigDecimal storeNum;
/** // /**
* 图片 // * 图片
*/ // */
private String image; // private String image;
//
/** // /**
* 图号 // * 图号
*/ // */
private String drawingNo; // private String drawingNo;
/** /**
* 线下交货原因 * 线下交货原因

View File

@ -3,18 +3,18 @@
<mapper namespace="com.nflg.wms.repository.mapper.WmsStructuralPackageOrderTrayItemMapper"> <mapper namespace="com.nflg.wms.repository.mapper.WmsStructuralPackageOrderTrayItemMapper">
<select id="getListByTrayId" resultType="com.nflg.wms.common.pojo.vo.DeliverStructuralPackageOrderTrayItemVO"> <select id="getListByTrayId" resultType="com.nflg.wms.common.pojo.vo.DeliverStructuralPackageOrderTrayItemVO">
SELECT ROW_NUMBER() OVER (ORDER BY o.id) AS "index",oti.*,ot."no" as "tray_no",ot."state",sp."no" as "package_no" SELECT ROW_NUMBER() OVER (ORDER BY o.id) AS "index",m.image,m.drawing_no,oti.*,ot."no" as "tray_no",ot."state"
,sp."name" as "package_desc" ,sp."no" as "package_no",sp."name" as "package_desc"
FROM wms_structural_package_order_tray ot FROM wms_structural_package_order_tray ot
INNER JOIN wms_structural_package_order_tray_item oti ON ot."id"=oti.tray_id INNER JOIN wms_structural_package_order_tray_item oti ON ot."id"=oti.tray_id
INNER JOIN wms_structural_package_order o ON o."id"=ot.order_id INNER JOIN wms_structural_package_order o ON o."id"=ot.order_id
LEFT JOIN wms_structural_package sp ON o.package_id=sp."id" LEFT JOIN wms_structural_package sp ON o.package_id=sp."id"
LEFT JOIN wms_material m ON oti.material_no=m."no" and oti."version"=m."version"
where ot.id=#{id} where ot.id=#{id}
order by o.id order by o.id
</select> </select>
<select id="getSimpleListByTrayNo" <select id="getSimpleListByTrayNo" resultType="com.nflg.wms.common.pojo.vo.DeliverStructuralPackageOrderTrayItemSimpleVO">
resultType="com.nflg.wms.common.pojo.vo.DeliverStructuralPackageOrderTrayItemSimpleVO">
select oti.* select oti.*
from wms_structural_package_order_tray ot from wms_structural_package_order_tray ot
inner join wms_structural_package_order_tray_item oti on ot."id"=oti.tray_id inner join wms_structural_package_order_tray_item oti on ot."id"=oti.tray_id

View File

@ -33,7 +33,7 @@ public class CodeGeneratorTest {
) )
.strategyConfig(builder -> { .strategyConfig(builder -> {
builder builder
.addInclude("opt_record") //只生成指定表 .addInclude("wms_return_request_item") //只生成指定表
.entityBuilder().idType(IdType.ASSIGN_ID) .entityBuilder().idType(IdType.ASSIGN_ID)
.enableLombok() .enableLombok()
.enableChainModel() .enableChainModel()

View File

@ -38,6 +38,11 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId> <artifactId>spring-boot-starter-actuator</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.52.0</version>
</dependency>
<dependency> <dependency>
<groupId>com.sap.conn.jco</groupId> <groupId>com.sap.conn.jco</groupId>
<artifactId>sapjco3</artifactId> <artifactId>sapjco3</artifactId>

View File

@ -79,7 +79,7 @@ public class DeploySitTest {
} }
private String getRemoteFileMD5(SSHUtil sshUtil, String remotePath) throws Exception { private String getRemoteFileMD5(SSHUtil sshUtil, String remotePath) throws Exception {
String md5 = StrUtil.subPre(sshUtil.execWithReturn("md5sum " + remotePath),32); String md5 = StrUtil.subPre(sshUtil.execWithReturn("md5sum " + remotePath), 32);
printInfo("远程文件MD5为" + md5); printInfo("远程文件MD5为" + md5);
return md5; return md5;
} }

View File

@ -1,6 +1,7 @@
package com.nflg.wms.starter.advice; package com.nflg.wms.starter.advice;
import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotLoginException;
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.nflg.wms.common.constant.Constant; import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.constant.STATE;
@ -31,30 +32,30 @@ public class GlobalRestControllerAdvice {
@ExceptionHandler(Exception.class) @ExceptionHandler(Exception.class)
public ApiResult<Void> handleAllExceptions(Exception ex) { public ApiResult<Void> handleAllExceptions(Exception ex) {
log.error("服务器内部错误: ", ex); printLog("服务器内部错误", ex);
return ApiResult.error(STATE.BusinessError, "服务器内部错误,错误号:" + MDC.get(Constant.TRACE_ID)); return ApiResult.error(STATE.BusinessError, "服务器内部错误,错误号:" + MDC.get(Constant.TRACE_ID));
} }
@ExceptionHandler(NflgException.class) @ExceptionHandler(NflgException.class)
public ResponseEntity<Object> handleNflgException(NflgException ex) { public ResponseEntity<Object> handleNflgException(NflgException ex) {
if (ex.getState() == STATE.LoginError) { if (ex.getState() == STATE.LoginError) {
log.error("登录失效: ", ex); printLog("登录失效", ex);
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ex.getMsg()); return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ex.getMsg());
} else { } else {
log.error("业务错误: ", ex); printLog("业务错误", ex);
return ResponseEntity.ok().body(ApiResult.error(ex.getState(), ex.getMsg())); return ResponseEntity.ok().body(ApiResult.error(ex.getState(), ex.getMsg()));
} }
} }
@ExceptionHandler(ConstraintViolationException.class) @ExceptionHandler(ConstraintViolationException.class)
public ApiResult<Void> handleConstraintViolationException(ConstraintViolationException ex) { public ApiResult<Void> handleConstraintViolationException(ConstraintViolationException ex) {
log.error("数据校验失败: ", ex); printLog("数据校验失败", ex);
return ApiResult.error(STATE.ParamErr, "数据校验失败: " + StrUtil.join(",", ex.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.toList()))); return ApiResult.error(STATE.ParamErr, "数据校验失败: " + StrUtil.join(",", ex.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.toList())));
} }
@ExceptionHandler(MethodArgumentNotValidException.class) @ExceptionHandler(MethodArgumentNotValidException.class)
public ApiResult<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) { public ApiResult<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
log.error("数据校验失败: ", ex); printLog("数据校验失败", ex);
List<String> errors = new ArrayList<>(); List<String> errors = new ArrayList<>();
ex.getBindingResult().getAllErrors().forEach(error -> { ex.getBindingResult().getAllErrors().forEach(error -> {
String fieldName = ((FieldError) error).getField(); String fieldName = ((FieldError) error).getField();
@ -73,19 +74,23 @@ public class GlobalRestControllerAdvice {
@ExceptionHandler(NoResourceFoundException.class) @ExceptionHandler(NoResourceFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND) @ResponseStatus(HttpStatus.NOT_FOUND)
public ApiResult<Void> handleNoResourceFoundException(NoResourceFoundException ex) { public ApiResult<Void> handleNoResourceFoundException(NoResourceFoundException ex) {
log.error("请求的地址无效: ", ex); printLog("请求的地址无效", ex);
return ApiResult.error(STATE.BusinessError, "请求的地址无效:" + ex.getResourcePath()); return ApiResult.error(STATE.BusinessError, "请求的地址无效:" + ex.getResourcePath());
} }
@ExceptionHandler(SAPException.class) @ExceptionHandler(SAPException.class)
public ApiResult<Void> handleSAPException(SAPException ex) { public ApiResult<Void> handleSAPException(SAPException ex) {
log.error("SAP错误: ", ex); printLog("SAP错误", ex);
return ApiResult.error(ex.getState(), "SAP错误:" + ex.getMessage()); return ApiResult.error(ex.getState(), "SAP错误:" + ex.getMessage());
} }
@ExceptionHandler(DataAlertException.class) @ExceptionHandler(DataAlertException.class)
public ApiResult<Void> handleDataAlertException(DataAlertException ex) { public ApiResult<Void> handleDataAlertException(DataAlertException ex) {
log.error("返回数据的错误: ", ex); printLog("返回数据的错误", ex);
return ApiResult.errorWithExtras(ex.getState(), ex.getObj()); return ApiResult.errorWithExtras(ex.getState(), ex.getObj());
} }
private void printLog(String msg, Throwable ex) {
log.error("{}:{},{}", msg, ex.getMessage(), ExceptionUtil.stacktraceToString(ex));
}
} }