From 786572b2bffe9ba196a56f4b0bb7098568dbf342 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 26 三月 2026 16:10:02 +0800
Subject: [PATCH] #pda生产直送

---
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/MenuController.java         |   28 ++++++
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java           |    6 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java                      |   13 --
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/Menu.java                       |    4 +
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java |   22 +++--
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java  |  100 +++++++++++++++++++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/PdaGeneralParam.java        |    6 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskType.java                   |    7 +
 8 files changed, 164 insertions(+), 22 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java
index 9c4bdaa..c8423f8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java
@@ -206,18 +206,22 @@
        return pdaOutStockService.containerRebinding(param,getLoginUserId());
     }
 
-    @PostMapping("/orderOut/buffStore/callEmpty")
-    @ApiOperation("鐏屾《鍏ュ簱鍛煎彨绌烘《")
-    public R buffStoreCallEmpty(@RequestBody PdaGeneralParam param) {
-        param.getSta1();
-        return R.ok();
+    @PostMapping("/orderOut/getOrderItem")
+    @ApiOperation("鐏屾《鍏ュ簱鍛煎彨鏂版枡")
+    public R getOrderItem(@RequestBody PdaGeneralParam param) {
+        return pdaOutStockService.getOrderItem(param);
     }
 
-    @PostMapping("/orderOut/buffStore/callNewMat")
+    @PostMapping("/orderOut/getStationArea")
     @ApiOperation("鐏屾《鍏ュ簱鍛煎彨鏂版枡")
-    public R buffStoreCallNewMat(@RequestBody PdaGeneralParam param) {
-        param.getSta2();
-        return R.ok();
+    public R getStationArea(@RequestBody PdaGeneralParam param) {
+        return pdaOutStockService.getStationArea(param);
+    }
+
+    @PostMapping("/orderOut/productionDirectDelivery")
+    @ApiOperation("鐢熶骇鐩撮��")
+    public R productionDirectDelivery(@RequestBody PdaGeneralParam param) {
+        return pdaOutStockService.productionDirectDelivery(param,getLoginUserId());
     }
 
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/PdaGeneralParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/PdaGeneralParam.java
index 3e405fd..e4d1ded 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/PdaGeneralParam.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/PdaGeneralParam.java
@@ -2,6 +2,7 @@
 
 import com.vincent.rsf.server.manager.entity.LocItem;
 import com.vincent.rsf.server.manager.entity.TaskItem;
+import com.vincent.rsf.server.manager.entity.WkOrderItem;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
@@ -11,6 +12,11 @@
 @Accessors(chain = true)
 public class PdaGeneralParam {
 
+    //鐢熶骇鐩撮��
+    private String orderNo;
+    private Long stationAreaId;
+    private List<WkOrderItem> wkOrderItems;
+
     // 瀹瑰櫒鍙�
     private String containerNo;
     // 鎺ラ┏绔欏彿
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java
index 13bea5d..a6a4511 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java
@@ -21,5 +21,11 @@
     R containerRebinding(PdaGeneralParam param,Long loginUserId);
 
     R taskItemList(PdaGeneralParam param, Long loginUserId);
+
+    R getOrderItem(PdaGeneralParam param);
+
+    R getStationArea(PdaGeneralParam param);
+
+    R productionDirectDelivery(PdaGeneralParam param,Long loginUserId);
 }
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
index 928f371..8390a0a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
@@ -16,10 +16,12 @@
 import com.vincent.rsf.server.manager.enums.*;
 import com.vincent.rsf.server.manager.service.*;
 import com.vincent.rsf.server.manager.service.impl.BasContainerServiceImpl;
+import com.vincent.rsf.server.manager.service.impl.BasStationAreaServiceImpl;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import lombok.Synchronized;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -56,6 +58,8 @@
     private WaitPakinService waitPakinService;
     @Autowired
     private WaitPakinItemService waitPakinItemService;
+    @Autowired
+    private BasStationAreaServiceImpl basStationAreaService;
 
     @Override
     public R getOutStockTaskItem(String barcode) {
@@ -321,6 +325,102 @@
     }
 
     @Override
+    public R getOrderItem(PdaGeneralParam param) {
+        WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>()
+                .eq(WkOrder::getCode, param.getOrderNo())
+                .eq(WkOrder::getType,OrderType.ORDER_OUT.type)
+        );
+        if (null == order) {
+            throw new CoolException("鏈壘鍒板搴旇鍗�");
+        }
+        if (!order.getExceStatus().equals(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val) && !order.getExceStatus().equals(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) ) {
+            throw new CoolException("褰撳墠璁㈠崟涓嶅湪鍙墽琛岀姸鎬�");
+        }
+        List<WkOrderItem> list = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
+                .eq(WkOrderItem::getOrderId, order.getId())
+                .apply("anfme <> work_qty")
+        );
+
+        return R.ok(list);
+    }
+
+    @Override
+    public R getStationArea(PdaGeneralParam param) {
+        return R.ok(basStationAreaService.list());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R productionDirectDelivery(PdaGeneralParam param,Long loginUserId) {
+        WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>()
+                .eq(WkOrder::getCode, param.getOrderNo())
+                .eq(WkOrder::getType,OrderType.ORDER_OUT.type)
+        );
+        if (null == order) {
+            throw new CoolException("鏈壘鍒板搴旇鍗�");
+        }
+        ArrayList<String> arrayList = new ArrayList<>();
+        arrayList.add(param.getStationAreaId().toString());
+        Task task = new Task();
+        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
+        task.setTaskCode(ruleCode)
+             .setOrgSite(param.getSta1())
+            .setSort(Constants.TASK_SORT_DEFAULT_VALUE)
+            .setUpdateBy(loginUserId)
+            .setCreateBy(loginUserId)
+            .setCreateTime(new Date())
+            .setUpdateTime(new Date())
+            .setTaskStatus(TaskStsType.MISSION_INITIAL.id)
+            .setBarcode(param.getContainerNo())
+            .setTargSiteArea(arrayList)
+            .setTaskType(TaskType.TASK_TYPE_PDD.type);
+
+        if (!taskService.save(task)) {
+            throw new CoolException("浠诲姟鍒涘缓澶辫触锛侊紒");
+        }
+        List<TaskItem> taskItems = new ArrayList<>();
+        param.getWkOrderItems().forEach(item -> {
+            TaskItem taskItem = new TaskItem();
+            BeanUtils.copyProperties(item, taskItem);
+            taskItem.setTaskId(task.getId())
+                    .setAnfme(item.getDemandQty())
+                    .setWorkQty(0D)
+                    .setBatch(item.getBatch())
+                    .setUpdateBy(loginUserId)
+                    .setCreateBy(loginUserId)
+                    .setCreateTime(new Date())
+                    .setUpdateTime(new Date())
+                    .setSplrBatch(item.getBatch())
+                    .setPlatWorkCode(item.getPlatWorkCode())
+                    .setPlatItemId(item.getPlatItemId())
+                    .setOrderType(OrderType.ORDER_OUT.type)
+                    .setWkType(Short.parseShort(order.getWkType()))
+                    .setSourceCode(order.getCode())
+                    .setSourceId(order.getId());
+            taskItems.add(taskItem);
+
+            item.setWorkQty(item.getWorkQty()+item.getDemandQty());
+        });
+        if (!taskItemService.saveBatch(taskItems)) {
+            throw new CoolException("浠诲姟鏄庣粏鐢熸垚澶辫触锛侊紒");
+        }
+        if (!order.getExceStatus().equals(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val)) {
+            order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val);
+            order.setUpdateBy(loginUserId);
+            order.setUpdateTime(new Date());
+            if (!asnOrderService.updateById(order)){
+                throw new CoolException("鍗曟嵁鐘舵�佹洿鏂板け璐ワ紒锛�");
+            }
+        }
+        if (!asnOrderItemService.updateBatchById(param.getWkOrderItems())) {
+            throw new CoolException("鍗曟嵁鏄庣粏鏇存柊澶辫触锛侊紒");
+        }
+
+        return R.ok();
+
+    }
+
+    @Override
     public R getWaveListItem(String barcode) {
         LambdaQueryWrapper<Wave> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(!Cools.isEmpty(barcode), Wave::getCode, barcode);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
index 7e0f291..c322df8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.vincent.rsf.server.manager.enums.TaskType;
 import com.vincent.rsf.server.system.constant.DictTypeCode;
 import com.vincent.rsf.server.system.entity.DictData;
 import com.vincent.rsf.server.system.service.DictDataService;
@@ -315,17 +316,7 @@
     }
 
     public String getTaskType$() {
-        if (Cools.isEmpty(this.taskType)) {
-            return null;
-        }
-        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
-        DictData dictDatas = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
-                .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_TASK_TYPE)
-                .eq(DictData::getValue, this.taskType));
-        if (Objects.isNull(dictDatas) || Objects.isNull(dictDatas.getLabel())) {
-            return null;
-        }
-        return dictDatas.getValue() + "." + dictDatas.getLabel();
+        return TaskType.getTypeDesc(taskType);
     }
 
     public String getStartTime$(){
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskType.java
index 630403a..5076b1d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskType.java
@@ -21,6 +21,7 @@
     TASK_TYPE_CHECK_OUT("107", "鐩樼偣鍑哄簱"),
     TASK_TYPE_CROSS_DOCKING_OUT("109", "澶囪揣"),
     TASK_TYPE_EMPTY_OUT("110", "绌烘澘鍑哄簱"),
+    TASK_TYPE_PDD("111", "鐢熶骇鐩撮��"),
     ;
     public Integer type;
     public String desc;
@@ -46,6 +47,12 @@
             return TaskType.TASK_TYPE_MERGE_IN.desc;
         } else if (TaskType.TASK_TYPE_CHECK_IN.type.equals(type)) {
             return TaskType.TASK_TYPE_CHECK_IN.desc;
+        } else if (TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type.equals(type)) {
+            return TaskType.TASK_TYPE_CROSS_DOCKING_OUT.desc;
+        } else if (TaskType.TASK_TYPE_EMPTY_OUT.type.equals(type)) {
+            return TaskType.TASK_TYPE_EMPTY_OUT.desc;
+        }else if (TaskType.TASK_TYPE_PDD.type.equals(type)) {
+            return TaskType.TASK_TYPE_PDD.desc;
         }
 
         return null;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/MenuController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/MenuController.java
index 117c744..3a046f3 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/MenuController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/MenuController.java
@@ -10,6 +10,7 @@
 import com.vincent.rsf.server.common.domain.BaseParam;
 import com.vincent.rsf.server.common.domain.KeyValVo;
 import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.common.service.RedisService;
 import com.vincent.rsf.server.common.utils.ExcelUtil;
 import com.vincent.rsf.server.common.utils.NodeUtils;
 import com.vincent.rsf.server.system.entity.Menu;
@@ -24,8 +25,14 @@
 @RestController
 public class MenuController extends BaseController {
 
+    private static final String MENU_TREE_CACHE_FLAG = "MENU_TREE";
+    private static final String MENU_TREE_CACHE_KEY = "FULL_TREE";
+    private static final int MENU_TREE_CACHE_TTL_SECONDS = 300;
+
     @Autowired
     private MenuService menuService;
+    @Autowired
+    private RedisService redisService;
 
     @PreAuthorize("hasAuthority('system:menu:list')")
     @PostMapping("/menu/page")
@@ -48,8 +55,7 @@
 //        QueryWrapper<Menu> wrapper = param.buildWrapper(true, queryWrapper -> queryWrapper.orderByAsc("sort"));
 //        List<Menu> menus = menuService.list(wrapper);
 //        return R.ok().add(Utils.toTreeData(menus, 0L, Menu::getParentId, Menu::getId, Menu::setChildren));
-        List<Menu> menuList = menuService.list(new LambdaQueryWrapper<Menu>().orderByAsc(Menu::getSort));
-        List<Menu> treeData = Utils.toTreeData(menuList, 0L, Menu::getParentId, Menu::getId, Menu::setChildren);
+        List<Menu> treeData = getMenuTreeData();
         if (!Cools.isEmpty(map.get("condition"))) {
             Utils.treeRemove(treeData, String.valueOf(map.get("condition")), Menu::getName, Menu::getChildren);
             Utils.treeRemove(treeData, String.valueOf(map.get("condition")), Menu::getName, Menu::getChildren);
@@ -94,6 +100,7 @@
         if (!menuService.save(menu)) {
             return R.error("Save Fail");
         }
+        evictMenuTreeCache();
         return R.ok("Save Success").add(menu);
     }
 
@@ -120,6 +127,7 @@
         if (!menuService.updateById(menu)) {
             return R.error("Update Fail");
         }
+        evictMenuTreeCache();
         return R.ok("Update Success").add(menu);
     }
 
@@ -130,6 +138,7 @@
         if (!menuService.removeByIds(Arrays.asList(ids))) {
             return R.error("Delete Fail");
         }
+        evictMenuTreeCache();
         return R.ok("Delete Success").add(ids);
     }
 
@@ -153,5 +162,20 @@
         ExcelUtil.build(ExcelUtil.create(menuService.list(), Menu.class), response);
     }
 
+    private List<Menu> getMenuTreeData() {
+        List<Menu> treeData = redisService.get(MENU_TREE_CACHE_FLAG, MENU_TREE_CACHE_KEY);
+        if (treeData != null) {
+            return treeData;
+        }
+        List<Menu> menuList = menuService.list(new LambdaQueryWrapper<Menu>().orderByAsc(Menu::getSort));
+        treeData = Utils.toTreeData(menuList, 0L, Menu::getParentId, Menu::getId, Menu::setChildren);
+        redisService.set(MENU_TREE_CACHE_FLAG, MENU_TREE_CACHE_KEY, treeData, MENU_TREE_CACHE_TTL_SECONDS);
+        return treeData;
+    }
+
+    private void evictMenuTreeCache() {
+        redisService.delete(MENU_TREE_CACHE_FLAG, MENU_TREE_CACHE_KEY);
+    }
+
 }
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/Menu.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/Menu.java
index 4bc0f3a..07d32e0 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/Menu.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/Menu.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.common.SpringUtils;
 import com.vincent.rsf.server.system.service.TenantService;
@@ -187,6 +188,7 @@
         }
     }
 
+    @JsonIgnore
     public String getTenantId$(){
         TenantService service = SpringUtils.getBean(TenantService.class);
         Tenant tenant = service.getById(this.tenantId);
@@ -203,6 +205,7 @@
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
     }
 
+    @JsonIgnore
     public String getCreateBy$(){
         UserService service = SpringUtils.getBean(UserService.class);
         User user = service.getById(this.createBy);
@@ -219,6 +222,7 @@
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
     }
 
+    @JsonIgnore
     public String getUpdateBy$(){
         UserService service = SpringUtils.getBean(UserService.class);
         User user = service.getById(this.updateBy);

--
Gitblit v1.9.1