/// <summary> /// 根据MeterDisassemblyTaskResultInfo组合成任务结果文件内容 /// 换表和销户的任务结果 /// </summary> /// <param name="resultinfo"></param> /// <returns></returns> private static String GetResultFileContent_Replase(MeterDisassemblyTaskResultInfo resultinfo) { List <String> contentlist = new List <string> { }; /*TaskID=XX(当前的任务ID) * TaskType=1(0-退购,1-换表,2-销户) * TechnicianID =XX(上门工程师的ID) * MeterAddress=012017062001(表通信地址,射频卡表是LAPIS中的meterbasicinfo里面的communicationaddress) * MeterStatue=0/1 (表计的状态,0-损坏,1-正常) * UsedValue=XX (配合MeterStatue,如果表计正常,则UsedValue指总使用金额/量。如果表计损坏,则UsedValue指当前机械读数) * RemainValue=XX(配合MeterStatue,如果表计正常,则RemainValue指剩余金额/量。如果表计损坏,保持为0,返回LAPIS由系统计算) * OldMeterTotalDialReading=XX(表计中的总使用量,如果表计正常,则表示标识00000010总使用量。如果表计损坏,则指当前机械读数) * Result=0/1 (任务是否成功,0-失败,1-成功) * Feedback= (工程师反馈的任务结果信息) * Date=20XX-XX-XX (操作日期)*/ String filestr = Const_TaskID + "=" + resultinfo.TaskID.ToString(); contentlist.Add(filestr); filestr = Const_TaskType + "=" + ((Int32)resultinfo.TaskType).ToString(); contentlist.Add(filestr); filestr = Const_TechnicianID + "=" + resultinfo.TechnicianID.ToString(); contentlist.Add(filestr); filestr = Const_MeterAddress + "=" + resultinfo.MeterAddress; contentlist.Add(filestr); String resstr = (resultinfo.MeterStatue) ? "1" : "0"; filestr = Const_MeterStatue + "=" + resstr; contentlist.Add(filestr); filestr = Const_UsedValue + "=" + resultinfo.TotalComsumedValue.ToString("F2"); contentlist.Add(filestr); filestr = Const_RemainValue + "=" + resultinfo.RemainValue.ToString("F2"); contentlist.Add(filestr); filestr = Const_OldMeterTotalDialReading + "=" + resultinfo.OldMeterTotalDialReading.ToString("F2"); contentlist.Add(filestr); resstr = (resultinfo.TaskResult == (Int32)eTaskResult.Failed) ? "0" : "1"; filestr = Const_Result + "=" + resstr; contentlist.Add(filestr); filestr = Const_Feedback + "=" + resultinfo.Feedback; contentlist.Add(filestr); resstr = resultinfo.OperateFinishTime.ToString("yyyy-MM-dd"); filestr = Const_Date + "=" + resstr; contentlist.Add(filestr); String reslutfile = DataFormatProcessor.ListToString(contentlist, Environment.NewLine); return(reslutfile); }
/// <summary> /// 获取文件名 /// 根据任务类型和对应的参数 /// </summary> /// <param name="type"></param> /// <param name="refundtaskinfo"></param> /// <param name="resultinfo"></param> /// <param name="isResultFile">true-结果文件名,false-任务文件名</param> /// <returns></returns> private static String GetFileName(eTaskType type, RefundTask refundtaskinfo, MeterDisassemblyTaskBase resultinfo, Boolean isResultFile = true) { List <String> namelist = new List <string> { }; String str = String.Empty; //先根据任务类型 switch (type) { case eTaskType.CloseCustomer: str = (isResultFile) ? Const_TaskFileResultName_CancelAccountResult : Const_TaskFileName_CancelAccountTask; break; case eTaskType.Refund: str = (isResultFile) ? Const_TaskFileResultName_RefundResult : Const_TaskFileName_RefundTask; break; case eTaskType.ReplaceMeter: str = (isResultFile) ? Const_TaskFileResultName_ReplaceMeterResult : Const_TaskFileName_ReplaceMeterTask; break; default: return(null); } namelist.Add(str); if (type == eTaskType.Refund) { if (refundtaskinfo == null) { return(null); } //获取 TechnicianID namelist.Add(refundtaskinfo.TechnicianID.ToString()); //获取 TaskID namelist.Add(refundtaskinfo.TaskID.ToString()); } else { if (resultinfo == null) { return(null); } //获取 TechnicianID namelist.Add(resultinfo.TechnicianID.ToString()); //获取 TaskID namelist.Add(resultinfo.TaskID.ToString()); } String reslutfilename = DataFormatProcessor.ListToString(namelist, "_"); reslutfilename = reslutfilename + ".bin"; return(reslutfilename); }
/// <summary> /// 根据RefundTaskInfo组合成任务文件内容 /// 仅退购的任务 /// </summary> /// <param name="refundtaskinfo"></param> /// <returns></returns> private static String GetTaskFileContent_Refund(RefundTaskInfo refundtaskinfo) { if (refundtaskinfo == null) { return(null); } List <String> contentlist = new List <string> { }; /*TaskID=XX(当前的任务ID) * TaskType=0:退购,1:换表,2:销户 * TechnicianID =XX(上门工程师的ID) * MeterAddress=012017062001(表通信地址) * TIDTestingToken=XXXX XXXX XXXX XXXX XXXX(测试TID的TOKEN,值为0) * RefundToken=XXXX XXXX XXXX XXXX XXXX(撤销金额的TOKEN) * RefundValue=0.00(根据用户走量还是走金额,从交易记录中获取对应的值) * MeterProtocolType=XX (表通信协议类型,eMeterProtocolType) * DecimalParameter=脉冲当量小数位数;计量模式;价格精度小数位数;结算精度小数位数;是否显示K * SetMeterKeyParam=XXXXXXXXXXXXX (STS卡表在开启或关闭红外的时候需要这个设置密钥来制卡) */ String filestr = Const_TaskID + "=" + refundtaskinfo.TaskID.ToString(); contentlist.Add(filestr); filestr = Const_TaskType + "=0"; contentlist.Add(filestr); filestr = Const_RefundTradeID + "=" + refundtaskinfo.RefundTradeID.ToString(); contentlist.Add(filestr); filestr = Const_TechnicianID + "=" + refundtaskinfo.TechnicianID.ToString(); contentlist.Add(filestr); filestr = Const_MeterAddress + "=" + refundtaskinfo.MeterAddress; contentlist.Add(filestr); filestr = Const_TIDTestingToken + "=" + refundtaskinfo.TIDTestingToken; contentlist.Add(filestr); filestr = Const_RefundValue + "=" + refundtaskinfo.RefundValue.ToString("F2"); contentlist.Add(filestr); filestr = Const_MeterProtocolType + "=" + ((Int32)refundtaskinfo.ProtocolType).ToString(); contentlist.Add(filestr); filestr = Const_DecimalParameter + "=" + refundtaskinfo.DecimalParameter; contentlist.Add(filestr); filestr = Const_SetMeterKeyParam + "=" + refundtaskinfo.SetMeterKeyParam; contentlist.Add(filestr); String reslutfile = DataFormatProcessor.ListToString(contentlist, Environment.NewLine); return(reslutfile); }
/// <summary> /// 根据RefundTaskInfo组合成任务结果文件内容 /// 仅退购的任务结果 /// </summary> /// <param name="resultinfo"></param> /// <returns></returns> private static String GetResultFileContent_Refund(RefundTaskResultInfo refundtaskinfo) { if (refundtaskinfo == null) { return(null); } List <String> contentlist = new List <string> { }; /*TaskID=XX(当前的任务ID) * TaskType=0:退购,1:换表,2:销户 * TechnicianID =XX(上门工程师的ID) * MeterAddress=012017062001(表通信地址) * TaskFinished=0/1 (任务是否完成) * AllowRefund=0/1 (是否允许退购,0:禁止,1:允许) * TaskProcess=FinishedStep;Step1Value;Step2Value;………. (以分号划分,第一个数据为总完成的步骤数,后面数据为每个步骤的值) */ String filestr = Const_TaskID + "=" + refundtaskinfo.TaskID.ToString(); contentlist.Add(filestr); filestr = Const_TaskType + "=0"; contentlist.Add(filestr); filestr = Const_RefundTradeID + "=" + refundtaskinfo.RefundTradeID.ToString(); contentlist.Add(filestr); filestr = Const_TechnicianID + "=" + refundtaskinfo.TechnicianID.ToString(); contentlist.Add(filestr); filestr = Const_MeterAddress + "=" + refundtaskinfo.MeterAddress; contentlist.Add(filestr); filestr = Const_TaskFinished + "=" + (refundtaskinfo.TaskFinished ? "1" : "0"); contentlist.Add(filestr); filestr = Const_AllowRefund + "=" + (refundtaskinfo.EnableRefund ? "1" : "0"); contentlist.Add(filestr); filestr = Const_TaskProcess + "=" + refundtaskinfo.TaskProcess; contentlist.Add(filestr); String reslutfile = DataFormatProcessor.ListToString(contentlist, Environment.NewLine); return(reslutfile); }
/// <summary> /// 根据MeterDisassemblyTaskResultInfo组合成任务文件内容 /// 换表和销户的任务 /// </summary> /// <param name="resultinfo"></param> /// <returns></returns> private static String GetTaskFileContent_Replase(MeterDisassemblyTaskInfo resultinfo) { List <String> contentlist = new List <string> { }; /*TaskID=XX(当前的任务ID) * TaskType=1(0-退购,1-换表,2-销户) * TechnicianID =XX(上门工程师的ID) * MeterAddress=012017062001(表通信地址,射频卡表是LAPIS中的meterbasicinfo里面的communicationaddress) * AreaCode=m_runparam.CurrentOperator.AreaCode * MeterProtocolType=XX (表通信协议类型,eMeterProtocolType) * DecimalParameter=脉冲当量小数位数;计量模式;价格精度小数位数;结算精度小数位数;货币符号;是否显示K*/ String filestr = Const_TaskID + "=" + resultinfo.TaskID.ToString(); contentlist.Add(filestr); filestr = Const_TaskType + "=" + ((Int32)resultinfo.TaskType).ToString(); contentlist.Add(filestr); filestr = Const_TechnicianID + "=" + resultinfo.TechnicianID.ToString(); contentlist.Add(filestr); filestr = Const_MeterAddress + "=" + resultinfo.MeterAddress; contentlist.Add(filestr); filestr = Const_AreaCode + "=" + resultinfo.AreaCode.ToString(); contentlist.Add(filestr); filestr = Const_MeterProtocolType + "=" + ((Int32)resultinfo.MeterProtocolType).ToString(); contentlist.Add(filestr); filestr = Const_DecimalParameter + "=" + resultinfo.DecimalParameter; contentlist.Add(filestr); //增加STS设置参数密钥 filestr = Const_SetMeterKeyParam + "=" + resultinfo.SetMeterKeyParam; contentlist.Add(filestr); String reslutfile = DataFormatProcessor.ListToString(contentlist, Environment.NewLine); return(reslutfile); }
/// <summary> /// 加密任务结果内容 /// </summary> /// <param name="filestr"></param> /// <returns></returns> private static String EncryptInfo(String filestr) { //使用 DataFormatProcessor获取 4字节 Byte[] validdata = DataFormatProcessor.StringToBytes(filestr); if (validdata == null || validdata.Length < 1) { return(null); } //总长度 Int32 allLen = validdata.Length; //原文 Byte[] rawbytes = new Byte[Const_AESEncryptLen]; //密文 Byte[] endata = null; String Ciphertext = String.Empty; if (allLen <= Const_AESEncryptLen) //小于等于16字节 { Array.Copy(validdata, 0, rawbytes, 0, validdata.Length); //AES加密 m_aes.Encrypt(rawbytes, ref endata); //转换为HEX string Ciphertext = DataFormatProcessor.BytesToHexString(endata); return(Ciphertext); } //原始数据大于16字节,分段传输 //已发送的长度 Int32 sentDataTableLen = 0; //剩余需要发送的长度 Int32 lastDataTableLen = allLen; rawbytes = new Byte[] { }; List <String> CiphertextList = new List <string> { }; //检查当前剩下还没发送的数据长度,是否超过32K while (lastDataTableLen > Const_AESEncryptLen) //超过时,分段发送 { endata = null; rawbytes = new Byte[Const_AESEncryptLen]; Array.Copy(validdata, sentDataTableLen, rawbytes, 0, Const_AESEncryptLen); //随后 已发送长度增加32K sentDataTableLen += Const_AESEncryptLen; lastDataTableLen -= Const_AESEncryptLen; //AES加密 m_aes.Encrypt(rawbytes, ref endata); //转换为HEX string Ciphertext = DataFormatProcessor.BytesToHexString(endata); CiphertextList.Add(Ciphertext); } endata = null; //如果剩余不足32K, 直接全部发送,并且通知客户端已经发送完毕 rawbytes = new Byte[Const_AESEncryptLen]; Array.Copy(validdata, sentDataTableLen, rawbytes, 0, lastDataTableLen); //AES加密 m_aes.Encrypt(rawbytes, ref endata); //转换为HEX string Ciphertext = DataFormatProcessor.BytesToHexString(endata); CiphertextList.Add(Ciphertext); return(DataFormatProcessor.ListToString(CiphertextList, "")); }
/// <summary> /// 解密任务文件内容 /// </summary> /// <param name="encryptstr"></param> /// <returns></returns> private static String DencryptTaskFileInfo(String encryptstr) { //转化成字节数组,已加密 Byte[] encryptBytes = DataFormatProcessor.HexStringToBytes(encryptstr); if (encryptBytes == null || encryptBytes.Length < 1) { return(null); } //总长度 Int32 allLen = encryptBytes.Length; //密文 Byte[] rawbytes = new Byte[Const_AESEncryptLen]; //原文 Byte[] endata = null; String Ciphertext = String.Empty; String datastr = String.Empty; String value = String.Empty; Boolean bl = false; if (allLen <= Const_AESEncryptLen) //小于等于16字节 { Array.Copy(encryptBytes, 0, rawbytes, 0, encryptBytes.Length); //AES加密 m_aes.Decrypt(rawbytes, ref endata); //转换为HEX string datastr = DataFormatProcessor.BytesToString(endata); bl = DataFormatProcessor.GetStringPair(datastr, '\0', ref Ciphertext, ref value); if (!bl || String.IsNullOrEmpty(Ciphertext)) { Ciphertext = datastr; } return(Ciphertext); } //原始数据大于16字节,分段解密 //已解密的长度 Int32 sentDataTableLen = 0; //剩余需要解密的长度 Int32 lastDataTableLen = allLen; rawbytes = new Byte[] { }; List <String> CiphertextList = new List <string> { }; //检查当前剩下还没解密的数据长度,是否超过16 while (lastDataTableLen > Const_AESEncryptLen) { endata = null; rawbytes = new Byte[Const_AESEncryptLen]; Array.Copy(encryptBytes, sentDataTableLen, rawbytes, 0, Const_AESEncryptLen); //随后 已发送长度增加16 sentDataTableLen += Const_AESEncryptLen; lastDataTableLen -= Const_AESEncryptLen; //AES加密 m_aes.Decrypt(rawbytes, ref endata); //转换为HEX string datastr = DataFormatProcessor.BytesToString(endata); bl = DataFormatProcessor.GetStringPair(datastr, '\0', ref Ciphertext, ref value); if (!bl || String.IsNullOrEmpty(Ciphertext)) { Ciphertext = datastr; } CiphertextList.Add(Ciphertext); } endata = null; rawbytes = new Byte[Const_AESEncryptLen]; Array.Copy(encryptBytes, sentDataTableLen, rawbytes, 0, lastDataTableLen); //AES加密 m_aes.Decrypt(rawbytes, ref endata); //转换为HEX string datastr = DataFormatProcessor.BytesToString(endata); bl = DataFormatProcessor.GetStringPair(datastr, '\0', ref Ciphertext, ref value); if (!bl || String.IsNullOrEmpty(Ciphertext)) { Ciphertext = datastr; } CiphertextList.Add(Ciphertext); return(DataFormatProcessor.ListToString(CiphertextList, "")); }