skyouc
3 天以前 05c0643b9337d8129876bdf9398b387c81b5f5f2
根据DO单添加出库单明细功能优化
8个文件已修改
130 ■■■■ 已修改文件
rsf-admin/src/i18n/zh.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutOrderModal.jsx 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutStockPublic.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryItemController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js
@@ -675,7 +675,7 @@
                platOrderCode: '客单号',
                anfme: "计划出库数",
                stockUnit: "库存单位",
                workQty: '执行数',
                workQty: '已出数量',
                purQty: "下单数量",
                purUnit: "单位",
                qty: "完成数量",
rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
@@ -225,11 +225,11 @@
                                />
                                <StyledDatagrid
                                    preferenceKey='deliveryItem'
                                    bulkActionButtons={<AddOutStockButton setOpen={setOpen} setPreview={setPreview} setSelect={setSelect}/>}
                                    bulkActionButtons={<AddOutStockButton setOpen={setOpen} setPreview={setPreview} setSelect={setSelect} />}
                                    rowClick={(id, resource, record) => false}
                                    expand={false}
                                    expandSingle={true}
                                    omit={['id', 'createTime', 'createBy', 'memo', 'workQty', 'startTime', 'endTime', 'updateBy', 'createTime']}
                                    omit={['id', 'createTime', 'createBy', 'memo', 'startTime', 'endTime', 'updateBy', 'createTime']}
                                >
                                    <NumberField source="id" />
                                    <TextField source="deliveryCode" label="table.field.deliveryItem.deliveryCode" />
@@ -237,6 +237,7 @@
                                    <TextField source="maktx" label="table.field.deliveryItem.matnrName" />
                                    <TextField source="unit" label="table.field.deliveryItem.unit" />
                                    <NumberField source="anfme" label="table.field.deliveryItem.anfme" />
                                    <NumberField source="workQty" label="table.field.outStockItem.workQty" />
                                    <TextField source="splrName" label="table.field.deliveryItem.splrName" />
                                    <TextField source="splrBatch" label="table.field.deliveryItem.splrBatch" />
                                    <TextField source="updateBy$" label="common.field.updateBy" />
@@ -266,12 +267,6 @@
    const notify = useNotify();
    const refresh = useRefresh();
    const confirm = async (event) => {
        const res = await request.post(`/outStock/generate/orders`, { ids: selectedIds });
        if (res?.data?.code === 200) {
            notify(res.data.msg);
        } else {
            notify(res.data.msg);
        }
        setPreview(true)
        setSelect(selectedIds);
        onUnselectItems();
rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
@@ -202,7 +202,7 @@
                                    bulkActionButtons={<></>}
                                    rowClick={handleRowClick}
                                    selectedIds={rowSelectedIds}
                                    omit={['id', 'splrName', 'qty', 'poCode', 'workQty']}
                                    omit={['id', 'splrName', 'qty', 'poCode',]}
                                >
                                    <NumberField source="id" />
                                    <TextField source="asnCode" label="table.field.outStockItem.asnCode" />
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryItemController.java
@@ -60,6 +60,29 @@
        return R.ok().add(deliveryItemService.page(pageParam, wrapper));
    }
    @PreAuthorize("hasAuthority('manager:deliveryItem:list')")
    @ApiOperation("分页获取列表")
    @PostMapping("/deliveryItem/edit/page")
    public R byPoIdspage(@RequestBody Map<String, Object> map) {
        List<Long> poDetlIds = new ArrayList<>();
        if (!Objects.isNull(map.get("ids"))) {
            poDetlIds = JSONArray.parseArray(JSONArray.toJSONString(map.get("ids")), Long.class);
            map.remove("ids");
        }
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<DeliveryItem, BaseParam> pageParam = new PageParam<>(baseParam, DeliveryItem.class);
        QueryWrapper<DeliveryItem> queryWrapper = pageParam.buildWrapper(true);
        if (!poDetlIds.isEmpty()) {
            queryWrapper.in("id", poDetlIds);
        } else {
            return R.ok();
        }
        return R.ok().add(deliveryItemService.page(pageParam, queryWrapper));
    }
    @PreAuthorize("hasAuthority('manager:deliveryItem:list')")
    @PostMapping("/deliveryItem/list")
    public R list(@RequestBody Map<String, Object> map) {
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -8,8 +8,10 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
import com.vincent.rsf.server.manager.entity.DeliveryItem;
import com.vincent.rsf.server.manager.entity.excel.OutStockTemplate;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.enums.OrderWorkType;
@@ -43,7 +45,6 @@
@RestController
@Api(tags = "出库单据")
public class OutStockController extends BaseController {
    Logger logger = LoggerFactory.getLogger(OutStockController.class);
    @Autowired
@@ -166,6 +167,21 @@
        return outStockService.cancelOutOrder(id);
    }
    @PreAuthorize("hasAuthority('manager:outStock:update')")
    @ApiOperation("删除已生成明细")
    @GetMapping("/outStock/items/cancel/{ids}")
    public R cancel(@PathVariable Long[] ids) {
        List<Long> list = Arrays.asList(ids);
        if (list.isEmpty()) {
            return R.error("参数不能为空!!");
        }
        List<AsnOrderItem> orderItems = outStockItemService.list(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getId, list));
        if (orderItems.isEmpty()) {
            throw new CoolException("单据明细不存在!!");
        }
        return outStockService.cancelOutOrderByItems(orderItems);
    }
    @PreAuthorize("hasAuthority('manager:outStock:list')")
    @PostMapping("/outStock/export")
@@ -216,8 +232,8 @@
        if (Objects.isNull(params.get("ids"))) {
            return R.error("参数不能为空!!");
        }
        List<Long> ids = (List<Long>) params.get("ids");
        return outStockService.genOutStock(ids, getLoginUserId());
        List<DeliveryItem> items = JSON.parseArray(JSONObject.toJSONString(params.get("ids")), DeliveryItem.class);
        return outStockService.genOutStock(items, getLoginUserId());
    }
    @PreAuthorize("hasAuthority('manager:outStock:update')")
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
@@ -157,6 +157,7 @@
        return R.ok().add(vos);
    }
    @PreAuthorize("hasAuthority('manager:outStockItem:list')")
    @PostMapping("/outStockItem/export")
    @ApiOperation("导出出库单明细")
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java
@@ -6,6 +6,8 @@
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
import com.vincent.rsf.server.manager.entity.DeliveryItem;
import java.util.List;
@@ -13,7 +15,7 @@
    R cancelOutOrder(String id);
    R genOutStock(List<Long> ids, Long loginUserId);
    R genOutStock(List<DeliveryItem> ids, Long loginUserId);
    R generateWaves(List<Long> ids);
@@ -26,4 +28,6 @@
    R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId, Long outId);
    R getSiteNos();
    R cancelOutOrderByItems(List<AsnOrderItem> orderItems);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -171,13 +171,9 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R genOutStock(List<Long> ids, Long loginUserId) {
        if (Objects.isNull(ids) || ids.isEmpty()) {
            throw new CoolException("参数不能为空!!");
        }
        List<DeliveryItem> items = deliveryItemService.list(new LambdaQueryWrapper<DeliveryItem>().in(DeliveryItem::getId, ids));
    public R genOutStock(List<DeliveryItem> items, Long loginUserId) {
        if (items.isEmpty()) {
            throw new CoolException("单据不存在!!");
            throw new CoolException("参数不能为空!!");
        }
        Map<Long, List<DeliveryItem>> listMap = items.stream().collect(Collectors.groupingBy(DeliveryItem::getDeliveryId));
        listMap.keySet().forEach(key -> {
@@ -205,15 +201,23 @@
            }
            List<AsnOrderItem> orderItems = new ArrayList<>();
            listMap.get(key).forEach(item -> {
                DeliveryItem deliveryItem = deliveryItemService.getById(item.getId());
                AsnOrderItem orderItem = new AsnOrderItem();
                Double anfme = Math.round((item.getAnfme() - item.getWorkQty() - item.getQty()) * 10000) / 10000.0;
                if (item.getAnfme().compareTo(0.0) <= 0) {
                    throw new CoolException("出库数量不能小于或等于零!!");
                }
                Double anfme = Math.round((deliveryItem.getAnfme() - item.getAnfme()) * 10000) / 10000.0;
                if (anfme.compareTo(0.0) < 0) {
                    throw new CoolException("出库数量不足!!");
                }
                BeanUtils.copyProperties(item, orderItem);
                orderItem.setId(null)
                        .setPoCode(order.getPoCode())
                        .setMaktx(item.getMaktx())
                        .setMatnrCode(item.getMatnrCode())
                        .setFieldsIndex(item.getFieldsIndex())
                        .setAnfme(anfme)
                        .setAnfme(item.getAnfme())
                        .setWorkQty(0.0)
                        .setAsnId(order.getId())
                        .setAsnCode(order.getCode())
@@ -257,7 +261,6 @@
                    .eq(Delivery::getId, key))) {
                throw new CoolException("主单修改失败!!");
            }
        });
        return R.ok();
    }
@@ -512,6 +515,7 @@
    /**
     * 获取出库站点
     *
     * @return
     */
    @Override
@@ -524,6 +528,47 @@
        return R.ok(sites);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R cancelOutOrderByItems(List<AsnOrderItem> orderItems) {
        Map<Long, List<AsnOrderItem>> listMap = orderItems.stream().collect(Collectors.groupingBy(AsnOrderItem::getAsnId));
        for (Long key : listMap.keySet()) {
            AsnOrder order = this.getById(key);
            if (Objects.isNull(order)) {
                throw new CoolException("单据不存在!!");
            }
            List<AsnOrderItem> items = listMap.get(key);
            if (!items.isEmpty()) {
                for (AsnOrderItem orderItem : items) {
                    DeliveryItem deliveryItem = deliveryItemService.getById(orderItem.getPoDetlId());
                    Double workQty = Math.round((deliveryItem.getWorkQty() - orderItem.getAnfme()) * 10000) / 10000.0;
                    deliveryItem.setWorkQty(workQty.compareTo(0.0) >= 0 ? workQty : 0);
                    if (!deliveryItemService.updateById(deliveryItem)) {
                        throw new CoolException("DO单明细更新失败!!");
                    }
                    Delivery delivery = deliveryService.getOne(new LambdaQueryWrapper<Delivery>().eq(Delivery::getCode, orderItem.getPoCode()));
                    if (!Objects.isNull(delivery)) {
                        Double wkQty = Math.round((delivery.getWorkQty() - delivery.getAnfme()) * 10000) / 10000.0;
                        delivery.setWorkQty(wkQty.compareTo(0.0) >= 0 ? wkQty : 0).setExceStatus(POExceStatus.PO_EXCE_STATUS_UN_EXCE.val);
                        if (!deliveryService.updateById(delivery)) {
                            throw new CoolException("DO单据修改失败!!");
                        }
                    }
                }
            }
            if (!this.remove(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, key))) {
                throw new CoolException("主单删除失败!!");
            }
            if (!outStockItemService.remove(new LambdaQueryWrapper<AsnOrderItem>()
                    .eq(AsnOrderItem::getAsnId, key))) {
                throw new CoolException("单据明细删除失败!!");
            }
        }
        return R.ok("操作成功");
    }
    private List<LocItem> getEfficiencyFirstItemList(AsnOrderItem asnOrderItem) {
        LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>();