Sfoglia il codice sorgente

库位导入

(cherry picked from commit 1f370a97b15087e27f2184c3d457eceb9962e95e)
andy 2 anni fa
parent
commit
973abbd269
17 ha cambiato i file con 324 aggiunte e 79 eliminazioni
  1. 3 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/LineCallController.java
  2. 19 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseLocationInfoController.java
  3. 81 1
      ruoyi-ui/src/views/base/locationInfo/index.vue
  4. 1 1
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/entity/CallbackResult.java
  5. 3 0
      warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/StatusUpdateServiceImpl.java
  6. 65 22
      warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java
  7. 7 0
      warewms-ams/src/main/java/com/ruoyi/ams/business/IBusinessService.java
  8. 2 0
      warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/AgvCallItemDTO.java
  9. 7 0
      warewms-ams/src/main/java/com/ruoyi/ams/task/mapper/WcsTaskMapper.java
  10. 7 0
      warewms-ams/src/main/java/com/ruoyi/ams/task/service/IWcsTaskService.java
  11. 13 2
      warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java
  12. 4 0
      warewms-ams/src/main/resources/mapper/ams/WcsTaskMapper.xml
  13. 2 51
      warewms-base/src/main/java/com/ruoyi/base/domain/BaseLocationInfo.java
  14. 20 1
      warewms-base/src/main/java/com/ruoyi/base/mapper/BaseLocationInfoMapper.java
  15. 10 0
      warewms-base/src/main/java/com/ruoyi/base/service/IBaseLocationInfoService.java
  16. 68 0
      warewms-base/src/main/java/com/ruoyi/base/service/impl/BaseLocationInfoServiceImpl.java
  17. 12 0
      warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml

+ 3 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/LineCallController.java

@@ -12,6 +12,7 @@ import com.ruoyi.ams.lineCall.domain.form.LineCallForm;
 import com.ruoyi.ams.lineCall.domain.form.LineCallListFrom;
 import com.ruoyi.ams.lineCall.domain.vo.LineCallVO;
 import com.ruoyi.ams.lineCall.service.ILineCallService;
+import com.ruoyi.base.constant.Constant;
 import com.ruoyi.common.core.domain.AjaxResult;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -74,13 +75,14 @@ public class LineCallController {
                 agvCallDTO.setId(lform.getId());
             }
             AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
-            agvCallItemDTO.setWarehouseId(1L);
+            agvCallItemDTO.setWarehouseId(Constant.WAREHOUSE_ID);
             agvCallItemDTO.setSku(lform.getSku());
             agvCallItemDTO.setQty(lform.getQty());
             agvCallItemDTO.setSupplier(lform.getSupplier());
             agvCallItemDTO.setWeight(lform.getWeight());
             agvCallItemDTO.setLocationFrom(lform.getLocationFrom());
             agvCallItemDTO.setLocationTo(lform.getLocationTo());
+            agvCallItemDTO.setFlowConfigHeaderVO(flowConfigHeaderVO);
             agvCallDTO.getAgvCallItemDTOList().add(agvCallItemDTO);
             LotattDTO lotattDTO = new LotattDTO();
             List<LineCallDetailsForm> lineCallDetailsForms = lform.getLineCallDetailsFormList();

+ 19 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseLocationInfoController.java

@@ -18,6 +18,7 @@ import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.service.IBaseLocationInfoService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 库位信息Controller
@@ -120,4 +121,22 @@ public class BaseLocationInfoController extends BaseController {
     public AjaxResult treeselect() {
         return AjaxResult.success(baseLocationInfoService.buildLocationTreeSelect());
     }
+
+    @Log(title = "库位导入", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('base:locationInfo:edit')")
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<BaseLocationInfo> util = new ExcelUtil<>(BaseLocationInfo.class);
+        List<BaseLocationInfo> list = util.importExcel(file.getInputStream());
+        String operName = getUsername();
+        return baseLocationInfoService.importLocation(list, updateSupport, operName);
+    }
+
+    @PostMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response)
+    {
+        ExcelUtil<BaseLocationInfo> util = new ExcelUtil<>(BaseLocationInfo.class);
+        util.importTemplateExcel(response, "库位信息");
+    }
 }

+ 81 - 1
ruoyi-ui/src/views/base/locationInfo/index.vue

@@ -108,6 +108,16 @@
           @click="handleExport"
           v-hasPermi="['base:locationInfo:export']"
         >导出</el-button>
+        <el-col :span="1.5">
+          <el-button
+            type="info"
+            plain
+            icon="el-icon-upload2"
+            size="mini"
+            @click="handleImport"
+            v-hasPermi="['base:locationInfo:export']"
+          >导入</el-button>
+        </el-col>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
@@ -317,6 +327,35 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+    <!-- 库位导入对话框 -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <div class="el-upload__tip text-center" slot="tip">
+          <div class="el-upload__tip" slot="tip">
+            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的库位数据
+          </div>
+          <span>仅允许导入xls、xlsx格式文件。</span>
+          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -325,6 +364,7 @@ import { listLocationInfo, getLocationInfo, delLocationInfo, addLocationInfo, up
 import { queryLocationZoneDict } from "@/api/base/locationZone";
 import { queryWarehouseDict } from "@/api/base/warehouse";
 import { querySkuTypeDict } from "@/api/base/skuType";
+import { getToken } from "@/utils/auth";
 
 export default {
   name: "LocationInfo",
@@ -391,7 +431,21 @@ export default {
       },
       locationZoneCombo: [],
       warehouseCombo: [],
-      skuTypeCombo: []
+      skuTypeCombo: [],
+      upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/base/locationInfo/importData"
+      }
     };
   },
   created() {
@@ -534,6 +588,32 @@ export default {
       this.download('base/locationInfo/export', {
         ...this.queryParams
       }, `locationInfo_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "库位信息导入";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      this.download('base/locationInfo/importTemplate', {
+      }, `location_${new Date().getTime()}.xlsx`)
+    },
+// 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+// 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+// 提交上传文件
+    submitFileForm() {
+      this.$refs.upload.submit();
     }
   }
 };

+ 1 - 1
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/entity/CallbackResult.java

@@ -5,6 +5,6 @@ import lombok.Data;
 @Data
 public class CallbackResult {
     private String taskNo;
-    private Long carNo;
+    private Integer carNo;
     private Integer state;
 }

+ 3 - 0
warewms-ams/src/main/java/com/ruoyi/ams/agv/ndc/service/impl/StatusUpdateServiceImpl.java

@@ -27,6 +27,7 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
                 log.error("没有index,未下发的任务");
             }
             CallbackResult result = new CallbackResult();
+            result.setCarNo(carNo);
             //判断状态
             if (null != amsTask.getSystemStatus() && amsTask.getSystemStatus() == 3) {
                 result.setState(2);
@@ -58,6 +59,8 @@ public class StatusUpdateServiceImpl implements StatusUpdateService {
                 }
             }
 
+            wcsTaskService.callBack(result);
+
             amsTask.setSystemStatus(result.getState());
             amsTaskService.updateAmsTask(amsTask);
         }

+ 65 - 22
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -11,6 +11,7 @@ import com.ruoyi.ams.config.domain.AsnSoStrategy;
 import com.ruoyi.ams.config.domain.dto.*;
 import com.ruoyi.ams.config.domain.vo.FlowConfigHeaderVO;
 import com.ruoyi.ams.config.mapper.AsnSoStrategyMapper;
+import com.ruoyi.ams.config.service.IFlowConfigHeaderService;
 import com.ruoyi.ams.config.service.LocationAllocationStrategy;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
@@ -72,13 +73,13 @@ public class BusinessServiceImpl implements IBusinessService {
     @Autowired
     private IAmsTaskService amsTaskService;
 
-    private int geniKey(String taskNo){
+    private int geniKey(String taskNo) {
         int res = CRC16Util.calcCrc16(ByteUtil.string2byteArray(taskNo));
-        if(res == 0){
+        if (res == 0) {
             BigDecimal t = new BigDecimal(taskNo);
             t = t.add(BigDecimal.ONE);
             return geniKey(t.toString());
-        }else {
+        } else {
             return res;
         }
     }
@@ -402,7 +403,7 @@ public class BusinessServiceImpl implements IBusinessService {
             }
         } else { //移库
             if (locationType.equals("locationFrom")) {
-                //TODO 代码一样如果有新需求再加
+
                 for (BaseLocationInfo b : locationInfoList) {
                     if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("N") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
                         continue;
@@ -411,9 +412,17 @@ public class BusinessServiceImpl implements IBusinessService {
                     locationInfo = b;
                     break;
                 }
-                if (locationInfo == null) {
-                    throw new ServiceException("没有可以分配的库位", token);
+                //分配时是否需要做库位占用判断
+                FlowConfigHeaderVO flowConfigHeaderVO = agvCallDTO.getFlowConfigHeaderVO();
+                if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFromStrategyFlag()) && flowConfigHeaderVO.getLocationFromStrategyFlag().equals("Y")) {
+
+                } else {
+                    //如果未启用策略则进行判断
+                    if (locationInfo == null) {
+                        throw new ServiceException("没有可以分配的库位", token);
+                    }
                 }
+
             } else {
                 for (BaseLocationInfo b : locationInfoList) {
                     if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
@@ -423,8 +432,15 @@ public class BusinessServiceImpl implements IBusinessService {
                     locationInfo = b;
                     break;
                 }
-                if (locationInfo == null) {
-                    throw new ServiceException("没有可以分配的库位", token);
+                //分配时是否需要做库位占用判断
+                FlowConfigHeaderVO flowConfigHeaderVO = agvCallDTO.getFlowConfigHeaderVO();
+                if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFromStrategyFlag()) && flowConfigHeaderVO.getLocationFromStrategyFlag().equals("Y")) {
+
+                } else {
+                    //如果未启用策略则进行判断
+                    if (locationInfo == null) {
+                        throw new ServiceException("没有可以分配的库位", token);
+                    }
                 }
             }
         }
@@ -452,18 +468,30 @@ public class BusinessServiceImpl implements IBusinessService {
 
     @Override
     public List<WcsTask> genTask(BaseLocationInfo locationFrom, BaseLocationInfo locationTo, FlowConfigHeaderVO flowConfigHeaderVO, AgvCallDTO agvCallDTO, Long token) {
-        if (locationFrom == null || locationTo == null) {
-            throw new ServiceException("任务执行库位不能为空", token);
+        if (flowConfigHeaderVO.getLocationFromStrategyFlag().equals("N")) {
+            if (locationFrom == null) {
+                throw new ServiceException("起始库位不能为空", token);
+            }
         }
+        if (flowConfigHeaderVO.getLocationToStrategyFlag().equals("N")) {
+            if (locationTo == null) {
+                throw new ServiceException("目标库位不能为空", token);
+            }
+        }
+
         List<WcsTask> wcsTaskList = new ArrayList<>();
         if (StringUtils.isEmpty(flowConfigHeaderVO.getRootFlow())) {
             String taskNo = System.currentTimeMillis() + "";
             WcsTask wcsTask = new WcsTask();
             wcsTask.setTaskNo(taskNo);
-            wcsTask.setAreaFrom(locationFrom.getZoneId().toString());
-            wcsTask.setLocationFrom(locationFrom.getId().toString());
-            wcsTask.setAreaTo(locationTo.getZoneId() + "");
-            wcsTask.setLocationTo(locationTo.getId().toString());
+            if (locationFrom != null) {
+                wcsTask.setAreaFrom(locationFrom.getZoneId().toString());
+                wcsTask.setLocationFrom(locationFrom.getId().toString());
+            }
+            if (locationTo != null) {
+                wcsTask.setAreaTo(locationTo.getZoneId() + "");
+                wcsTask.setLocationTo(locationTo.getId().toString());
+            }
             wcsTask.setState(9L);
             wcsTask.setPriority(1L);
             wcsTask.setShopId(Constant.WAREHOUSE_ID.toString());
@@ -603,7 +631,7 @@ public class BusinessServiceImpl implements IBusinessService {
         }
         amsTask.setIsDelete(0);
         amsTask.setAciAccept(0);
-        amsTask.setIkey((long)geniKey(amsTask.getTaskNo()));
+        amsTask.setIkey((long) geniKey(amsTask.getTaskNo()));
         amsTask.setPriority(wcsTask.getPriority().intValue());
         amsTask.setStFrom(locFrom.getAgvStation().intValue());
         amsTask.setStTo(locTo.getAgvStation().intValue());
@@ -655,7 +683,7 @@ public class BusinessServiceImpl implements IBusinessService {
 
                 //转发任务
                 if (StringUtils.isNotEmpty(wcsTask.getTaskType())
-                        &&wcsTask.getTaskType().equals(Constant.TASK_TYPE.FORWARD.getValue())) {
+                        && wcsTask.getTaskType().equals(Constant.TASK_TYPE.FORWARD.getValue())) {
                     sendTask(wcsTask);
                     wcsTask.setState(10L);
                     wcsTaskService.updateWcsTask(wcsTask);
@@ -694,9 +722,9 @@ public class BusinessServiceImpl implements IBusinessService {
         //目标库位
         BaseLocationInfo locationInfoTo = baseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(wcsTask.getLocationTo()));
         //TODO 前置任务未完成不进行下发
-        /*if(wcsTaskService.taskDispatchCheck(wcsTask) == false){
+        if (businessService.taskDispatchCheck(wcsTask) == false) {
             return false;
-        }*/
+        }
 
         if (basLocationInfoFrom != null) {
 
@@ -707,13 +735,14 @@ public class BusinessServiceImpl implements IBusinessService {
             }
 
             //起始库位巷道检测(起始库位检测是否同巷道)
-            /*if(!StringUtils.isEmpty(basLocationInfoFrom.getColNo())){
-                if(baseLocationInfoService.laneCheck(basLocationInfoFrom, BasLocationEnum.LANE_FROM) == false){
+            if (!StringUtils.isEmpty(basLocationInfoFrom.getColNo())) {
+                List<BaseLocationInfo> locationInfoList = baseLocationInfoMapper.laneCheck(basLocationInfoFrom.getColNo(), "LANE_FROM", Constant.WAREHOUSE_ID);
+                if (locationInfoList != null && locationInfoList.size() > 0) {
                     wcsTask.setRemark("起始库位同列或同巷道有车辆在任务中,等待其他任务完成");
-                    wcsTask.update();
+                    wcsTaskService.updateWcsTask(wcsTask);
                     return false;
                 }
-            }*/
+            }
         }
 
         //起始库位是地堆需要判断是否有阻挡
@@ -812,4 +841,18 @@ public class BusinessServiceImpl implements IBusinessService {
             return false;
         }
     }
+
+    @Override
+    public boolean taskDispatchCheck(WcsTask wcsTask) {
+        if (!StringUtils.isEmpty(wcsTask.getBeforeTask())) {
+            List<WcsTask> taskFindBeforeRecord = wcsTaskMapper.selectBeforeTask(wcsTask.getBeforeTask());
+            if (taskFindBeforeRecord != null && taskFindBeforeRecord.size() > 0) {
+                //log.info("前置任务未完成主任务无法下发{}",wcsTask);
+                wcsTask.setRemark("前置任务未完成主任务无法下发");
+                wcsTaskService.updateWcsTask(wcsTask);
+                return false;
+            }
+        }
+        return true;
+    }
 }

+ 7 - 0
warewms-ams/src/main/java/com/ruoyi/ams/business/IBusinessService.java

@@ -121,4 +121,11 @@ public interface IBusinessService {
      * @return
      */
     boolean taskDispatchStack(WcsTask wcsTask);
+
+    /**
+     * 任务可执行判断
+     * @param wcsTask
+     * @return
+     */
+    boolean taskDispatchCheck(WcsTask wcsTask);
 }

+ 2 - 0
warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/AgvCallItemDTO.java

@@ -1,5 +1,6 @@
 package com.ruoyi.ams.config.domain.dto;
 
+import com.ruoyi.ams.config.domain.vo.FlowConfigHeaderVO;
 import lombok.Data;
 
 @Data
@@ -13,4 +14,5 @@ public class AgvCallItemDTO {
     private String supplier;
     private LotattDTO lotattDTO;
     private String extParam;
+    private FlowConfigHeaderVO flowConfigHeaderVO;
 }

+ 7 - 0
warewms-ams/src/main/java/com/ruoyi/ams/task/mapper/WcsTaskMapper.java

@@ -100,4 +100,11 @@ public interface WcsTaskMapper
      * @return
      */
      List<WcsTaskLocationDTO> selectTaskByColNoAfter(@Param("colNo") String colNo,@Param("colIndex") Long colIndex,@Param("zoneId") Long zoneId,@Param("warehouseId") Long warehouseId);
+
+    /**
+     * 查询前置任务
+     * @param taskNo
+     * @return
+     */
+     List<WcsTask> selectBeforeTask(@Param("taskNo") String taskNo);
 }

+ 7 - 0
warewms-ams/src/main/java/com/ruoyi/ams/task/service/IWcsTaskService.java

@@ -2,6 +2,7 @@ package com.ruoyi.ams.task.service;
 
 import java.util.List;
 
+import com.ruoyi.ams.agv.ndc.entity.CallbackResult;
 import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.ams.task.dto.WcsTaskLocationDTO;
 
@@ -132,4 +133,10 @@ public interface IWcsTaskService {
      * @return
      */
     List<WcsTaskLocationDTO> selectTaskByColNoAfter(String colNo, Long colIndex, Long zoneId, Long warehouseId);
+
+    /**
+     * 任务回调
+     * @param callbackResult
+     */
+    void callBack(CallbackResult callbackResult);
 }

+ 13 - 2
warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java

@@ -3,7 +3,7 @@ package com.ruoyi.ams.task.service.impl;
 import java.lang.reflect.Method;
 import java.util.List;
 
-import com.ruoyi.ams.box.domain.WmsBoxInfo;
+import com.ruoyi.ams.agv.ndc.entity.CallbackResult;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
 import com.ruoyi.ams.config.domain.FlowConfigEvent;
 import com.ruoyi.ams.config.service.IFlowConfigEventService;
@@ -15,7 +15,6 @@ import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.spring.SpringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import com.ruoyi.ams.task.mapper.WcsTaskMapper;
 import com.ruoyi.ams.task.domain.WcsTask;
@@ -43,6 +42,8 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     private IWmsBoxInfoService wmsBoxInfoService;
     @Autowired
     private IFlowConfigEventService flowConfigEventService;
+    @Autowired
+    private IWcsTaskService wcsTaskService;
 
     /**
      * 查询AGV任务
@@ -259,4 +260,14 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     public List<WcsTaskLocationDTO> selectTaskByColNoAfter(String colNo, Long colIndex, Long zoneId, Long warehouseId) {
         return wcsTaskMapper.selectTaskByColNoAfter(colNo, colIndex, zoneId, warehouseId);
     }
+
+    @Override
+    public void callBack(CallbackResult callbackResult) {
+        WcsTask wcsTask = wcsTaskService.selectWcsTaskByTaskNo(callbackResult.getTaskNo());
+        if (callbackResult.getState() == 4) {
+            wcsTaskService.callBackPickup(wcsTask);
+        } else if (callbackResult.getState() == 6) {
+            wcsTaskService.callBackTaskComplete(wcsTask);
+        }
+    }
 }

+ 4 - 0
warewms-ams/src/main/resources/mapper/ams/WcsTaskMapper.xml

@@ -326,4 +326,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by priority
     </select>
 
+    <select id="selectBeforeTask" resultMap="WcsTaskResult">
+        select * from wcs_task
+        where task_no = #{taskNo} and state not in (2,7,4,11,12)
+    </select>
 </mapper>

+ 2 - 51
warewms-base/src/main/java/com/ruoyi/base/domain/BaseLocationInfo.java

@@ -19,10 +19,6 @@ public class BaseLocationInfo extends BaseEntity {
      */
     private Long id;
 
-    /**
-     * 车间id
-     */
-    @Excel(name = "车间id")
     private Long warehouseId;
 
     /**
@@ -40,7 +36,6 @@ public class BaseLocationInfo extends BaseEntity {
     /**
      * 条形码
      */
-    @Excel(name = "条形码")
     private String locationBarcode;
 
     /**
@@ -82,13 +77,12 @@ public class BaseLocationInfo extends BaseEntity {
     /**
      * 储位状态(00)空闲,(10)占用,(20)完成,(90)合格,(99)不合格(80封存)
      */
-    @Excel(name = "储位状态(00)空闲,(10)占用,(20)完成,(90)合格,(99)不合格(80封存)")
     private String stockStatus;
 
     /**
      * 是否为空(Y空/N非空)
      */
-    @Excel(name = "是否为空(Y空/N非空)")
+    @Excel(name = "是否为空")
     private String isEmpty;
 
     /**
@@ -100,13 +94,12 @@ public class BaseLocationInfo extends BaseEntity {
     /**
      * 储位类型(1货架2地堆3流离货架)
      */
-    @Excel(name = "储位类型", readConverterExp = "1=货架2地堆3流离货架")
+    @Excel(name = "储位类型(1=货架,2=地堆,3=流离货架)", readConverterExp = "1=货架,2=地堆,3=流离货架")
     private String locationType;
 
     /**
      * 盘架编号
      */
-    @Excel(name = "盘架编号")
     private String rackId;
 
     /**
@@ -118,77 +111,35 @@ public class BaseLocationInfo extends BaseEntity {
     /**
      * 0默认(没有任何含义),1允许堆叠
      */
-    @Excel(name = "0默认(没有任何含义),1允许堆叠")
     private String foldedTag;
 
     /**
      * 叠空托盘上限(当folded_tag为1时有效)
      */
-    @Excel(name = "叠空托盘上限", readConverterExp = "当=folded_tag为1时有效")
     private Long foldedCount;
 
     private Double heightLimit;
 
     private Double weightLimit;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine1;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine2;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine3;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine4;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine5;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine6;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine7;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine8;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine9;
 
-    /**
-     * $column.columnComment
-     */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private String userdefine10;
 
     public void setId(Long id) {

+ 20 - 1
warewms-base/src/main/java/com/ruoyi/base/mapper/BaseLocationInfoMapper.java

@@ -101,9 +101,17 @@ public interface BaseLocationInfoMapper {
 
     List<BaseLocationLotattVO> selectSortedLocationLotattListByLocationIdList(@Param("locationId") List<Long> locationId, @Param("warehouseId") Long warehouseId, @Param("lotatt") Map<String, String> lotatt, @Param("sku") String sku);
 
+    /**
+     * 根据id查询库位库存信息
+     *
+     * @param id
+     * @return
+     */
     LotattVO selectInvLotattById(@Param("id") Long id);
 
     /**
+     * 更新库位状态
+     *
      * @param id
      * @param status
      * @return
@@ -169,6 +177,7 @@ public interface BaseLocationInfoMapper {
 
     /**
      * 查询库位是否在任务重
+     *
      * @param locationType
      * @param locationId
      * @return
@@ -177,17 +186,27 @@ public interface BaseLocationInfoMapper {
 
     /**
      * 查询库位之前
+     *
      * @param colNo
      * @param colIndex
      * @return
      */
-    List<BaseLocationInfo> selectBeforeLocationByColNo(@Param("colNo") String colNo,@Param("colIndex") Long colIndex);
+    List<BaseLocationInfo> selectBeforeLocationByColNo(@Param("colNo") String colNo, @Param("colIndex") Long colIndex);
 
     /**
      * 查询同列可用库位
+     *
      * @param colNo
      * @param colIndex
      * @return
      */
     List<BaseLocationInfoSameColDTO> selectSameColCanToLoc(@Param("colNo") String colNo, @Param("colIndex") Long colIndex);
+
+    /**
+     * 检测是否有同列的任务
+     * @param colNo
+     * @param laneType
+     * @return
+     */
+    List<BaseLocationInfo> laneCheck(@Param("colNo") String colNo, @Param("laneType") String laneType, @Param("warehouseId")Long warehouseId);
 }

+ 10 - 0
warewms-base/src/main/java/com/ruoyi/base/service/IBaseLocationInfoService.java

@@ -9,6 +9,7 @@ import com.ruoyi.base.domain.dto.BaseLocationInfoSameColDTO;
 import com.ruoyi.base.domain.vo.BasLocationTreeSelectVO;
 import com.ruoyi.base.domain.vo.BaseLocationLotattListVO;
 import com.ruoyi.base.domain.vo.TreeSelectVO;
+import com.ruoyi.common.core.domain.AjaxResult;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
 
@@ -254,4 +255,13 @@ public interface IBaseLocationInfoService {
      * @return
      */
     List<BaseLocationInfoSameColDTO> selectSameColCanToLoc(String colNo, Long colIndex);
+
+    /**
+     * 导入库位
+     * @param list
+     * @param updateSupport
+     * @param opname
+     * @return
+     */
+    AjaxResult importLocation(List<BaseLocationInfo> list,boolean updateSupport,String opname);
 }

+ 68 - 0
warewms-base/src/main/java/com/ruoyi/base/service/impl/BaseLocationInfoServiceImpl.java

@@ -9,13 +9,18 @@ import com.ruoyi.base.mapper.BaseLocationInfoMapper;
 import com.ruoyi.base.mapper.BaseLocationZoneMapper;
 import com.ruoyi.base.service.IBaseLocationInfoService;
 import com.ruoyi.base.utils.CommonUtils;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -26,6 +31,7 @@ import java.util.stream.Collectors;
  * @author andy
  * @date 2022-02-18
  */
+@Slf4j
 @Service
 public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
 
@@ -334,4 +340,66 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
         locationInfoFromUpdate.setWarehouseId(warehouseId);
         return this.updateBaseLocationInfo(locationInfoFromUpdate) > 0;
     }
+
+    @Override
+    public AjaxResult importLocation(List<BaseLocationInfo> list, boolean updateSupport, String opname) {
+        if (StringUtils.isNull(list) || list.size() == 0)
+        {
+            throw new ServiceException("导入库位基本信息数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (BaseLocationInfo baseLocationInfo : list)
+        {
+            try
+            {
+
+                BaseLocationInfo b = baseLocationInfoMapper.selectBaseLocationInfoByLocationNo(baseLocationInfo.getLocationNo(),Constant.WAREHOUSE_ID);
+                if (b == null)
+                {
+                    //BeanValidators.validateWithException(validator, stu);
+                    baseLocationInfo.setCreateBy(opname);
+                    baseLocationInfo.setCreateTime(new Date());
+                    baseLocationInfo.setStockStatus("00");
+                    baseLocationInfo.setWarehouseId(Constant.WAREHOUSE_ID);
+                    this.insertBaseLocationInfo(baseLocationInfo);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "、库位 " + baseLocationInfo.getLocationNo() + " 导入成功");
+                }
+                else if (updateSupport)
+                {
+                    //BeanValidators.validateWithException(validator, stu);
+                    b.setUpdateBy(opname);
+                    b.setUpdateTime(new Date());
+                    this.updateBaseLocationInfo(b);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "、库位 " + b.getLocationNo() + " 更新成功");
+                }
+                else
+                {
+                    failureNum++;
+                    failureMsg.append("<br/>" + failureNum + "、库位 " + b.getLocationNo() + " 已存在");
+                }
+            }
+            catch (Exception e)
+            {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、库位 " + baseLocationInfo.getLocationNo() + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0)
+        {
+            failureMsg.insert(0, "导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        }
+        else
+        {
+            successMsg.insert(0, "数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return AjaxResult.success(successMsg);
+    }
 }

+ 12 - 0
warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml

@@ -515,4 +515,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where t.col_index <![CDATA[ < ]]> #{colIndex}
         order by col_index desc
     </select>
+
+    <select id="laneCheck" resultMap="BaseLocationInfoResult">
+        select b.* from wcs_task w left join bas_location_info b
+        <if test="laneType == 'LANE_FROM'">
+           on w.location_from = b.id where w.state in (0,1,3,10,13)
+        </if>
+        <if test="laneType == 'LANE_TO'">
+           on w.location_to = b.id where w.state in (0,1,3,4,10,13,14)
+        </if>
+          and b.col_no = #{colNo}
+          and b.warehouse_id = #{warehouseId}
+    </select>
 </mapper>