zy-asrs-admin/src/views/out/flat/index.vue
New file @@ -0,0 +1,142 @@ <template> <a-table :columns="columns" :data-source="datasource" bordered> <template #bodyCell="{column, record}"> <template v-if="column.key === 'operate'"> <a-button @click="viewDetail(record)" type="link"> {{ "查看明细" }} </a-button> <a-button @click="showDeleteConfirm(record)" danger type="link">{{"删除"}}</a-button> </template> <template v-if="column.key === 'status'"> <a-tag :color="record.status === 1 ? 'green' : 'volcano'"> {{record.status === 1 ? "正常" : "禁用"}} </a-tag> </template> </template> </a-table> <a-modal ref="sheetDetl" v-model:open="show" :width="'80%'" title="拣货单明细" @ok="handleOk"> <a-table :columns="childNodes" :data-source="childList"> <template #bodyCell="{column, record}"> <template v-if="column.key === 'status'"> <a-tag :color="record.status === 1 ? 'green' : 'volcano'"> {{record.status === 1 ? "正常" : "禁用"}} </a-tag> </template> </template> </a-table> </a-modal> </template> <script> import {post, get} from "@/utils/request.js"; import {message, Modal} from "ant-design-vue"; import { createVNode } from 'vue'; import {formatMessage} from "@/utils/localeUtils.js"; import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; export default { name: "out-stock-flat", data() { return { columns: [ {key: 'number', title: '序号', dataIndex: 'number'}, {key: 'pickNo', title: '单号', dataIndex: 'pickNo'}, {key: 'waveNo', title: '波次号', dataIndex: 'waveNo'}, {key: 'anfme', title: '数量', dataIndex: 'anfme'}, {key: 'status', title: '单据状态', dataIndex: 'status'}, {key: 'memo', title: '备注', dataIndex: ''}, {key: 'createdTime', title: '创建时间', dataIndex: 'createdTime'}, {key: 'updatedTime', title: '修改时间', dataIndex: 'updatedTime'}, {key: 'operate', title: '操作', dataIndex: 'operate'} ], childNodes: [ {key: 'number', title: '序号', dataIndex: 'number'}, {key: 'maktx', title: '物料名称', dataIndex: 'maktx'}, {key: 'matnr', title: '物料编码', dataIndex: 'matnr'}, {key: 'batch', title: '批号', dataIndex: 'batch'}, {key: 'locNo', title: '库位', dataIndex: 'locNo'}, {key: 'barcode', title: '拖盘码', dataIndex: 'barcode'}, {key: 'anfme', title: '数量', dataIndex: 'anfme'}, {key: 'memo', title: '备注', dataIndex: ''}, {key: 'status', title: '单据状态', dataIndex: 'status'}, // {key: 'operate', title: '操作', dataIndex: 'operate'} ], datasource: [], childList:[], show: false, } }, mounted() { //获取拣货单数据源 this.getOutFlatSheet(); }, methods: { showDeleteConfirm(record){ let that = this Modal.confirm({ title: '是否确认删除当前拣货单', icon: createVNode(ExclamationCircleOutlined), content: '连同明细一起删除', okText: '确认', okType: 'danger', cancelText: '取消', onOk() { that.removeRow(record) }, onCancel() { console.log('Cancel'); }, }); }, //删除当前行 removeRow(record) { let that = this get('/api/pick/flat/remove/' + record.id).then((resp)=>{ let result = resp.data; if (result.code == 200) { that.getOutFlatSheet() message.success(formatMessage('page.delete.success', '删除成功')); } else { message.error(result.msg); } }) }, //查看明细 viewDetail(record) { this.show = !this.show this.getSheetDetl(record) }, getOutFlatSheet() { let that = this post('/api/pick/flat/page',{page: {currnt: 1, size: 10}}).then((resp) => { let result = resp.data; if (result.code == 200) { // message.success(formatMessage('page.add.success', '成功')); that.datasource = result.data } else { message.error(result.msg); } }) }, getSheetDetl(record) { let that = this post('/api/pick/flat/detl/page',{page: {currnt: 1, size: 10}, params: {pickId: record.id}}).then((resp) => { let result = resp.data; if (result.code == 200) { // message.success(formatMessage('page.add.success', '成功')); that.childList = result.data } else { message.error(result.msg); } }) }, } } </script> <style scoped> </style> zy-asrs-framework/src/main/java/com/zy/asrs/framework/common/PageResult.java
New file @@ -0,0 +1,13 @@ package com.zy.asrs.framework.common; import lombok.Data; public class PageResult<T> extends R { //总数 Integer total; public PageResult (String msg, Integer code, T data) { super(code, msg); } } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/MobileController.java
@@ -1,6 +1,9 @@ package com.zy.asrs.wms.asrs.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zy.asrs.common.domain.CodeRes; import com.zy.asrs.common.domain.enums.LoginSystemType; import com.zy.asrs.framework.annotations.ManagerAuth; @@ -10,11 +13,14 @@ import com.zy.asrs.wms.asrs.entity.Order; import com.zy.asrs.wms.asrs.entity.WaitPakin; import com.zy.asrs.wms.asrs.entity.dto.OrderInfoDto; import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto; import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam; import com.zy.asrs.wms.asrs.entity.param.PageRequest; import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams; import com.zy.asrs.wms.asrs.service.MobileService; import com.zy.asrs.wms.asrs.service.OrderService; import com.zy.asrs.wms.asrs.service.WaitPakinService; import com.zy.asrs.wms.common.domain.BaseParam; import com.zy.asrs.wms.system.controller.BaseController; import com.zy.asrs.wms.system.entity.Host; import com.zy.asrs.wms.system.entity.User; @@ -178,4 +184,37 @@ } } /** * 获取拣货明细 * @return */ @GetMapping("/pick/detl/{code}") public R pickDetlByPickNo(@PathVariable String code) { if (StringUtil.isNullOrEmpty(code)) { return R.error("拣货单据编码不能为空!!"); } PickSheetDetlDto pickSheetDetls = mobileService.outFlatSheet(code); return R.ok(pickSheetDetls); } /** * 拣货单确认出库 * @param code * @return */ @GetMapping("/pick/confirm/{code}") public R confirmOutFlatSheet(@PathVariable String code) { if (StringUtil.isNullOrEmpty(code)) { return R.error("拣货单据编码不能为空!!"); } if (!mobileService.confirmFlatSheet(code)) { return R.error("出库失败!!"); } return R.ok("出库成功!!"); } } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/PickSheetController.java
@@ -1,14 +1,55 @@ package com.zy.asrs.wms.asrs.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zy.asrs.framework.common.R; import com.zy.asrs.wms.asrs.entity.PickSheetDetl; import com.zy.asrs.wms.asrs.entity.param.PageRequest; import com.zy.asrs.wms.asrs.service.PickSheetService; import com.zy.asrs.wms.system.controller.BaseController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RequestMapping("/pick") @RequestMapping("/api") @RestController public class PickSheetController extends BaseController { @Autowired private PickSheetService pickSheetService; /** * 平仓出库拣货单 * @return */ @PostMapping("/pick/flat/page") public R getOutFlatSheet(@RequestBody PageRequest params) { IPage page = pickSheetService.getOutFlatSheet(params); return R.ok(page.getRecords()); } /** * 获取拣货单明细 * @param pageRequest * @return */ @PostMapping("/pick/flat/detl/page") public R getSheetDetl(@RequestBody PageRequest pageRequest) { IPage page = pickSheetService.getSheetDetl(pageRequest); return R.ok(page.getRecords()); } /** * 获取拣货单明细 * @param id * @return */ @GetMapping("/pick/flat/remove/{id}") public R getRemoveSheet(@PathVariable String id) { int result = pickSheetService.removePickSheet(Long.valueOf(id)); if (result > 0) { return R.ok("删除成功!!"); } else { return R.error("删除失败!!"); } } } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheet.java
@@ -3,16 +3,25 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; /** * man_pick_sheet */ @Data @Accessors(chain = true) @TableName("man_pick_sheet") public class PickSheet implements Serializable { /** * 主键 */ @TableId private Long id; /** @@ -33,7 +42,7 @@ /** * 数量 */ private BigDecimal anfme; private Double anfme; /** * 备注 @@ -43,11 +52,15 @@ /** * 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createdTime; /** * 修改时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updatedTime; private Long hostId; zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/PickSheetDetl.java
@@ -3,32 +3,30 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.experimental.Accessors; /** * man_pick_sheet_detl */ @Data @Accessors(chain = true) @TableName("man_pick_sheet_detl") public class PickSheetDetl implements Serializable { /** * 主键 */ @TableId private Long id; /** * 拣货单标识 */ private Long pickId; /** * 订单标识 */ private Long orderId; /** * 订单明细标识 */ private Long orderDetlId; /** * 物料主键标识 @@ -39,6 +37,11 @@ * 库位主键标识 */ private Long locId; /** * 库位明细ID */ private Long locDetlId; /** * 物料名称 @@ -53,7 +56,7 @@ /** * 批号 */ private Long batch; private String batch; /** * 数量 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/PickSheetDetlDto.java
New file @@ -0,0 +1,14 @@ package com.zy.asrs.wms.asrs.entity.dto; import com.zy.asrs.wms.asrs.entity.PickSheet; import com.zy.asrs.wms.asrs.entity.PickSheetDetl; import lombok.Data; import java.io.Serializable; import java.util.List; @Data public class PickSheetDetlDto extends PickSheet implements Serializable { private List<PickSheetDetl> pickSheetDetlList; } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/PageRequest.java
New file @@ -0,0 +1,23 @@ package com.zy.asrs.wms.asrs.entity.param; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.sun.xml.internal.ws.model.WrapperParameter; import lombok.Data; import java.sql.Wrapper; import java.util.Map; @Data public class PageRequest{ //请求参数拼接 private QueryWrapper queryWrapper; Map<String, Object> params; /** * 分页, pageSize = 10 ,page = 1 */ Page page; } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -1,6 +1,7 @@ package com.zy.asrs.wms.asrs.manage; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.asrs.entity.dto.*; @@ -14,10 +15,13 @@ import com.zy.asrs.wms.utils.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -63,6 +67,12 @@ private CacheSiteService cacheSiteService; @Autowired private WaveSeedService waveSeedService; @Autowired private PickSheetService pickSheetService; @Autowired private PickSheetDetlService pickSheetDetlService; @Autowired private MatService matService; /** * 出库 @@ -82,7 +92,7 @@ long taskType = locDto.getAll() ? 101L : 103L; Loc loc = locService.getById(locDto.getLocId()); if(loc == null) { if (loc == null) { throw new CoolException("库位不存在"); } @@ -105,7 +115,7 @@ // 工作档明细保存 for (OutDetlDto detl : locDto.getDetls()) { LocDetl locDetl = locDetlService.getById(detl.getDetlId()); if(locDetl == null) { if (locDetl == null) { throw new CoolException("明细不存在"); } @@ -132,7 +142,7 @@ taskDetlField.sync(locDetlField); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); if(!taskDetlFieldSave){ if (!taskDetlFieldSave) { throw new CoolException("明细扩展生成失败"); } } @@ -142,7 +152,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); if(!locUpdate){ if (!locUpdate) { throw new CoolException("库位状态更新失败"); } } @@ -195,7 +205,9 @@ //获取TCU符合条件库位 for (OrderDetl orderDetl : orderDetls) { double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty() - orderDetl.getWorkQty()).orElse(0.0D); if (issued <= 0.0D) { continue; } if (issued <= 0.0D) { continue; } List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMat$().getMatnr(), orderDetl.getBatch(), orderDetl.getUniqueField()); orderDetlLocMap.put(orderDetl.getId(), locDetls); for (LocDetl locDetl : locDetls) { @@ -207,7 +219,7 @@ outDetlDto.setOrderDetlId(orderDetl.getId()); detlDtos.add(outDetlDto); issued = issued - outDetlDto.getAnfme(); }else { } else { break; } } @@ -220,7 +232,7 @@ if (dtos == null) { dtos = new ArrayList<>(); dtos.add(detlDto); }else { } else { dtos.add(detlDto); } map.put(locDetl.getLocId(), dtos); @@ -329,11 +341,11 @@ continue; } if(detlMap.containsKey(previewDto.getLocDetlId())) { if (detlMap.containsKey(previewDto.getLocDetlId())) { List<OrderOutBatchPreviewDto> previewDtos = detlMap.get(previewDto.getLocDetlId()); previewDtos.add(previewDto); detlMap.put(previewDto.getLocDetlId(), previewDtos); }else { } else { List<OrderOutBatchPreviewDto> previewDtos = new ArrayList<>(); previewDtos.add(previewDto); detlMap.put(previewDto.getLocDetlId(), previewDtos); @@ -361,11 +373,11 @@ HashMap<Long, List<OrderOutBatchPreviewDto>> map = new HashMap<>(); for (OrderOutBatchPreviewDto previewDto : dtos) { if(map.containsKey(previewDto.getLocId())) { if (map.containsKey(previewDto.getLocId())) { List<OrderOutBatchPreviewDto> previewDtos = map.get(previewDto.getLocId()); previewDtos.add(previewDto); map.put(previewDto.getLocId(), previewDtos); }else { } else { List<OrderOutBatchPreviewDto> previewDtos = new ArrayList<>(); previewDtos.add(previewDto); map.put(previewDto.getLocId(), previewDtos); @@ -411,12 +423,12 @@ for (OrderOutBatchPreviewDto dto : previewDtos) { LocDetl locDetl = locDetlService.getById(dto.getLocDetlId()); if(locDetl == null) { if (locDetl == null) { throw new CoolException("明细不存在"); } OrderDetl orderDetl = orderDetlService.getById(dto.getOrderDetlId()); if(orderDetl == null) { if (orderDetl == null) { throw new CoolException("订单明细不存在"); } orderUtils.updateWorkQty(dto.getOrderDetlId(), dto.getAnfme()); @@ -442,7 +454,7 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); if(!taskDetlFieldSave){ if (!taskDetlFieldSave) { throw new CoolException("明细扩展生成失败"); } } @@ -452,7 +464,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); if(!locUpdate){ if (!locUpdate) { throw new CoolException("库位状态更新失败"); } @@ -477,7 +489,7 @@ } List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().in(OrderDetl::getOrderId, orderIds)); if(orderDetls.isEmpty()){ if (orderDetls.isEmpty()) { throw new CoolException("订单明细不存在"); } orderDetls = orderDetlService.parseDetl(orderDetls); @@ -490,7 +502,7 @@ Double anfme = locDetlStockMap.get(matUniqueKey); anfme += issued; locDetlStockMap.put(matUniqueKey, anfme); }else { } else { locDetlStockMap.put(matUniqueKey, issued); } } @@ -534,7 +546,7 @@ dto.setFieldParams(fieldParams); } FieldSortParam sortParam = new FieldSortParam("anfme","desc"); FieldSortParam sortParam = new FieldSortParam("anfme", "desc"); List<FieldSortParam> sortParams = new ArrayList<>(); sortParams.add(sortParam); @@ -600,9 +612,11 @@ for (MergePreviewDto dto : param) { Double anfme = dto.getAnfme() - dto.getWorkQty(); //减去平库数量后,小于等于0,跳出处理 if (anfme <= 0) {continue;} if (anfme <= 0) { continue; } List<LocDetl> locDetls = locDetlService.queryStock(dto.getMatnr(), dto.getBatch(), dto.getFieldParams(), sortParams); if(locDetls.isEmpty()){ if (locDetls.isEmpty()) { MergePreviewResultDto resultDto = new MergePreviewResultDto(); resultDto.sync(dto); resultDto.setLocs(new ArrayList<>()); @@ -673,7 +687,7 @@ @Transactional(rollbackFor = Exception.class) public void orderOutMerge(OrderOutMergeParamDto dto) { if(dto == null){ if (dto == null) { throw new CoolException("参数不能为空"); } @@ -723,7 +737,7 @@ List<OrderDetl> detls = detlMap.get(matUniqueKey); detls.add(orderDetl); detlMap.put(matUniqueKey, detls); }else { } else { List<OrderDetl> detls = new ArrayList<>(); detls.add(orderDetl); detlMap.put(matUniqueKey, detls); @@ -757,7 +771,7 @@ orderOutMergeDto.setAnfme(issued); updateWorkQty = issued; requireAnfme -= issued; }else { } else { orderOutMergeDto.setAnfme(requireAnfme); updateWorkQty = requireAnfme; requireAnfme -= requireAnfme; @@ -777,7 +791,7 @@ List<OrderOutMergeDto> list = null; if (map.containsKey(orderOutMergeDto.getLocId())) { list = map.get(orderOutMergeDto.getLocId()); }else { } else { list = new ArrayList<>(); } list.add(orderOutMergeDto); @@ -823,12 +837,12 @@ for (OrderOutMergeDto merge : list) { LocDetl locDetl = locDetlService.getById(merge.getLocDetlId()); if(locDetl == null) { if (locDetl == null) { throw new CoolException("明细不存在"); } OrderDetl orderDetl = orderDetlService.getById(merge.getOrderDetlId()); if(orderDetl == null) { if (orderDetl == null) { throw new CoolException("订单明细不存在"); } @@ -853,7 +867,7 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); if(!taskDetlFieldSave){ if (!taskDetlFieldSave) { throw new CoolException("明细扩展生成失败"); } } @@ -865,7 +879,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); if(!locUpdate){ if (!locUpdate) { throw new CoolException("库位状态更新失败"); } @@ -883,11 +897,12 @@ * 4. 生成出库单PDA端,统一出库扣减库存 * 5. 生成拣货单历史档,出库单据加入历史档,删除原单据 * 6. 删除波次列表数据 * * @param dto */ @Transactional(rollbackFor = Exception.class) public void orderOutMergeWave(OrderOutMergeParamDto dto) { if(dto == null){ if (dto == null) { throw new CoolException("参数不能为空"); } @@ -903,7 +918,6 @@ /** * 波次合并出库 * 1. 判断是平库还TCU库 * 2. 根据单库单据类型 * 2. 平库生成拣货单 * 3. TCU库生成任务单 */ @@ -917,17 +931,25 @@ } } private Map<Long, List<OrderOutMergeDto>> checkLoc(List<OrderOutMergeParam> mergeParams, Wave wave) { /** * 1. 判断当波次及库位明细是否存在 * 2. 组合key-value(list)形式数据 * * @param mergeParams * @param wave * @return */ private Map<Long, List<OrderOutMergeDto>> checkLoc(List<OrderOutMergeParam> mergeParams, Wave wave) { HashMap<String, Double> stockMap = new HashMap<>(); for (OrderOutMergeParam param : mergeParams) { String matUniqueKey = Utils.getMatUniqueKey(param.getMatnr(), param.getBatch(), param.getFieldParams()); WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId())); if(waveDetl == null){ if (waveDetl == null) { throw new CoolException("波次数据不存在"); } //获取当前需要执行数量 double issued = Optional.of(waveDetl.getAnfme() - waveDetl.getWorkQty()).orElse(0.0D); if(!stockMap.containsKey(matUniqueKey)){ if (!stockMap.containsKey(matUniqueKey)) { stockMap.put(matUniqueKey, issued); } } @@ -935,33 +957,35 @@ HashMap<Long, List<OrderOutMergeDto>> map = new HashMap<>(); for (OrderOutMergeParam param : mergeParams) { LocDetl locDetl = locDetlService.getById(param.getLocDetlId()); if(locDetl == null) { if (locDetl == null) { continue; } if (locDetl.getAnfme() - param.getAnfme() < 0) { //库位数量小于出库数量 //新增workQty用于平库锁库存 if (locDetl.getAnfme() - locDetl.getWorkQty() - param.getAnfme() < 0) { continue; } OrderOutMergeDto orderOutMergeDto = new OrderOutMergeDto(); orderOutMergeDto.sync(param); //fixme 确认stockMap是否有用,此处入值后却没有使用 String matUniqueKey = Utils.getMatUniqueKey(param.getMatnr(), param.getBatch(), param.getFieldParams()); Double issued = stockMap.get(matUniqueKey); if (issued - orderOutMergeDto.getAnfme() < 0) { orderOutMergeDto.setAnfme(issued); issued = 0D; }else { } else { issued -= orderOutMergeDto.getAnfme(); } stockMap.put(matUniqueKey, issued); stockMap.put(matUniqueKey, issued); //根据库位做分类,可使用stream().groupby List<OrderOutMergeDto> list = null; if (map.containsKey(orderOutMergeDto.getLocId())) { list = map.get(orderOutMergeDto.getLocId()); }else { } else { list = new ArrayList<>(); } list.add(orderOutMergeDto); map.put(orderOutMergeDto.getLocId(), list); } @@ -975,6 +999,7 @@ /** * 根据不同库位类型生成出库拣单及TUC任务档 * * @param dto * @param wave */ @@ -999,12 +1024,12 @@ tucOrders.addAll(listMap.get(key)); } }); if (flatOrders.isEmpty()) { if (!flatOrders.isEmpty()) { //平库出库 outStockByFlat(flatOrders, wave); } if (tucOrders.isEmpty()) { if (!tucOrders.isEmpty()) { //TUC出库 outStockByTUC(tucOrders, wave); } @@ -1018,12 +1043,15 @@ * @param tucOrders * @param wave */ private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) { Map<Long, List<OrderOutMergeDto>> map = checkLoc(tucOrders, wave); private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) {//123 Map<Long, List<OrderOutMergeDto>> map = checkLoc(tucOrders, wave); if (!Objects.isNull(map)) { return; } for (Map.Entry<Long, List<OrderOutMergeDto>> entry : map.entrySet()) { Long locId = entry.getKey(); List<OrderOutMergeDto> list = entry.getValue(); //判断是否全仓出库 Boolean all = outUtils.isAllForMerge(locId, list); OrderOutMergeDto param = list.get(0); Long operationPortId = param.getOperationPort(); @@ -1041,7 +1069,7 @@ if (operationPort == null) { throw new CoolException("作业口不存在"); } //101 全拖出库 103 拣货出库 long taskType = all ? 101L : 103L; Task task = new Task(); @@ -1059,7 +1087,7 @@ for (OrderOutMergeDto merge : list) { LocDetl locDetl = locDetlService.getById(merge.getLocDetlId()); if(locDetl == null) { if (locDetl == null) { throw new CoolException("明细不存在"); } @@ -1085,7 +1113,7 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); if(!taskDetlFieldSave){ if (!taskDetlFieldSave) { throw new CoolException("明细扩展生成失败"); } } @@ -1106,7 +1134,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); if(!locUpdate){ if (!locUpdate) { throw new CoolException("库位状态更新失败"); } } @@ -1114,18 +1142,80 @@ /** * 平库出库--生成出库拣货单 * 1. 判断当前库位是否存在 * 2. 一张单据一个波次 * 3. 一个波次多条订单 * 4. 一个库位可多条明细 * 5. 拣货单完成后,释放库位明细锁定数量 * * @param flatOrders * @param wave */ private void outStockByFlat(List<OrderOutMergeParam> flatOrders, Wave wave) { //校验库存数量 Map<Long, List<OrderOutMergeDto>> map = checkLoc(flatOrders, wave); //生成拣货单 PickSheet pickSheet = new PickSheet(); //波次数量汇总 double sum = flatOrders.stream().mapToDouble(OrderOutMergeParam::getAnfme).sum(); //生成拣货单号 String pickNo = generatePickNO(); pickSheet.setId(null) .setPickNo(pickNo) .setMemo(wave.getMemo()) .setAnfme(sum) .setWaveId(wave.getId()) .setWaveNo(wave.getWaveNo()); if (!pickSheetService.save(pickSheet)) { throw new CoolException("拣货单写入失败!!"); } //根据库位ID分组 Map<Long, List<OrderOutMergeParam>> listMap = flatOrders.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getLocId)); //生成拣货明细 listMap.keySet().forEach(key -> { Loc curLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, key)); if (Objects.isNull(curLoc)) { throw new CoolException("主键." + key + "的库位不存在!!"); } listMap.get(key).forEach(outOder -> { //获取库位明细信息 LocDetl locDetl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getId, outOder.getLocDetlId())); PickSheetDetl sheetDetl = new PickSheetDetl(); BeanUtils.copyProperties(outOder, sheetDetl); //获取物料信息 Mat mat = matService.getOne(new LambdaQueryWrapper<Mat>().eq(Mat::getMatnr, outOder.getMatnr())); //拣货单明细 sheetDetl.setBarcode(curLoc.getBarcode()) .setPickId(pickSheet.getId()) .setAnfme(BigDecimal.valueOf(outOder.getAnfme())) .setLocDetlId(locDetl.getId()) .setMaktx(mat.getMaktx()) .setMatId(mat.getId()); if (!pickSheetDetlService.save(sheetDetl)) { throw new CoolException("拣货明细列新失败"); } //锁定库存量 locDetl.setWorkQty(locDetl.getWorkQty() + outOder.getAnfme()); }); }); } /** * 生成拣货单号 * * @return */ private String generatePickNO() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String format = simpleDateFormat.format(new Date()); Random random = new Random(); return "PN" + format + random.nextInt(10000); } @Transactional(rollbackFor = Exception.class) public void generateWave(GenerateWaveParam param) { @@ -1277,7 +1367,7 @@ order.setWaveId(null); order.setWaveNo(null); order.setHasWave(0); if(order.getOrderSettle().equals(OrderSettleType.WAVE.val())){ if (order.getOrderSettle().equals(OrderSettleType.WAVE.val())) { order.setOrderSettle(OrderSettleType.WAIT.val()); } if (!orderService.updateById(order)) { zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ManPickSheetDetlMapper.java
@@ -1,21 +1,12 @@ package com.zy.asrs.wms.asrs.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zy.asrs.wms.asrs.entity.PickSheetDetl; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface ManPickSheetDetlMapper { int deleteByPrimaryKey(Long id); public interface ManPickSheetDetlMapper extends BaseMapper<PickSheetDetl> { int insert(PickSheetDetl record); int insertSelective(PickSheetDetl record); PickSheetDetl selectByPrimaryKey(Long id); int updateByPrimaryKeySelective(PickSheetDetl record); int updateByPrimaryKey(PickSheetDetl record); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/MobileService.java
@@ -1,7 +1,11 @@ package com.zy.asrs.wms.asrs.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zy.asrs.wms.asrs.entity.Loc; import com.zy.asrs.wms.asrs.entity.PickSheet; import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto; import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam; import com.zy.asrs.wms.asrs.entity.param.PageRequest; import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams; import com.zy.asrs.wms.system.entity.Host; @@ -15,4 +19,8 @@ List<Host> getHosts(); boolean pakinToStock(PakinOnShelvesParams shelvesParams); PickSheetDetlDto outFlatSheet(String code); boolean confirmFlatSheet(String code); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetDetlService.java
New file @@ -0,0 +1,8 @@ package com.zy.asrs.wms.asrs.service; import com.baomidou.mybatisplus.extension.service.IService; import com.zy.asrs.wms.asrs.entity.PickSheetDetl; public interface PickSheetDetlService extends IService<PickSheetDetl> { } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/PickSheetService.java
@@ -1,8 +1,16 @@ package com.zy.asrs.wms.asrs.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.zy.asrs.wms.asrs.entity.PickSheet; import com.zy.asrs.wms.asrs.entity.PickSheetDetl; import com.zy.asrs.wms.asrs.entity.param.PageRequest; public interface PickSheetService extends IService<PickSheet> { IPage<PickSheet> getOutFlatSheet(PageRequest params); IPage<PickSheetDetl> getSheetDetl(PageRequest pageRequest); int removePickSheet(Long id); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/MobileServiceImpl.java
@@ -1,12 +1,17 @@ package com.zy.asrs.wms.asrs.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.asrs.entity.*; import com.zy.asrs.wms.asrs.entity.dto.PickSheetDetlDto; import com.zy.asrs.wms.asrs.entity.enums.*; import com.zy.asrs.wms.asrs.entity.enums.OrderType; import com.zy.asrs.wms.asrs.entity.param.BatchMergeOrdersParam; import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam; import com.zy.asrs.wms.asrs.entity.param.PageRequest; import com.zy.asrs.wms.asrs.entity.param.PakinOnShelvesParams; import com.zy.asrs.wms.asrs.service.*; import com.zy.asrs.wms.system.entity.Host; @@ -16,10 +21,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @Service @@ -45,7 +48,10 @@ private LocAreaService locAreaService; @Autowired private LocAreaTypeService locAreaTypeService; @Autowired private PickSheetService pickSheetService; @Autowired private PickSheetDetlService pickSheetDetlService; @Override @Transactional(rollbackFor = Exception.class) @@ -133,7 +139,8 @@ LocDetl locDetl = new LocDetl(); locDetl.setAnfme(pakin.getAnfme()); locDetl.setBatch(pakin.getBatch()); locDetl.setMatId(pakin.getMatnrId$());; locDetl.setMatId(pakin.getMatnrId$()); ; locDetl.setCreateTime(new Date()); locDetl.setOrderNo(pakin.getOrderNo()); locDetl.setLocNo(loc.getLocNo()); @@ -178,15 +185,84 @@ return true; } // /** // * 获取当前库位是否存在 // * @param shelvesParams // * @return // */ // @Override // public Loc selectPakinLocs(PakinOnShelvesParams shelvesParams) { // return locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, shelvesParams.getLoc())); // } @Override public PickSheetDetlDto outFlatSheet(String code) { PickSheetDetlDto pickDetlDto = new PickSheetDetlDto(); PickSheet pickSheet = pickSheetService.getOne(new LambdaQueryWrapper<PickSheet>() .eq(PickSheet::getPickNo, code) .eq(PickSheet::getDeleted, 0) .eq(PickSheet::getStatus, 1) ); BeanUtils.copyProperties(pickSheet, pickDetlDto); if (Objects.isNull(pickDetlDto)) { throw new CoolException("对象复制失败!!"); } List<PickSheetDetl> sheetDetls = pickSheetDetlService.list(new LambdaQueryWrapper<PickSheetDetl>() .eq(PickSheetDetl::getPickId, pickSheet.getId()) .eq(PickSheetDetl::getStatus, 1) .eq(PickSheetDetl::getDeleted, 0)); pickDetlDto.setPickSheetDetlList(sheetDetls); return pickDetlDto; } @Override @Transactional(rollbackFor = Exception.class) public boolean confirmFlatSheet(String code) { PickSheet pickSheet = pickSheetService.getOne(new LambdaQueryWrapper<PickSheet>().eq(PickSheet::getPickNo, code)); if (pickSheet.getStatus() == 1) { //状态修改为: 已转历史档 pickSheet.setStatus(3); if (!pickSheetService.updateById(pickSheet)) { throw new CoolException("转历史档失败!!"); } else{ if (!pickSheetDetlService.update(new LambdaUpdateWrapper<PickSheetDetl>().eq(PickSheetDetl::getPickId, pickSheet.getId()).set(PickSheetDetl::getStatus, 3))) { throw new CoolException("拣货单明细转历史档失败!!"); } } } else { throw new CoolException("请勿操作历史档数据!!"); } List<PickSheetDetl> sheetDetls = pickSheetDetlService.list(new LambdaQueryWrapper<PickSheetDetl>().eq(PickSheetDetl::getPickId, pickSheet.getId())); Map<Long, List<PickSheetDetl>> listMap = sheetDetls.stream().collect(Collectors.groupingBy(PickSheetDetl::getLocId)); listMap.keySet().forEach(key -> { Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, key)); listMap.get(key).forEach(pickDetl -> { LocDetl detl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getId, pickDetl.getLocDetlId())); if (Objects.isNull(detl)) { throw new CoolException("数据错误!!"); } //更新锁定库存 BigDecimal workQty = BigDecimal.valueOf(detl.getAnfme()).subtract(pickDetl.getAnfme()); detl.setWorkQty(workQty.doubleValue()); //计算结果小于等于零,移出库存明细 BigDecimal qty = BigDecimal.valueOf(detl.getAnfme()).subtract(pickDetl.getAnfme()); detl.setAnfme(qty.doubleValue()); if (qty.compareTo(new BigDecimal("0.00")) <= 0) { detl.setDeleted(1); if (!locDetlService.removeById(detl)) { throw new CoolException("库存明细删除失败!!"); } } else { //结果大于零,更新库存明细 if (!locDetlService.updateById(detl)) { throw new CoolException("库存明细更新失败!!"); } } }); /**明细更新完成后,判断是否为空,为空更新主单状态为空库,拖盘码清空,不为空不做更新**/ List<LocDetl> list = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, loc.getId()).eq(LocDetl::getDeleted, 0)); if (list.isEmpty()) { boolean update = locService.update(new LambdaUpdateWrapper<Loc>() .eq(Loc::getId, loc.getId()) .set(Loc::getBarcode, null) .set(Loc::getUpdateTime, new Date()) .set(Loc::getLocStsId, LocStsType.O.val())); if (update) { throw new CoolException("库存更新失败!! "); } } }); return true; } } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetDetlServiceImpl.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.wms.asrs.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zy.asrs.wms.asrs.entity.PickSheetDetl; import com.zy.asrs.wms.asrs.mapper.ManPickSheetDetlMapper; import com.zy.asrs.wms.asrs.service.PickSheetDetlService; import org.springframework.stereotype.Service; @Service public class PickSheetDetlServiceImpl extends ServiceImpl<ManPickSheetDetlMapper, PickSheetDetl> implements PickSheetDetlService { } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/PickSheetServiceImpl.java
@@ -1,12 +1,72 @@ package com.zy.asrs.wms.asrs.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zy.asrs.wms.asrs.entity.PickSheet; import com.zy.asrs.wms.asrs.entity.PickSheetDetl; import com.zy.asrs.wms.asrs.entity.param.PageRequest; import com.zy.asrs.wms.asrs.mapper.ManPickSheetDetlMapper; import com.zy.asrs.wms.asrs.mapper.ManPickSheetMapper; import com.zy.asrs.wms.asrs.service.PickSheetService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Objects; @Service public class PickSheetServiceImpl extends ServiceImpl<ManPickSheetMapper, PickSheet> implements PickSheetService { @Autowired private ManPickSheetDetlMapper pickSheetDetlMapper; /** * 获取拣货单列表 * @param params * @return */ @Override public IPage<PickSheet> getOutFlatSheet(PageRequest params) { LambdaQueryWrapper<PickSheet> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(PickSheet::getDeleted, 0).eq(PickSheet::getStatus, 1); if (!Objects.isNull(params.getParams())) { lambdaQueryWrapper.eq(!Objects.isNull(params.getParams().get("pickNo")),PickSheet::getPickNo, params.getParams().get("pickNo")) .eq(!Objects.isNull(params.getParams().get("id")), PickSheet::getId, params.getParams().get("id")) .eq(!Objects.isNull(params.getParams().get("waveNo")), PickSheet::getWaveNo, params.getParams().get("waveNo")); } return this.baseMapper.selectMapsPage(params.getPage(), lambdaQueryWrapper); } /** * 获取拣货单明细 * @param pageRequest * @return */ @Override public IPage<PickSheetDetl> getSheetDetl(PageRequest pageRequest) { LambdaQueryWrapper<PickSheetDetl> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(PickSheetDetl::getDeleted, 0).eq(PickSheetDetl::getStatus, 1); if (!Objects.isNull(pageRequest.getParams())) { lambdaQueryWrapper.eq(!Objects.isNull(pageRequest.getParams().get("maktx")),PickSheetDetl::getMaktx, pageRequest.getParams().get("maktx")) .eq(!Objects.isNull(pageRequest.getParams().get("batch")), PickSheetDetl::getBatch, pageRequest.getParams().get("batch")) .eq(!Objects.isNull(pageRequest.getParams().get("mantr")), PickSheetDetl::getMatnr, pageRequest.getParams().get("mantr")) .eq(!Objects.isNull(pageRequest.getParams().get("locNo")), PickSheetDetl::getLocNo, pageRequest.getParams().get("locNo")) .eq(!Objects.isNull(pageRequest.getParams().get("pickId")), PickSheetDetl::getPickId, pageRequest.getParams().get("pickId")) .eq(!Objects.isNull(pageRequest.getParams().get("barcode")), PickSheetDetl::getBarcode, pageRequest.getParams().get("barcode")); } return pickSheetDetlMapper.selectMapsPage(pageRequest.getPage(), lambdaQueryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public int removePickSheet(Long id) { if (this.update(new LambdaUpdateWrapper<PickSheet>().eq(PickSheet::getId, id).set(PickSheet::getDeleted, 1))) { return pickSheetDetlMapper.update(new LambdaUpdateWrapper<PickSheetDetl>().eq(PickSheetDetl::getPickId, id).set(PickSheetDetl::getDeleted, 1)); } return 0; } } zy-asrs-wms/src/main/java/com/zy/asrs/wms/common/domain/BaseParam.java
@@ -1,6 +1,8 @@ package com.zy.asrs.wms.common.domain; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; import java.io.Serializable; zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetDetlMapper.xml
@@ -4,8 +4,6 @@ <resultMap id="BaseResultMap" type="com.zy.asrs.wms.asrs.entity.PickSheetDetl"> <id column="id" jdbcType="BIGINT" property="id" /> <result column="pick_id" jdbcType="BIGINT" property="pickId" /> <result column="order_id" jdbcType="BIGINT" property="orderId" /> <result column="order_detl_id" jdbcType="BIGINT" property="orderDetlId" /> <result column="mat_id" jdbcType="BIGINT" property="matId" /> <result column="loc_id" jdbcType="BIGINT" property="locId" /> <result column="maktx" jdbcType="VARCHAR" property="maktx" /> zy-asrs-wms/src/main/resources/mapper/asrs/PickSheetMapper.xml
@@ -21,4 +21,5 @@ created_by, updated_by, `status`, deleted </sql> </mapper>