wangxinhui
2025-12-31 edc7293bf81729ebaa2d7cdd9a1f3aeaf567f538
更新
已添加1个文件
已删除7个文件
已修改18个文件
1051 ■■■■ 文件已修改
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AGVBoxApplyPassDTO.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvCTUCancelDTO.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvCallbackBoxNoDTO.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvPodBerthAndMatDTO.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvScheduleTaskDTO.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvSecureReplyDTO.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskDTO.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WCSServices/WIDESEAWCS_Tasks/原料库/StackerCraneJob_YLSC3.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/config/buttons.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/taskinfo/extend/relocationTask.vue 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/taskinfo/task.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_BasicService/Service/LocationInfoService_Common.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_Common/OrderEnum/OutboundOrderMenu.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_DTO/Task/WMSTaskDTO.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/MesTaskService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Completed.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Reloaction.cs 175 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/ERP/ErpBSTController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AGVBoxApplyPassDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvCTUCancelDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvCallbackBoxNoDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvPodBerthAndMatDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvScheduleTaskDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvSecureReplyDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -225,12 +225,6 @@
        /// <returns></returns>
        WebResponseContent AGVFinish(AgvFinishDTO agvFinishDTO);
        /// <summary>
        /// å®‰å…¨ä¿¡å·å›žå¤ WCS-AGV
        /// </summary>
        /// <param name="secureModel"></param>
        /// <returns></returns>
        WebResponseContent AgvSecureReply(AgvSecureReplyDTO secureReplyModel, APIEnum SecureReply = APIEnum.Agv_CSJSecureReply);
        /// <summary>
        /// AGV任务状态刷新
        /// </summary>
        /// <param name="agvUpdateModel"></param>
@@ -248,31 +242,10 @@
        /// <param name="currentAddress">修改后的当前地址</param>
        /// <param name="nextAddress">修改后的下一地址</param>
        void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "", int heightType = 0);
        /// <summary>
        ///
        /// </summary>
        /// <param name="agvPodModel"></param>
        /// <param name="PodBerthAndMat"></param>
        /// <returns></returns>
        WebResponseContent AgvPodBerthAndMat(AgvPodBerthAndMatDTO agvPodModel, APIEnum PodBerthAndMat = APIEnum.Agv_CSJPodBerthAndMat);
        /// <summary>
        /// //判断移库货位任务是否已存在,如存在先执行
        /// </summary>
        Dt_Task QueryStackerExistTask(string PalletCode,string locationCode);
        /// <summary>
        /// AGV成品取放货通知
        /// </summary>
        WebResponseContent AgvBoxApplyPass(AGVBoxApplyPassDTO applyPassDTO, APIEnum SecureReply = APIEnum.AGV_CPBoxApplyPass);
        /// <summary>
        /// CTU取消任务
        /// </summary>
        /// <returns></returns>
        WebResponseContent AgvBoxApplyPass(AgvCTUCancelDTO applyPassDTO, APIEnum SecureReply = APIEnum.AGV_CTUCancelTask);
        /// <summary>
        /// é¢„调度指令
        /// </summary>
        WebResponseContent AgvPreScheduleTask(AgvScheduleTaskDTO scheduleTaskDTO, APIEnum ScheduleTask = APIEnum.AGV_CTUScheduleTaskTask);
        /// <summary>
        /// æŽ¥å—WMS手动完成任务
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs
@@ -70,117 +70,7 @@
            }
            return content;
        }
        /// <summary>
        /// å®‰å…¨ä¿¡å·å›žå¤ WCS-AGV  //AGV任务继续执行
        /// </summary>
        /// <param name="secureModel"></param>
        /// <returns></returns>
        public WebResponseContent AgvSecureReply(AgvSecureReplyDTO secureReplyModel, APIEnum SecureReply = APIEnum.Agv_CSJSecureReply)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = apiInfos.FirstOrDefault(x => x.ApiCode == SecureReply.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress))
                    return WebResponseContent.Instance.Error($"未找到发送AGV任务接口,请检查接口配置");
                string response = HttpHelper.Post(apiAddress, secureReplyModel.Serialize());
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>();
                if (agvContent.Code == "0")
                {
                    content.OK(agvContent.Message);
                }
                else
                {
                    content.Error(agvContent.Message);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// CTU取消任务
        /// </summary>
        public WebResponseContent AgvBoxApplyPass(AgvCTUCancelDTO applyPassDTO, APIEnum SecureReply = APIEnum.AGV_CTUCancelTask)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = apiInfos.FirstOrDefault(x => x.ApiCode == SecureReply.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress))
                    return WebResponseContent.Instance.Error($"未找到AGV取消任务接口,请检查接口配置");
                string response = HttpHelper.Post(apiAddress, applyPassDTO.Serialize());
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>();
                if (agvContent.Code == "0")
                {
                    content.OK(agvContent.Message);
                }
                else
                {
                    content.Error(agvContent.Message);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// AGV成品取放货通知
        /// </summary>
        public WebResponseContent AgvBoxApplyPass(AGVBoxApplyPassDTO applyPassDTO, APIEnum SecureReply = APIEnum.AGV_CPBoxApplyPass)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = apiInfos.FirstOrDefault(x => x.ApiCode == SecureReply.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress))
                    return WebResponseContent.Instance.Error($"未找到发送AGV任务接口,请检查接口配置");
                string response = HttpHelper.Post(apiAddress, applyPassDTO.Serialize());
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>();
                if (agvContent.Code == "0")
                {
                    content.OK(agvContent.Message);
                }
                else
                {
                    content.Error(agvContent.Message);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent AgvPreScheduleTask(AgvScheduleTaskDTO scheduleTaskDTO, APIEnum ScheduleTask = APIEnum.AGV_CTUScheduleTaskTask)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = apiInfos.FirstOrDefault(x => x.ApiCode == ScheduleTask.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress))
                    return WebResponseContent.Instance.Error($"未找到发送AGV任务接口,请检查接口配置");
                string response = HttpHelper.Post(apiAddress, scheduleTaskDTO.Serialize());
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>();
                if (agvContent.Code == "0")
                {
                    content.OK(agvContent.Message);
                }
                else
                {
                    content.Error(agvContent.Message);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// AGV任务状态刷新/AGV任务完成
        /// </summary>
@@ -189,31 +79,6 @@
        public AgvResponseContent AgvUpdateTask(AgvUpdateDTO agvUpdateModel)
        {
            return new AgvResponseContent();
        }
        public WebResponseContent AgvPodBerthAndMat(AgvPodBerthAndMatDTO agvPodModel, APIEnum PodBerthAndMat = APIEnum.Agv_CSJPodBerthAndMat)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = apiInfos.FirstOrDefault(x => x.ApiCode == PodBerthAndMat.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress))
                    return WebResponseContent.Instance.Error($"未找到发送AGV任务接口,请检查接口配置");
                string response = HttpHelper.Post(apiAddress, agvPodModel.Serialize());
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>();
                if (agvContent.Code == "1")
                {
                    content.OK(agvContent.Message);
                }
                else
                {
                    content.Error(agvContent.Message);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -942,6 +942,11 @@
                        nextStatus = TaskStatusEnum.SC_Executing;
                    }
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
                {
                    task.TaskState = (int)TaskStatusEnum.SC_Executing;
                    nextStatus = TaskStatusEnum.SC_Executing;
                }
                else
                {
                    throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{task.TaskNum}】,任务类型:【{task.TaskType}】");
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Tasks/Ô­ÁÏ¿â/StackerCraneJob_YLSC3.cs
@@ -398,7 +398,7 @@
            YLStackerCraneTaskCommand stackerCraneTaskCommand = new YLStackerCraneTaskCommand();
            stackerCraneTaskCommand.PalletType = Convert.ToInt16(task.PalletType);
            if (task.TaskLength>=1200 && task.TaskLength<1630)
            if (task.TaskLength>=1160 && task.TaskLength<1630)
            {
                stackerCraneTaskCommand.PalletType = 3;
            }
ÏîÄ¿´úÂë/WMS/WMSClient/config/buttons.js
@@ -208,6 +208,15 @@
    type: 'success',
    onClick: function () {
    }
},
{
    name: "手动移库",
    icon: '',
    class: '',
    value: 'Relocation',
    type: 'success',
    onClick: function () {
    }
}
]
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/taskinfo/extend/relocationTask.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,194 @@
<template>
    <div>
      <vol-box
        v-model="showDetialBox"
        :lazy="true"
        width="600px"
        :padding="15"
        title="手动移库"
      >
        <div>
          <el-form>
            <el-form-item label="请选择巷道:">
              <el-select
                v-model="relocationInfo.roadWay"
                filterable
                placeholder="请选择"
              >
                <el-option
                  v-for="item in Roadways"
                  :key="item.key"
                  :label="item.value"
                  :value="item.key"
                >
                  <span style="float: left">{{ item.value }}</span>
                  <span style="float: right; color: #8492a6; font-size: 13px">{{
                    item.key
                  }}</span>
                </el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="请输起始行:"
              ><el-input
                v-model="relocationInfo.startRow"
                style="width: 180px"
                label="请输起始行"
              ></el-input>
            </el-form-item>
            <el-form-item label="请输起始列:"
              ><el-input
                v-model="relocationInfo.startColumn"
                style="width: 180px"
                label="请输起始列"
              ></el-input>
            </el-form-item>
            <el-form-item label="请输起始层:"
              ><el-input
                v-model="relocationInfo.startLayer"
                style="width: 180px"
                label="请输起始层"
              ></el-input>
            </el-form-item>
            <el-form-item label="请输目标行:"
              ><el-input
                v-model="relocationInfo.targetRow"
                style="width: 180px"
                label="请输目标行"
              ></el-input>
            </el-form-item>
            <el-form-item label="请输目标列:"
              ><el-input
                v-model="relocationInfo.targetColumn"
                style="width: 180px"
                label="请输目标列"
              ></el-input>
            </el-form-item>
            <el-form-item label="请输目标层:"
              ><el-input
                v-model="relocationInfo.targetLayer"
                style="width: 180px"
                label="请输目标层"
              ></el-input>
            </el-form-item>
          </el-form>
        </div>
        <template #footer>
          <el-button type="primary" size="small" @click="submit">确认</el-button>
          <el-button type="danger" size="small" @click="close">关闭</el-button>
        </template>
      </vol-box>
    </div>
  </template>
      <script>
  import VolBox from "@/components/basic/VolBox.vue";
  export default {
    components: { VolBox },
    data() {
      return {
        showDetialBox: false,
        Roadways: [
          { key: "SC01_CP", value: "1号堆垛机-成品库" },
          { key: "SC02_CP", value: "2号堆垛机-成品库" },
          { key: "SC03_CP", value: "3号堆垛机-成品库" },
          { key: "SC04_CP", value: "4号堆垛机-成品库" },
          { key: "SC05_CP", value: "5号堆垛机-成品库" },
          { key: "SC01_YL", value: "1号堆垛机-原料库" },
          { key: "SC02_YL", value: "2号堆垛机-原料库" },
          { key: "SC03_YLDual", value: "3号堆垛机-原料库" },
          { key: "SC04_YLDual", value: "4号堆垛机-原料库" },
          { key: "SC05_YLDual", value: "5号堆垛机-原料库" },
        ],
        relocationInfo: {
          startRow: null,
          startColumn: null,
          startLayer: null,
          targetRow: null,
          targetColumn: null,
          targetLayer: null,
          roadWay: ""
        },
      };
    },
    methods: {
      open() {
        this.showDetialBox = true;
      },
      close() {
        this.showDetialBox = false;
        this.relocationInfo = {
          startRow: null,
          startColumn: null,
          startLayer: null,
          targetRow: null,
          targetColumn: null,
          targetLayer: null,
          roadWay: ""
        }
      },
      submit() {
        if (this.relocationInfo.roadWay == "") return this.$message.error("请选择巷道");
        if (this.relocationInfo.startRow == null) return this.$message.error("请输入起始行");
        if (this.relocationInfo.startColumn == null) return this.$message.error("请输入起始列");
        if (this.relocationInfo.startLayer == null) return this.$message.error("请输入起始层");
        if (this.relocationInfo.targetRow == null) return this.$message.error("请输入目标行");
        if (this.relocationInfo.targetColumn == null) return this.$message.error("请输入目标列");
        if (this.relocationInfo.targetLayer == null) return this.$message.error("请输入目标层");
        this.http
          .post(
            "api/Task/Relocation",
            this.relocationInfo,
            "数据处理中"
          )
          .then((x) => {
            if (!x.status) return this.$message.error(x.message);
            this.$message.success("操作成功");
            this.$parent.refresh();
            this.close();
          });
      },
    },
    created() {},
  };
  </script>
      <style scoped>
  .el-col {
    border-radius: 4px;
  }
  .grid-content {
    border-radius: 4px;
    min-height: 36px;
  }
  .content-text {
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .right-text {
    display: flex;
    align-items: center;
    justify-content: flex-end;
  }
  </style>
      <style>
  .el-table .warning-row {
    background: #e6a23c;
  }
  .el-table .success-row {
    background: #f0f9eb;
  }
  .el-table .error-row {
    background: #f56c6c;
  }
  canvas {
    display: block;
    margin: auto;
  }
  </style>
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/taskinfo/task.js
@@ -1,10 +1,10 @@
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
import gridHeader from './extend/relocationTask.vue'
let extension = {
    components: {
      //查询界面扩展组件
      gridHeader: '',
      gridHeader: gridHeader,
      gridBody: '',
      gridFooter: '',
      //新建、编辑弹出框扩展组件
@@ -88,6 +88,12 @@
              });
        }
      }
      let relocationBtn = this.buttons.find(x => x.value == 'Relocation');
      if (relocationBtn) {
        relocationBtn.onClick = function () {
          this.$refs.gridHeader.open();
        }
      }
      },
      onInited() {
        //框架初始化配置后
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_BasicService/Service/LocationInfoService_Common.cs
@@ -125,7 +125,7 @@
                        }
                        //查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
                        List<Dt_LocationInfo> locationInfosMedium = BaseDal.QueryData(x => x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt() && x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);
                        Dt_LocationInfo locationInfo = new Dt_LocationInfo();
                        Dt_LocationInfo? locationInfo = null;
                        foreach (var item in locationInfosMedium)
                        {
                            if (LayerLimit && (item.Layer == 7 || item.Layer == 8))
@@ -133,6 +133,11 @@
                                locationInfo = item;
                                break;
                            }
                            if (!LayerLimit && item.Columns<=6 && item.Layer != 7 && item.Layer != 8)
                            {
                                locationInfo = item;
                                break;
                            }
                            //获取更改库位
                            Dt_LocationInfo? nearLocation1;
                            Dt_LocationInfo? nearLocation2;
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_Common/OrderEnum/OutboundOrderMenu.cs
@@ -55,6 +55,11 @@
        /// äºŒæœŸMES领料
        /// </summary>
        [Description("二期MES领料")]
        OutMESPick = 2
        OutMESPick = 2,
        /// <summary>
        /// äºŒæœŸæˆå“é”€å”®é¢†æ–™
        /// </summary>
        [Description("二期成品销售领料")]
        OutProSalePick = 3
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_DTO/Task/WMSTaskDTO.cs
@@ -95,4 +95,38 @@
        public string WorkCentreCode { get; set; }
    }
    /// <summary>
    /// ç§»åº“指令
    /// </summary>
    public class RelocationDTO
    {
        /// <summary>
        /// èµ·å§‹è¡Œ
        /// </summary>
        public int StartRow { get; set; }
        /// <summary>
        /// èµ·å§‹åˆ—
        /// </summary>
        public int StartColumn { get; set; }
        /// <summary>
        /// èµ·å§‹åˆ—
        /// </summary>
        public int StartLayer { get; set; }
        /// <summary>
        /// ç›®æ ‡è¡Œ
        /// </summary>
        public int TargetRow { get; set; }
        /// <summary>
        /// ç›®æ ‡åˆ—
        /// </summary>
        public int TargetColumn { get; set; }
        /// <summary>
        /// ç›®æ ‡å±‚
        /// </summary>
        public int TargetLayer { get; set; }
        /// <summary>
        /// ç§»åº“巷道
        /// </summary>
        public string RoadWay { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -180,13 +180,13 @@
        WebResponseContent RequestYLWMSTaskOut(YLWMSTaskOutDTO yLWMSTaskOutDTO);
        /// <summary>
        /// åŽŸæ–™ç§»åº“
        /// ç§»åº“
        /// </summary>
        /// <param name="startAddress"></param>
        /// <param name="endAddress"></param>
        /// <param name="roadWay"></param>
        /// <returns></returns>
        WebResponseContent IsRelocation(string startAddress, string endAddress, string roadWay);
        WebResponseContent IsRelocation(RelocationDTO relocationDTO);
        /// <summary>
        /// åŽŸæ–™å··é“é—´ç§»åº“ä»»åŠ¡
        /// </summary>
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs
@@ -117,7 +117,7 @@
                    MaterielCode = materielInfo.MaterielCode,
                    MaterielName=materielInfo.MaterielName,
                };
                if (wide>1200)
                if (wide>=1160)
                {
                    stockInfo.PalletType = 2;
                }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -282,7 +282,7 @@
                            IsPick = returnMaterial.Whether == 0 ? WhetherEnum.True.ObjToInt() : WhetherEnum.False.ObjToInt(),
                            Remark = StockStatusEmun.MES余料退库.ToString()
                        };
                        if (stockInfo.MaterielWide > 1200)
                        if (stockInfo.MaterielWide >= 1160)
                        {
                            stockInfo.PalletType = 2;
                        }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Completed.cs
@@ -13,6 +13,7 @@
using WIDESEA_Core;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Task;
using WIDESEA_External.Model;
using WIDESEA_Model.Models;
namespace WIDESEA_TaskInfoService
@@ -107,6 +108,24 @@
                    wmsTask.TaskType = task.TaskType;
                    wmsTask.TargetAddress = task.TargetAddress;
                    BaseDal.UpdateData(wmsTask);
                    if (wmsTask.TaskType>=TaskTypeEnum.WFBYLInbound.ObjToInt() && wmsTask.TaskType <= TaskTypeEnum.PrintYLInbound.ObjToInt() && wmsTask.TaskStatus==TaskStatusEnum.AGV_TakeFinish.ObjToInt())
                    {
                        Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x=>x.PalletCode== wmsTask.PalletCode);
                        string request = _invokeERPService.ERPSemiProInUp(
                            new ERPProInUpModel()
                            {
                                PB_INV_PRODUCT_IN = new List<PB_INV_PRODUCT_INItem>()
                                {
                                    new PB_INV_PRODUCT_INItem()
                                    {
                                        WP_ID = 0,
                                        INV_BARCODE = wmsTask.PalletCode,
                                        REMARK = "半成品入库",
                                        QTY=(int)stockInfo.StockLength
                                    }
                                }
                            }) ?? throw new Exception("半成品入库接口请求失败");
                    }
                }
                return WebResponseContent.Instance.OK();
            }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -459,9 +459,9 @@
                        {
                            throw new Exception($"未找到入库单号为{inboundOrder.PurchaseOrderNo}条码{palletCode}单据信息");
                        }
                        if (inboundOrderDetail.PurchaseDetailWide < 690)
                        if (inboundOrderDetail.PurchaseDetailWide < 690 || inboundOrderDetail.PurchaseDetailWide > 2500)
                        {
                            return content.Error("新厂物料幅宽限制为690-2700mm");
                            return content.Error($"物料幅宽限制为690-2500mm,当前纸卷幅宽{inboundOrderDetail.PurchaseDetailWide}");
                        }
                        if (inboundOrderDetail.PurchaseDetailThickness <= 0)
                        {
@@ -509,7 +509,7 @@
                                BatchNo = inboundOrderDetail.MaterialLot,
                                StockLength = inboundOrderDetail.PurchaseDetailQuantity
                            };
                            if (inboundOrderDetail.PurchaseDetailWide > 1200)
                            if (inboundOrderDetail.PurchaseDetailWide >= 1160)
                            {
                                stockInfo.PalletType = 2;
                            }
@@ -554,9 +554,9 @@
                        {
                            throw new Exception($"未找到入库单号为{inboundOrder.UpperOrderNo}条码{palletCode}单据信息");
                        }
                        if (inboundOrderDetail.MaterialWide < 690)
                        if (inboundOrderDetail.MaterialWide < 690 || inboundOrderDetail.MaterialWide > 2500)
                        {
                            return content.Error("新厂物料幅宽限制为690-2700mm");
                            return content.Error($"物料幅宽限制为690-2500mm,当前纸卷幅宽{inboundOrderDetail.MaterialWide}");
                        }
                        if (inboundOrderDetail.MaterialThick <= 0)
                        {
@@ -604,7 +604,7 @@
                                BatchNo = inboundOrderDetail.MaterialLot,
                                StockLength = inboundOrderDetail.OrderQuantity
                            };
                            if (inboundOrderDetail.MaterialWide > 1200)
                            if (inboundOrderDetail.MaterialWide >= 1160)
                            {
                                stockInfo.PalletType = 2;
                            }
@@ -651,9 +651,11 @@
                        }
                        BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{palletCode}的库存信息");
                        if (bSTStockInfoDTO.W < 690 || bSTStockInfoDTO.W > 2500)
                        {
                            return content.Error($"物料幅宽限制为690-2500mm,当前纸卷幅宽{bSTStockInfoDTO.W}");
                        }
                        Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterialSourceId == bSTStockInfoDTO.MaterialId) ?? throw new Exception($"未找到条码{palletCode}物料信息{bSTStockInfoDTO.MaterialNo}");
                        //生成库存组盘信息
                        Dt_StockInfo stockInfo = new Dt_StockInfo()
                        {
@@ -675,7 +677,7 @@
                            StockLength = bSTStockInfoDTO.StockMeter,
                            MaterielId = materielInfo.MaterialSourceId
                        };
                        if (bSTStockInfoDTO.W > 1200)
                        if (bSTStockInfoDTO.W >= 1160)
                        {
                            stockInfo.PalletType = 2;
                        }
@@ -729,6 +731,10 @@
                        }
                        else if (yLInboundCache.BarCode != palletCode && yLInboundCache.BindStatus == WhetherEnum.True.ObjToInt())
                        {
                            if (purchaseBSTOrderDetail.MaterialWide < 690 || purchaseBSTOrderDetail.MaterialWide > 2500)
                            {
                                return content.Error($"物料幅宽限制为690-2500mm,当前纸卷幅宽{purchaseBSTOrderDetail.MaterialWide}");
                            }
                            yLInboundCache = _mapper.Map<Dt_YLInboundCache>(purchaseBSTOrderDetail);
                            yLInboundCache.Id = Id;
                            //获取采购主单
@@ -756,7 +762,7 @@
                                StockLength = purchaseBSTOrderDetail.ProcurementLength,
                                MaterielId = purchaseBSTOrderDetail.MaterialId
                            };
                            if (purchaseBSTOrderDetail.MaterialWide > 1200)
                            if (purchaseBSTOrderDetail.MaterialWide >= 1160)
                            {
                                stockInfo.PalletType = 2;
                            }
@@ -1051,6 +1057,21 @@
                    _unitOfWorkManage.CommitTran();
                    //记录库存变动
                    _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.StockLength, 0, StockChangeTypeEnum.Inbound,taskNum:task.TaskNum);
                    //上报新厂ERP
                    if (stockInfo.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt() && task.TaskType == TaskTypeEnum.Inbound.ObjToInt())
                    {
                        string request = _invokeERPService.ERPPurchaseUp(new ERPPurchaseUpModel()
                        {
                            INV_BARCODE_RFID = new List<INV_BARCODE_RFIDItem>()
                            {
                                new INV_BARCODE_RFIDItem()
                                {
                                    INV_BARCODE=stockInfo.PalletCode,
                                    RFID_BARCODE=stockInfo.RfidCode
                                }
                            }
                        });
                    }
                    //上报老厂ERP
                    if (stockInfo.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && task.TaskType == TaskTypeEnum.Inbound.ObjToInt())
                    {
@@ -1631,7 +1652,7 @@
                    MaterielCode = materielInfo.MaterielCode,
                    MaterielName = materielInfo.MaterielName,
                };
                if (wide > 1200)
                if (wide >= 1160)
                {
                    stockInfo.PalletType = 2;
                }
@@ -1717,7 +1738,7 @@
                    MaterielCode = materielInfo.MaterielCode,
                    MaterielName = materielInfo.MaterielName,
                };
                if (wide > 1200)
                if (wide >= 1160)
                {
                    stockInfo.PalletType = 2;
                }
@@ -1895,7 +1916,7 @@
                        MaterielName = materielInfo.MaterielName,
                        StockLength=item.ProQuantity
                    };
                    if (item.Wide > 1200)
                    if (item.Wide >= 1160)
                    {
                        stockInfo.PalletType = 2;
                    }
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -136,12 +136,32 @@
                    if (proStockInfo != null && proStockInfo.StockStatus==StockStatusEmun.出库锁定.ObjToInt())
                    {
                        task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                        //获取所有出库详情数据
                        List<Dt_OutStockLockInfo>? outStockLockInfos = _outboundRepository.OutStockLockInfoRepository.QueryData(x => x.TaskNum == task.TaskNum);
                        _unitOfWorkManage.BeginTran();
                        proStockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                        _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo,App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                        if (proStockInfo.proStockInfoDetails!=null && proStockInfo.proStockInfoDetails.Count>0)
                        {
                            _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfo.proStockInfoDetails, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                        }
                        if (outStockLockInfos != null && outStockLockInfos.Count > 0)
                        {
                            outStockLockInfos.ForEach(x =>
                            {
                                x.Status = OutLockStockStatusEnum.出库完成.ObjToInt();
                            });
                            List<Dt_OutStockLockInfo> outStockLockInfosMES = outStockLockInfos.Where(x => x.OrderType == OutOrderTypeEnum.OutMESPick.ObjToInt()).ToList();
                            if (outStockLockInfosMES != null && outStockLockInfosMES.Count() > 0)
                            {
                                Dt_AGVStationInfo aGVStationInfo = _basicRepository.AGVStationInfoRepository.QueryFirst(x => x.AGVStationCode == task.TargetAddress);
                                MESDeliveryModel mESDeliveryModel = MESDeliveryUp(outStockLockInfosMES, aGVStationInfo.MESPointCode);
                                MESResponse response = _invokeMESService.MESDelivery(mESDeliveryModel).DeserializeObject<MESResponse>() ?? throw new Exception("未获取到返回信息");
                                if (!response.Result)
                                {
                                    throw new Exception($"MES配送出发接口调用报错,MES返回信息{DecodeUnicode(response.Msg)}");
                                }
                            }
                        }
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
@@ -1049,6 +1069,7 @@
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Reloaction.cs
@@ -132,84 +132,185 @@
        //}
        public WebResponseContent RelocationTaskCompleted(Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                if (stockInfo == null)
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId);
                if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString() || warehouse.WarehouseCode == WarehouseEnum.LLDFL.ToString()) //成品/辅料完成
                {
                    return WebResponseContent.Instance.Error($"未找到对应货位的库存信息");
                    Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode && x.LocationCode == task.SourceAddress).Includes(x => x.proStockInfoDetails).First();
                    if (proStockInfo == null)
                    {
                        return content.Error($"未找到对应的库存信息");
                    }
                    Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                    if (locationInfoStart == null)
                    {
                        return content.Error($"未找到对应的起点货位信息");
                    }
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
                    {
                        return content.Error($"未找到对应的终点货位信息");
                    }
                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    proStockInfo.LocationCode = locationInfoEnd.LocationCode;
                    proStockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                    _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, proStockInfo.PalletType, LocationStatusEnum.InStock, proStockInfo.WarehouseId);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                    _unitOfWorkManage.CommitTran();
                }
                else
                {
                    Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == task.PalletCode && x.LocationCode == task.SourceAddress);
                    if (stockInfo == null)
                    {
                        return content.Error($"未找到对应的库存信息");
                    }
                Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                if (locationInfoStart == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的起点货位信息");
                }
                    Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                    if (locationInfoStart == null)
                    {
                        return content.Error($"未找到对应的起点货位信息");
                    }
                Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                if (locationInfoEnd == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null)
                    {
                        return content.Error($"未找到对应的终点货位信息");
                    }
                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    stockInfo.LocationCode = locationInfoEnd.LocationCode;
                    stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                    _unitOfWorkManage.CommitTran();
                }
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                _unitOfWorkManage.BeginTran();
                stockInfo.LocationCode = locationInfoEnd.LocationCode;
                stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
                return content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent IsRelocation(string startAddress,string endAddress,string roadWay)
        /// <summary>
        /// ç§»åº“
        /// </summary>
        /// <param name="startAddress"></param>
        /// <param name="endAddress"></param>
        /// <param name="roadWay"></param>
        /// <returns></returns>
        public WebResponseContent IsRelocation(RelocationDTO relocation)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取货位
                Dt_LocationInfo startLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == startAddress);
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.LocationCode == startAddress);
                Dt_LocationInfo endLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == endAddress);
                Dt_LocationInfo startLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.Row == relocation.StartRow && x.Columns == relocation.StartColumn && x.Layer == relocation.StartLayer && x.RoadwayNo == relocation.RoadWay);
                Dt_LocationInfo endLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.Row == relocation.TargetRow && x.Columns == relocation.TargetColumn && x.Layer == relocation.TargetLayer && x.RoadwayNo == relocation.RoadWay);
                //判断条件
                if (startLocationInfo != null && startLocationInfo.LocationStatus==LocationStatusEnum.InStock.ObjToInt() && endLocationInfo != null && endLocationInfo.LocationStatus==LocationStatusEnum.Free.ObjToInt() && endLocationInfo.EnableStatus==EnableStatusEnum.Normal.ObjToInt() && stockInfo!=null)
                if (startLocationInfo != null && startLocationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && startLocationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && endLocationInfo != null && endLocationInfo.LocationStatus == LocationStatusEnum.Free.ObjToInt() && endLocationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt())
                {
                    Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.LocationCode == startLocationInfo.LocationCode);
                    Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.LocationCode == startLocationInfo.LocationCode);
                    bool IsCPRoadway = relocation.RoadWay.Contains("CP");
                    bool IsYLRoadway = relocation.RoadWay.Contains("YL");
                    if ((IsCPRoadway && proStockInfo==null) || (IsYLRoadway && stockInfo == null))
                    {
                        throw new Exception($"未找到{relocation.RoadWay}移库库存");
                    }
                    Dt_StockInfo stockInfoEnd = _stockRepository.StockInfoRepository.QueryFirst(x => x.LocationCode == endLocationInfo.LocationCode);
                    Dt_ProStockInfo proStockEnd = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.LocationCode == endLocationInfo.LocationCode);
                    if ((IsCPRoadway && proStockEnd != null) || (IsYLRoadway && stockInfoEnd != null))
                    {
                        throw new Exception($"{relocation.RoadWay}目标库存已存在");
                    }
                    if (relocation.RoadWay.Contains("YLDual"))
                    {
                        if (startLocationInfo.LocationType != endLocationInfo.LocationType)
                        {
                            throw new Exception($"混合巷道{relocation.RoadWay}起始与目标货位类型不符,请查看货位状态");
                        }
                        if (stockInfo.PalletType != endLocationInfo.LocationType)
                        {
                            throw new Exception($"混合巷道{relocation.RoadWay}移库库存与目标货位类型不符,请查看货位状态");
                        }
                        if ((relocation.TargetLayer == 7 || relocation.TargetLayer == 8) && stockInfo.CheckThickness>700)
                        {
                            throw new Exception($"目标货位限高700,移库库存高度{stockInfo.CheckThickness}超出");
                        }
                        if (relocation.TargetColumn >= 7 && relocation.TargetLayer != 7 && relocation.TargetLayer != 8 && endLocationInfo.LocationType==LocationTypeEnum.MediumPallet.ObjToInt())
                        {
                            ////获取更改库位
                            Dt_LocationInfo? nearLocation1;
                            Dt_LocationInfo? nearLocation2;
                            nearLocation1 = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && x.Row == endLocationInfo.Row && x.Layer == endLocationInfo.Layer && x.Columns == endLocationInfo.Columns - 1);
                            nearLocation2 = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && x.Row == endLocationInfo.Row && x.Layer == endLocationInfo.Layer && x.Columns == endLocationInfo.Columns + 1);
                            if (nearLocation1 == null || nearLocation2 == null)
                            {
                                throw new Exception($"目标货位{endLocationInfo.LocationCode}为大货类型,两侧小货位存在占用或禁用状态,请查看货位状态");
                            }
                        }
                    }
                    else if (relocation.RoadWay.Contains("YL"))
                    {
                        if ((endLocationInfo.Columns < 56 && startLocationInfo.Columns>=56) && stockInfo.CheckThickness > 1300)
                        {
                            throw new Exception($"移库货位物料高度{stockInfo.CheckThickness}超出1300,目标货位存放规则超出");
                        }
                    }
                    //生成任务
                    Dt_Task newTask = new Dt_Task()
                    {
                        Roadway = roadWay,
                        WarehouseId = stockInfo.WarehouseId,
                        Roadway = relocation.RoadWay,
                        WarehouseId = IsCPRoadway ? proStockInfo.WarehouseId:stockInfo.WarehouseId,
                        CurrentAddress = startLocationInfo.LocationCode,
                        Grade = 99,
                        NextAddress = endLocationInfo.LocationCode,
                        OrderNo = "",
                        PalletCode = stockInfo.PalletCode,
                        PalletType = stockInfo.PalletType,
                        PalletCode = IsCPRoadway ? proStockInfo.PalletCode : stockInfo.PalletCode,
                        PalletType = IsCPRoadway ? proStockInfo.PalletType : stockInfo.PalletType,
                        SourceAddress = startLocationInfo.LocationCode,
                        TargetAddress = endLocationInfo.LocationCode,
                        TaskNum = Repository.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                        TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt(),
                        TaskType = TaskTypeEnum.Relocation.ObjToInt()
                    };
                    stockInfo.StockStatus = StockStatusEmun.移库锁定.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    Repository.AddData(newTask);
                    _basicService.LocationInfoService.UpdateLocationStatus(startLocationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                    _basicService.LocationInfoService.UpdateLocationStatus(endLocationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    if (!IsCPRoadway)
                    {
                        stockInfo.StockStatus = StockStatusEmun.移库锁定.ObjToInt();
                        _basicService.LocationInfoService.UpdateLocationStatus(startLocationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                        _basicService.LocationInfoService.UpdateLocationStatus(endLocationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
                        _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                    }
                    else
                    {
                        proStockInfo.StockStatus = StockStatusEmun.移库锁定.ObjToInt();
                        _basicService.LocationInfoService.UpdateLocationStatus(startLocationInfo, proStockInfo.PalletType, LocationStatusEnum.Lock, proStockInfo.WarehouseId);
                        _basicService.LocationInfoService.UpdateLocationStatus(endLocationInfo, proStockInfo.PalletType, LocationStatusEnum.Lock, proStockInfo.WarehouseId);
                        _stockService.ProStockInfoService.Repository.UpdateData(proStockInfo);
                    }
                    _unitOfWorkManage.CommitTran();
                    PushTasksToWCS(new List<Dt_Task> { newTask });
                    content.OK("成功");
                }
                else
                {
                    content.Error("库存货位信息为空");
                    content.Error("移库或目标货位不满足移库条件,请查看两货位状态");
                }
            }
            catch (Exception ex)
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/ERP/ErpBSTController.cs
@@ -81,7 +81,7 @@
        /// æŽ¥æ”¶ä¸€æœŸç”Ÿç®¡æŽ’程信息
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ReceiveOutOrder"), AllowAnonymous]
        [HttpPost, HttpGet, Route("ReceiveOutOrder")]
        public WebResponseContent AddOutSGOrder([FromBody] List<SGOutOrderDTO> outOrderDTOs)
        {
            return _taskService.AddOutSGOrder(outOrderDTOs);
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -251,13 +251,13 @@
        }
        /// <summary>
        /// åŽŸæ–™ç§»åº“ä»»åŠ¡
        /// ç§»åº“任务
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("Relocation"), AllowAnonymous]
        public WebResponseContent IsRelocation(string startAddress, string endAddress, string roadWay)
        public WebResponseContent IsRelocation([FromBody] RelocationDTO relocationDTO)
        {
            return Service.IsRelocation(startAddress, endAddress, roadWay);
            return Service.IsRelocation(relocationDTO);
        }
        /// <summary>
        /// åŽŸæ–™å··é“é—´ç§»åº“ä»»åŠ¡