kazelee
2025-05-19 b079910e5de15863c26e479ffab15cc45d706f1a
Services/MoboxService.cs
@@ -3,6 +3,7 @@
using System.Linq;
using HH.WCS.Mobox3.DSZSH.Consts;
using HH.WCS.Mobox3.DSZSH.Dispatch;
using HH.WCS.Mobox3.DSZSH.Helper;
using HH.WCS.Mobox3.DSZSH.Helpers;
using HH.WCS.Mobox3.DSZSH.Models;
@@ -371,11 +372,13 @@
        public static SimpleResult CreateCheckOrder(CreateCheckOrderInfo model) {
            var db = DbHelper.GetDbClient();
            try {
                var orderNo = GenerateOrderNo("抽检单号", "CN");
                // 绑定操作:插入出库单、所有的出库单明细
                using (var tran = db.Ado.UseTran()) {
                    var order = new TN_Check_Order {
                        S_NO = GenerateOrderNo("抽检单号", "CN"),
                        S_NO = orderNo,
                        S_ITEM_CODE = model.ItemCode,
                        //S_ITEM_NAME = model.ItemName,
                        S_BATCH_NO = model.BatchNo,
@@ -388,20 +391,33 @@
                        return BuildSimpleResult(2, "生成 抽检单 失败:" + JsonConvert.SerializeObject(order));
                    }
                    for (int i = 0; i < model.Qty; i++) {
                        var detail = new TN_Check_Detail {
                            S_NO = order.S_NO,
                            S_ITEM_CODE = model.ItemCode,
                            S_BATCH_NO = model.BatchNo,
                            S_END_AREA = model.EndArea
                        };
                    var cgDetailList = SelectCgByTotalQty(model);
                        if (db.Insertable<TN_Check_Detail>(detail).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            return BuildSimpleResult(3, "生成 抽检单明细 失败:" + JsonConvert.SerializeObject(detail));
                        }
                    if (cgDetailList.Count == 0) {
                        return BuildSimpleResult(3, "没有合适的物料可以抽检");
                    }
                    foreach (var cgDetail in cgDetailList) {
                        var detail = new TN_Outbound_Detail {
                            S_OO_NO = orderNo,
                            S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                            S_BATCH_NO = cgDetail.S_BATCH_NO,
                            S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                            S_END_AREA = model.EndArea,
                        };
                        cgDetail.N_ITEM_STATE = 3;
                        cgDetail.S_ITEM_STATE = "正在检验";
                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0
                            && db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it => new { it.N_ITEM_STATE, it.S_ITEM_STATE }).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            return BuildSimpleResult(4, "生成出库单明细失败:" + JsonConvert.SerializeObject(detail));
                        }
                        LogHelper.Debug("创建出库单明细成功:" + JsonConvert.SerializeObject(detail));
                    }
                    tran.CommitTran();
                }
                return BuildSimpleResult(0, $"创建 抽检单 成功");
@@ -556,6 +572,56 @@
            }
        }
        public static List<TN_CG_Detail> SelectCgByTotalQty(CreateCheckOrderInfo model) {
            var db = DbHelper.GetDbClient();
            var result = new List<TN_CG_Detail>();
            var targetNum = model.Qty;
            try {
                var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
                && a.N_ITEM_NUM > targetNum).
                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
                if (targetCg != null) //刚好有一行满足条件
                {
                    result.Add(targetCg);
                    return result;
                }
                var sortedMaterials = new List<TN_CG_Detail>();
                sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检")
                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
                if (sortedMaterials.Count == 0) //没有满足条件的
                {
                    return result;
                }
                int countNum = 0;
                foreach (var mat in sortedMaterials) {
                    countNum += mat.N_ITEM_NUM;
                    result.Add(mat);
                    if (countNum >= targetNum) {
                        break;
                    }
                }
                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
                    return result;
                }
                else {
                    result.Clear();
                    return result;
                }
            }
            catch (Exception ex) {
                throw ex;
            }
        }
        #endregion
        #region Mobox 功能
@@ -584,14 +650,13 @@
                        return BuildSimpleResult(3, "没有合适的物料可以出库");
                    }
                    // NOTE 如果创建order的时候就指定具体出库物料的cntr,那么如果在创建任务前,这个物料被错误抽检了怎么办
                    foreach (var cgDetail in cgDetailList) {
                        var detail = new TN_Outbound_Detail {
                            S_NO = orderNo,
                            S_OO_NO = orderNo,
                            S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                            S_BATCH_NO = cgDetail.S_BATCH_NO,
                            S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                            N_COUNT = cgDetail.N_QTY,
                            N_COUNT = cgDetail.N_ITEM_NUM,
                            S_END_AREA = model.EndArea
                        };
@@ -646,10 +711,9 @@
                        return BuildSimpleResult(3, "没有合适的物料可以出库");
                    }
                    // NOTE 如果创建order的时候就指定具体出库物料的cntr,那么如果在创建任务前,这个物料被错误抽检了怎么办
                    foreach (var cgDetail in cgDetailList) {
                        var detail = new TN_Outbound_Detail {
                            S_NO = orderNo,
                            S_OO_NO = orderNo,
                            S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                            S_BATCH_NO = cgDetail.S_BATCH_NO,
                            S_CNTR_CODE = cgDetail.S_CNTR_CODE,
@@ -693,8 +757,8 @@
            try {
                var targetCg = db.Queryable<TN_CG_Detail>().Where(a => a.S_ITEM_CODE == model.ItemCode
                && a.N_QTY > targetNum).
                OrderBy(a => a.N_QTY, OrderByType.Asc).First();
                && a.N_ITEM_NUM > targetNum).
                OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
                if (targetCg != null) //刚好有一行满足条件
                {
                    result.Add(targetCg);
@@ -702,29 +766,42 @@
                }
                // NOTE 根据总量选detail时,是否需要考虑货位的高低?
                var sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_QTY > 0)
                var sortedMaterials = new List<TN_CG_Detail>();
                if (model.ForcedOut) {
                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
                    .Where(d => (model.ForcedOut && d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格")
                        || (!model.ForcedOut && (d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格"
                        || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检")))
                    .OrderBy(d => d.N_QTY, OrderByType.Desc)
                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格"
                             || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检")
                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
                }
                else {
                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格")
                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
                }
                if (sortedMaterials.Count == 0) //没有满足条件的
                {
                    return result;
                }
                float countNum = 0;
                int countNum = 0;
                foreach (var mat in sortedMaterials) {
                    countNum += mat.N_QTY;
                    countNum += mat.N_ITEM_NUM;
                    result.Add(mat);
                    if (countNum >= targetNum) {
                        break;
                    }
                }
                if (result.Sum(a => a.N_QTY) >= targetNum) {
                if (result.Sum(a => a.N_ITEM_NUM) >= targetNum) {
                    return result;
                }
                else {