using HslCommunication;
|
using HslCommunication.Profinet.Melsec;
|
using Microsoft.VisualBasic.FileIO;
|
using Newtonsoft.Json;
|
using Newtonsoft.Json.Linq;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Data;
|
using System.Drawing;
|
using System.IO;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Windows.Forms;
|
|
namespace WFormReadData_SMR
|
{
|
public partial class ReadyDataForm : Form
|
{
|
public DBHelper oCN = new DBHelper();
|
public ReadyDataForm()
|
{
|
InitializeComponent();
|
}
|
public static int num = 0;
|
public static int SelectTime = 0;
|
public static DateTime time = DateTime.Now.AddMinutes(-5);
|
public static decimal hqty = 2;
|
//读取数据
|
private void btnReadData_Click(object sender, EventArgs e)
|
{
|
if (this.HEmpCode.Text == "")
|
{
|
|
MessageBox.Show("请输入员工编码");
|
}
|
else
|
{
|
if (num == 0)
|
{
|
this.btnReadData.Text = "暂停";
|
this.timer1.Enabled = true;
|
num = 1;
|
SelectTime = -4;
|
}
|
else if (num == 1)
|
{
|
this.btnReadData.Text = "启动";
|
this.timer1.Enabled = false;
|
num = 0;
|
}
|
}
|
}
|
|
//员工编码回车
|
private void HEmpCode_KeyDown(object sender, KeyEventArgs e)
|
{
|
if (e.KeyCode == Keys.Enter) {
|
SelectHEmpCode(this.HEmpCode.Text);
|
}
|
}
|
|
//查询员工
|
public void SelectHEmpCode(string HNumber)
|
{
|
try
|
{
|
DataSet ds = oCN.RunProcReturn("select * from Gy_Employee where HNumber='" + HNumber + "' ", "Gy_Employee");
|
if (ds.Tables[0].Rows.Count == 0)
|
{
|
MessageBox.Show("查无数据!");
|
}
|
else
|
{
|
string HEmpCodeName = ds.Tables[0].Rows[0]["HName"].ToString();
|
string HEmpCodeNumber = ds.Tables[0].Rows[0]["HNumber"].ToString();
|
this.HEmpCodeName.Text = HEmpCodeName;
|
this.HEmpCode.Text = HEmpCodeNumber;
|
this.HEmpCode.ReadOnly = true;
|
}
|
}
|
catch (Exception e)
|
{
|
MessageBox.Show(this, e.Message, "提示");
|
}
|
}
|
|
//更换员工
|
private void btnSelect_Click(object sender, EventArgs e)
|
{
|
this.HEmpCode.ReadOnly = false;
|
this.HEmpCode.Focus();
|
this.HEmpCode.Text = "";
|
this.HEmpCodeName.Text = "";
|
|
this.HSouce.ReadOnly = false;
|
this.HSouce.Focus();
|
this.HSouce.Text = "";
|
this.HSouceName.Text = "";
|
}
|
|
private void timer1_Tick(object sender, EventArgs e)
|
{
|
if (this.HEmpCode.Text == "")
|
{
|
|
MessageBox.Show("请输入员工编码");
|
}
|
else
|
{
|
Read_Txt();
|
|
}
|
}
|
|
public static List<string> listData = new List<string>();
|
|
//文本读取数据
|
public void Read_Txt() {
|
|
int year = DateTime.Now.Year;
|
string month = DateTime.Now.Month.ToString();
|
string day = DateTime.Now.Day.ToString();
|
|
string dataTime = DateTime.Now.ToString("yyyyMMdd");
|
////判断是否有这个文件
|
bool flag = File.Exists($@"D:\{year}\{month}\{day}\{dataTime}.txt");
|
//bool flag = File.Exists($@"C:\Users\admin\Desktop\新建文件夹 (2)\20250403T拍照.txt");
|
|
if (flag)
|
{
|
StreamReader stream = new StreamReader($@"D:\{year}\{month}\{day}\{dataTime}.txt", Encoding.GetEncoding("gb2312"));
|
//StreamReader stream = new StreamReader($@"C:\Users\admin\Desktop\新建文件夹 (2)\20250403T拍照.txt", Encoding.GetEncoding("gb2312"));
|
|
string FileData = stream.ReadToEnd();
|
stream.Close();
|
|
//获取条码信息
|
Xt_ReadText(FileData);
|
|
bool flag2 = File.Exists($@"D:\{year}\{month}\{day}\{dataTime}gy.txt");
|
//bool flag2 = File.Exists($@"C:\Users\admin\Desktop\新建文件夹 (2)\20231123gy.txt");
|
|
if (flag2)
|
{
|
stream = new StreamReader($@"D:\{year}\{month}\{day}\{dataTime}gy.txt", Encoding.GetEncoding("gb2312"));
|
//stream = new StreamReader($@"C:\Users\admin\Desktop\新建文件夹 (2)\20231123gy.txt", Encoding.GetEncoding("gb2312"));
|
FileData = stream.ReadToEnd();
|
//获取系统参数
|
Xt_Gy_RoutBill(FileData);
|
}
|
}
|
}
|
|
|
//生产资源回车
|
private void HSouce_KeyDown(object sender, KeyEventArgs e)
|
{
|
if (e.KeyCode == Keys.Enter)
|
{
|
SelectHSouc(this.HSouce.Text);
|
}
|
}
|
|
//查询生产资源
|
public void SelectHSouc(string HNumber)
|
{
|
try
|
{
|
DataSet ds = oCN.RunProcReturn("select * from Gy_Source where HNumber='" + HNumber + "' ", "Gy_Source");
|
if (ds.Tables[0].Rows.Count == 0)
|
{
|
MessageBox.Show("查无数据!");
|
}
|
else
|
{
|
string HSouceName = ds.Tables[0].Rows[0]["HName"].ToString();
|
string HSouceNumber = ds.Tables[0].Rows[0]["HNumber"].ToString();
|
this.HSouceName.Text = HSouceName;
|
this.HSouce.Text = HSouceNumber;
|
this.HSouce.ReadOnly = true;
|
}
|
}
|
catch (Exception e)
|
{
|
MessageBox.Show(this, e.Message, "提示");
|
}
|
}
|
|
public static string AllBeginWork = "-1";
|
public static string AllProcessExchange = "-1";
|
public static string AllProcessExchangeHProcExchBillNo = "";
|
public static string AllProcessExchangeHProcExchInterID = "";
|
|
public void Xt_ReadText(string FileData)
|
{
|
//获取文本所有数据
|
FileData = FileData.Substring(0, FileData.Length - 1);
|
FileData = "[" + FileData + "]";
|
//JSON序列化转换字典集合
|
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
|
List<object> DataList = JsonConvert.DeserializeObject<List<object>>(FileData);
|
foreach (JObject item in DataList)
|
{
|
Dictionary<string, string> dic = new Dictionary<string, string>();
|
foreach (var itm in item.Properties())
|
{
|
dic.Add(itm.Name, itm.Value.ToString());
|
}
|
list.Add(dic);
|
}
|
//获取当前时间
|
DateTime ActionTime = DateTime.Parse(DateTime.Now.AddMinutes(SelectTime).ToString("yyyy-MM-dd HH:mm:ss"));
|
DateTime EndTime = DateTime.Parse(DateTime.Now.AddMinutes(1).ToString("yyyy-MM-dd HH:mm:00"));
|
bool flag_1 = false;
|
bool flag_2 = false;
|
//循环集合
|
for (int i = 0; i < list.Count; i++)
|
{
|
string HBarCode = list[i]["HBadCodeSN"].ToString();
|
DateTime NowTime = DateTime.Parse(list[i]["HDate"].ToString());
|
if (NowTime >= ActionTime && NowTime < EndTime && list[i]["HBadCodeSN"].ToString() != "" && listData.Contains(HBarCode)==false)
|
{
|
string HSourceCode = list[i]["HSouceNumber"].ToString();
|
string HEmpCode = this.HEmpCode.Text;
|
//string HEmpCode = "";
|
string HType = list[i]["HBadReason"].ToString();
|
int HCount = 1;
|
string HCreateTime = list[i]["HDate"].ToString();
|
string HDate = DateTime.Parse(list[i]["HDate"].ToString()).ToString("yyyy-MM-dd");
|
string HResult = list[i]["HResult"].ToString();
|
string HProcNumber = list[i]["HProcNumber"].ToString();
|
int HFlag = 0;
|
|
//DataSet ds = oCN.RunProcReturn(@"select * from Sb_EquipMentCollection_SN where HBarCode='" + HBarCode + "' and HCreateTime='" + HCreateTime + "'", "Sb_EquipMentCollection_SN");
|
|
if (true)
|
{
|
DataSet dataSet;
|
|
string HProjectNum = HBarCode.Substring(18, 8);
|
//通过截取项目号 如果第一条数据的项目号跟后面的一样 就不进行判断
|
if (HBarCode.Contains(AllProcessExchange)==false) {
|
|
//判断流转卡是否存在
|
dataSet = oCN.RunProcReturn("select HInterID,HBillNo from Sc_ProcessExchangeBillMain where HProjectNum='" + HProjectNum + "-1'", "Sc_ProcessExchangeBillMain");
|
if (dataSet.Tables[0].Rows.Count > 0) {
|
AllProcessExchangeHProcExchBillNo = dataSet.Tables[0].Rows[0]["HBillNo"].ToString();
|
AllProcessExchangeHProcExchInterID = dataSet.Tables[0].Rows[0]["HInterID"].ToString();
|
AllProcessExchange = HProjectNum;
|
}
|
}
|
//判断截取的项目号 跟赋值的项目号是否一样 需要先满足上面的条件
|
if (AllProcessExchange == HProjectNum)
|
{
|
//通过截取项目号 如果第一条数据的项目号跟后面的一样 就不进行判断
|
if (HBarCode.Contains(AllBeginWork) == false) {
|
//判断当前流转卡对应的工序数据是否开工
|
dataSet = oCN.RunProcReturn("select * from Sc_ICMOBillStatus_Tmp where HSourceBillNo='" + AllProcessExchangeHProcExchBillNo + "' and HICMOStatus<>'0'", "Sc_ICMOBillStatus_Tmp");
|
|
if (dataSet.Tables[0].Rows.Count > 0)
|
{
|
AllBeginWork = HProjectNum;
|
}
|
}
|
|
//满足上述条件 并且项目号 和赋值项目号一样 则进行新增
|
if (AllBeginWork == HProjectNum)
|
{
|
if (Get_AllowLoadData(HBarCode, HProcNumber, flag_1, AllProcessExchangeHProcExchBillNo, AllProcessExchangeHProcExchInterID, out flag_2))
|
{
|
//新增条码数据
|
string sql = $@"insert into Sb_EquipMentCollection_SN(HSourceCode,HEmpCode,HType,HBarCode,HCount,HCreateTime,HDate,HResult,HProcNumber,HFlag)
|
values('{HSourceCode}','{HEmpCode}','{HType}','{HBarCode}','{HCount}','{HCreateTime}','{HDate}','{HResult}','{HProcNumber}','{HFlag}')";
|
oCN.RunProc(sql);
|
ListSelect.Items.Add("条码:" + HBarCode + ",当前日期;"+DateTime.Now.ToString()+",日期:" + HCreateTime + ",结果:" + HResult);
|
listData.Add(HBarCode);
|
}
|
else
|
{
|
flag_1 = flag_2;
|
}
|
}
|
else
|
{
|
if (!flag_1 && (DateTime.Now - time).Minutes > hqty)
|
{
|
time = DateTime.Now;
|
MessageBox.Show(new Form { TopMost = true }, "条码:" + HBarCode + ",对应的流转卡:" + AllProcessExchangeHProcExchBillNo + ",流转卡未开工!");
|
}
|
DBHelper.CustomWriteLog("条码:" + HBarCode + ",对应的流转卡:" + AllProcessExchangeHProcExchBillNo + ",流转卡未开工!", DateTime.Now.ToString("yyyy-MM-dd"));
|
flag_1 = true;
|
}
|
}
|
else
|
{
|
if (!flag_1 && (DateTime.Now - time).Minutes > hqty)
|
{
|
time = DateTime.Now;
|
MessageBox.Show(new Form { TopMost = true }, "条码:" + HBarCode + ",流转卡不存在!");
|
}
|
DBHelper.CustomWriteLog("条码:" + HBarCode + ",流转卡不存在!", DateTime.Now.ToString("yyyy-MM-dd"));
|
flag_1 = true;
|
}
|
}
|
}
|
else
|
{
|
//CustomWriteLog("时间不在保存范围内", DateTime.Now.ToString("yyyy-MM-dd"));
|
}
|
}
|
}
|
|
//读取系统参数
|
public void Xt_Gy_RoutBill(string FileData)
|
{
|
FileData = FileData.Substring(0, FileData.Length - 1);
|
FileData = "[" + FileData + "]";
|
//JSON序列化转换字典集合
|
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
|
List<object> DataList = JsonConvert.DeserializeObject<List<object>>(FileData);
|
foreach (JObject item in DataList)
|
{
|
Dictionary<string, string> dic = new Dictionary<string, string>();
|
foreach (var itm in item.Properties())
|
{
|
dic.Add(itm.Name, itm.Value.ToString());
|
}
|
list.Add(dic);
|
}
|
//获取当前时间
|
DateTime ActionTime = DateTime.Parse(DateTime.Now.AddMinutes(-1).ToString("yyyy-MM-dd HH:mm:ss"));
|
DateTime EndTime = DateTime.Parse(DateTime.Now.AddMinutes(1).ToString("yyyy-MM-dd HH:mm:00"));
|
//循环集合
|
for (int i = 0; i < list.Count; i++)
|
{
|
DateTime NowTime = DateTime.Parse(list[i]["HDate"].ToString());
|
if (NowTime >= ActionTime && NowTime < EndTime)
|
{
|
string HSourceCode = list[i]["HSouceNumber"].ToString();
|
string HEmpCode = this.HEmpCode.Text;
|
//string HEmpCode = "";
|
string HType = list[i]["HType"].ToString();
|
string HBarCode = list[i]["HBadCodeSN"].ToString();
|
double HCount = double.Parse(list[i]["HCount"].ToString());
|
string HCreateTime = list[i]["HDate"].ToString();
|
string HDate = DateTime.Parse(list[i]["HDate"].ToString()).ToString("yyyy-MM-dd");
|
string HResult = list[i]["HResult"].ToString();
|
string HProcNumber = list[i]["HProcNumber"].ToString();
|
int HFlag = 0;
|
|
DataSet ds = oCN.RunProcReturn(@"select * from Sb_EquipMentCollectionTechParam_SN where HBarCode='" + HBarCode + "' and HCreateTime='" + HCreateTime + "'", "Sb_EquipMentCollectionTechParam_SN");
|
|
if (ds.Tables[0].Rows.Count == 0)
|
{
|
string sql = $@"insert into Sb_EquipMentCollectionTechParam_SN(HSourceCode,HEmpCode,HType,HBarCode,HCount,HCreateTime,HDate,HResult,HProcNumber,HFlag)
|
values('{HSourceCode}','{HEmpCode}','{HType}','{HBarCode}','{HCount}','{HCreateTime}','{HDate}','{HResult}','{HProcNumber}','{HFlag}')";
|
oCN.RunProc(sql);
|
//ListSelect.Items.Add("条码:" + HBarCode + ",日期:" + HCreateTime + ",结果:" + HResult);
|
}
|
}
|
else
|
{
|
//CustomWriteLog("时间不在保存范围内", DateTime.Now.ToString("yyyy-MM-dd"));
|
}
|
}
|
|
}
|
|
public static string AllSNBarcodeProcCtrl = "";
|
public static string AllHProcID = "0";
|
public static string AllHProName = "";
|
public static double AllHQty = 0;
|
|
//根据条码 判断是否保存
|
public bool Get_AllowLoadData(string HBarCode, string HProcNumber, bool flag_1,string HProcExchBillNo,string HProcExchInterID, out bool flag_2)
|
{
|
//判断条码的长度
|
if (HBarCode.Length != 29 && HBarCode.Length != 50)
|
{
|
flag_2 = false;
|
return false;
|
}
|
|
//判断长度是否为29位 无尘车间
|
if (HBarCode.Length == 29)
|
{
|
|
}
|
//判断长度是否为50位 15车间
|
else if (HBarCode.Length == 50)
|
{
|
string str1 = HBarCode.Substring(42, 8);
|
DataSet ds = oCN.RunProcReturn("select HBillNo from Sc_ProcessExchangeBillMain where HProjectNum like'" + str1 + "-1%'", "Sc_ProcessExchangeBillMain");
|
//判断是否能找到对应的流转卡
|
if (ds.Tables[0].Rows.Count > 0)
|
{
|
HProcExchBillNo = ds.Tables[0].Rows[0]["HBillNo"].ToString();
|
}
|
else
|
{
|
//flag_1=只有第一次进来才会弹出 错误信息弹出框 定时超过2分钟弹一次
|
if (!flag_1 && (DateTime.Now - time).Minutes > hqty)
|
{
|
time = DateTime.Now;
|
MessageBox.Show("条码:" + HBarCode + ",流转卡不存在!");
|
}
|
DBHelper.CustomWriteLog("条码:" + HBarCode + ",流转卡不存在!", DateTime.Now.ToString("yyyy-MM-dd"));
|
|
flag_2 = true;
|
return false;
|
}
|
}
|
DataSet ds1;
|
|
//第一次流转卡+工序和后面的做对比 如果是同一个流转卡就不进行判断
|
if ((HProcExchBillNo + HProcNumber) != AllSNBarcodeProcCtrl) {
|
|
//查询工序
|
ds1 = oCN.RunProcReturn(@"SELECT HItemID,HName FROM Gy_Process WHERE HNumber='" + HProcNumber + "'", "Gy_Process");
|
if (ds1.Tables[0].Rows.Count > 0)
|
{
|
AllHProcID = ds1.Tables[0].Rows[0]["HItemID"].ToString();
|
AllHProName = ds1.Tables[0].Rows[0]["HName"].ToString();
|
}
|
|
//查询流转卡数量
|
ds1 = oCN.RunProcReturn(@"SELECT HQty FROM Sc_ProcessExchangeBillSub where HInterID=" + HProcExchInterID + " and HProcID=" + AllHProcID, "Sc_ProcessExchangeBillSub");
|
if (ds1.Tables[0].Rows.Count > 0)
|
{
|
AllHQty = double.Parse(ds1.Tables[0].Rows[0]["HQty"].ToString());
|
}
|
|
AllSNBarcodeProcCtrl = HProcExchBillNo + HProcNumber;
|
}
|
|
////第一次流转卡+工序和后面的做对比 如果是同一个流转卡就不进行判断
|
//if ((HProcExchBillNo + HProcNumber) == AllSNBarcodeProcCtrl)
|
//{
|
//过站控制
|
//判断当前工序对应的条码是否上道工序过站
|
ds1 = oCN.RunProcReturn("exec h_p_Sc_SNBarcodeProcCtrl_S '" + HBarCode + "'," + AllHProcID, "h_p_Sc_SNBarcodeProcCtrl_S");
|
|
if (ds1.Tables[0].Rows.Count == 0)
|
{
|
//flag_1=只有第一次进来才会弹出 错误信息弹出框 定时超过2分钟弹一次
|
if (!flag_1 && (DateTime.Now - time).Minutes > hqty)
|
{
|
time = DateTime.Now;
|
MessageBox.Show("条码:" + HBarCode + "工序:" + AllHProName + ",工序控制查无数据!");
|
}
|
DBHelper.CustomWriteLog("条码:" + HBarCode + "工序:" + AllHProName + ",工序控制查无数据!", DateTime.Now.ToString("yyyy-MM-dd"));
|
|
flag_2 = true;
|
return false;
|
}
|
else if (ds1.Tables[0].Rows[0]["HBack"].ToString() == "2")
|
{
|
//flag_1=只有第一次进来才会弹出 错误信息弹出框 定时超过2分钟弹一次
|
if (!flag_1 && (DateTime.Now - time).Minutes > hqty)
|
{
|
time = DateTime.Now;
|
MessageBox.Show("条码:" + HBarCode + "工序:" + AllHProcID + "," + ds1.Tables[0].Rows[0]["HBackRemark"].ToString() + "!");
|
}
|
DBHelper.CustomWriteLog("条码:" + HBarCode + "工序:" + AllHProcID + "," + ds1.Tables[0].Rows[0]["HBackRemark"].ToString() + "!", DateTime.Now.ToString("yyyy-MM-dd"));
|
|
flag_2 = true;
|
return false;
|
}
|
//}
|
|
//查询出站数量是否超过流转卡数量
|
ds1 = oCN.RunProcReturn($@"select ({AllHQty}-sum(isnull(ou.HQty,0))-sum(isnull(ou.HBadCount,0))) HQty from Sc_StationOutBillMain ou WITH(NOLOCK)
|
where ou.HProcExchInterID={HProcExchInterID} and ou.HProcID={AllHProcID}
|
group by ou.HProcExchInterID,ou.HProcExchEntryID,ou.HQty", "Sc_StationOutBillMain");
|
|
//获取流转卡数量
|
double hqtyOut = AllHQty;
|
|
if (ds1.Tables[0].Rows.Count > 0) {
|
hqtyOut = double.Parse(ds1.Tables[0].Rows[0][0].ToString());
|
}
|
//流转卡数量-出站单数量大于0
|
if (hqtyOut <= 0)
|
{
|
//flag_1=只有第一次进来才会弹出 错误信息弹出框 定时超过2分钟弹一次
|
if (!flag_1 && (DateTime.Now - time).Minutes > hqty)
|
{
|
time = DateTime.Now;
|
MessageBox.Show("流转卡:" + HProcExchBillNo + ",出站数量超过流转卡数量!");
|
}
|
DBHelper.CustomWriteLog("流转卡:" + HProcExchBillNo + ",出站数量超过流转卡数量!", DateTime.Now.ToString("yyyy-MM-dd"));
|
flag_2 = true;
|
return false;
|
}
|
|
//拍照工序除外
|
if (HProcNumber != "013")
|
{
|
//增加产线组装追溯单
|
//查询当前流转卡对应的工序有没有配件信息,如果有 则判断配件单的数量是否为0
|
DataSet dataSet = oCN.RunProcReturn("exec h_p_Gy_BarCodeBillBomList '" + HProcExchBillNo + "'," + AllHProcID, "h_p_Gy_BarCodeBillBomList");
|
if (dataSet.Tables[0].Rows.Count > 0)
|
{
|
//判配件数量是否等于0
|
for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
|
{
|
double SYHQty = double.Parse(dataSet.Tables[0].Rows[i]["配件数量"].ToString());
|
string HMaterNamePJ = dataSet.Tables[0].Rows[i]["配件代码"].ToString();
|
string HMaterBarCode = dataSet.Tables[0].Rows[i]["HBarCode"].ToString();
|
if (SYHQty == 0)
|
{
|
//flag_1=只有第一次进来才会弹出 错误信息弹出框 定时超过2分钟弹一次
|
if (!flag_1 && (DateTime.Now - time).Minutes > hqty)
|
{
|
time = DateTime.Now;
|
MessageBox.Show("流转卡:" + HProcExchBillNo + ",配件条码:" + HMaterBarCode + ",配件代码:" + HMaterNamePJ + ",数量为0!");
|
}
|
DBHelper.CustomWriteLog("流转卡:" + HProcExchBillNo + ",配件条码:" + HMaterBarCode + ",配件代码:" + HMaterNamePJ + ",数量为0!", DateTime.Now.ToString("yyyy-MM-dd"));
|
flag_2 = true;
|
return false;
|
}
|
}
|
}
|
}
|
|
flag_2 = false;
|
return true;
|
}
|
|
private void ReadyDataForm_FormClosing(object sender, FormClosingEventArgs e)
|
{
|
if (num == 1) {
|
MessageBox.Show("当前按钮未暂停,不允许关闭!");
|
e.Cancel = true;
|
}
|
else if (MessageBox.Show("确定要关闭吗?", "确认", MessageBoxButtons.YesNo) == DialogResult.No)
|
{
|
e.Cancel = true;
|
}
|
}
|
|
private void btnSelectAll_Click(object sender, EventArgs e)
|
{
|
if (num == 0)
|
{
|
if (MessageBox.Show("是否启用检索补漏?", "确认", MessageBoxButtons.YesNo) == DialogResult.Yes)
|
{
|
SelectTime = -90;
|
Read_Txt();
|
}
|
}
|
else if (num == 1)
|
{
|
MessageBox.Show("请先点击暂停按钮!");
|
}
|
|
|
}
|
}
|
}
|