abp(net core)+easyui+efcore实现仓储管理系统目录

abp(net core)+easyui+efcore实现仓储管理系统——EasyUI前端页面框架 (十八)

 
 
 

五、使用存储过程创建单号

1. 在Visual Studio 2017的“解决方案资源管理器”中,右键单击“ABP.TPLMS.Core”项目的“IRepositories”文件夹,在弹出菜单中选择“添加” > “类”。如下图。

2.在弹出对话框中选择“接口”, 将接口命名为 IOutStockOrderRepository,然后选择“添加”。如下图。

3.在IOutStockOrderRepository接口定义我们需要用到的方法,代码如下。

using Abp.Dependency;
using Abp.Domain.Repositories;
using ABP.TPLMS.Entitys;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text; namespace ABP.TPLMS.IRepositories
{ public interface IOutStockOrderRepository: IRepository<OutStockOrder, int>, ITransientDependency
{ DbCommand CreateCommand(string commandText, CommandType commandType, params object[] parameters); /// <summary>
/// 创建单号
/// </summary>
/// <param name="name">单证名称代码</param>
/// <returns></returns>
string GetNo(string name); /// <summary>
/// 导入入库货物信息
/// </summary>
/// <param name="ids">导入库单的ID集合</param>
/// <param name="no">单号</param>
void ImportInStockOrder(string ids, string no); }
}

4. 在Visual Studio 2017的“解决方案资源管理器”中,右键单击“ABP.TPLMS.EntityFrameworkCore”项目的“Repositories”文件夹,在弹出菜单中选择“添加” >  “类”, 将类命名为 OutStockOrderRepository,并继承IOutStockOrderRepository接口。实现接口中的方法。代码如下。

using Abp.Data;
using Abp.Dependency;
using Abp.EntityFrameworkCore;
using ABP.TPLMS.Entitys;
using ABP.TPLMS.IRepositories;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Text; namespace ABP.TPLMS.EntityFrameworkCore.Repositories
{ public class OutStockOrderRepository: TPLMSRepositoryBase<OutStockOrder, int>, IOutStockOrderRepository, ITransientDependency
{ private readonly IActiveTransactionProvider _transactionProvider; public OutStockOrderRepository(IDbContextProvider<TPLMSDbContext> dbContextProvider) : base(dbContextProvider)
{ } protected OutStockOrderRepository(IDbContextProvider<TPLMSDbContext> dbContextProvider,
IActiveTransactionProvider transactionProvider)
: base(dbContextProvider)
{ _transactionProvider = transactionProvider; } public DbCommand CreateCommand(string commandText, CommandType commandType, params SqlParameter[] parameters)
{ EnsureConnectionOpen();
var dbFacade = Context.Database;
var connection = Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetDbConnection(dbFacade); var command = connection.CreateCommand();
command.CommandText = commandText;
command.CommandType = commandType;
command.Transaction = GetActiveTransaction();
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter);
} return command;
} DbCommand IOutStockOrderRepository.CreateCommand(string commandText, CommandType commandType, params object[] parameters)
{ EnsureConnectionOpen();
var dbFacade = Context.Database;
var connection = Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetDbConnection(dbFacade); var command = connection.CreateCommand();
command.CommandText = commandText;
command.CommandType = commandType;
command.Transaction = GetActiveTransaction();
foreach (var parameter in parameters)
{
command.Parameters.Add(parameter);
} return command;
} private void EnsureConnectionOpen()
{ var dbFacade = Context.Database;
var connection = Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetDbConnection(dbFacade); if (connection.State != ConnectionState.Open)
{ connection.Open();
} } private DbTransaction GetActiveTransaction()
{ return (DbTransaction)_transactionProvider.GetActiveTransaction(new ActiveTransactionProviderArgs
{ {"ContextType", typeof(TPLMSDbContext) },
{"MultiTenancySide", MultiTenancySide }
}); } string IOutStockOrderRepository.GetNo(string name)
{ SqlParameter[] parameters = {
new SqlParameter("Name",System.Data.SqlDbType.NVarChar,10),
new SqlParameter("BH", System.Data.SqlDbType.NVarChar,20)
}; parameters[0].Value = name;
parameters[1].Direction = System.Data.ParameterDirection.Output;
int cnt = Context.Database.ExecuteSqlCommand( "EXEC p_NextBH @Name, @BH output",
parameters); string no = parameters[1].Value.ToString();
if (cnt < 0)
{
no = string.Empty;
} return no;
} void IOutStockOrderRepository.ImportInStockOrder(string ids, string no)
{
SqlParameter[] parameters = { new SqlParameter("id",System.Data.SqlDbType.VarChar,500),
new SqlParameter("No", System.Data.SqlDbType.NVarChar,20) }; parameters[0].Value = ids + ",";
parameters[1].Value = no; int cnt = Context.Database.ExecuteSqlCommand(
"EXEC SP_ImportInStockOrder2ODO @id, @No",
parameters);
} }
}

5. 在这里我一共使用了两个存储过程,p_NextBH 与SP_ImportInStockOrder2ODO。其中p_NextBH在入库单管理中已经介绍过了。

6. 在这里介绍一下SP_ImportInStockOrder2ODO这个存储过程的实现,代码如下:

Create Proc [dbo].[SP_ImportInStockOrder2ODO]
@id varchar(500), --id组合
@No nvarchar(20) --编号
as CREATE TABLE #IdTable(Id int NULL) DECLARE @str VARCHAR(1000)
DECLARE @x xml select @str=@id
insert #IdTable
SELECT convert(int,id) id
FROM (SELECT [value] = CONVERT(XML,'<v>' +REPLACE(@str,',' ,'</v><v>')+ '</v>')) A
OUTER APPLY ( SELECT id = N.v.value('.' , 'varchar(100)')
FROM A.[value].nodes('/v') N (v)
) B DECLARE @BH nvarchar(20),@batch varchar(20),@maxseqno int
select @BH=@No
select @maxseqno=isnull(MAX(seqno),0) from [InStockOrderDetail] where InStockNo= @BH INSERT INTO [dbo].[OutStockOrderDetail]
([OutStockNo],[SupplierId],[CargoCode],[HSCode],[CargoName],[Spcf]
,[Unit],[Country],[Brand] ,[Curr],[Package],[Length],[Width],[Height],[Qty]
,[Vol],[LawfQty],[SecdLawfQty],[Price],[TotalAmt],[GrossWt],[NetWt]
,[LawfUnit] ,[SecdLawfUnit],[Batch],[InStockOrderDetailLocId],[Loc],[CreationTime]) SELECT @BH,supplierid,[CargoCode],[HSCode],[CargoName],[Spcf]
,[Unit],[Country],[Brand],[Curr] ,[Package],[Length],[Width],[Height],0 [Qty]
,[Vol] ,0 [LawfQty], 0 [SecdLawfQty] ,[Price],0 [TotalAmt],[GrossWt],[NetWt]
,'' [LawfUnit],'' [SecdLawfUnit],batch,id,loc,getdate() FROM
(select row_number() OVER ( order by b.id) seqno,a.supplierid,[CargoCode],[HSCode]
,[CargoName],[Spcf]
,[Unit],[Country],[Brand],[Curr] ,[Package],[Length],[Width],[Height],0 [Qty]
,[Vol] ,0 [LawfQty], 0 [SecdLawfQty] ,[Price],0 [TotalAmt],[GrossWt],[NetWt]
,'' [LawfUnit],'' [SecdLawfUnit],b.id,b.loc,Batch
from [dbo].InStockOrderDetail a inner join InStockOrderDetailLoc b
on a.Id=b.InStockOrderDetailId
left join (select InStockOrderDetailLocId,SUM(isnull(qty,0)) as qty from OutStockOrderDetail
group by InStockOrderDetailLocId
)c on b.Id=c.InStockOrderDetailLocId
where b.Qty-ISNULL(c.qty,0)>0
and b.Id in (select Id from #IdTable)
) iso drop table #IdTable

 

abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十一)的更多相关文章

  1. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十二)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  2. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之四(五十三)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  3. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之五(五十四)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  4. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之六(五十五)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  5. Abp(net core)+easyui+efcore实现仓储管理系统——出库管理之七(五十六)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  6. Abp(net core)+easyui+efcore实现仓储管理系统——出库管理之八(五十七)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  7. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之二(五十)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  8. abp(net core)+easyui+efcore实现仓储管理系统——出库管理之一(四十九)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  9. abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十一)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

随机推荐

  1. docker启动容器报错 Unknown runtime specified nvidia.

    启动docker容器时,报错 问题复现 当我启动一个容器时,运行以下命令: docker run --runtime=nvidia .... 后面一部分命令没写出来,此时报错的信息如下: docker ...

  2. Appium之常用API

    Appium常用API解析 1.current_activity:获取当前页面的activity名,比如com.taobao.tao.TBMainActivity 或 com.taobao.brows ...

  3. CTF-BugKu-杂项-1-20

    2020.09.14 今天又是奥力给的一天,我的鼻炎啥时候能好啊--真是难受的一,影响学习和生活今天复习一遍杂项,应该挺快,毕竟这东西难就难在脑洞,做过一遍就全知道了,ok,let's go 做题 第 ...

  4. [Java并发编程之美]第1章 线程基础 补充知识

    1.2线程创建与运行 创建线程有三种方式: 继承Thread类并重写run方法: 实现Runnable接口的run方法,new Thread时将该类对象作为参数传入: 实现Callable接口的cal ...

  5. python文档翻译之python说明

    3.1使用Python进行计数 让我们来使用一些Python的简单命令,通过终端启动解释器等待出现>>>. 3.1.1数值类型 在终端中输入数学表达式,Python解释器会执行这些表 ...

  6. 4.Strom-可靠性保证

  7. selenium过豆瓣滑动验证码

    首先是加速度代码 def get_tracks(distance): """ 拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速 匀变速运动基本公式: ①v = v0+at ...

  8. IoC基础篇(一)--- Spring容器中Bean的生命周期

    日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...

  9. 论文阅读笔记: Multi-Perspective Sentence Similarity Modeling with Convolution Neural Networks

    论文概况 Multi-Perspective Sentence Similarity Modeling with Convolution Neural Networks是处理比较两个句子相似度的问题, ...

  10. 2020 巅峰极客 WP_ Re

    第一题:virus 是一个win32 的题,没给加壳. 主函数: int __cdecl main(int argc, const char **argv, const char **envp) { ...