You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

643 lines
27 KiB

using NFine.Application.KBSSRM;
using NFine.Code;
using NFine.Data.Extensions;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace NFine.Web.Areas.KBSSRM.Controllers
{
public class PalletplateController : ControllerBase
{
private PalletplateApp App = new PalletplateApp();
// GET: KBSSRM/Palletplate
public ActionResult Index()
{
return View();
}
public ActionResult PalletplateAdd()
{
return View();
}
public ActionResult SeachContainer()
{
return View();
}
public ActionResult PalletplateUpdate()
{
return View();
}
public ActionResult PalletplateAddByAsn()
{
return View();
}
[HttpGet]
[HandlerAjaxOnly]
public ActionResult GetGridJson(Pagination pagination, string queryJson)
{
DataTable ListData = App.GetGridJson(queryJson, ref pagination);
var JsonData = new
{
total = pagination.total,
page = pagination.page,
records = pagination.records,
rows = ListData,
};
return Content(JsonData.ToJson());
}
[HttpGet]
[HandlerAjaxOnly]
public ActionResult GetSubGridJson(string ContainerID, Pagination pagination)
{
DataTable ListData = App.GetSubGridJson(ContainerID, ref pagination);
var JsonData = new
{
total = pagination.total,
page = pagination.page,
records = pagination.records,
rows = ListData,
};
return Content(JsonData.ToJson());
}
[HttpGet]
[HandlerAjaxOnly]
public ActionResult GetSubGridJson_Add(string queryJson, Pagination pagination)
{
DataTable ListData = App.GetSubGridJson_Add(queryJson, ref pagination);
var JsonData = new
{
total = pagination.total,
page = pagination.page,
records = pagination.records,
rows = ListData,
};
return Content(JsonData.ToJson());
}
[HttpGet]
[HandlerAjaxOnly]
public ActionResult GetSubGridJson_AddByASN(string queryJson, Pagination pagination)
{
DataTable ListData = App.GetSubGridJson_AddByASN(queryJson, ref pagination);
var JsonData = new
{
total = pagination.total,
page = pagination.page,
records = pagination.records,
rows = ListData,
};
return Content(JsonData.ToJson());
}
[HttpGet]
[HandlerAjaxOnly]
public ActionResult GetContainerCode(string RoleEnCode,string WorkPoint)
{
string ListData = App.GetContainerCode(RoleEnCode, WorkPoint);
var data = new
{
rows = ListData,
};
return Content(data.ToJson());
}
[HttpGet]
public ActionResult GetContainerForBox(string invcode, string Code, string LotNo, string VenCode, string WorkPoint,string Type, Pagination pagination)
{
DataTable ListData = App.GetContainerForBox(invcode, Code, LotNo, VenCode, WorkPoint, Type, ref pagination);
var JsonData = new
{
total = pagination.total,
page = pagination.page,
records = pagination.records,
rows = ListData,
};
return Content(JsonData.ToJson());
}
[HttpPost]
[HandlerAjaxOnly]
public ActionResult SaveICSContainerForPalletplate(string ICSASN)
{
string msg = App.SaveICSContainerForPalletplate(ICSASN);
if (!string.IsNullOrEmpty(msg))
{
return Error(msg);
}
else
{
return Success("添加成功!");
}
}
[HttpPost]
[HandlerAjaxOnly]
public ActionResult SaveICSContainerForPalletplateByASN(string ICSASN)
{
string msg = App.SaveICSContainerForPalletplateByASN(ICSASN);
if (!string.IsNullOrEmpty(msg))
{
return Error(msg);
}
else
{
return Success("添加成功!");
}
}
[HttpPost]
[HandlerAjaxOnly]
public ActionResult UpdateICSContainerForPalletplate(string ICSASN)
{
string msg = App.UpdateICSContainerForPalletplate(ICSASN);
if (!string.IsNullOrEmpty(msg))
{
return Error(msg);
}
else
{
return Success("修改成功!");
}
}
[HttpPost]
[HandlerAjaxOnly]
[ValidateAntiForgeryToken]
public ActionResult DeleteInfo(string keyValue, string WorkPoint)
{
keyValue = keyValue.Substring(1, keyValue.Length - 2);
string msg = App.DeleteInfo(keyValue, WorkPoint);
if (string.IsNullOrEmpty(msg))
{
return Success("删除成功!");
}
else
{
return Error(msg);
}
}
[HttpPost]
[HandlerAjaxOnly]
[ValidateAntiForgeryToken]
public ActionResult DeleteContainer(string keyValue, string Work)
{
string msg = App.DeleteContainer(keyValue, Work);
if (string.IsNullOrEmpty(msg))
{
return Success("删除成功!");
}
else
{
return Error(msg);
}
}
#region 打印
/// <summary>
/// 打印数据参数:服务器的URL+打印的文件名,转化为Base64编码
/// </summary>
protected string strPrintData;
/// <summary>
/// 标识是否安装了控件
/// </summary>
protected bool bIsInstallPrintControl = true;
/// <summary>
/// 打印控件的Cookie值
/// </summary>
protected string strPrintControlCookie = "";
/// <summary>
/// 获取Url中去掉文件名的路径
/// </summary>
/// <returns></returns>
private string GetUrlPath()
{
string strUrl = Request.Url.ToString();
int iEnd = strUrl.LastIndexOf("/");
strUrl = strUrl.Substring(0, iEnd + 1);
return strUrl;
}
/// <summary>
/// 设置控件调用的Cookie值,判断是否安装了打印控件
/// </summary>
/// <param name="pJson"></param>
private void SetCookieAndURL(PrintJson pJson)
{
bIsInstallPrintControl = false;
strPrintControlCookie = "";
HttpCookie pCookieInstall = Request.Cookies["InstallPrintControl"];
if (pCookieInstall != null)
{ //Cookie存在
strPrintControlCookie = pCookieInstall.Value.ToString();
//以Cookie值查找在数据表中是否存在
string strSql = @"Select * From sys_SRM_CheckInstall Where Cookie = @Cookie";
SqlParameter[] pmcCookie = { new SqlParameter("Cookie", strPrintControlCookie) };
using (SqlDataReader drCookie = DbHelper.ExecuteReader(DbHelper.ConnectionString, CommandType.Text, strSql, pmcCookie))
{
if (drCookie.Read())
{ //标识为已经安装
bIsInstallPrintControl = true;
}
drCookie.Close();
}
//更新Cookie的保存时间
pCookieInstall.Expires = DateTime.Now.AddYears(10);
Response.SetCookie(pCookieInstall);
}
else
{//Cookie不存在,则新建Cookie
strPrintControlCookie = System.Guid.NewGuid().ToString();
pCookieInstall = new HttpCookie("InstallPrintControl", strPrintControlCookie);
pCookieInstall.Expires = DateTime.Now.AddYears(10);
Response.Cookies.Add(pCookieInstall);
}
string strUrl = Server.MapPath("/PrintTemp/") + "IsCheckInstall";
pJson.SetCookieAndURL(strPrintControlCookie, strUrl);
}
[HttpPost]
[HandlerAjaxOnly]
public ActionResult PrintItemLot(string keyValue)
{
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
keyValue = keyValue.Substring(1, keyValue.Length - 2);
string strPrintFileName = Server.MapPath("/ReportFile/") + "Pallet.fr3";
PrintJson pJson = new PrintJson(Server.MapPath("./PrintTemp"), strPrintFileName);
pJson.CheckRegister("苏州智合诚信息科技有限公司", "56DD3B4C172D0D140841CAC98A58A819F4E28EDA5D6E45711DDD64F6A439F68B6A7870CD7DAFD69A919CB870207FE4BB206F92BE3D53C221B019E0797E739EBA4"); //注册信息
pJson.MasterOptions(1, "ContainerCode", false); //主从关系
SetCookieAndURL(pJson);// 设置控件调用的Cookie值,判断是否安装了打印控件
string strSql = @" select DISTINCT a.ContainerCode,f.VenName
from ICSContainer a
left join ICSContainer b on a.ID=b.ContainerID and b.ContainerType='ContainerType01' and a.WorkPoint=b.WorkPoint
left join ICSContainerLot c on b.ID=c.ContainerID and b.WorkPoint=c.WorkPoint
left join dbo.ICSInventoryLot d on c.LotNo=d.LotNo and c.WorkPoint=d.WorkPoint
left join dbo.ICSInventory e on d.InvCode=e.InvCode and d.WorkPoint=e.WorkPoint
left join dbo.ICSVendor f on a.EATTRIBUTE8=f.VenCode and a.WorkPoint=f.WorkPoint
where a.ContainerType='ContainerType04' and a.ContainerCode in (" + keyValue.TrimEnd(',') + ") and a.WorkPoint in(" + WorkPoint.TrimEnd(',') + ")";
DataTable dtInInfo = DbHelper.ExecuteTable(DbHelper.ConnectionString, CommandType.Text, strSql, true, null);
strSql = @" select d.InvCode,e.InvName,sum(d.Quantity) AS Quantity,a.ContainerCode,f.VenName
from ICSContainer a
left join ICSContainer b on a.ID=b.ContainerID and b.ContainerType='ContainerType01' and a.WorkPoint=b.WorkPoint
left join ICSContainerLot c on b.ID=c.ContainerID and b.WorkPoint=c.WorkPoint
left join dbo.ICSInventoryLot d on c.LotNo=d.LotNo and c.WorkPoint=d.WorkPoint
left join dbo.ICSInventory e on d.InvCode=e.InvCode and d.WorkPoint=e.WorkPoint
left join dbo.ICSVendor f on a.EATTRIBUTE8=f.VenCode and a.WorkPoint=f.WorkPoint
where a.ContainerType='ContainerType04' and a.ContainerCode in (" + keyValue.TrimEnd(',') + ") and a.WorkPoint in(" + WorkPoint.TrimEnd(',') + ")group by d.InvCode,e.InvName,a.ContainerCode,f.VenName ";
DataTable dtInMaterial = DbHelper.ExecuteTable(DbHelper.ConnectionString, CommandType.Text, strSql, true, null);
string strPrintTempFile = pJson.ShowReport(dtInInfo,dtInMaterial); //产生JSON文件内容
//把服务器的URL + 此文件名 传递给控件,由控件下载还原数据进行打印
string strServerURL = GetUrlPath() + "PrintTemp/";
string strData = strServerURL + strPrintTempFile;
strPrintData = PrintFunction.EnBase64(strData);
var JsonData = new
{
strPrintData_1 = strPrintData,
bIsInstallPrintControl_1 = bIsInstallPrintControl,
strPrintControlCookie_1 = strPrintControlCookie
};
//string sql = @"UPDATE dbo.ICSCarton
// SET PrintTimes=ISNULL(PrintTimes,0)+1,
// lastPrintTime=GETDATE()
// WHERE CartonNO IN (" + keyValue.TrimEnd(',') + ") and WorkPoint='" + WorkPoint + "'";
//SqlHelper.ExecuteNonQuery(sql);
return Content(JsonData.ToJson());
}
[HttpPost]
[HandlerAjaxOnly]
public ActionResult PrintItemLotByContainerType04(string keyValue)
{
string strSql = "";
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
keyValue = keyValue.Substring(1, keyValue.Length - 2);
string strPrintFileName = Server.MapPath("/ReportFile/") + "Pallet.fr3";
PrintJson pJson = new PrintJson(Server.MapPath("./PrintTemp"), strPrintFileName);
pJson.CheckRegister("苏州智合诚信息科技有限公司", "56DD3B4C172D0D140841CAC98A58A819F4E28EDA5D6E45711DDD64F6A439F68B6A7870CD7DAFD69A919CB870207FE4BB206F92BE3D53C221B019E0797E739EBA4"); //注册信息
pJson.MasterOptions(1, "ContainerCode", false); //主从关系
SetCookieAndURL(pJson);// 设置控件调用的Cookie值,判断是否安装了打印控件
strSql = @" select DISTINCT a.ContainerCode,f.VenName
from ICSContainer a
left join ICSContainer b on a.ID=b.ContainerID and b.ContainerType='ContainerType01' and a.WorkPoint=b.WorkPoint
left join ICSContainerLot c on b.ID=c.ContainerID and b.WorkPoint=c.WorkPoint
left join dbo.ICSInventoryLot d on c.LotNo=d.LotNo and c.WorkPoint=d.WorkPoint
left join dbo.ICSInventory e on d.InvCode=e.InvCode and d.WorkPoint=e.WorkPoint
left join dbo.ICSVendor f on a.EATTRIBUTE8=f.VenCode and a.WorkPoint=f.WorkPoint
LEFT JOIN dbo.ICSASNDetail h ON c.LotNo=h.LotNo AND c.WorkPoint=h.WorkPoint
where a.ContainerType='ContainerType04' and h.ASNCode in (" + keyValue.TrimEnd(',') + ") and a.WorkPoint=" + WorkPoint.TrimEnd(',') + "";
DataTable dtInInfo = DbHelper.ExecuteTable(DbHelper.ConnectionString, CommandType.Text, strSql, true, null);
strSql = @"
select d.InvCode,e.InvName,sum(d.Quantity) AS Quantity,a.ContainerCode,f.VenName
from ICSContainer a
left join ICSContainer b on a.ID=b.ContainerID and b.ContainerType='ContainerType01' and a.WorkPoint=b.WorkPoint
left join ICSContainerLot c on b.ID=c.ContainerID and b.WorkPoint=c.WorkPoint
left join dbo.ICSInventoryLot d on c.LotNo=d.LotNo and c.WorkPoint=d.WorkPoint
left join dbo.ICSInventory e on d.InvCode=e.InvCode and d.WorkPoint=e.WorkPoint
left join dbo.ICSVendor f on a.EATTRIBUTE8=f.VenCode and a.WorkPoint=f.WorkPoint
LEFT JOIN dbo.ICSASNDetail h ON c.LotNo=h.LotNo AND c.WorkPoint=h.WorkPoint
where a.ContainerType='ContainerType04' and h.ASNCode in (" + keyValue.TrimEnd(',') + ") and a.WorkPoint=" + WorkPoint.TrimEnd(',') + "group by d.InvCode,e.InvName,a.ContainerCode,f.VenName ";
DataTable dtInMaterial = DbHelper.ExecuteTable(DbHelper.ConnectionString, CommandType.Text, strSql, true, null);
string strPrintTempFile = pJson.ShowReport(dtInInfo,dtInMaterial); //产生JSON文件内容
//把服务器的URL + 此文件名 传递给控件,由控件下载还原数据进行打印
string strServerURL = GetUrlPath() + "PrintTemp/";
string strData = strServerURL + strPrintTempFile;
strPrintData = PrintFunction.EnBase64(strData);
var JsonData = new
{
strPrintData_1 = strPrintData,
bIsInstallPrintControl_1 = bIsInstallPrintControl,
strPrintControlCookie_1 = strPrintControlCookie
};
//string sql = @"UPDATE dbo.ICSCarton
// SET PrintTimes=ISNULL(PrintTimes,0)+1,
// lastPrintTime=GETDATE()
// WHERE CartonNO IN (" + keyValue.TrimEnd(',') + ") and WorkPoint='" + WorkPoint + "'";
//SqlHelper.ExecuteNonQuery(sql);
return Content(JsonData.ToJson());
}
[HttpPost]
[HandlerAjaxOnly]
public ActionResult PrintItemLotByOOContainerType04(string keyValue)
{
string WorkPoint = NFine.Code.OperatorProvider.Provider.GetCurrent().Location;
keyValue = keyValue.Substring(1, keyValue.Length - 2);
string strPrintFileName = Server.MapPath("/ReportFile/") + "Pallet.fr3";
PrintJson pJson = new PrintJson(Server.MapPath("./PrintTemp"), strPrintFileName);
pJson.CheckRegister("苏州智合诚信息科技有限公司", "56DD3B4C172D0D140841CAC98A58A819F4E28EDA5D6E45711DDD64F6A439F68B6A7870CD7DAFD69A919CB870207FE4BB206F92BE3D53C221B019E0797E739EBA4"); //注册信息
//pJson.MasterOptions(1, "ContainerCode", false); //主从关系
SetCookieAndURL(pJson);// 设置控件调用的Cookie值,判断是否安装了打印控件
string strSql = @" select DISTINCT a.ContainerCode,f.VenName
from ICSContainer a
left join ICSContainer b on a.ID=b.ContainerID and b.ContainerType='ContainerType01' and a.WorkPoint=b.WorkPoint
left join ICSContainerLot c on b.ID=c.ContainerID and b.WorkPoint=c.WorkPoint
left join dbo.ICSInventoryLot d on c.LotNo=d.LotNo and c.WorkPoint=d.WorkPoint
left join dbo.ICSInventory e on d.InvCode=e.InvCode and d.WorkPoint=e.WorkPoint
left join dbo.ICSVendor f on a.EATTRIBUTE8=f.VenCode and a.WorkPoint=f.WorkPoint
LEFT JOIN dbo.ICSOASNDetail h ON c.LotNo=h.LotNo AND c.WorkPoint=h.WorkPoint
where a.ContainerType='ContainerType04' and h.OASNCode in (" + keyValue.TrimEnd(',') + ") and a.WorkPoint=" + WorkPoint.TrimEnd(',') + "";
DataTable dtInInfo = DbHelper.ExecuteTable(DbHelper.ConnectionString, CommandType.Text, strSql, true, null);
strSql = @"
select d.InvCode,e.InvName,sum(d.Quantity) AS Quantity,a.ContainerCode,f.VenName
from ICSContainer a
left join ICSContainer b on a.ID=b.ContainerID and b.ContainerType='ContainerType01' and a.WorkPoint=b.WorkPoint
left join ICSContainerLot c on b.ID=c.ContainerID and b.WorkPoint=c.WorkPoint
left join dbo.ICSInventoryLot d on c.LotNo=d.LotNo and c.WorkPoint=d.WorkPoint
left join dbo.ICSInventory e on d.InvCode=e.InvCode and d.WorkPoint=e.WorkPoint
left join dbo.ICSVendor f on a.EATTRIBUTE8=f.VenCode and a.WorkPoint=f.WorkPoint
LEFT JOIN dbo.ICSOASNDetail h ON c.LotNo=h.LotNo AND c.WorkPoint=h.WorkPoint
where a.ContainerType='ContainerType04' and h.OASNCode in (" + keyValue.TrimEnd(',') + ") and a.WorkPoint=" + WorkPoint.TrimEnd(',') + "group by d.InvCode,e.InvName,a.ContainerCode,f.VenName ";
DataTable dtInMaterial = DbHelper.ExecuteTable(DbHelper.ConnectionString, CommandType.Text, strSql, true, null);
string strPrintTempFile = pJson.ShowReport(dtInInfo, dtInMaterial); //产生JSON文件内容
//把服务器的URL + 此文件名 传递给控件,由控件下载还原数据进行打印
string strServerURL = GetUrlPath() + "PrintTemp/";
string strData = strServerURL + strPrintTempFile;
strPrintData = PrintFunction.EnBase64(strData);
var JsonData = new
{
strPrintData_1 = strPrintData,
bIsInstallPrintControl_1 = bIsInstallPrintControl,
strPrintControlCookie_1 = strPrintControlCookie
};
//string sql = @"UPDATE dbo.ICSCarton
// SET PrintTimes=ISNULL(PrintTimes,0)+1,
// lastPrintTime=GETDATE()
// WHERE CartonNO IN (" + keyValue.TrimEnd(',') + ") and WorkPoint='" + WorkPoint + "'";
//SqlHelper.ExecuteNonQuery(sql);
return Content(JsonData.ToJson());
}
/// <summary>
/// 写日志(用于跟踪)
/// </summary>
private void WriteLog(string strMessage)
{
string strLogFile = Server.MapPath("./Cookie_Log.txt");
StreamWriter swLogFile = null;
try
{
if (!System.IO.File.Exists(strLogFile))
{
swLogFile = System.IO.File.CreateText(strLogFile);
}
else
{
swLogFile = System.IO.File.AppendText(strLogFile);
}
swLogFile.WriteLine(strMessage);
}
catch
{
}
finally
{
if (swLogFile != null)
swLogFile.Close();
}
}
/// <summary>
///判断数据表中是否存在,若不存在则新建一条记录,若存在则更新最后访问的时间
/// </summary>
/// <param name="strCookie"></param>
private void UpdateCheckInstall(string strCookie)
{
bool bIsExist = false;
//判断记录是否存在
GetLastAccessTime(strCookie, ref bIsExist);
string strSql = "";
SqlParameter[] pmcCookie = { new SqlParameter("Cookie", strCookie) };
if (bIsExist)
{ //存在则更新最后访问的时间
strSql = @"Update sys_SRM_CheckInstall
Set LastAccessTime = getDate()
Where Cookie = @Cookie";
}
else
{ //不存在则新建一条记录
strSql = @"Insert into sys_SRM_CheckInstall(Cookie, LastAccessTime)
Values( @Cookie, getDate() )";
}
DbHelper.ExecuteNonQuery(DbHelper.ConnectionString, CommandType.Text, strSql, pmcCookie);
}
public DateTime ToDateTime(object SrcValue)
{
if (Convert.IsDBNull(SrcValue) == true)
return DateTime.MinValue;
else
{
try
{
return Convert.ToDateTime(SrcValue);
}
catch
{
return DateTime.MinValue;
}
}
}
/// <summary>
/// 获取此Cookie的最后访问时间
/// </summary>
/// <param name="strCookie"></param>
/// <returns></returns>
private DateTime GetLastAccessTime(string strCookie, ref bool bIsExist)
{
DateTime dtLastAccessTime = DateTime.MinValue;
bIsExist = false;
string strSql = @"Select * From sys_SRM_CheckInstall Where Cookie = @Cookie";
SqlParameter[] pmcCookie = { new SqlParameter("Cookie", strCookie) };
using (SqlDataReader drCookie = DbHelper.ExecuteReader(DbHelper.ConnectionString, CommandType.Text, strSql, pmcCookie))
{
if (drCookie.Read())
{
dtLastAccessTime = ToDateTime(drCookie["LastAccessTime"]);
bIsExist = true;
}
drCookie.Close();
}
return dtLastAccessTime;
}
[HttpGet]
[HandlerAjaxOnly]
public ActionResult IsCheckInstall(string checkInstall)
{
string strValue = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss 访问,");
if (Request.QueryString["cookie"] != null)
{ //有控件上传的Cookie值
string strCookie = Request.QueryString["cookie"].ToString();
//判断数据表中是否存在,若不存在则新建一条记录,若存在则更新最后访问的时间
UpdateCheckInstall(strCookie);
strValue = strValue + "上传的cookie:" + strCookie;
}
else if (checkInstall != null)
{//Ajax检查控件是否安装了,防止那种客户把打印控件卸装了,打印时无法检测到的情况
string strCookie = checkInstall;
//读取最后访问的时间
string strResult = "PrintControlInstall";
bool bIsExist = false;
DateTime dtLastAccessTime = GetLastAccessTime(strCookie, ref bIsExist);
if (!bIsExist || dtLastAccessTime.AddSeconds(30) < DateTime.Now)
{
strResult = "NOT";
}
Response.Clear();
Response.Write(strResult);
strValue = strValue + "检测安装的值:" + strCookie;
}
WriteLog(strValue);
return null;
}
[HttpGet]
[HandlerAjaxOnly]
public ActionResult IsCheckInstall()
{
string strValue = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss 访问,");
if (Request.QueryString["cookie"] != null)
{ //有控件上传的Cookie值
string strCookie = Request.QueryString["cookie"].ToString();
//判断数据表中是否存在,若不存在则新建一条记录,若存在则更新最后访问的时间
UpdateCheckInstall(strCookie);
strValue = strValue + "上传的cookie:" + strCookie;
}
else if (Request.QueryString["checkInstall"] != null)
{//Ajax检查控件是否安装了,防止那种客户把打印控件卸装了,打印时无法检测到的情况
string strCookie = Request.QueryString["checkInstall"];
//读取最后访问的时间
string strResult = "PrintControlInstall";
bool bIsExist = false;
DateTime dtLastAccessTime = GetLastAccessTime(strCookie, ref bIsExist);
if (!bIsExist || dtLastAccessTime.AddSeconds(30) < DateTime.Now)
{
strResult = "NOT";
}
Response.Clear();
Response.Write(strResult);
strValue = strValue + "检测安装的值:" + strCookie;
}
WriteLog(strValue);
return null;
}
#endregion
}
}