// SocketServiceForm.ClientConnection
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using JXHospitalWSBLL;
using SocketServiceForm;

public class ClientConnection
{
	private Thread threadClient;

	private Socket socket;

	private Form1 frmMain;

	private bool doesClose;

	public ClientConnection(Form1 f1, Socket socket)
	{
		frmMain = f1;
		this.socket = socket;
		threadClient = new Thread(MoniterMsg);
		threadClient.IsBackground = true;
		threadClient.Start();
	}

	private void MoniterMsg()
	{
		while (!doesClose)
		{
			try
			{
				byte[] byteMsgRec = new byte[4194304];
				int length = socket.Receive(byteMsgRec, byteMsgRec.Length, SocketFlags.None);
				if (length > 0)
				{
					string strMsgRec = Encoding.UTF8.GetString(byteMsgRec, 0, length);
					ShowMsg("从" + socket.RemoteEndPoint.ToString() + "接收消息：" + strMsgRec);
					strMsgRec.Substring(0, 4);
					string _JXsendObj = strMsgRec.Substring(4, strMsgRec.Length - 4);
					string _fun = _JXsendObj.Substring(0, 4);
					string _obj = _JXsendObj.Substring(35, _JXsendObj.Length - 35);
					switch (_fun)
					{
					case "0001":
						SendMsg(JXHospitalBLL.CriminalIn(_obj));
						break;
					case "0002":
						SendMsg(JXHospitalBLL.CriminalConsumedQuota(_obj));
						break;
					case "0003":
						SendMsg(JXHospitalBLL.CriminalOut(_obj));
						break;
					case "0004":
						SendMsg(JXHospitalBLL.CriminalConsume(_obj));
						break;
					case "0005":
						SendMsg(JXHospitalBLL.RealTimeBalance(_obj));
						break;
					case "0006":
						SendMsg(JXHospitalBLL.SynInvoiceResult(_obj));
						break;
					case "0007":
						SendMsg(JXHospitalBLL.MonitorSocketResult(_obj));
						break;
					case "0008":
						SendMsg(JXHospitalBLL.CancelOrderResult(_obj));
						break;
					}
				}
				Close();
			}
			catch (Exception ex)
			{
				if (socket != null)
				{
					ShowErr("客户端" + socket.RemoteEndPoint.ToString() + "断开连接:", ex);
				}
				frmMain.RemoveListItem(socket.RemoteEndPoint.ToString());
				return;
			}
		}
	}

	private void ShowErr(string msg, Exception ex)
	{
		frmMain.ShowErr(msg, ex);
	}

	private void ShowMsg(string msg)
	{
		frmMain.ShowReqTxt(msg);
	}

	public void SendMsg(string msg)
	{
		try
		{
			byte[] msgSendByte = Encoding.UTF8.GetBytes(Encoding.UTF8.GetBytes(msg).Length.ToString("0000") + msg);
			socket.Send(msgSendByte);
			ShowMsg("发送消息：" + Encoding.UTF8.GetString(msgSendByte, 0, msgSendByte.Length));
		}
		catch (Exception ex)
		{
			ShowErr("发送消息：", ex);
		}
	}

	public void Close()
	{
		doesClose = true;
		threadClient.Abort();
		socket.Shutdown(SocketShutdown.Both);
		socket.Close();
		socket = null;
	}
}


// JXHospitalWSBLL.JXHospitalBLL
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web.Script.Serialization;
using JXHospitalWSBLL;
using JXHospitalWSDAL;

public class JXHospitalBLL
{
	public static string GetSocketIp()
	{
		return ConfigurationManager.ConnectionStrings["SocketIP"].ConnectionString;
	}

	public static string GetSocketPort()
	{
		return ConfigurationManager.ConnectionStrings["SocketPort"].ConnectionString;
	}

	public static string CriminalIn(string FCode)
	{
		ResponCriminalIn re = new ResponCriminalIn();
		JavaScriptSerializer jss = new JavaScriptSerializer();
		ReqFCode _fcode = jss.Deserialize<ReqFCode>(FCode);
		string errorMsg = "";
		string errorCode = "";
		try
		{
			using JXHospitalWSDBDataContextCustom db = new JXHospitalWSDBDataContextCustom();
			re.ResultData = (from b in db.T_Criminal
				join c in db.T_Criminal_card on b.FCode equals c.fcrimecode into temp
				from tt in temp.DefaultIfEmpty()
				where b.FCode.Equals(_fcode.FCode)
				select new CriminalEntity
				{
					AmountB = ((tt == null) ? 0m : tt.AmountB.Value),
					AmountC = ((tt == null) ? 0m : tt.AmountC.Value),
					AmountA = ((tt == null) ? 0m : tt.AmountA.Value),
					BankAccNo = tt.BankAccNo,
					BankAmount = ((tt.BankAmount == null) ? 0m : tt.BankAmount.Value),
					FCode = b.FCode,
					FName = b.FName,
					Fflag = (b.fflag.HasValue ? b.fflag.Value : 0),
					Flimitflag = (b.flimitflag.HasValue ? b.flimitflag.Value : 0),
					Flimitamt = (b.flimitamt.HasValue ? b.flimitamt.Value : 0m)
				}).FirstOrDefault();
			if (re.ResultData == null)
			{
				re.ResultCode = "0005";
				re.ResultData = new CriminalEntity();
			}
			else if (re.ResultData.Fflag == 1)
			{
				re.ResultCode = "0007";
				re.ResultData = new CriminalEntity();
			}
			else
			{
				db.proc_CriminalInHospital(_fcode.FCode, ref errorMsg, ref errorCode);
				if (errorCode == "1")
				{
					re.ResultCode = "0000";
				}
				else
				{
					re.ResultCode = "0006";
					re.ResultData = new CriminalEntity();
				}
			}
		}
		catch (Exception)
		{
			re.ResultCode = "0008";
			re.ResultData = new CriminalEntity();
		}
		return jss.Serialize(re);
	}

	public static string CriminalConsumedQuota(string FCode)
	{
		InvoiceEntity reModel = new InvoiceEntity();
		JavaScriptSerializer jss = new JavaScriptSerializer();
		ReqFCode _fcode = jss.Deserialize<ReqFCode>(FCode);
		DateTime FirstDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
		DateTime EndDate = DateTime.Parse(FirstDate.AddMonths(1).ToShortDateString()).AddSeconds(-1.0);
		using (JXHospitalWSDBDataContextCustom db = new JXHospitalWSDBDataContextCustom())
		{
			proc_CriminalConsumedResult a = db.proc_CriminalConsumed(_fcode.FCode, FirstDate, EndDate).FirstOrDefault();
			if (a != null)
			{
				InvoiceEntity invoiceEntity = new InvoiceEntity();
				invoiceEntity.AmountA = Convert.ToDecimal((!a.AmountA.HasValue) ? new decimal?(0m) : a.AmountA);
				invoiceEntity.AmountB = Convert.ToDecimal((!a.AmountB.HasValue) ? new decimal?(0m) : a.AmountB);
				invoiceEntity.FreeAmountA = Convert.ToDecimal((!a.FreeAmountA.HasValue) ? new decimal?(0m) : a.FreeAmountA);
				invoiceEntity.FreeAmountB = Convert.ToDecimal((!a.FreeAmountB.HasValue) ? new decimal?(0m) : a.FreeAmountB);
				invoiceEntity.Checkflag = a.checkflag.Value;
				invoiceEntity.FCode = a.fcrimecode;
				invoiceEntity.FCriminal = a.fcriminal;
				invoiceEntity.Flag = (a.Flag.HasValue ? a.Flag.Value : 0);
				reModel = invoiceEntity;
			}
		}
		return jss.Serialize(reModel);
	}

	public static string CriminalOut(string FCode)
	{
		ResultEntity reModel = new ResultEntity();
		JavaScriptSerializer jss = new JavaScriptSerializer();
		ReqFCode _fcode = jss.Deserialize<ReqFCode>(FCode);
		string errorMsg = "";
		string errorCode = "";
		using (JXHospitalWSDBDataContextCustom db = new JXHospitalWSDBDataContextCustom())
		{
			db.proc_CriminalOutHospital(_fcode.FCode, ref errorMsg, ref errorCode);
			if (errorCode == "1")
			{
				reModel.Result = true;
			}
			else
			{
				reModel.Result = false;
			}
			reModel.ReMsg = errorMsg;
		}
		return jss.Serialize(reModel);
	}

	public static string CriminalConsume(string reqModel)
	{
		JavaScriptSerializer jss = new JavaScriptSerializer();
		ReqInoiveEntity _req = jss.Deserialize<ReqInoiveEntity>(reqModel);
		ResponNormalModel reModel = new ResponNormalModel();
		try
		{
			using (JXHospitalWSDBDataContextCustom db = new JXHospitalWSDBDataContextCustom())
			{
				T_Invoice t_Invoice = new T_Invoice();
				t_Invoice.InvoiceNo = _req.InvoiceNo;
				t_Invoice.CardCode = _req.CardCode;
				t_Invoice.Amount = _req.Amount;
				t_Invoice.AmountA = _req.AmountA;
				t_Invoice.AmountB = _req.AmountB;
				t_Invoice.Checkflag = 0;
				t_Invoice.Crtby = "建新";
				t_Invoice.Crtdate = _req.CrtDate;
				t_Invoice.FCrimeCode = _req.FCode;
				t_Invoice.FCriminal = _req.FCriminal;
				t_Invoice.Flag = 1;
				t_Invoice.FreeAmountA = _req.FreeAmountA;
				t_Invoice.FreeAmountB = _req.FreeAmountB;
				t_Invoice.OrderDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
				t_Invoice.OrderId = _req.OrderId;
				t_Invoice.PayDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
				t_Invoice.PType = "建新消费";
				t_Invoice.TypeFlag = 30;
				t_Invoice.OrderStatus = 1;
				t_Invoice.Fifoflag = -1;
				T_Invoice invoice = t_Invoice;
				db.T_Invoice.InsertOnSubmit(invoice);
				var _criminal = (from crinimal in db.T_Criminal
					join area in db.T_AREA on crinimal.FAreaCode equals area.FCode into temp
					from tt in temp.DefaultIfEmpty()
					where crinimal.FCode.Equals(_req.FCode)
					select new
					{
						FAreaCode = ((crinimal.FAreaCode == null) ? "0" : crinimal.FAreaCode),
						FAreaName = ((tt.FName == null) ? "0" : tt.FName)
					}).FirstOrDefault();
				if (_req.AmountA > 0m)
				{
					string vouno = "";
					db.CREATESEQNO("vouno", 1, ref vouno);
					T_Vcrd t_Vcrd = new T_Vcrd();
					t_Vcrd.Vouno = "JXVouNo" + vouno;
					t_Vcrd.CardCode = _req.CardCode;
					t_Vcrd.FCrimeCode = _req.FCode;
					t_Vcrd.DAmount = 0m;
					t_Vcrd.CAmount = _req.AmountA;
					t_Vcrd.CrtBy = "建新";
					t_Vcrd.CrtDate = DateTime.Now;
					t_Vcrd.DType = "建新消费";
					t_Vcrd.Depositer = "";
					t_Vcrd.Flag = 0;
					t_Vcrd.FCriminal = _req.FCriminal;
					t_Vcrd.Frealareacode = "";
					t_Vcrd.FrealAreaName = "";
					t_Vcrd.PType = "";
					t_Vcrd.UDate = DateTime.Now;
					t_Vcrd.OrigId = _req.InvoiceNo;
					t_Vcrd.CardType = 0;
					t_Vcrd.TypeFlag = 30;
					t_Vcrd.AccType = 0;
					t_Vcrd.BankFlag = 0;
					t_Vcrd.CheckFlag = 0;
					t_Vcrd.pc = 0;
					t_Vcrd.FAreaCode = _criminal.FAreaCode;
					t_Vcrd.FAreaName = _criminal.FAreaName;
					t_Vcrd.FinancePayFlag = 0;
					T_Vcrd vcrd = t_Vcrd;
					db.T_Vcrd.InsertOnSubmit(vcrd);
				}
				if (_req.AmountB > 0m)
				{
					string vouno2 = "";
					db.CREATESEQNO("vouno", 1, ref vouno2);
					T_Vcrd t_Vcrd2 = new T_Vcrd();
					t_Vcrd2.Vouno = "JXVouNo" + vouno2;
					t_Vcrd2.CardCode = _req.CardCode;
					t_Vcrd2.FCrimeCode = _req.FCode;
					t_Vcrd2.DAmount = 0m;
					t_Vcrd2.CAmount = _req.AmountB;
					t_Vcrd2.CrtBy = "建新";
					t_Vcrd2.CrtDate = DateTime.Now;
					t_Vcrd2.DType = "建新消费";
					t_Vcrd2.Depositer = "";
					t_Vcrd2.Flag = 0;
					t_Vcrd2.FCriminal = _req.FCriminal;
					t_Vcrd2.Frealareacode = "";
					t_Vcrd2.FrealAreaName = "";
					t_Vcrd2.PType = "";
					t_Vcrd2.UDate = DateTime.Now;
					t_Vcrd2.OrigId = _req.InvoiceNo;
					t_Vcrd2.CardType = 0;
					t_Vcrd2.TypeFlag = 30;
					t_Vcrd2.AccType = 1;
					t_Vcrd2.BankFlag = 0;
					t_Vcrd2.CheckFlag = 0;
					t_Vcrd2.pc = 0;
					t_Vcrd2.FAreaCode = _criminal.FAreaCode;
					t_Vcrd2.FAreaName = _criminal.FAreaName;
					t_Vcrd2.FinancePayFlag = 0;
					T_Vcrd vcrd2 = t_Vcrd2;
					db.T_Vcrd.InsertOnSubmit(vcrd2);
				}
				T_Criminal_card a = db.T_Criminal_card.Where((T_Criminal_card b) => b.fcrimecode.Equals(_req.FCode)).FirstOrDefault();
				a.AmountA -= (decimal?)_req.AmountA;
				a.AmountB -= (decimal?)_req.AmountB;
				a.BankAmount = a.AmountA + a.AmountB + a.AmountC;
				db.SubmitChanges();
			}
			reModel.ResultCode = "0000";
			reModel.ResultMsg = "";
		}
		catch (Exception ex)
		{
			reModel.ResultCode = "0008";
			reModel.ResultMsg = ex.Message;
		}
		return jss.Serialize(reModel);
	}

	public static string RealTimeBalance(string FCode)
	{
		ResponCriminalIn rspModel = new ResponCriminalIn();
		JavaScriptSerializer jss = new JavaScriptSerializer();
		ReqFCode _fcode = jss.Deserialize<ReqFCode>(FCode);
		try
		{
			using JXHospitalWSDBDataContextCustom db = new JXHospitalWSDBDataContextCustom();
			T_Criminal_card a = db.T_Criminal_card.Where((T_Criminal_card b) => b.fcrimecode.Equals(_fcode.FCode)).FirstOrDefault();
			if (a != null)
			{
				rspModel.ResultData = new CriminalEntity
				{
					AmountA = (a.AmountA.HasValue ? a.AmountA.Value : 0m),
					AmountB = (a.AmountB.HasValue ? a.AmountB.Value : 0m),
					AmountC = (a.AmountC.HasValue ? a.AmountC.Value : 0m),
					BankAccNo = a.BankAccNo,
					BankAmount = (a.BankAmount.HasValue ? a.BankAmount.Value : 0m),
					FCode = a.fcrimecode
				};
			}
			rspModel.ResultCode = "0000";
		}
		catch (Exception)
		{
			rspModel.ResultCode = "0008";
			rspModel.ResultData = new CriminalEntity();
		}
		return jss.Serialize(rspModel);
	}

	public static string SynInvoiceResult(string InvoiceNoList)
	{
		JavaScriptSerializer jss = new JavaScriptSerializer();
		RsponEntity _rsp = new RsponEntity();
		_rsp.ResultData = new List<RspVcrdEntity>();
		List<string> _req = jss.Deserialize<List<string>>(InvoiceNoList);
		try
		{
			using JXHospitalWSDBDataContextCustom db = new JXHospitalWSDBDataContextCustom();
			var reList = (from a in db.T_Vcrd
				where _req.Contains(a.OrigId)
				group a by new { a.CardCode, a.FCrimeCode, a.BankFlag, a.OrigId, a.SendDate } into b
				select new
				{
					cardcode = b.Key.CardCode,
					fcrimecode = b.Key.FCrimeCode,
					CAMOUNT = b.Sum((T_Vcrd c) => c.CAmount),
					Bankflag = b.Key.BankFlag,
					origid = b.Key.OrigId,
					SendDate = b.Key.SendDate
				}).ToList();
			if (reList.Count > 0)
			{
				foreach (var re in reList)
				{
					_rsp.ResultData.Add(new RspVcrdEntity
					{
						BankFlag = (re.Bankflag.HasValue ? re.Bankflag.Value : 0),
						CAmount = (re.CAMOUNT.HasValue ? re.CAMOUNT.Value : 0m),
						FCode = re.fcrimecode,
						Origid = re.origid,
						SendDate = (re.SendDate.HasValue ? re.SendDate.Value : DateTime.Now)
					});
				}
			}
			else
			{
				_rsp.ResultData = new List<RspVcrdEntity>();
			}
			_rsp.ResultCode = "0000";
		}
		catch (Exception)
		{
			_rsp.ResultCode = "0008";
			_rsp.ResultData = new List<RspVcrdEntity>();
		}
		return jss.Serialize(_rsp);
	}

	public static string MonitorSocketResult(string ReqData)
	{
		JavaScriptSerializer jss = new JavaScriptSerializer();
		ResponNormalModel responNormalModel = new ResponNormalModel();
		responNormalModel.ResultCode = "0000";
		responNormalModel.ResultMsg = "";
		ResponNormalModel _rsp = responNormalModel;
		return jss.Serialize(_rsp);
	}

	public static string CancelOrderResult(string ReqData)
	{
		JavaScriptSerializer jss = new JavaScriptSerializer();
		ResponNormalModel responNormalModel = new ResponNormalModel();
		responNormalModel.ResultCode = "0000";
		responNormalModel.ResultMsg = "";
		ResponNormalModel _rsp = responNormalModel;
		return jss.Serialize(_rsp);
	}
}

// JXHospitalWSBLL.ResponNormalModel
public class ResponNormalModel
{
	private string _ResultCode;

	private string _ResultMsg;

	public string ResultCode
	{
		get
		{
			return _ResultCode;
		}
		set
		{
			_ResultCode = value;
		}
	}

	public string ResultMsg
	{
		get
		{
			return _ResultMsg;
		}
		set
		{
			_ResultMsg = value;
		}
	}
}
// JXHospitalWSBLL.RspVcrdEntity
using System;

public class RspVcrdEntity
{
	private int _BankFlag;

	private decimal _CAmount;

	private string _FCode;

	private string _Origid;

	private DateTime _SendDate;

	public int BankFlag
	{
		get
		{
			return _BankFlag;
		}
		set
		{
			_BankFlag = value;
		}
	}

	public decimal CAmount
	{
		get
		{
			return _CAmount;
		}
		set
		{
			_CAmount = value;
		}
	}

	public string FCode
	{
		get
		{
			return _FCode;
		}
		set
		{
			_FCode = value;
		}
	}

	public string Origid
	{
		get
		{
			return _Origid;
		}
		set
		{
			_Origid = value;
		}
	}

	public DateTime SendDate
	{
		get
		{
			return _SendDate;
		}
		set
		{
			_SendDate = value;
		}
	}
}
// JXHospitalWSBLL.CriminalEntity
public class CriminalEntity
{
	private string _FCode;

	private string _FName;

	private decimal _AmountA;

	private int _fflag;

	private decimal _AmountB;

	private string _BankAccNo;

	private decimal _BankAmount;

	private decimal _AmountC;

	private int _flimitflag;

	private decimal _flimitamt;

	public string FCode
	{
		get
		{
			return _FCode;
		}
		set
		{
			_FCode = value;
		}
	}

	public string FName
	{
		get
		{
			return _FName;
		}
		set
		{
			_FName = value;
		}
	}

	public decimal AmountA
	{
		get
		{
			return _AmountA;
		}
		set
		{
			_AmountA = value;
		}
	}

	public int Fflag
	{
		get
		{
			return _fflag;
		}
		set
		{
			_fflag = value;
		}
	}

	public decimal AmountB
	{
		get
		{
			return _AmountB;
		}
		set
		{
			_AmountB = value;
		}
	}

	public string BankAccNo
	{
		get
		{
			return _BankAccNo;
		}
		set
		{
			_BankAccNo = value;
		}
	}

	public decimal BankAmount
	{
		get
		{
			return _BankAmount;
		}
		set
		{
			_BankAmount = value;
		}
	}

	public decimal AmountC
	{
		get
		{
			return _AmountC;
		}
		set
		{
			_AmountC = value;
		}
	}

	public int Flimitflag
	{
		get
		{
			return _flimitflag;
		}
		set
		{
			_flimitflag = value;
		}
	}

	public decimal Flimitamt
	{
		get
		{
			return _flimitamt;
		}
		set
		{
			_flimitamt = value;
		}
	}
}
// JXHospitalWSBLL.ReqInoiveEntity
using System;

public class ReqInoiveEntity
{
	private string _FCode;

	private string _InvoiceNo;

	private decimal _AmountA;

	private decimal _AmountB;

	private decimal _Amount;

	private decimal _FreeAmountA;

	private decimal _FreeAmountB;

	private DateTime _CrtDate;

	private string _FCriminal;

	private string _CardCode;

	private int _OrderId;

	public string FCode
	{
		get
		{
			return _FCode;
		}
		set
		{
			_FCode = value;
		}
	}

	public string InvoiceNo
	{
		get
		{
			return _InvoiceNo;
		}
		set
		{
			_InvoiceNo = value;
		}
	}

	public decimal AmountA
	{
		get
		{
			return _AmountA;
		}
		set
		{
			_AmountA = value;
		}
	}

	public decimal AmountB
	{
		get
		{
			return _AmountB;
		}
		set
		{
			_AmountB = value;
		}
	}

	public decimal Amount
	{
		get
		{
			return _Amount;
		}
		set
		{
			_Amount = value;
		}
	}

	public decimal FreeAmountA
	{
		get
		{
			return _FreeAmountA;
		}
		set
		{
			_FreeAmountA = value;
		}
	}

	public decimal FreeAmountB
	{
		get
		{
			return _FreeAmountB;
		}
		set
		{
			_FreeAmountB = value;
		}
	}

	public DateTime CrtDate
	{
		get
		{
			return _CrtDate;
		}
		set
		{
			_CrtDate = value;
		}
	}

	public string FCriminal
	{
		get
		{
			return _FCriminal;
		}
		set
		{
			_FCriminal = value;
		}
	}

	public string CardCode
	{
		get
		{
			return _CardCode;
		}
		set
		{
			_CardCode = value;
		}
	}

	public int OrderId
	{
		get
		{
			return _OrderId;
		}
		set
		{
			_OrderId = value;
		}
	}
}
