rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
@@ -77,7 +77,6 @@ } @PreAuthorize("hasAuthority('manager:asnOrderItem:update')") @OperationLog("Update ASN单据") @PostMapping("/asnOrderItem/update") @@ -135,7 +134,12 @@ return asnOrderItemService.generateBarcode(orders); } @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") @ApiOperation("获取订单物料明细") @GetMapping("/asnOrderItem/trackCode/{code}") public R getItemByTrackCode(@PathVariable String code) { return R.ok(asnOrderItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, code))); } /** * ASN单据明细导入 * @param file rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinController.java
@@ -9,9 +9,13 @@ import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.KeyValVo; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.WaitPakin; import com.vincent.rsf.server.manager.service.WaitPakinService; import com.vincent.rsf.server.system.controller.BaseController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -19,6 +23,7 @@ import javax.servlet.http.HttpServletResponse; import java.util.*; @Api(tags = "组拖通知档") @RestController public class WaitPakinController extends BaseController { @@ -107,4 +112,22 @@ ExcelUtil.build(ExcelUtil.create(waitPakinService.list(), WaitPakin.class), response); } @PreAuthorize("hasAuthority('manager:waitPakin:update')") @ApiOperation("组盘") @PostMapping("/waitPakin/merge") public R pikinOrder(@RequestBody WaitPakinParam waitPakin) { if (Objects.isNull(waitPakin)) { return R.error("参数不能为空!!"); } if (StringUtils.isBlank(waitPakin.getBarcode())) { return R.error("托盘码不能为空!!"); } if (Objects.isNull(waitPakin.getItems()) || waitPakin.getItems().isEmpty()) { return R.error("跟踪码不能为空!!"); } return R.ok(waitPakinService.mergeItems(waitPakin)); } } rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/PakinItem.java
New file @@ -0,0 +1,19 @@ package com.vincent.rsf.server.manager.controller.params; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; @Data @Accessors(chain = true) @ApiModel(value = "PakinItem", description = "组拖明细参数") public class PakinItem implements Serializable { private String trackCode; private Long matnrId; private Double qty; } rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaitPakinParam.java
New file @@ -0,0 +1,23 @@ package com.vincent.rsf.server.manager.controller.params; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.List; @Data @Accessors(chain = true) @ApiModel(value = "WaitPakinParam", description = "组拖参数") public class WaitPakinParam implements Serializable { @ApiModelProperty("拖盘码") private String barcode; @ApiModelProperty("跟踪码") private List<PakinItem> items; } rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
@@ -56,6 +56,9 @@ @ApiModelProperty("字段索引") private String fieldsIndex; @ApiModelProperty("执行数量") private Double workQty; /** * ASN单号 */ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic; import java.text.SimpleDateFormat; import java.util.Date; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -22,6 +24,7 @@ import java.util.Date; @Data @Accessors(chain = true) @TableName("man_wait_pakin") public class WaitPakin implements Serializable { @@ -39,18 +42,6 @@ */ @ApiModelProperty(value= "编码") private String code; /** * 订单ID */ @ApiModelProperty(value= "订单ID") private Long ansId; /** * 订单编码 */ @ApiModelProperty(value= "订单编码") private String asnCode; /** * 容器码 @@ -123,10 +114,8 @@ public WaitPakin() {} public WaitPakin(String code,Long ansId,String asnCode,String barcode,Double anfme,Short ioStatus,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { public WaitPakin(String code,String barcode,Double anfme,Short ioStatus,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { this.code = code; this.ansId = ansId; this.asnCode = asnCode; this.barcode = barcode; this.anfme = anfme; this.ioStatus = ioStatus; rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakinItem.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic; import java.text.SimpleDateFormat; import java.util.Date; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -22,6 +24,7 @@ import java.util.Date; @Data @Accessors(chain = true) @TableName("man_wait_pakin_item") public class WaitPakinItem implements Serializable { @@ -41,6 +44,30 @@ private Long pakinId; /** * 订单ID */ @ApiModelProperty(value= "订单ID") private Long ansId; /** * 订单编码 */ @ApiModelProperty(value= "订单编码") private String asnCode; /** * 订单明细ID */ @ApiModelProperty("订单明细ID") private Long asnItemId; /** * 跟踪码 */ @ApiModelProperty("物料跟踪码") private String trackCode; /** * 物料名称 */ @ApiModelProperty(value= "物料名称") rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaitPakinService.java
@@ -1,8 +1,10 @@ package com.vincent.rsf.server.manager.service; import com.baomidou.mybatisplus.extension.service.IService; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.WaitPakin; public interface WaitPakinService extends IService<WaitPakin> { WaitPakin mergeItems(WaitPakinParam waitPakin); } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
@@ -1,12 +1,115 @@ package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.controller.params.PakinItem; import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.AsnOrder; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.WaitPakinItem; import com.vincent.rsf.server.manager.mapper.WaitPakinMapper; import com.vincent.rsf.server.manager.entity.WaitPakin; import com.vincent.rsf.server.manager.service.AsnOrderItemService; import com.vincent.rsf.server.manager.service.AsnOrderService; import com.vincent.rsf.server.manager.service.WaitPakinItemService; import com.vincent.rsf.server.manager.service.WaitPakinService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Service("waitPakinService") public class WaitPakinServiceImpl extends ServiceImpl<WaitPakinMapper, WaitPakin> implements WaitPakinService { @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private AsnOrderService asnOrderService; @Autowired private WaitPakinItemService waitPakinItemService; /** * 单据组拖 * @param waitPakin * @return */ @Override @Transactional(rollbackFor = Exception.class) public WaitPakin mergeItems(WaitPakinParam waitPakin) { if (waitPakin.getItems().isEmpty()) { throw new CoolException("参数错误:物料跟踪码为空!"); } if (StringUtils.isBlank(waitPakin.getBarcode())) { throw new CoolException("参数错误:托盘码为空!!"); } double sum = waitPakin.getItems().stream().mapToDouble(PakinItem::getQty).sum(); WaitPakin pakin = new WaitPakin(); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_WAIT_PAKIN_CODE, null); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("编码规则错误: 编码规则「SYS_WAIT_PAKIN_CODE」规则是不存在"); } pakin.setCode(ruleCode) .setAnfme(sum) .setBarcode(waitPakin.getBarcode()); if (!this.save(pakin)) { throw new CoolException("主单保存失败!!"); } /**物料跟踪码*/ List<String> tracks = waitPakin.getItems().stream().map(PakinItem::getTrackCode).collect(Collectors.toList()); List<AsnOrderItem> asnOrderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>() .in(AsnOrderItem::getTrackCode, tracks)); if (Objects.isNull(asnOrderItems) || asnOrderItems.isEmpty()) { throw new CoolException("单据不存在!!"); } List<WaitPakinItem> items = new ArrayList<>(); for (AsnOrderItem item : asnOrderItems) { WaitPakinItem pakinItem = new WaitPakinItem(); pakinItem.setAnfme(item.getAnfme()) .setPakinId(pakin.getId()) .setAnsId(item.getAsnId()) .setAsnCode(item.getAsnCode()) .setBatch(item.getSplrBatch()) .setFieldsIndex(item.getFieldsIndex()) .setUnit(item.getStockUnit()) .setMatnrId(StringUtils.isNotBlank(item.getMatnrId()) ? Long.parseLong(item.getMatnrId()) : null) .setMaktx(item.getMaktx()) .setMatnrCode(item.getMatnrCode()); for (PakinItem waitPakinItem : waitPakin.getItems()) { if (waitPakinItem.getTrackCode().equals(item.getTrackCode())) { Double v = item.getWorkQty() + waitPakinItem.getQty(); pakinItem.setWorkQty(v) .setAnfme(waitPakinItem.getQty()) .setTrackCode(waitPakinItem.getTrackCode()); /**更新单据执行中库存*/ if (v.compareTo(item.getQty()) > 0) {throw new CoolException("执行中数量大于收货数量!!");} if (!asnOrderItemService.update(new LambdaUpdateWrapper<AsnOrderItem>() .eq(AsnOrderItem::getTrackCode, waitPakinItem.getTrackCode()).set(AsnOrderItem::getWorkQty, v))) { throw new CoolException("执行中库存更新失败!!"); } } } items.add(pakinItem); } if (!waitPakinItemService.saveBatch(items)) { throw new CoolException("组拖明细保存失败!!"); } return pakin; } } rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
@@ -39,4 +39,9 @@ */ public final static String SYS_MATNR_CODE = "sys_matnr_code"; /** * 组拖编码生成规则 */ public final static String SYS_WAIT_PAKIN_CODE = "sys_wait_pakin_code"; } rsf-server/src/main/resources/mapper/manager/PurchaseMapper.xml
@@ -6,7 +6,7 @@ SELECT id, purchase_id, erp_item_id, plat_item_id, matnr_code, matnr_name, unit,