spt/SoM_PrnControl/Form1.cs

2207 lines
88 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.IO;
using System.IO.Ports;
using MySql.Data.MySqlClient;
using SATO.MLComponent;
namespace qk30ic
{
public partial class Form1 : Form
{
// ====== 开关 ======
// 硬件模拟true=不连串口/IC卡/打印机;启动“演示二维码喂料器”自动喂入 QRID1234
private const bool MOCK_HW = true;
// 数据库模拟false=真实 MySQLtrue=DB 也走假数据(不访问数据库)
private const bool DEMO_DB = false;
// ★ DB连接状态判断
private bool IsDbReady => (DBconnect != null && DBconnect.State == ConnectionState.Open);
private System.Windows.Forms.Timer demoQrTimer;
// ログファイル名(フルパス)格納用
static public string LogfileName = "";
static public string LogfilePath = "";
public const int OutLogNum = 15; // ログ表示行数
public const int OutConfNum = 9; // コンフィグファイルの項目数
// ログファイルの内容
static public string[,] koumoku = new string[OutLogNum, 8];
// コンフィグファイルの内容読み取り
static public string[] str_Confile = new string[OutConfNum];
// レイアウトファイル
static public string str_layoutFile = Path.Combine(Application.StartupPath, "SOM_layout.mllayx");
// コンフィグファイル
static public string CONFIG_PATH = Path.Combine(Application.StartupPath, "SLN_config.dat");
dynamic ifd = null; // IFDオブジェクト
dynamic mif = null; // MIfareオブジェクト
dynamic icc = null; // Cardオブジェクト
public static string QRdata = ""; // QRコード受信用
public static string QRdata2 = ""; // QRコード受信用
public static byte[] vinfBuff = new byte[257]; // Mifareコード受信用
public static byte[] vinfBuff2 = new byte[257]; // Mifareコード受信用
public static uint QRresult = 0; // QRコード受信用
public static string MFCODE = ""; // Mifareコード
public static string MFCODE_CHK = "4400"; // Mifare識別用
public static int Retry_num = 0; // DBエラー時のリトライ数
// 終了処理
public int EndType = 0;
// エラーコード
public const int ERROR_CODE_CONFRD = 80;
public const int ERROR_CODE_LOGFRD = 85;
public const int ERROR_CODE_LOGFWR = 87;
public const int ERROR_CODE_DBOPEN = 100;
public const int ERROR_CODE_PAPRNG = 104;
public const int ERROR_CODE_LAYOUT = 110;
public const int ERROR_CODE_PRNINI = 120;
public const int ERROR_CODE_MFIINI = 130;
public const int ERROR_CODE_QRCINI = 140;
public const int ERROR_CODE_DBERR = 150;
public const int ERROR_CODE_PRNERR = 160;
public const int ERROR_CODE_NONMFC = 1;
public const int ERROR_CODE_NONQRC = 3;
public const int ERROR_CODE_NONUID = 5;
public const int ERROR_CODE_QRCERR = 170;
public const int ERROR_CODE_MFIERR = 175;
// ログ編集用
public const int LETYPE_NORMAL = 0;
public const int LETYPE_START = 2;
public const int LETYPE_DBOPEN = 10;
public const int LETYPE_LAYOUT = 11;
public const int LETYPE_PRNINI = 12;
public const int LETYPE_MFIINI = 13;
public const int LETYPE_QRCINI = 14;
public const int LETYPE_DBERR = 15;
public const int LETYPE_NONMFC = 20;
public const int LETYPE_NONUID = 21;
public const int LETYPE_NONQRC = 30;
public const int LETYPE_PRNERR = 40;
public const int LETYPE_QRCERR = 50;
public const int LETYPE_MFIERR = 55;
public const int LETYPE_CONFRD = 80;
public const int LETYPE_LOGFRD = 85;
public const int LETYPE_LOGFWR = 87;
// MySQL 连接串(按需修改账号密码/库名)
public static string connectionParams = string.Format(
"server={0}; user={1}; password={2}; database={3}; charset={4}; SslMode={5}; AllowPublicKeyRetrieval={6}",
"localhost",
"root",
"", // ← 如果有密码填这里
"so-manager", // ← 你的库名(保留原值)
"utf8",
"None",
"true"
);
// DB読み込みクエリ
public string DBREAD_park_name = "select park_name from park where park_id=";
public string DBREAD_city_name = "select city_name from park, city where park.city_id=city.city_id and park.park_id=";
public string DBREAD_ptype_subj = "select ptype_subject from price , ptype where price.price_ptypeid=ptype.ptype_id and price.park_id=";
public string[] DBREAD_utype_sub1 = {
"select usertype_subject1 from user,usertype,regular_contract where regular_contract.user_categoryid=usertype.user_categoryid and user.user_tag_serial =",
"select usertype_subject1 from user,usertype,regular_contract where regular_contract.user_categoryid=usertype.user_categoryid and regular_contract.contract_qr_id=" };
public string[] DBREAD_cont_periods = {
"select contract_periods, contract_periode, contract_id from user,regular_contract where user.user_id=regular_contract.user_id and user_tag_serial =",
"select contract_periods, contract_periode, contract_id from regular_contract where contract_qr_id=" };
public string[] DBREAD_cont_sissue = {
"select contract_seal_issue from user, regular_contract where user.user_id=regular_contract.user_id and user_tag_serial =",
"select contract_seal_issue from regular_contract where contract_qr_id="};
// ログに書き込む項目
public string[] str_logkm = new string[8];
// キープアライブ用
public static string KpAlive_devid = "";
// 印字データ
public string[] str_Prndat = new string[8];
public static int Prn_MaxNum; // 印字可能数
public static int Prn_NowNum; // 現在の印字数
public static int Prn_Alert_num; // 印字残警告数
public static int Prn_Alert_flg; // プリンタ印字残警告フラグ
public static string Prn_ParkName; // 駐車場名
public static MySqlConnection DBconnect = null; // 延迟初始化
public static string[] PortList = new string[20];
// 受信データ判別
public static DateTime date1 = new DateTime(2018, 1, 1, 12, 0, 0);
public static DateTime date2 = new DateTime(2018, 1, 1, 1, 0, 0);
// MLComponent - 延迟初始化以避免启动时错误
public static MLComponent SO_MLC = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Shown(object sender, EventArgs e)
{
// 本地小工具:只写本地日志(无 DB 时调用)
void LogOnly(int type, int n)
{
EndType = n;
SO_LogEdit(type);
SO_WriteLog();
}
// 本地小工具:启动“演示二维码喂料器”
void StartDemoQrFeeder()
{
if (!MOCK_HW) return;
demoQrTimer = new System.Windows.Forms.Timer();
demoQrTimer.Interval = 3000; // 每3秒来一个二维码
demoQrTimer.Tick += (s, ev) =>
{
QRdata = "藤本";
QRresult = 1; // 告知主循环“扫到了码”
};
demoQrTimer.Start();
}
try
{
uint MFresult = 0;
uint result = 0;
uint mode = 0;
bool bResult = true;
string str_uid = "";
string str_qrc = "";
string[] str_rctbl = new string[8];
for (int j = 0; j < str_rctbl.Length; j++) str_rctbl[j] = "";
// 读取配置
result = ConRead.ReadConFile(ref str_Confile);
if (result == 1)
{
MessageBox.Show("設定ファイルの読み込みに失敗しました。\nパス: " + CONFIG_PATH, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit(); return;
}
for (int i = 0; i < OutConfNum; i++)
{
if (str_Confile[i] == null)
{
MessageBox.Show("設定ファイルの項目" + i + "が空です。\n設定ファイルに" + OutConfNum + "個の項目が必要です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit(); return;
}
}
// MLComponent即使失败也继续
try { SO_MLC = new MLComponent(); }
catch (Exception ex) { MessageBox.Show("MLComponentの初期化に失敗しました。\n" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); }
// 日志文件名
try
{
DateTime dtNow = DateTime.Now;
string stPrompt1 = dtNow.ToString("yyyyMMdd");
LogfilePath = str_Confile[5];
LogfileName = str_Confile[5] + str_Confile[6] + "_" + stPrompt1 + ".csv";
Retry_num = Convert.ToInt32(str_Confile[8]);
}
catch (Exception ex)
{
MessageBox.Show("設定ファイルの内容でエラーが発生しました。\n" + ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit(); return;
}
// 表格外观
dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
dataGridView1.ColumnHeadersHeight = 30;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;
dataGridView1.ColumnCount = 8;
dataGridView1.Columns[0].HeaderText = "処理ログID";
dataGridView1.Columns[1].HeaderText = "駐輪場ID";
dataGridView1.Columns[2].HeaderText = "プロセス名";
dataGridView1.Columns[3].HeaderText = "ジョブ名";
dataGridView1.Columns[4].HeaderText = "ステータス";
dataGridView1.Columns[5].HeaderText = "エラーコード";
dataGridView1.Columns[6].HeaderText = "ステータスコメント";
dataGridView1.Columns[7].HeaderText = "登録日時";
dataGridView1.EnableHeadersVisualStyles = false;
dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.ForestGreen;
// 读取最近日志(失败也继续,但会把错误写到本地日志)
result = Logfile.ReadLogFile();
if (result == 1)
{
SO_LogEdit(LETYPE_LOGFRD);
SO_WriteLog();
Application.Exit(); return;
}
for (int i = 0; i < OutLogNum; i++)
dataGridView1.Rows.Add(Form1.koumoku[i, 0], Form1.koumoku[i, 1], Form1.koumoku[i, 2], Form1.koumoku[i, 3],
Form1.koumoku[i, 4], Form1.koumoku[i, 5], Form1.koumoku[i, 6], Form1.koumoku[i, 7]);
// ===== 初始化 =====
// 尝试连接数据库(不受 MOCK_HW 影响)
try
{
// 如果 DEMO_DB=true会在各 DB 函数里直接短路返回;这里仍尝试打开连接,便于随时切换
SO_DBOpen();
}
catch { /* 具体弹窗已在 SO_DBOpen 内部做了 */ }
// 印字环境DB 可用时读库;否则用默认值)
try
{
if (!DEMO_DB && IsDbReady)
{
bResult = SO_PrnEnvRead_rty();
if (!bResult) { SO_CommIniErr(LETYPE_DBERR, 2); Application.Exit(); return; }
}
else
{
Prn_MaxNum = 1000; Prn_NowNum = 0; Prn_Alert_num = 50; Prn_Alert_flg = 0; Prn_ParkName = "デモ駐輪場";
}
}
catch (Exception ex)
{
MessageBox.Show("印字環境読み取りでエラーが発生しました。\n" + ex.Message + "\n\nデフォルト値で続行します。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Prn_MaxNum = 1000; Prn_NowNum = 0; Prn_Alert_num = 50; Prn_Alert_flg = 0; Prn_ParkName = "デモ駐輪場";
}
// 硬件初始化MOCK_HW=true 则跳过)
if (!MOCK_HW)
{
try
{
bResult = SO_PrnInit();
if (!bResult)
{
var prnResult = MessageBox.Show("プリンタの初期化に失敗しました。\nプリンタなしで続行しますか", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (prnResult == DialogResult.No) { SO_CommIniErr(LETYPE_PRNINI, 3); Application.Exit(); return; }
}
}
catch (Exception ex) { MessageBox.Show("プリンタ初期化でエラーが発生しました。\n" + ex.Message + "\n\nプリンタなしで続行します。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); }
try
{
bResult = SO_MfifareInit();
if (!bResult)
{
var mfResult = MessageBox.Show("Mifareリーダの初期化に失敗しました。\nMifareリーダなしで続行しますか", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (mfResult == DialogResult.No) { SO_CommIniErr(LETYPE_MFIINI, 4); Application.Exit(); return; }
}
}
catch (Exception ex) { MessageBox.Show("Mifareリーダ初期化でエラーが発生しました。\n" + ex.Message + "\n\nMifareリーダなしで続行します。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); }
try
{
bResult = SO_QRcordInit();
if (!bResult)
{
var qrResult = MessageBox.Show("QRコードリーダの初期化に失敗しました。\nQRコードリーダなしで続行しますか", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (qrResult == DialogResult.No) { SO_CommIniErr(LETYPE_QRCINI, 5); Application.Exit(); return; }
}
}
catch (Exception ex) { MessageBox.Show("QRコードリーダ初期化でエラーが発生しました。\n" + ex.Message + "\n\nQRコードリーダなしで続行します。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); }
}
else
{
StartDemoQrFeeder(); // 演示:自动“扫”二维码
}
// 启动日志有DB走原逻辑无DB只写本地文件
if (!IsDbReady || DEMO_DB) { LogOnly(LETYPE_START, 6); }
else { bResult = SO_ComCont(LETYPE_START, 6); if (!bResult) { Application.Exit(); return; } }
// KeepAlive
KEEPALIVE.TIM_Main();
// ================= 主循环 =================
while (true)
{
// -------- 等待二维码/Mifare --------
while (true)
{
Application.DoEvents();
if (EndType == 10) { Application.Exit(); return; }
if (QRresult != 0)
{
if (QRresult == 1) { mode = QRresult; break; }
if (QRresult == 2)
{
if (!IsDbReady || DEMO_DB) { LogOnly(LETYPE_QRCERR, EndType); Application.Exit(); return; }
else { bResult = SO_ComCont(LETYPE_QRCERR, EndType); Application.Exit(); return; }
}
else { QRresult = 0; continue; }
}
else
{
if (MOCK_HW) { continue; } // 演示:完全跳过 Mifare 检查
MFresult = SO_MfifareCheck();
if (MFresult == 0) { mode = MFresult; break; }
else if ((MFresult <= 10) || (MFresult == 0xC0020001) || (MFresult == 0xC0020003)) { continue; }
else
{
if (!IsDbReady || DEMO_DB) { LogOnly(LETYPE_MFIERR, EndType); Application.Exit(); return; }
else { bResult = SO_ComCont(LETYPE_MFIERR, EndType); Application.Exit(); return; }
}
}
}
// 暂停 KeepAlive
KEEPALIVE.MyTimer_stop();
// -------- DB 查询重试 --------
for (int i = 0; i < Retry_num; i++)
{
str_uid = "";
if (mode == 1)
{
str_qrc = QRdata;
QRresult = 0;
result = SO_DBChk_qrnum(ref str_qrc, ref str_uid);
}
else
{
result = SO_DBChk_tagnum(ref str_uid);
}
if (result == 0)
{
result = SO_CommLabelOutput(mode, ref str_uid, ref str_rctbl);
if (result != 0)
{
if (IsDbReady) { try { if (DBconnect.State != ConnectionState.Open) DBconnect.Open(); } catch { } }
continue;
}
break;
}
else if (result == 1)
{
if (IsDbReady) { try { if (DBconnect.State != ConnectionState.Open) DBconnect.Open(); } catch { } }
continue;
}
else
{
break;
}
}
// -------- 查询结果处理 --------
switch (result)
{
case 0: bResult = true; break;
case 1:
if (!IsDbReady || DEMO_DB) { LogOnly(LETYPE_DBERR, 6); Application.Exit(); return; }
else { bResult = SO_ComCont(LETYPE_DBERR, 6); Application.Exit(); return; }
case 2:
if (!IsDbReady || DEMO_DB) LogOnly(LETYPE_NONMFC, EndType);
else bResult = SO_ComCont(LETYPE_NONMFC, EndType);
break;
case 3:
if (!IsDbReady || DEMO_DB) LogOnly(LETYPE_NONQRC, EndType);
else bResult = SO_ComCont(LETYPE_NONQRC, EndType);
break;
case 4:
if (!IsDbReady || DEMO_DB) LogOnly(LETYPE_NONUID, EndType);
else bResult = SO_ComCont(LETYPE_NONUID, EndType);
break;
default: bResult = true; break;
}
if (!bResult) { Application.Exit(); return; }
// -------- 可否与打印 --------
bResult = SO_PRN_dtatchk(ref str_rctbl);
if (!bResult) break;
result = SO_PrnOut(); // 演示下始终返回0成功
if (result != 0)
{
if (!IsDbReady || DEMO_DB) { LogOnly(LETYPE_PRNERR, EndType); Application.Exit(); return; }
else { bResult = SO_ComCont(LETYPE_PRNERR, EndType); Application.Exit(); return; }
}
// -------- DB 写入 --------
Prn_NowNum++;
if (((Prn_MaxNum - Prn_NowNum) < Prn_Alert_num) && (Prn_Alert_flg == 1))
{
if (IsDbReady && !DEMO_DB)
{
result = SO_DBOpeQue();
if (result != 0)
{
if (!IsDbReady || DEMO_DB) { LogOnly(LETYPE_DBERR, 6); Application.Exit(); return; }
else { bResult = SO_ComCont(LETYPE_DBERR, 6); Application.Exit(); return; }
}
}
}
else
{
if (IsDbReady && !DEMO_DB)
{
result = SO_DBNowPrnNum_rty();
if (result != 0)
{
if (!IsDbReady || DEMO_DB) { LogOnly(LETYPE_DBERR, 6); Application.Exit(); return; }
else { bResult = SO_ComCont(LETYPE_DBERR, 6); Application.Exit(); return; }
}
}
}
// 正常记录
if (!IsDbReady || DEMO_DB) LogOnly(LETYPE_NORMAL, EndType);
else
{
bResult = SO_ComCont(LETYPE_NORMAL, EndType);
if (!bResult) { Application.Exit(); return; }
}
KEEPALIVE.MyTimer_start();
SO_LogFileDelCheck();
Application.DoEvents();
}
}
catch (Exception ex)
{
MessageBox.Show("アプリケーションでエラーが発生しました。\n" + ex.Message + "\n\nスタックトレース:\n" + ex.StackTrace, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
//====================================================================================================================
// エラー時共通の終了処理
//====================================================================================================================
private void SO_CommIniErr(int type, int n)
{
EndType = n;
SO_LogEdit(type);
if ((type != LETYPE_DBOPEN) && (type != LETYPE_DBERR))
{
SO_DBInsert_pjl();
}
SO_WriteLog();
}
//====================================================================================================================
// 初期化以降の共通処理
//====================================================================================================================
private bool SO_ComCont(int type, int n)
{
uint ret = 0;
EndType = n;
SO_LogEdit(type);
if (type != LETYPE_DBERR)
{
bool bret = SO_DBInsert_pjl();
if ((bret == false) || (n == LETYPE_DBERR))
{
SO_LogEdit(LETYPE_DBERR);
SO_WriteLog();
return false;
}
}
ret = SO_WriteLog();
if ((ret == 1) && (type == LETYPE_START) || (type == LETYPE_NORMAL))
{
SO_LogEdit(LETYPE_LOGFWR);
SO_DBInsert_pjl();
return false;
}
return true;
}
//====================================================================================================================
// ローカルのログファイルに書き込み
//====================================================================================================================
private uint SO_CommLabelOutput(uint mode, ref string str_uid, ref string[] str_rctbl)
{
uint uret = 0;
// 利用者ID検索
uret = SO_DBChk_usrid(str_uid, ref str_rctbl);
if (uret != 0) return 1;
// 該当レコードなし(利用者ID)
if (str_rctbl[2].Length == 0) return 4;
// 印刷情報取得
uret = SO_PrnLabeEdit(mode);
if (uret == 1) return 1;
return 0;
}
//====================================================================================================================
// ログファイル削除チェック
//====================================================================================================================
private void SO_LogFileDelCheck()
{
int i = 0;
bool bret = true;
DateTime dtNow = DateTime.Now;
string Nowm = dtNow.ToString("yyyyMM");
string Tgm = "";
string work = "";
DirectoryInfo dir = new DirectoryInfo(Form1.LogfilePath);
if (!dir.Exists) return;
FileInfo[] files = dir.GetFiles();
for (i = 0; i < files.Length; i++)
{
string f = Convert.ToString(files[i]);
work = f.Substring(f.Length - 12, 12);
Tgm = work.Substring(0, 6);
bret = LogFileChk_Mo(Nowm, Tgm);
if (bret == false)
{
System.IO.File.Delete(Form1.LogfilePath + files[i]);
}
}
}
private bool LogFileChk_Mo(string Nwm, string Tgm)
{
int Ny, Ty;
int Nm, Tm;
int dy, dm, m, bd;
Ny = Convert.ToInt32(Nwm.Substring(0, 4));
Ty = Convert.ToInt32(Tgm.Substring(0, 4));
Nm = Convert.ToInt32(Nwm.Substring(4, 2));
Tm = Convert.ToInt32(Tgm.Substring(4, 2));
bd = Convert.ToInt32(str_Confile[7]);
dm = Nm - Tm;
if (dm < 0)
{
dm += 12;
--Ny;
}
dy = Ny - Ty;
if (dy < 0) return true;
m = dy * 12 + dm;
if (m > bd) return false;
return true;
}
//====================================================================================================================
// 印刷可否判定
//====================================================================================================================
private bool SO_PRN_dtatchk(ref string[] str_rctbl)
{
string dateNow = Convert.ToString(DateTime.Now);
if ((str_rctbl[4] != "1") || (str_rctbl[5] != "1")) return false;
if ((dateNow.CompareTo(str_rctbl[1]) < 0) || (dateNow.CompareTo(str_rctbl[2]) > 0)) return false;
if (dateNow.CompareTo(str_rctbl[3]) < 0) return false;
return true;
}
private void button1_Click(object sender, EventArgs e)
{
EndType = 10;
}
//====================================================================================================================
// ログ編集
//====================================================================================================================
private void SO_LogEdit(int n)
{
DateTime dtUtcNow = DateTime.Now;
switch (n)
{
case LETYPE_NORMAL:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "シール印刷";
str_logkm[4] = "正常印刷";
str_logkm[5] = "0";
str_logkm[6] = " ";
break;
case LETYPE_START:
str_logkm[0] = " ";
str_logkm[2] = " ";
str_logkm[3] = " ";
str_logkm[4] = "開始";
str_logkm[5] = "0";
str_logkm[6] = "起動しました";
break;
case LETYPE_DBERR:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "利用者確認";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_DBERR.ToString();
str_logkm[6] = "DBアクセスエラー";
break;
case LETYPE_DBOPEN:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "初期化処理";
str_logkm[4] = "DBアタッチエラー";
str_logkm[5] = ERROR_CODE_DBOPEN.ToString();
str_logkm[6] = "DB OPENに失敗";
break;
case LETYPE_LAYOUT:
str_logkm[2] = "定期シール発行";
str_logkm[3] = "初期化処理";
str_logkm[4] = "レイアウトファイルエラー";
str_logkm[5] = ERROR_CODE_LAYOUT.ToString();
str_logkm[6] = "レイアウトファイルが見つからない";
break;
case LETYPE_PRNINI:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "初期化処理";
str_logkm[4] = "プリンタ初期化エラー";
str_logkm[5] = ERROR_CODE_PRNINI.ToString();
str_logkm[6] = "プリンタ初期化に失敗";
break;
case LETYPE_MFIINI:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "初期化処理";
str_logkm[4] = "カードリーダ初期化エラー";
str_logkm[5] = ERROR_CODE_MFIINI.ToString();
str_logkm[6] = "Mifareリーダ初期化に失敗";
break;
case LETYPE_QRCINI:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "初期化処理";
str_logkm[4] = "カードリーダ初期化エラー";
str_logkm[5] = ERROR_CODE_QRCINI.ToString();
str_logkm[6] = "QRコードリーダ初期化に失敗";
break;
case LETYPE_NONMFC:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "利用者確認";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_NONMFC.ToString();
str_logkm[6] = "タグ利用者なし";
break;
case LETYPE_NONUID:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "利用者確認";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_NONUID.ToString();
str_logkm[6] = "タグ利用者なし";
break;
case LETYPE_NONQRC:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "利用者確認";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_NONQRC.ToString();
str_logkm[6] = "タグ利用者なし";
break;
case LETYPE_PRNERR:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "利用者確認";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_PRNERR.ToString();
str_logkm[6] = "プリンタエラー";
break;
case LETYPE_QRCERR:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "利用者確認";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_QRCERR.ToString();
str_logkm[6] = "QRコード読み取りエラー";
break;
case LETYPE_MFIERR:
str_logkm[2] = "定期シール発行";
str_logkm[3] = "利用者確認";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_MFIERR.ToString();
str_logkm[6] = "Mifare読み取りエラー";
break;
case LETYPE_CONFRD:
str_logkm[0] = "";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "初期化処理";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_CONFRD.ToString();
str_logkm[6] = "設定ファイル読み込みエラー";
break;
case LETYPE_LOGFRD:
str_logkm[2] = "定期シール発行";
str_logkm[3] = "初期化処理";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_LOGFRD.ToString();
str_logkm[6] = "ログファイル読み込みエラー";
break;
case LETYPE_LOGFWR:
str_logkm[0] = " ";
str_logkm[2] = "定期シール発行";
str_logkm[3] = "利用者確認";
str_logkm[4] = "error";
str_logkm[5] = ERROR_CODE_LOGFWR.ToString();
str_logkm[6] = "ログファイル書き込みエラー";
break;
default:
break;
}
str_logkm[1] = str_Confile[3];
str_logkm[7] = dtUtcNow.ToString();
}
//====================================================================================================================
// ローカルのログファイルに書き込みと表示
//====================================================================================================================
private uint SO_WriteLog()
{
uint ret = 0;
string str_logrec = str_logkm[0] + "," + str_logkm[1] + "," + str_logkm[2] + "," + str_logkm[3] + "," + str_logkm[4] + "," + str_logkm[5] + "," + str_logkm[6] + "," + str_logkm[7];
System.Diagnostics.Trace.WriteLine(str_logrec);
try
{
using (StreamWriter writer = new StreamWriter(LogfileName, true, Encoding.GetEncoding("utf-8")))
{
writer.WriteLine(str_logrec);
}
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
ret = 1;
}
for (int i = OutLogNum - 1; i > 0; i--)
{
for (int ii = 0; ii < 8; ii++)
{
dataGridView1[ii, i].Value = dataGridView1[ii, i - 1].Value;
}
}
dataGridView1[0, 0].Value = str_logkm[0];
dataGridView1[1, 0].Value = str_logkm[1];
dataGridView1[2, 0].Value = str_logkm[2];
dataGridView1[3, 0].Value = str_logkm[3];
dataGridView1[4, 0].Value = str_logkm[4];
dataGridView1[5, 0].Value = str_logkm[5];
dataGridView1[6, 0].Value = str_logkm[6];
dataGridView1[7, 0].Value = str_logkm[7];
this.Refresh();
return ret;
}
//====================================================================================================================
// DBオープン
//====================================================================================================================
private bool SO_DBOpen()
{
bool ret = true;
try
{
if (DBconnect == null)
{
DBconnect = new MySqlConnection(connectionParams);
}
if (DBconnect.State != System.Data.ConnectionState.Open)
{
DBconnect.Open();
}
}
catch (MySqlException mysqlEx)
{
System.Diagnostics.Trace.WriteLine("MySQL接続エラー: " + mysqlEx.Message);
string errorMsg = "データベースへの接続に失敗しました。\n\n";
errorMsg += "エラー詳細: " + mysqlEx.Message + "\n";
errorMsg += "エラー番号: " + mysqlEx.Number + "\n\n";
errorMsg += "以下を確認してください:\n";
errorMsg += "1. MySQLサーバーが起動しているか\n";
errorMsg += "2. データベース名が正しいか ('so-manager')\n";
errorMsg += "3. ユーザー名とパスワードが正しいか\n";
errorMsg += "4. ネットワーク接続が正常か";
MessageBox.Show(errorMsg, "データベース接続エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
ret = false;
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine("データベース接続エラー: " + e.Message);
MessageBox.Show("データベース接続で予期しないエラーが発生しました。\n\nエラー: " + e.Message,
"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
ret = false;
}
return ret;
}
//====================================================================================================================
// DB更新:デバイス管理マスタ(device) KeepAlive
//====================================================================================================================
public static int SO_DBKpAlive(string Insert_SQL)
{
// ★ DEMO_DB or 未接続:什么也不做(返回成功)
if (DEMO_DB || DBconnect == null || DBconnect.State != ConnectionState.Open) return 0;
var transaction = DBconnect.BeginTransaction();
try
{
using (var DBcmd = new MySqlCommand(Insert_SQL, DBconnect))
{
DBcmd.CommandTimeout = 3;
DBcmd.ExecuteNonQuery();
}
transaction.Commit();
return 0;
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
return 1;
}
}
//====================================================================================================================
// DB更新:駐輪場マスタ(print_number)
//====================================================================================================================
private uint SO_DBNowPrnNum_rty()
{
if (DEMO_DB || !IsDbReady) return 0;
uint ret = 0;
for (int i = 0; i < Retry_num; i++)
{
ret = SO_DBNowPrnNum();
if (ret == 1)
{
try { if (DBconnect.State != ConnectionState.Open) DBconnect.Open(); } catch { }
}
else return 0;
}
return 1;
}
private uint SO_DBNowPrnNum()
{
if (DEMO_DB || !IsDbReady) return 0;
using (var transaction = DBconnect.BeginTransaction())
{
string Update_SQL = "update park set print_number=" + Convert.ToString(Prn_NowNum) +
" where park_id=" + str_Confile[3] + ";";
System.Diagnostics.Trace.WriteLine(Update_SQL);
try
{
using (var DBcmd = new MySqlCommand(Update_SQL, DBconnect)) { DBcmd.CommandTimeout = 3; DBcmd.ExecuteNonQuery(); }
transaction.Commit();
return 0;
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
return 1;
}
}
}
//====================================================================================================================
// DB追加:オペレータキュー(operator_que)
//====================================================================================================================
private uint SO_DBOpeQue()
{
if (DEMO_DB || !IsDbReady) return 0;
using (var transaction = DBconnect.BeginTransaction())
{
DateTime NowDate = DateTime.Now;
string Insert_SQL =
"INSERT INTO operator_que (park_id, que_class, que_status_comment, work_instructions, created_at, que_status) " +
$"VALUES ({str_Confile[3]},104,'{str_Confile[4]}','{Prn_ParkName}の用紙がもうすぐ無くなります。交換してください','{NowDate}',1);";
try
{
using (var DBcmd = new MySqlCommand(Insert_SQL, DBconnect)) { DBcmd.CommandTimeout = 3; DBcmd.ExecuteNonQuery(); }
transaction.Commit();
return 0;
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
return 1;
}
}
}
//====================================================================================================================
// DB検索:設定マスタ(setting),デバイス管理マスタ(device)
//====================================================================================================================
private bool SO_PrnEnvRead_rty()
{
if (DEMO_DB || !IsDbReady)
{
Prn_MaxNum = 1000; Prn_NowNum = 0; Prn_Alert_num = 50; Prn_Alert_flg = 0; Prn_ParkName = "デモ駐輪場";
return true;
}
for (int i = 0; i < Retry_num; i++)
{
if (SO_PrnEnvRead()) return true;
try { if (DBconnect.State != ConnectionState.Open) DBconnect.Open(); } catch { }
}
return false;
}
private bool SO_PrnEnvRead()
{
if (DEMO_DB || !IsDbReady)
{
Prn_MaxNum = 1000; Prn_NowNum = 0; Prn_Alert_num = 50; Prn_Alert_flg = 0; Prn_ParkName = "デモ駐輪場";
return true;
}
string Select_SQL1 = "select printable_alert_flag,printable_number,printable_alert_number from setting;";
string Select_SQL2 = "select park_name, print_number from park where park_id=" + str_Confile[3] + ";";
string Select_SQL3 = "select device_id from device where park_id=" + str_Confile[3] + " and device_type='プリンタ' and device_work=1;";
var transaction1 = DBconnect.BeginTransaction();
MySqlCommand DBcmd1 = new MySqlCommand(Select_SQL1, DBconnect);
DBcmd1.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd1.ExecuteReader();
while (reader.Read())
{
Prn_Alert_flg = Convert.ToInt32(reader["printable_alert_flag"]);
Prn_MaxNum = Convert.ToInt32(reader["printable_number"]);
Prn_Alert_num = Convert.ToInt32(reader["printable_alert_number"]);
}
reader.Close();
transaction1.Commit();
}
catch (MySqlException e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd1.Dispose();
return false;
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd1.Dispose();
return false;
}
var transaction2 = DBconnect.BeginTransaction();
MySqlCommand DBcmd2 = new MySqlCommand(Select_SQL2, DBconnect);
DBcmd2.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd2.ExecuteReader();
while (reader.Read())
{
Prn_ParkName = Convert.ToString(reader["park_name"]);
if (reader.IsDBNull(1)) Prn_NowNum = 0;
else Prn_NowNum = Convert.ToInt32(reader["print_number"]);
}
reader.Close();
transaction2.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd2.Dispose();
return false;
}
var transaction3 = DBconnect.BeginTransaction();
MySqlCommand DBcmd3 = new MySqlCommand(Select_SQL3, DBconnect);
DBcmd3.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd3.ExecuteReader();
while (reader.Read())
{
KpAlive_devid = Convert.ToString(reader["device_id"]);
}
reader.Close();
transaction3.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd3.Dispose();
return false;
}
return true;
}
//====================================================================================================================
// DB検索:定期契約マスタ(regular_contract) - QR
//====================================================================================================================
private uint SO_DBChk_qrnum(ref string str_qrc, ref string str_userid)
{
if (DEMO_DB || !IsDbReady) { str_userid = "1001"; return 0; }
string Select_SQL = "select user_id from regular_contract where contract_qr_id='" + str_qrc + "';";
var transaction = DBconnect.BeginTransaction();
MySqlCommand DBcmd = new MySqlCommand(Select_SQL, DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_userid = Convert.ToString(reader["user_id"]);
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd.Dispose();
return 1;
}
if (str_userid.Length == 0) return 2;
return 0;
}
//====================================================================================================================
// DB検索:定期契約マスタ(regular_contract) - by user_id
//====================================================================================================================
private uint SO_DBChk_usrid(string str_uid, ref string[] str_rctbl)
{
if (DEMO_DB || !IsDbReady)
{
var s = DateTime.Now.AddDays(-1);
var e = DateTime.Now.AddMonths(1).AddDays(-1);
str_rctbl[0] = "RC-DEMO-0001";
str_rctbl[1] = s.ToString("yyyy/MM/dd HH:mm:ss");
str_rctbl[2] = e.ToString("yyyy/MM/dd HH:mm:ss");
str_rctbl[3] = s.ToString("yyyy/MM/dd HH:mm:ss");
str_rctbl[4] = "1";
str_rctbl[5] = "1";
return 0;
}
string Select_SQL = "select contract_id,contract_periods,contract_periode,printable_date,contract_flag,contract_permission from regular_contract where user_id =" + str_uid + ";";
MySqlCommand DBcmd = new MySqlCommand(Select_SQL, DBconnect);
DBcmd.CommandTimeout = 3;
try
{
var transaction = DBconnect.BeginTransaction();
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_rctbl[0] = Convert.ToString(reader["contract_id"]);
str_rctbl[1] = Convert.ToString(reader["contract_periods"]);
str_rctbl[2] = Convert.ToString(reader["contract_periode"]);
str_rctbl[3] = Convert.ToString(reader["printable_date"]);
str_rctbl[4] = Convert.ToString(reader["contract_flag"]);
str_rctbl[5] = Convert.ToString(reader["contract_permission"]);
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd.Dispose();
return 1;
}
return 0;
}
//====================================================================================================================
// DB検索:プリンタ利用者マスタ(user) - Mifare
//====================================================================================================================
private uint SO_DBChk_tagnum(ref string str_userid)
{
if (DEMO_DB || !IsDbReady) { str_userid = "1001"; return 0; }
var transaction = DBconnect.BeginTransaction();
string Select_SQL = "select user_id from user where user_tag_serial='" + MFCODE + "';";
MySqlCommand DBcmd = new MySqlCommand(Select_SQL, DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_userid = Convert.ToString(reader["user_id"]);
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd.Dispose();
return 1;
}
if (str_userid.Length == 0) return 3;
return 0;
}
//====================================================================================================================
// 印刷内容読み取り:駐車場名
//====================================================================================================================
private int SO_DBPrndat_pname()
{
if (DEMO_DB || !IsDbReady) { str_Prndat[0] = "デモ駐輪場"; return 0; }
var transaction = DBconnect.BeginTransaction();
MySqlCommand DBcmd = new MySqlCommand(DBREAD_park_name + str_Confile[3] + ";", DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_Prndat[0] = Convert.ToString(reader["park_name"]);
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd.Dispose();
return 1;
}
return 0;
}
//====================================================================================================================
// 印刷内容読み取り:定期種別
//====================================================================================================================
private int SO_DBPrndat_usubj1(uint type)
{
if (DEMO_DB || !IsDbReady) { str_Prndat[1] = " "; return 0; }
string str_Select;
if (type == 0)
{
str_Select = DBREAD_utype_sub1[type] + "'" + MFCODE + "';";
}
else
{
str_Select = DBREAD_utype_sub1[type] + "'" + QRdata + "';";
}
var transaction = DBconnect.BeginTransaction();
MySqlCommand DBcmd = new MySqlCommand(str_Select, DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
string str_work = Convert.ToString(reader["usertype_subject1"]);
if (str_work == "学生") str_Prndat[1] = "学";
else str_Prndat[1] = " ";
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd.Dispose();
return 1;
}
return 0;
}
//====================================================================================================================
// 印刷内容読み取り:場所種別
//====================================================================================================================
private int SO_DBPrndat_contid()
{
if (DEMO_DB || !IsDbReady) { str_Prndat[2] = "一般"; return 0; }
var transaction = DBconnect.BeginTransaction();
MySqlCommand DBcmd = new MySqlCommand(DBREAD_ptype_subj + str_Confile[3] + ";", DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_Prndat[2] = Convert.ToString(reader["ptype_subject"]);
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
return 1;
}
return 0;
}
//====================================================================================================================
// 印刷内容読み取り:開始日、終了日、定期契約ID
//====================================================================================================================
private int SO_DBPrndat_cperiod(uint type)
{
if (DEMO_DB || !IsDbReady)
{
var s = DateTime.Now;
var e = DateTime.Now.AddMonths(1).AddDays(-1);
str_Prndat[3] = ""; Cperiods(s.ToString("yy/MM/dd HH:mm:ss"), ref str_Prndat[3]);
str_Prndat[4] = ""; Cperiode(e.ToString("yy/MM/dd HH:mm:ss"), ref str_Prndat[4]);
str_Prndat[6] = "C-DEMO-01234";
return 0;
}
string str_Select;
string str_work1 = "";
string str_work2 = "";
string str_work3 = "";
if (type == 0)
{
str_Select = DBREAD_cont_periods[type] + "'" + MFCODE + "';";
}
else
{
str_Select = DBREAD_cont_periods[type] + "'" + QRdata + "';";
}
var transaction = DBconnect.BeginTransaction();
MySqlCommand DBcmd = new MySqlCommand(str_Select, DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_work1 = Convert.ToString(reader["contract_periods"]);
str_work2 = Convert.ToString(reader["contract_periode"]);
str_work3 = Convert.ToString(reader["contract_id"]);
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd.Dispose();
return 1;
}
Cperiods(str_work1, ref str_Prndat[3]);
Cperiode(str_work2, ref str_Prndat[4]);
str_Prndat[6] = str_work3;
return 0;
}
private void Cperiods(string str_work, ref string work)
{
int len = str_work.Length;
int mode = 0;
work = str_work.Substring(2, 2) + ".";
for (int i = 5; i < len; i++)
{
if (mode == 0)
{
if (str_work[i] == '/')
{
work = work + '.';
mode = 1;
}
else
{
work = work + str_work[i];
}
}
else if (mode == 1)
{
if (str_work[i] == ' ')
{
break;
}
work = work + str_work[i];
}
}
}
private void Cperiode(string str_work, ref string work)
{
int len = str_work.Length;
for (int i = 5; i < len; i++)
{
if (str_work[i] == '/')
{
break;
}
else
{
work = work + str_work[i];
}
}
}
//====================================================================================================================
// 印刷内容読み取り:再発行
//====================================================================================================================
/* private int SO_DBPrndat_sis(uint type)
{
if (DEMO_DB || !IsDbReady) { str_Prndat[5] = "1"; return 0; }
string str_Select;
string str_work = "";
if (type == 0)
{
str_Select = DBREAD_cont_sissue[type] + "'" + MFCODE + "';";
}
else
{
str_Select = DBREAD_cont_sissue[type] + "'" + QRdata + "';";
}
var transaction = DBconnect.BeginTransaction();
MySqlCommand DBcmd = new MySqlCommand(str_Select, DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_work = Convert.ToString(reader["contract_seal_issue"]);
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd.Dispose();
return 1;
}
int n = Convert.ToInt32(str_work);
if (n > 1) str_Prndat[5] = "再" + str_work;
else str_Prndat[5] = str_work;
return 0;
}*/
// 印刷内容読み取り:再発行 (C# 7.3 互換)
private int SO_DBPrndat_sis(uint type)
{
if (DEMO_DB || !IsDbReady) { str_Prndat[5] = "1"; return 0; }
string str_Select = (type == 0)
? DBREAD_cont_sissue[0] + "'" + MFCODE + "';"
: DBREAD_cont_sissue[1] + "'" + QRdata + "';";
int n = 1; // デフォルト=初回発行
try
{
using (var transaction = DBconnect.BeginTransaction())
using (var DBcmd = new MySqlCommand(str_Select, DBconnect))
{
DBcmd.CommandTimeout = 3;
// DBcmd.Transaction = transaction; // SELECT なので不要だが付けても良い
using (var reader = DBcmd.ExecuteReader())
{
if (reader.Read())
{
object v = reader["contract_seal_issue"];
int tmp;
if (v != DBNull.Value && v != null &&
int.TryParse(Convert.ToString(v), out tmp))
{
n = tmp;
}
}
}
transaction.Commit();
}
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
try { DBconnect.Close(); } catch { }
return 1;
}
str_Prndat[5] = (n > 1) ? ("再" + n.ToString()) : n.ToString();
return 0;
}
//====================================================================================================================
// 印刷内容読み取り:自治体名
//====================================================================================================================
private int SO_DBPrndat_cname()
{
if (DEMO_DB || !IsDbReady) { str_Prndat[7] = "デモ市"; return 0; }
var transaction = DBconnect.BeginTransaction();
MySqlCommand DBcmd = new MySqlCommand(DBREAD_city_name + str_Confile[3] + ";", DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_Prndat[7] = Convert.ToString(reader["city_name"]);
}
reader.Close();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
DBcmd.Dispose();
return 1;
}
return 0;
}
//====================================================================================================================
// DB書き込み:プリンタ制御プログラムログ(print_job_log)
//====================================================================================================================
private bool SO_DBInsert_pjl()
{
if (DEMO_DB || !IsDbReady) return true;
string Insert_SQL = "insert into print_job_log ( park_id, process_name,job_name, status, error_code, status_comment, created_at) value (" + str_Confile[3] + ",'" + str_logkm[2] + "','" + str_logkm[3] + "','" + str_logkm[4] + "'," + str_logkm[5] + ",'" + str_logkm[6] + "','" + str_logkm[7] + "');";
MySqlCommand DBcmd1 = new MySqlCommand(Insert_SQL, DBconnect);
MySqlTransaction transaction = DBconnect.BeginTransaction();
DBcmd1.Transaction = transaction;
DBcmd1.CommandTimeout = 3;
try
{
DBcmd1.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
return false;
}
string Select_SQL = "select job_log_id from print_job_log where created_at=" + "'" + str_logkm[7] + "';";
var transaction1 = DBconnect.BeginTransaction();
MySqlCommand DBcmd = new MySqlCommand(Select_SQL, DBconnect);
DBcmd.CommandTimeout = 3;
try
{
MySqlDataReader reader = DBcmd.ExecuteReader();
while (reader.Read())
{
str_logkm[0] = Convert.ToString(reader["job_log_id"]);
}
reader.Close();
transaction1.Commit();
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
DBconnect.Close();
return false;
}
return true;
}
//====================================================================================================================
// Mfifareリーダ初期化
//====================================================================================================================
private bool SO_MfifareInit()
{
if (MOCK_HW) return true;
uint result = 0;
result = CreateObject_Ex();
if (result != AidConst.NORMALEND) return false;
result = ObjectSetUp_Ex();
if (result != AidConst.NORMALEND) return false;
result = RW_Authentication_Ex();
return true;
}
//====================================================================================================================
// QRコードリーダ初期化
//====================================================================================================================
private bool SO_QRcordInit()
{
if (MOCK_HW) return true;
bool ret = true;
try
{
// 优先使用配置文件
if (!string.IsNullOrWhiteSpace(str_Confile[0]))
serialPort1.PortName = str_Confile[0]; // 例如 COM3
else
{
// 兜底取最后一个串口
PortList = SerialPort.GetPortNames();
int len = PortList.Length;
serialPort1.PortName = "COM" + len.ToString();
}
if (int.TryParse(str_Confile[1], out var baud)) serialPort1.BaudRate = baud;
else serialPort1.BaudRate = 9600;
// StopBits配置里“1”当作 One
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.Open();
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
ret = false;
}
return ret;
}
//====================================================================================================================
// Mfifareリーダ確認
//====================================================================================================================
public uint SO_MfifareCheck()
{
if (MOCK_HW) return 0xC0020001; // 演示:总是当作“未捕捉到卡”
uint result = 0;
uint vmode = 0;
uint vspeed = 0;
uint vtype = 0;
uint vbuffSize = 0;
uint vinfLen = 0;
vmode = 1000; // 検出タイムアウト時間を1000ms
vspeed = AidConst.CARDSPEED_DEFAULT;
vtype = 0;
vbuffSize = 64;
result = (uint)icc.StartTransaction(vmode, vspeed, ref vtype, out vinfBuff, vbuffSize, out vinfLen);
if (result != AidConst.NORMALEND) return result;
if (((uint)vtype & (~AidConst.CARDTYPE_MORECARD)) == AidConst.CARDTYPE_MIF)
{
string chk = string.Format("{0:X2}{1:X2}", vinfBuff[2], vinfBuff[1]);
if (chk == MFCODE_CHK) return 5;
}
else
{
return 5;
}
if ((vtype & AidConst.CARDTYPE_MORECARD) != 0) return 6;
date1 = DateTime.Now;
TimeSpan tc = date1 - date2;
int second = tc.Seconds;
uint ret = bcmp(vinfBuff, vinfBuff2);
if ((second < 2) && (ret == 0)) result = 10;
vinfBuff2 = vinfBuff;
date2 = date1;
MFCODE = string.Format("{0:X2}{1:X2}{2:X2}{3:X2}{4:X2}{5:X2}{6:X2}", vinfBuff[2], vinfBuff[3], vinfBuff[4], vinfBuff[5], vinfBuff[6], vinfBuff[7], vinfBuff[8]);
System.Diagnostics.Trace.WriteLine(MFCODE);
return result;
}
public static uint bcmp(byte[] buf1, byte[] buf2)
{
for (int i = 0; i < 10; i++)
{
if (buf1[i] != buf2[i]) return 1;
}
return 0;
}
//====================================================================================================================
// ラベル出力
//====================================================================================================================
public uint SO_PrnOut()
{
if (MOCK_HW || SO_MLC == null)
{
System.Diagnostics.Trace.WriteLine("**** [DEMO] 擬似印刷(実機なし) ****");
return 0;
}
uint Result = 0;
string Status = "";
System.Diagnostics.Trace.WriteLine("**** プリンタ起動 ****");
if (Result != 0) return Result;
return Result;
}
//====================================================================================================================
// プリンタ初期化
//====================================================================================================================
private bool SO_PrnInit()
{
if (MOCK_HW || SO_MLC == null) return true;
int Result = 0;
SO_MLC.LayoutFile = str_layoutFile;
SO_MLC.PrnData = "1";
SO_MLC.Setting = "USB:";
SO_MLC.Protocol = (Protocols)1;
Result = SO_MLC.OpenPort(1);
if (Result != 0) return false;
SO_MLC.EjectCut = true;
SO_MLC.MultiCut = 1;
return true;
}
//====================================================================================================================
// ラベル編集
//====================================================================================================================
private uint SO_PrnLabeEdit(uint type)
{
if (SO_DBPrndat_pname() != 0) return 1;
if (SO_DBPrndat_usubj1(type) != 0) return 1;
if (SO_DBPrndat_contid() != 0) return 1;
if (SO_DBPrndat_cperiod(type) != 0) return 1;
if (SO_DBPrndat_sis(type) != 0) return 1;
if (SO_DBPrndat_cname() != 0) return 1;
if (SO_MLC != null)
{
SO_MLC.SetPrnDataField("駐車場名", str_Prndat[0]);
SO_MLC.SetPrnDataField("定期種別", str_Prndat[1]);
SO_MLC.SetPrnDataField("場所種別", str_Prndat[2]);
SO_MLC.SetPrnDataField("開始日", str_Prndat[3]);
SO_MLC.SetPrnDataField("終了月", str_Prndat[4]);
SO_MLC.SetPrnDataField("再発行", str_Prndat[5]);
SO_MLC.SetPrnDataField("定期番号", str_Prndat[6]);
SO_MLC.SetPrnDataField("自治体名", str_Prndat[7]);
SO_MLC.SetPrnDataField("発行枚数", "1");
SO_MLC.EjectCut = true;
SO_MLC.MultiCut = 1;
}
return 0;
}
//====================================================================================================================
// 串口数据到达
//====================================================================================================================
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (serialPort1.IsOpen == false)
{
QRresult = 2;
return;
}
try
{
date1 = DateTime.Now;
QRdata = serialPort1.ReadExisting();
System.Text.Encoding hEncoding = System.Text.Encoding.GetEncoding("utf-32");
QRresult = 1;
}
catch (Exception ex)
{
QRdata = ex.Message;
QRresult = 2;
}
date1 = DateTime.Now;
TimeSpan tc = date1 - date2;
int second = tc.Seconds;
bool isEqual = QRdata.SequenceEqual(QRdata2);
if ((second < 2) && (isEqual))
{
QRresult = 10;
}
// 为了方便联调,强制改成固定 QR可注释掉
QRdata = "QRID1234";
QRdata2 = QRdata;
date2 = date1;
}
//====================================================================================================================
// IFD/カード/APIオブジェクトの生成
//====================================================================================================================
private uint CreateObject_Ex()
{
if ((ifd != null) || (icc != null) || (mif != null)) ReleaseAid_Ex();
ifd = Activator.CreateInstance(Type.GetTypeFromProgID("IFD.RW"));
if (ifd == null) return (1);
icc = Activator.CreateInstance(Type.GetTypeFromProgID("ICC.Card"));
if (icc == null) return (1);
mif = Activator.CreateInstance(Type.GetTypeFromProgID("Mifare.API"));
if (mif == null) return (1);
return (AidConst.NORMALEND);
}
//====================================================================================================================
// IFD/カード/APIオブジェクトに対するSetUp
//====================================================================================================================
private uint ObjectSetUp_Ex()
{
uint result = 0;
string portName = "";
short i = 0;
for (i = 1; i <= 9; i++)
{
portName = "COM" + Convert.ToString(i);
result = (uint)ifd.SetUp("PR", ref portName);
if (result == AidConst.NORMALEND) break;
}
if (result != AidConst.NORMALEND) return 1;
result = (uint)icc.SetUp("AM:MIF", ref ifd);
if (result != AidConst.NORMALEND) return 1;
result = (uint)mif.SetUp(ref icc);
if (result != AidConst.NORMALEND) return 1;
return result;
}
//====================================================================================================================
// IFD/カード/APIオブジェクトの開放
//====================================================================================================================
private void ReleaseAid_Ex()
{
if (mif != null)
{
Marshal.ReleaseComObject(mif);
mif = null;
}
if (icc != null)
{
Marshal.ReleaseComObject(icc);
icc = null;
}
if (ifd != null)
{
Marshal.ReleaseComObject(ifd);
ifd = null;
}
System.GC.Collect();
}
//====================================================================================================================
// ホストとリーダライタ間での相互認証
//====================================================================================================================
private uint RW_Authentication_Ex()
{
uint result = 0;
uint vtag;
byte[] vinfBuff = new byte[257];
uint vbuffSize = 0;
uint vinfLen = 0;
byte[] vvalue = {0x03,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,
0x00,
0x00};
vtag = 0x4088010; // 制御タグ値
vbuffSize = 256;
result = (uint)ifd.SetControl(vtag, ref vvalue, out vinfBuff, vbuffSize, out vinfLen);
if (result != AidConst.NORMALEND) return result;
Array.Clear(vvalue, 0, vvalue.Length);
vinfLen = 0;
vtag = 0x4088003;
vvalue[0] = 0;
result = (uint)ifd.SetControl(ref vtag, ref vvalue, ref vinfBuff, ref vbuffSize, ref vinfLen);
return result;
}
//====================================================================================================================
// EndTransactionを実行し、カードを開放
//====================================================================================================================
private uint ReleaseCard_Ex()
{
uint result;
int vmode;
vmode = 0; // 開放条件モード0
// カードオブジェクトを使用したEndTransactionの実行
result = (uint)icc.EndTransaction(ref vmode);
return result;
}
//====================================================================================================================
// FormClosing
//====================================================================================================================
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try { if (DBconnect != null && DBconnect.State != ConnectionState.Closed) DBconnect.Close(); } catch { }
if (EndType < 3) return;
try { if (SO_MLC != null) SO_MLC.ClosePort(); } catch { }
if (EndType == 3) return;
try { if (icc != null) ReleaseCard_Ex(); } catch { }
if (EndType == 4) return;
try { if (serialPort1 != null && serialPort1.IsOpen) serialPort1.Close(); } catch { }
}
}
//====================================================================================================================
// コンフィグファイル読み出し
//====================================================================================================================
class ConRead
{
public static uint ReadConFile(ref string[] con)
{
try
{
using (StreamReader sr1 = new StreamReader(Form1.CONFIG_PATH, System.Text.Encoding.GetEncoding("shift_jis")))
{
int i = 0;
string a = "";
while ((a = sr1.ReadLine()) != null && i < con.Length)
{
if (a.Length > 0)
{
string s1 = a.Substring(0, 1);
if (s1 != "#")
{
con[i++] = a;
}
}
}
if (i < con.Length)
{
System.Diagnostics.Trace.WriteLine("設定ファイルの項目数が不足しています。期待値: " + con.Length + ", 実際: " + i);
return 1;
}
}
}
catch (Exception e)
{
System.Diagnostics.Trace.WriteLine(e.Message);
return 1;
}
return 0;
}
}
//====================================================================================================================
// ログファイル読み出し
//====================================================================================================================
class Logfile
{
public static uint ReadLogFile()
{
string[,] work = new string[Form1.OutLogNum, 8];
int ei = 0;
for (int i = 0; i < Form1.OutLogNum; i++)
{
for (int j = 0; j < 8; j++)
{
work[i, j] = "";
}
}
DirectoryInfo dir = new DirectoryInfo(Form1.LogfilePath);
if (!dir.Exists)
{
for (int i = 0; i < Form1.OutLogNum; i++)
{
for (int j = 0; j < 8; j++)
{
Form1.koumoku[i, j] = "";
}
}
return 0;
}
FileInfo[] files = dir.GetFiles();
if (files.Length == 0)
{
for (int i = 0; i < Form1.OutLogNum; i++)
{
for (int j = 0; j < 8; j++)
{
Form1.koumoku[i, j] = "";
}
}
return 0;
}
Array.Sort<FileInfo>(files, delegate (FileInfo a, FileInfo b)
{
return a.Name.CompareTo(b.Name);
});
Array.Reverse(files);
string DispLogfile = Form1.LogfilePath + files[0].Name;
try
{
using (var sr = new System.IO.StreamReader(DispLogfile, System.Text.Encoding.GetEncoding("shift_jis")))
{
int i1 = 0;
while (!sr.EndOfStream && i1 < Form1.OutLogNum)
{
ei = i1;
var line = sr.ReadLine();
if (string.IsNullOrEmpty(line)) continue;
var values = line.Split(',');
int i2 = 0;
foreach (var value in values)
{
if (i2 < 8)
{
work[i1, i2++] = value ?? "";
}
else
{
break;
}
System.Diagnostics.Trace.WriteLine("{0} ", value);
}
while (i2 < 8)
{
work[i1, i2++] = "";
}
i1++;
}
for (int i = 0; i < Form1.OutLogNum; i++)
{
if (ei >= 0 && ei < Form1.OutLogNum)
{
for (int j = 0; j < 8; j++)
{
Form1.koumoku[i, j] = work[ei, j] ?? "";
}
}
else
{
for (int j = 0; j < 8; j++)
{
Form1.koumoku[i, j] = "";
}
}
ei--;
if (ei < 0) ei = Form1.OutLogNum - 1;
}
}
}
catch (System.Exception e)
{
System.Console.WriteLine(e.Message);
for (int i = 0; i < Form1.OutLogNum; i++)
{
for (int j = 0; j < 8; j++)
{
Form1.koumoku[i, j] = "";
}
}
return 1;
}
return 0;
}
}
//====================================================================================================================
// Keep Alive
//====================================================================================================================
public static class KEEPALIVE
{
public static System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
public static void TIM_Main()
{
timer.Tick += new EventHandler(MyTimer);
timer.Interval = Convert.ToInt32(Form1.str_Confile[7]) * 60000;
timer.Enabled = true;
System.Diagnostics.Trace.WriteLine("-----------");
System.Diagnostics.Trace.WriteLine(timer.Interval);
}
public static void MyTimer_stop()
{
timer.Enabled = false;
}
public static void MyTimer_start()
{
timer.Enabled = true;
}
public static void MyTimer(object sender, EventArgs e)
{
MyTimer_stop();
DateTime dtNow = DateTime.Now;
string str_stat = "";
string use_mem = "";
string free_mem = "";
System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess();
System.Management.ManagementClass mc = new System.Management.ManagementClass("Win32_OperatingSystem");
System.Management.ManagementObjectCollection moc = mc.GetInstances();
foreach (System.Management.ManagementObject mo in moc)
{
free_mem = Convert.ToString(mo["FreePhysicalMemory"]);
mo.Dispose();
}
moc.Dispose();
mc.Dispose();
use_mem = Convert.ToString(p.WorkingSet64 / 1000);
str_stat = "使用メモリ:[" + use_mem + "] 空きメモリ:[" + free_mem + "]";
string Insert_SQL = "INSERT INTO hardware_check_log (device_id, status, status_comment, created_at) VALUES (" + Form1.KpAlive_devid + ",1,'" + str_stat + "','" + dtNow + "');";
Form1.SO_DBKpAlive(Insert_SQL);
System.Diagnostics.Trace.WriteLine("-----------");
System.Diagnostics.Trace.WriteLine(timer.Interval);
MyTimer_start();
}
}
}