文章目录

  • 前言
  • 一、收获管理和发货管理
    • 1.收获管理
      • 1.1 页面代码
      • 1.2 接口代码
    • 2.发货管理
      • 1.1 页面代码
      • 1.2 接口代码

前言

WMS智能仓储收货管理和发货管理是非常重要的两个功能

  • 收货管理:收货管理主要功能是接收货物,确定货物的种类数量和质量,并记录收货信息,还可以直接将收货信息传输给仓库管理系统。
  • 发货管理:发货管理的作用是实现仓库的发货功能,根据客户的要求,按照计划,按照正确的数量和质量,及时将货物发出去。

一、收获管理和发货管理

1.收获管理

WMS智能仓储收货管理的流程步骤包括:

1.到货通知:收货管理员在WMS系统中进行到货通知登记,输入货物的基本信息;

2.待到货:到货通知新建完回同时生成待到货单,单据状态就是已发车还在路上;

3.待卸货:收货管理员检查收货的货物,确认货物的数量和情况;

4.待分拣:收货管理员需要严格按照收货质量标准进行管理,以确保货物的质量,并进行分类;

5.待上架:收货管理员根据系统指令将收货的货物进行入库;

6.收获明细:入库完成生成具体的入库明细单,形成实质单据;

1.1 页面代码

<!-- Warehouse Setting -->
<template><div class="container"><div><v-tabs v-model="data.activeTab" stacked @update:model-value="method.changeTabs"><v-tab v-for="(item, index) of tabsConfig" :key="index" :value="item.value"><v-icon>{{ item.icon }}</v-icon><p class="tabItemTitle">{{ item.tabName }}</p></v-tab></v-tabs><!-- Main Content --><v-card class="mt-5"><v-card-text><v-window v-model="data.activeTab"><v-window-item value="tabNotice"><tabNotice ref="tabNoticeRef" /></v-window-item><v-window-item value="tabToDoArrival"><tabToDoArrival ref="tabToDoArrivalRef" /></v-window-item><v-window-item value="tabToDoUnload"><tabToDoUnload ref="tabToDoUnloadRef" /></v-window-item><v-window-item value="tabToDoSorting"><tabToDoSorting ref="tabToDoSortingRef" /></v-window-item><v-window-item value="tabToDoGrounding"><tabToDoGrounding ref="tabToDoGroundingRef" /></v-window-item><v-window-item value="tabReceiptDetails"><tabReceiptDetails ref="tabReceiptDetailsRef" /></v-window-item></v-window></v-card-text></v-card></div></div>
</template><script lang="ts" setup>
import { ref, reactive, onMounted, watch, nextTick } from 'vue'
import i18n from '@/languages/i18n'
import tabNotice from './tabNotice.vue'
import tabToDoArrival from './tabToDoArrival.vue'
import tabToDoUnload from './tabToDoUnload.vue'
import tabToDoSorting from './tabToDoSorting.vue'
import tabToDoGrounding from './tabToDoGrounding.vue'
import tabReceiptDetails from './tabReceiptDetails.vue'const tabNoticeRef = ref()
const tabToDoArrivalRef = ref()
const tabToDoUnloadRef = ref()
const tabToDoSortingRef = ref()
const tabToDoGroundingRef = ref()
const tabReceiptDetailsRef = ref()const tabsConfig = [{value: 'tabNotice',icon: 'mdi-checkbox-blank-badge',tabName: i18n.global.t('wms.stockAsn.tabNotice')},{value: 'tabToDoArrival',icon: 'mdi-truck-cargo-container',tabName: i18n.global.t('wms.stockAsn.tabToDoArrival')},{value: 'tabToDoUnload',icon: 'mdi-truck-outline',tabName: i18n.global.t('wms.stockAsn.tabToDoUnload')},{value: 'tabToDoSorting',icon: 'mdi-dolly',tabName: i18n.global.t('wms.stockAsn.tabToDoSorting')},{value: 'tabToDoGrounding',icon: 'mdi-grid',tabName: i18n.global.t('wms.stockAsn.tabToDoGrounding')},{value: 'tabReceiptDetails',icon: 'mdi-file-cabinet',tabName: i18n.global.t('wms.stockAsn.tabReceiptDetails')}
]const data = reactive({activeTab: '',isLoadNotice: false,isLoadToDoArrival: false,isLoadToDoUnload: false,isLoadToDoSorting: false,isLoadToDoGrounding: false,isLoadReceiptDetails: false
})const method = reactive({changeTabs: (e: any): void => {nextTick(() => {switch (e) {case 'tabNotice':// Tips:Must be write the nextTick so that can get DOM!!if (tabNoticeRef?.value?.getStockAsnList) {tabNoticeRef.value.getStockAsnList()}breakcase 'tabToDoArrival':if (tabToDoArrivalRef?.value?.getStockAsnList) {tabToDoArrivalRef.value.getStockAsnList()}breakcase 'tabToDoUnload':if (tabToDoUnloadRef?.value?.getStockAsnList) {tabToDoUnloadRef.value.getStockAsnList()}breakcase 'tabToDoSorting':if (tabToDoSortingRef?.value?.getStockAsnList) {tabToDoSortingRef.value.getStockAsnList()}breakcase 'tabToDoGrounding':if (tabToDoGroundingRef?.value?.getStockAsnList) {tabToDoGroundingRef.value.getStockAsnList()}breakcase 'tabReceiptDetails':if (tabReceiptDetailsRef?.value?.getStockAsnList) {tabReceiptDetailsRef.value.getStockAsnList()}break}})}
})onMounted(() => {})
</script><style scoped lang="less">
.operateArea {width: 100%;min-width: 760px;display: flex;align-items: center;border-radius: 10px;padding: 0 10px;
}.col {display: flex;align-items: center;
}
</style>

1.2 接口代码

    [Route("asn")][ApiController][ApiExplorerSettings(GroupName = "WMS")]public class AsnController : BaseController{#region Args/// <summary>/// asn Service/// </summary>private readonly IAsnService _asnService;/// <summary>/// Localizer Service/// </summary>private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;#endregion#region constructor/// <summary>/// constructor/// </summary>/// <param name="asnService">asn Service</param>/// <param name="stringLocalizer">Localizer</param>public AsnController(IAsnService asnService, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer){this._asnService = asnService;this._stringLocalizer = stringLocalizer;}#endregion#region Api/// <summary>/// page search, sqlTitle input asn_status:0 ~ 4/// </summary>/// <param name="pageSearch">args</param>/// <returns></returns>[HttpPost("list")]public async Task<ResultModel<PageData<AsnViewModel>>> PageAsync(PageSearch pageSearch){var (data, totals) = await _asnService.PageAsync(pageSearch, CurrentUser);return ResultModel<PageData<AsnViewModel>>.Success(new PageData<AsnViewModel>{Rows = data,Totals = totals});}/// <summary>/// get a record by id/// </summary>/// <returns>args</returns>[HttpGet]public async Task<ResultModel<AsnViewModel>> GetAsync(int id){var data = await _asnService.GetAsync(id);if (data != null && data.id > 0){return ResultModel<AsnViewModel>.Success(data);}else{return ResultModel<AsnViewModel>.Error(_stringLocalizer["not_exists_entity"]);}}/// <summary>/// add a new record/// </summary>/// <param name="viewModel">args</param>/// <returns></returns>[HttpPost]public async Task<ResultModel<int>> AddAsync(AsnViewModel viewModel){var (id, msg) = await _asnService.AddAsync(viewModel, CurrentUser);if (id > 0){return ResultModel<int>.Success(id);}else{return ResultModel<int>.Error(msg);}}/// <summary>/// update a record/// </summary>/// <param name="viewModel">args</param>/// <returns></returns>[HttpPut]public async Task<ResultModel<bool>> UpdateAsync(AsnViewModel viewModel){var (flag, msg) = await _asnService.UpdateAsync(viewModel);if (flag){return ResultModel<bool>.Success(flag);}else{return ResultModel<bool>.Error(msg, 400, flag);}}/// <summary>/// delete a record/// </summary>/// <param name="id">id</param>/// <returns></returns>[HttpDelete]public async Task<ResultModel<string>> DeleteAsync(int id){var (flag, msg) = await _asnService.DeleteAsync(id);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// Bulk modify Goodsowner/// </summary>/// <param name="viewModel">args</param>/// <returns></returns>[HttpPut("bulk-modify-goods-owner")]public async Task<ResultModel<bool>> BulkModifyGoodsownerAsync(AsnBulkModifyGoodsOwnerViewModel viewModel){var (flag, msg) = await _asnService.BulkModifyGoodsownerAsync(viewModel);if (flag){return ResultModel<bool>.Success(flag);}else{return ResultModel<bool>.Error(msg, 400, flag);}}#endregion#region Flow Api/// <summary>/// Confirm Delivery/// change the asn_status from 0 to 1/// </summary>/// <param name="id">id</param>/// <returns></returns>[HttpPut("confirm/{id}")]public async Task<ResultModel<string>> ConfirmAsync(int id){var (flag, msg) = await _asnService.ConfirmAsync(id);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// Cancel confirm, change asn_status 1 to 0/// </summary>/// <param name="id">id</param>/// <returns></returns>[HttpPut("confirm-cancel/{id}")]public async Task<ResultModel<string>> ConfirmCancelAsync(int id){var (flag, msg) = await _asnService.ConfirmCancelAsync(id);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// Unload/// change the asn_status from 1 to 2/// </summary>/// <param name="id">id</param>/// <returns></returns>[HttpPut("unload/{id}")]public async Task<ResultModel<string>> UnloadAsync(int id){var (flag, msg) = await _asnService.UnloadAsync(id);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// Cancel unload/// change the asn_status from 2 to 1/// </summary>/// <param name="id">id</param>/// <returns></returns>[HttpPut("unload-cancel/{id}")]public async Task<ResultModel<string>> UnloadCancelAsync(int id){var (flag, msg) = await _asnService.UnloadCancelAsync(id);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// sorting, add a new asnsort record and update asn sorted_qty/// </summary>/// <param name="viewModel">args</param>/// <returns></returns>[HttpPut("sorting")]public async Task<ResultModel<string>> SortingAsync(AsnsortInputViewModel viewModel){var (flag, msg) = await _asnService.SortingAsync(viewModel, CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// Sorted/// change the asn_status from 2 to 3/// </summary>/// <param name="id">id</param>/// <returns></returns>[HttpPut("sorted/{id}")]public async Task<ResultModel<string>> SortedAsync(int id){var (flag, msg) = await _asnService.SortedAsync(id);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// Cancel sorted/// change the asn_status from 3 to 2/// </summary>/// <param name="id">id</param>/// <returns></returns>[HttpPut("sorted-cancel/{id}")]public async Task<ResultModel<string>> SortedCancelAsync(int id){var (flag, msg) = await _asnService.SortedCancelAsync(id);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// PutAway/// </summary>/// <param name="viewModel">args</param>/// <returns></returns>[HttpPut("putaway")]public async Task<ResultModel<string>> PutAwayAsync(AsnPutAwayInputViewModel viewModel){var (flag, msg) = await _asnService.PutAwayAsync(viewModel, CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}#endregion}

2.发货管理

智能仓储发货管理的流程步骤包括:
1.发货订单:对发货的货物进行订单生成;
2.预发货:发货订单新建完成就会形成预发货状态,只有确定发货才会进入到已发货状态;
3.新发货:已经确定发货;
4.待拣货:已经确定发货的货物进行仓库的取出;
5.已拣货:货物已经取出;
6.待打包:货物已经取出进行打包;
7.已打包:货物已经打包完成;
8.待称重:已打包货物进行称重;
9.已称重:货物称重完成;
10.待出库:货物全部处理和打包完成,需要进行待出库;
11.已出库:货物出库完成;
12.已签收:联系物流公司,将货物发送出去;跟踪货物,确保货物到达客户手中。

1.1 页面代码

<template><div class="operateArea"><v-row no-gutters><!-- Operate Btn --><v-col cols="3" class="col"><tooltip-btn icon="mdi-refresh" :tooltip-text="$t('system.page.refresh')" @click="method.refresh"></tooltip-btn><tooltip-btn icon="mdi-export-variant" :tooltip-text="$t('system.page.export')" @click="method.exportTable"> </tooltip-btn><tooltip-btn icon="mdi-car-cog" :tooltip-text="$t('wms.deliveryManagement.setFreight')" @click="method.setFreight"> </tooltip-btn><tooltip-btn icon="mdi-email-check" :tooltip-text="$t('wms.deliveryManagement.signIn')" @click="method.handleSignIn"></tooltip-btn></v-col><!-- Search Input --><v-col cols="9"><v-row no-gutters @keyup.enter="method.sureSearch"><v-col cols="4"><v-text-fieldv-model="data.searchForm.dispatch_no"clearablehide-detailsdensity="comfortable"class="searchInput ml-5 mt-1":label="$t('wms.deliveryManagement.dispatch_no')"variant="solo"></v-text-field></v-col><v-col cols="4"><v-text-fieldv-model="data.searchForm.customer_name"clearablehide-detailsdensity="comfortable"class="searchInput ml-5 mt-1":label="$t('wms.deliveryManagement.customer_name')"variant="solo"></v-text-field></v-col><v-col cols="4"><v-text-fieldv-model="data.searchForm.spu_name"clearablehide-detailsdensity="comfortable"class="searchInput ml-5 mt-1":label="$t('wms.deliveryManagement.spu_name')"variant="solo"></v-text-field></v-col></v-row></v-col></v-row></div><!-- Table --><divclass="mt-5":style="{height: cardHeight}"><vxe-table ref="xTable" :column-config="{ minWidth: '100px' }" :data="data.tableData" :height="tableHeight" align="center"><template #empty>{{ i18n.global.t('system.page.noData') }}</template><vxe-column type="seq" width="60"></vxe-column><vxe-column type="checkbox" width="50"></vxe-column><vxe-column field="dispatch_no" :title="$t('wms.deliveryManagement.dispatch_no')"></vxe-column><vxe-column field="spu_code" :title="$t('wms.deliveryManagement.spu_code')"></vxe-column><vxe-column field="spu_description" :title="$t('wms.deliveryManagement.spu_description')"></vxe-column><vxe-column field="spu_name" :title="$t('wms.deliveryManagement.spu_name')"></vxe-column><vxe-column field="sku_code" :title="$t('wms.deliveryManagement.sku_code')"></vxe-column><vxe-column field="bar_code" :title="$t('wms.deliveryManagement.bar_code')"></vxe-column><vxe-column field="qty" :title="$t('wms.deliveryManagement.order_qty')"></vxe-column><vxe-column field="weight" :title="$t('wms.deliveryManagement.detailWeight')"><template #default="{ row }"><span>{{ `${row.weight} ${GetUnit('weight', row.weight_unit)}` }}</span></template></vxe-column><vxe-column field="volume" :title="$t('wms.deliveryManagement.detailVolume')"><template #default="{ row }"><span>{{ `${row.volume} ${GetUnit('volume', row.volume_unit)}` }}</span></template></vxe-column><vxe-column field="package_no" :title="$t('wms.deliveryManagement.package_no')"></vxe-column><vxe-column field="weighing_weight" :title="$t('wms.deliveryManagement.weighing_weight')"><template #default="{ row }"><span>{{ `${row.weighing_weight} ${GetUnit('weight', row.weight_unit)}` }}</span></template></vxe-column><vxe-column field="weighing_no" :title="$t('wms.deliveryManagement.weighing_no')"></vxe-column><vxe-column field="customer_name" :title="$t('wms.deliveryManagement.customer_name')"></vxe-column><vxe-column field="creator" :title="$t('wms.deliveryManagement.creator')"></vxe-column><vxe-column field="create_time" width="170px" :title="$t('wms.deliveryManagement.create_time')"></vxe-column><vxe-column field="operate" :title="$t('system.page.operate')" width="140" :resizable="false" show-overflow><template #default="{ row }"><div style="width: 100%; display: flex; justify-content: center"><tooltip-btn :flat="true" icon="mdi-eye-outline" :tooltip-text="$t('system.page.view')" @click="method.viewRow(row)"></tooltip-btn><!-- <tooltip-btn:flat="true"icon="mdi-email-check":tooltip-text="$t('wms.deliveryManagement.signIn')"@click="method.handleSignIn(row)"></tooltip-btn> --></div></template></vxe-column></vxe-table><custom-pager:current-page="data.tablePage.pageIndex":page-size="data.tablePage.pageSize"perfect:total="data.tablePage.total":page-sizes="PAGE_SIZE":layouts="PAGE_LAYOUT"@page-change="method.handlePageChange"></custom-pager><!-- <ToBeSignInConfirm:show-dialog="data.showDialog":dialog-default-qty="data.dialogDefaultQty"@close="method.dialogClose"@submit="method.dialogSubmit"/> --><SignInConfirm:dialog-title="$t('wms.deliveryManagement.signIn')":show-dialog="data.showDialog":is-weight="false":is-sign-in="true":data-list="data.confirmList"@close="method.dialogClose"@submit="method.dialogSubmit"/><SearchDeliveredDetail :id="data.showDeliveredDetailID" :show-dialog="data.showDeliveredDetail" @close="method.closeDeliveredDetail" /><ToBeFreightfee :show-dialog="data.showSetFreight" @close="method.freightfeeClose" @submit="method.freightfeeSubmit" /></div>
</template><script lang="ts" setup>
import { computed, ref, reactive, watch } from 'vue'
import { VxePagerEvents } from 'vxe-table'
import { computedCardHeight, computedTableHeight } from '@/constant/style'
import { DeliveryManagementDetailVO, SetCarrierVO, ConfirmItem } from '@/types/DeliveryManagement/DeliveryManagement'
import { PAGE_SIZE, PAGE_LAYOUT, DEFAULT_PAGE_SIZE } from '@/constant/vxeTable'
import { hookComponent } from '@/components/system'
import { getDelivery, handleSignIn, setCarrier } from '@/api/wms/deliveryManagement'
import tooltipBtn from '@/components/tooltip-btn.vue'
import i18n from '@/languages/i18n'
// import ToBeSignInConfirm from './to-be-sign-in-confirm.vue'
import SignInConfirm from './package-confirm.vue'
import { GetUnit } from '@/constant/commodityManagement'
import ToBeFreightfee from './to-be-freightfee.vue'
import customPager from '@/components/custom-pager.vue'
import { setSearchObject } from '@/utils/common'
import { TablePage } from '@/types/System/Form'
import SearchDeliveredDetail from './search-delivered-detail.vue'
import { exportData } from '@/utils/exportTable'
import { DEBOUNCE_TIME } from '@/constant/system'const xTable = ref()const data = reactive({showDeliveredDetailID: 0,showDeliveredDetail: false,showSetFreight: false,showDialog: false,dialogDefaultQty: 0,packageRow: ref<DeliveryManagementDetailVO>(),searchForm: {dispatch_no: '',customer_name: '',spu_name: ''},timer: ref<any>(null),activeTab: null,tableData: ref<DeliveryManagementDetailVO[]>([]),tablePage: ref<TablePage>({total: 0,pageIndex: 1,pageSize: DEFAULT_PAGE_SIZE,searchObjects: []}),confirmList: ref<ConfirmItem[]>([])
})const method = reactive({closeDeliveredDetail: () => {data.showDeliveredDetail = false},viewRow: (row: DeliveryManagementDetailVO) => {data.showDeliveredDetailID = row.iddata.showDeliveredDetail = true},setFreight: () => {const $table = xTable.valueif ($table.getCheckboxRecords().length > 0) {data.showSetFreight = true} else {hookComponent.$message({type: 'error',content: `${ i18n.global.t('base.userManagement.checkboxIsNull') }`})}},freightfeeClose: () => {data.showSetFreight = false},freightfeeSubmit: async (form: { carrier: string; freightfee_id: number; waybill_no: string }) => {const reqList: SetCarrierVO[] = []const $table = xTable.valuefor (const item of $table.getCheckboxRecords()) {reqList.push({id: item.id,dispatch_no: item.dispatch_no,dispatch_status: item.dispatch_status,freightfee_id: form.freightfee_id,carrier: form.carrier,waybill_no: form.waybill_no})}const { data: res } = await setCarrier(reqList)if (!res.isSuccess) {hookComponent.$message({type: 'error',content: res.errorMessage})return}hookComponent.$message({type: 'success',content: res.data})method.freightfeeClose()method.refresh()},dialogClose: () => {data.showDialog = false},// Callback after entering packaging valuedialogSubmit: async (list: ConfirmItem[]) => {const SingInList = list.map((item) => ({id: item.id,dispatch_no: item.dispatch_no,dispatch_status: item.dispatch_status,damage_qty: item.qty}))const { data: res } = await handleSignIn(SingInList)if (!res.isSuccess) {hookComponent.$message({type: 'error',content: res.errorMessage})return}hookComponent.$message({type: 'success',content: res.data})method.dialogClose()method.refresh()// if (data.packageRow) {//   const { data: res } = await handleSignIn([//     {//       id: data.packageRow.id,//       dispatch_no: data.packageRow.dispatch_no,//       dispatch_status: data.packageRow.dispatch_status,//       damage_qty: qty//     }//   ])//   if (!res.isSuccess) {//     hookComponent.$message({//       type: 'error',//       content: res.errorMessage//     })//     return//   }//   hookComponent.$message({//     type: 'success',//     content: res.data//   })//   method.dialogClose()//   method.refresh()// }},handleSignIn: async () => {const $table = xTable.valueconst checkTableList = $table.getCheckboxRecords()const confirmList: ConfirmItem[] = []if (checkTableList.length > 0) {// Processing the data required by the windowfor (const item of checkTableList) {confirmList.push({id: item.id,spu_name: item.spu_name,spu_code: item.spu_code,sku_code: item.sku_code,maxQty: item.picked_qty,qty: 0,dispatch_no: item.dispatch_no,dispatch_status: item.dispatch_status})}data.confirmList = confirmListdata.showDialog = true} else {hookComponent.$message({type: 'error',content: `${ i18n.global.t('base.userManagement.checkboxIsNull') }`})}// data.packageRow = row// data.dialogDefaultQty = row.picked_qty ? row.picked_qty : 0// data.showDialog = true},// Refresh datarefresh: () => {method.getDelivery()},getDelivery: async () => {const { data: res } = await getDelivery(data.tablePage)if (!res.isSuccess) {hookComponent.$message({type: 'error',content: res.errorMessage})return}data.tableData = res.data.rowsdata.tablePage.total = res.data.totals},handlePageChange: ref<VxePagerEvents.PageChange>(({ currentPage, pageSize }) => {data.tablePage.pageIndex = currentPagedata.tablePage.pageSize = pageSizemethod.getDelivery()}),exportTable: () => {const $table = xTable.valueexportData({table: $table,filename: i18n.global.t('wms.deliveryManagement.outOfWarehouse'),columnFilterMethod({ column }: any) {return !['checkbox'].includes(column?.type) && !['operate'].includes(column?.field)}})},sureSearch: () => {data.tablePage.searchObjects = setSearchObject(data.searchForm)method.getDelivery()}
})const cardHeight = computed(() => computedCardHeight({}))
const tableHeight = computed(() => computedTableHeight({}))watch(() => data.searchForm,() => {// debounceif (data.timer) {clearTimeout(data.timer)}data.timer = setTimeout(() => {data.timer = nullmethod.sureSearch()}, DEBOUNCE_TIME)},{deep: true}
)defineExpose({getDelivery: method.getDelivery
})
</script><style lang="less" scoped>
.operateArea {width: 100%;min-width: 760px;display: flex;align-items: center;border-radius: 10px;padding: 0 10px;
}.col {display: flex;align-items: center;
}
</style>

1.2 接口代码

     [Route("dispatchlist")][ApiController][ApiExplorerSettings(GroupName = "WMS")]public class DispatchlistController : BaseController{#region Args/// <summary>/// dispatchlist Service/// </summary>private readonly IDispatchlistService _dispatchlistService;/// <summary>/// Localizer Service/// </summary>private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;#endregion#region constructor/// <summary>/// constructor/// </summary>/// <param name="dispatchlistService">dispatchlist Service</param>/// <param name="stringLocalizer">Localizer</param>public DispatchlistController(IDispatchlistService dispatchlistService, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer){this._dispatchlistService = dispatchlistService;this._stringLocalizer= stringLocalizer;}#endregion#region Api/// <summary>/// page search/// </summary>/// <param name="pageSearch">args</param>/// <returns></returns>[HttpPost("list")]public async Task<ResultModel<PageData<DispatchlistViewModel>>> PageAsync(PageSearch pageSearch){var (data, totals) = await _dispatchlistService.PageAsync(pageSearch, CurrentUser);return ResultModel<PageData<DispatchlistViewModel>>.Success(new PageData<DispatchlistViewModel>{Rows = data,Totals = totals});}/// <summary>/// advanced dispatch order page search/// </summary>/// <param name="pageSearch">args</param>/// <returns></returns>[HttpPost("advanced-list")]public async Task<ResultModel<PageData<PreDispatchlistViewModel>>> AdvancedDispatchlistPageAsync(PageSearch pageSearch){var (data, totals) = await _dispatchlistService.AdvancedDispatchlistPageAsync(pageSearch, CurrentUser);return ResultModel<PageData<PreDispatchlistViewModel>>.Success(new PageData<PreDispatchlistViewModel>{Rows = data,Totals = totals});}/// <summary>/// add a new record/// </summary>/// <param name="viewModel">args</param>/// <returns></returns>[HttpPost]public async Task<ResultModel<string>> AddAsync(List<DispatchlistAddViewModel> viewModel){var (flag, msg) = await _dispatchlistService.AddAsync(viewModel,CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// update dispatchlist with same dispatch_no/// </summary>/// <param name="viewModel">viewModel</param>/// <returns></returns>[HttpPut]public async Task<ResultModel<string>> UpdateAsycn(List<DispatchlistViewModel> viewModel){var (flag, msg) = await _dispatchlistService.UpdateAsycn(viewModel, CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// get dispatchlist by dispatch_no/// </summary>/// <param name="dispatch_no">dispatch_no</param>/// <returns></returns>[HttpGet("by-dispatch_no")]public async Task<ResultModel<List<DispatchlistViewModel>>> GetByDispatchlistNo(string dispatch_no){var datas = await _dispatchlistService.GetByDispatchlistNo(dispatch_no, CurrentUser);return ResultModel<List<DispatchlistViewModel>>.Success(datas);}/// <summary>/// get Dispatchlist details with available stock/// </summary>/// <param name="dispatch_no">dispatch_no</param>/// <returns></returns>[HttpGet("confirm-check")]public async Task<ResultModel<List<DispatchlistConfirmDetailViewModel>>> ConfirmOrderCheck(string dispatch_no){var datas  = await _dispatchlistService.ConfirmOrderCheck(dispatch_no, CurrentUser);return ResultModel<List<DispatchlistConfirmDetailViewModel>>.Success(datas);}/// <summary>///  get pick list by dispatch_id/// </summary>/// <param name="dispatch_id">dispatch_id</param>/// <returns></returns>[HttpGet("pick-list")]public async Task<ResultModel<List<DispatchpicklistViewModel>>> GetPickListByDispatchID(int dispatch_id){var datas = await _dispatchlistService.GetPickListByDispatchID(dispatch_id);return ResultModel<List<DispatchpicklistViewModel>>.Success(datas);}/// <summary>/// delete a record/// </summary>/// <param name="dispatch_no">dispatch_no</param>/// <returns></returns>[HttpDelete]public async Task<ResultModel<string>> DeleteAsync(string dispatch_no){var (flag, msg) = await _dispatchlistService.DeleteAsync(dispatch_no,CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>///  Confirm orders and create  dispatchpicklist/// </summary>/// <param name="viewModels">viewModels</param>/// <returns></returns>[HttpPost("confirm-order")]public async Task<ResultModel<string >> ConfirmOrder(List<DispatchlistConfirmDetailViewModel> viewModels){var (flag, msg) = await _dispatchlistService.ConfirmOrder(viewModels, CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>///  confirm dispatchpicklist picked by dispatch_no/// </summary>/// <param name="dispatch_no">viewModels</param>/// <returns></returns>[HttpPut("confirm-pick-dispatchlistno")]public async Task<ResultModel<string>> ConfirmPickByDispatchNo(string dispatch_no){var (flag, msg) = await _dispatchlistService.ConfirmPickByDispatchNo(dispatch_no, CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>///  package dispatchpicklist/// </summary>/// <param name="viewModels">viewModels</param>/// <returns></returns>[HttpPost("package")]public async Task<ResultModel<string>> Package(List<DispatchlistPackageViewModel> viewModels){var (flag, msg) = await _dispatchlistService.Package(viewModels, CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>///  weight dispatchpicklist/// </summary>/// <param name="viewModels">viewModels</param>/// <returns></returns>[HttpPost("weight")]public async Task<ResultModel<string>> Weight(List<DispatchlistWeightViewModel> viewModels){var (flag, msg) = await _dispatchlistService.Weight(viewModels, CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>///  dispatchpicklist outbound delivery/// </summary>/// <param name="viewModels">viewModels</param>/// <returns></returns>[HttpPost("delivery")]public async Task<ResultModel<string>> Delivery(List<DispatchlistDeliveryViewModel> viewModels){var (flag, msg) = await _dispatchlistService.Delivery(viewModels, CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>///  set dispatchlist freightfee/// </summary>/// <param name="viewModels">viewModels</param>/// <returns></returns>[HttpPost("freightfee")]public async Task<ResultModel<string>> SetFreightfee(List<DispatchlistFreightfeeViewModel> viewModels){var (flag, msg) = await _dispatchlistService.SetFreightfee(viewModels);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>///  sign for arrival/// </summary>/// <param name="viewModels">viewModels</param>/// <returns></returns>[HttpPost("sign")]public async Task<ResultModel<string>> SignForArrival(List<DispatchlistSignViewModel> viewModels){var (flag, msg) = await _dispatchlistService.SignForArrival(viewModels);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// cancel order opration /// </summary>/// <param name="viewModel">viewModel</param>/// <returns></returns>[HttpPost("cancel-order")]public async Task<ResultModel<string>> CancelOrderOpration(CancelOrderOprationViewModel viewModel){var (flag, msg) = await _dispatchlistService.CancelOrderOpration(viewModel,CurrentUser);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}/// <summary>/// cancel dispatchlist detail opration/// </summary>/// <param name="id">id</param>/// <returns></returns>[HttpPut("cancel-order")]public async Task<ResultModel<string>> CancelDispatchlistDetailOpration(int id){var (flag, msg) = await _dispatchlistService.CancelDispatchlistDetailOpration(id);if (flag){return ResultModel<string>.Success(msg);}else{return ResultModel<string>.Error(msg);}}#endregion}

【愚公系列】2023年02月 WMS智能仓储系统-018.收获管理和发货管理(完结篇)相关推荐

  1. 【愚公系列】2023年02月 WMS智能仓储系统-011.数据库文档设计

    文章目录 前言 一.数据库文档设计 1.chm版本 2.PDF版本 3.html版本 二.数据库表目录 表结构 __EFMigrationsHistory asn asnsort category c ...

  2. 【愚公系列】2023年02月 WMS智能仓储系统-016.库存管理和仓内作业(库存管理、仓内加工、库存移动)

    文章目录 前言 一.库存管理 1.1 页面代码 1.2 接口代码 二.仓内作业 1.仓内加工 1.1 页面代码 1.2 接口代码 2.库存移动 2.1 页面代码 2.2 接口代码 前言 这节主要分为两 ...

  3. 【愚公系列】2023年02月 WMS智能仓储系统-007.Swagger接口文档的配置

    文章目录 前言 一.Swagger接口文档的配置 1.安装包 2.注入 2.1 Swagger服务的注入 2.2 appsetting.json的配置 2.3 Swagger服务的封装 2.3.1 S ...

  4. 【愚公系列】2023年02月 WMS智能仓储系统-017.仓内作业(库存冻结、库存调整、库存盘点)

    文章目录 前言 一.仓内作业 1.库存冻结 1.1 页面代码 1.2 接口代码 2.库存调整 2.1 页面代码 2.2 接口代码 3.库存盘点 3.1 页面代码 3.2 接口代码 前言 这节主要分为两 ...

  5. 【愚公系列】2023年02月 WMS智能仓储系统-010.全局过滤、中间件、格式化配置

    文章目录 前言 一.全局过滤 1.全局行为过滤的概念 2.全局行为过滤的注册方式 2.1 方法注册 2.2 控制器注册 2.3 全局注册 2.4 TypeFilter 和 ServiceFilter ...

  6. 【愚公系列】2023年02月 WMS智能仓储系统-001.NLog日志的使用

    文章目录 前言 一.NLog日志的使用 1.安装包 2.配置文件nlog.config 3.使用 前言 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件.用户可以通过它来 ...

  7. 【愚公系列】2023年02月 WMS智能仓储系统-012.登录功能的实现

    文章目录 前言 1.业务流程说明 2.登录业务的相关技术点 3.登录-token原理分析 4.前端框架设计 一.登录功能的实现 1.登录页面设计 2.登录逻辑功能实现 2.1 登录逻辑页面 2.2 接 ...

  8. 【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(货主信息、运费设置、客户信息)

    文章目录 前言 一.基础设置 1.货主信息 1.1 页面代码 1.2 接口代码 2.运费设置 2.1 页面代码 2.2 接口代码 3.客户信息 3.1 页面代码 3.2 接口代码 前言 基础设置主要分 ...

  9. 【愚公系列】2023年02月 WMS智能仓储系统-006.租户功能的配置

    文章目录 前言 一.租户功能的配置 1.注入租户类 2.相关类说明 前言 多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何 ...

最新文章

  1. 随堂小测app冲刺(六)
  2. Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)...
  3. 怎么在eclipse里调试WebDriver的源代码
  4. python 自然语言处理(三)获取词性
  5. XSS (跨站脚本攻击) 分析与实战
  6. Bootstrap滚动监控器
  7. XP和win7的软件崩溃提示
  8. vue h5通过hbuilder打包为App的返回键兼容问题
  9. 欧拉定理和费马小定理
  10. 树莓派wiringPi输出PMW
  11. bootstrap 表头组合
  12. SQL高级——PLSQL数据库编程
  13. ANIMO 03 汉化补丁
  14. 数据图像处理——期末复习知识点
  15. Visio使用技巧——改变环形箭头的箭头方向
  16. 本科毕设课题之OJ开发(1)--评测机
  17. 扫雷游戏开发基本思路
  18. 预习博客(HTML标签+认识浏览器)
  19. 不属于二代计算机网络的实例,计算机网络技术习题
  20. python:pygame的各种使用方法

热门文章

  1. using System.Linq命名空间无法引用!的解决方案
  2. uniapp刘海屏适配
  3. js 正则验证三位小数
  4. K8S 安装 Metric-server
  5. python自动轨迹绘制_python day 20 自动轨迹绘制
  6. 【推荐】最新国外免费空间网站Hostinger
  7. 人才引进都选什么大学,哪些世界大学排名更靠谱?
  8. JZOJ4829. 独木桥
  9. HTML易烊千玺网页,易烊千玺弟弟破世界纪录,被扒两天就被人打破,认证网站遭质疑...
  10. 【六祎-flash】如何删除FLASH广告