private decimal GetInveroryFromSaleNum(TBMMaterialFileCacheModel tBMMaterialFileCacheModel, decimal SaleNum)
        {
            decimal result = 0;

            decimal basicNum = 0;

            if (tBMMaterialFileCacheModel.SalesUnitId != null && tBMMaterialFileCacheModel.SalesRate != null)
            {
                basicNum = decimal.Round(SaleNum / (decimal)tBMMaterialFileCacheModel.SalesRate, 4);
            }
            else
            {
                basicNum = SaleNum;
            }

            if (tBMMaterialFileCacheModel.WarehouseUnitId != null && tBMMaterialFileCacheModel.WarehouseRate != null)
            {
                result = decimal.Round(basicNum * (decimal)tBMMaterialFileCacheModel.WarehouseRate, 4);
            }
            else
            {
                result = basicNum;
            }

            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// 单位转化
        /// </summary>
        /// <param name="tBMMaterialFileCacheModel">物料</param>
        /// <param name="from">原单位</param>
        /// <param name="to">目的单位</param>
        /// <param name="num">原单位数量</param>
        /// <returns>转化后的单位值</returns>
        public static decimal TranserUnit(TBMMaterialFileCacheModel tBMMaterialFileCacheModel, UnitType from, UnitType to, decimal num)
        {
            if (from == to)
            {
                return(num);
            }
            else
            {
                if (from == UnitType.Unit)
                {
                    int index = (int)to;
                    return(basictoOters[index](tBMMaterialFileCacheModel, num));
                }
                else if (to == UnitType.Unit)
                {
                    int index = (int)from;
                    return(othersToBasic[index](tBMMaterialFileCacheModel, num));
                }
                else
                {
                    int index1 = (int)from;
                    int index2 = (int)to;

                    decimal basic = othersToBasic[index1](tBMMaterialFileCacheModel, num);
                    return(basictoOters[index2](tBMMaterialFileCacheModel, basic));
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 销售数量转化为基本单位数量
        /// </summary>
        /// <param name="tBMMaterialFileCacheModel"></param>
        /// <param name="Num">销售数量</param>
        /// <returns></returns>
        private static decimal SalesToBase(TBMMaterialFileCacheModel tBMMaterialFileCacheModel, decimal Num)
        {
            decimal result = 0;

            if (tBMMaterialFileCacheModel.SalesUnitId != null && tBMMaterialFileCacheModel.SalesRate != null)
            {
                result = decimal.Round(Num * (decimal)tBMMaterialFileCacheModel.SalesRate, 4);
            }
            else
            {
                result = Num;
            }

            return(result);
        }
Esempio n. 4
0
        /// <summary>
        /// 基本单位数量转化为仓库单位数量
        /// </summary>
        /// <param name="tBMMaterialFileCacheModel"></param>
        /// <param name="Num">基本单位数量</param>
        /// <returns></returns>
        private static decimal BaseToWarehouse(TBMMaterialFileCacheModel tBMMaterialFileCacheModel, decimal Num)
        {
            decimal result = 0;

            if (tBMMaterialFileCacheModel.WarehouseUnitId != null && tBMMaterialFileCacheModel.WarehouseRate != null)
            {
                result = decimal.Round(Num / (decimal)tBMMaterialFileCacheModel.WarehouseRate, 4);
            }
            else
            {
                result = Num;
            }

            return(result);
        }
Esempio n. 5
0
        private MrpResultModel GetProcuctBomByOrderID(int orderID, CurrentUser currentUser)
        {
            MrpResultModel result = new MrpResultModel();

            #region 明细

            List <TMMProductionOrderBOMQueryModel> deatail = new List <TMMProductionOrderBOMQueryModel>();

            List <TBMMaterialFileCacheModel> MMaterialList = BasicCacheGet.GetMaterial(currentUser);



            var query = _db.Instance.Queryable <TMMProductionOrderBOMDbModel,
                                                TMMColorSolutionMainDbModel, TBMMaterialFileDbModel, TBMDictionaryDbModel, TBMPackageDbModel>((t, t1, t2, t3, t4) => new object[] {
                JoinType.Left, t.ColorSolutionId == t1.ID,
                JoinType.Inner, t.MaterialId == t2.ID,
                JoinType.Inner, t2.ColorId == t3.ID,
                JoinType.Inner, t4.ID == t.PackageId
            }).Where((t, t1, t2, t3, t4) => t.ProOrderId == orderID).Select((t, t1, t2, t3, t4) => new TMMProductionOrderBOMQueryModel()
            {
                ID                = t.ID,
                ProOrderId        = t.ProOrderId,
                MaterialId        = t.MaterialId,
                ColorSolutionCode = SqlFunc.IsNull(t1.SolutionCode, "无配色"),
                MaterialName      = t2.MaterialName,
                SingleValue       = t.SingleValue,
                ProductionNum     = t.ProductionNum,
                ColorId           = t2.ColorId,
                PackageId         = t.PackageId,
                ColorName         = SqlFunc.IsNull(t3.DicValue, "无色"),
                PackageName       = t4.DicValue
            });

            List <TMMProductionOrderBOMQueryModel> bomList = query.ToList();

            var packBomGroup = bomList.GroupBy(p => new  { p.PackageName, p.PackageId });
            foreach (var item in packBomGroup)
            {
                var PackageName  = item.Key.PackageName;
                var packageId    = item.Key.PackageId;
                var itemDeatails = item.ToList();

                var MaterialGroup = itemDeatails.GroupBy(p => new { p.MaterialName, p.MaterialId, p.ColorName, p.ColorId });

                foreach (var itemChild in MaterialGroup)
                {
                    var MaterialName = itemChild.Key.MaterialName;
                    var materialID   = itemChild.Key.MaterialId;
                    var ColorName    = itemChild.Key.ColorName;
                    var colorId      = itemChild.Key.ColorId;

                    var singleGroup = itemChild.ToList().GroupBy(p => p.SingleValue);

                    foreach (var itemChildChild in singleGroup)
                    {
                        var single = itemChildChild.Key;
                        var list   = itemChildChild.ToList();

                        TMMProductionOrderBOMQueryModel model = new TMMProductionOrderBOMQueryModel();
                        model.PackageId         = packageId;
                        model.MaterialId        = materialID;
                        model.MaterialName      = MaterialName;
                        model.PackageName       = PackageName;
                        model.ColorName         = ColorName;
                        model.ColorId           = colorId;
                        model.SingleValue       = single;
                        model.ProductionNum     = list.Sum(p => p.ProductionNum);
                        model.ColorSolutionCode = string.Join(",", list.Select(p => p.ColorSolutionCode).Distinct());
                        deatail.Add(model);
                    }
                }
            }

            deatail.ForEach((x) =>
            {
                TBMMaterialFileCacheModel item = MMaterialList.Where(p => p.ID == x.MaterialId).FirstOrDefault();
                if (item != null)
                {
                    x.MaterialName    = item.MaterialName;
                    x.MaterialCode    = item.MaterialCode;
                    x.BaseUnitId      = item.BaseUnitId;
                    x.BaseUnitName    = item.BaseUnitName;
                    x.ProduceUnitId   = item.ProduceUnitId;
                    x.ProduceUnitName = item.ProduceUnitName;
                }
            });

            #endregion

            List <TMMProductionOrderBOMSumQueryModel> bomListSummary = _db.Instance.Queryable <TMMProductionOrderBOMSumDbModel>().
                                                                       Where((t) => t.ProOrderId == orderID).Select((t) => new TMMProductionOrderBOMSumQueryModel()
            {
                ID                = t.ID,
                ProOrderId        = t.ProOrderId,
                MaterialId        = t.MaterialId,
                ColorSolutionCode = t.ColorSolutionCode,
                TotalValue        = t.TotalValue,
                PurchaseNum       = t.PurchaseNum,
                PurchaseTransNum  = t.PurchaseTransNum,
                PickNum           = t.PickNum,
                PickTransNum      = t.PickTransNum,
                PickTotalNum      = t.PickTotalNum,
            }).ToList();

            bomListSummary.ForEach((x) =>
            {
                TBMMaterialFileCacheModel item = MMaterialList.Where(p => p.ID == x.MaterialId).FirstOrDefault();
                if (item != null)
                {
                    x.MaterialName    = item.MaterialName;
                    x.MaterialCode    = item.MaterialCode;
                    x.BaseUnitId      = item.BaseUnitId;
                    x.BaseUnitName    = item.BaseUnitName;
                    x.ProduceUnitId   = item.ProduceUnitId;
                    x.ProduceUnitName = item.ProduceUnitName;
                }
            });

            result.deatails = deatail;
            result.summary  = bomListSummary;

            return(result);
        }
Esempio n. 6
0
        /// <summary>
        /// 自动计算
        /// </summary>
        /// <param name="orderID">生产订单ID</param>
        /// <param name="Type">1,表示有配色,2表示无配色</param>
        /// <param name="currentUser">当前用户</param>
        /// <returns>计算是否成功</returns>
        public async Task <ResponseObject <MrpResultModel> > AutoComputeMRP(int orderID, int Type, CurrentUser currentUser)
        {
            try
            {
                TMMProductionOrderMainDbModel mainEntity = _db.Instance.Queryable <TMMProductionOrderMainDbModel>().Where(p => p.ID == orderID &&
                                                                                                                          p.CompanyId == currentUser.CompanyID && p.MRPStatus == false).First();

                if (mainEntity == null)
                {
                    return(ResponseUtil <MrpResultModel> .FailResult(null, "生产订单不存在,或MRP已经算过了不能重复计算"));
                }

                List <TBMMaterialFileCacheModel> MMaterialList = BasicCacheGet.GetMaterial(currentUser);

                _db.Instance.BeginTran();



                var bomResult = await _iTMMProductionOrderMainService.CreateOrderBom(mainEntity.ID, currentUser); //生成BOM清单

                if (!bomResult.Result)
                {
                    throw new Exception(bomResult.ErrorInfo);
                }

                //数据字典
                var tBMDictionary = _db.Instance.Queryable <TBMDictionaryDbModel>().Where(p => p.CompanyId == currentUser.CompanyID).ToList().ToDictionary(p => p.ID, p => p.DicValue);

                //仓库
                var warehouseDic = _db.Instance.Queryable <TBMWarehouseFileDbModel>().Where(t => SqlFunc.IsNull(t.DeleteFlag, false) != true &&
                                                                                            t.CompanyId == currentUser.CompanyID).ToList().ToDictionary(p => p.ID, p => new { Name = p.WarehouseName, Code = p.Code });

                List <InventoryResultModel> result = new List <InventoryResultModel>();

                //其他出入库
                var otherCount = _db.Instance.Queryable <TWMOtherCountDbModel>().
                                 Select(p => new InAndOutModel()
                {
                    MaterialId   = p.MaterialId,
                    WarehouseId  = p.WarehouseId,
                    WhNumber     = p.WhNumber,
                    WhSendNumber = p.WhSendNumber
                });

                //盘亏盘盈出入库
                var pCount = _db.Instance.Queryable <TWMProfitDeficitCountDbModel>().
                             Select(p => new InAndOutModel()
                {
                    MaterialId   = p.MaterialId,
                    WarehouseId  = p.WarehouseId,
                    WhNumber     = p.WhNumber,
                    WhSendNumber = p.WhSendNumber
                });

                //销售出入库
                var SaleCount = _db.Instance.Queryable <TWMSalesCountDbModel>().
                                Select(p => new InAndOutModel()
                {
                    MaterialId   = p.MaterialId,
                    WarehouseId  = p.WarehouseId,
                    WhNumber     = p.WhNumber,
                    WhSendNumber = p.WhSendNumber
                });

                //采购出入库
                var PurchaseCount = _db.Instance.Queryable <TWMPurchaseCountDbModel>().
                                    Select(p => new InAndOutModel()
                {
                    MaterialId   = p.MaterialId,
                    WarehouseId  = p.WarehouseId,
                    WhNumber     = p.WhNumber,
                    WhSendNumber = p.WhSendNumber
                });

                //生产出入库
                var ProductCount = _db.Instance.Queryable <TWMProductionCountDbModel>().
                                   Select(p => new InAndOutModel()
                {
                    MaterialId   = p.MaterialId,
                    WarehouseId  = p.WarehouseId,
                    WhNumber     = p.WhNumber,
                    WhSendNumber = p.WhSendNumber
                });

                //出入库数量
                var allCount = _db.Instance.UnionAll(otherCount, pCount, SaleCount, PurchaseCount, ProductCount).GroupBy(p => new { p.MaterialId }).
                               Select(p => new TradeInventoryModel()
                {
                    TradeNumber = SqlFunc.AggregateSum(p.WhNumber) - SqlFunc.AggregateSum(p.WhSendNumber),
                    MaterialId  = p.MaterialId,
                }).AS("t100");

                var materialFileQuery = _db.Instance.Queryable <TMMProductionOrderBOMSumDbModel>().Where(p => p.ProOrderId == orderID);

                var ts = _db.Instance.Queryable(materialFileQuery, allCount, JoinType.Inner, (p1, p2) => p1.MaterialId == p2.MaterialId).Select((p1, p2) => new InventoryOut
                {
                    MaterialId = p2.MaterialId,
                    Amount     = p2.TradeNumber
                });

                //销售单 所有物料的出入库数量
                var tsout1 = ts.ToList();
                var tsOut  = tsout1.GroupBy(p => p.MaterialId).Select(p => new InventoryOut()
                {
                    MaterialId = p.Key, Amount = p.Sum(m => m.Amount)
                }).ToList();

                #region 待出库数量

                //其他待出库
                var otherToOut = _db.Instance.Queryable <TWMOtherWhSendMainDbModel, TWMOtherWhSendDetailDbModel>((t1, t2) =>
                                                                                                                 new object[] { JoinType.Inner, t1.ID == t2.MainId }).Where((t1, t2) =>
                                                                                                                                                                            t1.AuditStatus != 2 &&
                                                                                                                                                                            t1.DeleteFlag == false).Select((t1, t2) => new InventoryOut {
                    MaterialId = t2.MaterialId, Amount = t2.ActualNumber
                });

                //盘亏出库
                var deficitToOut = _db.Instance.Queryable <TWMDeficitMainDbModel, TWMDeficitDetailDbModel>((t1, t2) =>
                                                                                                           new object[] { JoinType.Inner, t1.ID == t2.MainId }).Where((t1, t2) =>
                                                                                                                                                                      t1.AuditStatus != 2 &&
                                                                                                                                                                      t1.DeleteFlag == false).Select((t1, t2) => new InventoryOut {
                    MaterialId = t2.MaterialId, Amount = t2.ActualNumber
                });

                //销售出库
                var saleToOut = _db.Instance.Queryable <TWMSalesMainDbModel, TWMSalesDetailDbModel>((t1, t2) =>
                                                                                                    new object[] { JoinType.Inner, t1.ID == t2.MainId }).Where((t1, t2) =>
                                                                                                                                                               t1.AuditStatus != 2 &&
                                                                                                                                                               t1.DeleteFlag == false).Select((t1, t2) => new InventoryOut {
                    MaterialId = t2.MaterialId, Amount = t2.ActualNum
                });

                //生产待出库
                var productToOut = _db.Instance.Queryable <TWMProductionMainDbModel, TWMProductionDetailDbModel>((t1, t2) =>
                                                                                                                 new object[] { JoinType.Inner, t1.ID == t2.MainId }).Where((t1, t2) =>
                                                                                                                                                                            t1.AuditStatus != 2 &&
                                                                                                                                                                            t1.DeleteFlag == false).Select((t1, t2) => new InventoryOut {
                    MaterialId = t2.MaterialId, Amount = t2.ActualNum
                });

                var allToOut = _db.Instance.UnionAll(otherToOut, deficitToOut, saleToOut, productToOut).AS("t101");

                var materialFileQuery1 = _db.Instance.Queryable <TMMProductionOrderBOMSumDbModel>().Where(p => p.ProOrderId == orderID);

                var tsToOut = _db.Instance.Queryable(materialFileQuery1, allToOut, JoinType.Inner, (p1, p2) => p1.ID == p2.MaterialId).Select((p1, p2) => new InventoryOut
                {
                    MaterialId = p2.MaterialId,
                    Amount     = p2.Amount
                });



                //销售单所有物料的待出库数量
                var tsToOutSum = tsToOut.ToList().GroupBy(p => p.MaterialId).Select(p => new InventoryOut()
                {
                    MaterialId = p.Key, Amount = p.Sum(m => m.Amount)
                }).ToList();


                #endregion

                //期初
                List <InventoryOut> prime = _db.Instance.Queryable <TMMProductionOrderBOMSumDbModel, TWMPrimeCountDbModel>((t, t1) => new object[] {
                    JoinType.Inner, t.MaterialId == t1.MaterialId
                }).Select((t, t1) => t1).Distinct().ToList().GroupBy(p => p.MaterialId).Select(p => new InventoryOut()
                {
                    MaterialId = p.Key, Amount = p.Sum(m => m.PrimeNum)
                }).ToList();;


                var Allmaterial = _db.Instance.Queryable <TMMProductionOrderBOMSumDbModel>().Where(p => p.ProOrderId == orderID).ToList();


                Dictionary <int, string> colorSolution = _db.Instance.Queryable <TMMColorSolutionMainDbModel, TBMPackageDbModel>((t1, t2) =>
                                                                                                                                 new object[] { JoinType.Inner, t1.PackageId == t2.ID }).
                                                         Where((t1, t2) => t2.CompanyId == currentUser.CompanyID).ToList().ToDictionary(p => p.ID, p => p.SolutionCode);

                List <int> colorIDS = colorSolution.Keys.ToList();

                //生产订单的所有物料
                List <TMMProductionOrderBOMSumDbModel> sumList = _db.Instance.Queryable <TMMProductionOrderBOMSumDbModel>().Where(p => p.ProOrderId == orderID).ToList();


                foreach (var item in sumList)
                {
                    decimal primeAmount = 0; //期初数量
                    decimal TradeNumber = 0; //出入库数量
                    decimal toOutAmount = 0; //待出数量

                    TBMMaterialFileCacheModel materialFile = MMaterialList.Where(p => p.ID == item.MaterialId).FirstOrDefault();
                    if (materialFile == null)
                    {
                        throw new Exception($"物料ID:{item.MaterialId},不存在");
                    }


                    InventoryOut primeEntity = prime.Where(p => p.MaterialId == item.MaterialId).FirstOrDefault();
                    if (primeEntity != null)
                    {
                        primeAmount = primeEntity.Amount;
                    }


                    InventoryOut tradeEntity = tsOut.Where(p => p.MaterialId == item.MaterialId).FirstOrDefault();
                    if (tradeEntity != null)
                    {
                        TradeNumber = tradeEntity.Amount;
                    }

                    InventoryOut toOutEntity = tsToOutSum.Where(p => p.MaterialId == item.MaterialId).FirstOrDefault();
                    if (toOutEntity != null)
                    {
                        toOutAmount = toOutEntity.Amount;
                    }

                    decimal avaibleAmountUnit = primeAmount + TradeNumber - toOutAmount;                                                   //仓库数量

                    decimal avaibleAmount = UnitChange.TranserUnit(materialFile, UnitType.Warehouse, UnitType.Produce, avaibleAmountUnit); //生产数量

                    if (avaibleAmount >= item.TotalValue)
                    {
                        item.PurchaseNum = 0;
                        item.PickNum     = item.TotalValue;
                    }
                    else
                    {
                        if (avaibleAmount < 0)
                        {
                            avaibleAmount = 0;
                        }
                        item.PurchaseNum = item.TotalValue - avaibleAmount;
                        item.PickNum     = avaibleAmount;
                    }

                    item.PurchaseTransNum = 0;
                    item.PickTransNum     = 0;
                }

                if (sumList.Count() > 0)
                {
                    _db.Instance.Updateable(sumList).ExecuteCommand();
                }

                mainEntity.MRPStatus = true;
                mainEntity.MRPTime   = DateTime.Now;

                _db.Instance.Updateable(mainEntity).UpdateColumns(p => new { p.MRPStatus, p.MRPTime }).ExecuteCommand();

                _db.Instance.CommitTran();

                MrpResultModel bomList;
                if (Type == 1)
                {
                    bomList = GetProcuctBomByOrderID(orderID, currentUser);
                }
                else
                {
                    bomList = GetProcuctBomByOrderID(orderID, currentUser);
                }
                return(ResponseUtil <MrpResultModel> .SuccessResult(bomList));
            }
            catch (Exception ex)
            {
                _db.Instance.RollbackTran();
                return(ResponseUtil <MrpResultModel> .FailResult(null, ex.Message));
            }
        }
        /// <summary>
        /// 修改T_SSM_SalesOrderMain数据
        /// </summary>
        /// <param name="requestObject">Put请求参数</param>
        /// <returns>返回响应结果对象,包括响应代码,修改操作结果</returns>
        public async Task <ResponseObject <bool> > PutAsync(RequestPut <TSSMSalesOrderMainEditModel> requestObject, CurrentUser currentUser)
        {
            var currDb = _db.Instance;//事务需要使用同一个 SqlSugarClient对象实例

            try
            {
                if (requestObject.PostData == null)
                {
                    return(ResponseUtil <bool> .FailResult(false, "PostData不能为null"));
                }
                if (requestObject.PostData.ChildList == null || requestObject.PostData.ChildList.Count < 1)
                {
                    return(ResponseUtil <bool> .FailResult(false, "PostData.ChildList至少包含一条数据"));
                }
                //开启事务
                currDb.BeginTran();
                //修改主表信息
                var mainModel = _mapper.Map <TSSMSalesOrderMainDbModel>(requestObject.PostData);
                mainModel.SalesNum    = requestObject.PostData.ChildList.Sum(p => p.SalesNum);
                mainModel.SalesAmount = requestObject.PostData.ChildList.Sum(p => p.SalesAmount);
                var mainFlag = await currDb.Updateable(mainModel)
                               .UpdateColumns(p => new
                {
                    p.CustomerId,
                    p.SalesmanId,
                    p.OrderTypeId,
                    p.SettlementTypeId,
                    p.ReceiptAddress,
                    p.OrderDate,
                    p.ContactName,
                    p.ContactNumber,
                    p.SalesAmount,
                    p.SalesNum
                })
                               .Where(p => (SqlFunc.IsNullOrEmpty(p.AuditStatus) || p.AuditStatus != 2) && p.ID == mainModel.ID)
                               .ExecuteCommandAsync() > 0;

                /*
                 * 修改明细逻辑
                 * 1.根据主单ID查询现有明细数据
                 * 2.PostData.ChildList中明细ID <= 0的新增
                 * 3.PostData.ChildList中明细ID > 0的修改
                 * 4.删除不在PostData.CihldList中的数据
                 */
                var detailFlag   = true;
                var detailModels = _mapper.Map <List <TSSMSalesOrderDetailEditModel>,
                                                List <TSSMSalesOrderDetailDbModel> >(requestObject.PostData.ChildList);

                var cache = BasicCacheGet.GetMaterial(currentUser);
                detailModels.ForEach(x =>
                {
                    TBMMaterialFileCacheModel tBMMaterialFileCacheModel = GetMaterialFileByPackageColor(cache, currentUser, x.PackageId, x.ColorSolutionId);
                    x.MaterialId = tBMMaterialFileCacheModel.ID;
                });

                foreach (var item in detailModels)
                {
                    if (!detailFlag)
                    {
                        break;
                    }
                    item.MainId = mainModel.ID;
                    //新增或修改明细数据
                    detailFlag = item.ID <= 0
                        ? await currDb.Insertable(item).ExecuteCommandIdentityIntoEntityAsync()
                        : await currDb.Updateable(item).ExecuteCommandAsync() > 0;
                }

                //删除明细数据
                if (detailFlag)
                {
                    var detailIds = detailModels.Select(p => p.ID).ToList();
                    detailFlag = currDb.Deleteable <TSSMSalesOrderDetailDbModel>()
                                 .Where(p => !detailIds.Contains(p.ID) && p.MainId == mainModel.ID)
                                 .ExecuteCommand() >= 0;
                }

                var detailModelLists = _db.Instance.Queryable <TSSMSalesOrderDetailDbModel>().Where(p => p.MainId == requestObject.PostData.ID).ToList();

                var groupEntity = from p in detailModelLists
                                  group p by new { p.GoodsCode, p.GoodsName, p.MaterialId } into g
                    select new { g.Key, MaxPrice = g.Max(p => p.UnitPrice), MinPrice = g.Min(p => p.UnitPrice) };

                var differentEntity = groupEntity.Where(p => p.MaxPrice != p.MinPrice).ToList();


                if (differentEntity.Count() > 0)
                {
                    string error = string.Join(",", differentEntity.Select(p => p.Key.GoodsCode));
                    throw new Exception($"{error}商品的单价不一致,请保证相同商品价格一致性");
                }

                //提交事务
                currDb.CommitTran();
                //返回执行结果
                return(mainFlag && detailFlag ? ResponseUtil <bool> .SuccessResult(true) : ResponseUtil <bool> .FailResult(false, "修改数据失败!"));
            }
            catch (Exception ex)
            {
                //回滚事务
                currDb.RollbackTran();
                //返回异常结果
                return(ResponseUtil <bool> .FailResult(false, ex.Message));
            }
        }
        /// <summary>
        /// 新增T_SSM_SalesOrderMain数据
        /// </summary>
        /// <param name="requestObject">Post请求参数</param>
        /// <param name="currentUser">当前操作用户</param>
        /// <returns>返回响应结果对象,包括响应代码,新增操作结果</returns>
        public async Task <ResponseObject <TSSMSalesOrderMainQueryModel> > PostAsync(RequestPost <TSSMSalesOrderMainAddModel> requestObject, CurrentUser currentUser)
        {
            var currDb = _db.Instance;//事务需要使用同一个 SqlSugarClient对象实例

            try
            {
                //没有新增数据,返回错误信息
                if (requestObject.PostData == null)
                {
                    return(ResponseUtil <TSSMSalesOrderMainQueryModel> .FailResult(null, "PostData不能为null"));
                }
                //开启事务
                currDb.BeginTran();
                //插入主表数据
                var mapMainModel = _mapper.Map <TSSMSalesOrderMainDbModel>(requestObject.PostData);
                mapMainModel.OperatorId  = currentUser.UserID;
                mapMainModel.CompanyId   = currentUser.CompanyID;
                mapMainModel.SalesNum    = requestObject.PostData.ChildList.Sum(p => p.SalesNum);
                mapMainModel.SalesAmount = requestObject.PostData.ChildList.Sum(p => p.SalesAmount);
                var mainId = await currDb.Insertable(mapMainModel).ExecuteReturnIdentityAsync();

                //更新明细表外键ID值
                requestObject.PostData.ChildList.ForEach(p => p.MainId = mainId);
                //插入从表数据
                var mapDetailModelList = _mapper.Map <List <TSSMSalesOrderDetailAddModel>, List <TSSMSalesOrderDetailDbModel> >(requestObject.PostData.ChildList);

                var cache = BasicCacheGet.GetMaterial(currentUser);
                mapDetailModelList.ForEach(x =>
                {
                    TBMMaterialFileCacheModel tBMMaterialFileCacheModel = GetMaterialFileByPackageColor(cache, currentUser, x.PackageId, x.ColorSolutionId);
                    x.MaterialId = tBMMaterialFileCacheModel.ID;
                });

                var groupEntity = from p in mapDetailModelList
                                  group p by new { p.GoodsCode, p.GoodsName, p.MaterialId } into g
                    select new{ g.Key, MaxPrice = g.Max(p => p.UnitPrice), MinPrice = g.Min(p => p.UnitPrice) };

                var differentEntity = groupEntity.Where(p => p.MaxPrice != p.MinPrice).ToList();


                if (differentEntity.Count() > 0)
                {
                    string error = string.Join(",", differentEntity.Select(p => p.Key.GoodsCode));
                    throw new Exception($"{error}商品的单价不一致,请保证相同商品价格一致性");
                }

                var result = await currDb.Insertable(mapDetailModelList).ExecuteCommandAsync() > 0;

                //提交事务
                currDb.CommitTran();
                TSSMSalesOrderMainQueryModel returnObject = null;
                if (result)
                {
                    returnObject = await GetMainQueryModel(mainId);
                }
                //返回执行结果
                return(result
                    ? ResponseUtil <TSSMSalesOrderMainQueryModel> .SuccessResult(returnObject)
                    : ResponseUtil <TSSMSalesOrderMainQueryModel> .FailResult(null, "新增数据失败!"));
            }
            catch (Exception ex)
            {
                //回滚事务
                currDb.RollbackTran();
                //返回异常结果
                return(ResponseUtil <TSSMSalesOrderMainQueryModel> .FailResult(null, ex.Message));
            }
        }
        public async Task <ResponseObject <TWMSalesMainQueryModel> > GetWholeMainData(int iMainId, CurrentUser currentUser)
        {
            try
            {
                RequestGet requestGet = new RequestGet()
                {
                    IsPaging        = false,
                    QueryConditions = new List <QueryCondition>()
                    {
                        new QueryCondition()
                        {
                            Column = "Id", Condition = ConditionEnum.Equal, Content = iMainId.ToString()
                        }
                    }
                };

                var allMain = await GetMainListAsync(requestGet, currentUser);


                var mainModel = allMain.Data.FirstOrDefault();



                var detailModelsSql = _db.Instance.Queryable <TWMSalesDetailDbModel, TBMMaterialFileDbModel, TBMDictionaryTypeDbModel,
                                                              TBMDictionaryDbModel, TBMDictionaryDbModel, TBMDictionaryDbModel, TWMSalesMainDbModel, TSSMSalesOrderDetailDbModel
                                                              , TBMPackageDbModel, TMMColorSolutionMainDbModel>(
                    (t, t0, t1, t2, t3, t4, t5, t6, t7, t8) => new object[]
                {
                    JoinType.Left, t.MaterialId == t0.ID,
                    JoinType.Left, t0.MaterialTypeId == t1.ID,
                    JoinType.Left, t0.ColorId == t2.ID,
                    JoinType.Left, t0.BaseUnitId == t3.ID,
                    JoinType.Left, t0.WarehouseUnitId == t4.ID,
                    JoinType.Inner, t.MainId == t5.ID,
                    JoinType.Inner, t.SalesOrderDetailId == t6.ID,
                    JoinType.Left, t0.PackageID == t7.ID,
                    JoinType.Left, t6.ColorSolutionId == t8.ID
                })
                                      .Select((t, t0, t1, t2, t3, t4, t5, t6, t7, t8) => new TWMSalesDetailQueryModel
                {
                    ID                  = t.ID,
                    MainId              = t.MainId,
                    MaterialId          = t.MaterialId,
                    MaterialName        = t0.MaterialName,
                    MaterialCode        = t0.MaterialCode,
                    WarehouseId         = t.WarehouseId,
                    ActualNum           = t.ActualNum,
                    SalesOrderActualNum = t.SalesOrderActualNum,
                    SalesOrderDetailId  = t.SalesOrderDetailId,
                    UnitPrice           = t.UnitPrice,
                    Amount              = t.Amount,
                    MaterialTypeId      = t0.MaterialTypeId,
                    MaterialTypeName    = t1.TypeName,
                    ColorId             = t0.ColorId,
                    ColorName           = t2.DicValue,
                    BaseUnitId          = t0.BaseUnitId,
                    BaseUnitName        = t3.DicValue,
                    WarehouseUnitId     = t0.WarehouseUnitId,
                    WarehouseUnitName   = SqlFunc.IsNullOrEmpty(t4.ID) ? t3.DicValue : t4.DicValue,
                    SalesUnitId         = t0.SalesUnitId,
                    SalesRate           = t0.SalesRate,
                    WarehouseRate       = t0.WarehouseRate,
                    Spec                = t0.Spec,
                    Remark              = t.Remark,
                    SalesNum            = t6.SalesNum,
                    ShouldSaleNum       = t6.TransferNum,
                    PackageCode         = t7.DicCode,
                    PackageName         = t7.DicValue,
                    ColorSolutionName   = t8.SolutionCode
                })
                                      .Where(t => t.MainId == iMainId).OrderBy(t => t.ID);

                var detailModels = await detailModelsSql.ToListAsync();

                //物料
                List <TBMMaterialFileCacheModel> mList = BasicCacheGet.GetMaterial(currentUser);

                detailModels.ForEach(p =>
                {
                    TBMMaterialFileCacheModel me = mList.Where(x => x.ID == p.MaterialId).FirstOrDefault();
                    if (me == null)
                    {
                        throw new Exception($"物料{p.MaterialId},不存在");
                    }

                    TWMStaQuery tWMStaQuery = new TWMStaQuery();
                    tWMStaQuery.MaterialId  = p.MaterialId;
                    tWMStaQuery.WarehouseId = p.WarehouseId;


                    if (mainModel.AuditStatus != 2)
                    {
                        //p.WaitNum = p.WaitNum - p.ActualNum;

                        tWMStaQuery.EditID      = mainModel.ID;
                        tWMStaQuery.OperateType = OperateEnum.Sale;
                        // p.ShouldNum = p.SalesOrderActualNum + p.ActualNum;
                        p.ShouldSaleNum = p.ShouldSaleNum + p.SalesOrderActualNum;
                    }


                    p.SalesNumOnInventory = GetInveroryFromSaleNum(me, p.SalesNum);

                    p.AvailableNum = _staticInventory.GeTWMCountModel(tWMStaQuery).AvaiableNum;
                });

                mainModel.ChildList = detailModels;
                return(ResponseUtil <TWMSalesMainQueryModel> .SuccessResult(mainModel));
            }
            catch (Exception ex)
            {
                return(ResponseUtil <TWMSalesMainQueryModel> .FailResult(null));
            }
        }