|
|
|
|
using DSWeb.Common.DB;
|
|
|
|
|
using DSWeb.Common.DbContexts;
|
|
|
|
|
using DSWeb.Common.DbContexts.Model;
|
|
|
|
|
using DSWeb.DLL.SendEdiToYard;
|
|
|
|
|
using log4net;
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
|
using Quartz;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using JsonConvert = Newtonsoft.Json.JsonConvert;
|
|
|
|
|
|
|
|
|
|
namespace DSWeb.Job.SendEdiToYard
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 读取主单状态
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class ReadMainStatusJob : IJob
|
|
|
|
|
{
|
|
|
|
|
private ILog logger = LogManager.GetLogger("SendEdiToYardJob");
|
|
|
|
|
|
|
|
|
|
public static List<string> WORKINGMBLNOList=new List<string>();
|
|
|
|
|
|
|
|
|
|
public void Execute(IJobExecutionContext context)
|
|
|
|
|
{
|
|
|
|
|
//logger.Debug("运行测试");
|
|
|
|
|
////业务逻辑
|
|
|
|
|
//if (DateTime.Now > Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 06:00:00") && DateTime.Now < Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 23:00:00"))
|
|
|
|
|
//{
|
|
|
|
|
// logger.Debug("调取回执");
|
|
|
|
|
// UpdSendState();
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
if (WORKINGMBLNOList == null) {
|
|
|
|
|
|
|
|
|
|
WORKINGMBLNOList = new List<string>();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReadDelayZhuDan();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void ReadDelayZhuDan() {
|
|
|
|
|
//首先查找延迟读取表 WLXX_MBLNO_DELAY 的所有 读取时间晚于当前时间的记录
|
|
|
|
|
|
|
|
|
|
EdiDataContext edc = new EdiDataContext();
|
|
|
|
|
|
|
|
|
|
//var delaylist = edc.WLXX_MBLNO_DELAY.Where(x => x.READTIME <= DateTime.Now).ToList();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var readhead = WLXX.获取待读主单(edc);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
//如果在处理中 跳过
|
|
|
|
|
if (WORKINGMBLNOList.Exists(x => x == readhead.MBLNO))
|
|
|
|
|
{
|
|
|
|
|
EdiDataContext.SaveLog("舱单直发", "处理中跳过", readhead.MBLNO + ";" + readhead.READTIME, "");
|
|
|
|
|
//WLXX.删除待读主单(readhead.MFNO);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//EdiDataContext.SaveLog("舱单直发", "处理中_增加", readhead.MBLNO + ";" + readhead.READTIME, "");
|
|
|
|
|
WORKINGMBLNOList.Add(readhead.MBLNO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var _r = new Result_md();
|
|
|
|
|
|
|
|
|
|
//如果主单信息已存在 直接将分单设为可发送
|
|
|
|
|
if (DoSend.主单信息已存在(readhead))
|
|
|
|
|
{
|
|
|
|
|
if (!DoSend.存在可发分单(readhead))
|
|
|
|
|
{
|
|
|
|
|
//无待发分单
|
|
|
|
|
_r = WLXX.ReadWLXX(readhead.MBLNO, readhead.MFNO, "临时读取");
|
|
|
|
|
|
|
|
|
|
if (_r.Success == true)
|
|
|
|
|
{
|
|
|
|
|
WLXX.删除待读主单(readhead.MFNO);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DelayRead(readhead, edc);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if (!DoSend.分单已直发(readhead))
|
|
|
|
|
{
|
|
|
|
|
DelayRead_Success(readhead, edc, 3);
|
|
|
|
|
DoSend.待发分单列表设为可发送(readhead);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
WLXX.删除待读主单(readhead.MFNO);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//20210310 改为如果有待发分单的话 调用读回执加主单信息的接口;如无待发分单 仍然调用读取回执接口
|
|
|
|
|
|
|
|
|
|
if (DoSend.待发分单存在(readhead))
|
|
|
|
|
{
|
|
|
|
|
//有待发分单 则需要读取主单信息
|
|
|
|
|
_r = WLXX.Read_StatusZDXX(readhead.MBLNO, readhead.USERID, readhead.MFNO);
|
|
|
|
|
|
|
|
|
|
if (_r.Success == true)
|
|
|
|
|
{
|
|
|
|
|
//目前逻辑是 如果分单发送成功 待读主单待发分单都会结束
|
|
|
|
|
|
|
|
|
|
DelayRead_Success(readhead, edc);
|
|
|
|
|
DoSend.待发分单列表设为可发送(readhead);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DelayRead(readhead, edc);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//无待发分单
|
|
|
|
|
_r = WLXX.ReadWLXX(readhead.MBLNO, readhead.MFNO, "临时读取");
|
|
|
|
|
|
|
|
|
|
if (_r.Success == true)
|
|
|
|
|
{
|
|
|
|
|
WLXX.删除待读主单(readhead.MFNO);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DelayRead(readhead, edc);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e) {
|
|
|
|
|
var msg = e.Message;
|
|
|
|
|
if (e.InnerException != null && e.Message.IndexOf("inner exception") > 0) {
|
|
|
|
|
msg = e.InnerException.Message;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EdiDataContext.SaveLog("舱单直发", "主进程错误", "【"+readhead.MBLNO + ";" + readhead.READTIME+"】"+ msg, "");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//EdiDataContext.SaveLog("舱单直发", "处理中_去除", readhead.MBLNO + ";" + readhead.READTIME, "");
|
|
|
|
|
WORKINGMBLNOList.Remove(readhead.MBLNO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void DelayRead(WLXX_MBLNO_DELAY_md readhead,EdiDataContext edc, int delaytime=3)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
readhead.DelayNextTime(edc, delaytime);
|
|
|
|
|
|
|
|
|
|
if (readhead.isOutoftime())
|
|
|
|
|
{
|
|
|
|
|
OutofTime(readhead);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void DelayRead_Success(WLXX_MBLNO_DELAY_md readhead, EdiDataContext edc, int delaytime = 3)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
//readhead.DelayNextTime_Success(edc, delaytime);
|
|
|
|
|
readhead.DelayNextTime(edc, delaytime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void OutofTime(WLXX_MBLNO_DELAY_md headdata) {
|
|
|
|
|
|
|
|
|
|
//DoSend.直发主单设为发送异常(headdata, "未能获得舱单回执");
|
|
|
|
|
|
|
|
|
|
WLXX.删除待读主单(headdata.MFNO);
|
|
|
|
|
|
|
|
|
|
DoSend.待发分单删除(headdata.MFNO);
|
|
|
|
|
|
|
|
|
|
DoSend.待发分单设为超时(headdata.MFNO);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 直发分单
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class SendFendanJob : IJob
|
|
|
|
|
{
|
|
|
|
|
private ILog logger = LogManager.GetLogger("SendFendanJob");
|
|
|
|
|
|
|
|
|
|
public static List<string> WORKINGMBLNOList = new List<string>();
|
|
|
|
|
public void Execute(IJobExecutionContext context)
|
|
|
|
|
{
|
|
|
|
|
if (WORKINGMBLNOList == null)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
WORKINGMBLNOList = new List<string>();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SendFendan();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void SendFendan()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EdiDataContext edc = new EdiDataContext();
|
|
|
|
|
|
|
|
|
|
var fendanlist = edc.OP_SEAE_EDI_FENDANSEND.Where(x => x.CANSEND==true ).ToList();
|
|
|
|
|
|
|
|
|
|
if (fendanlist != null && fendanlist.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
var fendanhead = fendanlist[0];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//如果在处理中 跳过
|
|
|
|
|
if (WORKINGMBLNOList.Exists(x => x == fendanhead.MBLNO))
|
|
|
|
|
{
|
|
|
|
|
EdiDataContext.SaveLog("舱单直发", "处理中跳过", "待发分单"+fendanhead.MBLNO);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
EdiDataContext.SaveLog("舱单直发", "处理中增加", "待发分单" + fendanhead.MBLNO);
|
|
|
|
|
WORKINGMBLNOList.Add(fendanhead.MBLNO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//20210827 改为开始读取时 先将cansend置为0
|
|
|
|
|
//如果后期需要的话在后期置为1
|
|
|
|
|
DoSend.待发分单删除(fendanhead.BSNO);
|
|
|
|
|
|
|
|
|
|
//20210824 定时任务发送待发分单时 只发送“发送中”状态的分单
|
|
|
|
|
//防止出现【发送时选择的主分单同时选择,但不是全部分单,然后延迟发送分单时,将之前发送时未选择的分单也发出】的情况。
|
|
|
|
|
var billList = edc.Edis.Where(x=>x.BSNO== fendanhead.BSNO && (x.EDISTATUS=="发送中"|| x.EDISTATUS == "发送超时" || x.EDISTATUS == "发送失败")).ToList();
|
|
|
|
|
|
|
|
|
|
if (billList.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
DoSend.待发分单删除(fendanhead.BSNO);
|
|
|
|
|
WLXX.删除待读主单(fendanhead.BSNO);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//20210602 增加判断 如果读回 则比对
|
|
|
|
|
//1【读回的主单信息中的件数 重量删除标志】
|
|
|
|
|
|
|
|
|
|
var 本地分单与读回主单一致 = CheckData.ZDXXChanged(fendanhead.BSNO);
|
|
|
|
|
|
|
|
|
|
if (!本地分单与读回主单一致.Success)
|
|
|
|
|
{
|
|
|
|
|
ChangeInfo.SetEdiStatus(billList, "新增", fendanhead.SHOWNAME, fendanhead.DCARRIER, EdiSendStatus.Fail, 本地分单与读回主单一致.Message);
|
|
|
|
|
WLXX.删除待读主单(fendanhead.BSNO);
|
|
|
|
|
DoSend.待发分单删除(fendanhead.BSNO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//var mfnolist = billList.Select(s => s.MFNO).ToList();
|
|
|
|
|
|
|
|
|
|
var beizhu = "";
|
|
|
|
|
|
|
|
|
|
var fendanFeeList = ChangeInfo.MakeChangeList(edc, fendanhead.SHOWNAME, fendanhead.COMPANYNAME, fendanhead.COMPANYNAME, billList, fendanhead.USERID, 0,ref beizhu, true);
|
|
|
|
|
|
|
|
|
|
var 价格表内的type = ChangeInfo.getCustFeeType(ChangeInfo.getSendType("新增"), true);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
fendanhead.FILENAME = DoSend.MakeFenDanFile_WithFileName(billList, 9, fendanhead.SENDCODE, fendanhead.FILENAME, fendanhead.USERID);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e) {
|
|
|
|
|
EdiDataContext.SaveLog("舱单直发", "分单文件错误", e.Message+";;"+ fendanhead.SENDCODE+";;"+ fendanhead.FILENAME, fendanhead.USERID);
|
|
|
|
|
|
|
|
|
|
ChangeInfo.SetEdiStatus(billList, "新增", fendanhead.SHOWNAME, fendanhead.DCARRIER, EdiSendStatus.Unusual, "自动发送的分单文件生成错误,可能分单信息发生变动,请尝试手工重新发送。");
|
|
|
|
|
DoSend.待发分单删除(fendanhead.BSNO);
|
|
|
|
|
WLXX.删除待读主单(fendanhead.BSNO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DoSend.待发分单删除(fendanhead.BSNO);
|
|
|
|
|
var _dosend = new DoSend();
|
|
|
|
|
|
|
|
|
|
var _r = _dosend.SendFendanDirect(billList, fendanhead.DCARRIER, fendanhead.FILENAME, fendanhead.USERID, fendanhead.SHOWNAME, "新增");
|
|
|
|
|
|
|
|
|
|
if (_r.Success)
|
|
|
|
|
{
|
|
|
|
|
WLXX.删除待读主单(fendanhead.BSNO);
|
|
|
|
|
|
|
|
|
|
var pricehead = edc.Cust_Price.FirstOrDefault(x => x.COMNAME == fendanhead.COMPANYNAME && x.SENDTYPE == 价格表内的type);
|
|
|
|
|
|
|
|
|
|
//var balance = edc.Cust_Balance.FirstOrDefault(x => x.COMNAME == fendanhead.COMPANYNAME);
|
|
|
|
|
|
|
|
|
|
var contentStr = _r.Data.ToString();
|
|
|
|
|
foreach (var item in billList)
|
|
|
|
|
{
|
|
|
|
|
//var hblnoSuccess =DoSend.getSuccessStr(item.HBLNO);
|
|
|
|
|
|
|
|
|
|
//if (contentStr.Contains(hblnoSuccess))
|
|
|
|
|
//{
|
|
|
|
|
var CustFee = fendanFeeList.First(x => x.HBLNO == item.HBLNO);
|
|
|
|
|
ChangeInfo.扣费(edc, CustFee, ref pricehead, fendanhead.COMPANYNAME);
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
edc.SaveChanges();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (_r.Message.Contains("提交接口错误"))
|
|
|
|
|
{
|
|
|
|
|
/*[COAU7230499780]{"stats": "0", "message": "提交接口错误: HTTPConnectionPool(host='119.29.114.124', port=50549): Max retries exceeded with rl: http://56.qdcdc.com/cnm/Index.aspx (Cased by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection withot response',)))"} */
|
|
|
|
|
DoSend.待发分单重置(fendanhead.BSNO);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
WLXX.删除待读主单(fendanhead.BSNO);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
EdiDataContext.SaveLog("舱单直发", "处理中移除1", "待发分单" + fendanhead.MBLNO);
|
|
|
|
|
WORKINGMBLNOList.Remove(fendanhead.MBLNO);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e) {
|
|
|
|
|
ChangeInfo.SetEdiStatus(billList, "新增", fendanhead.SHOWNAME, fendanhead.DCARRIER, EdiSendStatus.Unusual,e.Message);
|
|
|
|
|
|
|
|
|
|
DoSend.待发分单删除(fendanhead.BSNO);
|
|
|
|
|
EdiDataContext.SaveLog("舱单直发", "处理中移除2", "待发分单" + fendanhead.MBLNO);
|
|
|
|
|
WORKINGMBLNOList.Remove(fendanhead.MBLNO);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class JobHelper
|
|
|
|
|
{
|
|
|
|
|
//public static string DoPost(string url, string json, int timeout = 10000)
|
|
|
|
|
//{
|
|
|
|
|
// string responseString = "";//post返回的结果
|
|
|
|
|
// ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, err) => { return true; };
|
|
|
|
|
// ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
|
|
|
|
|
// HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
|
|
|
|
|
// req.Method = "POST";
|
|
|
|
|
// req.Timeout = timeout;
|
|
|
|
|
// req.Headers.Add("Accept-Encoding", "gzip, deflate");
|
|
|
|
|
|
|
|
|
|
// if (!string.IsNullOrWhiteSpace(json))
|
|
|
|
|
// {
|
|
|
|
|
// byte[] postBytes = Encoding.UTF8.GetBytes(json);
|
|
|
|
|
// req.ContentType = "application/json; charset=utf-8";
|
|
|
|
|
// req.ContentLength = Encoding.UTF8.GetByteCount(json);
|
|
|
|
|
// Stream stream = req.GetRequestStream();
|
|
|
|
|
// stream.Write(postBytes, 0, postBytes.Length);
|
|
|
|
|
// stream.Close();
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// req.ContentLength = 0;
|
|
|
|
|
// }
|
|
|
|
|
// var response = req.GetResponse();
|
|
|
|
|
// responseString = GetResponseBody((HttpWebResponse)response);
|
|
|
|
|
// return responseString;
|
|
|
|
|
//}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|