dengjunjie
2025-01-11 5e39811c50a51a5b1c9af0f2f8dda4a21a28c677
添加WMS和PDA平库出库功能
已修改10个文件
已添加2个文件
565 ■■■■■ 文件已修改
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/PalletCodeInfoService.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_SystemService/Sys_UserService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundOrderController.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundOrderDetailController.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/淮安PDA/pages/stash/AGVFinish.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/淮安PDA/pages/stash/outboundorder.vue 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/淮安PDA/pages/stash/outraworderboxing.vue 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/PalletCodeInfoService.cs
@@ -58,15 +58,33 @@
                string uplen = "";
                switch (_Warehouse.WarehouseCode)
                {
                    "HA57" => "B",
                    "HA58" => "P",
                    "HA152" => "G",
                    "HA64" => "S",
                    "阻焊仓" => "Z",
                    "HA153" => "Y",
                    "HA71" => "C",
                    "HA60" => "F",
                    _ => "N"
                    case "HA57":
                        uplen = "B";
                        break;
                    case "HA58":
                        uplen = "P";
                        break;
                    case "HA152":
                        uplen = "G";
                        break;
                    case "HA64":
                        uplen = "S";
                        break;
                    case "阻焊仓":
                        uplen = "Z";
                        break;
                    case "HA153":
                        uplen = "Y";
                        break;
                    case "HA71":
                        uplen = "C";
                        break;
                    case "HA60":
                        uplen = "F";
                        break;
                    default:
                        uplen = "N";
                        break;
                };
                for (int i = 0; i < count; i++)
                {
@@ -88,6 +106,7 @@
            }
        }
        public WebResponseContent AddData(int warehouseId, int count, int palletTypeId)
        {
            try
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs
@@ -50,6 +50,9 @@
        [Description("手动组盘入库确认")]
        æ‰‹åŠ¨ç»„ç›˜å…¥åº“ç¡®è®¤ = 13,
        [Description("拣选完成")]
        æ‹£é€‰å®Œæˆ =14,
        [Description("组盘撤销")]
        ç»„盘撤销 = 99,
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs
@@ -17,7 +17,7 @@
    public interface IOutboundOrderDetailService : IService<Dt_OutboundOrderDetail>
    {
        IOutboundOrderDetailRepository Repository { get; }
        WebResponseContent GetOutboundOrderDetails(SaveModel saveModel);
        /// <summary>
        /// é”å®šå‡ºåº“库存
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderService.cs
@@ -17,6 +17,7 @@
    {
        IOutboundOrderRepository Repository { get; }
        WebResponseContent GetOutboundOrders(SaveModel saveModel);
        WebResponseContent ReceiveOutOrder(ErpOutOrderDTO model);
        WebResponseContent TestOutUpload(int id,List<Dt_OutStockLockInfo>? outStockLockInfos=null);
    }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs
@@ -47,7 +47,21 @@
            _basicService = basicService;
            _recordService = recordService;
        }
        public WebResponseContent GetOutboundOrderDetails(SaveModel saveModel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string orderNo = saveModel.MainData["orderNo"].ToString();
                Dt_OutboundOrder inboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == orderNo).Includes(x => x.Details).First();
                content.OK(data: inboundOrder.Details);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// é”å®šåº“存,由系统分配(仅逻辑运算,不生成任务,不修改数据库数据)
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs
@@ -72,6 +72,32 @@
            saveModel.DetailData[0].Add("orderDetailStatus", OrderDetailStatusEnum.New.ObjToInt());
            return base.AddData(saveModel);
        }
        public WebResponseContent GetOutboundOrders(SaveModel saveModel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                int pageNo = saveModel.MainData["pageNo"].ObjToInt();
                string? orderNo = saveModel.MainData["orderNo"].ToString();
                int warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
                List<Dt_OutboundOrder> dt_ReceiveOrders = new List<Dt_OutboundOrder>();
                if (string.IsNullOrEmpty(orderNo))
                {
                    dt_ReceiveOrders = Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderStatus < OutLockStockStatusEnum.出库完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5);
                }
                else
                {
                    dt_ReceiveOrders = Db.Queryable<Dt_OutboundOrder>().Where(x => (x.OrderNo.Contains(orderNo)) && x.OrderStatus < OutLockStockStatusEnum.出库完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5);
                }
                content.OK(data: dt_ReceiveOrders);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent ReceiveOutOrder(ErpOutOrderDTO model)
        {
            try
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_SystemService/Sys_UserService.cs
@@ -19,6 +19,7 @@
using MailKit.Search;
using OrderByType = SqlSugar.OrderByType;
using System.Drawing.Printing;
using WIDESEA_Core.HostedService;
namespace WIDESEA_SystemService
{
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundOrderController.cs
@@ -27,6 +27,15 @@
        {
            return Service.TestOutUpload(id);
        }
        /// <summary>
        /// èŽ·å–å‡ºåº“å•
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        [HttpPost, Route("GetOutboundOrders"), AllowAnonymous]
        public WebResponseContent GetOutboundOrders([FromBody]SaveModel saveModel)
        {
            return Service.GetOutboundOrders(saveModel);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundOrderDetailController.cs
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
@@ -18,6 +19,15 @@
        public OutboundOrderDetailController(IOutboundOrderDetailService service) : base(service)
        {
        }
        /// <summary>
        /// èŽ·å–å‡ºåº“å•è¯¦æƒ…
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        [HttpPost, Route("GetOutboundOrderDetails"), AllowAnonymous]
        public WebResponseContent GetOutboundOrderDetails([FromBody] SaveModel saveModel)
        {
            return Service.GetOutboundOrderDetails(saveModel);
        }
    }
}
´úÂë¹ÜÀí/»´°²PDA/pages/stash/AGVFinish.vue
@@ -48,7 +48,7 @@
                    })
                    return;
                }
                this.$u.post('http://127.0.0.1:9291/api/CTU_AGV/AGVFinish?&barcode=' + this.barcode).then(
                this.$u.post('http://10.30.4.92:9291/api/CTU_AGV/AGVFinish?barcode=' + this.barcode).then(
                    res => {
                        if (res.status) {
                            this.$refs.uToast.show({
´úÂë¹ÜÀí/»´°²PDA/pages/stash/outboundorder.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,177 @@
<template>
    <view>
        <u-sticky>
            <view style="background-color: #ffffff;">
                <uni-search-bar @confirm="search" v-model="searchValue"></uni-search-bar>
            </view>
        </u-sticky>
        <uni-list :border="true">
            <uni-list-item direction="column" clickable @click="groupClick(item.orderNo)" link
                :to="page+item.orderNo" v-for="item in allReceivingOrders" :key="item.orderNo">
                <template v-slot:body>
                    <uni-group margin-top="20">
                        <view> å•号:{{item.orderNo}} </view>
                        <view> åˆ›å»ºäºº:{{item.creater}} </view>
                        <view> æ—¥æœŸ:{{item.createDate}} </view>
                    </uni-group>
                </template>
            </uni-list-item>
        </uni-list>
        <uni-load-more :status="status" v-if="loadVisible"></uni-load-more>
        <u-back-top :scroll-top="scrollTop" top="400"></u-back-top>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                page: "/pages/stash/outraworderboxing?",
                loadVisible: false,
                searchValue: "",
                status: "more",
                allReceivingOrders: [],
                pageNo: 1,
                scrollTop: 0,
                warehouseId: ""
            }
        },
        onLoad(res) {
            this.warehouseId = res.warehouseId;
            this.page = this.page + "warehouseId=" + this.warehouseId + "&orderNo=";
            this.getData();
        },
        onReachBottom() {
            this.pageNo += 1;
            this.getData();
        },
        onPageScroll(e) {
            this.scrollTop = e.scrollTop;
        },
        methods: {
            search(res) {
                this.getData();
            },
            groupClick() {
            },
            getData() {
                var postData = {
                    MainData: {
                        warehouseId: this.warehouseId,
                        orderNo: this.searchValue,
                        pageNo: this.pageNo
                    },
                }
                this.$u.post('/api/OutboundOrder/GetOutboundOrders', postData).then((res) => {
                    if (res.status) {
                        if (res.data.length > 0) {
                            if (this.searchValue == '') {
                                this.allReceivingOrders = this.allReceivingOrders.concat(res.data);
                                // this.allReceivingOrders = res.data;
                                if (this.allReceivingOrders.length > 3) {
                                    this.loadVisible = true;
                                } else {
                                    this.loadVisible = false;
                                }
                            } else {
                                this.allReceivingOrders = res.data;
                                if (this.allReceivingOrders.length > 3) {
                                    this.loadVisible = true;
                                } else {
                                    this.loadVisible = false;
                                }
                            }
                        } else {
                            this.status = 'noMore';
                            //this.allReceivingOrders = [];
                            this.loadVisible = true;
                        }
                    }
                })
            }
        }
    }
</script>
<style lang="scss">
    @import '@/common/uni-ui.scss';
    page {
        display: flex;
        flex-direction: column;
        box-sizing: border-box;
        background-color: #efeff4;
        min-height: 100%;
        height: auto;
    }
    .tips {
        color: #67c23a;
        font-size: 14px;
        line-height: 40px;
        text-align: center;
        background-color: #f0f9eb;
        height: 0;
        opacity: 0;
        transform: translateY(-100%);
        transition: all 0.3s;
    }
    .tips-ani {
        transform: translateY(0);
        height: 40px;
        opacity: 1;
    }
    .content {
        width: 100%;
        display: flex;
    }
    .list-picture {
        width: 100%;
        height: 145px;
    }
    .thumb-image {
        width: 100%;
        height: 100%;
    }
    .ellipsis {
        display: flex;
        overflow: hidden;
    }
    .uni-ellipsis-1 {
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
    }
    .uni-ellipsis-2 {
        overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
    }
    .customcss {
        display: flex;
        position: fixed;
        width: 100%;
        top: 10px;
        text-align: center;
        z-index: 999;
        left: 30px;
        height: 20%;
    }
    .footer {
        padding-top: 50%;
    }
</style>
´úÂë¹ÜÀí/»´°²PDA/pages/stash/outraworderboxing.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,275 @@
<template>
    <view>
        <uni-segmented-control :current="current" :values="items" @clickItem="onClickItem">
        </uni-segmented-control>
        <view class="content">
            <view v-if="current === 0" class="headerstyle">
                <view class="itemstyle">
                    <uni-forms style="margin-left: 2%;margin-top: 20px;" label-width="180">
                        <uni-forms-item :label="label" style="margin-top: -20px;"></uni-forms-item>
                        <!-- <uni-forms-item label="单据类型:生产领料单" style="margin-top: -20px;"></uni-forms-item> -->
                        <uni-forms-item label="物料码:" style="margin-top: -20px;">
                            <uni-easyinput type="text" placeholder="请扫描物料码" ref='midInput' :focus="focus"
                                v-model="innerCode" @input="snInput" />
                        </uni-forms-item>
                        <!-- <uni-forms-item :label="PurchaseOrderNo" style="margin-top: -20px;"></uni-forms-item>
                        <uni-forms-item :label="matCode" style="margin-top: -20px;"></uni-forms-item>
                        <uni-forms-item :label="LotNo" style="margin-top: -20px;"></uni-forms-item>
                        <uni-forms-item :label="ProductionDate" style="margin-top: -20px;"></uni-forms-item>
                        <uni-forms-item :label="EffectiveDate" style="margin-top: -20px;"></uni-forms-item>
                        <uni-forms-item :label="orderQty" style="margin-top: -20px;"></uni-forms-item>
                        <uni-forms-item :label="remaindQty" style="margin-top: -20px;"> -->
                        <uni-list>
                            <uni-list-item direction="column" v-for="item in matInfos" :key="item.palletCode">
                                <template v-slot:body>
                                    <view class="uni-content">
                                        <view>单据编号:{{item.orderNo}}</view>
                                        <view>托盘编号:{{item.palletCode}}</view>
                                        <view>物料批次:{{item.batchNo}}</view>
                                        <view>物料编码:{{item.materielCode}}</view>
                                        <view>物料名称:{{item.materielName}}</view>
                                        <view>单据数量:{{item.orderQuantity}}</view>
                                        <view>原始库存:{{item.originalQuantity}}</view>
                                        <view>分配库存:{{item.assignQuantity}}</view>
                                        <view>剩余库存:{{item.originalQuantity-item.assignQuantity}}</view>
                                    </view>
                                </template>
                            </uni-list-item>
                        </uni-list>
                        <uni-forms-item label="出库数量:" style="margin-top: -20px;">
                            <uni-easyinput type="text" placeholder="请输入出库数量" ref='midInput' :focus="focus"
                                v-model="outQty" />
                        </uni-forms-item>
                        </uni-forms-item>
                    </uni-forms>
                    <uni-forms-item>
                        <button @click="submit" type="primary" size="default" style="margin-top: 2%;">确认出库</button>
                    </uni-forms-item>
                </view>
            </view>
            <view v-if="current === 1" class="headerstyle">
                <view class="itemstyle">
                    <uni-list :border="true">
                        <uni-list-item direction="column" v-for="(item,index) in orderInfo" :key="index">
                            <template v-slot:body>
                                <view class="uni-list-box">
                                    <view class="uni-content">
                                        <view>单据号:{{orderNo}}</view>
                                        <view>物料编码:{{item.materielCode}}</view>
                                        <view>物料名称:{{item.materielName}}</view>
                                        <view>数量:{{item.orderQuantity+item.unit}}</view>
                                        <view>出库数量:{{item.orderQuantity}}</view>
                                        <view>已出数量:{{item.overOutQuantity}}</view>
                                    </view>
                                </view>
                            </template>
                        </uni-list-item>
                    </uni-list>
                </view>
            </view>
        </view>
        <u-toast ref="uToast" />
    </view>
</template>
<script>
    const innerAudioContext = uni.createInnerAudioContext();
    export default {
        data() {
            return {
                items: ['物料信息', '单据信息'],
                current: 0,
                matTotal: [],
                matInfos: [],
                orderNo: "",
                label: "",
                outQty: "",
                orderInfo: [],
                focus: false,
                pkfocus: false,
                barcode: "",
                materSn: "",
                Initiallife: 1000,
                sns: [],
                pksns: [],
                addressFocus: false,
                inboundBarcode: "",
                address: "",
                check: true,
                value: "",
                matInfo: [],
                value2: "",
                matTotals: [],
                warehouseId: "",
                Test: false,
                Testlabel: "",
                Testplaceholder: "",
                Testcheck: false,
                pkmaterSn: "",
                pkmatInfos: []
            }
        },
        onShow() {},
        onLoad(res) {
            this.focus = false;
            this.addressFocus = false;
            this.orderNo = res.orderNo;
            this.warehouseId = res.warehouseId;
            this.label = "单据编号:" + this.orderNo;
            this.getData();
        },
        methods: {
            voiceSpeech(src) {
                innerAudioContext.src = src; // '../../static/success.mp3';
                innerAudioContext.play();
            },
            getData() {
                var postData = {
                    MainData: {
                        orderNo: this.orderNo
                    },
                }
                this.$u.post('/api/OutboundOrderDetail/GetOutboundOrderDetails', postData).then((res) => {
                    if (res.status) {
                        this.orderInfo = res.data;
                        if (this.orderInfo.length > 3) {
                            this.loadVisible = true;
                        }
                    }
                })
            },
            onClickItem(e) {
                this.focus = false;
                this.addressFocus = false;
                if (this.current !== e.currentIndex) {
                    this.current = e.currentIndex;
                    if (this.current == 2) {
                        this.getData();
                    }
                }
            },
            //扫码
            snInput() {
                this.$nextTick(() => {
                    if (this.materSn != "") {
                        this.focus = false;
                        var matSn = this.materSn;
                        setTimeout(() => {
                            this.materSn = "";
                        }, 10);
                        this.$u.post('/api/MaterielInfo/CodeAnalysis?serNum=' + matSn, {}).then((res) => {
                            this.Testcheck = false;
                            if (res.status) {
                                this.sns.push(res.data.serialNumber);
                                this.matInfos.push(res.data);
                                if (res.message) {
                                    this.$refs.uToast.show({
                                        title: res.message,
                                        type: "error"
                                    })
                                    setTimeout(() => {
                                        this.voiceSpeech('../../static/fail.mp3');
                                    }, 100);
                                    return;
                                }
                                setTimeout(() => {
                                    this.voiceSpeech('../../static/success.mp3');
                                }, 100);
                            } else {
                                this.$refs.uToast.show({
                                    title: res.message,
                                    type: "error"
                                })
                                setTimeout(() => {
                                    this.voiceSpeech('../../static/fail.mp3');
                                }, 100);
                            }
                        })
                    }
                })
            },
            deleteList(res) {
                this.matInfos.splice(res, 1);
                this.sns.splice(res, 1);
            },
            submit() {
                if (this.barcode == "") {
                    this.$refs.uToast.show({
                        title: "请扫描托盘条码",
                        type: 'error'
                    })
                    return;
                }
                if (this.matInfos.length == 0) {
                    this.$refs.uToast.show({
                        title: "请扫描内箱标签",
                        type: 'error'
                    })
                    return;
                }
                if (this.Test) {
                    if (!this.Testcheck) {
                        this.Testcheck = true;
                        this.$refs.uToast.show({
                            title: "请确认初始寿命",
                            type: 'error'
                        })
                        return;
                    }
                }
                this.$u.post('/api/InboundOrder/MaterielGroup', {
                    MainData: {
                        "palletCode": this.barcode,
                        "orderNo": this.orderNo,
                        "initiallife": this.Initiallife,
                        // "isFull": this.check
                        "warehouseId": this.warehouseId
                    },
                    DelKeys: this.sns
                }).then(res => {
                    this.Testcheck = false;
                    if (res.status) {
                        this.$refs.uToast.show({
                            title: "出库成功",
                            type: "success"
                        })
                        this.focus = false;
                        this.barcode = "";
                        this.matInfos = [];
                        this.sns = [];
                        this.matTotal = [];
                    } else {
                        this.$refs.uToast.show({
                            title: res.message,
                            type: "error"
                        })
                    }
                })
            }
        }
    }
</script>
<style lang="scss">
    @import '@/common/uni-ui.scss';
    .content {
        display: flex;
        height: 150px;
    }
    .content-text {
        font-size: 14px;
        color: #666;
    }
    .itemstyle {
        margin-top: 30px;
        margin-left: 5%;
    }
    .headerstyle {
        width: 90%;
    }
</style>