using Newtonsoft.Json.Linq;
using PTMedicalInsurance.Forms;
using PTMedicalInsurance.Helper;
using PTMedicalInsurance.Variables;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PTMedicalInsurance.Common
{
public class Utils
{
#region 工具
///
/// 返回当前日期
///
///
public static string GetDateTimeNow()
{
return DateTime.Now.ToString("yyyy-MM-dd");
}
///
/// 日期转换为时间戳Timestamp
///
/// 要转换的日期
///
public static long GetTimeStamp(DateTime dateTime)
{
DateTime _dtStart = new DateTime(1970, 1, 1, 8, 0, 0);
//10位的时间戳
long timeStamp = Convert.ToInt32(dateTime.Subtract(_dtStart).TotalSeconds);
//13位的时间戳
//long timeStamp = Convert.ToInt64(dateTime.Subtract(_dtStart).TotalMilliseconds);
return timeStamp;
}
///
/// UTC时间戳Timestamp转换为北京时间
///
/// 要转换的时间戳
///
public static DateTime GetDateTime(long timestamp)
{
//DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
//使用上面的方式会显示TimeZone已过时
DateTime dtStart = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1), TimeZoneInfo.Local);
DateTime targetDt = dtStart.AddMilliseconds(timestamp).AddHours(8);
return targetDt;
}
///
/// 将JObject对象中的timestamp数据转为yyyy-MM-dd格式
///
///
///
public static void convertTimestamp(JObject joObject,string key)
{
if (joObject.ContainsKey(key))
{
Global.writeLog(string.Format("当前对象[{0}]的类型为:{1}", key, joObject.GetValue(key).Type.GetType()));
}
if (joObject.ContainsKey(key) && joObject.GetValue(key).Type.GetType() != typeof(string))
{
long timestamp = long.Parse(joObject.GetValue(key).ToString());
string datetime = Utils.GetDateTime(timestamp).ToString("yyyy-MM-dd");
joObject[key] = datetime;
Global.writeLog(string.Format("转换后的日期为:{0}",datetime));
}
}
public static string ConvertLongToDate(string strValue)
{
DateTime dateTime = DateTimeOffset.FromUnixTimeMilliseconds(long.Parse(strValue)).DateTime;
return dateTime.ToString("yyyy-MM-dd");
}
public static string ConvertShortDate(string strValue)
{
if (!strValue.Contains("-") && strValue.Length >= 8)
{
return strValue.Substring(0, 4) + "-" + strValue.Substring(4, 2) + "-" + strValue.Substring(6, 2);
}
return strValue.Length > 10 ? strValue.Substring(0, 10) : strValue;
}
public static string ConvertNoSplitDate(string strValue)
{
strValue = strValue.Replace("-", "");
if(strValue.Length>8)
{
strValue = strValue.Substring(0, 8);
}
return strValue;
}
#endregion
#region BeanUtils
///
/// 用反射对实体进行属性值合并,返回合并后的属性并集
///
///
/// 合并对象1
/// 合并对象2
/// 是否强制覆盖
///
public static T merge(T entity, T addtional,bool forceCover)
{
if (entity == null) return addtional;
if (addtional == null) return entity;
// 进行合并
Type mType = typeof(T);
object result = Activator.CreateInstance(mType);
PropertyInfo[] pi = mType.GetProperties();
pi.ToList().ForEach((p) =>
{
object v1 = p.GetValue(entity);
object v2 = p.GetValue(addtional);
if (forceCover)
{
v1 = v2;
}
else {
v1 = (v1 == null ? v2 : v1);
}
p.SetValue(result, v1);
});
return (T)result;
}
///
/// 对2个对象进行合并,以第一个对象为重点
///
///
///
///
///
public static T merge(T entity, T addtional)
{
return merge(entity, addtional, false);
}
private static JObject merge(JObject to, JObject from)
{
to.Merge(from);
return to;
}
///
/// 采用Json的方式进行属性合并(默认会覆盖)
///
///
///
///
///
public static T mergeObject(T to, T from)
{
JObject toObj = JObject.FromObject(to);
JObject fromObj = JObject.FromObject(from);
JObject result = merge(toObj, fromObj);
return result.ToObject();
}
#endregion
#region 业务个性化
///
/// 在JObject对象基础上进行包装
///
///
///
public static JObject Wrapper(JObject jsonInParam)
{
//dynamic request = new JObject();
//request.arg0 = jsonInParam;
//return request;
return jsonInParam;
}
///
/// 删除JObject上的进行包装
///
///
///
public static JObject removeWrapper(JObject jsonInParam)
{
//if (jsonInParam.ContainsKey("arg0"))
//{
// return (JObject)jsonInParam.GetValue("arg0");
//}
return jsonInParam;
}
///
/// 获取参保地编码
///
///
public static string GetInsuCode()
{
if (string.IsNullOrEmpty(Global.pat.insuplc_admdvs))
{
Global.pat.insuplc_admdvs = Global.inf.areaCode;
}
if (Global.pat.OtherProv == 1)
{
Global.pat.insuplc_admdvs = Global.pat.card.SearchAdmCode;
}
return Global.pat.insuplc_admdvs;
}
///
/// 获取医院编码(社保)
///
///
public static string GetInsuOrgCode()
{
return Global.inf.hospitalNO;
}
///
/// 跨省异地
///
///
public static bool isOtherProvice(string areaCode)
{
if (!string.IsNullOrEmpty(areaCode) && areaCode.Length>2 && areaCode.Substring(0, 2) != "21")
{
return true;
}
return false;
}
public static bool isOtherProvice()
{
return isOtherProvice(getAreaCode());
}
private static string getAreaCode()
{
string areaCode = Global.pat.insuplc_admdvs ?? Global.inf.areaCode;
if (Global.pat.OtherProv == 1)
{
areaCode = Global.pat.card.SearchAdmCode;
}
return areaCode;
}
public static bool isOtherCity()
{
return isOtherCity(getAreaCode());
}
///
/// 省内异地
///
///
public static bool isOtherCity(string areaCode)
{
if (!string.IsNullOrEmpty(areaCode) && areaCode.Length > 4 && areaCode.Substring(0, 4) != "3701")
{
return true;
}
return false;
}
///
/// 将入参进行标准化转换
///
///
public static JObject ConvertRequest(TradeEnum trade,JObject request)
{
JObject joOutput = request;
JsonMapper mapper = new JsonMapper(trade.GetCode());
// 非基线版需要转换
if (!Global.curEvt.ext.BaseLineMode)
{
// 调试模式,可手动配置转换规则
if (Global.curEvt.showJson)
{
JsonMappingForm form = new JsonMappingForm(request.ToString(),mapper.GetInputJson(),trade.GetCode());
form.ShowDialog();
mapper.reload(); //修改后重新加载
}
joOutput = mapper.MapRequest(request);
}
// 日志
Global.writeLog("ConvertRequest", request.ToString(),joOutput.ToString());
return joOutput;
}
///
/// 将交易输出进行标准化转换
///
///
///
///
///
public static JObject ConvertResponse(TradeEnum trade, JObject response)
{
JsonMapper mapper = new JsonMapper(trade.GetCode());
JObject joOutput = response;
// 非基线版需要转换
if (!Global.curEvt.ext.BaseLineMode)
{
//如果没有配置转换规则,调试模式,可手动配置
if (Global.curEvt.showJson)
{
JsonMappingForm form = new JsonMappingForm(response.ToString(), mapper.GetOutputJson(), trade.GetCode(),false);
form.ShowDialog();
mapper.reload(); //修改后重新加载
}
joOutput = mapper.MapResponse(response);
}
// 日志
Global.writeLog("ConvertResponse", "", joOutput.ToString());
return joOutput;
}
///
/// 部分业务需要使用特殊的就诊凭证号
///
///
public static string ConvertMdtrtcertNo()
{
if ("01".Equals(Global.pat.mdtrtcertType))
{
return Global.pat.mdtrtcertNO;
}
else
{
return Global.pat.certNO + "|" + Global.pat.card.BusinessCode;
}
}
///
/// 保存信息到pat.Expand字段
///
///
///
public static void ExpandData(string key,object value)
{
string expand = Global.pat.ExpContent;
JObject obj = new JObject();
if (!string.IsNullOrEmpty(expand))
{
obj = JObject.Parse(expand);
}
if (!obj.ContainsKey(key))
{
obj.Add(key, value?.ToString());
}
else
{
obj[key] = value?.ToString();
}
Global.pat.ExpContent = obj.ToString();
}
public static string convertAdmDr(string admNo)
{
// 重庆异地(每次唯一)
//if (isOtherCity())
//{
// // 住院号15位,控制总长度不超过20
// string ret = admNo + "-" + DateTime.Now.ToString("HHmm");
// // 保存到扩展信息字段中
// ExpandData("admDr", ret);
// return ret;
//}
return admNo;
}
public static bool Confirm(string title)
{
if (MessageBox.Show(title, "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
return false;
}
return true;
}
public static string MockData(bool requestFlag,string tradeNo)
{
string dataFile = Global.curEvt.path +"/config/mock/" + (requestFlag ? "request" : "response") + "/" + tradeNo + ".json";
// 加载字段映射配置
if (File.Exists(dataFile))
{
return File.ReadAllText(dataFile);
}
else
{
Global.writeLog("配置文件不存在:"+dataFile);
}
return "";
}
#endregion
}
}