using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using UAS_MES.DataOperate;
using UAS_MES.Entity;
using UAS_MES.PublicMethod;
namespace UAS_MES.Make
{
public partial class Make_SeqProgramTransform : Form
{
AutoSizeFormClass asc = new AutoSizeFormClass();
LogStringBuilder sql = new LogStringBuilder();
DataHelper dh;
//原序列号
string TSN="";
//转换后序列号
string SN="";
//错误信息
string errorMessage;
//存放productsnrelation表中的数据
DataTable ListA;
//存放工单信息
DataTable dt;
//step 记录检验规则的进度
int step=0;
//记录采集的IMEI,BT,MAC等信息
Hashtable hs;
//存放关联信息类型
string type;
public Make_SeqProgramTransform()
{
InitializeComponent();
}
private void Make_SeqProgramTransform_Load(object sender, EventArgs e)
{
asc.controllInitializeSize(this);
dh = new DataHelper();
code.Focus();
//提示用户“>>请输入TSN号”
OperateResult.AppendText(">>请输入TSN号\n", Color.Green);
}
private void 序列烧录转换_SizeChanged(object sender, EventArgs e)
{
asc.controlAutoSize(this);
}
private void code_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode==Keys.Enter)
{
if (code.Text != "")
{
//为0,输入TSN
if (step==0)
{
OperateResult.AppendText(">>序列号:" + code.Text + " , 发送请求\n", Color.Green);
string oMakecode = "";
string oMsid = "";
//核对工序
if (LogicHandler.CheckStepSNAndMacode(ms_macode.Text, User.UserSourceCode, code.Text, User.UserCode, out oMakecode, out oMsid, out errorMessage))
{
//核对TSN是否正确
string beforesn = dh.getFieldDataByCondition("makeserial", "ms_beforesn", "ms_sncode='" + code.Text + "'").ToString().Trim();
if (beforesn == "" || beforesn == null)
{
//按照out出的工单号查出工单相关信息,并赋值到相关控件
sql.Clear();
sql.Append("select ma_code as ms_macode,mcd_okqty,ma_qty,ma_qty-mcd_inqty as remain_qty,pr_detail,pr_code as ma_prodcode ");
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_sncode=:sncode and mcd_stepcode='" + User.CurrentStepCode + "'");
dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select", code.Text);
if (dt.Rows.Count > 0)
{
BaseUtil.SetFormValue(this.Controls, dt);
//判断用户是否锁定输入TSN长度,
if (!checkLengthOrPre(TSNLength_checkBox, TSNLength, "长度"))
{
return;
}
//判断用户是否锁定输入TSN前缀,
if (!checkLengthOrPre(TSNPre_checkBox, TSNPre, "前缀"))
{
return;
}
}
else
{
OperateResult.AppendText(">>序列号" + code.Text + "不存在\n", Color.Red);
return;
}
//获取需要关联采集的信息,以及校验规则
ListA = (DataTable)dh.ExecuteSql("select * from productsnrelation where psr_prodcode='" + ma_prodcode.Text + "' order by psr_detno", "select");
//没有获取到就提示错误请维护产品对应的关联采集信息
if (ListA.Rows.Count==0) {
OperateResult.AppendText(">>请维护产品对应的关联采集信息\n", Color.Red);
OperateResult.AppendText("<<请输入TSN\n", Color.Green);
return;
}
hs = new Hashtable();
step = 1;
//记录转换前的序列号
TSN = code.Text;
code.Text = "";
OperateResult.AppendText("<<请输入SN\n", Color.Green);
}
else
//不为空,进行过转换。不勾选修改结果,就不能再修改
{
OperateResult.AppendText(">>序列号" + code.Text + "已进行了转换\n", Color.Red);
code.Text = "";
OperateResult.AppendText("<<请重新输入TSN\n", Color.Green);
}
}
else
{
OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red);
}
}
else if (step==1)
{
//开始录入SN
if (!dh.CheckExist("makeserial", "ms_sncode='" + code.Text + "'"))
{
//判断用户是否锁定输入SN长度,
if (!checkLengthOrPre(SNLength_checkBox, SNLength, "长度"))
{
return;
}
//判断用户是否锁定输入SN前缀,
if (!checkLengthOrPre(SNPre_checkBox, SNPre, "前缀"))
{
return;
}
//SN校验成功,合法,记录下SN
SN = code.Text;
//开始进行校验规则
if (ListA.Rows.Count>0) {
OperateResult.AppendText("<<请输入" + ListA.Rows[0]["psr_type"] + "\n", Color.Green);
}
//step+1
step = 2;
}
else
{
OperateResult.AppendText(">>序列号" + code.Text + "已存在,请输入其他序列号\n", Color.Red);
}
}
else if(step < ListA.Rows.Count + 2)
{
//开始进行校验规则
if (checkRules(step)) {
step += 1;
}
}
}
else {
OperateResult.AppendText(">>输入不能为空\n", Color.Red);
}
}
}
///
/// 检验长度或者前缀是否合法
///
///
///
///
private bool checkLengthOrPre(CheckBox checkbox, TextBox textbox, string type)
{
if (checkbox.Checked == true)
{
if (type == "长度")
{
//则判断输入转换前的序列号长度是否合法,不合法则提示
if (code.Text.Trim().Length != int.Parse(textbox.Text))
{
//序列号校验错误,长度错误
OperateResult.AppendText(">>TSN号" + code.Text + "校验错误,长度错误\n", Color.Red);
code.Text = "";
OperateResult.AppendText("<<请重新输入TSN\n", Color.Green);
return false;
}
}
else if (type == "前缀")
{
//则判断输入转换前的序列号前缀是否合法,不合法则提示
if (!code.Text.StartsWith(textbox.Text.Trim()))
{
//序列号校验错误,前缀错误
OperateResult.AppendText(">>TSN号" + code.Text + "校验错误,前缀错误\n", Color.Red);
code.Text = "";
OperateResult.AppendText("<<请重新输入TSN\n", Color.Green);
return false;
}
}
return true;
}
return true;
}
///
/// 关联采集的校验
///
///
private bool checkRules(int step)
{
type = ListA.Rows[step - 2]["psr_type"].ToString()=="WIFI"?"MAC": ListA.Rows[step - 2]["psr_type"].ToString();
//如果前缀和长度都满足的话
if ((ListA.Rows[step-2]["psr_length"].ToString() == "" ? true : code.Text.Length == ListA.Rows[step-2]["psr_length"].ToString().Length) && (ListA.Rows[step - 2]["psr_prefix"].ToString() == "" ? true : code.Text.StartsWith(ListA.Rows[step - 2]["psr_prefix"].ToString())))
{
switch (type)
{
case "IMEI1":
case "IMEI2":
case "IMEI3":
if (checkExist("ms_imei1='" + code.Text + "' or ms_imei2 = '" + code.Text + "' or ms_imei3 = '" + code.Text + "'"))
{
return false;
}
else
{
//判断IMEI1,IMEI2,IMEI3中是否已经有这个号了
foreach (DictionaryEntry de in hs) {
if (de.Key.ToString().Contains("IMEI")&&de.Value.ToString()==code.Text) {
OperateResult.AppendText(">>" + type + ":" + code.Text + "已录,请重新输入\n", Color.Red);
code.Text = "";
return false;
}
}
}
break;
case "BT":
case "MAC":
case "NETCODE":
if (checkExist("MS_"+type+"='"+code.Text+"'")) {
return false;
}
break;
}
//满足规则,则采集
hs.Add(type,code.Text);
//说明已经是最后一个校验规则
if (step == ListA.Rows.Count+1)
{
//校验已经完成,此时要再次校验之前的SN和关联采集信息
//再次校验SN
if (!dh.CheckExist("makeserial", "ms_sncode='" + SN + "'"))
{
bool flag = true;
StringBuilder s1 = new StringBuilder();
//再次校验关联采集信息
foreach (DictionaryEntry de in hs)
{
s1.Append("MS_"+ de.Key.ToString()+" = '"+de.Value.ToString()+"',");
if (de.Key.ToString().Contains("IMEI"))
{
if (checkExist("ms_imei1='" + de.Value.ToString() + "' or ms_imei2 = '" + de.Value.ToString() + "' or ms_imei3 = '" + de.Value.ToString() + "'"))
{
flag = false;
OperateResult.AppendText(">>"+de.Key.ToString()+":" + de.Value.ToString() + "已存在,请重新输入TSN\n", Color.Red);
//清空信息
clearInfo();
break;
}
}
else
{
if (checkExist("MS_" + de.Key.ToString() + "='" + de.Value.ToString() + "'"))
{
flag = false;
OperateResult.AppendText(">>" + de.Key.ToString() + ":" + de.Value.ToString() + "已存在,请重新输入TSN\n", Color.Red);
//清空信息
clearInfo();
break;
}
}
}
//根据flag判断关联采集信息二次校验结果
if (flag=true) {
//说明SN和关联采集信息二次校验通过,则进行转换和采集信息绑定
//查询ms_firstsn
string firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", "ms_sncode='" + TSN + "'").ToString();
//记录本次修改,存入makesnrelation表中
string updateSql = "update makeserial set ms_sncode='" + SN + "', ms_beforesn='" + TSN + "',"+ s1.Remove(s1.Length - 1, 1).ToString() + " where ms_sncode='" + TSN + "'";
string insertSql = "insert into makesnrelation (BEFORESN,SN,FIRSTSN,MAKECODE,msr_indate, msr_inman)values('" + TSN + "','" + SN + "','" + firstsn + "','" + ms_macode.Text + "', sysdate ,'" + User.UserCode + "')";
dh.ExecuteSQLTran(updateSql, insertSql);
OperateResult.AppendText(">>序列号转换成功\n", Color.Green);
//写入日志
LogManager.DoLog("修改序列号:" + TSN + "为" + SN + "成功!" + "操作人:" + User.UserCode);
//完成该道工序 setFinish
LogicHandler.UpdateMakeMessage(TSN, ms_macode.Text, "序列烧录转换", User.UserSourceCode, User.UserCode, "序列烧录转换成功", out errorMessage);
//输出提示用户“>>序列号转换成功”,“>>关联采集成功”
OperateResult.AppendText(">>关联采集成功\n", Color.Green);
//获取剩余数,刷新页面
sql.Clear();
sql.Append("select 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_sncode=:sncode and mcd_stepcode='" + User.CurrentStepCode + "'");
dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select", SN);
if (dt.Rows.Count>0) {
remain_qty.Text = dt.Rows[0]["remain_qty"].ToString();
}
//更新页面计数+1
count.Text = int.Parse(count.Text) + 1 + "";
//完成之后,清除信息
clearInfo();
}
}
else
{
OperateResult.AppendText(">>序列号" + SN + "已存在,请重新输入TSN\n", Color.Red);
//清空信息
clearInfo();
}
return false;
}
else {
OperateResult.AppendText("<<请输入"+ ListA.Rows[step-1]["psr_type"] + "\n", Color.Green);
return true;
}
}
else {
//重新输入
OperateResult.AppendText(">>" + ListA.Rows[step-2]["psr_type"] + "校验不通过,请重新输入\n", Color.Red);
return false;
}
}
///
/// 工单号变化时,带出校验规则
///
///
///
private void ms_macode_TextChanged(object sender, EventArgs e)
{
//清空
TSNPre.Text = "";
TSNLength.Text = "";
SNPre.Text = "";
SNLength.Text = "";
//取消勾选
TSNPre_checkBox.Checked = false;
TSNLength_checkBox.Checked = false;
SNPre_checkBox.Checked = false;
SNLength_checkBox.Checked = false;
//设置可编辑
TSNLength.Enabled = true;
TSNPre.Enabled = true;
SNLength.Enabled = true;
SNPre.Enabled = true;
//查询表工单序列号防呆规则表
dt = (DataTable)dh.ExecuteSql("select msr_type, msr_prefix ,msr_length from makesnrule where msr_makecode='" + ms_macode.Text + "'", "select");
if (dt.Rows.Count > 0)
{
foreach (DataRow dr in dt.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)
{
//则赋值
TSNPre.Text = prefix;
//设置不可编辑
TSNPre.Enabled = false;
//勾选
TSNPre_checkBox.Checked = true;
}
if (length != "" && length != null)
{
//赋值
TSNLength.Text = length;
//设置不可编辑
TSNLength.Enabled = false;
//勾选
TSNLength_checkBox.Checked = true;
}
}
else if (dr["msr_type"].ToString().ToLower() == "after")
{
//msr_type=after 的值赋值到转换后
//临时变量记录
string length = dr["msr_length"].ToString();
string prefix = dr["msr_prefix"].ToString();
//不为空
if (prefix != "" && prefix != null)
{
//则赋值
SNPre.Text = prefix;
//设置不可编辑
SNPre.Enabled = false;
//勾选
SNPre_checkBox.Checked = true;
}
if (length != "" && length != null)
{
//赋值
SNLength.Text = length;
//设置不可编辑
SNLength.Enabled = false;
//勾选
SNLength_checkBox.Checked = true;
}
}
}
}
else
{
/* 如果转换前没有值,则取 select productsnrule where psr_prodcode=? 产品编号,
* 有值则赋值到 转换前,并且自动勾选不可编辑。*/
//dt = (DataTable)dh.ExecuteSql("select psr_prefix ,psr_length from productsnrule where psr_prodcode = " + ma_prodcode.Text, "select");
//if (dt.Rows.Count > 0)
//{
// //将产品序列号防呆规则查出的数据填充
// beforeTransSNPre.Text = dt.Rows[0]["psr_prefix"].ToString();
// beforeTransSNPre.ReadOnly = true;
// beforeTransSNPre_checkBox.Checked = true;
// beforeTransSNLength.Text = dt.Rows[0]["psr_length"].ToString();
// beforeTransSNLength.ReadOnly = true;
// beforeTransSNLength_checkBox.Checked = true;
//}
}
}
private bool checkExist(string fields) {
//不存在
if (!dh.CheckExist("makeserial", fields))
{
//则记录
return false;
}
else {
OperateResult.AppendText(">>"+type+"错误,不允许重复\n", Color.Red);
return true;
}
}
private void clearInfo() {
//步骤重置为0
step = 0;
//关联采集信息清空
hs.Clear();
}
private void cancel_Click(object sender, EventArgs e)
{
//清除已经采集的所有信息
clearInfo();
//提示用户输入TSN
OperateResult.AppendText("<<请输入TSN\n", Color.Green);
}
}
}