From 5c0ac8adccb4d895148ee32ca7afc9a07d50e635 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期三, 21 五月 2025 18:47:13 +0800
Subject: [PATCH] 添加作业临时库存表 优化拣料出库作业

---
 rsf-server/src/main/java/locItemWorking.sql                                                         |   45 +++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemWorkingMapper.java            |   12 +
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java                   |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java                             |    2 
 rsf-server/src/main/resources/mapper/manager/LocItemWorkingMapper.xml                               |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java           |  117 ++++++++-
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java                            |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemWorkingController.java    |  110 +++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemWorkingService.java          |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItemWorking.java                  |  368 ++++++++++++++++++++++++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java                    |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java              |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemWorkingServiceImpl.java |   12 +
 13 files changed, 675 insertions(+), 18 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
index 48df947..f41c681 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
@@ -63,8 +63,10 @@
 
         return R.ok();
 
-
     }
 
 
+
+
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
index 3036d17..7a4af48 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
@@ -22,7 +22,7 @@
 //        generator.username="sa";
 //        generator.password="Zoneyung@zy56$";
 
-        generator.table = "man_bas_container";
+        generator.table = "man_loc_item_working";
         generator.tableDesc = "瀹瑰櫒绠$悊";
         generator.packagePath = "com.vincent.rsf.server.manager";
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemWorkingController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemWorkingController.java
new file mode 100644
index 0000000..a1478a7
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemWorkingController.java
@@ -0,0 +1,110 @@
+package com.vincent.rsf.server.manager.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+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.manager.entity.LocItemWorking;
+import com.vincent.rsf.server.manager.service.LocItemWorkingService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class LocItemWorkingController extends BaseController {
+
+    @Autowired
+    private LocItemWorkingService locItemWorkingService;
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
+    @PostMapping("/locItemWorking/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<LocItemWorking, BaseParam> pageParam = new PageParam<>(baseParam, LocItemWorking.class);
+        return R.ok().add(locItemWorkingService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
+    @PostMapping("/locItemWorking/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(locItemWorkingService.list());
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
+    @PostMapping({"/locItemWorking/many/{ids}", "/locItemWorkings/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(locItemWorkingService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
+    @GetMapping("/locItemWorking/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(locItemWorkingService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:save')")
+    @OperationLog("Create 瀹瑰櫒绠$悊")
+    @PostMapping("/locItemWorking/save")
+    public R save(@RequestBody LocItemWorking locItemWorking) {
+        locItemWorking.setCreateBy(getLoginUserId());
+        locItemWorking.setCreateTime(new Date());
+        locItemWorking.setUpdateBy(getLoginUserId());
+        locItemWorking.setUpdateTime(new Date());
+        if (!locItemWorkingService.save(locItemWorking)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(locItemWorking);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:update')")
+    @OperationLog("Update 瀹瑰櫒绠$悊")
+    @PostMapping("/locItemWorking/update")
+    public R update(@RequestBody LocItemWorking locItemWorking) {
+        locItemWorking.setUpdateBy(getLoginUserId());
+        locItemWorking.setUpdateTime(new Date());
+        if (!locItemWorkingService.updateById(locItemWorking)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(locItemWorking);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:remove')")
+    @OperationLog("Delete 瀹瑰櫒绠$悊")
+    @PostMapping("/locItemWorking/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!locItemWorkingService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
+    @PostMapping("/locItemWorking/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<LocItemWorking> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(LocItemWorking::getId, condition);
+        }
+        locItemWorkingService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
+    @PostMapping("/locItemWorking/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(locItemWorkingService.list(), LocItemWorking.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
index ea8eabb..d82bcf5 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -153,7 +153,11 @@
         if (Objects.isNull(id)) {
             throw new CoolException("鑳芥暟涓嶈兘涓虹┖锛侊紒");
         }
-        return taskService.pickTask(id);
+        try {
+            return taskService.pickTask(id);
+        } catch (Exception e) {
+            throw new CoolException(e.getMessage());
+        }
     }
 
 //    @PreAuthorize("hasAuthority('manager:task:update')")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItemWorking.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItemWorking.java
new file mode 100644
index 0000000..1dbf238
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItemWorking.java
@@ -0,0 +1,368 @@
+package com.vincent.rsf.server.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+@TableName("man_loc_item_working")
+public class LocItemWorking implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 涓诲崟ID
+     */
+    @ApiModelProperty(value= "涓诲崟ID")
+    private Long locId;
+
+    @ApiModelProperty("浠诲姟鏄庣粏ID")
+    private Long taskId;
+
+    /**
+     * 搴撲綅
+     */
+    @ApiModelProperty(value= "搴撲綅")
+    private String locCode;
+
+    /**
+     * 鍗曟嵁ID
+     */
+    @ApiModelProperty(value= "鍗曟嵁ID")
+    private Long orderId;
+
+    /**
+     * 鍗曟嵁绫诲瀷
+     */
+    @ApiModelProperty(value= "鍗曟嵁绫诲瀷")
+    private String type;
+
+    /**
+     * 璁㈠崟鏄庣粏id
+     */
+    @ApiModelProperty(value= "璁㈠崟鏄庣粏id")
+    private Long orderItemId;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    @ApiModelProperty(value= "涓氬姟绫诲瀷")
+    private Short wkType;
+
+    /**
+     * 鐗╂枡ID
+     */
+    @ApiModelProperty(value= "鐗╂枡ID")
+    private Long matnrId;
+
+    /**
+     * 鐗╂枡鍚嶇О
+     */
+    @ApiModelProperty(value= "鐗╂枡鍚嶇О")
+    private String maktx;
+
+    /**
+     * 骞冲彴ID(琛屽彿)
+     */
+    @ApiModelProperty(value= "骞冲彴ID(琛屽彿)")
+    private String platItemId;
+
+    /**
+     * 瀹㈡埛璁㈠崟鍙�
+     */
+    @ApiModelProperty(value= "瀹㈡埛璁㈠崟鍙�")
+    private String platOrderCode;
+
+    /**
+     * 宸ュ崟鍙�
+     */
+    @ApiModelProperty(value= "宸ュ崟鍙�")
+    private String platWorkCode;
+
+    /**
+     * 椤圭洰鍙�
+     */
+    @ApiModelProperty(value= "椤圭洰鍙�")
+    private String projectCode;
+
+    /**
+     * 鐗╂枡缂栫爜
+     */
+    @ApiModelProperty(value= "鐗╂枡缂栫爜")
+    private String matnrCode;
+
+    /**
+     * 鐗╂枡璺熻釜鐮�
+     */
+    @ApiModelProperty(value= "鐗╂枡璺熻釜鐮�")
+    private String trackCode;
+
+    /**
+     * 搴撳瓨鍗曚綅
+     */
+    @ApiModelProperty(value= "搴撳瓨鍗曚綅")
+    private String unit;
+
+    /**
+     * 鏁伴噺
+     */
+    @ApiModelProperty(value= "鏁伴噺")
+    private Double anfme;
+
+    /**
+     * 瀹屾垚鏁伴噺
+     */
+    @ApiModelProperty(value= "瀹屾垚鏁伴噺")
+    private Double qty;
+
+    /**
+     * 鎵ц鏁伴噺 
+     */
+    @ApiModelProperty(value= "鎵ц鏁伴噺 ")
+    private Double workQty;
+
+    /**
+     * 渚涘簲鍟嗘壒娆�
+     */
+    @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�")
+    private String batch;
+
+    /**
+     * 渚涘簲鍟嗘壒娆★紙鍘熶緵搴斿晢鎵规锛屾殏鍋滀娇鐢級
+     */
+    @ApiModelProperty(value= "渚涘簲鍟嗘壒娆★紙鍘熶緵搴斿晢鎵规锛屾殏鍋滀娇鐢級")
+    private String splrBatch;
+
+    /**
+     * 渚涘簲鍟咺D
+     */
+    @ApiModelProperty(value= "渚涘簲鍟咺D")
+    private Long splrId;
+
+    /**
+     * 瑙勬牸
+     */
+    @ApiModelProperty(value= "瑙勬牸")
+    private String spec;
+
+    /**
+     * 鍨嬪彿
+     */
+    @ApiModelProperty(value= "鍨嬪彿")
+    private String model;
+
+    /**
+     * 瀛楁绱㈠紩
+     */
+    @ApiModelProperty(value= "瀛楁绱㈠紩")
+    private String fieldsIndex;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    @TableLogic
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Integer tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public LocItemWorking() {}
+
+    public LocItemWorking(Long locId,String locCode,Long orderId,String type,Long orderItemId,Short wkType,Long matnrId,String maktx,String platItemId,String platOrderCode,String platWorkCode,String projectCode,String matnrCode,String trackCode,String unit,Double anfme,Double qty,Double workQty,String batch,String splrBatch,Long splrId,String spec,String model,String fieldsIndex,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+        this.locId = locId;
+        this.locCode = locCode;
+        this.orderId = orderId;
+        this.type = type;
+        this.orderItemId = orderItemId;
+        this.wkType = wkType;
+        this.matnrId = matnrId;
+        this.maktx = maktx;
+        this.platItemId = platItemId;
+        this.platOrderCode = platOrderCode;
+        this.platWorkCode = platWorkCode;
+        this.projectCode = projectCode;
+        this.matnrCode = matnrCode;
+        this.trackCode = trackCode;
+        this.unit = unit;
+        this.anfme = anfme;
+        this.qty = qty;
+        this.workQty = workQty;
+        this.batch = batch;
+        this.splrBatch = splrBatch;
+        this.splrId = splrId;
+        this.spec = spec;
+        this.model = model;
+        this.fieldsIndex = fieldsIndex;
+        this.status = status;
+        this.deleted = deleted;
+        this.tenantId = tenantId;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    LocItemWorking locItemWorking = new LocItemWorking(
+//            null,    // 涓诲崟ID
+//            null,    // 搴撲綅
+//            null,    // 鍗曟嵁ID
+//            null,    // 鍗曟嵁绫诲瀷
+//            null,    // 璁㈠崟鏄庣粏id
+//            null,    // 涓氬姟绫诲瀷
+//            null,    // 鐗╂枡ID
+//            null,    // 鐗╂枡鍚嶇О
+//            null,    // 骞冲彴ID(琛屽彿)
+//            null,    // 瀹㈡埛璁㈠崟鍙�
+//            null,    // 宸ュ崟鍙�
+//            null,    // 椤圭洰鍙�
+//            null,    // 鐗╂枡缂栫爜
+//            null,    // 鐗╂枡璺熻釜鐮�
+//            null,    // 搴撳瓨鍗曚綅
+//            null,    // 鏁伴噺
+//            null,    // 瀹屾垚鏁伴噺
+//            null,    // 鎵ц鏁伴噺 
+//            null,    // 渚涘簲鍟嗘壒娆�
+//            null,    // 渚涘簲鍟嗘壒娆★紙鍘熶緵搴斿晢鎵规锛屾殏鍋滀娇鐢級
+//            null,    // 渚涘簲鍟咺D
+//            null,    // 瑙勬牸
+//            null,    // 鍨嬪彿
+//            null,    // 瀛楁绱㈠紩
+//            null,    // 鐘舵�乕闈炵┖]
+//            null,    // 鏄惁鍒犻櫎[闈炵┖]
+//            null,    // 绉熸埛
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿[闈炵┖]
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿[闈炵┖]
+//            null    // 澶囨敞
+//    );
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "鍐荤粨";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
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 af97c8d..b64b727 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
@@ -56,6 +56,8 @@
     @ApiModelProperty(value= "浠诲姟鐘舵��")
     private Short taskStatus;
 
+    @ApiModelProperty("涓婄骇浠诲姟ID")
+    private Long parentId;
 
     @ApiModelProperty("浠撳簱绫诲瀷")
     private Short warehType;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemWorkingMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemWorkingMapper.java
new file mode 100644
index 0000000..f85b1c7
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemWorkingMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.manager.mapper;
+
+import com.vincent.rsf.server.manager.entity.LocItemWorking;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface LocItemWorkingMapper extends BaseMapper<LocItemWorking> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemWorkingService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemWorkingService.java
new file mode 100644
index 0000000..8762fa6
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemWorkingService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.manager.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.manager.entity.LocItemWorking;
+
+public interface LocItemWorkingService extends IService<LocItemWorking> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
index f2ec28d..439c441 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -21,5 +21,5 @@
 
     R removeTask(Long[] ids);
 
-    R pickTask(Long id);
+    R pickTask(Long id) throws Exception;
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemWorkingServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemWorkingServiceImpl.java
new file mode 100644
index 0000000..eb12780
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemWorkingServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.manager.service.impl;
+
+import com.vincent.rsf.server.manager.mapper.LocItemWorkingMapper;
+import com.vincent.rsf.server.manager.entity.LocItemWorking;
+import com.vincent.rsf.server.manager.service.LocItemWorkingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("locItemWorkingService")
+public class LocItemWorkingServiceImpl extends ServiceImpl<LocItemWorkingMapper, LocItemWorking> implements LocItemWorkingService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index baf1895..7f4972a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -9,6 +9,7 @@
 import com.vincent.rsf.server.api.utils.LocUtils;
 import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams;
 import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.manager.mapper.TaskItemMapper;
 import com.vincent.rsf.server.manager.mapper.TaskMapper;
 import com.vincent.rsf.server.manager.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -65,6 +66,8 @@
     private BasStationService basStationService;
     @Autowired
     private TaskService taskService;
+    @Autowired
+    private LocItemWorkingService locItemWorkingService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -386,7 +389,7 @@
                     complateInstock(task);
                 } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) {
                     //53.鎷f枡鍐嶅叆搴�
-                    
+                    pickComplateInStock(task);
                 }
             } else {
                 //鍑哄簱浠诲姟
@@ -394,11 +397,75 @@
                     //鍏ㄦ墭鍑哄簱
                     complateOutStock(task);
                 } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_IN.type)) {
-                    //鎷f枡鍑哄簱,
-                    taskService.pickTask(task.getId());
+                    //鎷f枡鍑哄簱
+                    //
+                    pickTask(task.getId());
+                    //绉婚櫎鍘熷搴撳瓨
+                    complateOutStock(task);
                 }
             }
         }
+    }
+
+    /**
+     * 鎷f枡鍐嶅叆搴�
+     *
+     * @param task
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void pickComplateInStock(Task task) throws Exception {
+        if (Objects.isNull(task)) {
+            return;
+        }
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()));
+        if (Objects.isNull(loc)) {
+            throw new CoolException("搴撳瓨涓嶅瓨鍦紒锛�");
+        }
+        if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)) {
+            throw new CoolException("褰撳墠搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害锛屼笉鍙墽琛屽叆搴撴搷浣滐紒");
+        }
+
+        loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type).setBarcode(task.getBarcode());
+
+        if (!locService.updateById(loc)) {
+            throw new CoolException("搴撲綅淇℃伅鏇存柊澶辫触锛侊紒");
+        }
+
+        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
+        if (taskItems.isEmpty()) {
+            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+        List<LocItem> items = new ArrayList<>();
+        for (TaskItem taskItem : taskItems) {
+            LocItem locItem = new LocItem();
+            LocItemWorking locWorking = locItemWorkingService.getOne(new LambdaQueryWrapper<LocItemWorking>()
+                    .eq(LocItemWorking::getTaskId, taskItem.getTaskId())
+                    .eq(LocItemWorking::getLocCode, task.getTargLoc())
+                    .eq(LocItemWorking::getMatnrId, taskItem.getMatnrId())
+                    .eq(StringUtils.isNoneBlank(taskItem.getFieldsIndex()), LocItemWorking::getFieldsIndex, taskItem.getFieldsIndex())
+                    .eq(StringUtils.isNotBlank(taskItem.getBatch()), LocItemWorking::getBatch, taskItem.getBatch()));
+            if (Objects.isNull(locWorking)) {
+                throw new CoolException("鏁版嵁閿欒锛屼綔涓氫腑搴撳瓨鏁版嵁涓㈠け锛侊紒");
+            }
+            if (locWorking.getAnfme().compareTo(taskItem.getAnfme()) >= 0) {
+               locWorking.setAnfme(Math.round((locWorking.getAnfme() - taskItem.getAnfme()) * 10000) / 10000.0);
+            } else {
+                continue;
+            }
+
+            BeanUtils.copyProperties(locWorking, locItem);
+            locItem.setLocCode(loc.getCode()).setLocId(loc.getId()).setId(null);
+            items.add(locItem);
+        }
+
+       if (!locItemService.saveBatch(items)) {
+           throw new CoolException("浣滀笟搴撳瓨鍥炲啓澶辫触锛侊紒");
+       }
+
+       if (!locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()))) {
+           throw new CoolException("浣滀笟涓簱瀛樺垹闄ゅけ璐ワ紒锛�");
+       }
+
     }
 
     /**
@@ -476,7 +543,8 @@
      * @return
      */
     @Override
-    public R pickTask(Long id) {
+    @Transactional(rollbackFor = Exception.class)
+    public R pickTask(Long id) throws Exception {
         Task task = this.getById(id);
         if (Objects.isNull(task)) {
             throw new CoolException("褰撳墠浠诲姟涓嶅瓨鍦紒锛�");
@@ -491,22 +559,32 @@
             throw new CoolException("娌℃湁绌哄簱浣嶏紒锛�");
         }
 
+        List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId()));
+        if (locItems.isEmpty()) {
+            throw new CoolException("搴撲綅鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+
         String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, task);
         //鏇存柊浠诲姟涓诲崟
         task.setTaskCode(ruleCode)
                 .setTaskType(TaskType.TASK_TYPE_PICK_IN.type)
-                .setTargLoc(task.getOrgLoc()) //鍑哄簱婧愬簱浣嶅彉鍏ュ簱鐩爣搴撲綅
+                .setBarcode(task.getBarcode())
                 .setTaskStatus(TaskStsType.GENERATE_IN.id);
-
         if (!this.updateById(task)) {
             throw new CoolException("浠诲姟鐘舵�佹洿鏂板け璐ワ紒锛�");
         }
 
-        //淇敼搴撲綅鐘舵�� 棰勭害鍑哄簱.R==>棰勭害鍏ュ簱.S
-        loc.setUseStatus(StaUseStatusType.TYPE_S.type);
+        //TODO 鍚庣画闇�鏍规嵁浠撳簱绫诲瀷鏌ユ壘鏂板簱浣嶏紝鍘熷搴撲綅缃┖闂茬姸鎬�
+        List<LocItemWorking> workings = new ArrayList<>();
+        for (LocItem item : locItems) {
+            LocItemWorking working = new LocItemWorking();
+            BeanUtils.copyProperties(item, working);
+            working.setId(null).setTaskId(task.getId());
+            workings.add(working);
+        }
 
-        if (!locService.updateById(loc)) {
-            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐ワ紒锛�");
+        if (!locItemWorkingService.saveBatch(workings)) {
+            throw new CoolException("涓存椂搴撳瓨淇濆瓨澶辫触锛侊紒");
         }
 
         return R.ok("鎷h揣鎴愬姛锛侊紒");
@@ -518,8 +596,9 @@
      * @description: 瀹屾垚鍑哄簱浠诲姟锛屾洿鏂板嚭搴撳簱瀛樹俊鎭�
      * @version 1.0
      */
+    @Synchronized
     @Transactional(rollbackFor = Exception.class)
-    public synchronized void complateOutStock(Task task) {
+    public void complateOutStock(Task task) throws Exception {
         if (Objects.isNull(task)) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
@@ -537,9 +616,9 @@
         }
         try {
             //鏇存柊搴撲綅鏄庣粏
-            subtractLocItem(taskItems, loc);
+            subtractLocItem(loc);
         } catch (Exception e) {
-            throw new RuntimeException(e.getMessage());
+            throw new CoolException(e.getMessage());
         }
 
         //娣诲姞鍑哄叆搴撹褰曚俊鎭�
@@ -630,7 +709,7 @@
      * @version 1.0
      */
     @Transactional(rollbackFor = Exception.class)
-    public void subtractLocItem(List<TaskItem> items, Loc loc) throws Exception {
+    public void subtractLocItem(Loc loc) throws Exception {
         if (!locItemService.remove(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId()))) {
             throw new CoolException("搴撳瓨鏄庣粏鍒犻櫎澶辫触锛侊紒");
         }
@@ -647,6 +726,16 @@
         if (Objects.isNull(task)) {
             return;
         }
+
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()));
+        if (Objects.isNull(loc)) {
+            throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦紒");
+        }
+
+        if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)) {
+            throw new CoolException("褰撳墠搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害锛屼笉鍙墽琛屽叆搴撴搷浣滐紒");
+        }
+
         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
         if (taskItems.isEmpty()) {
             throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
diff --git a/rsf-server/src/main/java/locItemWorking.sql b/rsf-server/src/main/java/locItemWorking.sql
new file mode 100644
index 0000000..07fe9c4
--- /dev/null
+++ b/rsf-server/src/main/java/locItemWorking.sql
@@ -0,0 +1,45 @@
+-- save locItemWorking record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.locItemWorking', '0', '/manager/locItemWorking', 'locItemWorking', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 瀹瑰櫒绠$悊', '', '1', 'manager:locItemWorking:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 瀹瑰櫒绠$悊', '', '1', 'manager:locItemWorking:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 瀹瑰櫒绠$悊', '', '1', 'manager:locItemWorking:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 瀹瑰櫒绠$悊', '', '1', 'manager:locItemWorking:remove', '3', '1', '1');
+
+-- locale menu name
+locItemWorking: 'LocItemWorking',
+
+-- locale field
+locItemWorking: {
+    locId: "locId",
+    locCode: "locCode",
+    orderId: "orderId",
+    type: "type",
+    orderItemId: "orderItemId",
+    wkType: "wkType",
+    matnrId: "matnrId",
+    maktx: "maktx",
+    platItemId: "platItemId",
+    platOrderCode: "platOrderCode",
+    platWorkCode: "platWorkCode",
+    projectCode: "projectCode",
+    matnrCode: "matnrCode",
+    trackCode: "trackCode",
+    unit: "unit",
+    anfme: "anfme",
+    qty: "qty",
+    workQty: "workQty",
+    batch: "batch",
+    splrBatch: "splrBatch",
+    splrId: "splrId",
+    spec: "spec",
+    model: "model",
+    fieldsIndex: "fieldsIndex",
+},
+
+-- ResourceContent
+import locItemWorking from './locItemWorking';
+
+case 'locItemWorking':
+    return locItemWorking;
diff --git a/rsf-server/src/main/resources/mapper/manager/LocItemWorkingMapper.xml b/rsf-server/src/main/resources/mapper/manager/LocItemWorkingMapper.xml
new file mode 100644
index 0000000..56cf881
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/manager/LocItemWorkingMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.manager.mapper.LocItemWorkingMapper">
+
+</mapper>

--
Gitblit v1.9.1