wangxinhui
2 天以前 2fbbc3ccaa4123a2d550fa64d91fa8ac25323a58
上传最新
已修改27个文件
已添加1个文件
1225 ■■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/erpProScrapSheet.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/ScrapSheet.vue 387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/outbound/erpProScrapSheet.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_CheckService/CheckOrderResultService.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IOutboundRepository.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IErpProScrapSheetDetailService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutProStockInfoService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IStockRepository/IProStockInfoRepository.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IProStockInfoService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_ErpProScrapSheet.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_ErpProScrapSheetDetail.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/OutboundRepository.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs 330 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutProStockInfoService.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockRepository/ProStockInfoRepository.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/ErpProScrapSheetDetailController.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -14,19 +14,16 @@
        /// </summary>
        [Description("领料出库")]
        Outbound = 100,
        /// <summary>
        /// ç›˜ç‚¹å‡ºåº“
        /// </summary>
        [Description("盘点出库")]
        OutInventory = 110,
        /// <summary>
        /// åˆ†æ‹£å‡ºåº“
        /// </summary>
        [Description("分拣出库")]
        OutPick = 120,
        /// <summary>
        /// è´¨æ£€å‡ºåº“
        /// </summary>
@@ -67,13 +64,16 @@
        /// </summary>
        [Description("成品出库")]
        OutProduct = 230,
        /// <summary>
        /// æˆå“æŠ¥åºŸå‡ºåº“
        /// </summary>
        [Description("成品报废出库")]
        OutProScrap = 235,
        /// <summary>
        /// æˆå“å¯„售出库
        /// </summary>
        [Description("成品寄售出库")]
        OutSendProduct = 240,
        /// <summary>
        /// æˆå“MES提库
        /// </summary>
@@ -91,7 +91,6 @@
        /// </summary>
        [Description("防焊前派工大件")]
        MaskOutNoticeLarge = 265,
        /// <summary>
        /// é˜²ç„Šåˆ°çº¿è¾¹å°ä»¶
        /// </summary>
@@ -103,25 +102,21 @@
        /// </summary>
        [Description("防焊到线边大件")]
        MaskOutLarge = 275,
        /// <summary>
        /// é‡‡è´­å…¥åº“
        /// </summary>
        [Description("采购入库")]
        Inbound = 510,
        /// <summary>
        /// ç›˜ç‚¹å…¥åº“
        /// </summary>
        [Description("盘点入库")]
        InInventory = 520,
        /// <summary>
        /// åˆ†æ‹£å…¥åº“
        /// </summary>
        [Description("分拣入库")]
        InPick = 530,
        /// <summary>
        /// è´¨æ£€å…¥åº“
        /// </summary>
@@ -195,6 +190,7 @@
        /// </summary>
        [Description("巷道内移库")]
        Relocation = 900
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/outbound/erpProScrapSheet.js
@@ -1,11 +1,10 @@
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
import gridBody from './extend/MesOutOrderDetail.vue'
import gridHeader from './extend/addMesOutOrder.vue'
import gridBody from './extend/ScrapSheet.vue'
let extension = {
  components: {
    //查询界面扩展组件
    gridHeader: gridHeader,
    gridHeader: '',
    gridBody: gridBody,
    gridFooter: '',
    //新建、编辑弹出框扩展组件
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/outbound/extend/ScrapSheet.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,387 @@
<template>
    <div>
        <vol-box
      v-model="dialogFormVisible"
      :on-model-close="closeCustomModel"
      :lazy="true"
      width="20%"
      :padding="15"
      title="选择出库线体"
    >
        <div>
          <VolForm
            ref="myform"
            :label-width="120"
            :loadKey="true"
            :formFields="formFields2"
            :formRules="formRules2"
          >
          </VolForm>
        </div>
        <template #footer>
          <!-- <el-button type="primary" size="small" @click="submit">确认</el-button> -->
          <el-button type="danger" size="small" @click="outbound"
            >出库</el-button
          >
        </template>
    </vol-box>
      <vol-box
        v-model="showDetialBox"
        :lazy="true"
        width="75%"
        :padding="15"
        title="报废明细"
      >
        <div class="box-head">
          <el-alert :closable="false" style="width: 100%">
            <el-row>
              <el-col :span="18">
                <span class="less-style">报废单号: {{ row.proScrapSheetOrderNo }} </span>
              </el-col>
              <el-col :span="6">
                <span>已选中 {{ selection.length }} é¡¹</span>
              <!-- <el-link
                type="primary"
                size="small"
                style="float: right; height: 20px"
                @click="lockstocks"
                >锁定库存</el-link
              > -->
              <el-link
                type="primary"
                size="small"
                v-if="row.proScrapStatus == 0"
                style="float: right; height: 20px; margin-right: 10px"
                @click="UpProScrap"
                >提交报废</el-link
              >
              <el-link
                type="primary"
                size="small"
                style="float: right; height: 20px; margin-right: 10px"
                @click="outSelect"
                >直接出库</el-link
              >
              <el-link
                type="primary"
                size="small"
                style="float: right; height: 20px; margin-right: 10px"
                @click="getData"
                >刷新</el-link
              ></el-col>
            </el-row>
          </el-alert>
        </div>
        <div class="box-table" style="margin-top: 1%">
          <el-table
            ref="singleTable"
            :data="tableData"
            style="width: 100%; height: 100%"
            highlight-current-row
            @current-change="handleCurrentChange"
            height="500px"
            @row-click="handleRowClick"
          @selection-change="handleSelectionChange"
          >
            >
            <el-table-column type="selection" width="55"> </el-table-column>
            <el-table-column
              label="序号"
              type="index"
              fixed="left"
              width="55"
              align="center"
            ></el-table-column>
            <el-table-column
              v-for="(item, index) in tableColumns.filter((x) => !x.hidden)"
              :key="index"
              :prop="item.prop"
              :label="item.title"
              :width="item.width"
              align="center"
            >
              <template #default="scoped" v-if="item.type == 'icon'">
                <el-tooltip
                  class="item"
                  effect="dark"
                  :content="item.title"
                  placement="bottom"
                  ><el-button
                    type="text"
                    @click="tableButtonClick(scoped.row, item)"
                    ><i :class="item.icon" style="font-size: 22px"></i></el-button
                ></el-tooltip>
              </template>
            </el-table-column>
          </el-table>
        </div>
        <template #footer>
          <!-- <el-button type="primary" size="small" @click="submit">确认</el-button> -->
          <el-button type="danger" size="small" @click="showDetialBox = false"
            >关闭</el-button
          >
        </template>
      </vol-box>
    </div>
  </template>
      <script>
  import VolBox from "@/components/basic/VolBox.vue";
  import VolForm from "@/components/basic/VolForm.vue";
  export default {
    components: { VolBox,VolForm },
    data() {
      return {
        row: null,
      showDetialBox: false,
      flag: false,
      currentRow: null,
      selection: [],
      tableData: [],
      dialogFormVisible:false,
      formLabelWidth: '160px',
      formFields2: {
        LineCode: "",
        Grade: "0",
      },
      formRules2:[[
          {
            dataKey: "line",
            title: "选择线体",
            required: true,
            field: "LineCode",
            data: [
              { key: "5236", value: "1号线" },
              { key: "5243", value: "2号线" },
              { key: "5250", value: "3号线" },
            ],
            type: "select",
            extra: {
            },
          }],
          [
          {
            title: "是否优先",
            field: "Grade",
            data: [],
            required: false,
            type: "switch",
          },
        ]],
      form: {
        name: '',
        region: '',
        date1: '',
        date2: '',
        delivery: false,
        type: [],
        resource: '',
        desc: '',
      },
        tableColumns: [
          {
            prop: "id",
            title: "主键",
            type: "string",
            width: 150,
            hidden: true,
          },
          {
            prop: "proScrapSheetId",
            title: "成品报废单主键",
            type: "string",
            width: 150,
            hidden: true,
          },
          {
            prop: "scrapProCode",
            title: "产品编码",
            type: "string",
            width: 150,
          },
          {
            prop: "scrapProVersion",
            title: "报废版本",
            type: "string",
            width: 120,
          },
          {
            prop: "scrapProLotNo",
            title: "批次号",
            type: "string",
            width: 150,
          },
          {
            prop: "scrapSETQty",
            title: "报废SET数量",
            type: "int",
            width: 180,
            hidden: true,
          },
          {
            prop: "scrapPcsQty",
            title: "报废PCS数",
            type: "int",
            width: 180,
          },
          // {
          //   prop: "assignQuantity",
          //   title: "分配出库量",
          //   type: "string",
          //   width: 100,
          // },
          {
            prop: "overScrapSETQty",
            title: "已报废SET数",
            type: "int",
            width: 180,
          },
          {
            prop: "overScrapPcsQty",
            title: "已报废PCS数",
            type: "string",
            width: 180,
          },
          {
            prop: "scrapProDetailStatus",
            title: "订单明细状态",
            type: "string",
            width: 180,
        }
        ],
      };
    },
    methods: {
      open(row) {
        this.row = row;
        console.log(row);
        this.showDetialBox = true;
        this.getData();
      },
      handleCurrentChange(val) {
      this.currentRow = val;
    },
    outSelect(){
      if (this.selection.length === 0) {
        return this.$message.error("请选择单据明细");
      }
      this.dialogFormVisible=true;
    },
      handleRowClick(row) {
        this.$refs.singleTable.toggleRowSelection(row);
        },
        handleSelectionChange(val) {
        this.selection = val;
        },
    UpProScrap() {
      var keys = this.selection.map((item) => item.id); // èŽ·å–é€‰ä¸­è¡Œçš„id
      this.http
        .post("api/ErpProScrapSheetDetail/UpProScrap?scrapNo="+
              this.row.proScrapSheetOrderNo, keys, "数据处理中")
        .then((x) => {
          if (!x.status) return this.$message.error(x.message);
          this.$message.success("操作成功");
          this.$parent.refresh();
          this.$emit("parentCall", ($vue) => {
            $vue.getData();
          });
        });
    },
    closeCustomModel() {
      this.formFields2.LineCode="";
      this.formFields2.Grade="0";
          this.dialogFormVisible=false;
          this.$parent.refresh();
    },
    outbound() {
      if (this.selection.length === 0) {
        return this.$message.error("请选择单据明细");
      }
      //请选择单条数据
      if (this.selection.length > 1) {
        return this.$message.error("请选择单条数据");
      }
      var keys = this.selection.map((item) => item.id); // èŽ·å–é€‰ä¸­è¡Œçš„id
      this.http
        .post("api/Task/OutProductTask?stationCode="+this.formFields2.LineCode +"&grade="+this.formFields2.Grade, keys, "数据处理中")
        .then((x) => {
          if (!x.status) return this.$message.error(x.message);
          this.$message.success("操作成功");
          this.formFields2.LineCode="";
          this.formFields2.Grade="0";
          this.dialogFormVisible=false;
          this.$parent.refresh();
          this.showDetialBox = false;
          this.$emit("parentCall", ($vue) => {
            $vue.getData();
          });
        });
    },
      getData() {
        this.http
          .post(
            "api/ErpProScrapSheetDetail/GetByDetails?scrapNo=" +
              this.row.proScrapSheetOrderNo,
            null,
            "查询中"
          )
          .then((x) => {
            var label=[
                { label: '未开始', value: 0 },
                { label: '出库中', value: 1 },
                { label: '出库完成', value: 2 },
                { label: '取消', value: 98 },
                { label: '提交关闭', value: 99 }
            ]
            this.tableData=x.map((i) => ({
              ...i,
              scrapProDetailStatus:label.find((j) => j.value === i.scrapProDetailStatus).label
            }))
          });
      },
    },
  };
  </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/views/outbound/erpProScrapSheet.vue
@@ -130,14 +130,14 @@
      table: "erpProScrapSheetDetail",
      columns: [
            {
            field: "id",
            title: "Id",
            type: "int",
            width: 90,
            hidden: true,
            readonly: true,
            require: true,
            align: "left",
              field: "id",
              title: "Id",
              type: "int",
              width: 90,
              hidden: true,
              readonly: true,
              require: true,
              align: "left",
            },
            {
                field: "proScrapSheetId",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_CheckService/CheckOrderResultService.cs
@@ -264,12 +264,15 @@
                    }
                    _purchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
                }
                //ERP上报
                WebResponseContent responseContent = _checkOrderService.FeedbackCheckResult(checkOrder, checkOrderResult != null ? new List<Dt_CheckOrderResult> { checkOrderResult } : new List<Dt_CheckOrderResult>());
                if (!responseContent.Status)
                if (string.IsNullOrEmpty(checkModel.CreatorCode))
                {
                    throw new Exception(responseContent.Message);
                }
                    //ERP上报
                    WebResponseContent responseContent = _checkOrderService.FeedbackCheckResult(checkOrder, checkOrderResult != null ? new List<Dt_CheckOrderResult> { checkOrderResult } : new List<Dt_CheckOrderResult>());
                    if (!responseContent.Status)
                    {
                        throw new Exception(responseContent.Message);
                    }
                }
                checkOrder.UploadStatus = CheckUploadEnum.UploadOk.ObjToInt();
                _checkOrderRepository.UpdateData(checkOrder);
                _unitOfWorkManage.CommitTran();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs
@@ -65,6 +65,11 @@
        [Description("成品出库")]
        OutProduct = 230,
        /// <summary>
        /// æˆå“æŠ¥åºŸå‡ºåº“
        /// </summary>
        [Description("成品报废出库")]
        OutProScrap = 235,
        /// <summary>
        /// æˆå“å¯„售出库
        /// </summary>
        [Description("成品寄售出库")]
@@ -74,7 +79,7 @@
        /// </summary>
        [Description("成品MES提库")]
        OutMesRworkProduct =250,
        /// <summary>
        /// é˜²ç„Šå‰æ´¾å·¥å°ä»¶
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IOutboundRepository.cs
@@ -19,5 +19,7 @@
        IProOutOrderRepository ProOutOrderRepository { get; }
        IProOutOrderDetailRepository ProOutOrderDetailRepository { get; }
        IMesRworkOutboundOrderRepository RworkOutboundOrderRepository { get; }
        IErpProScrapSheetRepository ErpProScrapSheetRepository { get;}
        IErpProScrapSheetDetailRepository ErpProScrapDetailRepository { get;}
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IErpProScrapSheetDetailService.cs
@@ -3,6 +3,8 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_IOutboundRepository;
using WIDESEA_Model.Models;
@@ -12,5 +14,9 @@
    public interface IErpProScrapSheetDetailService : IService<Dt_ErpProScrapSheetDetail>
    {
        IErpProScrapSheetDetailRepository Repository { get; }
        List<Dt_ErpProScrapSheetDetail> GetByDetails(string scrapNo);
        WebResponseContent UpProScrap(string scrapNo,int[] keys);
        (List<Dt_ProStockInfo>, List<Dt_ErpProScrapSheetDetail>, List<Dt_OutProStockInfo>, List<Dt_LocationInfo>) AssignProStockOut(List<Dt_ErpProScrapSheetDetail> proOutOrderDetails, Dt_ErpProScrapSheet scrapSheet);
        WebResponseContent LockOutboundStockDataUpdate(List<Dt_ProStockInfo> proStockInfos, List<Dt_ErpProScrapSheetDetail> scrapSheetDetails, List<Dt_OutProStockInfo> outProStockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutProStockInfoService.cs
@@ -16,6 +16,10 @@
        Dt_OutProStockInfo GetOutStockLockInfo(Dt_ProOutOrder proOutOrder, Dt_ProOutOrderDetail proOutOrderDetail, Dt_ProStockInfo proStockInfo, float assignQty, int? taskNum = null);
        //处理提库出库详情
        Dt_OutProStockInfo GetOutStockLockInfo(Dt_MesRworkOutboundOrder mesOutboundOrder, Dt_ProStockInfo outStock, float assignQuantity, int? taskNum = null);
        /// <summary>
        /// æˆå“æŠ¥åºŸå‡ºåº“详情
        /// </summary>
        Dt_OutProStockInfo GetOutStockLockInfo(Dt_ErpProScrapSheet proScrapSheet, Dt_ErpProScrapSheetDetail scrapSheetDetail, Dt_ProStockInfo proStockInfo, float assignQty, int? taskNum = null);
        List<Dt_OutProStockInfo> GetByOrderDetailId(int orderDetailId, OutLockStockStatusEnum? outStockStatus);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundService.cs
@@ -29,5 +29,7 @@
        IMesRworkOutboundOrderService RworkOutboundOrderService { get; }
        IErpProTransferOrderService ErpProTransferOrderService { get; }
        IErpProScrapSheetService ErpProScrapSheetService { get; }
        IErpProScrapSheetDetailService ErpProScrapSheetDetailService { get;}
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IStockRepository/IProStockInfoRepository.cs
@@ -18,5 +18,6 @@
        /// èŽ·å–æˆå“åº“å­˜
        /// </summary>
        List<Dt_ProStockInfo> GetProStocks(Dt_MesRworkOutboundOrder mesRworkOutboundOrder, List<string> locationInfos);
        List<Dt_ProStockInfo> GetProStocks(Dt_ErpProScrapSheetDetail erpProScrapSheetDetail, List<string> locationInfos);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IProStockInfoService.cs
@@ -33,9 +33,15 @@
        /// </summary>
        /// <returns></returns>
        public List<Dt_ProStockInfo> GetUseableStocks(Dt_MesRworkOutboundOrder mesRworkOutboundOrder);
        List<Dt_ProStockInfo> GetUseableStocks(int warehoseId, Dt_ErpProScrapSheetDetail erpProScrapSheetDetail);
        /// <summary>
        /// èŽ·å–MES提库库存
        /// </summary>
        List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_MesRworkOutboundOrder mesRworkOutboundOrder, float needQuantity, out float residueQuantity);
        /// <summary>
        /// èŽ·å–æˆå“æŠ¥åºŸçš„åº“å­˜
        /// </summary>
        List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_ErpProScrapSheetDetail outOrderDetail, float needQuantity, out float residueQuantity);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -371,6 +371,7 @@
        /// <param name="StationCode">站台地址</param>
        /// <returns></returns>
        Task<WebResponseContent> OutProductTask(int[] keys, string StationCode, int Grade);
        Task<WebResponseContent> OutProScrapTask(int[] keys, string StationCode, int Grade);
        /// <summary>
        /// æˆå“ä½™æ–™é€€åº“入仓
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_ErpProScrapSheet.cs
@@ -41,7 +41,7 @@
        /// å·²æ ¸å‡†<br/>
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "报废状态")]
        public string ProScrapStatus { get; set; }
        public int ProScrapStatus { get; set; }
        /// <summary>
        /// å¤‡æ³¨
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_ErpProScrapSheetDetail.cs
@@ -57,6 +57,12 @@
        public int ScrapPcsQty { get; set; }
        /// <summary>
        /// é”å®šPCS数
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "报废PCS数")]
        public int LockPcsQty { get; set; }
        /// <summary>
        /// å·²æŠ¥åºŸSET数量
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "已下报废SET数量")]
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/OutboundRepository.cs
@@ -19,8 +19,10 @@
        public IProOutOrderRepository ProOutOrderRepository { get; }
        public IProOutOrderDetailRepository ProOutOrderDetailRepository { get; }
        public IMesRworkOutboundOrderRepository RworkOutboundOrderRepository { get; }
        public IErpProScrapSheetRepository ErpProScrapSheetRepository { get;}
        public IErpProScrapSheetDetailRepository ErpProScrapDetailRepository { get;}
        public OutboundRepository(IOutboundOrderDetailRepository outboundOrderDetailRepository, IOutboundOrderRepository outboundOrderRepository, IOutStockLockInfoRepository outboundStockLockInfoRepository,IMesPPCutOutboundOrderRepository mesPPCutOutboundOrderRepository, IProOutOrderRepository proOutOrderRepository, IProOutOrderDetailRepository proOutOrderDetailRepository, IMesRworkOutboundOrderRepository rworkOutboundOrderRepository)
        public OutboundRepository(IOutboundOrderDetailRepository outboundOrderDetailRepository, IOutboundOrderRepository outboundOrderRepository, IOutStockLockInfoRepository outboundStockLockInfoRepository,IMesPPCutOutboundOrderRepository mesPPCutOutboundOrderRepository, IProOutOrderRepository proOutOrderRepository, IProOutOrderDetailRepository proOutOrderDetailRepository, IMesRworkOutboundOrderRepository rworkOutboundOrderRepository, IErpProScrapSheetRepository erpProScrapSheetRepository, IErpProScrapSheetDetailRepository erpProScrapSheetDetailRepository)
        {
            OutboundOrderDetailRepository = outboundOrderDetailRepository;
            OutboundOrderRepository = outboundOrderRepository;
@@ -29,6 +31,8 @@
            ProOutOrderRepository = proOutOrderRepository;
            ProOutOrderDetailRepository = proOutOrderDetailRepository;
            RworkOutboundOrderRepository = rworkOutboundOrderRepository;
            ErpProScrapSheetRepository= erpProScrapSheetRepository;
            ErpProScrapDetailRepository = erpProScrapSheetDetailRepository;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetDetailService.cs
@@ -1,13 +1,28 @@
using System;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.ERP;
using WIDESEA_External.ERPService;
using WIDESEA_External.Model;
using WIDESEA_IBasicService;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_IRecordService;
using WIDESEA_IStockRepository;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
using WIDESEA_OutboundRepository;
namespace WIDESEA_OutboundService
{
@@ -15,10 +30,321 @@
    {
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        public IErpProScrapSheetDetailRepository Repository => BaseDal;
        public IErpProScrapSheetRepository _proScrapSheetRepository;
        public IInvokeERPService _invokeERPService;
        public IStockRepository _stockRepository;
        public IStockService _stockService;
        public IOutProStockInfoService _outProStockInfoService;
        public IBasicService _basicService;
        public IRecordService _recordService;
        public ErpProScrapSheetDetailService(IErpProScrapSheetDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        public ErpProScrapSheetDetailService(IErpProScrapSheetDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IErpProScrapSheetRepository proScrapSheetRepository, IInvokeERPService invokeERPService, IStockRepository stockRepository, IStockService stockService, IOutProStockInfoService outProStockInfoService, IRecordService recordService) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _proScrapSheetRepository = proScrapSheetRepository;
            _invokeERPService = invokeERPService;
            _stockRepository = stockRepository;
            _stockService = stockService;
            _outProStockInfoService = outProStockInfoService;
            _recordService = recordService;
        }
        //获取对应单号的报废明细
        public List<Dt_ErpProScrapSheetDetail> GetByDetails(string scrapNo)
        {
            List<Dt_ErpProScrapSheetDetail> proScrapSheetDetails = _proScrapSheetRepository.Db.Queryable<Dt_ErpProScrapSheet, Dt_ErpProScrapSheetDetail>((master, detail) => master.Id == detail.ProScrapSheetId)
                .Where((master, detail) => master.ProScrapSheetOrderNo==scrapNo)
                .Select((master, detail) => detail)
                .ToList();
            return proScrapSheetDetails;
        }
        /// <summary>
        /// æäº¤æŠ¥åºŸæ“ä½œ
        /// </summary>
        /// <returns></returns>
        public WebResponseContent UpProScrap(string scrapNo,int[] keys)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取所有的报废明细
                Dt_ErpProScrapSheet erpProScrapSheet = _proScrapSheetRepository.Db.Queryable<Dt_ErpProScrapSheet>().Where(x => x.ProScrapSheetOrderNo == scrapNo).Includes(x => x.Details).First();
                if (erpProScrapSheet == null)
                {
                    return content.Error($"未找到对应报废单{scrapNo}");
                }
                if (erpProScrapSheet.Details == null || erpProScrapSheet.Details.Count<=0)
                {
                    return content.Error($"未找到对应报废单{scrapNo}明细");
                }
                List<Dt_ErpProScrapSheetDetail> erpProScrapSheetDetails = erpProScrapSheet.Details.Where(x=> keys.Contains(x.Id) && x.ScrapProDetailStatus== OutOrderStatusEnum.出库完成.ObjToInt()).ToList();
                List<Dt_ErpProScrapSheetDetail> overDetails= erpProScrapSheet.Details.Where(x => x.ScrapProDetailStatus == OutOrderStatusEnum.关闭.ObjToInt()).ToList();
                int overCount = overDetails.Count;
                //进行报废提交操作
                if (erpProScrapSheetDetails.Count!= keys.Length)
                {
                    return content.Error($"提交了已报废明细或正在出库中,请检查");
                }
                if ((overCount + keys.Length) == erpProScrapSheet.Details.Count)
                {
                    erpProScrapSheet.ProScrapStatus = ProScrapSheetStatusEnum.Valid.ObjToInt();
                }
                List<ScrapSheetItem> scrapSheetItems = new List<ScrapSheetItem>();
                foreach (var item in erpProScrapSheetDetails)
                {
                    item.ScrapProDetailStatus = OutOrderStatusEnum.关闭.ObjToInt();
                    item.OverScrapPcsQty = item.ScrapPcsQty;
                    item.OverScrapSETQty = item.ScrapSETQty;
                    ScrapSheetItem scrapSheetItem = new ScrapSheetItem()
                    {
                        PartNum = item.ScrapProCode,
                        PartRev = item.ScrapProVersion,
                        Lotno = item.ScrapProVersion,
                        QtyOfArray = item.ScrapSETQty,
                        QtyOfUnit = item.ScrapPcsQty,
                        QtyOfArray_Alloc = 0,
                        QtyOfUnit_Alloc = 0,
                    };
                    scrapSheetItems.Add(scrapSheetItem);
                }
                _unitOfWorkManage.BeginTran();
                _proScrapSheetRepository.UpdateData(erpProScrapSheet);
                BaseDal.UpdateData(erpProScrapSheetDetails);
                if (erpProScrapSheet.ProScrapStatus == ProScrapSheetStatusEnum.Valid.ObjToInt())
                {
                    ERPScrapSheetModel scrapSheetModel = new ERPScrapSheetModel()
                    {
                        Way = 1,
                        UniqueTag = erpProScrapSheet.Id.ToString(),
                        Code = erpProScrapSheet.ProScrapSheetOrderNo,
                        Status = ProScrapSheetStatusEnum.Valid.ToString(),
                        Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        Createuser = erpProScrapSheet.Creater,
                        WarehouseCode = WarehouseEnum.HA71.ToString(),
                        DataItem = new List<ScrapSheetItem>()
                    };
                    if (overCount>0)
                    {
                        foreach (var item in overDetails)
                        {
                            ScrapSheetItem scrapSheetItem = new ScrapSheetItem()
                            {
                                PartNum = item.ScrapProCode,
                                PartRev = item.ScrapProVersion,
                                Lotno = item.ScrapProVersion,
                                QtyOfArray = item.ScrapSETQty,
                                QtyOfUnit = item.ScrapPcsQty,
                                QtyOfArray_Alloc = 0,
                                QtyOfUnit_Alloc = 0,
                            };
                            scrapSheetItems.Add(scrapSheetItem);
                        }
                    }
                    scrapSheetModel.DataItem = scrapSheetItems;
                    //上传ERP报废
                    string response = _invokeERPService.InvokeProScrapSheetApi(scrapSheetModel);
                    ErpRequestContent requestContent = response.DeserializeObject<ErpRequestContent>();
                    if (requestContent.res != 1)
                    {
                        throw new Exception($"{requestContent.Data}");
                    }
                }
                _unitOfWorkManage.CommitTran();
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æŠ¥åºŸæ•°æ®å¤„理
        /// </summary>
        public WebResponseContent LockOutboundStockDataUpdate(List<Dt_ProStockInfo> proStockInfos, List<Dt_ErpProScrapSheetDetail> scrapSheetDetails, List<Dt_OutProStockInfo> outProStockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
        {
            try
            {
                //更新库存属性
                _stockService.ProStockInfoService.Repository.UpdateData(proStockInfos);
                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
                foreach (var item in proStockInfos)
                {
                    proStockInfoDetails.AddRange(item.proStockInfoDetails);
                }
                //更新库存明细
                proStockInfoDetails.ForEach(x => x.ProOutDetailStatus = StockStatusEmun.出库锁定.ObjToInt());
                _stockService.ProStockInfoDetailService.Repository.UpdateData(proStockInfoDetails);
                BaseDal.UpdateData(scrapSheetDetails);
                List<Dt_OutProStockInfo> addOutStockLockInfos = outProStockInfos.Where(x => x.Id == 0).ToList();
                if (addOutStockLockInfos != null && addOutStockLockInfos.Any())
                {
                    if (tasks != null)
                    {
                        addOutStockLockInfos.ForEach(x =>
                        {
                            x.TaskNum = tasks.FirstOrDefault(v => v.PalletCode == x.PalletCode)?.TaskNum;
                        });
                    }
                    _outProStockInfoService.Repository.AddData(addOutStockLockInfos);
                }
                List<Dt_OutProStockInfo> updateOutStockLockInfos = outProStockInfos.Where(x => x.Id > 0).ToList();
                if (updateOutStockLockInfos != null && updateOutStockLockInfos.Any())
                {
                    _outProStockInfoService.Repository.UpdateData(updateOutStockLockInfos);
                }
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, locationStatus, LocationChangeType.OutboundAssignLocation, "", tasks?.Select(x => x.TaskNum).ToList());
                _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public (List<Dt_ProStockInfo>, List<Dt_ErpProScrapSheetDetail>, List<Dt_OutProStockInfo>, List<Dt_LocationInfo>) AssignProStockOut(List<Dt_ErpProScrapSheetDetail> proOutOrderDetails, Dt_ErpProScrapSheet scrapSheet)
        {
            List<Dt_ProStockInfo> outStocks = new List<Dt_ProStockInfo>();
            List<Dt_OutProStockInfo> outProStockInfos = new List<Dt_OutProStockInfo>();
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
            //List<Dt_ProOutOrderDetail> groupDetails = proOutOrderDetails.GroupBy(x => new { x.SaleOrder, x.PCode, x.PVer, x.PLot, x.DateCode }).Select(x => new Dt_ProOutOrderDetail()
            //{
            //    QtyPcs = x.Sum(x => x.QtyPcs) - x.Sum(x => x.OverQtyPcs),
            //    SaleOrder = x.Key.SaleOrder,
            //    PCode = x.Key.PCode,
            //    PVer = x.Key.PVer,
            //    PLot = x.Key.PLot,
            //    DateCode = x.Key.DateCode,
            //}).ToList();
            //foreach (var item in groupDetails)
            //{
            //    float needQty = item.QtyPcs;
            //    //查找可用库存
            //    List<Dt_ProStockInfo> stockInfoss = _stockInfoService.ProStockInfoService.GetUseableStocks(proOutOrder.WarehouseId, item);
            //    if (!stockInfoss.Any())
            //    {
            //        throw new Exception("未找到可分配库存");
            //    }
            //    //获取出库库存
            //    List<Dt_ProStockInfo> assignOutStocks = _stockInfoService.ProStockInfoService.GetOutboundStocks(stockInfoss, item, needQty, out float residueQuantity);
            //    item.LockQtyPcs += needQty - residueQuantity;
            //    if (item.QtyPcs> item.LockQtyPcs)
            //    {
            //        throw new Exception($"产品编码{item.PCode}可分配数量不足,可用数量{item.LockQtyPcs}");
            //    }
            //    outStocks.AddRange(assignOutStocks);
            //    float assignQuantity = needQty - residueQuantity;
            //    bool isCanLot = string.IsNullOrEmpty(item.PLot);
            //    bool isCanDate = string.IsNullOrEmpty(item.DateCode);
            //    List<Dt_ProOutOrderDetail> details = proOutOrderDetails
            //        .Where(x =>x.PCode == item.PCode && x.PVer == item.PVer
            //        && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //        && (isCanDate ? isCanDate : x.DateCode == item.DateCode))
            //        .ToList();
            //    for (int i = 0; i < details.Count; i++)
            //    {
            //        float orderQuantity = details[i].QtyPcs;
            //        for (int j = 0; j < assignOutStocks.Count; j++)
            //        {
            //            //出库订单明细已分配数量
            //            float detailAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.OrderDetailId == details[i].Id).Sum(x => x.AssignQuantity);
            //            float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
            //            //出库详情已分配数量
            //            palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
            //                && (isCanLot ? isCanLot : x.PLot == item.PLot)
            //                && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
            //                && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);//出库详情已分配数量
            //            float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
            //            if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
            //            {
            //                float orderDetailNeedQuantity = details[i].QtyPcs - detailAssignQuantity;
            //                if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
            //                {
            //                    details[i].LockQtyPcs += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
            //                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
            //                    outProStockInfos.Add(outStockLockInfo);
            //                }
            //                else
            //                {
            //                    Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], details[i].QtyPcs - details[i].LockQtyPcs);
            //                    outProStockInfos.Add(outStockLockInfo);
            //                    details[i].LockQtyPcs = details[i].QtyPcs;
            //                    break;
            //                }
            //            }
            //        }
            //    }
            //    List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
            //    locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
            //}
            foreach (var item in proOutOrderDetails)
            {
                float needQty = item.ScrapPcsQty;
                //查找可用库存
                List<Dt_ProStockInfo> stockInfoss = _stockService.ProStockInfoService.GetUseableStocks(scrapSheet.WarehouseId, item);
                if (!stockInfoss.Any())
                {
                    throw new Exception("未找到可分配库存");
                }
                //获取出库库存
                List<Dt_ProStockInfo> assignOutStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfoss, item, needQty, out float residueQuantity);
                item.LockPcsQty += (int)(needQty - residueQuantity);
                if (item.ScrapPcsQty > item.LockPcsQty)
                {
                    throw new Exception($"产品编码{item.ScrapProCode}可分配数量不足,可用数量{item.LockPcsQty}");
                }
                outStocks.AddRange(assignOutStocks);
                item.LockPcsQty = 0;
                for (int j = 0; j < assignOutStocks.Count; j++)
                {
                    //出库订单明细已分配数量
                    float detailAssignQuantity = outProStockInfos.Where(x => x.OrderDetailId == item.Id).Sum(x => x.AssignQuantity);
                    ////出库详情已分配数量
                    //float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
                    //    && (isCanLot ? isCanLot : x.PLot == item.PLot)
                    //    && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
                    //    && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
                    ////出库详情已分配数量
                    //float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                    //if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息
                    //{
                    float orderDetailNeedQuantity = item.ScrapPcsQty - detailAssignQuantity;
                    if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity))
                    {
                        item.LockPcsQty += (int)assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(scrapSheet, item, assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity));
                        outProStockInfos.Add(outStockLockInfo);
                    }
                    else
                    {
                        Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(scrapSheet, item, assignOutStocks[j], item.ScrapPcsQty - detailAssignQuantity);
                        outProStockInfos.Add(outStockLockInfo);
                        item.LockPcsQty = item.ScrapPcsQty;
                        break;
                    }
                    //}
                }
                List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
                locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
            }
            return (outStocks, proOutOrderDetails, outProStockInfos, locationInfos);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ErpProScrapSheetService.cs
@@ -55,7 +55,7 @@
                }
                if (!item.ContainsKey(nameof(Dt_ErpProScrapSheetDetail.ScrapProDetailStatus).FirstLetterToLower()))
                {
                    item.Add(nameof(Dt_ErpProScrapSheetDetail.ScrapProDetailStatus).FirstLetterToLower(), OutOrderStatusEnum.出库中.ObjToInt());
                    item.Add(nameof(Dt_ErpProScrapSheetDetail.ScrapProDetailStatus).FirstLetterToLower(), OutOrderStatusEnum.未开始.ObjToInt());
                }
            }
            return base.AddData(saveModel);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutProStockInfoService.cs
@@ -77,6 +77,36 @@
            return outProStockInfo;
        }
        /// <summary>
        /// æˆå“æŠ¥åºŸå‡ºåº“详情
        /// </summary>
        /// <returns></returns>
        public Dt_OutProStockInfo GetOutStockLockInfo(Dt_ErpProScrapSheet proScrapSheet, Dt_ErpProScrapSheetDetail scrapSheetDetail, Dt_ProStockInfo proStockInfo, float assignQty, int? taskNum = null)
        {
            Dt_OutProStockInfo outProStockInfo = new Dt_OutProStockInfo()
            {
                OrderNo = proScrapSheet.ProScrapSheetOrderNo,
                OrderDetailId = scrapSheetDetail.Id,
                OrderType = 1,
                BatchNo = scrapSheetDetail.ScrapProLotNo,
                SaleOrder = "",
                Customer = "",
                PCode = scrapSheetDetail.ScrapProCode,
                PVer = scrapSheetDetail.ScrapProVersion,
                PLot = proStockInfo.proStockInfoDetails.FirstOrDefault()?.LotNumber ?? "",
                DateCode = proStockInfo.proStockInfoDetails.FirstOrDefault()?.DateCode ?? "",
                StockId = proStockInfo.Id,
                OrderQuantity = scrapSheetDetail.ScrapPcsQty,
                OriginalQuantity = proStockInfo.proStockInfoDetails.Sum(x => x.StockPcsQty),
                AssignQuantity = assignQty,
                LocationCode = proStockInfo.LocationCode,
                PalletCode = proStockInfo.PalletCode,
                Unit = "PCS",
                TaskNum = taskNum,
                Status = taskNum == null ? OutLockStockStatusEnum.已分配.ObjToInt() : OutLockStockStatusEnum.出库中.ObjToInt()
            };
            return outProStockInfo;
        }
        public List<Dt_OutProStockInfo> GetByOrderDetailId(int orderDetailId, OutLockStockStatusEnum? outStockStatus)
        {
            return BaseDal.QueryData(x => x.OrderDetailId == orderDetailId && outStockStatus == null ? true : x.Status == outStockStatus.ObjToInt());
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs
@@ -30,8 +30,10 @@
        public IMesRworkOutboundOrderService RworkOutboundOrderService { get; }
        public IErpProTransferOrderService ErpProTransferOrderService { get; }
        public OutboundService(IOutboundOrderDetailService outboundOrderDetailService, IMesRworkOutboundOrderService rworkOutboundOrderService,IMesPPOutboundOrderDetailService mesPPOutboundOrderDetailService, IMesPPCutOutboundOrderDetailService mesPPCutOutboundOrderDetailService, IMesPPCutOutboundOrderService mesPPCutOutboundOrderService, IMesPPOutboundOrderService mesPPOutboundOrderService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IMesOutboundOrderService mesOutboundOrderService,IProOutOrderService proOutOrderService, IProOutOrderDetailService proOutOrderDetailService,IErpProTransferOrderService erpProTransferOrderService)
        public IErpProScrapSheetService ErpProScrapSheetService { get; }
        public IErpProScrapSheetDetailService ErpProScrapSheetDetailService { get; }
        public OutboundService(IOutboundOrderDetailService outboundOrderDetailService, IMesRworkOutboundOrderService rworkOutboundOrderService,IMesPPOutboundOrderDetailService mesPPOutboundOrderDetailService, IMesPPCutOutboundOrderDetailService mesPPCutOutboundOrderDetailService, IMesPPCutOutboundOrderService mesPPCutOutboundOrderService, IMesPPOutboundOrderService mesPPOutboundOrderService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IMesOutboundOrderService mesOutboundOrderService,IProOutOrderService proOutOrderService, IProOutOrderDetailService proOutOrderDetailService,IErpProTransferOrderService erpProTransferOrderService,
            IErpProScrapSheetService erpProScrapSheetService, IErpProScrapSheetDetailService erpProScrapSheetDetailService)
        {
            OutboundOrderDetailService = outboundOrderDetailService;
            OutboundOrderService = outboundOrderService;
@@ -45,6 +47,8 @@
            ProOutOrderDetailService = proOutOrderDetailService;
            RworkOutboundOrderService = rworkOutboundOrderService;
            ErpProTransferOrderService = erpProTransferOrderService;
            ErpProScrapSheetService = erpProScrapSheetService;
            ErpProScrapSheetDetailService = erpProScrapSheetDetailService;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs
@@ -804,20 +804,20 @@
                            
                            //更新出库明细单数量
                            proOutOrderDetail.OverQtyPcs += item.Quantity;
                            item.Quantity -= item.Quantity;
                            float Range = itemOut.StockPcsQty / itemOut.SETQty;
                            int Range = (int)itemOut.StockPcsQty / (int)itemOut.SETQty;
                            if (Range == 0)
                            {
                                return content.Error($"{itemOut.BagNo}单元数量转换失败,请检查");
                                return content.Error($"{itemOut.BagNo}单元数量转换失败,请检查,Range:{Range}");
                            }
                            int outSet = (int)(item.Quantity / Range);
                            int outSet =item.Quantity / Range;
                            if (outSet == 0)
                            {
                                return content.Error($"{itemOut.BagNo}单元数量转换失败,请检查");
                                return content.Error($"{itemOut.BagNo}单元数量转换失败,请检查,outSet:{outSet}");
                            }
                            itemOut.SETQty -= outSet;
                            
                            itemOut.StockPcsQty -= item.Quantity;
                            item.Quantity = 0;
                            if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
                            {
                                return content.Error($"出库单{proOutOrder.ProOutOrderNo}销售订单{item.SoNumber}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}");
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockRepository/ProStockInfoRepository.cs
@@ -86,5 +86,26 @@
            proStockInfos = proStockInfos.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x => x.proStockInfoDetails.Sum(x => x.StockPcsQty)).ToList();
            return proStockInfos;
        }
        /// <summary>
        /// èŽ·å–MES提库库存(尾数仓)
        /// </summary>
        /// <param name="mesRworkOutboundOrder"></param>
        /// <param name="locationInfos"></param>
        /// <returns></returns>
        public List<Dt_ProStockInfo> GetProStocks(Dt_ErpProScrapSheetDetail erpProScrapSheetDetail, List<string> locationInfos)
        {
            List<Dt_ProStockInfo>? proStockInfos = null;
            proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Contains(x.LocationCode) && x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt())
                .Includes(x => x.proStockInfoDetails)
                .Where(x => x.proStockInfoDetails
                .Any(v =>
                v.ProductCode == erpProScrapSheetDetail.ScrapProLotNo
                && v.ProductCode == erpProScrapSheetDetail.ScrapProCode
                && v.ProductVersion == erpProScrapSheetDetail.ScrapProVersion
                ))
            .ToList();
            proStockInfos = proStockInfos.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x => x.proStockInfoDetails.Sum(x => x.StockPcsQty)).ToList();
            return proStockInfos;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockService/ProStockInfoService.cs
@@ -113,6 +113,12 @@
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehouse.WarehouseId);
            return BaseDal.GetProStocks(mesRworkOutboundOrder, locationCodes);
        }
        //查找可用报废库存
        public List<Dt_ProStockInfo> GetUseableStocks(int warehoseId, Dt_ErpProScrapSheetDetail erpProScrapSheetDetail)
        {
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
            return BaseDal.GetProStocks(erpProScrapSheetDetail, locationCodes);
        }
        /// <summary>
        /// èŽ·å–å‡ºåº“åº“å­˜
        /// </summary>
@@ -222,6 +228,66 @@
            return assignOutStocks;
        }
        /// <summary>
        /// èŽ·å–æŠ¥åºŸåº“å­˜
        /// </summary>
        public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_ErpProScrapSheetDetail outOrderDetail, float needQuantity, out float residueQuantity)
        {
            List<Dt_ProStockInfo> assignOutStocks = new List<Dt_ProStockInfo>();
            float stockTotalQuantity = stockInfos.Select(x => x.proStockInfoDetails.Sum(v => v.StockPcsQty - v.OutboundQuantity)).Sum(x => x);
            //stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
            if (stockTotalQuantity >= needQuantity)//库存够
            {
                int index = 0;
                while (needQuantity > 0)
                {
                    Dt_ProStockInfo stockInfo = stockInfos[index];
                    float useableStockQuantity = stockInfo.proStockInfoDetails
                        .Where(x =>
                            x.ProductCode == outOrderDetail.ScrapProCode
                            && x.ProductVersion==outOrderDetail.ScrapProVersion
                            && x.LotNumber == outOrderDetail.ScrapProLotNo)
                        .Sum(x => x.StockPcsQty - x.OutboundQuantity);
                    if (useableStockQuantity < needQuantity && useableStockQuantity > 0)
                    {
                        stockInfo.proStockInfoDetails.Where(x =>
                            x.ProductCode == outOrderDetail.ScrapProCode
                            && x.ProductVersion == outOrderDetail.ScrapProVersion
                            && x.LotNumber == outOrderDetail.ScrapProLotNo).ToList().ForEach(x => x.OutboundQuantity = x.StockPcsQty);
                        needQuantity -= useableStockQuantity;
                    }
                    else
                    {
                        stockInfo.proStockInfoDetails.ForEach(x =>
                        {
                            //满足条件进行分配
                            if ((x.StockPcsQty > x.OutboundQuantity)
                            && x.ProductCode == outOrderDetail.ScrapProCode
                            && x.ProductVersion == outOrderDetail.ScrapProVersion
                            && x.LotNumber == outOrderDetail.ScrapProLotNo)
                            {
                                if (x.StockPcsQty - x.OutboundQuantity >= needQuantity)
                                {
                                    x.OutboundQuantity += needQuantity;
                                    needQuantity = 0;
                                    x.OutDetailId = outOrderDetail.Id;
                                }
                                else
                                {
                                    needQuantity -= (x.StockPcsQty - x.OutboundQuantity);
                                    x.OutboundQuantity = x.StockPcsQty;
                                    x.OutDetailId = outOrderDetail.Id;
                                }
                            }
                        });
                    }
                    assignOutStocks.Add(stockInfo);
                    index++;
                }
            }
            residueQuantity = needQuantity;
            return assignOutStocks;
        }
        /// <summary>
        /// èŽ·å–MES提库库存
        /// </summary>
        public List<Dt_ProStockInfo> GetOutboundStocks(List<Dt_ProStockInfo> stockInfos, Dt_MesRworkOutboundOrder mesRworkOutboundOrder, float needQuantity, out float residueQuantity)
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -829,6 +829,9 @@
                    case (int)TaskTypeEnum.OutMesRworkProduct:
                        content = OutMesRworkCompleted(task);
                        break;
                    case (int)TaskTypeEnum.OutProScrap:
                        content = OutProScrapCompleted(task);
                        break;
                    default:
                        content.Error("未知任务类型");
                        break;
@@ -1023,6 +1026,89 @@
            }
            return content;
        }
        public WebResponseContent OutProScrapCompleted(Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取货位
                Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                if (locationInfo == null)
                {
                    return content.Error("未找到货位信息");
                }
                //根据任务获取成品出库详情任务及物料信息
                Dt_OutProStockInfo outProStockInfo = _outProStockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
                if (outProStockInfo == null)
                {
                    return content.Error("未找到成品出库详情");
                }
                //获取成品报废单
                Dt_ErpProScrapSheet erpProScrapSheet = _outboundRepository.ErpProScrapSheetRepository.Db.Queryable<Dt_ErpProScrapSheet>().Where(x => x.ProScrapSheetOrderNo == outProStockInfo.OrderNo).Includes(x=>x.Details).First();
                if (erpProScrapSheet == null)
                {
                    return content.Error("未找到成品报废单");
                }
                Dt_ErpProScrapSheetDetail erpProScrapSheetDetail = erpProScrapSheet.Details.FirstOrDefault(x => x.Id == outProStockInfo.OrderDetailId);
                if (erpProScrapSheetDetail == null)
                {
                    return content.Error("未找到成品报废单明细");
                }
                if (erpProScrapSheetDetail.ScrapProDetailStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                {
                    return content.Error($"成品报废单明细行{erpProScrapSheetDetail.Id}已完成");
                }
                erpProScrapSheetDetail.ScrapProDetailStatus = OutOrderStatusEnum.出库完成.ObjToInt();
                //获取当前库存
                Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x => x.proStockInfoDetails).First();
                if (proStockInfo == null)
                {
                    return content.Error($"未找到{task.PalletCode}库存信息");
                }
                List<Dt_ProStockInfoDetail> proStockInfoDetails = proStockInfo.proStockInfoDetails;
                if (proStockInfoDetails.Count <= 0)
                {
                    return content.Error("成品库存明细为空");
                }
                proStockInfoDetails.ForEach(x =>
                {
                    x.OutboundQuantity = 0;
                    x.ProOutDetailStatus = StockStatusEmun.出库完成.ObjToInt();
                });
                proStockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                //获取成品平库
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
                proStockInfo.WarehouseId = warehouse.WarehouseId;
                proStockInfo.LocationCode = "成品包装拣货区";
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                outProStockInfo.Status = OutLockStockStatusEnum.出库完成.ObjToInt();
                _unitOfWorkManage.BeginTran();
                //货位变动记录
                int beforeStatus = locationInfo.LocationStatus;
                locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, locationInfo.WarehouseId);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, erpProScrapSheet?.ProScrapSheetOrderNo ?? "", task.TaskNum);
                _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
                _outProStockInfoRepository.UpdateData(outProStockInfo);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                //MES成品库存板出库同步
                //WebResponseContent responseContent = ProductOutBoundSync(MesProOutBound(mesRworkOutboundOrder, proStockInfoDetails));
                //if (!responseContent.Status)
                //{
                //    throw new Exception("同步MES库存板出库失败,错误:"+ responseContent.Message);
                //}
                _unitOfWorkManage.CommitTran();
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ç›˜ç‚¹å‡ºåº“完成
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -260,6 +260,85 @@
            return content;
        }
        /// <summary>
        /// ç”Ÿæˆæˆå“æŠ¥åºŸä»»åŠ¡
        /// </summary>
        /// <param name="ProOutNo">出库订单号</param>
        /// <param name="StationCode">站台地址</param>
        /// <returns></returns>
        public async Task<WebResponseContent> OutProScrapTask(int[] keys, string StationCode, int Grade)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (StationCode.IsNullOrEmpty())
                {
                    return await Task.FromResult(content.Error("内部错误"));
                }
                //获取成品报废订单
                List<Dt_ErpProScrapSheetDetail> _ProOutOrderDetails = await _outboundRepository.ErpProScrapDetailRepository.QueryDataAsync(x => keys.Contains(x.Id) && x.ScrapProDetailStatus == OutOrderStatusEnum.未开始.ObjToInt());
                if (_ProOutOrderDetails.Count <= 0)
                {
                    return await Task.FromResult(content.Error("勾选订单明细状态为出库中"));
                }
                List<Dt_Task> tasks = new List<Dt_Task>();
                List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>();
                List<Dt_ErpProScrapSheetDetail> proOutOrderDetails = new List<Dt_ErpProScrapSheetDetail>();
                List<Dt_OutProStockInfo> outProStockInfos = new List<Dt_OutProStockInfo>();
                List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
                (List<Dt_Task>, List<Dt_ProStockInfo>?, List<Dt_ErpProScrapSheetDetail>?, List<Dt_OutProStockInfo>?, List<Dt_LocationInfo>?) result =
                OutProScrapTaskDataHandle(_ProOutOrderDetails);
                if (result.Item2 != null && result.Item2.Count > 0)
                {
                    proStockInfos.AddRange(result.Item2);
                }
                if (result.Item3 != null && result.Item3.Count > 0)
                {
                    proOutOrderDetails.AddRange(result.Item3);
                }
                if (result.Item4 != null && result.Item4.Count > 0)
                {
                    outProStockInfos.AddRange(result.Item4);
                }
                if (result.Item5 != null && result.Item5.Count > 0)
                {
                    locationInfos.AddRange(result.Item5);
                }
                if (result.Item1 != null && result.Item1.Count > 0)
                {
                    Dt_Task? task = BaseDal.QueryData(x => x.TaskType == TaskTypeEnum.OutProScrap.ObjToInt()).OrderBy(x => x.Grade).FirstOrDefault();
                    //更新出库目的位置
                    result.Item1.ForEach(x =>
                    {
                        x.TargetAddress = StationCode;
                        if (Grade == 1 || task == null)
                        {
                            x.Grade = 127;
                        }
                        else
                        {
                            if (task.Grade == 0 || task.Grade == 1)
                            {
                                x.Grade = 1;
                            }
                            else
                            {
                                x.Grade = task.Grade - 1;
                            }
                        }
                    });
                    tasks.AddRange(result.Item1);
                }
                //处理出库数据
                return await Task.FromResult(GenerateOutboundTaskDataUpdate(tasks, proStockInfos, proOutOrderDetails, outProStockInfos, locationInfos));
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// äººå·¥é€‰å®šåº“存出库
        /// </summary>
        /// <returns></returns>
@@ -505,6 +584,51 @@
        }
        /// <summary>
        /// å¤„理出库数据
        /// </summary>
        public WebResponseContent GenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_ProStockInfo>? proStockInfos = null, List<Dt_ErpProScrapSheetDetail>? scrapSheetDetails = null, List<Dt_OutProStockInfo>? outProStockInfos = null, List<Dt_LocationInfo>? locationInfos = null)
        {
            try
            {
                _unitOfWorkManage.BeginTran();
                //获取成品出库单主表
                Dt_ErpProScrapSheet scrapSheet = _outboundRepository.ErpProScrapSheetRepository.QueryFirst(x => x.Id == scrapSheetDetails.FirstOrDefault().ProScrapSheetId);
                BaseDal.AddData(tasks);
                if (proStockInfos != null && proStockInfos.Count > 0 && scrapSheetDetails != null && scrapSheetDetails.Count > 0 && outProStockInfos != null && outProStockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
                {
                    proStockInfos.ForEach(x =>
                    {
                        x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    });
                    WebResponseContent content = _outboundService.ErpProScrapSheetDetailService.LockOutboundStockDataUpdate(proStockInfos, scrapSheetDetails, outProStockInfos, locationInfos, tasks: tasks);
                    if (!content.Status)
                    {
                        _unitOfWorkManage.RollbackTran();
                        return content;
                    }
                }
                else if (scrapSheetDetails != null && scrapSheetDetails.Count > 0)
                {
                    scrapSheetDetails.ForEach(x =>
                    {
                        x.ScrapProDetailStatus = OutOrderStatusEnum.出库中.ObjToInt();
                    });
                    _outboundRepository.ErpProScrapDetailRepository.UpdateData(scrapSheetDetails);
                }
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// å¤„理成品出库数据
        /// </summary>
        /// <returns></returns>
@@ -552,6 +676,46 @@
            }
            return (tasks, proStockInfos, proOutOrderDetails, outProStockInfos, locationInfos);
        }
        public (List<Dt_Task>, List<Dt_ProStockInfo>?, List<Dt_ErpProScrapSheetDetail>?, List<Dt_OutProStockInfo>?, List<Dt_LocationInfo>?) OutProScrapTaskDataHandle(List<Dt_ErpProScrapSheetDetail> scrapSheetDetails)
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>();
            List<Dt_ErpProScrapSheetDetail> assignOutOrderDetails = new List<Dt_ErpProScrapSheetDetail>();
            List<Dt_OutProStockInfo> outProStockInfos = new List<Dt_OutProStockInfo>();
            List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
            //获取报废单
            Dt_ErpProScrapSheet scrapSheet = _outboundRepository.ErpProScrapSheetRepository.QueryFirst(x => x.Id == scrapSheetDetails.FirstOrDefault().ProScrapSheetId);
            if (scrapSheet == null)
            {
                throw new Exception("未找到成品报废订单");
            }
            //分配库存
            (List<Dt_ProStockInfo>, List<Dt_ErpProScrapSheetDetail>, List<Dt_OutProStockInfo>, List<Dt_LocationInfo>) result = _outboundService.ErpProScrapSheetDetailService.AssignProStockOut(scrapSheetDetails, scrapSheet);
            if (result.Item1 != null && result.Item1.Count > 0)
            {
                TaskTypeEnum typeEnum = TaskTypeEnum.OutProScrap;
                tasks = GetTasks(result.Item1, typeEnum);
                result.Item2.ForEach(x =>
                {
                    x.ScrapProDetailStatus = OutOrderStatusEnum.出库中.ObjToInt();
                });
                result.Item3.ForEach(x =>
                {
                    x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                });
                tasks.ForEach(x => x.OrderNo = scrapSheet.ProScrapSheetOrderNo);
                proStockInfos = result.Item1;
                assignOutOrderDetails = result.Item2;
                outProStockInfos = result.Item3;
                locationInfos = result.Item4;
            }
            else
            {
                throw new Exception("无可分配库存");
            }
            return (tasks, proStockInfos, assignOutOrderDetails, outProStockInfos, locationInfos);
        }
        /// <summary>
        /// ç”Ÿæˆä»»åŠ¡
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs
@@ -292,6 +292,7 @@
            {
                return MesResponseContent.Instance.Error(responseContent.Message);
            }
            model.Content.CreatorCode = "QMS";
            string content = _invokeERPService.InvokeCheckOrderApi(model.Content);
            ErpRequestContent requestContent = content.DeserializeObject<ErpRequestContent>();
            if (requestContent.res != 1)
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/ErpProScrapSheetDetailController.cs
@@ -1,4 +1,7 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.BaseController;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
@@ -16,5 +19,18 @@
        {
        }
        /// <summary>
        /// æŠ¥åºŸå•明细查询
        /// </summary>
        [HttpPost, Route("GetByDetails"), AllowAnonymous]
        public List<Dt_ErpProScrapSheetDetail> GetByDetails(string scrapNo)
        {
            return Service.GetByDetails(scrapNo);
        }
        [HttpPost, Route("UpProScrap"), AllowAnonymous]
        public WebResponseContent UpProScrap([FromBody] int[] keys, string scrapNo)
        {
            return Service.UpProScrap(scrapNo,keys);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -228,6 +228,15 @@
        {
            return await Service.OutProductTask(keys, StationCode, Grade);
        }
        /// <summary>
        /// ç”Ÿæˆæˆå“æŠ¥åºŸä»»åŠ¡
        /// </summary>
        [HttpPost, HttpGet, Route("OutProScrapTask"), AllowAnonymous]
        public async Task<WebResponseContent> OutProScrapTask([FromBody] int[] keys, string StationCode, int Grade)
        {
            return await Service.OutProScrapTask(keys, StationCode, Grade);
        }
        ///// <summary>
        ///// ç”ŸæˆMESPP仓大卷出库任务
        ///// </summary>