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]}} {{Name[1]}} {{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 }; } }