You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

603 lines
23 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using DSWeb.Areas.MvcShipping.DAL.Message.vgm;
using DSWeb.Common.DB;
using DSWeb.Common.Model;
using DSWeb.MvcShipping.DAL.MsBaseInfoDAL;
using DSWeb.MvcShipping.DAL.MsOpSeaeEdiVGM;
using DSWeb.MvcShipping.Helper;
using DSWeb.MvcShipping.Models.MsOpSeaeEdiVGM;
using HcUtility.Comm;
using HcUtility.Core;
using log4net;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
namespace DSWeb.Interface
{
/// <summary>
/// CustVGM 的摘要说明
/// </summary>
public class CustVGM : IHttpHandler
{
private const int DURATION = 1;
private const int TIMES = 10;
private ILog log = LogManager.GetLogger("CustVGM");
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string rst = "1";
if (!IsValid())
{
rst = "操作太频繁!";
}
else
{
if (context.Request["ac"] == "vgm")
{
if (ConfigurationManager.AppSettings["CustVgmSendUseNew"] == "1")
{
rst = SendCustVgmNew(context);
}
else
{
rst = SendCustVGM(context);
}
}
else if (context.Request["ac"] == "vgmstatus")
{
rst = GetVGMSTATUS(context);
}
else
{
rst = "参数有误";
}
}
context.Response.Write(rst);
}
public bool IsReusable
{
get
{
return false;
}
}
public string SendCustVGM(HttpContext context)
{
string uid = context.Request["uid"];
string skey = context.Request["skey"];
string optype = context.Request["optype"];
string mdata = context.Request["mdata"];
string ctndata = context.Request["ctndata"];
if (uid == null || optype == null || mdata == null || ctndata == null)
{
return "参数有误!";
}
if (!MsOpSeaeEdiVGMDAL.CheckAuth(uid, skey))
{
return "身份验证错误!";
}
var headData = JsonConvert.Deserialize<MsOpSeaeEdiVGMModel>(mdata);
List<MsOpSeaeEdiVGMCtn> bodyList = JsonConvert.Deserialize<List<MsOpSeaeEdiVGMCtn>>(ctndata);
List<MsOpSeaeEdiVGMCtn> listTemp = JsonConvert.Deserialize<List<MsOpSeaeEdiVGMCtn>>(ctndata);
string userid = uid;
var isPost = true;
string ctnStr = "";
string cntrnohis = "";
string sealnohis = "";
if (bodyList != null)
{
if (bodyList.Count > 0)
{
bool IsDongGui = false;
int i = 0;
string ctnTemp = "";
foreach (var item in bodyList)
{
ctnTemp = item.CTNALL;
List<MsOpSeaeEdiVGMCtn> list = listTemp.FindAll(b => b.CTNALL == ctnTemp).ToList();
if (list.Count != 0)
{
ctnStr += ctnTemp + "*" + list.Count.ToString() + ",";
listTemp.RemoveAll(a => a.CTNALL == ctnTemp);
}
if (IsDongGui == false)
{
if (item.CTNALL.Contains("RH") || item.CTNALL.Contains("RF") || item.CTNALL.Contains("RQ"))
{
IsDongGui = true;
}
}
if (i == 0)
{
if (headData.BaoZhuang == "" || headData.BaoZhuang == null)
{
headData.BaoZhuang = item.KINDPKGS;
}
}
//更新箱型信息
item.CTNALL = MsOpSeaeEdiVGMDAL.GetCTNALLWithEDICODE(item.CTNALL);
string strp1 = item.CNTRNO.Substring(0, 4);
string strp2 = item.CNTRNO.Substring(4, item.CNTRNO.Length - 4);//AAAA1234567
bool CNTRNOENABLED = true;
if (item.CNTRNO.Length != 11)
{
CNTRNOENABLED = false;
}
if (!System.Text.RegularExpressions.Regex.IsMatch(strp1, @"(?i)^[a-zA-Z]+$"))
{
CNTRNOENABLED = false;
}
if (!System.Text.RegularExpressions.Regex.IsMatch(strp2, @"(?i)^[0-9]+$"))
{
CNTRNOENABLED = false;
}
if (!CNTRNOENABLED)
{
return "箱号格式错误!";
}
if (cntrnohis.Contains(item.CNTRNO))
{
return "箱号重复";
}
cntrnohis += item.CNTRNO + ",";
if (sealnohis.Contains(item.SEALNO))
{
return "封号重复";
}
sealnohis += item.SEALNO + ",";
i++;
}
}
}
if (ctnStr.Length > 0)
{
ctnStr = ctnStr.Substring(0, ctnStr.Length - 1);
}
var errorstr = "";
headData.JiZhuangXiang = ctnStr;
//更新船公司信息
headData.CARRIER = MsOpSeaeEdiVGMDAL.GetCGSWithEDICODE(headData.CARRIER);
headData.LuRuRenId = userid;
headData.LuRuRen = MsOpSeaeEdiVGMDAL.GetShowNameWithGID(userid);
headData.LuRuRiQi = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
#region 根据船公司校验ORDERNO和VGMCLOSETIME两个字段
if ((headData.CARRIER == "HLC" || headData.CARRIER == "WHL") && string.IsNullOrEmpty(headData.ORDERNO))
{
return JsonConvert.Serialize(new JsonResponse() { Success = false, Message = "订舱编号必填,请填写!" });
}
if ((headData.CARRIER == "MSK" || headData.CARRIER == "HMM"))
{
if (string.IsNullOrEmpty(headData.VGMCLOSETIME))
{
return JsonConvert.Serialize(new JsonResponse() { Success = false, Message = "VGM截止日期必填请填写" });
}
else
{
if (DateTime.TryParse(headData.VGMCLOSETIME, out DateTime vgmCloseTime))
{
if (vgmCloseTime < DateTime.Today)
{
return JsonConvert.Serialize(new JsonResponse() { Success = false, Message = "VGM截止日期不能小于当天请检查" });
}
}
else
{
return JsonConvert.Serialize(new JsonResponse() { Success = false, Message = "VGM截止日期格式有误" });
}
}
}
#endregion
//判断一个用户下的主提单号,分提单号是否重复
string MFNO = "";
string status = "";
if (MsOpSeaeEdiVGMDAL.HasSameMBLNOWithUserIdForInterface(headData.MBLNO, userid, out MFNO, out status))
{
headData.MFNO = MFNO;
headData.SENDSTATUS = status;
headData.DbOperationType = DbOperationType.DbotUpd;
}
else
{
headData.SENDSTATUS = "已录入";
headData.DbOperationType = DbOperationType.DbotIns;
headData.MFNO = Guid.NewGuid().ToString();
}
if (headData.ETD == "")
{
headData.ETD = null;
}
else
{
headData.ETD = DateTime.Parse(headData.ETD).ToString("yyyy-MM-dd");
}
headData.CARRIER = MsBaseInfoDAL.DelPortCn(headData.CARRIER);
headData.ChuanMing = MsBaseInfoDAL.DelPortCn(headData.ChuanMing);
headData.HangCi = MsBaseInfoDAL.DelPortCn(headData.HangCi);
headData.ZhuangHuoGang = MsBaseInfoDAL.DelPortCn(headData.ZhuangHuoGang);
headData.XieHuoGang = MsBaseInfoDAL.DelPortCn(headData.XieHuoGang);
headData.MuDiDi = MsBaseInfoDAL.DelPortCn(headData.MuDiDi);
headData.ShouHuoDi = MsBaseInfoDAL.DelPortCn(headData.ShouHuoDi);
var BSNO = headData.MFNO;
var modb = new ModelObjectDB();
DBResult result = modb.Save(headData);
if (result.Success == true)
{
result = MsOpSeaeEdiVGMDAL.SaveDetailForInterface(headData, bodyList, null);
if (result.Success)
{
string outmsg = "";
bool allow = vgmptDAL.CheckAllowSend(headData.MFNO, optype, out outmsg);
if (!allow)
{
var json2 = JsonConvert.Serialize(new { Success = true, Message = outmsg });
return json2;
}
string path = HttpContext.Current.Server.MapPath("/VGMFile/");
string filepath = "";
string msg = vgmptDAL.writeAndSendVgmXml("'" + headData.MFNO + "'", userid, optype, path, out filepath);
headData.SENDSTATUS = "已发送";
modb.Save(headData);
var json = JsonConvert.Serialize(new { Success = true, Message = msg });
return json;
}
}
var jsonRespose = new JsonResponse
{
Success = result.Success,
Message = result.Message
};
return JsonConvert.Serialize(jsonRespose);
}
//发送vgm接口2022-5-13根据最新逻辑重写
public string SendCustVgmNew(HttpContext context)
{
CommonDataContext commonData = new CommonDataContext();
VgmDataContext vgmData = new VgmDataContext();
vgmData.Database.Log = (x) =>
{
log.Debug(x);
};
RespCommon resp = new RespCommon();
string uid = context.Request["uid"];
string skey = context.Request["skey"];
string optype = context.Request["optype"];
string mdata = context.Request["mdata"];
string ctndata = context.Request["ctndata"];
if (string.IsNullOrEmpty(uid)
|| string.IsNullOrEmpty(optype)
|| string.IsNullOrEmpty(mdata)
|| string.IsNullOrEmpty(ctndata))
{
resp.Success = false;
resp.Message = "参数有误";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
var custAuth = commonData.CUST_AUTH.AsNoTracking().Where(ca => ca.USERID == uid && ca.SKEY == skey).FirstOrDefault();
if (custAuth == null)
{
resp.Success = false;
resp.Message = "身份验证错误";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
var iptUser = commonData.Users.First(u => u.GID == custAuth.USERID);
var headData = Newtonsoft.Json.JsonConvert.DeserializeObject<OP_SEAE_VGM>(mdata);
var ctnDataList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<OP_SEAE_VGM_CTN>>(ctndata);
var dbHeadData = vgmData.Vgms.FirstOrDefault(x => x.MBLNO == headData.MBLNO);
#region 2022-5-13最新逻辑校验
if (optype == "9") //新增
{
if (dbHeadData != null && (dbHeadData.SENDSTATUS == "已发送" || dbHeadData.LuRuRenId != uid)) //已存在相同单号,且已发送;或者录入人不是本次提交人
{
resp.Success = false;
resp.Message = $"提单号{headData.MBLNO}已存在,录入公司:{iptUser.COMNAME},录入人:{iptUser.SHOWNAME}";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
}
else if (optype == "5" || optype == "1") //修改和删除
{
if (dbHeadData == null || dbHeadData.SENDSTATUS == "已录入")
{
resp.Success = false;
resp.Message = $"未找到发送记录,类型请选择新增";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
else if (dbHeadData != null && dbHeadData.LuRuRenId != uid)
{
resp.Success = false;
resp.Message = $"非该用户所属业务,不能修改或删除!";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
}
else
{
resp.Success = false;
resp.Message = "参数有误";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
#endregion
#region 根据船公司校验ORDERNO和VGMCLOSETIME两个字段
if ((headData.CARRIER == "HLC" || headData.CARRIER == "WHL") && string.IsNullOrEmpty(headData.ORDERNO))
{
resp.Success = false;
resp.Message = "订舱编号必填,请填写!";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
if ((headData.CARRIER == "MSK" || headData.CARRIER == "HMM"))
{
if (!headData.VGMCLOSETIME.HasValue)
{
resp.Success = false;
resp.Message = "VGM截止日期必填请填写";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
else if (headData.VGMCLOSETIME.Value < DateTime.Today)
{
resp.Success = false;
resp.Message = "VGM截止日期不能小于当天请检查";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
}
#endregion
#region 原有箱信息校验重写
//校验箱封号重复
var repeatCNTRNO = ctnDataList.GroupBy(x => x.CNTRNO).Select(x => new
{
CNTRNO = x.Key,
COUNT = x.Count()
}).Where(x => x.COUNT > 1).Count();
if (repeatCNTRNO > 0)
{
resp.Success = false;
resp.Message = "箱号重复";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
var repeatSEALNO = ctnDataList.GroupBy(x => x.SEALNO).Select(x => new
{
SEALNO = x.Key,
COUNT = x.Count()
}).Where(x => x.COUNT > 1).Count();
if (repeatSEALNO > 0)
{
resp.Success = false;
resp.Message = "封号重复";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
//箱号格式校验
var errCountCNTRNO = ctnDataList.Where(x => x.CNTRNO.Length != 11
|| !System.Text.RegularExpressions.Regex.IsMatch(x.CNTRNO.Substring(0, 4), @"(?i)^[a-zA-Z]+$")
|| !System.Text.RegularExpressions.Regex.IsMatch(x.CNTRNO.Substring(4, x.CNTRNO.Length - 4), @"(?i)^[0-9]+$")
|| !Areas.MvcShipping.Comm.CommHelper.VerifyContainerCode(x.CNTRNO))
.Count();
if (errCountCNTRNO > 0)
{
resp.Success = false;
resp.Message = "箱号格式错误!";
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
#endregion
if (dbHeadData != null)
{
log.Debug($"发送vgm{headData.MBLNO}提单号存在");
headData.MFNO = dbHeadData.MFNO;
headData.SENDSTATUS = dbHeadData.SENDSTATUS;
Common.Helper.ModelCopyHelper.CopyModel(headData, dbHeadData);
headData = dbHeadData;
vgmData.Ctns.RemoveRange(vgmData.Ctns.Where(cc => cc.MFNO == dbHeadData.MFNO));
}
else
{
log.Debug($"发送vgm{headData.MBLNO}提单号不存在");
headData.SENDSTATUS = "已录入";
headData.MFNO = Guid.NewGuid().ToString();
vgmData.Vgms.Add(headData);
}
vgmData.Ctns.AddRange(ctnDataList);
//箱型转换
foreach (var item in ctnDataList)
{
item.ctn_id = Guid.NewGuid().ToString();
item.MFNO = headData.MFNO;
item.CTNALL = MsOpSeaeEdiVGMDAL.GetCTNALLWithEDICODE(item.CTNALL);
//以下赋值参考【MsOpSeaeEdiVGMDAL】的【SaveDetailForInterface】方法
item.ChengZhongFangShi = "累加";
item.ZhongKongBiaoShi = 5;
item.ChengZhongZhongLiang = item.ChengZhongZhongLiang.HasValue ? item.ChengZhongZhongLiang.Value : 0;
item.SIZE = item.CTNALL.ToString().Trim().Substring(0, 2);
if (item.CTNALL.Length == 5)
{
item.CTN = item.CTNALL.ToString().Trim().Substring(3);
}
else
{
item.CTN = item.CTNALL.ToString().Trim().Substring(2);
}
int TEU = item.CTNNUM;
int iTEU = int.Parse(item.CTNALL.ToString().Trim().Substring(0, 1));
if (iTEU == 4)
{
TEU = TEU * 2;
}
item.TEU = TEU;
}
//箱型箱量字符串
var groupListCNTRNO = ctnDataList.GroupBy(x => x.CTNALL).Select(x => new
{
CTNALL = x.Key,
COUNT = x.Sum(cc => cc.CTNNUM)
}).ToList();
headData.JiZhuangXiang = string.Join(",", groupListCNTRNO.Select(x => $"{x.CTNALL}*{x.COUNT}"));
//赋值第一个箱子的包装类型
if (string.IsNullOrEmpty(headData.BaoZhuang) && ctnDataList.Count > 0)
{
headData.BaoZhuang = ctnDataList[0].KINDPKGS;
}
//更新船公司信息
headData.CARRIER = MsOpSeaeEdiVGMDAL.GetCGSWithEDICODE(headData.CARRIER);
headData.LuRuRenId = uid;
headData.LuRuRen = MsOpSeaeEdiVGMDAL.GetShowNameWithGID(uid);
headData.LuRuRiQi = DateTime.Now;
headData.CARRIER = MsBaseInfoDAL.DelPortCn(headData.CARRIER);
headData.ChuanMing = MsBaseInfoDAL.DelPortCn(headData.ChuanMing);
headData.HangCi = MsBaseInfoDAL.DelPortCn(headData.HangCi);
headData.ZhuangHuoGang = MsBaseInfoDAL.DelPortCn(headData.ZhuangHuoGang);
headData.XieHuoGang = MsBaseInfoDAL.DelPortCn(headData.XieHuoGang);
headData.MuDiDi = MsBaseInfoDAL.DelPortCn(headData.MuDiDi);
headData.ShouHuoDi = MsBaseInfoDAL.DelPortCn(headData.ShouHuoDi);
try
{
vgmData.SaveChanges();
}
catch (Exception ex)
{
resp.Success = false;
resp.Message = $"发送失败,错误信息:{ex.Message}";
var exp = ex;
while (exp != null)
{
log.Error(exp.Message);
log.Error(exp.StackTrace);
exp = exp.InnerException;
}
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
string path = HttpContext.Current.Server.MapPath("/VGMFile/");
string filepath = "";
//调用发送
string msg = vgmptDAL.writeAndSendVgmXml("'" + headData.MFNO + "'", uid, optype, path, out filepath);
if (msg.Contains("成功"))
{
headData.SENDSTATUS = "已发送";
vgmData.SaveChanges();
resp.Success = true;
resp.Message = msg;
}
else
{
//调用发送失败后删除数据,用户可修改后再次发送
vgmData.Vgms.Remove(headData);
vgmData.Ctns.RemoveRange(ctnDataList);
vgmData.SaveChanges();
resp.Success = false;
resp.Message = msg;
}
return Newtonsoft.Json.JsonConvert.SerializeObject(resp);
}
public string GetVGMSTATUS(HttpContext context)
{
string uid = context.Request["uid"];
string skey = context.Request["skey"];
string mblnos = context.Request["mblno"];
if (uid == null)
{
return "参数有误!";
}
if (!MsOpSeaeEdiVGMDAL.CheckAuth(uid, skey))
{
return "身份验证错误!";
}
List<VGMStatusModel> list = MsOpSeaeEdiVGMDAL.GetVGMSTATUS(mblnos);
var jsonRespose = new JSONRSB { Success = true, Data = list };
return JsonConvert.Serialize(jsonRespose);
}
public static bool IsValid()
{
return true;
HttpContext context = HttpContext.Current;
if (context.Request.Browser.Crawler) return false;
string key = context.Request.UserHostAddress;
int hit = (Int32)(context.Cache[key] ?? 0);
if (hit > TIMES) return false;
else hit++;
if (hit == 1)
{
//context.Cache.Add(key, hit, null, DateTime.Now.AddMinutes(DURATION), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
context.Cache.Insert(key, hit, null, DateTime.Now.AddMinutes(DURATION), TimeSpan.Zero);
}
else
{
context.Cache[key] = hit;
}
return true;
}
}
}