/// <summary>
        /// @xis 添加入库单详情
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task <SVResult <int> > AddStockDetails(t_stock_in_detail model)
        {
            SVResult <int> res = new SVResult <int> {
                state = false
            };

            //添加的产品为冻结
            if (model.quantity <= 0)
            {
                res.code = ErrorCodeConst.ERROR_1043;
                return(res);
            }

            string sql = g_sqlMaker.Insert <t_stock_in_detail>(i => new
            {
                i.order_sn,
                i.unit_price,
                i.quantity,
                i.stock_id,
                i.batch_number,
                i.expiration_date,
                i.factory_id,
                i.instructions,
                i.material_number,
                i.model_number,
                i.package_size,
                i.product_name,
                i.report_card_url,
                i.retest_date,
                i.spare_parts,
                i.unit_name
            }).ToSQL();

            int id = await g_dbHelper.ExecScalarAsync <int>(sql, model);

            if (id <= 0)
            {
                res.code = ErrorCodeConst.ERROR_1018;
                return(res);
            }

            res.state = true;
            res.data  = id;
            return(res);
        }
        /// <summary>
        /// @xis 入库申请
        /// </summary>
        /// <param name="reqmodel"></param>
        /// <returns></returns>
        public async Task <Result> StockInApplyAsync(reqmodel <StockInApplyModel> reqmodel)
        {
            const string modelname = "StockServerImpl.StockInApplyAsync";
            Result       result    = new Result {
                code = ErrorCodeConst.ERROR_1037, status = ErrorCodeConst.ERROR_403
            };

            //入库单
            t_stock_in stock_in = new t_stock_in
            {
                apply_status  = (int)EnumApplyStatus.Progress,
                in_user_id    = reqmodel.User.user_id,
                department_id = reqmodel.User.department_id,
                position_id   = reqmodel.User.position_id,
                status        = (int)EnumStatus.Enable,
                order_sn      = MakeOrderSn("IN"),
                apply_process = reqmodel.User.position_id,
                add_time      = DateTime.Now
            };

            List <t_stock_in_detail> stock_detail_list = new List <t_stock_in_detail>();
            List <t_stock>           stock_add_list    = new List <t_stock>();
            List <t_stock>           stock_update_list = new List <t_stock>();

            #region 数据验证
            if (reqmodel.Data.products.Count == 0)
            {
                result.code = ErrorCodeConst.ERROR_1042;
                return(result);
            }

            #endregion

            List <t_stock> stock_info_list = await GetStockByIds(s => new { s.id, s.freeze_quantity, s.rv }, reqmodel.Data.products.Select(s => s.id));

            //检查库存
            foreach (var item in reqmodel.Data.products)
            {
                //更新库存
                t_stock es_stock = stock_info_list.FirstOrDefault(f => f.id == item.id);
                if (es_stock != null)
                {
                    //添加已有的详细信息
                    stock_detail_list.Add(new t_stock_in_detail
                    {
                        order_sn        = stock_in.order_sn,
                        unit_price      = item.unit_price,
                        stock_id        = item.id,
                        quantity        = item.quantity,
                        batch_number    = item.batch_number,
                        expiration_date = item.expiration_date,
                        instructions    = item.instructions,
                        material_number = item.material_number,
                        model_number    = item.model_number,
                        package_size    = item.package_size,
                        product_name    = item.product_name,
                        report_card_url = item.report_card_url,
                        retest_date     = item.retest_date,
                        spare_parts     = item.spare_parts,
                        unit_name       = item.unit_name,
                        factory_id      = item.factory_id
                    });
                    continue;
                }
                //添加新产品
                stock_add_list.Add(new t_stock
                {
                    add_time        = DateTime.Now,
                    batch_number    = item.batch_number,
                    expiration_date = item.expiration_date,
                    instructions    = item.instructions,
                    material_number = item.material_number,
                    model_number    = item.model_number,
                    package_size    = item.package_size,
                    product_name    = item.product_name,
                    report_card_url = item.report_card_url,
                    retest_date     = item.retest_date,
                    spare_parts     = item.spare_parts,
                    state           = (int)EnumState.Normal,
                    status          = (int)EnumStatus.Enable,
                    unit_price      = item.unit_price,
                    util_name       = item.unit_name,
                    quantity        = item.quantity,//在详情处清0
                    freeze_quantity = 0,
                    factory_id      = item.factory_id
                });
            }

            try
            {
                g_dbHelper.Transaction();
                bool insert_stock_in = await AddStockInAsync(stock_in) > 0;

                if (!insert_stock_in)
                {
                    g_dbHelper.Rollback();
                    result.code = ErrorCodeConst.ERROR_1030;
                    g_logServer.Log(modelname, "入库单申请失败", $"用户:{reqmodel.User.user_name},添加入库单失败", models.enums.EnumLogType.Info);
                    return(result);
                }
                if (stock_add_list.Count > 0)
                {
                    foreach (var item in stock_add_list)
                    {
                        decimal quantity = item.quantity;
                        item.quantity = 0;
                        SVResult <int> add_result = await AddStock(item);

                        if (!add_result.state)
                        {
                            g_dbHelper.Rollback();
                            result.code = add_result.code;
                            g_logServer.Log(modelname, "入库单申请失败", $"用户:{reqmodel.User.user_name},添加新库存失败", models.enums.EnumLogType.Info);
                            return(result);
                        }

                        stock_detail_list.Add(new t_stock_in_detail
                        {
                            order_sn        = stock_in.order_sn,
                            stock_id        = add_result.data,
                            batch_number    = item.batch_number,
                            expiration_date = item.expiration_date,
                            factory_id      = item.factory_id,
                            instructions    = item.instructions,
                            material_number = item.material_number,
                            model_number    = item.model_number,
                            package_size    = item.package_size,
                            product_name    = item.product_name,
                            report_card_url = item.report_card_url,
                            retest_date     = item.retest_date,
                            spare_parts     = item.spare_parts,
                            unit_name       = item.util_name,
                            quantity        = quantity,
                            unit_price      = item.unit_price,
                        });
                    }
                }

                //if (stock_info_list.Count > 0)
                //{
                //    bool update_stock = await UpdateStock(u => new { u.freeze_quantity }, stock_info_list);
                //    if (!update_stock)
                //    {
                //        g_dbHelper.Rollback();
                //        result.code = ErrorCodeConst.ERROR_1030;
                //        g_logServer.Log(modelname, "入库单申请失败", $"用户:{reqmodel.User.user_name},更新库存失败", models.enums.EnumLogType.Info);
                //        return result;
                //    }
                //}

                SVResult <int> insert_stock_dtl_flag = await AddStockDetails(stock_detail_list);

                if (!insert_stock_dtl_flag.state)
                {
                    g_dbHelper.Rollback();
                    result.code = insert_stock_dtl_flag.code;
                    g_logServer.Log(modelname, "入库单申请失败", $"用户:{reqmodel.User.user_name},更新入库单详情失败", models.enums.EnumLogType.Info);
                    return(result);
                }

                g_dbHelper.Commit();
            }
            catch (Exception e)
            {
                g_dbHelper.Rollback();
                g_logServer.Log(modelname, "入库单申请失败", $"用户:{reqmodel.User.user_name},错误信息:{e.Message}", models.enums.EnumLogType.Error);
                return(result);
            }

            result.code   = ErrorCodeConst.ERROR_1036;
            result.status = ErrorCodeConst.ERROR_200;
            g_logServer.Log(modelname, "入库单申请成功", $"用户:{reqmodel.User.user_name},订单号:{stock_in.order_sn}", models.enums.EnumLogType.Info);
            return(result);
        }
        /// <summary>
        /// @xis 添加库存
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task <SVResult <int> > AddStock(t_stock model)
        {
            SVResult <int> res = new SVResult <int> {
                state = false
            };

            string sql_insert = g_sqlMaker.Insert <t_stock>(i => new
            {
                i.batch_number,
                i.expiration_date,
                i.factory_id,
                i.freeze_quantity,
                i.instructions,
                i.material_number,
                i.model_number,
                i.package_size,
                i.product_name,
                i.quantity,
                i.remark,
                i.report_card_url,
                i.retest_date,
                i.spare_parts,
                i.state,
                i.status,
                i.unit_price,
                i.util_name
            }).ToSQL();

            //验证
            if (string.IsNullOrWhiteSpace(model.product_name))
            {
                res.code = ErrorCodeConst.ERROR_1044;
                return(res);
            }

            if (model.product_name.Length > 30)
            {
                res.code = ErrorCodeConst.ERROR_1046;
                return(res);
            }

            if (model.factory_id <= 0)
            {
                res.code = ErrorCodeConst.ERROR_1045;
                return(res);
            }
            IFactoryServer factoryServer = new FactoryServerImpl(g_dbHelper, g_logServer);
            t_factory      factory_model = await factoryServer.GetFactoryByIdEnable(g => new { g.id }, model.factory_id);

            if (factory_model == null)
            {
                res.code = ErrorCodeConst.ERROR_1045;
                return(res);
            }

            int id = await g_dbHelper.ExecScalarAsync <int>(sql_insert, model);

            if (id <= 0)
            {
                res.code = ErrorCodeConst.ERROR_1018;
                return(res);
            }
            res.data  = id;
            res.state = true;
            return(res);
        }