1
hutongqing
2025-01-14 cbf06cbb2e7988fdee53507dede034756ebfbf59
1
已删除2个文件
已修改15个文件
已添加4个文件
524 ■■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/8cc7cbb4-d887-4b48-8514-053a923806f4.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/d4533ff6-1092-4623-9eeb-5bb2576b9496.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/ConveyorLineJob_BC.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/StackerCraneJob_BC.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/config/buttons.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/addMesOutOrder.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/mesOutboundOrder.js 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/outbound/mesOutboundOrder.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/dd0e45d4-3741-49da-b1eb-25a4729fc53f.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/e4b1e0fc-35f7-4429-a875-5134044c30dc.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/MesOutboundOrderType.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesOutboundOrderService.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesOutboundOrderService.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/AssignInboundTaskLocation_BC.cs 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/MesOutboundOrderController.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundOrderController.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/淮安PDA/common/config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/8cc7cbb4-d887-4b48-8514-053a923806f4.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/d4533ff6-1092-4623-9eeb-5bb2576b9496.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/ConveyorLineJob_BC.cs
@@ -114,6 +114,13 @@
                                        _taskService.UpdateTask(task, TaskStatusEnum.Line_Execute, deviceCode: item.StationDeviceCode, roadwayNo: responseContent.Data.ToString() ?? "");
                                    }
                                }
                                else
                                {
                                    if (conveyorLineInfoWrite.Spare2 != 0)
                                    {
                                        WriteDebug(device.DeviceName, $"启动信号已写入");
                                    }
                                }
                                #endregion
                            }
@@ -173,6 +180,10 @@
                                        device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                        _taskService.UpdateTask(task, taskState, currentAddress: currentAddress, nextAddress: nextAddress, targetAddress: targetAddress, deviceCode: deviceCode);
                                    }
                                    else
                                    {
                                        WriteInfo(device.DeviceName, $"未找到托盘{conveyorLineInfoRead.Barcode}对应的任务信息");
                                    }
                                    #endregion
                                }
                                else//生产退库
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/StackerCraneJob_BC.cs
@@ -169,16 +169,17 @@
                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StackerCraneStationCode == task.NextAddress);
                        if (stationManger == null)
                        {
                            _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"输送线出库站点未配置,{task.NextAddress}");
                            //_taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"输送线出库站点未配置,{task.NextAddress}");
                            _taskService.UpdateTaskExceptionMessage(taskNum, $"输送线出库站点未配置,{task.NextAddress}");
                            WriteInfo(deviceCode, $"输送线出库站点未配置,{task.NextAddress}");
                            WriteError(deviceCode, $"输送线出库站点未配置,{task.NextAddress}");
                            return WebResponseContent.Instance.Error($"输送线出库站点未配置,{task.NextAddress}");
                        }
                        Dt_Router router = _routerRepository.QueryFirst(x => x.InOutType == task.TaskType && x.StartPosi == stationManger.StationCode);
                        if (router == null)
                        {
                            _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"未找到路由信息,{task.NextAddress}");
                            //_taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"未找到路由信息,{task.NextAddress}");
                            _taskService.UpdateTaskExceptionMessage(taskNum, $"未找到路由信息,{task.NextAddress}");
                            WriteError(deviceCode, $"未找到路由信息,{task.NextAddress}");
                            return WebResponseContent.Instance.Error($"未找到路由信息,{task.NextAddress}");
                        }
@@ -338,7 +339,7 @@
            stackerCraneTaskCommand.Barcode = task.PalletCode;
            stackerCraneTaskCommand.TaskNum = task.TaskNum;
            stackerCraneTaskCommand.WorkType = 1;
            stackerCraneTaskCommand.TrayType = (Int16)task.PalletType;
            stackerCraneTaskCommand.TrayType = (short)task.PalletType;
            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//判断是否是入库任务
            {
                string[] startCodes = task.CurrentAddress.Split("-");
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/config/buttons.js
@@ -171,6 +171,15 @@
    onClick: function () {
    }
},
{
    name: "执行出库",
    icon: '',
    class: '',
    value: 'ExecuteOutbound',
    type: 'success',
    onClick: function () {
    }
},
]
export default buttons
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/addMesOutOrder.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,163 @@
<template>
  <div>
    <vol-box
      v-model="showDetailBox"
      :lazy="true"
      width="60%"
      :padding="15"
      title="Mes出库单(新建)"
    >
      <div>
        <el-form :inline="true" :model="formData" ref="formData">
          <el-form-item
            label="所属仓库:"
            style="width: 30%"
            required
            prop="warehouseId"
          >
            <el-select v-model="formData.warehouseId" placeholder="请选择仓库">
              <el-option label="板材仓" value="3"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item
            label="物料编码:"
            style="width: 30%"
            required
            prop="materialCode"
          >
            <el-input
              v-model="formData.materialCode"
              placeholder="请输入物料编码"
            ></el-input>
          </el-form-item>
          <el-form-item
            label="出库数量:"
            style="width: 30%"
            required
            prop="num"
          >
            <el-input-number
              v-model="formData.num"
              :min="1"
              label="请输入出库数量"
            ></el-input-number>
          </el-form-item>
          <el-form-item
            label="出库地址:"
            style="width: 30%"
            required
            prop="outAddress"
          >
            <el-select
              v-model="formData.outAddress"
              placeholder="请选择出库地址"
            >
              <el-option label="一巷道二层上料位" value="1011"></el-option>
              <el-option label="SCUTL-001" value="SCUTL-001"></el-option>
            </el-select>
          </el-form-item>
          <!-- <el-form-item label="仓库">
            <el-col :span="8">
              <el-select v-model="warehouseId" placeholder="请选择仓库">
                <el-option label="板材仓" value="3"></el-option>
              </el-select>
            </el-col>
          </el-form-item> -->
        </el-form>
      </div>
      <template #footer>
        <el-button type="primary" size="small" @click="add">确定</el-button>
        <el-button type="danger" size="small" @click="showDetailBox = false"
          >关闭</el-button
        >
      </template>
    </vol-box>
  </div>
</template>
  <script>
import VolBox from "@/components/basic/VolBox.vue";
export default {
  components: { VolBox },
  data() {
    return {
      showDetailBox: false,
      formData: {
        warehouseId: "",
        materialCode: "",
        num: 1,
        outAddress: "",
      },
    };
  },
  methods: {
    open() {
      this.showDetailBox = true;
    },
    add() {
      var params = {
        //warehouseId: this.formData.warehouseId,
        materialCode: this.formData.materialCode,
        requiredQuantity: this.formData.num,
        line: this.formData.outAddress,
      };
      this.http
        .post("/api/mesOutboundOrder/AddMesOrder", params, "数据处理中...")
        .then((res) => {
          if (!res.status) return this.$message.error(x.message);
          this.$message.success("操作成功");
          this.showDetailBox = false;
          this.$emit("parentCall", ($vue) => {
            $vue.refresh();
          });
        });
    },
  },
};
</script>
  <style scoped>
.less-style {
  color: black;
}
.equle-style {
  color: green;
}
.more-style {
  color: red;
}
</style>
  <style>
.text-button:hover {
  background-color: #f0f9eb !important;
}
.el-table .warning-row {
  background: oldlace;
}
.box-table .el-table tbody tr:hover > td {
  background-color: #d8e0d4 !important;
  /* color: #ffffff; */
}
.box-table .el-table tbody tr.current-row > td {
  background-color: #f0f9eb !important;
  /* color: #ffffff; */
}
.el-table .success-row {
  background: #f0f9eb;
}
.box-table .el-table {
  border: 1px solid #ebeef5;
}
.box-head .el-alert__content {
  width: 100%;
}
</style>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/outbound/mesOutboundOrder.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
import gridBody from './extend/addMesOutOrder.vue'
let extension = {
  components: {
    //查询界面扩展组件
    gridHeader: '',
    gridBody: gridBody,
    gridFooter: '',
    //新建、编辑弹出框扩展组件
    modelHeader: '',
    modelBody: '',
    modelFooter: ''
  },
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
  methods: {
    //下面这些方法可以保留也可以删除
    onInit() {
      let addButton = this.buttons.find(item => item.value == 'Add');
      if (addButton) {
        addButton.onClick = () => {
          this.$refs.gridBody.open();
        }
      }
      let executeOutbound = this.buttons.find(item => item.value == 'ExecuteOutbound');
      if (executeOutbound) {
        executeOutbound.onClick = () => {
          let rows = this.$refs.table.getSelected();
          if (rows.length == 0) return this.$error("请选择数据!");
          if (rows.length > 1) return this.$error("请选择一条数据!");
          var param = rows[0].taskNum;
          this.http
            .post("api/Task/HandSubstrateOut?orderId=" + rows[0].id, "数据处理中...")
            .then((x) => {
              if (x.status) {
                this.$Message.success('数据处理成功.');
                this.refresh();
              } else {
                return this.$error(x.message);
              }
            });
        }
      }
      //扩展页面初始化操作
      this.columns.push({
        field: '操作',
        title: '操作',
        width: 90,
        fixed: 'right',
        align: 'center',
        formatter: (row) => {
          return (
            '<i style="cursor: pointer;color: #2d8cf0;"class="el-icon-view">查看明细</i>'
          );
        },
        click: (row) => {
          this.$refs.gridBody.open(row);
        }
      });
    },
    onInited() {
      //框架初始化配置后
      //如果要配置明细表,在此方法操作
      //this.detailOptions.columns.forEach(column=>{ });
    },
    searchBefore(param) {
      //界面查询前,可以给param.wheres添加查询参数
      //返回false,则不会执行查询
      return true;
    },
    searchAfter(result) {
      //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
      return true;
    },
    addBefore(formData) {
      //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
      return true;
    },
    updateBefore(formData) {
      //编辑保存前formData为对象,包括明细表、删除行的Id
      return true;
    },
    rowClick({ row, column, event }) {
      //查询界面点击行事件
      this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
    },
    modelOpenAfter(row) {
      //点击编辑、新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
      //(1)判断是编辑还是新建操作: this.currentAction=='Add';
      //(2)给弹出框设置默认值
      //(3)this.editFormFields.字段='xxx';
      //如果需要给下拉框设置默认值,请遍历this.editFormOptions找到字段配置对应data属性的key值
      //看不懂就把输出看:console.log(this.editFormOptions)
    }
  }
};
export default extension;
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/outbound/mesOutboundOrder.vue
@@ -14,7 +14,7 @@
    </view-grid>
  </template>
    <script>
  import extend from "@/extension/outbound/outboundOrderDetail.js";
  import extend from "@/extension/outbound/mesOutboundOrder.js";
  import { ref, defineComponent } from "vue";
  export default defineComponent({
    setup() {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/dd0e45d4-3741-49da-b1eb-25a4729fc53f.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/e4b1e0fc-35f7-4429-a875-5134044c30dc.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/MesOutboundOrderType.cs
@@ -23,5 +23,17 @@
        /// </summary>
        [Description("基板余料退库")]
        SubstrateBack = 200,
        /// <summary>
        /// æ‰‹åŠ¨åŸºæ¿å‡ºåº“
        /// </summary>
        [Description("手动基板出库")]
        HandSubstrateOut = 300,
        /// <summary>
        /// æ‰‹åŠ¨åŸºæ¿å‡ºåº“æ‹£é€‰
        /// </summary>
        [Description("手动基板出库拣选")]
        HandSubstrateOutPick = 400,
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs
@@ -41,6 +41,19 @@
        /// </summary>
        [Description("MES出库")]
        MesOutbound = 200,
        /// <summary>
        /// MES手动出库
        /// </summary>
        [Description("MES手动出库")]
        MesHandOutbound = 210,
        /// <summary>
        /// MES手动拣选出库
        /// </summary>
        [Description("MES手动拣选出库")]
        MesHandPickOutbound = 220,
        /// <summary>
        /// é‡‡è´­å…¥åº“
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesOutboundOrderService.cs
@@ -37,5 +37,12 @@
        /// <param name="tasks"></param>
        /// <returns></returns>
        WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
        /// <summary>
        ///
        /// </summary>
        /// <param name="substrateOutModel"></param>
        /// <returns></returns>
        WebResponseContent AddMesOrder(SubstrateOutModel substrateOutModel);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -239,11 +239,20 @@
        WebResponseContent AssignRoadway(List<string> roadwayNos);
        /// <summary>
        ///
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        WebResponseContent HandSubstrateOut(int orderId);
        /// <summary>
        /// ä¿®æ”¹ä»»åŠ¡çŠ¶æ€
        /// </summary>
        /// <param name="task"></param>
        /// <returns></returns>
        WebResponseContent UpdateTaskInfo(WCSTaskDTO task);
        WebResponseContent GeneratePKOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesOutboundOrderService.cs
@@ -21,6 +21,7 @@
using WIDESEA_Common.LocationEnum;
using WIDESEA_IRecordService;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
namespace WIDESEA_OutboundService
{
@@ -144,5 +145,54 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent AddMesOrder(SubstrateOutModel substrateOutModel)
        {
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA57.ToString());
                if (warehouse == null)
                {
                    return WebResponseContent.Instance.Error($"仓库基础信息未配置");
                }
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == substrateOutModel.MaterialCode);
                if (materielInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该物料信息");
                }
                int orderType = 0;
                if(substrateOutModel.Line == "1011")
                {
                    orderType = MesOutboundOrderTypeEnum.HandSubstrateOutPick.ObjToInt();
                }
                else
                {
                    orderType = MesOutboundOrderTypeEnum.HandSubstrateOut.ObjToInt();
                }
                Dt_MesOutboundOrder mesOutboundOrder = new Dt_MesOutboundOrder()
                {
                    CreateType = OrderCreateTypeEnum.CreateInSystem.ObjToInt(),
                    Line = substrateOutModel.Line,
                    MaterialCode = substrateOutModel.MaterialCode,
                    MaterialName = materielInfo.MaterielName,
                    OrderQuantity = substrateOutModel.RequiredQuantity,
                    TaskNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
                    Unit = substrateOutModel.Unit,
                    OrderType = orderType,
                    OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(),
                    WarehouseId = warehouse.WarehouseId
                };
                AddData(mesOutboundOrder);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/AssignInboundTaskLocation_BC.cs
@@ -5,9 +5,13 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Core;
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.MES;
using WIDESEA_Model.Models;
namespace WIDESEA_TaskInfoService
@@ -20,11 +24,11 @@
        /// <param name="taskNum">任务号</param>
        /// <param name="roadwayNos">巷道号</param>
        /// <returns></returns>
        public WebResponseContent AssignRoadway(List<string> roadwayNos, int taskNum,  int heightType = 0)
        public WebResponseContent AssignRoadway(List<string> roadwayNos, int taskNum, int heightType = 0)
        {
            try
            {
                if(heightType == 0 || heightType > 3)
                if (heightType == 0 || heightType > 3)
                {
                    return WebResponseContent.Instance.Error($"高度错误");
                }
@@ -89,8 +93,8 @@
                List<LocationCount> locationCounts = Db.Queryable<Dt_LocationInfo>().Where(x => (x.LocationType == task.PalletType || x.LocationType == LocationTypeEnum.Undefined.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && roadwayNos.Contains(x.RoadwayNo)).GroupBy(x => x.RoadwayNo).Select(x => new LocationCount { RoadwayNo = x.RoadwayNo, Count = SqlFunc.AggregateCount(x) }).ToList();
                string roadwayNo = locationCounts.OrderBy(x => x.Count).FirstOrDefault()?.RoadwayNo ?? "";
                return !string.IsNullOrEmpty(roadwayNo) ? WebResponseContent.Instance.OK(data: roadwayNo): WebResponseContent.Instance.Error("未找到可分配巷道");
                return !string.IsNullOrEmpty(roadwayNo) ? WebResponseContent.Instance.OK(data: roadwayNo) : WebResponseContent.Instance.Error("未找到可分配巷道");
            }
            catch (Exception ex)
            {
@@ -121,11 +125,99 @@
            }
        }
        public class LocationCount
        public WebResponseContent HandSubstrateOut(int orderId)
        {
            public string RoadwayNo { get; set; }
            try
            {
                Dt_MesOutboundOrder mesOutboundOrder = _outboundService.MesOutboundOrderService.Repository.QueryFirst(x => x.Id == orderId);
                if (mesOutboundOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该订单");
                }
            public int Count { get; set; }
                if (mesOutboundOrder.OrderStatus != OutOrderStatusEnum.未开始.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"该订单不可再出库");
                }
                List<Dt_Task> tasks = new List<Dt_Task>();
                List<Dt_StockInfo>? stockInfos = null;
                List<Dt_OutStockLockInfo>? outStockLockInfos = null;
                List<Dt_LocationInfo>? locationInfos = null;
                {
                    (List<Dt_StockInfo>, Dt_MesOutboundOrder, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.MesOutboundOrderService.AssignStockOutbound(mesOutboundOrder);
                    if (result.Item1 != null && result.Item1.Count > 0)
                    {
                        tasks = GetTasks(result.Item1, TaskTypeEnum.MesOutbound);
                        result.Item2.OrderStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
                        result.Item3.ForEach(x =>
                        {
                            x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                        });
                        stockInfos = result.Item1;
                        mesOutboundOrder = result.Item2;
                        outStockLockInfos = result.Item3;
                        locationInfos = result.Item4;
                    }
                    else
                    {
                        throw new Exception("无库存");
                    }
                }
                tasks.ForEach(x =>
                {
                    if (mesOutboundOrder.OrderType == MesOutboundOrderTypeEnum.HandSubstrateOut.ObjToInt())
                    {
                        x.TaskType = TaskTypeEnum.MesHandOutbound.ObjToInt();
                    }
                    else if (mesOutboundOrder.OrderType == MesOutboundOrderTypeEnum.HandSubstrateOutPick.ObjToInt())
                    {
                        x.TaskType = TaskTypeEnum.MesHandPickOutbound.ObjToInt();
                    }
                });
                mesOutboundOrder.OrderStatus = OutOrderStatusEnum.出库中.ObjToInt();
                _unitOfWorkManage.BeginTran();
                int id = BaseDal.AddData(tasks);
                outStockLockInfos.ForEach(x =>
                {
                    x.OrderNo = mesOutboundOrder.TaskNo;
                    x.OrderDetailId = id;
                });
                _outboundService.MesOutboundOrderService.Repository.UpdateData(mesOutboundOrder);
                if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
                {
                    WebResponseContent content = _outboundService.MesOutboundOrderService.LockOutboundStockDataUpdate(stockInfos, outStockLockInfos, locationInfos, tasks: tasks);
                    if (!content.Status)
                    {
                        _unitOfWorkManage.RollbackTran();
                        return WebResponseContent.Instance.Error(content.Message);
                    }
                }
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
    public class LocationCount
    {
        public string RoadwayNo { get; set; }
        public int Count { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -422,7 +422,7 @@
                }
                if (task.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())
                {
                    MesMaterialLotaAceptModel model = GetMesMaterialLotaAceptModel(stockInfo, stockInfo.Details.FirstOrDefault(), mesOutboundOrders.FirstOrDefault().TaskNo, warehouse.WarehouseCode, mesOutboundOrders.FirstOrDefault().OrderQuantity);
                    MesMaterialLotaAceptModel model = GetMesMaterialLotaAceptModel(stockInfo, stockInfo.Details.FirstOrDefault(), mesOutboundOrders.FirstOrDefault().TaskNo, warehouse.WarehouseCode, stockInfo.Details.Where(x => x.MaterielCode == mesOutboundOrders.FirstOrDefault().MaterialCode).Sum(x => x.StockQuantity));
                    UploadMesMaterialLotaAcept(model);
                }
                return WebResponseContent.Instance.OK();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/MesOutboundOrderController.cs
@@ -5,6 +5,7 @@
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.MES;
using WIDESEA_DTO.Outbound;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
@@ -22,5 +23,15 @@
        {
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="substrateOutModel"></param>
        /// <returns></returns>
        [HttpPost, Route("AddMesOrder"), AllowAnonymous]
        public WebResponseContent AddMesOrder([FromBody] SubstrateOutModel substrateOutModel)
        {
            return Service.AddMesOrder(substrateOutModel);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundOrderController.cs
@@ -23,6 +23,12 @@
        {
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpPost, Route("TestOutUpload"), AllowAnonymous]
        public WebResponseContent TestOutUpload(int id)
        {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -256,6 +256,17 @@
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        [HttpPost, Route("HandSubstrateOut")]
        public WebResponseContent HandSubstrateOut(int orderId)
        {
            return Service.HandSubstrateOut(orderId);
        }
        /// <summary>
        /// ä¿®æ”¹ä»»åŠ¡çŠ¶æ€
        /// </summary>
        /// <param name="task"></param>
´úÂë¹ÜÀí/»´°²PDA/common/config.js
@@ -1,5 +1,5 @@
let config = {
    baseUrl: 'http://10.30.4.92:9283',
    baseUrl: 'http://localhost:9293',
    urls: [
        'http://10.30.4.92:9283',
        'http://10.30.4.92:9283'