From 2938aa734a2cf0baf93fdced92ea21e37f187365 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 10 六月 2025 11:05:39 +0800
Subject: [PATCH] 出库单下发执行生成任务明细

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java       |   56 +++++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java        |   27 +++--
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java                |    3 
 rsf-admin/src/page/orders/outStock/OutStockPublic.jsx                                               |   73 ++++++++++----
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java          |   30 +++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java |   34 ++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java                         |    4 
 rsf-admin/src/page/orders/outStock/OutOrderModal.jsx                                                |    2 
 rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx                                                 |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java               |    8 +
 rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java                      |    5 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java           |   16 ++
 rsf-server/src/main/resources/application.yml                                                       |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java                 |    2 
 14 files changed, 222 insertions(+), 43 deletions(-)

diff --git a/rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx b/rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx
index aa6ffd3..7667817 100644
--- a/rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx
@@ -20,11 +20,9 @@
 import TreeSelectInput from "@/page/components/TreeSelectInput";
 const AsnWareModal = (props) => {
     const { open, setOpen, data, setData } = props;
-
     const translate = useTranslate();
     const notify = useNotify();
     const refresh = useRefresh();
-
     const handleClose = (event, reason) => {
         if (reason !== "backdropClick") {
             setOpen(false);
@@ -55,7 +53,6 @@
         const hasarr = data.map(el => +el.matnrId)
         const selectedData = selectedRows.filter(item => !hasarr.includes(item)).map(id => (tableData.find(row => row.id === id)));
         const value = selectedData.map((el => {
-            console.log(el);
             const dynamicFields = dyFields.reduce((acc, item) => {
                 acc[item.fields] = el['extendFields']?.[item.fields] || '';
                 return acc;
diff --git a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
index ba39f27..01283a6 100644
--- a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
@@ -13,7 +13,6 @@
     ExportButton,
     BulkDeleteButton,
     WrapperField,
-    Toolbar,
     useRecordContext,
     useTranslate,
     useNotify,
@@ -45,7 +44,6 @@
 import { Grid, margin, Stack, width } from "@mui/system";
 import request from '@/utils/request';
 import SaveIcon from '@mui/icons-material/Save';
-import debounce from "lodash/debounce";
 import CheckCircleIcon from '@mui/icons-material/CheckCircle';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
diff --git a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
index 5b60940..b3b7062 100644
--- a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
@@ -1,4 +1,4 @@
-import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText, Tooltip } from "@mui/material";
+import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText, Tooltip, IconButton } from "@mui/material";
 import React, { useState, useRef, useEffect, useMemo } from "react";
 import {
     List,
@@ -13,7 +13,6 @@
     ExportButton,
     BulkDeleteButton,
     WrapperField,
-    Toolbar,
     useRecordContext,
     useTranslate,
     useNotify,
@@ -36,14 +35,17 @@
     SimpleForm,
     required,
     Form,
+    useRefresh,
+    useRedirect,
 } from 'react-admin';
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE } from '@/config/setting';
 import { styled } from '@mui/material/styles';
-import { DataGrid, useGridApiContext } from '@mui/x-data-grid';
+import { DataGrid, useGridApiContext, GridActionsCellItem, useGridApiRef } from '@mui/x-data-grid';
 import request from '@/utils/request';
 import ConfirmationNumberOutlinedIcon from '@mui/icons-material/ConfirmationNumberOutlined';
 import CloseSharpIcon from '@mui/icons-material/CloseSharp';
 import ConfirmButton from '../../components/ConfirmButton';
+import { Delete, Edit, Add } from '@mui/icons-material';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -60,8 +62,8 @@
 
 const OutStockPublic = (props) => {
     const { record, open, setOpen } = props;
-    const dataGridRef = useRef(null);
     const notify = useNotify();
+    const gridRef = useGridApiRef();
     const [rows, setRows] = useState({});
     const translate = useTranslate();
     const [selectedIds, setSelectedIds] = React.useState([]);
@@ -91,11 +93,14 @@
             [name]: value
         }));
     };
+
+    gridRef.current = useGridApiRef();
+
     return (
         <>
             <Box>
                 <Grid sx={{ display: "flex" }} container rowSpacing={2} columnSpacing={2}>
-                    <Grid item xl={6} gap={2} >
+                    <Grid item xl={5.7} gap={2} >
                         <Card>
                             <Form>
                                 <ReferenceInput
@@ -124,9 +129,7 @@
                                 empty={false}
                                 filter={{ asnId: record?.id, deleted: 0 }}
                                 sort={{ field: "create_time", order: "desc" }}
-                                actions={(
-                                    <SelectColumnsButton preferenceKey='outStock' />
-                                )}
+                                actions={false}
                                 perPage={DEFAULT_ITEM_PAGE_SIZE}
                             >
                                 <LinearProgress
@@ -152,12 +155,13 @@
                             </List>
                         </Card>
                     </Grid>
-                    <Grid item xl={6} gap={2}>
+                    <Grid item xl={6.3} gap={2}>
                         <Card>
-                            <Box>
+                            <Box sx={{ height: 500, width: '100%' }}>
                                 <DataGrid
                                     rows={rows}
                                     columns={columns}
+                                    apiRef={gridRef}
                                     initialState={{
                                         pagination: {
                                             paginationModel: {
@@ -165,17 +169,16 @@
                                             },
                                         },
                                     }}
-                                    ref={dataGridRef}
                                     checkboxSelection
+                                    pageSizeOptions={[15, 25, 35, 45]}
                                     onRowSelectionModelChange={(ids) => {
                                         setSelectedIds(ids)
                                     }}
-                                    pageSizeOptions={[15, 25, 35, 45]}
                                 />
                             </Box>
                             <Box sx={{ textAlign: 'center' }}>
                                 <CloseButton setOpen={setOpen} />
-                                <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} />
+                                <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} gridRef={gridRef} />
                             </Box>
                         </Card>
                     </Grid>
@@ -187,12 +190,20 @@
 
 
 //鎻愪氦鎸夐挳
-const SubmitButton = ({ selectedIds, setSelectedIds }) => {
-    const submit = () => {
-        if (selectedIds.length < 1) { return }
-        console.log(selectedIds);
+const SubmitButton = ({ selectedIds, setSelectedIds, gridRef }) => {
+    const notify = useNotify();
+    const refresh = useRefresh();
+    const redirect = useRedirect();    
+    const submit = async () => {
+        const items = gridRef.current?.getSortedRows();
+        const { data: { code, data, msg } } = await request.post('/outStock/generate/tasks', { items });
+        if (code == 200) {
+            refresh();
+            redirect("/task")
+        } else {
+            notify(msg);
+        }
     }
-
     return (
         <ConfirmButton
             label="toolbar.confirm"
@@ -220,14 +231,13 @@
     )
 }
 
-
 const columns = [
     { field: 'id', headerName: 'ID', width: 40 },
     { field: 'locCode', headerName: '搴撲綅', width: 110 },
     { field: 'barcode', headerName: '瀹瑰櫒', width: 120 },
     { field: 'batch', headerName: '鎵规', width: 90 },
     { field: 'unit', headerName: '鍗曚綅', width: 90 },
-    { field: 'workQty', headerName: '鏈鍑哄簱鏁伴噺', width: 110 },
+    { field: 'outQty', headerName: '鏈鍑哄簱鏁伴噺', width: 110 },
     {
         field: 'siteNo',
         headerName: '鍑哄簱鍙�',
@@ -241,8 +251,31 @@
             <OutStockSite {...params} />
         ),
     },
+    {
+        field: 'actions',
+        type: 'actions',
+        headerName: '鎿嶄綔',
+        with: 120,
+        getActions: (params) => [
+            <GridActionsCellItem
+                icon={<Delete />}
+                label="Delete"
+                onClick={() => handleDelete(params.row.id)}
+            />,
+        ]
+    },
 ]
 
+/**
+ * 鍒犻櫎浜嬩欢
+ * @param {*} params 
+ */
+const handleDelete = (params) => {
+    console.log(params);
+
+}
+
+
 const OutStockSiteNo = React.memo(function OutStockSiteNo(props) {
     const { value } = props;
     if (!value) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java
index 8940c25..f4be3d9 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java
@@ -86,7 +86,13 @@
         }
         param.setType(Constants.TASK_TYPE_OUT_STOCK);
 
-        return locItemService.generateTask(param, getLoginUserId());
+        try {
+            locItemService.generateTask(param, getLoginUserId());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        return R.ok();
     }
 
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java
index 4441c62..406e377 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java
@@ -103,6 +103,11 @@
     public static final String TASK_TYPE_OUT_CHECK = "check";
 
     /**
+     * 鍗曟嵁鍑哄簱
+     */
+    public static final String TASK_TYPE_ORDER_OUT_STOCK = "OrderOutStock";
+
+    /**
      * 鎷f枡鍑哄簱
      */
     public static final String TASK_TYPE_OUT_PICK = "pick";
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java
index 612bce4..108539b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java
@@ -97,7 +97,13 @@
         }
         param.setType(Constants.TASK_TYPE_OUT_STOCK);
 
-        return locItemService.generateTask(param, getLoginUserId());
+        try {
+            locItemService.generateTask(param, getLoginUserId());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        return R.ok();
     }
 
     /**
@@ -129,7 +135,13 @@
         }
         map.setType(Constants.TASK_TYPE_OUT_CHECK);
 
-        return R.ok("浠诲姟鐢熸垚鎴愬姛").add(locItemService.generateTask(map, getLoginUserId()));
+        try {
+            locItemService.generateTask(map, getLoginUserId());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        return R.ok("浠诲姟鐢熸垚鎴愬姛");
     }
 
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
index 83c1aaa..9ee7129 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -1,5 +1,6 @@
 package com.vincent.rsf.server.manager.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -8,6 +9,7 @@
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
+import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
 import com.vincent.rsf.server.manager.enums.OrderType;
 import com.vincent.rsf.server.manager.enums.OrderWorkType;
 import com.vincent.rsf.server.common.annotation.OperationLog;
@@ -28,6 +30,8 @@
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -38,6 +42,8 @@
 @RestController
 @Api(tags = "鍑哄簱鍗曟嵁")
 public class OutStockController extends BaseController {
+
+    Logger logger = LoggerFactory.getLogger(OutStockController.class);
 
     @Autowired
     private OutStockService outStockService;
@@ -235,11 +241,31 @@
 
     @PostMapping("/outStock/order/getOutTaskItems")
     @PreAuthorize("hasAuthority('manager:outStock:list')")
-    public R getOrderOutTaskItem(@RequestBody OrderOutTaskParam param){
-        if (Cools.isEmpty(param)){
+    public R getOrderOutTaskItem(@RequestBody OrderOutTaskParam param) {
+        if (Cools.isEmpty(param)) {
             return R.error("鍙傛暟涓嶈兘涓虹┖");
         }
 
         return outStockService.getOrderOutTaskItem(param);
     }
+
+
+    /**
+     * 鍑哄簱鍗曠敓鎴愬嚭搴撲换鍔�
+     * @param params
+     * @return
+     */
+    @PostMapping("/outStock/generate/tasks")
+    @ApiOperation("鍑哄簱鍗曠敓鎴愬嚭搴撲换鍔�")
+    @PreAuthorize("hasAuthority('manager:outStock:list')")
+    public R genOutStockTask( @RequestBody Map<String, Object> params) {
+        if (Cools.isEmpty()) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        List<OutStockToTaskParams> taskParams = JSONArray.parseArray(JSONArray.toJSONString(params.get("items")), OutStockToTaskParams.class);
+
+        return  outStockService.genOutStockTask(taskParams, getLoginUserId());
+    }
+
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java
new file mode 100644
index 0000000..0cb5e8d
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java
@@ -0,0 +1,34 @@
+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;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "OutStockToTaskParams", description = "鍑哄簱鍗曠敓鎴愪换鍔″弬鏁�")
+public class OutStockToTaskParams {
+
+    @ApiModelProperty("搴撲綅")
+    private String locCode;
+
+    @ApiModelProperty("搴撲綅鏄庣粏ID")
+    private Long id;
+
+    @ApiModelProperty("鎵樼洏鐮�")
+    private String barcode;
+
+    @ApiModelProperty("鎵规")
+    private String batch;
+
+    @ApiModelProperty("鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty("鏁伴噺")
+    private Double outQty;
+
+    @ApiModelProperty("绔欑偣")
+    private String siteNo;
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
index 96b195d..3f72e94 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
@@ -172,6 +172,10 @@
     @TableField(exist = false)
     private Map<String, String> extendFields;
 
+    @ApiModelProperty("鎵樼洏鐮�")
+    @TableField(exist = false)
+    private String barcode;
+
     /**
      * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
      */
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
index 2e24cfe..44a86d7 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
@@ -8,7 +8,7 @@
 
 public interface LocItemService extends IService<LocItem> {
 
-    R generateTask(LocToTaskParams map, Long loginUserId);
+    void generateTask(LocToTaskParams map, Long loginUserId) throws Exception;
 
     Task genMoveTask(LocToTaskParams map, Long loginUserId);
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java
index 152874d..a4db92a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java
@@ -4,6 +4,7 @@
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
 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 java.util.List;
@@ -21,4 +22,6 @@
     R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId);
 
     R getOrderOutTaskItem(OrderOutTaskParam param);
+
+    R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
index ca4d6b6..7d8c06a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -7,7 +7,6 @@
 import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto;
 import com.vincent.rsf.server.api.service.WcsService;
 import com.vincent.rsf.server.api.utils.LocUtils;
-import com.vincent.rsf.server.api.utils.SlaveProperties;
 import com.vincent.rsf.server.common.constant.Constants;
 import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
 import com.vincent.rsf.server.manager.entity.*;
@@ -19,6 +18,8 @@
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import lombok.Synchronized;
 import org.apache.commons.lang3.StringUtils;
+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;
@@ -29,6 +30,8 @@
 
 @Service("locItemService")
 public class LocItemServiceImpl extends ServiceImpl<LocItemMapper, LocItem> implements LocItemService {
+
+    Logger logger = LoggerFactory.getLogger(LocItemServiceImpl.class);
 
     @Autowired
     private LocService locService;
@@ -55,7 +58,7 @@
     @Override
     @Synchronized
     @Transactional(rollbackFor = Exception.class)
-    public R generateTask(LocToTaskParams map, Long loginUserId) {
+    public void generateTask(LocToTaskParams map, Long loginUserId) throws Exception {
         if (Objects.isNull(map.getSiteNo())) {
             throw new CoolException("绔欑偣涓嶈兘涓虹┖锛�");
         }
@@ -69,16 +72,21 @@
         listMap.keySet().forEach(key -> {
             Task task = new Task();
             Loc loc = locService.getById(key);
+            logger.info("搴撲綅锛�>{}<UNK>", loc.getCode());
+
             if (Objects.isNull(loc)) {
                 throw new CoolException("鏁版嵁閿欒锛氭墍閫夊簱瀛樹俊鎭笉瀛樺湪锛侊紒");
             }
+            if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) {
+                throw new CoolException("搴撲綅:" + loc.getCode() +  ",涓嶅浜嶧.鍦ㄥ簱鐘舵�侊紝涓嶅彲鎵цR.鍑哄簱棰勭害鎿嶄綔锛侊紒");
+            }
+
             loc.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
 
             if (!locService.updateById(loc)) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐ワ紒锛�");
             }
             Task moveTask = new Task();
-
             String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
             task.setOrgLoc(loc.getCode())
                     .setTaskCode(ruleCode)
@@ -101,12 +109,12 @@
             List<LocItem> locItemList = listMap.get(key);
             Double outQty = locItemList.stream().mapToDouble(LocItem::getOutQty).sum();
 
-            Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, loc.getBarcode()));
-            if (!Objects.isNull(serviceOne)) {
-                throw new CoolException("鎵樼洏浠诲姟鎵ц涓紝涓嶈兘閲嶅鍒涘缓锛�");
-            }
+//            Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, loc.getBarcode()));
+//            if (!Objects.isNull(serviceOne)) {
+//                throw new CoolException("鎵樼洏浠诲姟鎵ц涓紝涓嶈兘閲嶅鍒涘缓锛�");
+//            }
 
-            if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK)) {
+            if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK) || map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) {
                 Double useQty = Math.round((outQty + workQty) * 10000) / 10000.0;
                 if (orgQty.compareTo(useQty) > 0) {
                     //鎷f枡鍑哄簱
@@ -140,6 +148,7 @@
                 }
                 task.setTaskType(TaskType.TASK_TYPE_CHECK_OUT.type).setWarehType(deviceSite.getDevice());
             }
+
             if (!taskService.save(task)) {
                 throw new CoolException("浠诲姟鍒涘缓澶辫触锛侊紒");
             }
@@ -222,8 +231,6 @@
                 throw new CoolException("浠诲姟鏄庣粏鐢熸垚澶辫触锛侊紒");
             }
         });
-
-        return R.ok("浠诲姟鐢熸垚瀹屾垚锛�!");
     }
 
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
index 1194ff4..990e9ac 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -8,9 +8,12 @@
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.api.utils.LocUtils;
+import com.vincent.rsf.server.common.constant.Constants;
 import com.vincent.rsf.server.manager.controller.dto.ExistDto;
 import com.vincent.rsf.server.manager.controller.dto.OrderOutItemDto;
+import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
 import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
+import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
 import com.vincent.rsf.server.manager.enums.*;
 import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
 import com.vincent.rsf.server.manager.entity.*;
@@ -20,6 +23,8 @@
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import org.apache.commons.lang3.StringUtils;
+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;
@@ -40,6 +45,9 @@
  */
 @Service("outStockServiceImpl")
 public class OutStockServiceImpl extends ServiceImpl<AsnOrderMapper, AsnOrder> implements OutStockService {
+
+    public Logger logger = LoggerFactory.getLogger(this.getClass());
+
 
     @Autowired
     private AsnOrderItemService asnOrderItemService;
@@ -421,6 +429,51 @@
         return R.ok(locItems);
     }
 
+    /**
+     * 鐢熸垚鍑哄簱浠诲姟
+     * @param params
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId) {
+        if (params.isEmpty()) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+
+        //浼樺厛鐢熸垚娴呭簱浣嶄换鍔�
+        List<OutStockToTaskParams> Items = params.stream().sorted(Comparator.comparing(OutStockToTaskParams::getLocCode).thenComparing(item -> {
+            return LocUtils.isShallowLoc(item.getLocCode()) ? 1 : 0;
+        }).reversed()).collect(Collectors.toList());
+
+        for (OutStockToTaskParams param : Items) {
+            if (Objects.isNull(param)) {
+                continue;
+            }
+            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, param.getBarcode()));
+            if (!Objects.isNull(loc)) {
+                List<LocItem> locItems = new ArrayList<>();
+                LocItem locItem = locItemService.getById(param.getId());
+                locItem.setOutQty(param.getOutQty()).setBatch(param.getBatch());
+                locItems.add(locItem);
+
+                LocToTaskParams taskParams = new LocToTaskParams();
+                taskParams.setType(Constants.TASK_TYPE_OUT_STOCK)
+                        .setOrgLoc(loc.getCode())
+                        .setItems(locItems)
+                        .setSiteNo(param.getSiteNo());
+                try {
+                    locItemService.generateTask(taskParams, loginUserId);
+                } catch (Exception e) {
+                    logger.error("UNK", e);
+                    throw new CoolException(e.getMessage());
+                }
+            }
+        }
+
+        return R.ok();
+    }
+
     private List<LocItem> getEfficiencyFirstItemList(AsnOrderItem asnOrderItem) {
         QueryWrapper<LocItem> locItemQueryWrapper = new QueryWrapper<>();
         locItemQueryWrapper.eq("matnr_code", asnOrderItem.getMatnrCode());
@@ -463,7 +516,8 @@
                 if (issued.doubleValue() > 0) {
                     ExistDto existDto = new ExistDto().setBatch(locItem.getBatch()).setMatnr(locItem.getMatnrCode()).setLocNo(locItem.getLocCode());
                     if (existDtos.add(existDto)) {
-                        locItem.setWorkQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue());
+                        locItem.setOutQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue());
+                        locItem.setBarcode(loc.getBarcode());
                         OrderOutItemDto orderOutItemDto = new OrderOutItemDto();
                         orderOutItemDto.setLocItem(locItem);
                         List<DeviceSite> deviceSites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>()
diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml
index db51329..ac31a5b 100644
--- a/rsf-server/src/main/resources/application.yml
+++ b/rsf-server/src/main/resources/application.yml
@@ -25,7 +25,7 @@
   #  global-config:
   #    field-strategy: 0
   configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
     map-underscore-to-camel-case: true
     cache-enabled: true
     call-setters-on-nulls: true

--
Gitblit v1.9.1