schangxiang@126.com
2024-11-27 e02f1f0f08c1babc68dd2e69ebf5c6bdc8df8291
Merge branch 'master' of http://222.71.245.114:9086/r/LA24030-LuLI_PackageLine
已添加1个文件
已修改7个文件
6010 ■■■■ 文件已修改
LA24030_LuLiPackageLine_Web/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/api/main/ReportCenter/wmsStockQuan.ts 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/components/printTableCkd.vue 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/shortageList/component/openAllprop.vue 774 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/shortageList/index.vue 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/stats.html 4842 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsStockQuan/WmsStockQuan/Dto/WmsStockQuanOutput.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsStockQuan/WmsStockQuan/WmsStockQuanService.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Web/package.json
@@ -41,6 +41,7 @@
        "pinia": "^2.1.7",
        "print-js": "^1.6.0",
        "push.js": "^1.0.12",
        "qrcode": "^1.5.4",
        "qrcodejs2-fixes": "^0.0.2",
        "qs": "^6.12.1",
        "relation-graph": "^2.2.0",
LA24030_LuLiPackageLine_Web/src/api/main/ReportCenter/wmsStockQuan.ts
@@ -3,11 +3,10 @@
  AddWmsStockQuan = '/api/wmsStockQuan/add',
  DeleteWmsStockQuan = '/api/wmsStockQuan/delete',
  UpdateWmsStockQuan = '/api/wmsStockQuan/update',
  PageWmsStockQuan = '/api/wmsStockQuan/page', //888
  PageWmsStockQuan = '/api/wmsStockQuan/page',
  ShortagePage = '/api/wmsStockQuan/ShortagePage', 
  ShortagePageGroupByInfo5 = '/api/wmsStockQuan/ShortagePageGroupByInfo5',
  ShortageList = '/api/wmsStockQuan/ShortageList', 
  PageStockQuanForUse= '/api/wmsStockQuan/getStockQuanPageForUse',
  ListWmsStockQuan = '/api/wmsStockQuan/list',
  DetailWmsStockQuan = '/api/wmsStockQuan/detail',
@@ -80,6 +79,13 @@
            data: params
        });
export const ShortagePageGroupByInfo5 = (params?: any) =>
    request({
            url: Api.ShortagePageGroupByInfo5,
            method: 'post',
            data: params
        });
                // åˆ†é¡µæŸ¥è¯¢å®žæ—¶åº“å­˜
export const ShortageList = (params?: any) => 
    request({
LA24030_LuLiPackageLine_Web/src/components/printTableCkd.vue
@@ -1,90 +1,85 @@
<!--打印内容 -->
<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">
                                é²ä¸½æœ¨ä¸šè‚¡ä»½æœ‰é™å…¬å¸
                            </p>
                        </div>
                    </div>
                    <div class="box-t1">
                        <div>
                            å•号:<span>{{ itemTitle.orderNo }}</span>
                        </div>
                        <div>
                            <div>
                                <span> {{ DateToday }}</span>
                            </div>
                        </div>
                        <div class="t4">
                        </div>
                    </div>
                </div>
    <div id="printContent" class="printContent">
                <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_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.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.upi }}
                                </div>
                            </td>
                        </tr>
                    </table>
    <div class="ermbox">
                        <div class="t40">
                            é”€å”®è®¢å•号:<span>{{ itemTitle.info16 }}</span>
                        </div>
                        <div  class="imgL">
        <canvas ref="qrcodeCanvas"></canvas>
    </div>
                        <div class="t41">
                            ç”Ÿäº§è®¢å•号:<span>{{ itemTitle.info5 }}</span>
                        </div>
                    </div>
        <div class="printWp" v-for="(itemW, indexW) in deltailList" :key="indexW">
            <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">鲁丽木业股份有限公司</p>
                    </div> -->
                </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 class="box-t1">
                    <div>
                        æ‰“印时间:<span>{{ DateToday }}</span>
                    </div>
                    <div>
                        ç¼ºæ–™æ€»æ•°é‡ï¼š<span>{{ deltailList.length }}</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_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.planNo }} -->
                            </div>
                        </td>
                        <td class="middle_two">
                            <div>
                                {{ item.detailName  }}
                            </div>
                        </td>
                        <td class="middle_four">
                            <div>
                                {{ item.info16 }}
                            </div>
                        </td>
                        <td class="middle_one">
                            <div>
                                {{ item.upi }}
                            </div>
                        </td>
                    </tr>
                </table>
            </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 { ref, nextTick, computed, defineExpose, defineEmits, markRaw, defineProps, onMounted } from 'vue';
import printJS from 'print-js';
// import { formatUtcToData } from "@/utils/formate";
import QRCode from 'qrcode';
const Name = ref([]);
const DateToday = ref('');
const itemTitle: any = ref({});
@@ -96,12 +91,21 @@
    }
    return data;
};
const qrcodeCanvas = ref<HTMLCanvasElement | null>(null);
// };
const printHd = (name: string, itemSubTitle: any, deltailListArr: any) => {
    console.log('打印条数8888==' + deltailListArr.length);
    Name.value = name;
    debugger;
    // if(itemSubTitle && itemSubTitle.length>0){
    //   itemTitle.value = itemSubTitle[0]
    // }
    itemTitle.value.orderNo = deltailListArr[0].orderNo;
    itemTitle.value.info5 = deltailListArr[0].info5;
    itemTitle.value.info16 = deltailListArr[0].info16;
    deltailListArr.forEach((item, index) => {
        item.num = index + 1;
    });
@@ -117,6 +121,13 @@
    // console.log(itemSubTitle)
    // console.log(deltailListArr)
    if (deltailListArr[0].info5) {
        debugger
        nextTick(() => {
        QRCode.toCanvas(qrcodeCanvas.value, deltailListArr[0].info5, { width: 150 });
    });// åœ¨ç»„件挂载时生成二维码
    }
    nextTick(() => {
        printJS({
            printable: 'printContent', // è¦æ‰“印的元素的 ID
@@ -143,20 +154,26 @@
    position: relative;
}
.imgL {
    width: 140px;
}
.t1 {
    text-align: center;
    font-size: 30px !important;
    font-size: 20px !important;
    font-weight: bold;
    border: 1px solid transparent;
    padding-bottom: 119px;
}
.ermbox {
    position: absolute;
    top: 10px;
    left: 20px;
}
.imgL {
}
.printContent {
    position: relative;
    z-index: -1;
    z-index: 999;
    font-size: 12px;
}
@@ -171,10 +188,15 @@
    display: block;
}
.printContent .t4 {
    text-align: right;
.ermbox span {
    font-weight: 700;
}
.t40 {
    font-size: 12px;
}
.t41 {
    font-size: 16px;
}
.printContent table {
    padding: 10px 0;
}
@@ -251,12 +273,27 @@
    bottom: 0;
}
    `,
            scanStyles: false, // æ˜¯å¦æ‰«æå½“前的 CSS æ ·å¼
        });
    });
};
// onMounted(async () => {
//     if (qrcodeCanvas.value) {
//         try {
//             await QRCode.toCanvas(qrcodeCanvas.value, "7777", { width: 100 });
//         } catch (err) {
//             console.error('生成二维码出错:', err);
//         }
//     } else {
//         console.error('qrcodeCanvas未定义');
//     }
// });
// æš´éœ²æ–¹æ³•
defineExpose({ printHd });
@@ -282,20 +319,26 @@
    position: relative;
}
.imgL {
    width: 140px;
}
.t1 {
    text-align: center;
    font-size: 30px !important;
    font-size: 20px !important;
    font-weight: bold;
    border: 1px solid transparent;
    padding-bottom: 119px;
}
.ermbox {
    position: absolute;
    top: 10px;
    left: 20px;
}
.imgL {
}
.printContent {
    position: relative;
    z-index: -1;
    z-index: -999;
    font-size: 12px;
}
@@ -310,10 +353,15 @@
    display: block;
}
.printContent .t4 {
    text-align: right;
.ermbox span {
    font-weight: 700;
}
.t40 {
    font-size: 12px;
}
.t41 {
    font-size: 16px;
}
.printContent table {
    padding: 10px 0;
}
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/shortageList/component/openAllprop.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,774 @@
<template>
    <div>
        <!-- å•详情 -->
        <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>
            </template>
            <div class="detailBoxWrap">
                <!-- è¯¦æƒ…组件 -->
                <open-details ref="propDetailRef"></open-details>
                <div class="msi-form">
                    <el-form :model="detailForm">
                        <el-row>
                            <el-col :span="6">
                                <el-form-item label="部件名称">
                                    <el-input v-model="detailForm.detailName" 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> -->
                                    <el-button type="primary" style="margin-left: 5px" icon="ele-Printer" @click="handleHtmlPrint"> æ‰“印 </el-button>
                                </el-form-item>
                            </el-col>
                        </el-row>
                    </el-form>
                </div>
                <div class="msi-content">
                    <!-- <p style="margin-bottom: 10px">物料明细</p> -->
                    <el-table :data="drawerList" border striped :max-height="480">
                        <el-table-column fixed="left" type="index" label="序号" width="55" align="center" />
                        <el-table-column prop="planNo" label="批次" show-overflow-tooltip="" />
                        <el-table-column prop="orderId" label="订单号" show-overflow-tooltip="" />
                        <el-table-column prop="info5" label="生产单号" show-overflow-tooltip="" />
                        <el-table-column prop="packageCode" label="包装号" 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="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="length" label="长" show-overflow-tooltip="" />
                        <el-table-column prop="width" label="宽" show-overflow-tooltip="" />
                        <el-table-column prop="thk" label="厚" show-overflow-tooltip="" />
                        <el-table-column prop="stockStatus" label="库存状态" show-overflow-tooltip="">
                            <template #default="scope">
                                <el-tag>{{ getEnumDesc(scope.row.stockStatus, getEnumStockStatusData_Index) }}</el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column prop="stockStatusName" label="库存状态名称" show-overflow-tooltip="" />
                        <el-table-column prop="operReason" label="操作原因" show-overflow-tooltip="" />
                        <el-table-column prop="operUser" label="操作人" show-overflow-tooltip="" />
                        <el-table-column prop="operTime" label="操作时间" width="80" :formatter="formatDate_T_Date" show-overflow-tooltip="" />
                        <el-table-column prop="lockStatus" label="锁定状态" show-overflow-tooltip="">
                            <template #default="scope">
                                <el-tag>{{ getEnumDesc(scope.row.lockStatus, getEnumLockStatusData_Index) }}</el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column prop="lockReason" label="锁定原因" show-overflow-tooltip="" />
                        <el-table-column prop="lockUser" label="锁定人" show-overflow-tooltip="" />
                        <el-table-column prop="lockTime" label="锁定时间" width="80" :formatter="formatDate_T_Date" show-overflow-tooltip="" />
                        <el-table-column prop="remarks" label="备注" show-overflow-tooltip="" />
                        <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>
                    <Pagination :total="detailCount" v-model:page="detailForm.Page" v-model:limit="detailForm.PageSize" @pagination="getDetail" style="margin-top: 20px; text-align: center"></Pagination>
                    <div></div>
                </div>
            </div>
        <!-- æ‰“印 -->
        <print-table-ckd ref="printTableRef"></print-table-ckd>
        </el-drawer>
    </div>
</template>
<script lang="ts" setup>
import Pagination from '/@/components/Pagination/index.vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import { ref, nextTick, computed, getCurrentInstance, watch, defineExpose, defineProps, onMounted } from 'vue';
import { getAPI } from '/@/utils/axios-utils';
import { SysEnumApi } from '/@/api-services/api';
import printJS from 'print-js';
import { addWmsOrderPurchase, updateWmsOrderPurchase, detailWmsOrderPurchase } from '/@/api/main/WmsOrder/wmsOrderPurchase';
import OpenDetails from '/@/components/openDetails/openDetails.vue';
import { pageBaseCustomer } from '/@/api/main/WmsBase/baseCustomer';
import { listWmsOrderPurchaseDetails, pageWmsOrderPurchaseDetails } from '/@/api/main/WmsOrder/wmsOrderPurchaseDetails';
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';
import { SysPrint } from '/@/api-services/models';
import { ShortagePage } from '/@/api/main/ReportCenter/wmsStockQuan';
const moveType = 10; //移动类型 å…¥åº“
const { proxy }: any = getCurrentInstance(); // è®¿é—®å®žä¾‹ä¸Šä¸‹æ–‡ proxy同时支持开发 çº¿ä¸ŠçŽ¯å¢ƒ
const getEnumOrderTypeData = ref<any>([]);
const getEnumDockData = ref<any>([]);
const getBusinessTypeData_Index = ref<any>([]); //业务类型 create by liuwq
const getEnumPoStatusData = ref<any>([]);
const { getEnumDesc } = commonFunction();
const emits = defineEmits(['getTabelData']);
const getEnumPoDetailStatusData_Index = ref<any>([]);
const getEnumOrderTypeData_Index = ref<any>([]);
const props = defineProps({
    titleAuthor: {
        type: Number,
        required: true,
    },
    hexiao: {
        type: Number,
        default: 1,
        required: true,
    },
});
//控制订单类型 - ä¸‹æ‹‰èœå•
const titleAuthor = computed(() => props.titleAuthor);
// æ˜¯å¦æ˜¾ç¤ºæ ¸é”€æŒ‰é’®
const hexiao = computed(() => props.hexiao);
const loading = ref(false);
const getEnumStockStatusData_Index = ref<any>([]);
const getEnumLockStatusData_Index = ref<any>([]);
// form表单展开
const orderType = ref('');
const orderDoRuType = ref(); // ç”¨äºŽå¯¼å…¥çš„变量
const itemBtn = ref(1);
// æŽ§åˆ¶bom物料权限
const isShowBomBtn = ref(0);
// ç¦æ­¢ä¹‹å‰çš„æ—¥æœŸ
const disabledDate = (time: Date) => {
    return time.getTime() + 3600 * 1000 * 24 < Date.now();
};
// ä¸Šä¼ çª—口
const uploadVisible = ref(false);
//------------sap获取PO单
const outVisible2 = ref(false);
const outerForm2 = ref({
    purchaseNo: '',
});
const getSapOrderPO = (param?: number) => {
    if (param && param == 1) {
        outVisible2.value = true;
        return;
    }
    if (outerForm2.value.purchaseNo == '') {
        ElMessage.warning('请输入单号');
        return;
    }
};
//关闭出库窗口的回调
const closeOutDialog2 = () => {
    outerForm2.value.purchaseNo = '';
};
//------------sap获取PO单
// --------------------PO单列表-----------------------------------
//查询
const formModel = ref({
    WareMaterialCode: '',
    WareMaterialName: '',
    PurchaseNo: '',
    CreatedUserName: '',
    CreatedTimeBegin: '',
    CreatedTimeEnd: '',
    CreateDate: [],
    IssueTimeBegin: '',
    IssueTimeEnd: '',
    IssueDate: [],
    MaterialTypeStaus: '',
    SourceBy: '',
    WriteOffState: '',
    signStatus: '',
    status: '',
    freeOrderType: '',
    IsQueryAll: false, //是否显示全部数据
    // LoginUserID: LoginUserID, //用户id
    OrderMenuType: '', //判断是哪个菜单入库
    Page: 1,
    PageSize: 10,
    poApprovalStatus: '',
    keyCode: '',
    IsDisable: '', //是否作废
});
//入库单列表数据
let tableData = ref([]);
const tableRef = ref();
//列表的数据条数
const totalItems = ref<number>(0);
// //缓存枚举
// const enumList: any = cache.getCache('enumList');
// console.log(enumList.inEnumOrderType);
//获取PO单列表
const getTabelData = () => {
    //判断创建时间是否有选择
    if (formModel.value.CreateDate && formModel.value.CreateDate.length > 0) {
        formModel.value.CreatedTimeBegin = formModel.value.CreateDate[0];
        formModel.value.CreatedTimeEnd = ''; //addDate(formModel.value.CreateDate[1], 1); //日期查询 ç»“束时间 éœ€è¦åР䏀天
    } else {
        // æ—¥åŽ†æ¸…ç©º å†æŸ¥è¯¢bug
        if (formModel.value.CreatedTimeBegin || formModel.value.CreatedTimeEnd) {
            formModel.value.CreatedTimeBegin = '';
            formModel.value.CreatedTimeEnd = '';
        }
    }
    //判断下发时间是否有选择
    if (formModel.value.IssueDate && formModel.value.IssueDate.length > 0) {
        formModel.value.IssueTimeBegin = formModel.value.IssueDate[0];
        formModel.value.IssueTimeEnd = formModel.value.IssueDate[1];
    } else {
        // æ—¥åŽ†æ¸…ç©º å†æŸ¥è¯¢bug
        if (formModel.value.IssueTimeBegin || formModel.value.IssueTimeEnd) {
            formModel.value.IssueTimeBegin = '';
            formModel.value.IssueTimeEnd = '';
        }
    }
};
getTabelData();
//重置搜索
const resetForm = () => {
    formModel.value = {
        WareMaterialCode: '',
        WareMaterialName: '',
        PurchaseNo: '',
        CreatedUserName: '',
        CreatedTimeBegin: '',
        CreatedTimeEnd: '',
        CreateDate: [],
        IssueTimeBegin: '',
        IssueTimeEnd: '',
        IssueDate: [],
        MaterialTypeStaus: '',
        SourceBy: '',
        WriteOffState: '',
        signStatus: '',
        status: '',
        freeOrderType: '',
        IsQueryAll: false, //是否显示全部数据
        //  LoginUserID: LoginUserID, //用户id
        OrderMenuType: '', //判断是哪个菜单入库
        Page: 1,
        PageSize: 10,
        poApprovalStatus: '',
        keyCode: '',
        IsDisable: '', //是否作废
    };
    getTabelData();
};
// -----------------删除、导出操作--------------------------
//选中的行
const checkRows = ref<{ id: number }[]>([]);
// é€‰æ‹©
const handleSelectionChange = (val: any) => {
    checkRows.value = val;
};
// -------------------获取PO单下物料详情-----------------------------------
//入库单下物料详情请求
const detailForm = ref({
    detailName: '',
    packageCode: '',
    Page: 1,
    PageSize: 10,
});
// ç‰©æ–™è¯¦æƒ…抽屉
const drawerVisible = ref(false);
const drawerType = ref('drawerAll');
// 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.info5) {
        title.value = `${scope.info5}`;
    }
    drawerType.value = 'drawerAll';
    drawerVisible.value = true;
    detailForm.value.info5 = scope.info5;
    purchaseNo.value = scope.info5;
    debugger;
    //获取物料列表
    if (detailForm.value.info5 == '') {
        drawerList.value = [];
        detailCount.value = 0;
        return;
    }
    //------------------获取物料列表物料明细
    getDetail();
    //------------------获取物料列表物料明细
    getEnumStockStatusData_Index.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('StockStatusEnum')).data.result ?? [];
    getEnumLockStatusData_Index.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('LockStatusEnum')).data.result ?? [];
    //----------------物料明细
    // æ ¹æ®çŠ¶æ€è½¬ä¸­æ–‡ ä¿ç•™3位小数
    let scopetrans = JSON.parse(JSON.stringify(scope));
    // scopetrans.totalquantity = Number(scopetrans.totalquantity).toFixed(3);
    nextTick(() => {
        scopetrans.poStatus = getEnumDesc(scopetrans.poStatus, getEnumPoDetailStatusData_Index.value);
        scopetrans.businessType = getEnumDesc(scopetrans.businessType, getBusinessTypeData_Index.value);
        scopetrans.orderType = getEnumDesc(scopetrans.orderType, getEnumOrderTypeData_Index.value);
        proxy.$refs['propDetailRef'].openADialog(scopetrans, entozhExcell);
    });
};
//关闭抽屉
const handleDrawerClose = () => {
    detailForm.value = {
        detailName: '',
        packageCode: '',
        Page: 1,
        PageSize: 10,
    };
    deltailList.value = [];
    detailCount.value = 0;
    drawerList.value = [];
    detailCount.value = 0;
};
//物料详情类型
interface DetailType {
    id: number;
}
//入库单详情列表
const deltailList = ref<DetailType[]>([]);
//弹出层数据
const drawerList = ref<DetailType[]>([]);
//入库单详情列表数据条数
const detailCount = ref(0);
//弹出层标题
let title = ref('');
//获取入库单下物料详情
const getDetail = async (callback?: any) => {
    loading.value = true;
    var res = await ShortagePage(Object.assign(detailForm.value));
    if (callback == 1) {
        //编辑入口
        warehousOrderDetails.value = res.data.result?.items ?? [];
        detailCount.value = res.data.result?.total;
    } else {
        drawerList.value = res.data.result?.items ?? [];
        detailCount.value = res.data.result?.total;
    }
    loading.value = false;
};
// ----------------新增、编辑-------------------------------
//窗口类型
const dialogType = ref('add');
const dialogVisible = ref(false);
//添加编辑表单ref
const dialogRef = ref();
//添加/编辑参数
let addForm = ref({
    createdTime: '',
    updatedTime: '',
    createdUserName: '',
    createdUserId: '',
    purchaseNo: '',
    purchaserUserId: 0,
    basicExpressInfoCode: null,
    materialType: '', //5
    status: 0,
    supplierCode: '',
    supplierName: '',
    remark: '',
    deliveryType: 1,
    EstimatedDate: '',
    purchaseOrderDetails: [] as any[],
    dI_NO: '',
    sJ_NO: '',
    machineToolTypeName: '',
    machineToolNo: '',
    freeOrderType: '',
});
//rules
const formRules = {
    businessType: [{ required: true, message: '请选择业务类型!', trigger: 'change' }],
    supplierCode: [{ required: true, message: '请输入供应商!', trigger: 'blur' }],
    purchaseNo: [{ required: true, message: '请输入PO单号!', trigger: 'blur' }],
    orderTypeName: [{ required: true, message: '请输入订单类型名称!', trigger: 'blur' }],
};
//打开新增、编辑窗口
const openDialog = async (type: number, scope: any = {}) => {
    handleQueryTdp();
    getEnumOrderTypeData.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('OrderTypeEnum')).data.result ?? [];
    getBusinessTypeData_Index.value = await handleSlectDataWmsBusinessType(moveType); //下拉读取业务类型接口 create  by liuwq
    getEnumPoStatusData.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('OrderStatusEnum')).data.result ?? [];
    getEnumDockData.value = (await getAPI(SysEnumApi).apiSysEnumEnumDataListGet('DockEnum')).data.result ?? [];
    if (type == 1) {
        detailForm.value.PageSize = 10;
        dialogType.value = 'add';
    } else {
        dialogType.value = 'edit';
        detailForm.value.PageSize = 1000;
        addForm.value = { ...scope };
        console.log(addForm.value);
        detailForm.value.poId = scope.id;
        //获取物料 - å›žè°ƒå‡½æ•°æ›¿æ¢å®šæ—¶å™¨
        //------------------获取物料列表物料明细
        getDetail(1);
        //----------------物料明细
    }
    dialogVisible.value = true;
    load.value = false;
    //清除选中项
    nextTick(() => {
        if (dialogRef.value) {
            dialogRef.value.clearValidate();
        }
    });
};
//物料详情的table ref
const detailRef = ref();
const setRowKey = (row: any) => {
    return row.id + row.poLineNumber;
};
//关闭窗口
const closeDialog = () => {
    load.value = false;
    addForm.value = {
        createdTime: '',
        updatedTime: '',
        createdUserName: '',
        createdUserId: '',
        purchaseNo: '',
        purchaserUserId: 0,
        basicExpressInfoCode: null,
        materialType: '', //5
        status: 0,
        supplierCode: '',
        supplierName: '',
        remark: '',
        deliveryType: 1,
        EstimatedDate: '',
        purchaseOrderDetails: [] as any[],
        dI_NO: '',
        sJ_NO: '',
        machineToolTypeName: '',
        machineToolNo: '',
        freeOrderType: '',
    };
    warehousOrderDetails.value = [];
    checkedDetails.value = [];
    deltailList.value = [];
    detailCount.value = 0;
    detailRef.value.clearSelection();
};
//添加编辑窗口物料列表
const warehousOrderDetails = ref<any[]>([]);
//物料详情列表选中的物料
const checkedDetails = ref<any[]>([]);
//物料详情列表中勾选事件
const detailsCheckChange = (val: any) => {
    checkedDetails.value = val;
};
//删除选中的物料详情
const delCheckedDetails = () => {
    ElMessageBox.confirm('是否确认删除?', '提示', {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        type: 'warning',
    })
        .then(() => {
            let arr = [];
            if (checkedDetails.value[0].diRelationID) {
                checkedDetails.value.forEach((item) => {
                    console.log(item);
                    let index = warehousOrderDetails.value.findIndex((detail) => detail.code == item.code && detail.diRelationID == item.diRelationID);
                    if (index > -1) {
                        warehousOrderDetails.value.splice(index, 1);
                    }
                });
            } else {
                checkedDetails.value.forEach((item) => {
                    let index = warehousOrderDetails.value.findIndex((detail) => detail.code == item.code && detail.poLineNumber == item.poLineNumber);
                    warehousOrderDetails.value.splice(index, 1);
                });
            }
            arr = warehousOrderDetails.value;
            warehousOrderDetails.value = [];
            //bug ç›¸åŒç‰©æ–™ ä¸åŒBom
            nextTick(() => {
                warehousOrderDetails.value = arr;
                checkedDetails.value = [];
                detailRef.value.clearSelection();
            });
        })
        .catch(() => ElMessage.info('已取消删除'));
};
const load = ref(false);
//编辑、添加提交
const confirm = () => {
    dialogRef.value.validate(async (vali: any) => {
        if (vali) {
            console.log('确认');
            if (warehousOrderDetails.value.length < 0) {
                ElMessage.warning('请选择物料');
                return;
            }
            let idx = warehousOrderDetails.value.findIndex((v) => v.poLineNumber == '' || v.poLineNumber == undefined);
            if (idx > -1) {
                ElMessage.warning('请输入行号');
                return;
            }
            let isNext = '';
            warehousOrderDetails.value.forEach((item) => {
                const arr: any = warehousOrderDetails.value.filter((detail) => detail.poLineNumber == item.poLineNumber);
                if (arr.length > 1) {
                    isNext = `行号:${arr[0].poLineNumber}不能相同`;
                    return;
                }
            });
            if (isNext != '') {
                ElMessage.warning(isNext);
                return;
            }
            let idx2 = warehousOrderDetails.value.findIndex((v) => v.quantity == '' || v.quantity == undefined || v.quantity <= 0);
            if (idx2 > -1) {
                ElMessage.warning('数量不合规范!');
                return;
            }
            addForm.value.purchaseOrderDetails = [];
            warehousOrderDetails.value.forEach((item) => {
                const obj = {
                    poId: item.poId || 0,
                    materialCode: item.materialCode,
                    materialName: item.materialName,
                    id: item.id || '',
                    quantity: item.quantity,
                    barNo: item.barNo,
                    remark: addForm.value.remark,
                    poLineNumber: item.poLineNumber,
                    materialType: item.deliveryType,
                    clientCode: item.diCustomCode || '',
                    clientChinaName: item.diCustomChinaName || '',
                    plannedStartTime: item.plannedStartTime,
                    plannedEndTime: item.plannedEndTime,
                    projectNo: item.projectNo,
                    erpCode: item.erpCode,
                    supplierBatch: item.supplierBatch,
                    unit: item.unit,
                };
                addForm.value.purchaseOrderDetails.push(obj);
            });
            load.value = true;
            //添加
            if (dialogType.value == 'add') {
                load.value = true;
                let res = await addWmsOrderPurchase(addForm.value);
                if (res.data && res.data.code == 200) {
                    ElMessage.success('添加成功');
                    dialogVisible.value = false;
                    emits('getTabelData');
                }
                load.value = false;
            } else {
                load.value = true;
                let res = await updateWmsOrderPurchase(addForm.value);
                if (res.data && res.data.code == 200) {
                    ElMessage.success('编辑成功');
                    dialogVisible.value = false;
                    emits('getTabelData');
                }
                load.value = false;
            }
        } else {
            ElMessage.warning('表单验证失败');
        }
    });
};
// -----------------添加物料操作-------------------------
//物料基础数据窗口
const addMaterialVisible = ref(false);
//物料基础数据列表
const materialList = ref([]);
//物料基础数据条数
const materialTotal = ref(0);
//物料基础数据form
const materialForm = ref({
    MaterialTypeId: '',
    Code: '',
    MaterialCode: '',
    // MaterialType: 1,
    Page: 1,
    PageSize: 10,
});
//获取物料基础列表
const getMaterialList = async () => {
    loading.value = true;
    // var res = await pageWmsMaterial(Object.assign(queryParams.value, tableParams.value));
    var res = await pageWmsMaterial(Object.assign(materialForm.value));
    materialList.value = res.data.result?.items ?? [];
    //tableParams.value.total = res.data.result?.total;
    materialTotal.value = res.data.result?.total;
    loading.value = false;
};
//重置物料
const resetMaterialForm = () => {
    materialForm.value = {
        MaterialTypeId: '',
        Code: '',
        MaterialCode: '',
        Page: 1,
        // MaterialType: 1,
        PageSize: 10,
    };
    getMaterialList();
};
//选中的基础物料数据
const checkedMaterial = ref<any[]>([]);
//物料基础数据勾选
const materialSelectionChange = (val: any) => {
    checkedMaterial.value = val;
};
//打开新增物料窗口
const addMaterialDialog = () => {
    // if ( addForm.value.freeOrderType && isShowBomBtn.value ) {
    //   ElMessage.warning("免费件类型是PR2,只能新增DI维护的物料!");
    //   return;
    // }
    getMaterialList();
    addMaterialVisible.value = true;
};
//基础物料table的ref对象
const materialRef = ref();
//确认添加材料
const confirmAddMaterial = () => {
    //物料列表没数据,直接添加
    if (warehousOrderDetails.value.length == 0) {
        // è‡ªåŠ¨ç»™è¡Œå·å¤å€¼
        checkedMaterial.value.forEach((item, index) => {
            item.unit = item.poUnit;
            if (!item.poLineNumber) {
                item.poLineNumber = index + 1 + warehousOrderDetails.value.length;
            }
        });
        warehousOrderDetails.value.push(...checkedMaterial.value);
    } else {
        for (let i = 0; i < checkedMaterial.value.length; i++) {
            let idx = warehousOrderDetails.value.findIndex(
                (item: { poLineNumber: any; code: any }) => item.code == checkedMaterial.value[i].code && item.poLineNumber == checkedMaterial.value[i].poLineNumber
            );
            if (idx > -1) {
                return ElMessage.warning(`物料编号${checkedMaterial.value[i].code},行号:${checkedMaterial.value[i].poLineNumber || ''}在物料列表中已存在,请去除勾选`);
            }
        }
        // è‡ªåŠ¨ç»™è¡Œå·å¤å€¼
        checkedMaterial.value.forEach((item, index) => {
            item.unit = item.poUnit;
            if (!item.poLineNumber) {
                item.poLineNumber = index + 1 + warehousOrderDetails.value.length;
            }
        });
        warehousOrderDetails.value.push(...checkedMaterial.value);
    }
    addMaterialVisible.value = false;
};
//关闭新增物料窗口
const closeMaterialDialog = () => {
    materialForm.value = {
        MaterialTypeId: '',
        Code: '',
        Page: 1,
        // MaterialType: 1,
        PageSize: 10,
    };
    materialList.value = [];
    checkedMaterial.value = [];
    materialRef.value.clearSelection();
};
// é¡µé¢åŠ è½½æ—¶
onMounted(async () => {});
// æ‰“印
let itemSubTitle = ref<any[]>([]);
const handleHtmlPrint = () => {
    proxy.$refs['printTableRef'].printHd('缺件清单', {}, drawerList.value); //deltailList
    // proxy.$refs['printTableRef'].printHd('缺件清单', itemSubTitle.value, drawerList.value); //deltailList
};
// æš´éœ²æ–¹æ³•
defineExpose({ openDialog, openDrawer });
</script>
<style lang="less" scoped>
.detailBoxWrap {
    margin: 10px;
}
.msi-form {
    margin-top: 10px;
}
.msi-form {
    margin-bottom: 10px;
}
.slot_title {
    display: flex;
    align-items: center;
    // margin-left: 20px;
    .title_orderNo {
        font-size: 18px;
        color: #f18201;
        font-weight: bold;
        margin-right: 5px;
    }
}
</style>
LA24030_LuLiPackageLine_Web/src/views/main/WmsOrder/shortageList/index.vue
@@ -26,34 +26,6 @@
                        </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.materialName" 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-select clearable="" v-model="queryParamsWmsStockQuan.stockStatus" placeholder="请选择库存状态">
                <el-option v-for="(item,index) in getEnumStockStatusData_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="供应商批次">
              <el-input v-model="queryParamsWmsStockQuan.supplierBatch" 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.batch" clearable="" placeholder="请输入批次"/>
            </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">
@@ -64,7 +36,7 @@
                                <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="handleHtmlPrint" 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>
@@ -86,13 +58,27 @@
                @selection-change="handleSelectionChange"
                border=""
            >
                <el-table-column align="center" width="60" type="selection" />
                <!-- <el-table-column align="center" width="60" type="selection" /> -->
                <el-table-column type="index" label="序号" width="55" align="center" />
                <el-table-column label="生产单号" prop="packageCode" width="150" align="left" show-overflow-tooltip>
                    <template #default="scope">
                        <span class="under_line" @click="openDrawer(1, scope.row)">
                            {{ scope.row.info5 }}
                        </span>
                    </template>
                </el-table-column>
                <!-- <el-table-column prop="info5" label="生产单号" show-overflow-tooltip="" /> -->
                <el-table-column prop="shortageCount" 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="upi" label="部件条码" show-overflow-tooltip="" />
                <el-table-column prop="detailName" label="部件名称" show-overflow-tooltip="" />
                <el-table-column prop="detailName" 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="" /> -->
@@ -143,8 +129,11 @@
            <editDialogWmsStockQuan ref="editDialogRefWmsStockQuan" :title="editWmsStockQuanTitle" @reloadTable="handleQueryWmsStockQuan" />
        </el-card>
        <!-- æ‰€æœ‰å¼¹æ¡† ï¼šæ–°å¢ž ç¼–辑 è¯¦æƒ… -->
        <open-allprop titleAuthor="1" hexiao="0" ref="propALlProp"></open-allprop>
        <!-- æ‰“印 -->
        <print-table-ckd ref="printTableRef"></print-table-ckd>
    </div>
</template>
@@ -155,14 +144,16 @@
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 printJS from 'print-js';
import printDialogWmsStockQuan from '/@/views/system/print/component/hiprint/preview.vue';
import { ShortagePage, deleteWmsStockQuan, importExcelWmsStockQuan, downloadExcelTemplateWmsStockQuan } from '/@/api/main/ReportCenter/wmsStockQuan';
import { ShortagePage, deleteWmsStockQuan, importExcelWmsStockQuan, downloadExcelTemplateWmsStockQuan, ShortagePageGroupByInfo5 } 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 printTableCkd from '/@/components/printTableCkd.vue';
import OpenAllprop from './component/openAllprop.vue';
const { proxy }: any = getCurrentInstance(); // è®¿é—®å®žä¾‹ä¸Šä¸‹æ–‡ proxy同时支持开发 çº¿ä¸ŠçŽ¯å¢ƒ
import printJs from 'print-js';
@@ -198,7 +189,7 @@
const handleQueryWmsStockQuan = async () => {
    loadingWmsStockQuan.value = true;
    disabled_btnWmsStockQuan.value = true;
    var res = await ShortagePage(Object.assign(queryParamsWmsStockQuan.value, tableParamsWmsStockQuan.value));
    var res = await ShortagePageGroupByInfo5(Object.assign(queryParamsWmsStockQuan.value, tableParamsWmsStockQuan.value));
    if (res.data.type == 'success') {
        tableDataWmsStockQuan.value = res.data.result?.items ?? [];
        tableParamsWmsStockQuan.value.total = res.data.result?.total;
@@ -454,16 +445,16 @@
// æ‰“印
let itemSubTitle = ref<any[]>([]);
const handleHtmlPrint = () => {
    proxy.$refs['printTableRef'].printHd('缺包清单', itemSubTitle.value, checkRows.value); //deltailList
const handleHtmlPrint = (dataList: any) => {
    debugger;
    proxy.$refs['printTableRef'].printHd('缺包清单', itemSubTitle.value, dataList); //deltailList
    // 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"/>',
// })
// ---------------详情-----------------------
const openDrawer = (type: number, item?: any) => {
    proxy.$refs['propALlProp'].openDrawer(type, item, {});
};
</script>
<style scoped>
:deep(.el-input),
@@ -471,4 +462,10 @@
:deep(.el-input-number) {
    width: 100%;
}
.under_line {
    color: #f18201;
    text-decoration: underline;
    cursor: pointer;
}
</style>
LA24030_LuLiPackageLine_Web/stats.html
ÎļþÌ«´ó
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsStockQuan/WmsStockQuan/Dto/WmsStockQuanOutput.cs
@@ -232,4 +232,8 @@
    /// éƒ¨ä»¶åç§°
    /// </summary>
    public string DetailName { get; set; }
    public string? Info5 { get; set; }
    public string? Info16 { get; set; }
}
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsStockQuan/WmsStockQuan/WmsStockQuanService.cs
@@ -371,6 +371,52 @@
        };
    }
    /// <summary>
    /// åˆ†é¡µæŸ¥è¯¢ç¼ºæ–™æ¸…单 ä¸é½åŒ… -按照生产单号分组
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "ShortagePageGroupByInfo5")]
    [Description("WmsStockQuan/ShortagePageGroupByInfo5")]
    public async Task<SqlSugarPagedList<WmsShortageListOutput>> ShortagePageGroupByInfo5(KittingListInput input)
    {
        var listRes = await GetShortageListCore(input);
        // æŒ‰ç…§å­—段 Info5 åˆ†ç»„
        var groupedList = listRes
            .GroupBy(x => x.Info5) // æ ¹æ® Info5 å­—段进行分组
            .Select(g => new WmsShortageListOutput // å‡è®¾æ‚¨å°†åˆ†ç»„后的结果转换为 WmsShortageListOutput
            {
                Info5 = g.Key,
                ShortageCount = g.Count(),
            })
            .ToList();
        // è¿›è¡Œåˆ†é¡µå¤„理
        var totalCount = groupedList.Count; // èŽ·å–æ€»æ•°
        var pagedList = groupedList
            //.OrderBy(x => x.Id) // æ ¹æ®éœ€è¦è¿›è¡ŒæŽ’序
            .Skip((input.Page - 1) * input.PageSize)
            .Take(input.PageSize)
            .ToList();
        // æž„造并返回分页结果
        return new SqlSugarPagedList<WmsShortageListOutput>
        {
            Page = input.Page,
            PageSize = input.PageSize,
            Total = totalCount,
            TotalPages = (int)Math.Ceiling((double)totalCount / input.PageSize),
            Items = pagedList,
            HasPrevPage = input.Page > 1,
            HasNextPage = input.Page < ((int)Math.Ceiling((double)totalCount / input.PageSize))
        };
    }
    /// <summary>
    /// ç¼ºåŒ…数据
    /// </summary>
@@ -400,7 +446,9 @@
                    PackageCode = item.PackageCode,
                    DetailName = item.DetailName,
                    OrderId = item.OrderId,
                    PlanNo = item.PlanNo
                    PlanNo = item.PlanNo,
                    Info5= item.Info5,
                    Info16 = item.Info16,
                });
            }
        }