construction-data/src/components/datav/digitalFlop.vue
@@ -27,8 +27,8 @@ matnr: '物料编号', batch: '批号', waveNo: '波次', anfme: '总需求数量', workQty: '剩余需求数量', anfme: '总需求', workQty: '剩余需求', } } }, @@ -104,19 +104,27 @@ @media screen and (max-width: 1280px) { #digital-flop{ .digital-flop-title { padding: 10px; font-size: 14px; } .digital-flop-item { padding: 10px 0; .digital-flop { .cell-item { font-size: 12px; height: unset; .digital-flop-title { padding: 5px 0; text-align: center; min-width: 36px; font-size: 9px; } .digital-flop { .cell-item { font-size: 9px; height: unset; } } } } } construction-data/src/components/datav/index.vue
@@ -4,14 +4,14 @@ <top-header/> <template> <el-row> <el-col :span="15"> <el-col :span="13"> <el-row class="header-left-task" type="flex" align="center" > <el-col v-for="(task, index) in tasks" :key="index" > <el-row type="flex" align="center" justify="center" @click.native="borderClick(task)"> <dv-border-box-2> <el-card class="header-card" > <el-row> <el-col :span="4" v-for="(item, index) in Object.keys(waveLabels)" :key="index"> <el-col class="heaer-label-column" v-for="(item, index) in Object.keys(waveLabels)" :key="index"> <div class="header-card-label" >{{ waveLabels[item] }}</div> <div class="header-card-val" >{{ task[item] }}</div> </el-col> @@ -22,13 +22,11 @@ </el-col> </el-row> <el-row class="detl-info-row"> <dv-border-box-2> <el-card> <el-table :data="mergeTaskDetl" class="talbe-matnr" @row-click="selectRow"> <el-table-column v-for="(item,index) in Object.keys(detlLabels)" :prop="item" :label="detlLabels[item]" :key="index"/> </el-table> </el-card> </dv-border-box-2> <el-card class="detl-info-card"> <el-table :data="mergeTaskDetl" class="table-matnr" @row-click="selectRow"> <el-table-column v-for="(item,index) in Object.keys(detlLabels)" :prop="item" :label="detlLabels[item]" :key="index"/> </el-table> </el-card> </el-row> <el-row class="pick-order-detl"> <dv-border-box11 title="拣货订单明细" class="detl-box-border"> @@ -41,16 +39,16 @@ </dv-border-box11> </el-row> </el-col> <el-col :span="9"> <el-col :span="11"> <el-row class="order-box-row"> <dv-border-box-11 title="订单完成情况" class="order-box"> <el-table :data="orders" v-if="orders.length > 0" class="order-table"> <el-table-column v-for="(item, dex) in Object.keys(orderStatus)" :prop="item" :label="orderStatus[item]" :key="dex"> <el-table-column v-for="(item, dex) in Object.keys(orderStatus)" :prop="item" :label="orderStatus[item]" :key="dex" > <template slot-scope="scope"> <el-popover placement="right" width="300" trigger="manual" class="popover-order" v-model="visible" v-if="item === 'action'" > <template> @@ -58,13 +56,13 @@ <span>选择目标发货区</span> <el-divider/> <el-row :gutter="15"> <el-col v-for="(palt, index) in platforms" :key="index" class="platform" :span="7" @click.native="bindShipping(palt, scope)"> <div>{{palt.platformNo}}</div> <el-col v-for="(palt, index) in platforms" :key="index" :span="7" @click.native="bindShipping(palt, scope)"> <div class="platform" >{{palt.platformNo}}</div> </el-col> </el-row> </div> </template> <el-button slot="reference" type="text" @click.native.prevent="print(scope.$index, orders)">打印明细</el-button> <el-button slot="reference" type="text" @click.native.prevent="print(scope.$index, orders)" class="btnPrint">打印明细</el-button> </el-popover> <div v-else class="ship-order-list"> {{scope.row[item]}} @@ -431,15 +429,7 @@ margin: 5px 0; } .platform { display: flex; align-items: center; justify-content: center; height: 80px; background-color: #03d3ec; margin: 5px; text-align: center; } .pick-order-detl { padding: 0 15px; @@ -524,22 +514,31 @@ text-align: center; padding: 15px; .header-card-label { font-size: 25px; font-style: oblique; padding: 5px; color: white; } .header-card-val { font-size: 20px; padding: 10px; color: orange; .heaer-label-column { min-width: 170px; width: auto; .header-card-label { font-size: 25px; font-style: oblique; padding: 5px; color: white; } .header-card-val { font-size: 20px; padding: 10px; color: orange; } } } } .detl-info-row { padding: 0 15px; .detl-info-card { } } .order-box-row { @@ -553,6 +552,23 @@ width: 74vh; padding-top: 65px; height: 275px; .popover-order { width: 300px; .platform { display: flex; align-items: center; justify-content: center; height: 80px; background-color: #03d3ec; margin: 5px; text-align: center; } } .ship-order-list { font-size: 18px; color: white; @@ -620,7 +636,7 @@ top: 0px !important; } .talbe-matnr { .table-matnr { height: 26vh; } @@ -667,23 +683,58 @@ @media screen and (max-width: 1281px) { #data-view { .header-left-task { .header-card { margin: 5px;height: 90px; padding: 5px; padding: 5px 15px 5px 15px; .header-card-label { font-size: 18px; padding: 5px; .header-card { margin: 2px; height: 70px; padding: 2px; .el-card__body { padding: 5px 20px; } .header-card-val { font-size: 14px; .heaer-label-column{ max-width: 130px; min-width: 75px; width: auto; .header-card-label { font-size: 13px; padding: 5px; } .header-card-val { font-size: 11px; } } } } .detl-info-row { padding: 0 15px; .detl-info-card { padding: 0; .el-card__body { padding: 8px; } } .el-table { th.el-table__cell>.cell { text-align: center; } .el-table__cell { padding: 5px 0; text-align: center; width: auto; } } } .order-box-row { width: 58vh; width: 68vh; height: 28vh; .order-box { @@ -694,37 +745,47 @@ padding-top: 65px; height: 275px; .btnPrint { font-size: 9px; } .ship-order-list { font-size: 14px; font-size: 10px; } .el-table__cell { padding: 0; } } } .empty-padding { padding-top: 65px; width: 30px; height: 30px; } } .talbe-matnr { height: 20vh; .table-matnr { height: 15vh; } .el-table .cell { font-size: 16px !important; font-size: 10px !important; } .pick-order-detl { padding: 0 10px; .detl-box-border { height: 39vh; height: 49vh; .detl-box-padding { height: 65px } .order-detl-list { height: 23vh; height: 38vh; } } } construction-data/src/components/datav/topHeader.vue
@@ -83,11 +83,25 @@ } } @media only screen and (max-width: 1280px){ @media only screen and (max-width: 1281px){ #top-header { height: auto; margin-bottom: 5px; .header-center-decoration { width: 40%; height: 40px; margin-top: 20px; } .header-left-decoration, .header-right-decoration { width: 25%; height: 40px; } .center-title { font-size: 24px; top: 10px; font-size: 18px; font-weight: bold; } } zy-asrs-admin/src/components/orderOut/orderOutWavePreview/index.vue
@@ -61,6 +61,16 @@ return customColSpanProps(index) }, }, { title: '库位类型', dataIndex: 'type', width: 110, ellipsis: true, ...getColumnSearchProps('type'), customCell: (_, index) => { return customColSpanProps(index) }, } ]; const state = reactive({ @@ -102,11 +112,10 @@ tmp.push({ title: formatMessage('db.man_order_detl.anfme', '数量'), dataIndex: 'anfme', width: 140, width: 60, ellipsis: true, fixed: 'right', }) tmp.push({ title: formatMessage('db.man_order_detl.locNo', '出库库位'), dataIndex: 'locNo', @@ -243,20 +252,20 @@ tableDataTmp.push(dataTmp); } if (isused > 0) { let dataTmp = JSON.parse(JSON.stringify(item)); dataTmp.locId = null; dataTmp.locNo = null; dataTmp.locDetlId = null; dataTmp.typeId = item.typeId; dataTmp.workQty = item.workQty; dataTmp.anfme = isused; dataTmp.key = idx; dataTmp.operationPort = defaultOperationPort; // if (isused > 0) { // let dataTmp = JSON.parse(JSON.stringify(item)); // dataTmp.locId = null; // dataTmp.locNo = null; // dataTmp.locDetlId = null; // dataTmp.typeId = item.typeId; // dataTmp.workQty = item.workQty; // dataTmp.anfme = isused; // dataTmp.key = idx; // dataTmp.operationPort = defaultOperationPort; tableDataTmp.push(dataTmp); count++; } // tableDataTmp.push(dataTmp); // count++; // } } colSpan[idx] = count; zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OutController.java
@@ -110,6 +110,7 @@ double anfme = waveDetl.getAnfme() - waveDetl.getWorkQty(); dto.setMatnr(waveDetl.getMatnr()); dto.setBatch(waveDetl.getBatch()); dto.setStatus(0); dto.setWorkQty(0.0); dto.setAnfme(anfme); dto.setOrderIds(orderIds); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/MergePreviewDto.java
@@ -24,6 +24,12 @@ private List<FieldParam> fieldParams; private String fieldParamsEncode; /** * 1: 已完成 * 2: 部分完成 * 0: 未完成 */ private Integer status; //动态扩展字段 public transient Map<String, Object> dynamicFields = new HashMap<>(); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/dto/MergePreviewResultDto.java
@@ -18,6 +18,11 @@ private Double anfme; //本次取货数量 private Double fetchQty; //库位类型 private String type; private List<Long> orderIds; private List<MergePreviewResultLocDto> locs; zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.datatype.jsr310.DecimalUtils; import com.mysql.cj.util.StringUtils; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.asrs.entity.dto.*; @@ -22,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -555,12 +557,17 @@ List<MergePreviewResultDto> resultDtos = new ArrayList<>(); //优先查询平库数据 param.forEach(pars -> { if (pars.getStatus() == 1) { return; } List<MergePreviewResultLocDto> locDtos = new ArrayList<>(); MergePreviewResultDto resultDto = new MergePreviewResultDto(); resultDto.sync(pars); resultDto.setOrderIds(pars.getOrderIds()); //总需求数量 resultDto.setAnfme(pars.getAnfme()); resultDto.setLocs(locDtos); //查询平库中符合条件的库存 List<LocDetl> locs = locDetlService.queryFlatStock(pars.getMatnr(), pars.getBatch(), pars.getFieldParams()); if (!locs.isEmpty()) { double anfme = pars.getAnfme() - pars.getWorkQty(); @@ -578,44 +585,61 @@ locDto.setLocNo(detl.getLocNo()); locDto.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_FLAT.id); locDto.setLocDetlId(detl.getId()); locDto.setAnfme(detl.getAnfme()); locDto.setWorkQty(detl.getWorkQty()); locDtos.add(locDto); //库位实际可用数量 double surplusQty = detl.getAnfme() - detl.getWorkQty(); if (surplusQty <= 0) { continue; } //波次数量减去库位可用数量后,盈余数量 anfme = anfme - surplusQty; if (anfme > 0) { locDto.setAnfme(detl.getAnfme()); locDto.setWorkQty(surplusQty); //当前可使用数量 resultDto.setFetchQty(surplusQty); //余下需求数量 pars.setStatus(2); pars.setWorkQty(pars.getWorkQty() + surplusQty); pars.setAnfme(anfme); } else { locDto.setAnfme(pars.getAnfme() - pars.getWorkQty()); locDto.setWorkQty(pars.getAnfme() - pars.getWorkQty()); //当前使用数量 resultDto.setFetchQty(pars.getAnfme()); //余下需求 pars.setWorkQty(pars.getWorkQty() + pars.getAnfme()); pars.setStatus(1); pars.setAnfme(0.0); break; } } //保存出库数量(平库) pars.setWorkQty(pars.getAnfme() - pars.getWorkQty() - anfme); resultDto.setOtherLocs(new ArrayList<>()); if (!Objects.isNull(resultDto.getFetchQty()) && !(new BigDecimal(resultDto.getFetchQty()).compareTo(new BigDecimal("0.00")) == 0)) { resultDto.setOtherLocs(new ArrayList<>()); resultDto.setAnfme(pars.getAnfme()); resultDto.setType(LocAreaTypeSts.LOC_AREA_TYPE_FLAT.desc); resultDtos.add(resultDto); resultDtos.add(resultDto); } } }); //平库查询完成后,再查询TCU for (MergePreviewDto dto : param) { Double anfme = dto.getAnfme() - dto.getWorkQty(); //减去平库数量后,小于等于0,跳出处理 if (anfme <= 0) { //单据已完成,跳出 if (dto.getStatus() == 1) { continue; } // Double anfme = dto.getAnfme() - dto.getWorkQty(); // //减去平库数量后,小于等于0,跳出处理 // if (anfme <= 0) { // continue; // } List<LocDetl> locDetls = locDetlService.queryStock(dto.getMatnr(), dto.getBatch(), dto.getFieldParams(), sortParams); if (locDetls.isEmpty()) { MergePreviewResultDto resultDto = new MergePreviewResultDto(); resultDto.sync(dto); resultDto.setLocs(new ArrayList<>()); resultDto.setType(LocAreaTypeSts.LOC_AREA_TYPE_UTC.desc); resultDto.setOrderIds(dto.getOrderIds()); resultDto.setAnfme(dto.getAnfme()); resultDtos.add(resultDto); @@ -627,7 +651,7 @@ MergePreviewResultDto resultDto = new MergePreviewResultDto(); resultDto.sync(dto); resultDto.setOrderIds(dto.getOrderIds()); // Double anfme = dto.getAnfme(); Double anfme = dto.getAnfme(); resultDto.setLocs(locDtos); for (LocDetl locDetl : locDetls) { Loc loc = locService.getById(locDetl.getLocId()); @@ -676,6 +700,8 @@ resultDto.setAnfme(dto.getAnfme()); resultDto.setType(LocAreaTypeSts.LOC_AREA_TYPE_UTC.desc); resultDtos.add(resultDto); } zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java
@@ -15,7 +15,7 @@ @Repository public interface ViewLocDetlMapper extends BaseMapper<ViewLocDetl> { List<Map<String, Object>> queryStock(String matnr, String batch, List<FieldParam> param, @Param("sortParam") List<FieldSortParam> sortParam); List<Map<String, Object>> queryStock(String matnr, String batch, List<FieldParam> param, @Param("sortParam") List<FieldSortParam> sortParam, @Param("type")Long type); List<Map<String, Object>> getList(String matnr, String batch, List<FieldParam> param, @Param("sortParam") List<FieldSortParam> sortParam); zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
@@ -103,7 +103,7 @@ @Override public List<LocDetl> queryStock(String matnr, String batch, List<FieldParam> param, List<FieldSortParam> sortParam) { List<Map<String, Object>> list = viewLocDetlMapper.queryStock(matnr, batch, param, sortParam); List<Map<String, Object>> list = viewLocDetlMapper.queryStock(matnr, batch, param, sortParam, LocAreaTypeSts.LOC_AREA_TYPE_UTC.id); List<LocDetl> locDetlsSort = resortDetls(list); return locDetlsSort; } zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
@@ -9,7 +9,7 @@ FROM view_man_loc_detl ) t WHERE t.deleted = 0 AND t.freeze = 0 WHERE t.deleted = 0 AND t.freeze = 0 AND type_id = #{type} <if test="matnr != null and matnr != ''"> AND t.matnr = #{matnr} </if>