feat(clgl): 完善材料匹配与入库条码查询
通过按材料编码优化库存匹配并增加条码查询入口,减少材料主编码选择歧义,便于按项目追溯入库条码。
This commit is contained in:
@@ -0,0 +1,57 @@
|
|||||||
|
SET XACT_ABORT ON;
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
DECLARE @MenuId NVARCHAR(50) = N'74048E7D-C9D3-45A1-B985-DCE1DB5723F5';
|
||||||
|
DECLARE @InPlanMenuId NVARCHAR(50) = N'324C72AF-447A-4308-AFB7-ABF788C58240';
|
||||||
|
DECLARE @SuperMenu NVARCHAR(50);
|
||||||
|
DECLARE @MenuType NVARCHAR(50);
|
||||||
|
DECLARE @IsOffice BIT;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
@SuperMenu = SuperMenu,
|
||||||
|
@MenuType = MenuType,
|
||||||
|
@IsOffice = IsOffice
|
||||||
|
FROM dbo.Sys_Menu
|
||||||
|
WHERE MenuId = @InPlanMenuId;
|
||||||
|
|
||||||
|
IF @SuperMenu IS NULL
|
||||||
|
BEGIN
|
||||||
|
RAISERROR(N'未找到“入库申请”菜单,无法确定入库条码查询菜单位置。', 16, 1);
|
||||||
|
ROLLBACK TRANSACTION;
|
||||||
|
RETURN;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM dbo.Sys_Menu WHERE MenuId = @MenuId)
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO dbo.Sys_Menu
|
||||||
|
(MenuId, MenuName, Icon, Url, SortIndex, SuperMenu, MenuType, IsOffice, IsEnd, IsUsed)
|
||||||
|
VALUES
|
||||||
|
(@MenuId, N'入库条码查询', NULL, N'CLGL/InputBarCodeQuery.aspx',
|
||||||
|
30, @SuperMenu, @MenuType, @IsOffice, 1, 1);
|
||||||
|
END
|
||||||
|
ELSE
|
||||||
|
BEGIN
|
||||||
|
UPDATE dbo.Sys_Menu
|
||||||
|
SET MenuName = N'入库条码查询',
|
||||||
|
Url = N'CLGL/InputBarCodeQuery.aspx',
|
||||||
|
SortIndex = 30,
|
||||||
|
SuperMenu = @SuperMenu,
|
||||||
|
MenuType = @MenuType,
|
||||||
|
IsEnd = 1,
|
||||||
|
IsUsed = 1
|
||||||
|
WHERE MenuId = @MenuId;
|
||||||
|
END;
|
||||||
|
|
||||||
|
INSERT INTO dbo.Sys_RolePower (RolePowerId, RoleId, MenuId, MenuType, IsOffice)
|
||||||
|
SELECT CONVERT(NVARCHAR(50), NEWID()), source.RoleId, @MenuId, @MenuType, source.IsOffice
|
||||||
|
FROM dbo.Sys_RolePower source
|
||||||
|
WHERE source.MenuId = @InPlanMenuId
|
||||||
|
AND NOT EXISTS
|
||||||
|
(
|
||||||
|
SELECT 1
|
||||||
|
FROM dbo.Sys_RolePower target
|
||||||
|
WHERE target.RoleId = source.RoleId
|
||||||
|
AND target.MenuId = @MenuId
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMIT TRANSACTION;
|
||||||
@@ -149,18 +149,89 @@ namespace BLL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 以下三个集合只服务于“按材料 Code 挑选材料主编码”的场景:
|
||||||
|
// remainingRequiredNumByCode:当前明细及后续明细的剩余总需求;
|
||||||
|
// stocksByCode:同一 Code 下所有可用的材料主编码库存;
|
||||||
|
// usedMaterialCodesByCode:本轮匹配已经使用过的材料主编码,用于优先继续消耗其余量。
|
||||||
|
Dictionary<string, decimal> remainingRequiredNumByCode = null;
|
||||||
|
Dictionary<string, List<Tw_MaterialStockOutput>> stocksByCode = null;
|
||||||
|
Dictionary<string, HashSet<string>> usedMaterialCodesByCode = null;
|
||||||
|
if (matchByMaterialCodeLibCode)
|
||||||
|
{
|
||||||
|
// 按 Code 汇总全部需求,选择新主编码时可判断一个库存能否覆盖剩余需求。
|
||||||
|
remainingRequiredNumByCode = requiredMaterials
|
||||||
|
.Where(x => !string.IsNullOrEmpty(x.MaterialCode))
|
||||||
|
.GroupBy(x => x.MaterialCode)
|
||||||
|
.ToDictionary(x => x.Key, x => x.Sum(y => y.NeedNum ?? 0));
|
||||||
|
|
||||||
|
// 出库申请预扣后,仅保留仍有可用数量的主编码库存。
|
||||||
|
stocksByCode = stockList
|
||||||
|
.Where(x => !string.IsNullOrEmpty(x.Code) && (x.StockNum ?? 0) > 0)
|
||||||
|
.GroupBy(x => x.Code)
|
||||||
|
.ToDictionary(x => x.Key, x => x.ToList());
|
||||||
|
|
||||||
|
// 每个 Code 独立记录已经启用的主编码,避免不同材料之间相互影响。
|
||||||
|
usedMaterialCodesByCode = stocksByCode.ToDictionary(x => x.Key, x => new HashSet<string>());
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var material in requiredMaterials)
|
foreach (var material in requiredMaterials)
|
||||||
{
|
{
|
||||||
material.Id = Guid.NewGuid().ToString();
|
material.Id = Guid.NewGuid().ToString();
|
||||||
// 材料导入只保存材料编码 Code,匹配时按 Code 从库存中挑选实际材料主编码 PipeLineMatCode。
|
// 材料导入只保存材料编码 Code,匹配时按 Code 从库存中挑选实际材料主编码 PipeLineMatCode。
|
||||||
var stock = matchByMaterialCodeLibCode
|
Tw_MaterialStockOutput stock = null;
|
||||||
? stockList
|
if (matchByMaterialCodeLibCode)
|
||||||
.Where(x => x.Code == material.MaterialCode && (x.StockNum ?? 0) > 0)
|
{
|
||||||
// 优先选择库存能覆盖本条需求的材料主编码,再按主编码稳定排序,保证匹配结果可复现。
|
if (!string.IsNullOrEmpty(material.MaterialCode) && stocksByCode.ContainsKey(material.MaterialCode))
|
||||||
.OrderByDescending(x => (x.StockNum ?? 0) >= (material.NeedNum ?? 0))
|
{
|
||||||
|
decimal needNum = material.NeedNum ?? 0;
|
||||||
|
decimal remainingRequiredNum = remainingRequiredNumByCode[material.MaterialCode];
|
||||||
|
// StockNum 会在每条明细匹配后原地扣减,这里读取的是本轮实时剩余库存。
|
||||||
|
var candidates = stocksByCode[material.MaterialCode]
|
||||||
|
.Where(x => (x.StockNum ?? 0) > 0)
|
||||||
|
.ToList();
|
||||||
|
var usedMaterialCodes = usedMaterialCodesByCode[material.MaterialCode];
|
||||||
|
|
||||||
|
// 第一优先级:复用已使用且能完整满足当前明细的主编码,减少主编码种类;
|
||||||
|
// 在多个已用主编码都满足时,选择库存最小的,使其更接近用完。
|
||||||
|
stock = candidates
|
||||||
|
.Where(x => usedMaterialCodes.Contains(x.PipeLineMatCode) && (x.StockNum ?? 0) >= needNum)
|
||||||
|
.OrderBy(x => x.StockNum ?? 0)
|
||||||
.ThenBy(x => x.PipeLineMatCode)
|
.ThenBy(x => x.PipeLineMatCode)
|
||||||
.FirstOrDefault()
|
.FirstOrDefault()
|
||||||
: stockList.FirstOrDefault(x => x.PipeLineMatCode == material.MaterialCode);
|
// 第二优先级:启用一个能覆盖剩余总需求的新主编码,保证后续仍只使用这一种主编码;
|
||||||
|
// 若有多个可选,选择库存最小的,减少最终余料。
|
||||||
|
?? candidates
|
||||||
|
.Where(x => !usedMaterialCodes.Contains(x.PipeLineMatCode) && (x.StockNum ?? 0) >= remainingRequiredNum)
|
||||||
|
.OrderBy(x => x.StockNum ?? 0)
|
||||||
|
.ThenBy(x => x.PipeLineMatCode)
|
||||||
|
.FirstOrDefault()
|
||||||
|
// 第三优先级:无法一次覆盖剩余总需求时,选择刚好能满足当前明细且余量最小的新主编码。
|
||||||
|
?? candidates
|
||||||
|
.Where(x => !usedMaterialCodes.Contains(x.PipeLineMatCode) && (x.StockNum ?? 0) >= needNum)
|
||||||
|
.OrderBy(x => x.StockNum ?? 0)
|
||||||
|
.ThenBy(x => x.PipeLineMatCode)
|
||||||
|
.FirstOrDefault()
|
||||||
|
// 所有库存都不足以完整满足当前明细时,选择库存最大的主编码以保证匹配量最大;
|
||||||
|
// 库存相同时优先已使用的主编码,最后按主编码排序保证结果稳定。
|
||||||
|
?? candidates
|
||||||
|
.OrderByDescending(x => x.StockNum ?? 0)
|
||||||
|
.ThenByDescending(x => usedMaterialCodes.Contains(x.PipeLineMatCode))
|
||||||
|
.ThenBy(x => x.PipeLineMatCode)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (stock != null)
|
||||||
|
{
|
||||||
|
usedMaterialCodes.Add(stock.PipeLineMatCode);
|
||||||
|
}
|
||||||
|
// 当前明细处理完后,只保留后续明细的总需求供下一轮选码判断。
|
||||||
|
remainingRequiredNumByCode[material.MaterialCode] -= needNum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 旧调用传入的是材料主编码,保持原来的精确匹配逻辑。
|
||||||
|
stock = stockList.FirstOrDefault(x => x.PipeLineMatCode == material.MaterialCode);
|
||||||
|
}
|
||||||
var thisMaterialStockNum = stock?.StockNum ?? 0;
|
var thisMaterialStockNum = stock?.StockNum ?? 0;
|
||||||
if (thisMaterialStockNum >= material.NeedNum)
|
if (thisMaterialStockNum >= material.NeedNum)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -39,13 +39,16 @@ namespace BLL
|
|||||||
(string.IsNullOrEmpty(table.Id) || x.Id.Contains(table.Id)) &&
|
(string.IsNullOrEmpty(table.Id) || x.Id.Contains(table.Id)) &&
|
||||||
(string.IsNullOrEmpty(table.InputDetailId) || x.InputDetailId.Contains(table.InputDetailId)) &&
|
(string.IsNullOrEmpty(table.InputDetailId) || x.InputDetailId.Contains(table.InputDetailId)) &&
|
||||||
(string.IsNullOrEmpty(table.InputMasterId) || x.InputMasterId.Contains(table.InputMasterId)) &&
|
(string.IsNullOrEmpty(table.InputMasterId) || x.InputMasterId.Contains(table.InputMasterId)) &&
|
||||||
(string.IsNullOrEmpty(table.MaterialCode) || x.MaterialCode.Contains(table.MaterialCode))
|
(string.IsNullOrEmpty(table.ProjectId) || master.ProjectId == table.ProjectId) &&
|
||||||
|
(string.IsNullOrEmpty(table.MaterialCode) || x.MaterialCode.Contains(table.MaterialCode)) &&
|
||||||
|
(string.IsNullOrEmpty(table.BarCode) || x.BarCode.Contains(table.BarCode))
|
||||||
orderby master.CusBillCode, x.MaterialCode, x.Id
|
orderby master.CusBillCode, x.MaterialCode, x.Id
|
||||||
select new Tw_InputDetailBarCodeOutput
|
select new Tw_InputDetailBarCodeOutput
|
||||||
{
|
{
|
||||||
Id = x.Id,
|
Id = x.Id,
|
||||||
InputDetailId = x.InputDetailId,
|
InputDetailId = x.InputDetailId,
|
||||||
InputMasterId = x.InputMasterId,
|
InputMasterId = x.InputMasterId,
|
||||||
|
ProjectId = master.ProjectId,
|
||||||
CusBillCode = master.CusBillCode,
|
CusBillCode = master.CusBillCode,
|
||||||
MaterialCode = x.MaterialCode,
|
MaterialCode = x.MaterialCode,
|
||||||
Code = mat.Code,
|
Code = mat.Code,
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static Model.MaterialCodeLibBarCodeOutput GetBarCodeMaterialInfo(string barCode)
|
public static Model.MaterialCodeLibBarCodeOutput GetBarCodeMaterialInfo(string barCode)
|
||||||
{
|
{
|
||||||
return (from detailBarCode in Funs.DB.Tw_InputDetailBarCode
|
var result= (from detailBarCode in Funs.DB.Tw_InputDetailBarCode
|
||||||
join x in Funs.DB.HJGL_MaterialCodeLib on detailBarCode.MaterialCode equals x.MaterialCode
|
join x in Funs.DB.HJGL_MaterialCodeLib on detailBarCode.MaterialCode equals x.MaterialCode
|
||||||
where detailBarCode.BarCode == barCode
|
where detailBarCode.BarCode == barCode
|
||||||
select new Model.MaterialCodeLibBarCodeOutput
|
select new Model.MaterialCodeLibBarCodeOutput
|
||||||
@@ -36,6 +36,24 @@
|
|||||||
BarCode = detailBarCode.BarCode,
|
BarCode = detailBarCode.BarCode,
|
||||||
Quantity = detailBarCode.Quantity
|
Quantity = detailBarCode.Quantity
|
||||||
}).FirstOrDefault();
|
}).FirstOrDefault();
|
||||||
|
|
||||||
|
if (result==null)
|
||||||
|
{
|
||||||
|
result = (from x in Funs.DB.HJGL_MaterialCodeLib
|
||||||
|
where x.MaterialCode == barCode
|
||||||
|
select new Model.MaterialCodeLibBarCodeOutput
|
||||||
|
{
|
||||||
|
MaterialCode = x.MaterialCode,
|
||||||
|
Code = x.Code,
|
||||||
|
HeatNo = x.HeatNo,
|
||||||
|
BatchNo = x.BatchNo,
|
||||||
|
MaterialName = x.MaterialName,
|
||||||
|
MaterialDef = x.MaterialDef,
|
||||||
|
MaterialSpec = x.MaterialSpec,
|
||||||
|
MaterialUnit = x.MaterialUnit
|
||||||
|
}).FirstOrDefault();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -0,0 +1,133 @@
|
|||||||
|
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="InputBarCodeQuery.aspx.cs" Inherits="FineUIPro.Web.CLGL.InputBarCodeQuery" %>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head runat="server">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<title>入库条码查询</title>
|
||||||
|
<link href="../../res/css/common.css" rel="stylesheet" type="text/css" />
|
||||||
|
<style type="text/css">
|
||||||
|
.f-grid-row .f-grid-cell-inner {
|
||||||
|
white-space: normal;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form id="form1" runat="server">
|
||||||
|
<f:PageManager ID="PageManager1" AutoSizePanelID="Panel1" runat="server" />
|
||||||
|
<f:Panel ID="Panel1" runat="server" Margin="5px" BodyPadding="5px" ShowBorder="false"
|
||||||
|
ShowHeader="false" Layout="VBox" BoxConfigAlign="Stretch">
|
||||||
|
<Items>
|
||||||
|
<f:Grid ID="Grid1" runat="server" BoxFlex="1" ShowBorder="true" ShowHeader="false"
|
||||||
|
Title="入库条码查询" DataKeyNames="Id" DataIDField="Id" EnableColumnLines="true"
|
||||||
|
EnableTextSelection="true" AllowPaging="true" IsDatabasePaging="true" PageSize="20"
|
||||||
|
OnPageIndexChange="Grid1_PageIndexChange" OnRowCommand="Grid1_RowCommand" AllowColumnLocking="true">
|
||||||
|
<Toolbars>
|
||||||
|
<f:Toolbar ID="Toolbar1" Position="Top" runat="server">
|
||||||
|
<Items>
|
||||||
|
<f:TextBox ID="txtMaterialCode" runat="server" Label="材料主编码" LabelWidth="100px"
|
||||||
|
LabelAlign="Right" Width="300px" EmptyText="请输入材料主编码"></f:TextBox>
|
||||||
|
<f:TextBox ID="txtBarCode" runat="server" Label="条码内容" LabelWidth="80px"
|
||||||
|
LabelAlign="Right" Width="300px" EmptyText="请输入条码内容"></f:TextBox>
|
||||||
|
<f:ToolbarFill ID="ToolbarFill1" runat="server"></f:ToolbarFill>
|
||||||
|
<f:Button ID="btnSearch" runat="server" Text="查询" Icon="SystemSearch" OnClick="btnSearch_Click"></f:Button>
|
||||||
|
</Items>
|
||||||
|
</f:Toolbar>
|
||||||
|
</Toolbars>
|
||||||
|
<Columns>
|
||||||
|
<f:TemplateField ColumnID="tfNumber" Width="50px" HeaderText="序号" HeaderTextAlign="Center" TextAlign="Center">
|
||||||
|
<ItemTemplate>
|
||||||
|
<asp:Label ID="lblNumber" runat="server" Text='<%# Grid1.PageIndex * Grid1.PageSize + Container.DataItemIndex + 1 %>'></asp:Label>
|
||||||
|
</ItemTemplate>
|
||||||
|
</f:TemplateField>
|
||||||
|
<f:RenderField Width="220px" ColumnID="CusBillCode" DataField="CusBillCode" SortField="CusBillCode"
|
||||||
|
FieldType="String" HeaderText="入库单编号" TextAlign="Left" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="180px" ColumnID="MaterialCode" DataField="MaterialCode" SortField="MaterialCode"
|
||||||
|
FieldType="String" HeaderText="材料主编码" TextAlign="Left" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="150px" ColumnID="Code" DataField="Code" SortField="Code"
|
||||||
|
FieldType="String" HeaderText="材料编码" TextAlign="Left" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="120px" ColumnID="HeatNo" DataField="HeatNo" SortField="HeatNo"
|
||||||
|
FieldType="String" HeaderText="炉号" TextAlign="Left" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="120px" ColumnID="BatchNo" DataField="BatchNo" SortField="BatchNo"
|
||||||
|
FieldType="String" HeaderText="批号" TextAlign="Left" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="150px" ColumnID="MaterialName" DataField="MaterialName" SortField="MaterialName"
|
||||||
|
FieldType="String" HeaderText="材料名称" TextAlign="Left" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="150px" ColumnID="MaterialSpec" DataField="MaterialSpec" SortField="MaterialSpec"
|
||||||
|
FieldType="String" HeaderText="规格" TextAlign="Left" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="100px" ColumnID="MaterialUnit" DataField="MaterialUnit" SortField="MaterialUnit"
|
||||||
|
FieldType="String" HeaderText="单位" TextAlign="Center" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="300px" ColumnID="BarCode" DataField="BarCode" SortField="BarCode"
|
||||||
|
FieldType="String" HeaderText="条码内容" TextAlign="Left" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:RenderField Width="100px" ColumnID="Quantity" DataField="Quantity" SortField="Quantity"
|
||||||
|
FieldType="String" HeaderText="数量" TextAlign="Right" HeaderTextAlign="Center"></f:RenderField>
|
||||||
|
<f:LinkButtonField Width="120px" ColumnID="btnBarCodePrint" TextAlign="Center"
|
||||||
|
CommandName="btnBarCodePrint" Text="入库条码打印" Locked="true" />
|
||||||
|
</Columns>
|
||||||
|
<PageItems>
|
||||||
|
<f:ToolbarSeparator ID="ToolbarSeparator1" runat="server"></f:ToolbarSeparator>
|
||||||
|
<f:ToolbarText ID="ToolbarText1" runat="server" Text="每页记录数:"></f:ToolbarText>
|
||||||
|
<f:DropDownList ID="ddlPageSize" runat="server" Width="80px" AutoPostBack="true"
|
||||||
|
OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged">
|
||||||
|
<f:ListItem Text="10" Value="10" />
|
||||||
|
<f:ListItem Text="20" Value="20" />
|
||||||
|
<f:ListItem Text="50" Value="50" />
|
||||||
|
<f:ListItem Text="100" Value="100" />
|
||||||
|
</f:DropDownList>
|
||||||
|
</PageItems>
|
||||||
|
</f:Grid>
|
||||||
|
</Items>
|
||||||
|
</f:Panel>
|
||||||
|
</form>
|
||||||
|
<script type="text/javascript">
|
||||||
|
function printByHiddenFrame(url) {
|
||||||
|
var frameId = 'fastreport-print-frame-' + new Date().getTime();
|
||||||
|
var frame = document.createElement('iframe');
|
||||||
|
frame.id = frameId;
|
||||||
|
frame.name = frameId;
|
||||||
|
frame.style.position = 'fixed';
|
||||||
|
frame.style.left = '-10000px';
|
||||||
|
frame.style.top = '-10000px';
|
||||||
|
frame.style.width = '1px';
|
||||||
|
frame.style.height = '1px';
|
||||||
|
frame.style.border = '0';
|
||||||
|
frame.style.opacity = '0';
|
||||||
|
frame.onload = function () {
|
||||||
|
setTimeout(function () {
|
||||||
|
try {
|
||||||
|
frame.contentWindow.onafterprint = cleanupPrintFrame;
|
||||||
|
frame.contentWindow.focus();
|
||||||
|
frame.contentWindow.print();
|
||||||
|
} catch (e) {
|
||||||
|
window.print();
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
};
|
||||||
|
frame.src = url;
|
||||||
|
document.body.appendChild(frame);
|
||||||
|
var cleaned = false;
|
||||||
|
function cleanupPrintFrame() {
|
||||||
|
if (cleaned) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cleaned = true;
|
||||||
|
if (frame && frame.parentNode) {
|
||||||
|
frame.parentNode.removeChild(frame);
|
||||||
|
}
|
||||||
|
window.removeEventListener('afterprint', cleanupPrintFrame);
|
||||||
|
}
|
||||||
|
window.addEventListener('afterprint', cleanupPrintFrame);
|
||||||
|
setTimeout(cleanupPrintFrame, 300000);
|
||||||
|
}
|
||||||
|
window.addEventListener('message', function (event) {
|
||||||
|
if (!event.data || event.data.type !== 'fastreport-print-finished') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var frame = document.getElementById(event.data.frameId);
|
||||||
|
if (frame && frame.parentNode) {
|
||||||
|
frame.parentNode.removeChild(frame);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
using BLL;
|
||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace FineUIPro.Web.CLGL
|
||||||
|
{
|
||||||
|
public partial class InputBarCodeQuery : PageBase
|
||||||
|
{
|
||||||
|
protected void Page_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (!IsPostBack)
|
||||||
|
{
|
||||||
|
ddlPageSize.SelectedValue = Grid1.PageSize.ToString();
|
||||||
|
BindGrid();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BindGrid()
|
||||||
|
{
|
||||||
|
var query = new Model.Tw_InputDetailBarCodeOutput
|
||||||
|
{
|
||||||
|
ProjectId = CurrUser.LoginProjectId,
|
||||||
|
MaterialCode = txtMaterialCode.Text.Trim(),
|
||||||
|
BarCode = txtBarCode.Text.Trim()
|
||||||
|
};
|
||||||
|
Grid1.DataSource = TwInputdetailBarCodeService.GetListData(query, Grid1);
|
||||||
|
Grid1.RecordCount = TwInputdetailBarCodeService.Count;
|
||||||
|
Grid1.DataBind();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void btnSearch_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Grid1.PageIndex = 0;
|
||||||
|
BindGrid();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e)
|
||||||
|
{
|
||||||
|
Grid1.PageIndex = e.NewPageIndex;
|
||||||
|
BindGrid();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Grid1_RowCommand(object sender, GridCommandEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.CommandName != "btnBarCodePrint")
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FastReportService.ResetData();
|
||||||
|
var query = new Model.Tw_InputDetailBarCodeOutput
|
||||||
|
{
|
||||||
|
Id = e.RowID,
|
||||||
|
ProjectId = CurrUser.LoginProjectId
|
||||||
|
};
|
||||||
|
var list = TwInputdetailBarCodeService.GetListData(query);
|
||||||
|
if (list.Count == 0)
|
||||||
|
{
|
||||||
|
ShowNotify("未找到入库条码明细。", MessageBoxIcon.Warning);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DataTable table = LINQToDataTable(list);
|
||||||
|
table.TableName = "Table1";
|
||||||
|
FastReportService.AddFastreportTable(table);
|
||||||
|
|
||||||
|
string rootPath = Server.MapPath("~/");
|
||||||
|
string templatePath = "File\\Fastreport\\材料入库条码.frx";
|
||||||
|
if (File.Exists(rootPath + templatePath))
|
||||||
|
{
|
||||||
|
string printUrl = ResolveUrl(FastReportService.ExportReport(rootPath + templatePath));
|
||||||
|
PageContext.RegisterStartupScript(string.Format("printByHiddenFrame('{0}');", printUrl));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Grid1.PageSize = Convert.ToInt32(ddlPageSize.SelectedValue);
|
||||||
|
Grid1.PageIndex = 0;
|
||||||
|
BindGrid();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <自动生成>
|
||||||
|
// 此代码由工具生成。
|
||||||
|
// </自动生成>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace FineUIPro.Web.CLGL
|
||||||
|
{
|
||||||
|
public partial class InputBarCodeQuery
|
||||||
|
{
|
||||||
|
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
|
||||||
|
protected global::FineUIPro.PageManager PageManager1;
|
||||||
|
protected global::FineUIPro.Panel Panel1;
|
||||||
|
protected global::FineUIPro.Grid Grid1;
|
||||||
|
protected global::FineUIPro.Toolbar Toolbar1;
|
||||||
|
protected global::FineUIPro.TextBox txtMaterialCode;
|
||||||
|
protected global::FineUIPro.TextBox txtBarCode;
|
||||||
|
protected global::FineUIPro.ToolbarFill ToolbarFill1;
|
||||||
|
protected global::FineUIPro.Button btnSearch;
|
||||||
|
protected global::System.Web.UI.WebControls.Label lblNumber;
|
||||||
|
protected global::FineUIPro.ToolbarSeparator ToolbarSeparator1;
|
||||||
|
protected global::FineUIPro.ToolbarText ToolbarText1;
|
||||||
|
protected global::FineUIPro.DropDownList ddlPageSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -91,7 +91,7 @@
|
|||||||
<f:RenderField Width="150px" ColumnID="StockNum" DataField="StockNum" SortField="StockNum"
|
<f:RenderField Width="150px" ColumnID="StockNum" DataField="StockNum" SortField="StockNum"
|
||||||
FieldType="String" HeaderText="库存数量" TextAlign="Left" HeaderTextAlign="Center">
|
FieldType="String" HeaderText="库存数量" TextAlign="Left" HeaderTextAlign="Center">
|
||||||
</f:RenderField>
|
</f:RenderField>
|
||||||
<f:LinkButtonField Width="120px" ColumnID="btnBarCodePrint" TextAlign="Center" CommandName="btnBarCodePrint" Text="入库条码打印" Locked="true" />
|
<f:LinkButtonField Width="120px" ColumnID="btnBarCodePrint" TextAlign="Center" CommandName="btnBarCodePrint" Text="入库条码打印" Locked="true" Hidden="true"/>
|
||||||
|
|
||||||
</Columns>
|
</Columns>
|
||||||
<%-- <Listeners>
|
<%-- <Listeners>
|
||||||
|
|||||||
@@ -355,6 +355,7 @@
|
|||||||
<Content Include="CLGL\InPlanMaster.aspx" />
|
<Content Include="CLGL\InPlanMaster.aspx" />
|
||||||
<Content Include="CLGL\InPlanMasterDataIn.aspx" />
|
<Content Include="CLGL\InPlanMasterDataIn.aspx" />
|
||||||
<Content Include="CLGL\InPlanMasterEdit.aspx" />
|
<Content Include="CLGL\InPlanMasterEdit.aspx" />
|
||||||
|
<Content Include="CLGL\InputBarCodeQuery.aspx" />
|
||||||
<Content Include="CLGL\InputMaster.aspx" />
|
<Content Include="CLGL\InputMaster.aspx" />
|
||||||
<Content Include="CLGL\InputMasterEdit.aspx" />
|
<Content Include="CLGL\InputMasterEdit.aspx" />
|
||||||
<Content Include="CLGL\MaterialStock.aspx" />
|
<Content Include="CLGL\MaterialStock.aspx" />
|
||||||
@@ -8304,6 +8305,13 @@
|
|||||||
<DependentUpon>InputMaster.aspx</DependentUpon>
|
<DependentUpon>InputMaster.aspx</DependentUpon>
|
||||||
<SubType>ASPXCodeBehind</SubType>
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="CLGL\InputBarCodeQuery.aspx.cs">
|
||||||
|
<DependentUpon>InputBarCodeQuery.aspx</DependentUpon>
|
||||||
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="CLGL\InputBarCodeQuery.aspx.designer.cs">
|
||||||
|
<DependentUpon>InputBarCodeQuery.aspx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="CLGL\InputMaster.aspx.designer.cs">
|
<Compile Include="CLGL\InputMaster.aspx.designer.cs">
|
||||||
<DependentUpon>InputMaster.aspx</DependentUpon>
|
<DependentUpon>InputMaster.aspx</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|||||||
@@ -91,6 +91,10 @@
|
|||||||
</f:Button>
|
</f:Button>
|
||||||
<f:Button ID="btnMatImport" Text="材料导入" ToolTip="材料导入" Icon="PackageIn" runat="server" OnClick="btnMatImport_Click">
|
<f:Button ID="btnMatImport" Text="材料导入" ToolTip="材料导入" Icon="PackageIn" runat="server" OnClick="btnMatImport_Click">
|
||||||
</f:Button>
|
</f:Button>
|
||||||
|
<f:Button ID="btnCalibrateSharedMaterialCode" Text="校准共用材料编码"
|
||||||
|
ToolTip="批量校准选中管线的零数量材料,先查左侧相邻焊口,再查右侧"
|
||||||
|
runat="server" OnClick="btnCalibrateSharedMaterialCode_Click">
|
||||||
|
</f:Button>
|
||||||
<f:Button ID="btnOut" OnClick="btnOut_Click" runat="server" Text="导出" ToolTip="导出" Icon="FolderUp"
|
<f:Button ID="btnOut" OnClick="btnOut_Click" runat="server" Text="导出" ToolTip="导出" Icon="FolderUp"
|
||||||
EnableAjax="false" DisableControlBeforePostBack="false">
|
EnableAjax="false" DisableControlBeforePostBack="false">
|
||||||
</f:Button>
|
</f:Button>
|
||||||
|
|||||||
@@ -949,6 +949,34 @@ namespace FineUIPro.Web.HJGL.DataImport
|
|||||||
this.BindGrid2(this.tvControlItem.SelectedNodeID, this.hdUnitWorkId.Text);
|
this.BindGrid2(this.tvControlItem.SelectedNodeID, this.hdUnitWorkId.Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 对选中管线的全部零数量材料校准主编码,不受列表筛选和勾选状态影响。
|
||||||
|
/// </summary>
|
||||||
|
protected void btnCalibrateSharedMaterialCode_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (!CommonService.GetAllButtonPowerList(this.CurrUser.LoginProjectId, this.CurrUser.PersonId,
|
||||||
|
Const.HJGL_WeldJointMenuId, Const.BtnModify))
|
||||||
|
{
|
||||||
|
ShowNotify("您没有这个权限,请与管理员联系!", MessageBoxIcon.Warning);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var pipeline = PipelineService.GetPipelineByPipelineId(this.tvControlItem.SelectedNodeID);
|
||||||
|
if (pipeline == null)
|
||||||
|
{
|
||||||
|
ShowNotify("请先选择需要校准的管线!", MessageBoxIcon.Warning);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = PipelineMatService.CalibrateSharedMaterialCodes(pipeline.PipelineId);
|
||||||
|
|
||||||
|
this.hdUnitWorkId.Text = pipeline.UnitWorkId;
|
||||||
|
this.BindGrid1(pipeline.PipelineId, pipeline.UnitWorkId);
|
||||||
|
this.BindGrid2(pipeline.PipelineId, pipeline.UnitWorkId);
|
||||||
|
this.BindGrid3(pipeline.PipelineId, pipeline.UnitWorkId);
|
||||||
|
ShowNotify(string.Format("校准完成,共处理 {0} 条材料。", count), MessageBoxIcon.Success);
|
||||||
|
}
|
||||||
|
|
||||||
#region 管线材料导入
|
#region 管线材料导入
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -185,6 +185,11 @@ namespace FineUIPro.Web.HJGL.DataImport
|
|||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::FineUIPro.Button btnMatImport;
|
protected global::FineUIPro.Button btnMatImport;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 校准共用材料编码按钮。
|
||||||
|
/// </summary>
|
||||||
|
protected global::FineUIPro.Button btnCalibrateSharedMaterialCode;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// btnOut 控件。
|
/// btnOut 控件。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
<TreeNode id="EEC0D060-C15E-4D25-B015-C2B91F735DAC" Text="发货管理" NavigateUrl="HJGL/PreDesign/TrainNumberManager.aspx"></TreeNode>
|
<TreeNode id="EEC0D060-C15E-4D25-B015-C2B91F735DAC" Text="发货管理" NavigateUrl="HJGL/PreDesign/TrainNumberManager.aspx"></TreeNode>
|
||||||
</TreeNode>
|
</TreeNode>
|
||||||
<TreeNode id="9B828E92-733B-4AF9-9DD0-55ECD8B64AB8" Text="材料管理" NavigateUrl=""><TreeNode id="E29C1839-3530-45EC-A752-B26A0027E2CD" Text="入库管理" NavigateUrl=""><TreeNode id="324C72AF-447A-4308-AFB7-ABF788C58240" Text="入库申请" NavigateUrl="CLGL/InPlanMaster.aspx"></TreeNode>
|
<TreeNode id="9B828E92-733B-4AF9-9DD0-55ECD8B64AB8" Text="材料管理" NavigateUrl=""><TreeNode id="E29C1839-3530-45EC-A752-B26A0027E2CD" Text="入库管理" NavigateUrl=""><TreeNode id="324C72AF-447A-4308-AFB7-ABF788C58240" Text="入库申请" NavigateUrl="CLGL/InPlanMaster.aspx"></TreeNode>
|
||||||
|
<TreeNode id="74048E7D-C9D3-45A1-B985-DCE1DB5723F5" Text="入库条码查询" NavigateUrl="CLGL/InputBarCodeQuery.aspx"></TreeNode>
|
||||||
<TreeNode id="4A55351A-2440-4A2D-8509-3FFEE5FC8861" Text="入库单管理" NavigateUrl="CLGL/InputMaster.aspx"></TreeNode>
|
<TreeNode id="4A55351A-2440-4A2D-8509-3FFEE5FC8861" Text="入库单管理" NavigateUrl="CLGL/InputMaster.aspx"></TreeNode>
|
||||||
</TreeNode>
|
</TreeNode>
|
||||||
<TreeNode id="16A22282-4966-4946-B0F8-855E1300AE2B" Text="出库管理" NavigateUrl=""><TreeNode id="E910F410-07FB-41C3-AA80-8E30D1563BC1" Text="出库申请" NavigateUrl="CLGL/OutPlanMaster.aspx"></TreeNode>
|
<TreeNode id="16A22282-4966-4946-B0F8-855E1300AE2B" Text="出库管理" NavigateUrl=""><TreeNode id="E910F410-07FB-41C3-AA80-8E30D1563BC1" Text="出库申请" NavigateUrl="CLGL/OutPlanMaster.aspx"></TreeNode>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ namespace Model
|
|||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public string InputDetailId { get; set; }
|
public string InputDetailId { get; set; }
|
||||||
public string InputMasterId { get; set; }
|
public string InputMasterId { get; set; }
|
||||||
|
public string ProjectId { get; set; }
|
||||||
public string CusBillCode { get; set; }
|
public string CusBillCode { get; set; }
|
||||||
public string MaterialCode { get; set; }
|
public string MaterialCode { get; set; }
|
||||||
public string Code { get; set; }
|
public string Code { get; set; }
|
||||||
|
|||||||
Reference in New Issue
Block a user