From 898b21c72cba3770a6be3c2437f69accbb2bbc91 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期六, 06 十二月 2025 04:19:19 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu

---
 项目代码/WIDESEA_WMSClient/src/router/viewGird.js                                                   |    5 
 项目代码/WIDESEA_WMSClient/src/views/stock/stockInfoDetailByMaterielSum.vue                         |  222 +++++++++
 项目代码/WIDESEA_WMSClient/src/extension/check/recheckOrder.js                                      |   75 +-
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs |   10 
 项目代码/WIDESEA_WMSClient/src/extension/stock/stockInfoDetailByMaterielSum.js                      |   59 ++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoDetailService.cs                 |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IStockService/IStockDetailByMaterielService.cs           |   20 
 项目代码/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js                          |    2 
 项目代码/WIDESEA_WMSClient/config/buttons.js                                                        |    9 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/StockDetailByMateriel.cs              |   74 +++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs             |   12 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockDetailDtO.cs                              |   76 +++
 项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/newAllocateOrderDetail.vue                 |  797 +++++++++++++++++++++++++++++++++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoDetailService.cs                   |   36 +
 14 files changed, 1,367 insertions(+), 32 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/config/buttons.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/config/buttons.js"
index 32004c1..f2f74e6 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/config/buttons.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/config/buttons.js"
@@ -208,6 +208,15 @@
     onClick: function () {
     }
 },
+{
+    name: "鍒嗘嫞",
+    // icon: 'el-icon-upload2',
+    class: '',
+    value: 'BatchOrder',
+    type: 'primary',
+    onClick: function () {
+    }
+},
 ]
 
 export default buttons
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/check/recheckOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/check/recheckOrder.js"
index c79a67f..3ddd214 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/check/recheckOrder.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/check/recheckOrder.js"
@@ -8,8 +8,8 @@
 //姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
 import gridBody from './extend/StockSelect.vue'
 import http from '@/api/http.js'
-import { h,createVNode, render,reactive,ref  } from 'vue';
-import { ElDialog , ElForm, ElFormItem, ElInput, ElButton, ElMessage ,ElSelect ,ElOption } from 'element-plus'; // 寮曞叆ElMessage锛岃В鍐虫彁绀烘棤鍙嶅簲
+import { h, createVNode, render, reactive, ref } from 'vue';
+import { ElDialog, ElForm, ElFormItem, ElInput, ElButton, ElMessage, ElSelect, ElOption } from 'element-plus'; // 寮曞叆ElMessage锛岃В鍐虫彁绀烘棤鍙嶅簲
 let extension = {
   components: {
     //鏌ヨ鐣岄潰鎵╁睍缁勪欢
@@ -22,36 +22,38 @@
     modelFooter: ''
   },
   tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-  buttons: { view: [ {
-          name: '缁勭洏',
-          type: 'primary',
-          value: '缁勭洏',
-          onClick: function () { // 淇1锛氱Щ闄ゆ棤鐢╮ow鍙傛暟锛屽姞鏃ュ織璋冭瘯
-            console.log('缁勭洏鎸夐挳琚偣鍑伙紝寮�濮嬫牎楠�');
-            const selectedRows = this.$refs.table.getSelected();
-  
-            // 鏍¢獙1锛氭槸鍚﹂�変腑琛�
-            if (selectedRows.length === 0) {
-              console.log('鏍¢獙涓嶉�氳繃锛氭湭閫変腑浠讳綍鍗曟嵁');
-              ElMessage.warning('璇烽�夋嫨涓�鏉″崟鎹�');
-              return;
-            }
-            // 鏍¢獙2锛氭槸鍚﹂�変腑鍗曡
-            if (selectedRows.length > 1) {
-              console.log('鏍¢獙涓嶉�氳繃锛氶�変腑澶氳鍗曟嵁');
-              ElMessage.warning('鍙兘閫夋嫨涓�鏉″崟鎹�');
-              return;
-            }
-  
-            const targetRow = selectedRows[0];
-       
-            this.$emit('openPalletDialog', targetRow.orderNo);
-          }
-        },], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+  buttons: {
+    view: [{
+      name: '缁勭洏',
+      type: 'primary',
+      value: '缁勭洏',
+      onClick: function () { // 淇1锛氱Щ闄ゆ棤鐢╮ow鍙傛暟锛屽姞鏃ュ織璋冭瘯
+        console.log('缁勭洏鎸夐挳琚偣鍑伙紝寮�濮嬫牎楠�');
+        const selectedRows = this.$refs.table.getSelected();
+
+        // 鏍¢獙1锛氭槸鍚﹂�変腑琛�
+        if (selectedRows.length === 0) {
+          console.log('鏍¢獙涓嶉�氳繃锛氭湭閫変腑浠讳綍鍗曟嵁');
+          ElMessage.warning('璇烽�夋嫨涓�鏉″崟鎹�');
+          return;
+        }
+        // 鏍¢獙2锛氭槸鍚﹂�変腑鍗曡
+        if (selectedRows.length > 1) {
+          console.log('鏍¢獙涓嶉�氳繃锛氶�変腑澶氳鍗曟嵁');
+          ElMessage.warning('鍙兘閫夋嫨涓�鏉″崟鎹�');
+          return;
+        }
+
+        const targetRow = selectedRows[0];
+
+        this.$emit('openPalletDialog', targetRow.orderNo);
+      }
+    },], box: [], detail: []
+  }, //鎵╁睍鐨勬寜閽�
   methods: {
-     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
     onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
-        this.columns.push({
+      this.columns.push({
         field: '鎿嶄綔',
         title: '鎿嶄綔',
         width: 90,
@@ -71,6 +73,19 @@
           this.$refs.gridBody.open(row);
         }
       });
+      let EmptyTrayOutboundBtn = this.buttons.find(x => x.value == 'BatchOrder');
+      if (EmptyTrayOutboundBtn) {
+        EmptyTrayOutboundBtn.onClick = function () {
+          let rows = this.$refs.table.getSelected();
+          if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
+          if (rows.length > 1) return this.$error("璇烽�夋嫨涓�鏉℃暟鎹�!");
+          this.$router.push({
+            path: '/outbound/picking',
+            query: { orderId: rows[0].id,orderNo:rows[0].orderNo}
+          })
+
+        }
+      }
     },
     onInited() {
       //妗嗘灦鍒濆鍖栭厤缃悗
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js"
index 487648b..76d2980 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js"
@@ -4,7 +4,7 @@
 import { h,createVNode, render,reactive ,ref } from 'vue';
 import { ElDialog , ElForm, ElFormItem, ElInput, ElButton, ElMessage ,ElSelect, ElOption} from 'element-plus';
 
-import gridBody from './extend/outOrderDetail.vue'
+import gridBody from './extend/newAllocateOrderDetail.vue'
 let extension = {
     components: {
       //鏌ヨ鐣岄潰鎵╁睍缁勪欢
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/newAllocateOrderDetail.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/newAllocateOrderDetail.vue"
new file mode 100644
index 0000000..620c0a1
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/newAllocateOrderDetail.vue"
@@ -0,0 +1,797 @@
+<template>
+  <div>
+    <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="16">
+              <span>宸查�変腑 {{ selection.length }} 椤�</span>
+            </el-col>
+            <el-col :span="8">
+          <!--     <el-link
+                type="primary"
+                size="small"
+                style="float: right; height: 20px"
+                @click="lockstocks"
+                >閿佸畾搴撳瓨</el-link> -->
+
+              <el-link
+                type="primary"
+                size="small"
+                    v-if="isBatch === 0"
+                style="float: right; height: 20px"
+                @click="handleOpenPicking"
+                >鎷i��</el-link>
+                        <el-link
+                type="primary"
+                size="small"
+                style="float: right; height: 20px; margin-right: 10px"
+                  v-if="isBatch === 1"
+                @click="handleOpenBatchPicking"
+                >鍒嗘壒鎷i��</el-link>
+              <el-link
+                type="primary"
+                size="small"
+                   v-if="isBatch === 0"
+                style="float: right; height: 20px; margin-right: 10px"
+                @click="outbound"
+                >鐩存帴鍑哄簱</el-link
+              >
+               <el-link
+                type="primary"
+                size="small"
+                 v-if="isBatch === 1"
+                style="float: right; height: 20px; margin-right: 10px"
+                @click="outboundbatch"
+                >鍒嗘壒鍑哄簱</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">
+              <div v-if="item.type == 'icon'">
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  :content="item.title"
+                  placement="bottom"
+                  ><el-link
+                    type="primary"
+                    :disabled="getButtonEnable(item.prop, scoped.row)"
+                    @click="tableButtonClick(scoped.row, item)"
+                    ><i :class="item.icon" style="font-size: 22px"></i></el-link
+                ></el-tooltip>
+              </div>
+
+              <div v-else-if="item.type == 'tag'">
+                <el-tag size="small">
+                  {{ getDictionary(scoped.row, item) }}
+                </el-tag>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </vol-box>
+    <stock-select ref="child" @parentCall="parentCall"></stock-select>
+    <selected-stock
+      ref="selectedStock"
+      @parentCall="parentCall"
+    ></selected-stock>
+    <NoStockOut ref="NoStockOut" @parentCall="parentCall"></NoStockOut>
+  </div>
+</template>
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+import VolForm from "@/components/basic/VolForm.vue";
+import StockSelect from "./StockSelect.vue";
+import SelectedStock from "./SelectedStock.vue";
+import NoStockOut from "./NoStockOut.vue";
+import { h,createVNode, render,reactive  } from 'vue';
+import { ElDialog , ElForm, ElFormItem, ElSelect,ElOption, ElButton, ElInput, ElMessage } from 'element-plus';
+import { th } from 'element-plus/es/locale';
+
+export default {
+  components: { VolBox, VolForm, StockSelect, SelectedStock,NoStockOut},
+  data() {
+    return {
+      row: null,
+      isBatch :0,
+      showDetialBox: false,
+      flag: false,
+      currentRow: null,
+      selection: [],
+      tableData: [],
+      tableColumns: [
+        {
+          prop: "id",
+          title: "Id",
+          type: "int",
+          width: 90,
+          hidden: true,
+        },
+        {
+          prop: "orderId",
+          title: "鍑哄簱鍗曚富閿�",
+          type: "string",
+          width: 90,
+          hidden: true,
+        },
+        {
+          prop: "materielCode",
+          title: "鐗╂枡缂栧彿",
+          type: "string",
+          width: 150,
+        },
+        {
+          prop: "materielName",
+          title: "鐗╂枡鍚嶇О",
+          type: "string",
+          width: 150,
+        },
+        {
+          prop: "batchNo",
+          title: "鎵规鍙�",
+          type: "string",
+          width: 90,
+        },
+        {
+          prop: "supplyCode",
+          title: "渚涘簲鍟嗙紪鍙�",
+          type: "string",
+          width: 150,
+        },
+        {
+          prop: "orderQuantity",
+          title: "鍗曟嵁鏁伴噺",
+          type: "string",
+          width: 90,
+        },
+        {
+          prop: "lockQuantity",
+          title: "閿佸畾鏁伴噺",
+          type: "int",
+          width: 90,
+        },
+        {
+          prop: "overOutQuantity",
+          title: "宸插嚭鏁伴噺",
+          type: "string",
+          width: 90,
+        },
+        {
+          prop: "overOutQuantity",
+          title: "鎸枡鏁伴噺",
+          type: "string",
+          width: 90,
+        },
+        {
+          prop: "unit",
+          title: "鍗曚綅",
+          type: "string",
+          width: 90,
+        },
+        {
+          prop: "orderDetailStatus",
+          title: "璁㈠崟鏄庣粏鐘舵��",
+          type: "tag",
+          width: 90,
+          bindKey: "orderDetailStatusEnum",
+        },
+        {
+          prop: "assignStock",
+          title: "鎸囧畾搴撳瓨",
+          type: "icon",
+          width: 90,
+          hidden:true,
+          icon: "el-icon-s-grid",
+        },
+        {
+          prop: "viewDetail",
+          title: "鍑哄簱璇︾粏",
+          type: "icon",
+          width: 90,
+          icon: "el-icon-s-operation",
+        },
+        {
+          prop: "creater",
+          title: "鍒涘缓浜�",
+          type: "string",
+          width: 90,
+        },
+        {
+          prop: "createDate",
+          title: "鍒涘缓鏃堕棿",
+          type: "datetime",
+          width: 160,
+        },
+        {
+          prop: "modifier",
+          title: "淇敼浜�",
+          type: "string",
+          width: 100,
+        },
+        {
+          prop: "modifyDate",
+          title: "淇敼鏃堕棿",
+          type: "datetime",
+          width: 160,
+        },
+        {
+          prop: "remark",
+          title: "澶囨敞",
+          type: "string",
+        },
+      ],
+      paginations: {
+        sort: "id",
+        order: "desc",
+        Foots: "",
+        total: 0,
+        // 2020.08.29澧炲姞鑷畾涔夊垎椤垫潯澶у皬
+        sizes: [30, 60, 100, 120],
+        size: 30, // 榛樿鍒嗛〉澶у皬
+        Wheres: [],
+        page: 1,
+        rows: 30,
+      },
+      searchFormOptions: [
+        [
+          {
+            title: "鍗曟嵁缂栧彿",
+            field: "allocation_code",
+            type: "like",
+          },
+          {
+            title: "鍗曟嵁绫诲瀷",
+            field: "allocation_type",
+            type: "select",
+            dataKey: "OrderType",
+            data: [],
+          },
+          {
+            title: "鍗曟嵁鐘舵��",
+            field: "allocation_state",
+            type: "select",
+            dataKey: "OrderState",
+            data: [],
+          },
+        ],
+      ],
+      searchFormFields: {
+        allocation_code: "",
+        allocation_type: "",
+        allocation_state: "",
+      },
+      dictionaryList: null,
+    };
+  },
+  methods: {
+    open(row) {
+      this.row = row;
+      this.showDetialBox = true;
+      console.log(this.row);  
+      this.isBatch = row.isBatch;
+      this.getDictionaryData();
+      this.getData();
+    },
+    getData() {
+      var wheres = [{ name: "orderId", value: this.row.id }];
+      var param = {
+        page: this.paginations.page,
+        rows: this.paginations.rows,
+        sort: this.paginations.sort,
+        order: this.paginations.order,
+        wheres: JSON.stringify(wheres), // 鏌ヨ鏉′欢锛屾牸寮忎负[{ name: "瀛楁", value: "xx" }]
+      };
+      this.http
+        .post("api/AllocateOrderDetail/GetPageData", param, "鏌ヨ涓�")
+        .then((x) => {
+          this.tableData = x.rows;
+        });
+    },
+    tableButtonClick(row, column) {
+      if (column.prop == "assignStock") {
+        this.$refs.child.open(row);
+      } else if (column.prop == "NoStockOut") {
+        this.$refs.NoStockOut.open(row);
+      }else{
+          //鐐瑰嚮鎵撳紑鍑哄簱璇︽儏
+        this.$refs.selectedStock.open(row);
+      }
+    },
+    lockstocks() {
+      if (this.selection.length === 0) {
+        return this.$message.error("璇烽�夋嫨鍗曟嵁鏄庣粏");
+      }
+      var keys = this.selection.map((item) => item.id); // 鑾峰彇閫変腑琛岀殑id
+      this.http
+        .post("api/OutboundOrderDetail/LockOutboundStocks", keys, "鏁版嵁澶勭悊涓�")
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.showDetialBox = false;
+          this.$emit("parentCall", ($vue) => {
+            $vue.getData();
+          });
+        });
+    },
+    // 鎵撳紑鎷i�夐〉闈�
+   handleOpenPicking() {
+      this.$router.push({
+        path: '/outbound/picking',
+        query: { orderId: this.row.id ,orderNo:this.row.orderNo}
+      })
+    },
+    handleOpenBatchPicking() {
+      this.$router.push({ 
+        path: '/outbound/batchpicking',
+        query: { orderId: this.row.id ,orderNo:this.row.orderNo}})
+    },
+    outbound() {
+      if (this.selection.length === 0) {
+        return this.$message.error("璇烽�夋嫨鍗曟嵁鏄庣粏");
+      }
+      const platformOptions = [{label:'绔欏彴2',value:'2-1'},{label:'绔欏彴3',value:'3-1'}];
+      const mountNode = document.createElement('div');
+      document.body.appendChild(mountNode);
+
+      // 2. 琛ㄥ崟鏁版嵁锛堥粯璁ら�変腑绔欏彴3锛�
+      const formData = reactive({
+        selectedPlatform: platformOptions[0].value // 榛樿缁戝畾銆岀珯鍙�3銆嶇殑value
+      });
+
+      // 3. 鍔ㄦ�佸垱寤哄脊绐楃粍浠�
+      const vnode = createVNode(ElDialog, {
+        title: '鍑哄簱鎿嶄綔 - 閫夋嫨鍑哄簱绔欏彴',
+        width: '500px',
+        modelValue: true,
+        appendToBody: true,
+        'onUpdate:modelValue': (isVisible) => {
+          if (!isVisible) {
+            render(null, mountNode);
+            document.body.removeChild(mountNode);
+          }
+        }, 
+        style: {
+          padding: '20px 0',
+          borderRadius: '8px'
+        }
+      }, {
+        default: () => h(ElForm, {
+          model: formData,
+          rules: {
+            selectedPlatform: [
+              { required: true, message: '璇烽�夋嫨鍑哄簱绔欏彴', trigger: 'change' }
+            ]
+          },
+          ref: 'outboundForm',
+          labelWidth: '100px',
+          style: {
+            padding: '0 30px'
+          }
+        }, [
+          // 鍑哄簱绔欏彴閫夋嫨椤癸紙鏍稿績琛ㄥ崟椤癸級
+          h(ElFormItem, {
+            label: '鍑哄簱绔欏彴',
+            prop: 'selectedPlatform',
+            style: {
+              marginBottom: '24px'
+            }
+          }, [
+            h(ElSelect, {
+              placeholder: '璇烽�夋嫨鍑哄簱绔欏彴锛�3-12锛�',
+              modelValue: formData.selectedPlatform,
+              'onUpdate:modelValue': (val) => {
+                formData.selectedPlatform = val;
+              },
+              style: {
+                width: '100%',
+                height: '40px',
+                borderRadius: '4px',
+                borderColor: '#dcdfe6'
+              }
+            }, platformOptions.map(platform => 
+              h(ElOption, { label: platform.label, value: platform.value })
+            ))
+          ]),
+          // 搴曢儴鎸夐挳鍖�
+          h('div', {
+            style: {
+              textAlign: 'right',
+              marginTop: '8px',
+              paddingRight: '4px'
+            }
+          }, [
+            h(ElButton, {
+              type: 'text',
+              onClick: () => {
+                render(null, mountNode);
+                document.body.removeChild(mountNode);
+                ElMessage.info('鍙栨秷鍑哄簱鎿嶄綔');
+              },
+              style: {
+                marginRight: '8px',
+                color: '#606266'
+              }
+            }, '鍙栨秷'),
+            h(ElButton, {
+              type: 'primary',
+              onClick: async () => {
+                const formRef = vnode.component.refs.outboundForm;
+                try {
+                  // 琛ㄥ崟鏍¢獙
+                  await formRef.validate();
+                } catch (err) {
+                  return;
+                }
+
+                // 4. 鏋勯�犺姹傚弬鏁帮紙閫変腑鍗曟嵁ID + 閫夋嫨鐨勫嚭搴撶珯鍙帮級
+                const keys = this.selection.map((item) => item.id);
+                const requestParams = {
+                  taskIds: keys,
+                  outboundPlatform: formData.selectedPlatform // 鍑哄簱绔欏彴
+                };
+
+                // 5. 璋冪敤鍑哄簱鎺ュ彛
+                this.http
+                  .post("api/Task/GenerateOutboundTasks", requestParams, "鏁版嵁澶勭悊涓�")
+                  .then((x) => {
+                    if (!x.status) return ElMessage.error(x.message);
+                    
+                    ElMessage.success("鎿嶄綔鎴愬姛");
+                    this.showDetialBox = false; // 鍏抽棴璇︽儏妗�
+                    this.$emit("parentCall", ($vue) => {
+                      $vue.getData(); // 閫氱煡鐖剁粍浠跺埛鏂�
+                    });
+                    // 鍏抽棴寮圭獥
+                    render(null, mountNode);
+                    document.body.removeChild(mountNode);
+                  })
+                  .catch(() => {
+                    ElMessage.error('璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯');
+                  });
+              },
+              style: {
+                borderRadius: '4px',
+                padding: '8px 20px'
+              }
+            }, '纭畾鍑哄簱')
+          ])
+        ])
+      });
+
+      // 缁戝畾app涓婁笅鏂囷紝纭繚El缁勪欢姝e父宸ヤ綔
+      vnode.appContext = this.$.appContext;
+      render(vnode, mountNode);
+    },
+    outboundbatch() {
+  if (this.selection.length === 0) {
+    return this.$message.error("璇烽�夋嫨鍗曟嵁鏄庣粏");
+  }
+    if (this.selection.length>1) {
+    return this.$message.error("鍙兘閫夋嫨涓�鏉″崟鎹槑缁嗚繘琛屽垎鎵瑰嚭搴�");
+  }
+  const platformOptions = [{label:'绔欏彴2',value:'2-1'},{label:'绔欏彴3',value:'3-1'}];
+  const mountNode = document.createElement('div');
+  document.body.appendChild(mountNode);
+
+  // 2. 琛ㄥ崟鏁版嵁锛堥粯璁ら�変腑绔欏彴3锛屾柊澧炲皬鏁板瓧娈碉級
+  const formData = reactive({
+    selectedPlatform: platformOptions[0].value, // 榛樿缁戝畾銆岀珯鍙�3銆嶇殑value
+    outboundDecimal: '' // 鏂板锛氬皬鏁拌緭鍏ユ瀛楁
+  });
+
+  // 3. 鍔ㄦ�佸垱寤哄脊绐楃粍浠�
+  const vnode = createVNode(ElDialog, {
+    title: '鍑哄簱鎿嶄綔 - 閫夋嫨鍑哄簱绔欏彴',
+    width: '500px',
+    modelValue: true,
+    appendToBody: true,
+    'onUpdate:modelValue': (isVisible) => {
+      if (!isVisible) {
+        render(null, mountNode);
+        document.body.removeChild(mountNode);
+      }
+    }, 
+    style: {
+      padding: '20px 0',
+      borderRadius: '8px'
+    }
+  }, {
+    default: () => h(ElForm, {
+      model: formData,
+      rules: {
+        selectedPlatform: [
+          { required: true, message: '璇烽�夋嫨鍑哄簱绔欏彴', trigger: 'change' }
+        ],
+        // 鏂板锛氬皬鏁板瓧娈甸獙璇佽鍒欙紙蹇呭~ + 鏈夋晥灏忔暟鏍煎紡锛�
+        outboundDecimal: [
+          { required: true, message: '璇疯緭鍏ュ皬鏁版暟鍊�', trigger: 'blur' },
+          { 
+            validator: (rule, value, callback) => {
+              // 楠岃瘉瑙勫垯锛氭鏁般�佹敮鎸佸皬鏁扮偣鍚庢渶澶�2浣嶏紙鍙牴鎹渶姹傝皟鏁村皬鏁颁綅鏁帮級
+              const decimalReg = /^(([1-9]\d*)|0)(\.\d{1,2})?$/;
+              if (value && !decimalReg.test(value)) {
+                callback(new Error('璇疯緭鍏ユ湁鏁堢殑灏忔暟锛堟鏁帮紝鏈�澶�2浣嶅皬鏁帮級'));
+              } else {
+                callback();
+              }
+            },
+            trigger: 'blur'
+          }
+        ]
+      },
+      ref: 'outboundForm',
+      labelWidth: '100px',
+      style: {
+        padding: '0 30px'
+      }
+    }, [
+      // 鍑哄簱绔欏彴閫夋嫨椤癸紙鏍稿績琛ㄥ崟椤癸級
+      h(ElFormItem, {
+        label: '鍑哄簱绔欏彴',
+        prop: 'selectedPlatform',
+        style: {
+          marginBottom: '24px'
+        }
+      }, [
+        h(ElSelect, {
+          placeholder: '璇烽�夋嫨鍑哄簱绔欏彴锛�3-12锛�',
+          modelValue: formData.selectedPlatform,
+          'onUpdate:modelValue': (val) => {
+            formData.selectedPlatform = val;
+          },
+          style: {
+            width: '100%',
+            height: '40px',
+            borderRadius: '4px',
+            borderColor: '#dcdfe6'
+          }
+        }, platformOptions.map(platform => 
+          h(ElOption, { label: platform.label, value: platform.value })
+        ))
+      ]),
+      // 鏂板锛氬皬鏁拌緭鍏ユ琛ㄥ崟椤�
+      h(ElFormItem, {
+        label: '鍑哄簱鏁�', // 鍙牴鎹笟鍔¢渶姹備慨鏀规爣绛惧悕锛堝鈥滃嚭搴撴暟閲忊�濃�滈噸閲忊�濈瓑锛�
+        prop: 'outboundDecimal',
+        style: {
+          marginBottom: '24px'
+        }
+      }, [
+        h(ElInput, {
+          type: 'number', // 鏁板瓧绫诲瀷锛屽師鐢熸敮鎸佸皬鏁拌緭鍏�
+          placeholder: '璇疯緭鍏ュ皬鏁版暟鍊硷紙鏈�澶�2浣嶅皬鏁帮級',
+          modelValue: formData.outboundDecimal,
+          'onUpdate:modelValue': (val) => {
+            formData.outboundDecimal = val;
+          },
+          style: {
+            width: '100%',
+            height: '40px',
+            borderRadius: '4px',
+            borderColor: '#dcdfe6'
+          },
+          step: '0.01', // 姝ラ暱0.01锛岀偣鍑讳笂涓嬬澶存椂鎸�0.01澧炲噺
+          precision: 2, // 闄愬埗鏈�澶氳緭鍏�2浣嶅皬鏁帮紙Element Plus灞炴�э級
+          min: 0.01, // 鍙�夛細闄愬埗鏈�灏忓�间负0.01锛岄伩鍏嶈緭鍏�0鎴栬礋鏁�
+        })
+      ]),
+      // 搴曢儴鎸夐挳鍖�
+      h('div', {
+        style: {
+          textAlign: 'right',
+          marginTop: '8px',
+          paddingRight: '4px'
+        }
+      }, [
+        h(ElButton, {
+          type: 'text',
+          onClick: () => {
+            render(null, mountNode);
+            document.body.removeChild(mountNode);
+            ElMessage.info('鍙栨秷鍒嗘壒鍑哄簱鎿嶄綔');
+          },
+          style: {
+            marginRight: '8px',
+            color: '#606266'
+          }
+        }, '鍙栨秷'),
+        h(ElButton, {
+          type: 'primary',
+          onClick: async () => {
+            const formRef = vnode.component.refs.outboundForm;
+            try {
+              // 琛ㄥ崟鏍¢獙锛堜細鍚屾椂鏍¢獙鍑哄簱绔欏彴鍜屽皬鏁板瓧娈碉級
+              await formRef.validate();
+            } catch (err) {
+              return;
+            }
+console.log(this.selection);
+            // 4. 鏋勯�犺姹傚弬鏁帮紙鏂板灏忔暟瀛楁锛�
+            const keys = this.selection.map((item) => item.id);
+            const requestParams = {
+              orderDetailId: keys[0], // 鍒嗘壒鍑哄簱浠呮敮鎸佸崟鏉℃槑缁�
+              outboundPlatform: formData.selectedPlatform, // 鍑哄簱绔欏彴
+              batchQuantity: formData.outboundDecimal // 鏂板锛氬皬鏁板瓧娈典紶缁欏悗绔�
+            };
+
+            // 5. 璋冪敤鍑哄簱鎺ュ彛
+            this.http
+              .post("api/Task/GenerateOutboundBatchTasks", requestParams, "鏁版嵁澶勭悊涓�")
+              .then((x) => {
+                if (!x.status) return ElMessage.error(x.message);
+                
+                ElMessage.success("鎿嶄綔鎴愬姛");
+                this.showDetialBox = false; // 鍏抽棴璇︽儏妗�
+                this.$emit("parentCall", ($vue) => {
+                  $vue.getData(); // 閫氱煡鐖剁粍浠跺埛鏂�
+                });
+                // 鍏抽棴寮圭獥
+                render(null, mountNode);
+                document.body.removeChild(mountNode);
+              })
+              .catch(() => {
+                ElMessage.error('璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯');
+              });
+          },
+          style: {
+            borderRadius: '4px',
+            padding: '8px 20px'
+          }
+        }, '纭畾鍒嗘壒鍑哄簱')
+      ])
+    ])
+  });
+
+  // 缁戝畾app涓婁笅鏂囷紝纭繚El缁勪欢姝e父宸ヤ綔
+  vnode.appContext = this.$.appContext;
+  render(vnode, mountNode);
+},
+      
+
+    setCurrent(row) {
+      this.$refs.singleTable.setCurrentRow(row);
+    },
+    handleCurrentChange(val) {
+      this.currentRow = val;
+    },
+    getButtonEnable(propName, row) {
+      if (propName == "assignStock") {
+        if (
+          row.orderDetailStatus !== 0 &&
+          row.orderDetailStatus !== 60 &&
+          row.orderDetailStatus !== 70 &&
+          row.orderDetailStatus !== 80
+        ) {
+          return true;
+        } else {
+          return false;
+        }
+      }
+      return false;
+    },
+    parentCall(fun) {
+      if (typeof fun != "function") {
+        return console.log("鎵╁睍缁勪欢闇�瑕佷紶鍏ヤ竴涓洖璋冩柟娉曟墠鑳借幏鍙栫埗绾ue瀵硅薄");
+      }
+      fun(this);
+    },
+    handleRowClick(row) {
+      this.$refs.singleTable.toggleRowSelection(row);
+    },
+    handleSelectionChange(val) {
+      this.selection = val;
+    },
+    getDictionaryData() {
+      if (this.dictionaryList) {
+        return;
+      }
+      var param = [];
+      this.tableColumns.forEach((x) => {
+        if (x.type == "tag" && x.bindKey != "") {
+          param.push(x.bindKey);
+        }
+      });
+      this.http
+        .post("api/Sys_Dictionary/GetVueDictionary", param, "鏌ヨ涓�")
+        .then((x) => {
+          if (x.length > 0) {
+            this.dictionaryList = x;
+          }
+        });
+    },
+    getDictionary(row, column) {
+      if (this.dictionaryList) {
+        var item = this.dictionaryList.find((x) => x.dicNo == column.bindKey);
+        if (item) {
+          var dicItem = item.data.find((x) => x.key == row[column.prop]);
+          console.log(dicItem);
+          if (dicItem) {
+            return dicItem.value;
+          } else {
+            return row[column.prop];
+          }
+        } else {
+          return row[column.prop];
+        }
+      }
+    },
+  },
+};
+</script>
+<style scoped>
+.text-button {
+  border: 0px;
+}
+</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;
+}
+</style>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/stock/stockInfoDetailByMaterielSum.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/stock/stockInfoDetailByMaterielSum.js"
new file mode 100644
index 0000000..2d89d3f
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/stock/stockInfoDetailByMaterielSum.js"
@@ -0,0 +1,59 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+
+let extension = {
+    components: {
+      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+      gridHeader: '',
+      gridBody: '',
+      gridFooter: '',
+      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+      modelHeader: '',
+      modelBody: '',
+      modelFooter: ''
+    },
+    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+    methods: {
+       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+      onInit() {  
+        console.log(this)
+      },
+      onInited() {
+        //妗嗘灦鍒濆鍖栭厤缃悗
+        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+        //this.detailOptions.columns.forEach(column=>{ });
+      },
+      searchBefore(param) {
+        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+        return true;
+      },
+      searchAfter(result) {
+        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+        return true;
+      },
+      addBefore(formData) {
+        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+        return true;
+      },
+      updateBefore(formData) {
+        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+        return true;
+      },
+      rowClick({ row, column, event }) {
+        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+        this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+      },
+      modelOpenAfter(row) {
+        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+        //(3)this.editFormFields.瀛楁='xxx';
+        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+      }
+    }
+  };
+  export default extension;
+  
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
index 3896357..84f4804 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
@@ -217,6 +217,11 @@
     path: '/reCheckOrder',
     name: 'Dt_ReCheckOrder',
     component: () => import('@/views/check/ReCheckOrder.vue')
+  },
+  {
+    path: '/stockInfoDetailByMaterielSum',
+    name: 'Dt_StockInfoDetailss',
+    component: () => import('@/views/stock/stockInfoDetailByMaterielSum.vue')
   }
 ]
 
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/stock/stockInfoDetailByMaterielSum.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/stock/stockInfoDetailByMaterielSum.vue"
new file mode 100644
index 0000000..0e48a14
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/stock/stockInfoDetailByMaterielSum.vue"
@@ -0,0 +1,222 @@
+<template>
+  <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+    :table="table" :extend="extend">
+  </view-grid>
+</template>
+<script>
+import extend from "@/extension/stock/stockInfoDetailByMaterielSum.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "搴撳瓨淇℃伅鏄庣粏",
+      name: "stockInfoDetail",
+      url: "/StockInfoDetail/",
+      sortName: "id",
+    });
+    const editFormFields = ref({
+      deviceCode: "",
+      deviceName: "",
+      deviceType: "",
+      deviceStatus: "",
+      deviceIp: "",
+      devicePort: "",
+      devicePlcType: "",
+      deviceRemark: "",
+    });
+    const editFormOptions = ref([
+      [
+        {
+          title: "鐗╂枡缂栧彿",
+          required: true,
+          field: "materielCode",
+          type: "string",
+        },
+        {
+          title: "鍗曟嵁缂栧彿",
+          required: true,
+          field: "materielName",
+          type: "string",
+        },
+        {
+          title: "鎵规鍙�",
+          required: true,
+          field: "orderNo",
+          type: "string",
+        },
+        {
+          title: "搴忓垪鍙�",
+          required: true,
+          field: "serialNumber",
+          type: "string",
+        },
+      ],
+      
+    ]);
+    const searchFormFields = ref({
+      materielCode: "",
+      materielName: "",
+      orderNo: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "鐗╂枡缂栧彿", field: "materielCode" ,type:'like'},
+        { title: "鐗╂枡鍚嶇О", field: "materielName" ,type:'like'},
+        { title: "鍗曟嵁缂栧彿", field: "orderNo" ,type:'like'},
+        { title: "鎵樼洏鍙�", field: "palletCode" ,type:'like'},
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "id",
+        title: "Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "stockId",
+        title: "搴撳瓨淇℃伅涓婚敭",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "materielCode",
+        title: "鐗╂枡缂栧彿",
+        type: "string",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "materielName",
+        title: "鐗╂枡鍚嶇О",
+        type: "string",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "orderNo",
+        title: "鍗曟嵁缂栧彿",
+        type: "decimal",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "batchNo",
+        title: "鎵规鍙�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "serialNumber",
+        title: "搴忓垪鍙�",
+        type: "int",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "supplyCode",
+        title: "渚涘簲鍟嗙紪鍙�",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "warehouseCode",
+        title: "浠撳簱鍙�",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "barcode",
+        title: "鏉$爜",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "stockQuantity",
+        title: "搴撳瓨鏁伴噺",
+        type: "string",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "outboundQuantity",
+        title: "鍑哄簱鏁伴噺",
+        type: "string",
+        width: 180,
+        align: "left",
+      },
+      {
+        field: "status",
+        title: "搴撳瓨鏄庣粏鐘舵��",
+        type: "string",
+        width: 120,
+        align: "left",
+        bind: { key: "stockStatusEmun", data: [] },
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "#detailCnName",
+      table: "",
+      columns: [],
+      sortName: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockDetailDtO.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockDetailDtO.cs"
new file mode 100644
index 0000000..c82c12f
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockDetailDtO.cs"
@@ -0,0 +1,76 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_DTO.Stock
+{
+    public class StockDetailDtO
+    {
+       
+        public int Id { get; set; }
+
+       
+        public int StockId { get; set; }
+
+       
+        public string MaterielCode { get; set; }
+
+     
+        public string MaterielName { get; set; }
+
+      
+        public string OrderNo { get; set; }
+
+       
+        public string BatchNo { get; set; }
+
+       
+        public string ProductionDate { get; set; }
+
+     
+        public string EffectiveDate { get; set; }
+
+       
+        public string SerialNumber { get; set; }
+
+       
+        public decimal StockQuantity { get; set; }
+
+       
+        public decimal OutboundQuantity { get; set; }
+
+        
+        public int Status { get; set; }
+
+        
+        public string Unit { get; set; }
+        
+        public string InboundOrderRowNo { get; set; }
+
+      
+        public string? SupplyCode { get; set; }
+
+        public string FactoryArea { get; set; }
+      
+        public string? WarehouseCode { get; set; }
+
+     
+        public string? Barcode { get; set; }
+
+
+        
+        public string? BusinessType { get; set; }
+
+
+        public decimal BarcodeQty { get; set; }
+
+        public string BarcodeUnit { get; set; }
+
+        public DateTime? ValidDate { get; set; }
+      
+        public string Remark { get; set; }
+
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockDetailByMaterielService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockDetailByMaterielService.cs"
new file mode 100644
index 0000000..1e93b7a
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockDetailByMaterielService.cs"
@@ -0,0 +1,20 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEA_Core;
+using WIDESEA_Core.BaseRepository;
+using WIDESEA_Core.BaseServices;
+using WIDESEA_DTO.Stock;
+using WIDESEA_Model.Models;
+
+namespace WIDESEA_IStockService
+{
+    public interface IStockDetailByMaterielService : IService<StockDetailByMateriel>
+    {
+        IRepository<StockDetailByMateriel> Repository { get; }
+
+        PageGridData<StockDetailByMateriel> GetPageData2(PageDataOptions options);
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoDetailService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoDetailService.cs"
index ff8345e..4a4d548 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoDetailService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoDetailService.cs"
@@ -14,5 +14,7 @@
         bool ExistBarcodes(List<string> barcodes);
 
         PageGridData<StockInfoDetailWithPalletDto> GetPageData2(PageDataOptions options);
+
+        PageGridData<StockDetailDtO> GetPageDataByMateriel(PageDataOptions options);
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/StockDetailByMateriel.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/StockDetailByMateriel.cs"
new file mode 100644
index 0000000..3e31cd2
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/StockDetailByMateriel.cs"
@@ -0,0 +1,74 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_Model.Models
+{
+    public class StockDetailByMateriel
+    {
+        public int Id { get; set; }
+
+
+        public int StockId { get; set; }
+
+
+        public string MaterielCode { get; set; }
+
+
+        public string MaterielName { get; set; }
+
+
+        public string OrderNo { get; set; }
+
+
+        public string BatchNo { get; set; }
+
+
+        public string ProductionDate { get; set; }
+
+
+        public string EffectiveDate { get; set; }
+
+
+        public string SerialNumber { get; set; }
+
+
+        public decimal StockQuantity { get; set; }
+
+
+        public decimal OutboundQuantity { get; set; }
+
+
+        public int Status { get; set; }
+
+
+        public string Unit { get; set; }
+
+        public string InboundOrderRowNo { get; set; }
+
+
+        public string? SupplyCode { get; set; }
+
+        public string FactoryArea { get; set; }
+
+        public string? WarehouseCode { get; set; }
+
+
+        public string? Barcode { get; set; }
+
+
+
+        public string? BusinessType { get; set; }
+
+
+        public decimal BarcodeQty { get; set; }
+
+        public string BarcodeUnit { get; set; }
+
+        public DateTime? ValidDate { get; set; }
+
+        public string Remark { get; set; }
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs"
new file mode 100644
index 0000000..15e4b18
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs"
@@ -0,0 +1,12 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_StockService
+{
+    internal class StockDetailByMaterielService
+    {
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoDetailService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoDetailService.cs"
index 450f6a7..4371f76 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoDetailService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoDetailService.cs"
@@ -72,6 +72,42 @@
 
             return new PageGridData<StockInfoDetailWithPalletDto> { Rows = dtoList, Total = lists.Total, Summary = lists.Summary  };
         }
+
+        public PageGridData<StockDetailDtO> GetPageDataByMateriel(PageDataOptions options)
+        {
+            PageGridData<Dt_StockInfoDetail> lists = base.GetPageData(options);
+
+            List<StockDetailDtO> dtoList = lists.Rows.GroupBy(detail => new { detail.MaterielCode, detail.BatchNo, detail.SupplyCode }).Select(group =>
+            {
+                var firstItem = group.First();
+                return new StockDetailDtO
+                {
+                    Id = firstItem.Id,
+                    StockId = firstItem.StockId,
+                    MaterielCode = group.Key.MaterielCode, 
+                    MaterielName = firstItem.MaterielName,
+                    OrderNo = firstItem.OrderNo,
+                    BatchNo = group.Key.BatchNo, 
+                    ProductionDate = firstItem.ProductionDate,
+                    EffectiveDate = firstItem.EffectiveDate,
+                    SerialNumber = firstItem.SerialNumber,
+                    // 鏍稿績锛氬褰撳墠鍒嗙粍鐨凷tockQuantity姹傚拰
+                    StockQuantity = group.Sum(item => item.StockQuantity),
+                    OutboundQuantity = firstItem.OutboundQuantity,
+                    Status = firstItem.Status,
+                    Unit = firstItem.Unit,
+                    InboundOrderRowNo = firstItem.InboundOrderRowNo,
+                    SupplyCode = group.Key.SupplyCode,
+                    WarehouseCode = firstItem.WarehouseCode,
+                    Barcode = firstItem.Barcode,
+                    BusinessType = firstItem.BusinessType,
+                    Remark = firstItem.Remark
+                };
+            }).ToList();
+            
+
+            return new PageGridData<StockDetailDtO> { Rows = dtoList, Total = lists.Total, Summary = lists.Summary };
+        }
     }
  }
 
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs"
index e5de3a4..607f07b 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs"
@@ -1,10 +1,12 @@
-锘縰sing Microsoft.AspNetCore.Http;
+锘縰sing Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseController;
 using WIDESEA_DTO.Stock;
 using WIDESEA_IStockService;
 using WIDESEA_Model.Models;
+using WIDESEA_StockService;
 
 namespace WIDESEA_WMSServer.Controllers.Stock
 {
@@ -28,5 +30,11 @@
 
             return Json(result);
         }
+
+        [HttpPost, Route("GetPageDataByMateriel"),AllowAnonymous]
+        public PageGridData<StockDetailDtO> GetPageDataByMateriel([FromBody] PageDataOptions options)
+        {
+            return Service.GetPageDataByMateriel(options);
+        }
     }
 }

--
Gitblit v1.9.3