using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using UAS_MES.CustomControl.TextBoxWithIcon;
using UAS_MES.DataOperate;
using UAS_MES.Entity;
using UAS_MES.PublicMethod;
namespace UAS_MES.Make
{
public partial class Make_SeqTransform : Form
{
AutoSizeFormClass asc = new AutoSizeFormClass();
DataHelper dh;
DataTable dt;
DataTable rules;
LogStringBuilder sql = new LogStringBuilder();
string bsncode = "";//转换前序列号
string errorMessage = "";
string startNo = "";//起始序列
string endNo = "";//终止序列
string system = "";//进制
bool flag=false;//标识是否只是过站
//存放工单中数量
int ma_qty;
string oMakeCode = "";
string oMsId = "";
public Make_SeqTransform()
{
InitializeComponent();
}
private void 序列转换_Load(object sender, EventArgs e)
{
asc.controllInitializeSize(this);
dh = new DataHelper();
sncode.Focus();
OperateResult.AppendText(">>请输入转换前的序列号\n", Color.Black);
////设置锁定工单
//ms_makecode_lock.GetMakeCodeCtl(ma_code);
//ma_code.SetLockCheckBox(ms_makecode_lock);
////工单放大镜的配置
//ma_code.TableName = "make left join product on ma_prodcode=pr_code";
//ma_code.SelectField = "ma_code # 工单号,ma_prodcode # 产品编号,pr_detail # 产品名称";
//ma_code.FormName = Name;
//ma_code.SetValueField = new string[] { "ma_code", "ma_prodcode", "pr_detail" };
//ma_code.Condition = "ma_statuscode='STARTED'";
//ma_code.DbChange += Ma_code_DbChange;
}
//private void Ma_code_DbChange(object sender, EventArgs e)
//{
// Dbfind = ma_code.ReturnData;
// BaseUtil.SetFormValue(this.Controls, Dbfind);
//}
private void sncode_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (sncode.Text != "")
{
if (LogicHandler.CheckStepAttribute(Tag.ToString(), User.UserSourceCode, out errorMessage))
{
OperateResult.AppendText(">>序列号:" + sncode.Text + " , 发送请求\n", Color.Black);
//如果用户没有输入工单号自行去后台查询
//通过工单序列号关系验证
//bsncode为空,就说明是输入转换之前的序列号
if (bsncode == "")
{
//定义传入方法的变量
string ms_id = dh.getFieldDataByCondition("MakeSerial", "max(ms_id) ms_id", "upper(ms_sncode)='" + sncode.Text.ToUpper() + "' or ms_firstsn in (select firstsn from makesnrelation where upper(beforesn)='" + sncode.Text.ToUpper() + "')").ToString();
oMakeCode = dh.getFieldDataByCondition("MakeSerial", "ms_makecode", "ms_id='" + ms_id + "'").ToString();
if (oMakeCode == "")
{
OperateResult.AppendText(">>序列号:" + sncode.Text + " 未归属工单\n", Color.Red);
OperateResult.AppendText(">>请输入转换前的序列号\n", Color.Black,sncode);
return;
}
//用户填写了工单号,那么序列号必须要是该工单的,否则提示错误
if (LogicHandler.CheckStepSNAndMacode(oMakeCode, User.UserSourceCode, sncode.Text, User.UserCode, out oMakeCode, out oMsId, out errorMessage))
{
//如果用户没有选择工单号
if (ma_code.Text == "" || ma_code.Text != oMakeCode)
{
//按照out出的工单号查出工单相关信息,并赋值到相关控件
sql.Clear();
sql.Append("select ma_code,ma_softversion,ma_prodcode,pr_detail,ma_qty,ma_qty-mcd_inqty as remain_qty ");
sql.Append("from makeserial left join make on ms_makecode=ma_code left join product on ");
sql.Append("ms_prodcode=pr_code left join makecraftdetail on ms_makecode=mcd_macode where ms_id=:msid and mcd_stepcode='" + User.CurrentStepCode + "'");
dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select",oMsId);
if (dt.Rows.Count > 0)
{
//记录数量
ma_qty = int.Parse(dt.Rows[0]["ma_qty"].ToString());
BaseUtil.SetFormValue(this.Controls, dt);
//ms_makecode_lock.Checked = true;
}
}
switch (ChangeResult.CheckState)
{
//勾选是修改已转换的序列,矫正修改错了的序列号
case CheckState.Checked:
if (dh.CheckExist("MakeSerial", "ms_beforesn='" + sncode.Text + "' and ms_id='" + oMsId + "'"))
{
bsncode = sncode.Text;
//显示序列号
show_sncode.Text = bsncode;
OperateResult.AppendText("<<请输入转换后的序列号\n", Color.Green,sncode);
ChangeResult.Enabled = false;
}
else
{
//修改转换结果时,输入两次SN直接过站
if (dh.CheckExist("MakeSerial", "ms_sncode='" + sncode.Text + "' and ms_id='" + oMsId + "' and ms_beforesn is not null"))
{
bsncode = sncode.Text;
//显示序列号
show_sncode.Text = bsncode;
OperateResult.AppendText("<<请输入转换后的序列号\n", Color.Green, sncode);
ChangeResult.Enabled = false;
flag = true;
}
else
{
OperateResult.AppendText(">>不存在该已转序列号:" + sncode.Text + "\n", Color.Red, sncode);
OperateResult.AppendText("<<请重新输入序列号\n", Color.Black);
}
}
break;
case CheckState.Unchecked:
//string beforesn = dh.getFieldDataByCondition("makeserial", "ms_beforesn", "ms_sncode='" + sncode.Text + "'").ToString().Trim();
//为空,就说明,没有进行过序列号的转换
if (dh.CheckExist("makeserial", "ms_sncode='" + sncode.Text + "' and ms_id='" + oMsId + "' and ms_beforesn is null"))
{
//记录转换前的序列号
bsncode = sncode.Text;
//显示序列号
show_sncode.Text = bsncode;
OperateResult.AppendText("<<请输入转换后的序列号\n", Color.Green,sncode);
ChangeResult.Enabled = false;
}
else
//不为空,进行过转换。不勾选修改结果,就不能再修改
{
OperateResult.AppendText(">>序列号" + sncode.Text + "已经转换过\n", Color.Red,sncode);
OperateResult.AppendText("<<请重新输入序列号\n", Color.Black);
}
break;
default:
break;
}
}
else
{
OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red,sncode);
}
}
//bsncode不为空,说明输入的是转换后的序列号
else
{
//判断工单是否导入了序列号清单
if (dh.CheckExist("makesnlist", "msl_makecode='"+oMakeCode+"' and msl_type='after'"))
{
if (!dh.CheckExist("makesnlist", "msl_makecode='"+oMakeCode+"' and msl_sncode='"+sncode.Text+"' and msl_type='after'"))
{
//有序列号清单,输入的序列号却不在范围内
OperateResult.AppendText(">>序列号"+sncode.Text+"错误,不在工单设定的序列号范围内\n", Color.Red, sncode);
return;
}
}
//判断用户是否锁定输入转换后序列号长度,
if (!checkLengthOrPre(afterTransSNLength_checkBox, afterTransSNLength, "长度"))
return;
//判断用户是否锁定输入转换后序列号前缀,
if (!checkLengthOrPre(afterTransSNPre_checkBox, afterTransSNPre, "前缀"))
return;
//判断输入的转换后序列号是否符合起始终止
if (!checkStartAndEnd())
{
OperateResult.AppendText(">>序列号" + sncode.Text + "校验错误,不在工单防呆规则指定范围内!\n", Color.Red,sncode);
return;
}
//如果只是需要过站的序列号
if (flag)
{
if (bsncode == sncode.Text)
{
//写入日志
LogicHandler.SetStepResult(ma_code.Text, User.UserSourceCode, sncode.Text, "序列转换", "序列转换成功", User.UserCode, out errorMessage);
if (errorMessage.Contains("AFTERSUCCESS"))
OperateResult.AppendText(">>" + errorMessage + "\n");
//记录日志
LogicHandler.DoCommandLog(Tag.ToString(), User.UserCode, oMakeCode, User.UserLineCode, User.UserSourceCode, "序列转换", "转换成功", sncode.Text, "");
OperateResult.AppendText(">>转换成功\n", Color.Green,sncode);
flag = false;
ChangeResult.Enabled = true;
bsncode = "";
}
else
{
OperateResult.AppendText(">>输入一致才可过站\n", Color.Red,sncode);
}
return;
}
//如果两次输入的序列号相同进行提示,不相同则进行下一步
if (bsncode != sncode.Text)
{
if ((ChangeResult.Checked && dh.CheckExist("makeserial", "ms_sncode='" + sncode.Text + "' and ms_id='" + oMsId + "'")) || !dh.CheckExist("makeserial", "ms_sncode='" + sncode.Text + "'"))
{
string firstsn = "";
string updateSql = "";
//勾选了修改转换结果
if (ChangeResult.Checked)
{
//查询ms_firstsn
firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", "ms_beforesn='" + bsncode + "' and ms_id='" + oMsId + "'").ToString();
//记录本次修改,存入makesnrelation表中
updateSql = "update makeserial set ms_sncode='" + sncode.Text + "' where ms_beforesn='" + bsncode + "' and ms_id='" + oMsId + "'";
//删除最近一条转换记录
dh.ExecuteSql("delete from makesnrelation where BEFORESN='"+bsncode+"' and makecode='"+oMakeCode+"'", "delete");
}
//未勾选修改转换结果
else
{
//查询ms_firstsn
firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", "ms_sncode='" + bsncode + "' and ms_id='" + oMsId + "'").ToString();
//记录本次修改,存入makesnrelation表中
updateSql = "update makeserial set ms_sncode='" + sncode.Text + "', ms_beforesn='" + bsncode + "' where ms_sncode='" + bsncode + "' and ms_id='" + oMsId + "'";
}
string insertSql = "insert into makesnrelation (BEFORESN,SN,FIRSTSN,MAKECODE,msr_indate, msr_inman)values('" + bsncode + "','" + sncode.Text + "','" + firstsn + "','" + ma_code.Text + "', sysdate ,'" + User.UserCode + "')";
dh.ExecuteSQLTran(updateSql, insertSql);
OperateResult.AppendText(">>转换成功\n", Color.Green);
//写入日志
LogicHandler.SetStepResult( ma_code.Text, User.UserSourceCode, sncode.Text, "序列转换", "序列转换成功", User.UserCode, out errorMessage);
//记录日志
LogicHandler.DoCommandLog(Tag.ToString(), User.UserCode, oMakeCode, User.UserLineCode, User.UserSourceCode, "序列转换", "转换成功", sncode.Text, "");
LogManager.DoLog("修改序列号:" + bsncode + "为" + sncode.Text + "成功!" + "操作人:" + User.UserCode);
OperateResult.AppendText(">>请输入转换前的序列号\n", Color.Black);
//置空
bsncode = "";
show_sncode.Text = "";
//获取剩余数,刷新页面
sql.Clear();
sql.Append("select mcd_inqty from makecraftdetail where mcd_macode='" + ma_code.Text + "' and mcd_stepcode='" + User.CurrentStepCode + "'");
dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select");
if (dt.Rows.Count > 0)
{
remain_qty.Text = ma_qty - int.Parse(dt.Rows[0]["mcd_inqty"].ToString()) + "";
}
//更新数量
changenum.Text = int.Parse(changenum.Text) + 1 + "";
ChangeResult.Enabled = true;
}
else
OperateResult.AppendText(">>序列号" + sncode.Text + "已存在,请输入其他序列号\n", Color.Red);
}
else
{
OperateResult.AppendText(">>相同序列号不能进行转换\n", Color.Red);
}
sncode.Text = "";
}
}
else
{
OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red,sncode);
}
}
else
{
OperateResult.AppendText(">>序列号不能为空\n", Color.Red);
}
sncode.Text = "";
}
}
private void 序列转换_SizeChanged(object sender, EventArgs e)
{
asc.controlAutoSize(this);
}
private void Confirm_Click(object sender, EventArgs e)
{
KeyEventArgs ky = new KeyEventArgs(Keys.Enter);
sncode_KeyDown(sender, ky);
}
private void ReCall_Click(object sender, EventArgs e)
{
bsncode = "";
OperateResult.AppendText(">>请输需要转换的序列号\n", Color.Green,show_sncode);
ChangeResult.Enabled = true;
flag = false;
}
///
/// 工单号keydown
///
///
///
private void ms_makecode_KeyDown(object sender, KeyEventArgs e)
{
}
///
/// 如果清空了工单号,或者更换了工单号则将 : 转换前序列号长度,转换前序列号前缀
///转换后序列号长度,转换后序列号前缀 四个字段值清空。
///
///
///
private void ms_makecode_UserControlTextChanged(object sender, EventArgs e)
{
//清空
beforeTransSNPre.Text = "";
beforeTransSNLength.Text = "";
afterTransSNPre.Text = "";
afterTransSNLength.Text = "";
//取消勾选
beforeTransSNPre_checkBox.Checked = false;
beforeTransSNLength_checkBox.Checked = false;
afterTransSNPre_checkBox.Checked = false;
afterTransSNLength_checkBox.Checked = false;
//设置可编辑
beforeTransSNLength.Enabled = true;
beforeTransSNPre.Enabled = true;
afterTransSNLength.Enabled = true;
afterTransSNPre.Enabled = true;
beforeTransSNPre_checkBox.Enabled = true;
beforeTransSNLength_checkBox.Enabled = true;
afterTransSNPre_checkBox.Enabled = true;
afterTransSNLength_checkBox.Enabled = true;
//判断工单是否导入了序列号清单
if (dh.CheckExist("makesnlist", "msl_makecode='" + oMakeCode + "' and msl_type='after'"))
{
return;
}
//查询表工单序列号防呆规则表
rules = (DataTable)dh.ExecuteSql("select msr_startno,msr_endno,msr_system,msr_type, msr_prefix ,msr_length from makesnrule where msr_makecode='" + oMakeCode + "'", "select");
if (rules.Rows.Count > 0)
{
foreach (DataRow dr in rules.Rows)
{
//如果有值,则这个字段自动勾选,并且不可编辑
if (dr["msr_type"].ToString().ToLower() == "before")
{
//msr_type=before 的值赋值到转换前
//临时变量记录
string length = dr["msr_length"].ToString();
string prefix = dr["msr_prefix"].ToString();
//不为空
if (prefix != "" && prefix != null)
{
//则赋值
beforeTransSNPre.Text = prefix;
//设置不可编辑
beforeTransSNPre.Enabled = false;
//勾选
beforeTransSNPre_checkBox.Checked = true;
beforeTransSNPre_checkBox.Enabled = false;
}
if (length != "" && length != null)
{
//赋值
beforeTransSNLength.Text = length;
//设置不可编辑
beforeTransSNLength.Enabled = false;
//勾选
beforeTransSNLength_checkBox.Checked = true;
beforeTransSNLength_checkBox.Enabled = false;
}
}
else if (dr["msr_type"].ToString().ToLower() == "after")
{
//msr_type=after 的值赋值到转换后
//临时变量记录
string length = dr["msr_length"].ToString();
string prefix = dr["msr_prefix"].ToString();
//记录进制
system = dr["msr_system"].ToString();
//不为空
if (prefix != "" && prefix != null)
{
//则赋值
afterTransSNPre.Text = prefix;
//设置不可编辑
afterTransSNPre.Enabled = false;
//勾选
afterTransSNPre_checkBox.Checked = true;
afterTransSNPre_checkBox.Enabled = false;
}
if (dr["msr_startno"].ToString() != "" && dr["msr_endno"].ToString() != "")
{
//记录起止序列号
startNo = dr["msr_startno"].ToString().Substring(afterTransSNPre.Text.Length);
endNo = dr["msr_endno"].ToString().Substring(afterTransSNPre.Text.Length);
}
if (length != "" && length != null)
{
//赋值
afterTransSNLength.Text = length;
//设置不可编辑
afterTransSNLength.Enabled = false;
//勾选
afterTransSNLength_checkBox.Checked = true;
afterTransSNLength_checkBox.Enabled = false;
}
}
}
}
else
{
/* 如果转换前没有值,则取 select productsnrule where psr_prodcode=? 产品编号,
* 有值则赋值到 转换前,并且自动勾选不可编辑。*/
rules = (DataTable)dh.ExecuteSql("select psr_prefix ,psr_length from productsnrule where psr_prodcode = '"+ dt.Rows[0]["ma_prodcode"].ToString()+"' and psr_type='after'", "select");
if (rules.Rows.Count > 0)
{
//将产品序列号防呆规则查出的数据填充
if (rules.Rows[0]["psr_prefix"].ToString()!="")
{
afterTransSNPre.Text = rules.Rows[0]["psr_prefix"].ToString();
afterTransSNPre.Enabled = false;
afterTransSNPre_checkBox.Checked = true;
afterTransSNPre_checkBox.Enabled = false;
}
if (rules.Rows[0]["psr_length"].ToString() != "")
{
afterTransSNLength.Text = rules.Rows[0]["psr_length"].ToString();
afterTransSNLength.Enabled = false;
afterTransSNLength_checkBox.Checked = true;
afterTransSNLength_checkBox.Enabled = false;
}
}
}
}
///
/// 检验长度或者前缀是否合法
///
///
///
///
private bool checkLengthOrPre(CheckBox checkbox, TextBox textbox, string type)
{
if (checkbox.Checked == true)
{
//如果勾选没有填值
if (textbox.Text=="") {
OperateResult.AppendText(">>勾选长度或者前缀需要填写内容\n", Color.Red);
return false;
}
if (type == "长度")
{
//则判断输入转换前的序列号长度是否合法,不合法则提示
if (sncode.Text.Trim().Length != int.Parse(textbox.Text))
{
//序列号校验错误,长度错误
OperateResult.AppendText(">>序列号" + sncode.Text + "校验错误,长度错误\n", Color.Red,sncode);
OperateResult.AppendText("<<请重新输入序列号\n", Color.Black);
return false;
}
}
else if (type == "前缀")
{
//则判断输入转换前的序列号前缀是否合法,不合法则提示
if (!sncode.Text.StartsWith(textbox.Text.Trim()))
{
//序列号校验错误,前缀错误
OperateResult.AppendText(">>序列号" + sncode.Text + "校验错误,前缀错误\n", Color.Red,sncode);
OperateResult.AppendText("<<请重新输入序列号\n", Color.Black);
return false;
}
}
return true;
}
return true;
}
///
/// 检测转换后的序列号是否满足起止序列号范围
///
///
private bool checkStartAndEnd()
{
if (system=="")
{
return true;
}
if (system == "decimal")
{
//十进制
if (int.Parse(sncode.Text.Substring(afterTransSNPre.Text.Length)) >= int.Parse(startNo) && int.Parse(sncode.Text.Substring(afterTransSNPre.Text.Length)) <= int.Parse(endNo))
{
//满足
return true;
}
}
else
{
//十六进制
if (int.Parse(sncode.Text.Substring(afterTransSNPre.Text.Length), System.Globalization.NumberStyles.HexNumber) >= int.Parse(startNo, System.Globalization.NumberStyles.HexNumber) && int.Parse(sncode.Text.Substring(afterTransSNPre.Text.Length), System.Globalization.NumberStyles.HexNumber) <= int.Parse(endNo, System.Globalization.NumberStyles.HexNumber))
{
//满足
return true;
}
}
return false;
}
}
}