liuying
2024-11-26 0a7bf282841eea43da4406f9a9d14e31a72fea75
打印模版
已添加1个文件
已修改7个文件
1026 ■■■■ 文件已修改
LA24030_LuLiPackageLine_Web/src/api/main/ReportCenter/wmsStockQuan.ts 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/components/printTableCkd.vue 412 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/kittingList/component/openAllprop.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/packList/component/openAllprop.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/packList/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/shortageList/index.vue 370 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsStockQuan/WmsStockQuan/Dto/WmsStockQuanOutput.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsStockQuan/WmsStockQuan/WmsStockQuanService.cs 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/api/main/ReportCenter/wmsStockQuan.ts
@@ -4,6 +4,7 @@
  DeleteWmsStockQuan = '/api/wmsStockQuan/delete',
  UpdateWmsStockQuan = '/api/wmsStockQuan/update',
  PageWmsStockQuan = '/api/wmsStockQuan/page', //888
  ShortagePage = '/api/wmsStockQuan/ShortagePage',
  PageStockQuanForUse= '/api/wmsStockQuan/getStockQuanPageForUse',
  ListWmsStockQuan = '/api/wmsStockQuan/list',
  DetailWmsStockQuan = '/api/wmsStockQuan/detail',
@@ -66,6 +67,17 @@
            data: params
        });
        // åˆ†é¡µæŸ¥è¯¢å®žæ—¶åº“å­˜
export const ShortagePage = (params?: any) =>
    request({
            url: Api.ShortagePage,
            method: 'post',
            data: params
        });
// åˆ†é¡µæŸ¥è¯¢å¯ç”¨å®žæ—¶åº“å­˜
export const pageStockQuanForUse = (params?: any) => 
    request({
LA24030_LuLiPackageLine_Web/src/components/printTableCkd.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,412 @@
<!--打印内容 -->
<template>
        <div id="printContent" class="printContent">
            <div class="printWp" v-for="(itemW, indexW) in deltailList" :key="indexW">
                <!-- <div class="t1">{{Name[0]}}&nbsp; &nbsp; &nbsp; &nbsp;{{Name[1]}}&nbsp; &nbsp; &nbsp; &nbsp;{{Name[2]}}</div> -->
                <div class="t1">{{ Name }}</div>
                <div class="header_pt">
                    <div class="box1">
                        <img class="imgL" src="http://localhost:8888/src/assets/logo-mini.png" alt="" />
                        <!-- <img class="imgL" src="@/assets/logo.png" alt="" /> -->
                        <div class="t2">
                            <p class="text1">
                                <!-- MAKINO J CHINA CO.,LTD<br /> -->
                                é²ä¸½æœ¨ä¸šè‚¡ä»½æœ‰é™å…¬å¸
                            </p>
                        </div>
                    </div>
                    <div class="box-t1">
                        <div>
                            å•号:<span>{{ itemTitle.orderNo }}</span>
                        </div>
                        <!-- <div>DO性质:{{ itemTitle.doNature }}<span></span> </div> -->
                        <div>
                            <!-- åˆåŒå·ï¼š{{ itemTitle.customOrderNumber }}<span></span> -->
                            <div>
                                <span> {{ DateToday }}</span>
                            </div>
                        </div>
                        <div class="t4">
                            <!-- æ”¶è´§æ–¹ï¼š <span>{{ itemTitle.clientName }}</span> -->
                        </div>
                    </div>
                </div>
                <div class="tableBox">
                    <table cellspacing="0" cellpadding="0">
                        <tr class="middle_first">
                            <td class="middle_tree">编号</td>
                            <!-- <td class="middle_one">客户物料代码</td>
          <td class="middle_one">客户物料名称</td> -->
                            <td class="middle_one">批次</td>
                            <td class="middle_two">订单号</td>
                            <td class="middle_four">包装号</td>
                            <td class="middle_one">缺料数</td>
                        </tr>
                        <tr class="middle_first" v-for="(item, index) in itemW" :key="index">
                            <td class="middle_tree">{{ item.num }}</td>
                            <!-- <td class="middle_one">
            <div>
              {{ item.customMaterialcode }}
            </div>
          </td>
          <td class="middle_one">
            <div>
              {{ item.customMaterialName }}
            </div>
          </td> -->
                            <td class="middle_one">
                                <div>
                                    {{ item.planNo }}
                                </div>
                            </td>
                            <td class="middle_two">
                                <div>
                                    {{ item.orderId }}
                                </div>
                            </td>
                            <td class="middle_four">
                                <div>
                                    {{ item.packageCode }}
                                </div>
                            </td>
                            <td class="middle_one">
                                <div>
                                    {{ item.shortageCount }}
                                </div>
                            </td>
                        </tr>
                    </table>
                </div>
                <!-- <br /> <br /> -->
                <!-- <div class="box-t2">
        <div>供货方确认:牧野汽车装备(武汉)有限公司 </div>
        <div> ç­¾æ”¶äººï¼ˆä»£æ”¶äººï¼‰ï¼š </div>
      </div> -->
                <!-- å§“名 ç”µè¯ åœ°å€ -->
                <!-- <div class="box-t2">
        <div>姓名&电话:</div>
        <div> æ—¥æœŸï¼š </div>
      </div> -->
                <!-- <div class="box-t2 box-t2R">
        <div>地址:</div>
      </div> -->
                <span class="pageNum">{{ indexW + 1 }}</span>
            </div>
        </div>
</template>
<script lang="ts" setup>
import { ref, nextTick, computed, defineExpose, defineEmits, markRaw, defineProps } from 'vue';
import printJS from 'print-js';
// import { formatUtcToData } from "@/utils/formate";
const Name = ref([]);
const DateToday = ref('');
const itemTitle: any = ref({});
const deltailList = ref<any[]>([]);
const splitArray = (array: any, size: any) => {
    let data = [];
    for (let i = 0; i < array.length; i += size) {
        data.push(array.slice(i, i + size));
    }
    return data;
};
const printHd = (name: string, itemSubTitle: any, deltailListArr: any) => {
    Name.value = name;
    // if(itemSubTitle && itemSubTitle.length>0){
    //   itemTitle.value = itemSubTitle[0]
    // }
    itemTitle.value.orderNo = deltailListArr[0].orderNo;
    deltailListArr.forEach((item, index) => {
        item.num = index + 1;
    });
    deltailList.value = splitArray(deltailListArr, 16);
    console.log(deltailList.value);
    DateToday.value = '2024-01-01';
    // DateToday.value = formatUtcToData(
    //   new Date().toString(),
    //   "YYYY-MM-DD"
    // );
    // console.log(itemSubTitle)
    // console.log(deltailListArr)
    nextTick(() => {
        printJS({
            printable: 'printContent', // è¦æ‰“印的元素的 ID
            type: 'html', // ä½¿ç”¨ HTML å†…容
            // header: '目标标题', // è®¾ç½®æ‰“印时的标题,如果不需要可以去掉此行
            css: ['*'], // è®¾å®šæ ·å¼ï¼Œå¦‚果你需要引入具体的 CSS æ–‡ä»¶ï¼Œå¯ä»¥åœ¨è¿™é‡Œæ”¾å…¥æ ·å¼æ–‡ä»¶çš„ URL
            style: `
.header_pt {
    display: flex;
    justify-content: space-between;
}
.tableBox {
    border: 1px solid #909399;
    height: 780px;
    overflow: hidden;
}
.printWp {
    padding: 15px 20px;
    height: 1070px;
    overflow: hidden;
    position: relative;
}
.imgL {
    width: 140px;
}
.t1 {
    text-align: center;
    font-size: 30px !important;
    font-weight: bold;
    border: 1px solid transparent;
}
.printContent {
    position: relative;
    z-index: -1;
    font-size: 12px;
}
.printContent .box-t1 {
    line-height: 24px;
    text-align: right;
    position: relative;
    width: 200px;
}
.printContent .box-t1 div {
    display: block;
}
.printContent .t4 {
    text-align: right;
}
.printContent table {
    padding: 10px 0;
}
.printContent table tr,
.printContent table td {
    margin: 0;
    padding: 0;
}
.printContent table td {
    border: 1px solid transparent;
    text-align: center;
    padding: 0px;
}
.printContent table td div {
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: space-around;
    word-break: break-all;
    overflow: hidden;
}
.printContent .middle_tree {
    width: 50px;
}
.printContent .middle_four {
    width: 80px;
}
.printContent .middle_one {
    width: 233px;
}
.printContent .middle_two {
    width: 210px;
}
.printContent span {
    color: gray;
}
.printContent .box-t2 {
    display: flex;
    flex-wrap: wrap;
    margin: 0 3%;
}
.printContent .box-t2 div {
    width: 50%;
    height: 32px;
    overflow: hidden;
    white-space: nowrap;
}
.printContent .box-t2R {
    display: flex;
    flex-wrap: wrap;
}
.printContent .box-t2R div {
    width: 100%;
    height: 40px;
    overflow: hidden;
    white-space: nowrap;
}
.printContent .pageNum {
    position: absolute;
    right: 20px;
    bottom: 0;
}
    `,
            scanStyles: false, // æ˜¯å¦æ‰«æå½“前的 CSS æ ·å¼
        });
    });
};
// æš´éœ²æ–¹æ³•
defineExpose({ printHd });
</script>
<style>
.header_pt {
    display: flex;
    justify-content: space-between;
}
.tableBox {
    border: 1px solid #909399;
    height: 780px;
    overflow: hidden;
}
.printWp {
    padding: 15px 20px;
    height: 1070px;
    overflow: hidden;
    position: relative;
}
.imgL {
    width: 140px;
}
.t1 {
    text-align: center;
    font-size: 30px !important;
    font-weight: bold;
    border: 1px solid transparent;
}
.printContent {
    position: relative;
    z-index: -1;
    font-size: 12px;
}
.printContent .box-t1 {
    line-height: 24px;
    text-align: right;
    position: relative;
    width: 200px;
}
.printContent .box-t1 div {
    display: block;
}
.printContent .t4 {
    text-align: right;
}
.printContent table {
    padding: 10px 0;
}
.printContent table tr,
.printContent table td {
    margin: 0;
    padding: 0;
}
.printContent table td {
    border: 1px solid transparent;
    text-align: center;
    padding: 0px;
}
.printContent table td div {
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: space-around;
    word-break: break-all;
    overflow: hidden;
}
.printContent .middle_tree {
    width: 50px;
}
.printContent .middle_four {
    width: 80px;
}
.printContent .middle_one {
    width: 233px;
}
.printContent .middle_two {
    width: 210px;
}
.printContent span {
    color: gray;
}
.printContent .box-t2 {
    display: flex;
    flex-wrap: wrap;
    margin: 0 3%;
}
.printContent .box-t2 div {
    width: 50%;
    height: 32px;
    overflow: hidden;
    white-space: nowrap;
}
.printContent .box-t2R {
    display: flex;
    flex-wrap: wrap;
}
.printContent .box-t2R div {
    width: 100%;
    height: 40px;
    overflow: hidden;
    white-space: nowrap;
}
.printContent .pageNum {
    position: absolute;
    right: 20px;
    bottom: 0;
}
</style>
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/kittingList/component/openAllprop.vue
@@ -258,11 +258,11 @@
            </template>
        </el-dialog>
        <!-- å•详情 -->
        <el-drawer v-model="drawerVisible" :title="`${detailForm.poId}物料详情`" direction="rtl" size="80%" @close="handleDrawerClose">
        <el-drawer v-model="drawerVisible" :title="`${detailForm.poId}详情`" direction="rtl" size="80%" @close="handleDrawerClose">
            <template #title>
                <div class="slot_title">
                    <div class="title_orderNo">{{ title }}</div>
                    <div>物料详情</div>
                    <div>详情</div>
                </div>
            </template>
@@ -281,7 +281,9 @@
                                <el-form-item label-width="20px">
                                    <el-button type="primary" icon="el-icon-search" @click="getDetail">查询</el-button>
                                    <el-button type="primary" icon="ele-Printer" @click="getPrint">打印</el-button>
                                    <!-- <el-button type="primary" icon="ele-Printer" @click="getPrint">打印</el-button> -->
                                    <el-button type="primary" style="margin-left: 5px" icon="ele-Printer" @click="handleHtmlPrint"> æ‰“印 </el-button>
                                </el-form-item>
                            </el-col>
                        </el-row>
@@ -353,6 +355,9 @@
            </template>
        </el-dialog>
        <!-- æ‰“印 -->
        <print-table-ckd ref="printTableRef"></print-table-ckd>
        <printDialogTestStudent ref="printDialogRefTestStudent" :title="printTestStudentTitle" @reloadTable="handleQueryTestStudent" />
    </div>
</template>
@@ -378,6 +383,7 @@
import { formatDate, formatDate_T_Date, formatDate_T_Time, defaultTimeRange } from '/@/utils/formatTime';
import commonFunction from '/@/utils/commonFunction';
import { handleSlectDataWmsBusinessType } from '/@/utils/selectData';
import printTableCkd from '/@/components/printTableCkd.vue';
// æŽ¨èè®¾ç½®æ“ä½œ width ä¸º 200
import { hiprint } from 'vue-plugin-hiprint';
import { SysPrintApi } from '/@/api-services/api';
@@ -538,7 +544,6 @@
// const enumList: any = cache.getCache('enumList');
// console.log(enumList.inEnumOrderType);
//获取PO单列表
const getTabelData = () => {
    //判断创建时间是否有选择
@@ -619,22 +624,22 @@
// const
//单号
const purchaseNo = ref('');
const IsKitting = ref(false);
//打开抽屉
const openDrawer = async (type: number, scope: any = {}, entozhExcell?: any) => {
    detailForm.value.Page = 1; //bug:点编辑-再点详情
    detailForm.value.PageSize = 10; //bug:点编辑-再点详情
    if (scope.packageCode) {
        title.value = `${scope.packageCode}`;
    if (scope.orderId) {
        title.value = `${scope.orderId}`;
    }
    drawerType.value = 'drawerAll';
    drawerVisible.value = true;
    //当前入库单号id
    detailForm.value.orderId = scope.orderId;
    //入库单
    purchaseNo.value = scope.packageCode;
    purchaseNo.value = scope.orderId;
    debugger;
    detailForm.value.packageCode = scope.packageCode;
    detailForm.value.orderId = scope.orderId;
    //获取物料列表
    if (detailForm.value.poId == '') {
        drawerList.value = [];
@@ -1122,6 +1127,12 @@
    };
    printDialogRefTestStudent.value.showDialog(new hiprint.PrintTemplate({ template: template }), row, template.panels[0].width);
};
// æ‰“印
let itemSubTitle = ref<any[]>([]);
const handleHtmlPrint = () => {
    var title = IsKitting.value == true ? '齐套清单' : '缺套清单';
    proxy.$refs['printTableRef'].printHd(title, itemSubTitle.value, drawerList.value); //deltailList
};
// æš´éœ²æ–¹æ³•
defineExpose({ openDialog, openDrawer });
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/packList/component/openAllprop.vue
@@ -258,11 +258,11 @@
            </template>
        </el-dialog>
        <!-- å•详情 -->
        <el-drawer v-model="drawerVisible" :title="`${detailForm.poId}物料详情`" direction="rtl" size="80%" @close="handleDrawerClose">
        <el-drawer v-model="drawerVisible" :title="`${detailForm.poId}详情`" direction="rtl" size="80%" @close="handleDrawerClose">
            <template #title>
                <div class="slot_title">
                    <div class="title_orderNo">{{ title }}</div>
                    <div>物料详情</div>
                    <div>详情</div>
                </div>
            </template>
@@ -273,15 +273,20 @@
                    <el-form :model="detailForm">
                        <el-row>
                            <el-col :span="6">
                                <el-form-item label="物料编号">
                                    <el-input v-model="detailForm.materialCode" clearable placeholder="请输入物料编号" />
                                <el-form-item label="包装号">
                                    <el-input v-model="detailForm.packageCode" clearable placeholder="请输入包装号" />
                                </el-form-item>
                            </el-col>
                            <el-col :span="4">
                                <el-form-item label-width="20px">
                                    <el-button type="primary" icon="el-icon-search" @click="getDetail">查询</el-button>
                                    <!-- <el-button type="primary" icon="ele-Printer" @click="getPrint">打印</el-button> -->
                                    <!-- :disabled="checkRows.length == 0" -->
                                    <el-button type="primary" style="margin-left: 5px" icon="ele-Printer" @click="handleHtmlPrint">
                                    æ‰“印
                                </el-button>
                                    <el-button type="primary" icon="ele-Printer" @click="getPrint">打印</el-button>
                                </el-form-item>
                            </el-col>
                        </el-row>
@@ -354,6 +359,11 @@
        </el-dialog>
        <printDialogTestStudent ref="printDialogRefTestStudent" :title="printTestStudentTitle" @reloadTable="handleQueryTestStudent" />
                <!-- æ‰“印 -->
                <print-table-ckd ref="printTableRef"></print-table-ckd>
    </div>
</template>
<script lang="ts" setup>
@@ -376,13 +386,13 @@
import { pageBaseCustomer } from '/@/api/main/WmsBase/baseCustomer';
import { listWmsOrderPurchaseDetails, pageWmsOrderPurchaseDetails } from '/@/api/main/WmsOrder/wmsOrderPurchaseDetails';
import { formatDate, formatDate_T_Date, formatDate_T_Time, defaultTimeRange } from '/@/utils/formatTime';
import printTableCkd from '/@/components/printTableCkd.vue';
import commonFunction from '/@/utils/commonFunction';
import { handleSlectDataWmsBusinessType } from '/@/utils/selectData';
// æŽ¨èè®¾ç½®æ“ä½œ width ä¸º 200
import { hiprint } from 'vue-plugin-hiprint';
import { SysPrintApi } from '/@/api-services/api';
import { SysPrint } from '/@/api-services/models';
const moveType = 10; //移动类型 å…¥åº“
const { proxy }: any = getCurrentInstance(); // è®¿é—®å®žä¾‹ä¸Šä¸‹æ–‡ proxy同时支持开发 çº¿ä¸ŠçŽ¯å¢ƒ
const getEnumOrderTypeData = ref<any>([]);
@@ -620,7 +630,7 @@
// const
//单号
const purchaseNo = ref('');
const IsPack = ref(false);
//打开抽屉
const openDrawer = async (type: number, scope: any = {}, entozhExcell?: any) => {
    detailForm.value.Page = 1; //bug:点编辑-再点详情
@@ -634,6 +644,7 @@
    detailForm.value.poId = scope.id;
    //入库单
    purchaseNo.value = scope.packageCode;
    IsPack.value = scope.isPack;
    debugger;
    detailForm.value.poId = scope.id;
    //获取物料列表
@@ -1129,6 +1140,15 @@
    printDialogRefTestStudent.value.showDialog(new hiprint.PrintTemplate({ template: template }), row, template.panels[0].width);
};
// æ‰“印
let itemSubTitle = ref<any[]>([]);
const handleHtmlPrint = () => {
    var title = IsPack.value==true?"齐包清单":"缺包清单";
    proxy.$refs['printTableRef'].printHd(title, itemSubTitle.value, drawerList.value); //deltailList
};
// æš´éœ²æ–¹æ³•
defineExpose({ openDialog, openDrawer });
</script>
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/packList/index.vue
@@ -100,7 +100,7 @@
            <div class="table-container">
                <!-- å·¦ä¾§è¡¨æ ¼ -->
                <div class="left-table">
                    <p class="text-xtiny">齐套列表</p>
                    <p class="text-xtiny">齐包列表</p>
                    <el-table :data="tableData" style="width: 100%" v-loading="loading" tooltip-effect="light" ref="tableRef" row-key="id" @sort-change="sortChange" :summary-method="getExportTitle" border="">
                        <el-table-column type="index" label="序号" width="55" align="center" />
@@ -128,7 +128,7 @@
                <!-- å³ä¾§è¡¨æ ¼ -->
                <div class="right-table">
                    <p class="text-xtiny">不齐套列表</p>
                    <p class="text-xtiny">缺包列表</p>
                    <el-table
                        :data="newTableData"
                        style="width: 100%"
@@ -165,6 +165,8 @@
            </div>
        </el-card>
        <editDialogWmsOrderDeliver ref="editDialogRefWmsOrderDeliver" :title="editWmsOrderDeliverTitle" @reloadTable="handleQuery" />
        <importExcelDialog
            ref="importExcelDialogRefWmsOrderDeliver"
@@ -187,6 +189,7 @@
import { formatUtcToData, getTypeStatus } from '/@/utils/formate';
import printDialog from '/@/views/system/print/component/hiprint/preview.vue';
import editDialog from '/@/views/main/WmsOrder/wmsOrderPurchase/component/editDialog.vue';
import {
    pageWmsOrderPurchase,
    deleteWmsOrderPurchase,
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/shortageList/index.vue
@@ -5,30 +5,28 @@
        <el-row>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
            <el-form-item label="关键字">
              <el-input v-model="queryParamsWmsStockQuan.searchKey" clearable="" placeholder="容器编号,跟踪码,物料编号,物料名称,供应商批次,批次,供应商编号,ERP单号,ERP库存地,ERP凭证"/>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="容器编号">
              <el-input v-model="queryParamsWmsStockQuan.containerCode" clearable="" placeholder="请输入容器编号"/>
                            <el-input v-model="queryParamsWmsStockQuan.searchKey" clearable="" placeholder="订单号,批次,包装号" />
            </el-form-item>
          </el-col>
          
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="跟踪码">
              <el-input v-model="queryParamsWmsStockQuan.snCode" clearable="" placeholder="请输入跟踪码"/>
                        <el-form-item label="订单号">
                            <el-input v-model="queryParamsWmsStockQuan.OrderId" clearable="" placeholder="请输入订单号" />
                        </el-form-item>
                    </el-col>
              
                    <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
                        <el-form-item label="批次">
                            <el-input v-model="queryParamsWmsStockQuan.PlanNo" clearable="" placeholder="请输入批次" />
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="物料编号">
              <el-input v-model="queryParamsWmsStockQuan.materialCode" clearable="" placeholder="请输入物料编号"/>
                        <el-form-item label="包装号">
                            <el-input v-model="queryParamsWmsStockQuan.PackageCode" clearable="" placeholder="请输入包装号" />
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
                    <!-- <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="物料名称">
              <el-input v-model="queryParamsWmsStockQuan.materialName" clearable="" placeholder="请输入物料名称"/>
              
@@ -54,68 +52,25 @@
              <el-input v-model="queryParamsWmsStockQuan.batch" clearable="" placeholder="请输入批次"/>
              
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="收货时间">
              <el-date-picker placeholder="请选择收货时间" value-format="YYYY/MM/DD" type="daterange" v-model="queryParamsWmsStockQuan.recordInsertTimeRange" />
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="供应商编号">
              <el-input v-model="queryParamsWmsStockQuan.supplierCode" clearable="" placeholder="请输入供应商编号"/>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="ERP单号">
              <el-input v-model="queryParamsWmsStockQuan.erpOrderNo" clearable="" placeholder="请输入ERP单号"/>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="ERP库存地">
              <el-input v-model="queryParamsWmsStockQuan.erpCode" clearable="" placeholder="请输入ERP库存地"/>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="质检状态">
              <el-select clearable="" v-model="queryParamsWmsStockQuan.qCStatus" placeholder="请选择质检状态">
                <el-option v-for="(item,index) in getEnumQCStatusData_Index" :key="index" :value="item.value" :label="`${item.describe}`" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="ERP凭证">
              <el-input v-model="queryParamsWmsStockQuan.erpVoucher" clearable="" placeholder="请输入ERP凭证"/>
            </el-form-item>
          </el-col>
          <!-- <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUIWmsStockQuan">
            <el-form-item label="操作时间">
              <el-date-picker placeholder="请选择操作时间" value-format="YYYY/MM/DD" type="daterange" v-model="queryParamsWmsStockQuan.actionTimeRange" />
            </el-form-item>
          </el-col> -->
          <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" class="mb10">
            <el-form-item>
              <el-button-group style="display: flex; align-items: center;">
                            <el-button-group style="display: flex; align-items: center">
                <el-button type="primary"  icon="ele-Search" @click="handleQueryWmsStockQuan" v-auth="'wmsStockQuan:page'" :disabled="disabled_btnWmsStockQuan"> æŸ¥è¯¢ </el-button>
                      <el-button icon="ele-Refresh" @click="resetWmsStockQuan"> é‡ç½® </el-button>
                        <el-button icon="ele-ZoomIn" @click="changeAdvanceQueryUIWmsStockQuan" v-if="!showAdvanceQueryUIWmsStockQuan" style="margin-left:5px;"> é«˜çº§æŸ¥è¯¢ </el-button>
                        <el-button icon="ele-ZoomOut" @click="changeAdvanceQueryUIWmsStockQuan" v-if="showAdvanceQueryUIWmsStockQuan" style="margin-left:5px;"> éšè— </el-button>
                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="openAddWmsStockQuan" v-auth="'wmsStockQuan:add'"> æ–°å¢ž </el-button>
                <el-button type="primary" style="margin-left:5px;" icon="ele-Download" @click="handleExportExcelWmsStockQuan"  v-auth="'wmsStockQuan:exportExcel'" > å¯¼å‡º </el-button>
                                <el-button icon="ele-ZoomIn" @click="changeAdvanceQueryUIWmsStockQuan" v-if="!showAdvanceQueryUIWmsStockQuan" style="margin-left: 5px"> é«˜çº§æŸ¥è¯¢ </el-button>
                                <el-button icon="ele-ZoomOut" @click="changeAdvanceQueryUIWmsStockQuan" v-if="showAdvanceQueryUIWmsStockQuan" style="margin-left: 5px"> éšè— </el-button>
                                <el-button type="primary" style="margin-left: 5px" icon="ele-Plus" @click="openAddWmsStockQuan" v-auth="'wmsStockQuan:add'"> æ–°å¢ž </el-button>
                                <el-button type="primary" style="margin-left: 5px" icon="ele-Download" @click="handleExportExcelWmsStockQuan" v-auth="'wmsStockQuan:exportExcel'"> å¯¼å‡º </el-button>
                <el-button type="primary" style="margin-left:5px;" icon="ele-Printer" @click="openPrintWmsStockQuan"  v-auth="'wmsStockQuan:exportExcel'" :disabled="checkRows.length==0" > æ‰“印 </el-button>
                                <el-button type="primary" style="margin-left: 5px" icon="ele-Printer" @click="handleHtmlPrint" v-auth="'wmsStockQuan:exportExcel'" :disabled="checkRows.length == 0">
                                    æ‰“印
                                </el-button>
<!--
                                <el-button type="primary" style="margin-left: 5px" icon="ele-Printer" v-print="print" plain @click="handleHtmlPrint">打印</el-button> -->
              </el-button-group>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
@@ -131,17 +86,22 @@
                                row-key="id"
                @sort-change="sortChangeWmsStockQuan"
                @selection-change="handleSelectionChange"
                border="">
                border=""
            >
        <el-table-column align="center" width="60" type="selection"  />
        <el-table-column type="index"  label="序号" width="55" align="center"/>
        <el-table-column prop="placeCode" label="库位编码"  show-overflow-tooltip="" />
         <el-table-column prop="inTime" label="进入时间" width="80" :formatter="formatDate_T_Date"  show-overflow-tooltip="" />
        <el-table-column prop="upi" label="部件条码"  show-overflow-tooltip="" />
        <el-table-column prop="detailName" label="部件名称"  show-overflow-tooltip="" />
        <el-table-column prop="planNo" label="批次"  show-overflow-tooltip="" />
        <el-table-column prop="orderId" label="订单号"  show-overflow-tooltip="" />
        <el-table-column prop="packageCode" label="包装号"  show-overflow-tooltip="" />
                <el-table-column prop="totalCount" label="总数量" show-overflow-tooltip="" />
                <el-table-column prop="hasCount" label="现有数量" show-overflow-tooltip="" />
                <el-table-column prop="shortageCount" label="缺料数量" show-overflow-tooltip="" />
                <!-- <el-table-column prop="placeCode" label="库位编码"  show-overflow-tooltip="" />
         <el-table-column prop="inTime" label="进入时间" width="80" :formatter="formatDate_T_Date"  show-overflow-tooltip="" />
        <el-table-column prop="upi" label="部件条码"  show-overflow-tooltip="" />
        <el-table-column prop="detailName" label="部件名称"  show-overflow-tooltip="" />
        <el-table-column prop="length" label="长"  show-overflow-tooltip="" />
        <el-table-column prop="width" label="宽"  show-overflow-tooltip="" />
        <el-table-column prop="thk" label="厚"  show-overflow-tooltip="" />
@@ -166,8 +126,7 @@
         <el-table-column prop="createTime" label="创建时间" width="130" :formatter="formatDate_T_Time"  show-overflow-tooltip="" />
         <el-table-column prop="updateTime" label="修改时间" width="130" :formatter="formatDate_T_Time"  show-overflow-tooltip="" />
        <el-table-column prop="createUserName" label="创建人"  show-overflow-tooltip="" />
        <el-table-column prop="updateUserName" label="修改人"  show-overflow-tooltip="" />
        <el-table-column prop="updateUserName" label="修改人"  show-overflow-tooltip="" /> -->
      </el-table>
      <el-pagination
                v-model:currentPage="tableParamsWmsStockQuan.page"
@@ -180,34 +139,32 @@
                @current-change="handleCurrentChangeWmsStockQuan"
                layout="total, sizes, prev, pager, next, jumper"
    />
      <printDialogWmsStockQuan
        ref="printDialogRefWmsStockQuan"
        :title="printWmsStockQuanTitle"
        @reloadTable="handleQueryWmsStockQuan" />
      <editDialogWmsStockQuan
        ref="editDialogRefWmsStockQuan"
        :title="editWmsStockQuanTitle"
        @reloadTable="handleQueryWmsStockQuan"
      />
            <printDialogWmsStockQuan ref="printDialogRefWmsStockQuan" :title="printWmsStockQuanTitle" @reloadTable="handleQueryWmsStockQuan" />
            <editDialogWmsStockQuan ref="editDialogRefWmsStockQuan" :title="editWmsStockQuanTitle" @reloadTable="handleQueryWmsStockQuan" />
    </el-card>
        <!-- æ‰“印 -->
        <print-table-ckd ref="printTableRef"></print-table-ckd>
  </div>
</template>
<script lang="ts" setup="" name="wmsStockQuan">
  import { ref,onMounted } from "vue";
  import { ElMessageBox, ElMessage } from "element-plus";
import { ref, onMounted, getCurrentInstance, reactive, computed, nextTick } from 'vue';
import { ElMessageBox, ElMessage } from 'element-plus';
  import { auth } from '/@/utils/authFunction';
  import { getDictDataItem as di, getDictDataList as dl } from '/@/utils/dict-utils';
  import { formatDate,formatDate_T_Date,formatDate_T_Time,defaultTimeRange } from '/@/utils/formatTime';
  import { exportPageExcel } from '/@/utils/exportPageExcel' //引入导出方法
import { exportPageExcel } from '/@/utils/exportPageExcel'; //引入导出方法
  import printDialogWmsStockQuan from '/@/views/system/print/component/hiprint/preview.vue'
  import { pageWmsStockQuan, deleteWmsStockQuan,importExcelWmsStockQuan,downloadExcelTemplateWmsStockQuan } from '/@/api/main/ReportCenter/wmsStockQuan';
import printDialogWmsStockQuan from '/@/views/system/print/component/hiprint/preview.vue';
import { ShortagePage, deleteWmsStockQuan, importExcelWmsStockQuan, downloadExcelTemplateWmsStockQuan } from '/@/api/main/ReportCenter/wmsStockQuan';
    import { getAPI } from '/@/utils/axios-utils';
    import { SysEnumApi } from '/@/api-services/api';
  import commonFunction from '/@/utils/commonFunction';
import { addWmsRecordSncodePrint } from "/@/api/main/PrintCenter/wmsRecordSncodePrint";
import { addWmsRecordSncodePrint } from '/@/api/main/PrintCenter/wmsRecordSncodePrint';
import printTableCkd from '/@/components/printTableCkd.vue';
const { proxy }: any = getCurrentInstance(); // è®¿é—®å®žä¾‹ä¸Šä¸‹æ–‡ proxy同时支持开发 çº¿ä¸ŠçŽ¯å¢ƒ
import printJs from 'print-js';
  const getEnumQCStatusData_Index = ref<any>([]);
    const getEnumStockStatusData_Index = ref<any>([]);
@@ -229,20 +186,20 @@
    total: 0,
  });
  const printWmsStockQuanTitle = ref("");
  const editWmsStockQuanTitle = ref("");
const printWmsStockQuanTitle = ref('');
const editWmsStockQuanTitle = ref('');
  // æ”¹å˜é«˜çº§æŸ¥è¯¢çš„æŽ§ä»¶æ˜¾ç¤ºçŠ¶æ€
  const changeAdvanceQueryUIWmsStockQuan = () => {
    showAdvanceQueryUIWmsStockQuan.value = !showAdvanceQueryUIWmsStockQuan.value;
  }
};
  // æŸ¥è¯¢å®žæ—¶åº“å­˜
// 8888查询实时库存
  const handleQueryWmsStockQuan = async () => {
    loadingWmsStockQuan.value = true;
    disabled_btnWmsStockQuan.value = true;
    var res = await pageWmsStockQuan(Object.assign(queryParamsWmsStockQuan.value, tableParamsWmsStockQuan.value));
    if(res.data.type=="success"){
    var res = await ShortagePage(Object.assign(queryParamsWmsStockQuan.value, tableParamsWmsStockQuan.value));
    if (res.data.type == 'success') {
      tableDataWmsStockQuan.value = res.data.result?.items ?? [];
      tableParamsWmsStockQuan.value.total = res.data.result?.total;
    }
@@ -252,7 +209,7 @@
  // é‡ç½®å®žæ—¶åº“存查询
  const resetWmsStockQuan = async () => {
    queryParamsWmsStockQuan.value = {}
    queryParamsWmsStockQuan.value = {};
  };
  // å®žæ—¶åº“存列排序
@@ -268,19 +225,128 @@
    editDialogRefWmsStockQuan.value.openDialog(1,{});
  };
//选中的行
const checkRows = ref<{ id: number }[]>([]);
// é€‰æ‹©
const handleSelectionChange = (val: any) => {
    checkRows.value = val;
};
// è®¾ç½® tool header æ•°æ®
const setHeader = computed(() => {
    return props.columns.filter((v) => v.isCheck);
});
// å®šä¹‰çˆ¶ç»„件传过来的值
const props = defineProps({
    // èŽ·å–æ•°æ®çš„æ–¹æ³•ï¼Œç”±çˆ¶ç»„ä»¶ä¼ é€’
    getData: {
        type: Function,
        required: true,
    },
    // åˆ—属性,和elementUI的Table-column å±žæ€§ç›¸åŒï¼Œé™„加属性:isCheck-是否默认勾选展示,hideCheck-是否隐藏该列的可勾选和拖拽
    columns: {
        type: Array<any>,
        default: () => [],
    },
    // é…ç½®é¡¹ï¼šisBorder-是否显示表格边框,isSerialNo-是否显示表格序号,showSelection-是否显示表格可多选,isSelection-是否默认选中表格多选,pageSize-每页条数,hideExport-是否隐藏导出按钮,exportFileName-导出表格的文件名,空值默认用应用名称作为文件名
    config: {
        type: Object,
        default: () => ({}),
    },
    // ç­›é€‰å‚æ•°
    param: {
        type: Object,
        default: () => ({}),
    },
    // é»˜è®¤æŽ’序方式,{prop:"排序字段",order:"ascending or descending"}
    defaultSort: {
        type: Object,
        default: () => ({}),
    },
    // å¯¼å‡ºæŠ¥è¡¨è‡ªå®šä¹‰æ•°æ®è½¬æ¢æ–¹æ³•,不传按字段值导出
    exportChangeData: {
        type: Function,
    },
    // æ‰“印标题
    printName: {
        type: String,
        default: () => '',
    },
});
const state = reactive({
    data: [] as Array<EmptyObjectType>,
    loading: false,
    exportLoading: false,
    total: 0,
    page: {
        page: 1,
        pageSize: 10,
        field: '',
        order: '',
    },
    showPagination: true,
    selectlist: [] as EmptyObjectType[],
    checkListAll: true,
    checkListIndeterminate: false,
});
// æ‰“印
const openPrintWmsStockQuan = () => {
    printJs({
        printable: 'printContent', // å¼•用要打印的元素 ID
        type: 'html', // ä½¿ç”¨ HTML å†…容
        css: ['//at.alicdn.com/t/c/font_2298093_rnp72ifj3ba.css', '//unpkg.com/element-plus/dist/index.css'],
        style: `
      @media print {
        .mb15 { margin-bottom: 15px; }
        .el-button--small i.iconfont { font-size: 12px !important; margin-right: 5px; }
      }
      .table-th { word-break: break-all; white-space: pre-wrap; }
      .table-center { text-align: center; }
    `,
    });
    // // https://printjs.crabbly.com/#documentation
    // // è‡ªå®šä¹‰æ‰“印
    // let tableTh = '';
    // let tableTrTd = '';
    // let tableTd: any = {};
    // // è¡¨å¤´
    // setHeader.value.forEach((v: any) => {
    //     if (v.prop === 'action') {
    //         return;
    //     }
    //     tableTh += `<th class="table-th">${v.label}</th>`;
    // });
    // // è¡¨æ ¼å†…容
    // state.data.forEach((val: any, key: any) => {
    //     if (!tableTd[key]) tableTd[key] = [];
    //     setHeader.value.forEach((v: any) => {
    //         if (v.prop === 'action') {
    //             return;
    //         }
    //         if (v.type === 'text') {
    //             tableTd[key].push(`<td class="table-th table-center">${val[v.prop]}</td>`);
    //         } else if (v.type === 'image') {
    //             tableTd[key].push(`<td class="table-th table-center"><img src="${val[v.prop]}" style="width:${v.width}px;height:${v.height}px;"/></td>`);
    //         } else {
    //             tableTd[key].push(`<td class="table-th table-center">${val[v.prop]}</td>`);
    //         }
    //     });
    //     tableTrTd += `<tr>${tableTd[key].join('')}</tr>`;
    // });
    // // æ‰“印
    // printJs({
    //     printable: `<div style=display:flex;flex-direction:column;text-align:center><h3>333</h3></div><table border=1 cellspacing=0><tr>${tableTh}${tableTrTd}</table>`,
    //     type: 'raw-html',
    //     css: ['//at.alicdn.com/t/c/font_2298093_rnp72ifj3ba.css', '//unpkg.com/element-plus/dist/index.css'],
    //     style: `@media print{.mb15{margin-bottom:15px;}.el-button--small i.iconfont{font-size: 12px !important;margin-right: 5px;}}; .table-th{word-break: break-all;white-space: pre-wrap;}.table-center{text-align: center;}`,
    // });
};
  // æ‰“开打印实时库存页面
  const openPrintWmsStockQuan = async (row: any) => {
const openPrintWmsStockQuan2 = async (row: any) => {
    // printWmsStockQuanTitle.value = '打印实时库存';
    ElMessageBox.confirm('是否确认打印?', '提示', {
        confirmButtonText: '确认',
@@ -288,33 +354,28 @@
        type: 'warning',
    })
        .then(async () => {
      const handleArr: number[] = [];
    checkRows.value.forEach((item) => {
        // handleArr.push(item.id);
    item.PrintSource = 1 //库存跟踪码打印
    item.PrintType = 1
    item.PrintSheetNum = 1
    item.PrintNum = 1
    item.PrintStatu = 1
    item.IsAllowPrint = 1
                item.PrintSource = 1; //库存跟踪码打印
                item.PrintType = 1;
                item.PrintSheetNum = 1;
                item.PrintNum = 1;
                item.PrintStatu = 1;
                item.IsAllowPrint = 1;
    });
 
    const obj = { id: handleArr };
  var res = await addWmsRecordSncodePrint(checkRows.value);
  if (res.data && res.data.code == 200) {
          ElMessage.success("添加成功");
                ElMessage.success('添加成功');
        }
        })
        .catch(() => {
            ElMessage.info('已取消删除');
        });
  }
};
  
  // æ‰“开编辑实时库存页面
  const openEditWmsStockQuan = (row: any) => {
@@ -324,16 +385,16 @@
  // åˆ é™¤å®žæ—¶åº“å­˜
  const delWmsStockQuan = (row: any) => {
    ElMessageBox.confirm(`确定要删除吗?`, "提示", {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
    type: "warning",
    ElMessageBox.confirm(`确定要删除吗?`, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
  })
  .then(async () => {
    loadingWmsStockQuan.value = true;
    var ret = await deleteWmsStockQuan(row);
    if(ret.data.type=="success"){
        ElMessage.success("删除成功");
            if (ret.data.type == 'success') {
                ElMessage.success('删除成功');
    }
    loadingWmsStockQuan.value = false;
    handleQueryWmsStockQuan();
@@ -360,7 +421,7 @@
      getEnumStockStatusData_Index,
      getEnumQCStatusData_Index,
      formatDate_T_Date,
      formatDate_T_Time
    formatDate_T_Time,
};
//点击导出按钮
const handleExportExcelWmsStockQuan = async (formData:Blob) => {
@@ -369,8 +430,8 @@
    var new_tableParamsWmsStockQuan=JSON.parse(JSON.stringify(tableParamsWmsStockQuan.value));
    new_tableParamsWmsStockQuan.page = 1;
    new_tableParamsWmsStockQuan.pageSize = 100000;
    var res = await pageWmsStockQuan(Object.assign(queryParamsWmsStockQuan.value, new_tableParamsWmsStockQuan));
    if(res.data.type=="success"){
    var res = await ShortagePage(Object.assign(queryParamsWmsStockQuan.value, new_tableParamsWmsStockQuan));
    if (res.data.type == 'success') {
      exportExcelWmsStockQuan(res.data.result?.items ?? []);
    }
    loadingWmsStockQuan.value = false;
@@ -378,7 +439,7 @@
};
//导出
const exportExcelWmsStockQuan  = async (exportDataList:Array) => {
  exportPageExcel(exportDataList, tableRefWmsStockQuan,"实时库存",functionMapWmsStockQuan);
    exportPageExcel(exportDataList, tableRefWmsStockQuan, '实时库存', functionMapWmsStockQuan);
};
/***************************************************[实时库存导出]结束***************************************************/
  // å®žæ—¶åº“存页面加载时
@@ -391,48 +452,18 @@
  handleQueryWmsStockQuan();
  //表格汇总
const getSummaries = (param: any) => {
  const { columns, data } = param;
  const sums:any = [];
  columns.forEach((column, index) => {
    if (index === 0) {
      sums[index] = '合计';
      return;
    }
    //debugger
    if (column.property != 'quantity' && column.property != 'scrapQuantity'
      && column.property != 'useNumber'
      && column.property != 'gridNumber'
    ) {
      sums[index] = '';
      return "";
    }
    const values = data.map(item => Number(item[column.property]));
    if (!values.every(value => isNaN(value))) {
      sums[index] = Number(values.reduce((prev, curr) => {
        const value = Number(curr);
        if (!isNaN(value)) {
          return prev + curr;
        } else {
          return prev;
        }
      }, 0)).toFixed(3);
      sums[index] += '';
    } else {
      sums[index] = '';//N/A
    }
  });
  return sums;
}
// æ‰“印
let itemSubTitle = ref<any[]>([]);
const handleHtmlPrint = () => {
    proxy.$refs['printTableRef'].printHd('缺包清单', itemSubTitle.value, checkRows.value); //deltailList
};
// //打印
// const print = ref({
//   id: 'printContent',
//   popTitle: ' ',
//   //extraCss: "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
//   extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
// })
</script>
<style scoped>
:deep(.el-input),
@@ -441,4 +472,3 @@
    width: 100%;
}
</style>
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsStockQuan/WmsStockQuan/Dto/WmsStockQuanOutput.cs
@@ -167,3 +167,40 @@
    public int Count { get; set; }           // å¯¹åº”的数量
    public bool IsKitting { get; set; }
}
/// <summary>
/// æ‰¹æ¬¡ç¼ºæ–™æ¸…单
/// </summary>
public class WmsShortageListOutput
{
    /// <summary>
    /// ç¼“存岛数量
    /// </summary>
    public int HasCount { get; set; }
    /// <summary>
    /// mes过来的总数量
    /// </summary>
    public int TotalCount { get; set; }
    /// <summary>
    /// ç¼ºæ–™æ•°é‡
    /// </summary>
    public int ShortageCount { get; set; }
    /// <summary>
    /// æ‰¹æ¬¡
    /// </summary>
    public string PlanNo { get; set; }
    /// <summary>
    /// è®¢å•号
    /// </summary>
    public string OrderId { get; set; }
    /// <summary>
    /// åŒ…装号
    /// </summary>
    public string PackageCode { get; set; }
}
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsStockQuan/WmsStockQuan/WmsStockQuanService.cs
@@ -13,9 +13,13 @@
public class WmsStockQuanService : IDynamicApiController, ITransient
{
    private readonly SqlSugarRepository<WmsStockQuan> _rep;
    public WmsStockQuanService(SqlSugarRepository<WmsStockQuan> rep)
    private readonly SqlSugarRepository<Mes_BatchOrderUPI_New> _Mes_BatchOrderUPI_New_Rep;
    public WmsStockQuanService(SqlSugarRepository<WmsStockQuan> rep,
        SqlSugarRepository<Mes_BatchOrderUPI_New> Mes_BatchOrderUPI_New_Rep)
    {
        _rep = rep;
        _Mes_BatchOrderUPI_New_Rep = Mes_BatchOrderUPI_New_Rep;
    }
    /// <summary>
@@ -302,5 +306,124 @@
        return groupedResult; // è¿”回分组结果
    }
    /// <summary>
    /// ä¸åˆ†é¡µæŸ¥è¯¢æ‰¹æ¬¡ç¼ºæ–™æ¸…单 ä¸é½åŒ…
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpGet]
    [ApiDescriptionSettings(Name = "ShortageList")]
    [Description("WmsStockQuan/ShortageList")]
    public async Task<List<WmsShortageListOutput>> ShortageList([FromQuery] KittingListInput input)
    {
        var list = await _rep.AsQueryable()
            .WhereIF(!string.IsNullOrWhiteSpace(input.DetailName), u => u.PlaceCode.Contains(input.DetailName.Trim()))
            .Select(x => new WmsShortageListOutput
            {
                OrderId = x.OrderId,
                PlanNo = x.PlanNo,
                PackageCode = x.PackageCode
            })
            .ToListAsync(); // ç¡®ä¿èŽ·å–ç»“æžœä¸º List
        // åˆ†ç»„并返回分组信息
        var groupedResult = list
            .GroupBy(x => x.OrderId) // æŒ‰ OrderId åˆ†ç»„
            .Select(g => new WmsShortageListOutput
            {
                OrderId = g.Key, // èŽ·å–åˆ†ç»„çš„é”®
                PlanNo = g.FirstOrDefault().PlanNo, // èŽ·å–ç»„å†…çš„ç¬¬ä¸€ä¸ª PlanNo
                PackageCode = g.FirstOrDefault().PackageCode, // èŽ·å–ç»„å†…çš„ç¬¬ä¸€ä¸ª PackageCode
                HasCount = g.Count(), // ç»Ÿè®¡æ¯ç»„的数量
                TotalCount = 0, // åˆå§‹åŒ– TotalCount
                ShortageCount = 0 // åˆå§‹åŒ– ShortageCount
            })
            .OrderBy(g => g.OrderId) // æ ¹æ® OrderId æŽ’序
            .ToList(); // è½¬æ¢ä¸º List
        // å¾ªçޝ groupedResult ç»™æ¯ä¸€æ¡åŠ ä¸Šæ€»æ•°é‡ CountTotal
        foreach (var item in groupedResult)
        {
            item.TotalCount = await _Mes_BatchOrderUPI_New_Rep.AsQueryable().CountAsync(m => m.PackageCode == item.PackageCode); // æ ¹æ® PackageCode ç»Ÿè®¡æ€»æ¡æ•°
            item.ShortageCount = item.TotalCount - item.HasCount > 0 ? item.TotalCount - item.HasCount : 0;
        }
        return groupedResult; // è¿”回分组结果
    }
    /// <summary>
    /// åˆ†é¡µæŸ¥è¯¢æ‰¹æ¬¡ç¼ºæ–™æ¸…单 ä¸é½åŒ…
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "ShortagePage")]
    [Description("WmsStockQuan/ShortagePage")]
    public async Task<SqlSugarPagedList<WmsShortageListOutput>> ShortagePage(KittingListInput input)
    {
        // èŽ·å–åŸºç¡€æ•°æ®
        var list = await _rep.AsQueryable()
            .WhereIF(!string.IsNullOrWhiteSpace(input.DetailName), u => u.PlaceCode.Contains(input.DetailName.Trim()))
            .Select(x => new WmsShortageListOutput
            {
                OrderId = x.OrderId,
                PlanNo = x.PlanNo,
                PackageCode = x.PackageCode
            })
            .ToListAsync(); // ç¡®ä¿èŽ·å–ç»“æžœä¸º List
        // åˆ†ç»„并返回分组信息
        var groupedResult = list
            .GroupBy(x => x.OrderId) // æŒ‰ OrderId åˆ†ç»„
            .Select(g => new WmsShortageListOutput
            {
                OrderId = g.Key, // èŽ·å–åˆ†ç»„çš„é”®
                PlanNo = g.FirstOrDefault().PlanNo, // èŽ·å–ç»„å†…çš„ç¬¬ä¸€ä¸ª PlanNo
                PackageCode = g.FirstOrDefault().PackageCode, // èŽ·å–ç»„å†…çš„ç¬¬ä¸€ä¸ª PackageCode
                HasCount = g.Count(), // ç»Ÿè®¡æ¯ç»„的数量
                TotalCount = 0, // åˆå§‹åŒ– TotalCount
                ShortageCount = 0 // åˆå§‹åŒ– ShortageCount
            })
            .OrderBy(g => g.OrderId) // æ ¹æ® OrderId æŽ’序
            .ToList(); // è½¬æ¢ä¸º List
        // å¾ªçޝ groupedResult ç»™æ¯ä¸€æ¡åŠ ä¸Šæ€»æ•°é‡ TotalCount
        foreach (var item in groupedResult)
        {
            item.TotalCount = await _Mes_BatchOrderUPI_New_Rep.AsQueryable().CountAsync(m => m.PackageCode == item.PackageCode); // æ ¹æ® PackageCode ç»Ÿè®¡æ€»æ¡æ•°
            item.ShortageCount = item.TotalCount - item.HasCount > 0 ? item.TotalCount - item.HasCount : 0;
        }
        // åˆ†é¡µå¤„理
        var pagedResult = groupedResult.AsQueryable() // å°†åˆ†ç»„结果转换为可查询的集合
            .OrderBy(g => g.OrderId) // è¿›è¡ŒæŽ’序
            .Skip((input.Page - 1) * input.PageSize) // è·³è¿‡å‰é¢çš„页数
            .Take(input.PageSize) // å–出当前页的数据
            .ToList(); // è½¬æ¢ä¸º List
        var totalCount = groupedResult.Count; // èŽ·å–æ€»æ•°
        var totalPages = (int)Math.Ceiling((double)totalCount / input.PageSize); // è®¡ç®—总页数
        // æž„造并返回分页结果
        return new SqlSugarPagedList<WmsShortageListOutput>
        {
            Page = input.Page,
            PageSize = input.PageSize,
            Total = totalCount,
            TotalPages = totalPages,
            Items = pagedResult,
            HasPrevPage = input.Page > 1,
            HasNextPage = input.Page < totalPages
        };
    }
}