Commit ef29c18a by Neo Turing

init

parents
################################################################################
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
################################################################################
/.vs
/Src/bin/Debug
/Src/obj/Debug
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Third.Bestseller
{
internal static class Configs
{
public const string _pdfUrl = "http://bjhyfi.lims.kivii.org";
//正式环境
public const string _defaultUrl = "http://scm.bestseller.com.cn";
public const string _token = "7395A941BBF7B7DC22A3BC08E3A9FC93";
public const string _secret = "$2y$13$x2Pm3jqkrVam2oANsfpa1eNEKfaNchyBFrROyii1hq7Ng.2xj55.a";
public const string _ownerName = "绫致时装(天津)有限公司";
public const string _ownerKvid = "0A02263D-50C9-43B5-B27A-E732FD6D8BDE";
public const string RouteCloseWts = "/thirdapi/wtsapi/coord-wts/close-wts";
public const string RouteUpdateWtsReport = "/thirdapi/wtsapi/coord-wts/update-wts-report";
public const string RouteUpdateWtsResult = "/thirdapi/wtsapi/coord-wts/update-wts-result";
public const string RouteRejectWts = "/thirdapi/wtsapi/coord-wts/reject-wts";
public const string RouteAcceptWts = "/thirdapi/wtsapi/coord-wts/accept-wts";
public const string RouteGetWtsList = "/thirdapi/wtsapi/coord-wts/get-wts-list";
public const string RouteGetWtsData = "/thirdapi/wtsapi/coord-wts/get-wts-data";
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Third.Bestseller.Entities
{
[Api(Description = "鄂尔多斯订单")]
public class BestsellerOrder : BestsellerOrderBase
{
#region 实体
/// <summary>
/// 委托书编号
/// </summary>
[ApiMember(Description = "委托书编号")]
public string ORDER_NO { get; set; }
/// <summary>
/// 客户单据编号
/// </summary>
[ApiMember(Description = "客户单据编号")]
public string CUSTOMER_ORDER_NO { get; set; }
/// <summary>
/// 品牌方公司简称
/// </summary>
[ApiMember(Description = "品牌方公司简称")]
public string C_COMPANY_NAME { get; set; }
/// <summary>
/// 品牌方公司全称
/// </summary>
[ApiMember(Description = "品牌方公司全称")]
public string C_COMPANY_DESC { get; set; }
/// <summary>
/// 供应商简称
/// </summary>
[ApiMember(Description = "供应商简称")]
public string RELATED_VENDOR_NAME { get; set; }
/// <summary>
/// 供应商全称
/// </summary>
[ApiMember(Description = "供应商全称")]
public string RELATED_VENDOR_DESC { get; set; }
[ApiMember(Description = "供应商ID")]
public string RELATED_VENDOR_ID { get; set; }
/// <summary>
/// 申请单位名称
/// </summary>
[ApiMember(Description = "申请单位名称")]
public string APPLY_ORG_NAME { get; set; }
/// <summary>
/// 申请单位地址
/// </summary>
[ApiMember(Description = "申请单位地址")]
public string APPLY_ORG_ADDRESS { get; set; }
/// <summary>
/// 申请单位联系人
/// </summary>
[ApiMember(Description = "申请单位联系人")]
public string CONTACT_PERSON { get; set; }
/// <summary>
/// 申请单位联系电话
/// </summary>
[ApiMember(Description = "申请单位联系电话")]
public string CONTACT_PHONE { get; set; }
/// <summary>
/// 申请单位邮箱
/// </summary>
[ApiMember(Description = "申请单位邮箱")]
public DateTime CONTACT_EMAIL { get; set; }
/// <summary>
/// 付款单位名称
/// </summary>
[ApiMember(Description = "付款单位名称")]
public DateTime PAYER_ORG_NAME { get; set; }
/// <summary>
/// 付款单位地址
/// </summary>
[ApiMember(Description = "付款单位地址")]
public string PAYER_ORG_ADDRESS { get; set; }
/// <summary>
/// 付款联系人
/// </summary>
[ApiMember(Description = "付款联系人")]
public string PAYER_CONTACT_PERSON { get; set; }
/// <summary>
/// 付款联系人电话
/// </summary>
[ApiMember(Description = "付款联系人电话")]
public string PAYER_CONTACT_PHONE { get; set; }
/// <summary>
/// 付款联系人邮箱
/// </summary>
[ApiMember(Description = "付款联系人邮箱")]
public string PAYER_CONTACT_EMAIL { get; set; }
/// <summary>
/// 委托单位地址
/// </summary>
[ApiMember(Description = "委托单位地址")]
public string COMPANY_ADDRESS { get; set; }
/// <summary>
/// 品牌
/// </summary>
[ApiMember(Description = "品牌")]
public string BRAND_DISPLAY { get; set; }
/// <summary>
/// 送检类型(首次检测, 重检)
/// </summary>
[ApiMember(Description = "送检类型(首次检测, 重检)")]
public string IS_RECHECK_DISPLAY { get; set; }
/// <summary>
/// 样品类型
/// </summary>
[ApiMember(Description = "样品类型")]
public string THIRDPARTY_TESTING_TESTPART_DISPLAY { get; set; }
/// <summary>
/// 样品等级
/// </summary>
[ApiMember(Description = "样品等级")]
public string SAMPLE_GRADE_DISPLAY { get; set; }
/// <summary>
/// 成品款号
/// </summary>
[ApiMember(Description = "成品款号")]
public string PRD_CODE { get; set; }
/// <summary>
/// 成品款名
/// </summary>
[ApiMember(Description = "成品款名")]
public string PRD_NAME { get; set; }
/// <summary>
/// 成品颜色
/// </summary>
[ApiMember(Description = "成品颜色")]
public string PRD_F1_DISPLAY { get; set; }
/// <summary>
/// 料号
/// </summary>
[ApiMember(Description = "料号")]
public string MAT_CODE { get; set; }
/// <summary>
/// 物料名称
/// </summary>
[ApiMember(Description = "物料名称")]
public string MAT_NAME { get; set; }
/// <summary>
/// 物料颜色
/// </summary>
[ApiMember(Description = "物料颜色")]
public string MAT_F1_DISPLAY { get; set; }
/// <summary>
/// 样品描述
/// </summary>
[ApiMember(Description = "样品描述")]
public string SAMPLE_NAME { get; set; }
/// <summary>
/// 品牌商标
/// </summary>
[ApiMember(Description = "年度")]
public string YEAR_DISPLAY { get; set; }
/// <summary>
/// 样品阶段
/// </summary>
[ApiMember(Description = "季节")]
public string SEASONS_DISPLAY { get; set; }
/// <summary>
/// 安全技术类别
/// </summary>
[ApiMember(Description = "安全技术类别")]
public string CHECK_LEVEL_DISPLAY { get; set; }
/// <summary>
/// 执行标准
/// </summary>
[ApiMember(Description = "执行标准")]
public string CHECK_STANDARD_DISPLAY { get; set; }
/// <summary>
/// 测试周期(常规,加急, 快反加急)
/// </summary>
[ApiMember(Description = "测试周期(常规,加急, 快反加急)")]
public string TESTING_CYCLE { get; set; }
/// <summary>
/// 原料成分
/// </summary>
[ApiMember(Description = "备注")]
public string REMARK { get; set; }
/// <summary>
/// 中文品名
/// </summary>
[ApiMember(Description = "中文品名")]
public string PRD_NAME_CN { get; set; }
/// <summary>
/// PO号
/// </summary>
[ApiMember(Description = "PO号")]
public string PO_NO { get; set; }
/// <summary>
/// 检测项信息
/// </summary>
[ApiMember(Description = "检测项信息")]
public List<BestsellerOrderDetail> ITEMS { get; set; }
/// <summary>
/// 样品信息
/// </summary>
[ApiMember(Description = "样品信息")]
public List<BestSellerOrderSample> SAMPLES { get; set; }
#endregion
}
public class BestsellerOrderDetail
{
/// <summary>
/// 检测项⽬
/// </summary>
[ApiMember(Description = "检测项⽬")]
public string ITEM_NAME { get; set; }
/// <summary>
/// 测试方法
/// </summary>
[ApiMember(Description = "测试方法")]
public string ITEM_STANDARD { get; set; }
/// <summary>
/// 检测机构检测项目唯一标识
/// </summary>
[ApiMember(Description = "检测机构检测项目唯一标识")]
public string S_CHECK_ITEM_CODE { get; set; }
}
public class BestSellerOrderSample
{
/// <summary>
/// 样品名称
/// </summary>
[ApiMember(Description = "样品名称")]
public string SAMPLE_TYPE { get; set; }
/// <summary>
/// 颜色代码
/// </summary>
[ApiMember(Description = "颜色代码")]
public string F1 { get; set; }
/// <summary>
/// 颜色描述
/// </summary>
[ApiMember(Description = "颜色描述")]
public string F1_DISPLAY { get; set; }
/// <summary>
/// 块数/件数
/// </summary>
[ApiMember(Description = "块数/件数")]
public string PIECES { get; set; }
/// <summary>
/// 样品用途
/// </summary>
[ApiMember(Description = "样品用途")]
public string USED_FOR { get; set; }
/// <summary>
/// 送料是否齐全(·1-送料齐全,0-送料不全)
/// </summary>
[ApiMember(Description = "送料是否齐全(·1-送料齐全,0-送料不全)")]
public string IS_SEND { get; set; }
}
}
using Kivii.Lims;
using Kivii.Lims.Entities;
using Kivii.Lims.Extensions;
using Kivii.Linq;
using Kivii.Text;
using Kivii.Third.Bestseller.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Third.Bestseller.Entities
{
public class BestsellerOrderBase : IEntityIsThirdReportOrder
{
private JsonServiceClient _client = null;
public Report OnInstanceThirdReport(Guid ThirdReportOrderKvid)
{
return new Report();
}
public object OnPullThirdReport()
{
//throw new Exception("请使用三六一专用拉取订单接口!");
#region 设置缓存1分钟内不能连续请求
var cache = KiviiContext.GetCacheClient();
var cacheKey = KiviiContext.GetUrnKey($"{typeof(BestsellerOrder).FullName}.PullOrder:LockedOneMinute");
var cacheValue = cache.Get<string>(cacheKey);
if (!cacheValue.IsNullOrEmpty())
{
throw new Exception(cacheValue);
}
#endregion
var rtns = new RestfulQueryResponse<ThirdReportOrder>();
var client = new JsonHttpClient(Configs._defaultUrl);
var conn = KiviiContext.GetOpenedDbConnection<ThirdReportOrder>();
DateTime maxTranslateTime = conn.Scalar<ThirdReportOrder, DateTime>(o => Sql.Max(o.OperateTime), p => p.ThirdType == typeof(BestsellerOrder).FullName);
//DateTime maxTranslateTime = conn.Scalar<ThirdReportOrder, DateTime>(o => Sql.Max(o.OperateTime));
var response = client.PullOrders(Configs._token, Configs._secret, maxTranslateTime);
cache.Set(cacheKey, "一分钟内不可多次查询!", TimeSpan.FromMinutes(1));
(response.code != 200).ThrowIfTrue(response.message);
rtns.Results = new List<ThirdReportOrder>();
if (response.data == null) return rtns;
if (response.data.results.IsNullOrEmpty()) return rtns;
var results = response.data.results.AcceptThirdContractOrder(Guid.Parse(Configs._ownerKvid), Configs._ownerName, conn);
foreach (var item in results)
{
client.AcceptOrderConfirm(Configs._token, Configs._secret, item.SerialNumber);
}
rtns.Results.AddRange(results);
rtns.Total = rtns.Results.Count;
return rtns;
}
public bool OnRejectThirdReport(Guid ThirdReportOrderKvid)
{
return false;
}
public bool OnUploadThirdReport(Guid ThirdReportOrderKvid)
{
if (ThirdReportOrderKvid == Guid.Empty) return false;
var conn = KiviiContext.GetOpenedDbConnection<ThirdReportOrder>();
var third = conn.SingleById<ThirdReportOrder>(ThirdReportOrderKvid);
if (third == null) return false;
if (third.ThirdType != typeof(BestsellerOrder).FullName) return false;
//订单还未受理的 则自动去找相关报告进行关联
if (!third.IsAccepted) return false;// third.AutoLinkReports();
if (third.IsUploaded) return true;
var thirdDetails = conn.Select<ThirdReportOrderDetail>(o => o.ThirdOrderKvid == third.Kvid);
if (thirdDetails.IsNullOrEmpty()) return false;
var reports = conn.SelectByIds<Report>(thirdDetails.ConvertAll(o => o.ReportKvid));
if (reports.IsNullOrEmpty()) return false;
if (reports.Exists(o => o.Status != (int)ReportStatusType.ReportCollected)) return false;
var client = new JsonHttpClient(Configs._defaultUrl);
var orderResult = new OrderResult();
orderResult.ORDER_NO = third.SerialNumber;
orderResult.RESULT = "4";
orderResult.RPT_ITEMS = new List<ReportDetail>();
var orderPdfs = new List<OrderPdf>();
//针对多个报告存在不合格的项目 则回传订单整体判定为不合格
var infoJudement = true;
foreach (var thirdDetail in thirdDetails)
{
if (thirdDetail.ReportKvid == Guid.Empty) continue;
var report = reports.FirstOrDefault(o => o.Kvid == thirdDetail.ReportKvid);
if (report == null) continue;
if (report.Status != (int)ReportStatusType.ReportCollected) continue;
var queryReportItems = conn.From<ReportItem>();
queryReportItems.Where(o => o.ReportKvid == report.Kvid);
var allReportItems = conn.Select(queryReportItems);
var primaryAllReportItems = allReportItems.filterReportItem();
primaryAllReportItems.ForEach(o => o.PackageUnit = string.Empty);
var selfItems = allReportItems.Where(o => o.Type == ReportItemType.SampleSelf).ToList();
var partItems = allReportItems.Where(o => o.Type == ReportItemType.SamplePart).ToList();
//合并色号和部位
if (!selfItems.IsNullOrEmpty())
{
foreach (var item in selfItems)
{
var primarys = primaryAllReportItems.Where(o => o.RootKvid == item.RootKvid).ToList();
foreach (var primary in primarys)
{
primary.PackageUnit = string.Empty;
primary.PackageUnit = item.Title;
}
}
}
if (!partItems.IsNullOrEmpty())
{
foreach (var item in partItems)
{
var primarys = primaryAllReportItems.Where(o => o.ParentKvid == item.Kvid).ToList();
foreach (var primary in primarys)
{
primary.TitlePart = string.Empty;
primary.TitlePart = item.Title;
}
}
}
if (report.TestJudgement == "合格") orderResult.RESULT = "1";
if (report.TestJudgement == "不合格")
{
infoJudement = false;
orderResult.RESULT = "2";
}
#region 报告PDF
var code = report.Kvid.ToString().Substring(0, 4);
var internalCode = $"{code}/{report.ReportId}";
var orderPdf = new OrderPdf();
orderPdf.RPT_NO = report.ReportId;
orderPdf.URL = $"{Configs._pdfUrl}/Lims/Report/{internalCode}";
orderPdfs.Add(orderPdf);
#endregion
#region 报告及报告项目
var rptItem = new ReportDetail();
rptItem.RPT_NO = report.ReportId;
rptItem.RPT_RESULT = "4";
if (report.TestJudgement == "合格") rptItem.RPT_RESULT = "1";
if (report.TestJudgement == "不合格")
{
infoJudement = false;
rptItem.RPT_RESULT = "2";
}
rptItem.ITEMS = new List<Detail>();
foreach (var item in primaryAllReportItems)
{
var nodes = allReportItems.Where(o => o.ParentKvid == item.Kvid).ToList();
var detail = new Detail();
detail.F1_DISPLAY = item.PackageUnit;
detail.CHECK_PART_DISPLAY = item.TitlePart;
detail.ITEM_NAME = item.Title;
detail.ITEM_STANDARD = item.DetectionCodeActual;
detail.RESULT = "4";
if (item.Judgement == "合格") detail.RESULT = "1";
if (item.Judgement == "不合格")
{
infoJudement = false;
detail.RESULT = "2";
}
List<string> qualifiedValue = new List<string>();
qualifiedValue.Add(item.DetectionValueQualified);
List<string> testValue = new List<string>();
testValue.Add(item.TestValue);
if (!nodes.IsNullOrEmpty())
{
foreach (var node in nodes)
{
qualifiedValue.Add($"{node.Title} {node.DetectionValueQualified}");
testValue.Add($"{node.Title} {node.TestValue}");
}
}
qualifiedValue.RemoveAll(o => o.IsNullOrEmpty());
testValue.RemoveAll(o => o.IsNullOrEmpty());
detail.ITEM_SPEC = string.Join(",", qualifiedValue);
detail.RESULT_REMARK = string.Join(",", testValue);
rptItem.ITEMS.Add(detail);
}
orderResult.RPT_ITEMS.Add(rptItem);
#endregion
}
//针对多个报告存在不合格的项目 则回传订单整体判定为不合格
if (!infoJudement) orderResult.RESULT = "2";
var respResult = client.UploadOrderResult(Configs._token, Configs._secret, orderResult);
if (respResult.code == 200)
{
var respPdf = client.UploadOrderPdf(Configs._token, Configs._secret, orderResult.ORDER_NO, orderPdfs);
if (respPdf.code == 200)
{
var complete = client.UploadOrderComplete(Configs._token, Configs._secret, orderResult);
third.IsUploaded = true;
third.AddOnlyProperties(o => o.IsUploaded);
conn.UpdateOnly(third);
var log = new EntityLog<ThirdReportOrder>();
log.OwnerKvid = third.Kvid;
log.BizId = third.SerialNumber;
log.BizKvid = third.Kvid;
log.BizType = third.ThirdType;
log.Title = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
log.Remark = $"Code:{complete.code} Message:{complete.message}";
conn.Insert(log);
return true;
}
else return false;
}
else return false;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Third.Bestseller.Entities
{
[Api(Description = "报告结果推送结构")]
public class ReportDetail
{
/// <summary>
/// 报告号
/// </summary>
[ApiMember(Description = "报告号")]
public string RPT_NO { get; set; }
/// <summary>
/// 报告结论(1-合格,2-不合格,4-实测)
/// </summary>
[ApiMember(Description = "报告结论(1-合格,2-不合格,4-实测)")]
public string RPT_RESULT { get; set; }
/// <summary>
/// 检测明细
/// </summary>
[ApiMember(Description = "检测明细")]
public List<Detail> ITEMS { get; set; }
}
public class Detail
{
/// <summary>
/// 成品颜色或物料颜色
/// </summary>
[ApiMember(Description = "成品颜色或物料颜色")]
public string F1_DISPLAY { get; set; }
/// <summary>
/// 检测部位
/// </summary>
[ApiMember(Description = "检测部位")]
public string CHECK_PART_DISPLAY { get; set; }
/// <summary>
/// 检测项
/// </summary>
[ApiMember(Description = "检测项")]
public string ITEM_NAME { get; set; }
/// <summary>
/// 检测项补充信息
/// </summary>
[ApiMember(Description = "检测项补充信息")]
public string ITEM_DESC { get; set; }
/// <summary>
/// 测试方法
/// </summary>
[ApiMember(Description = "测试方法")]
public string ITEM_STANDARD { get; set; }
/// <summary>
/// 标准值及允差
/// </summary>
[ApiMember(Description = "标准值及允差")]
public string ITEM_SPEC { get; set; }
/// <summary>
/// 检测项判定(1-合格,2-不合格,4-实测)
/// </summary>
[ApiMember(Description = "检测项判定(1-合格,2-不合格,4-实测)")]
public string RESULT { get; set; }
/// <summary>
/// 检测结果
/// </summary>
[ApiMember(Description = "检测结果")]
public string RESULT_REMARK { get; set; }
/// <summary>
/// 检测机构检测项目唯一标识
/// </summary>
[ApiMember(Description = "检测机构检测项目唯一标识")]
public string S_CHECK_ITEM_CODE { get; set; }
}
public class OrderResultData
{
public OrderResult DATA { get; set; }
}
public class OrderResult
{
/// <summary>
/// 单据编号
/// </summary>
[ApiMember(Description = "单据编号")]
public string ORDER_NO { get; set; }
/// <summary>
/// 三方检测综合结论(1-合格,2-不合格,4-实测)
/// </summary>
[ApiMember(Description = "三方检测综合结论(1-合格,2-不合格,4-实测)")]
public string RESULT { get; set; }
/// <summary>
/// 检测费用
/// </summary>
[ApiMember(Description = "检测费用")]
public string CHECK_FEE { get; set; }
/// <summary>
/// 报告明细
/// </summary>
[ApiMember(Description = "报告明细")]
public List<ReportDetail> RPT_ITEMS { get; set; }
}
public class OrderPdfData
{
public List<OrderPdf> DATA { get; set; }
}
public class OrderPdf
{
/// <summary>
/// 报告号
/// </summary>
[ApiMember(Description = "报告号")]
public string RPT_NO { get; set; }
/// <summary>
/// URL地址
/// </summary>
[ApiMember(Description = "URL地址")]
public string URL { get; set; }
}
}
using Kivii.Lims.Entities;
using Kivii.Linq;
using Kivii.Text;
using Kivii.Third.Bestseller.Entities;
using Kivii.Third.Bestseller.Requests;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Third.Bestseller.Extensions
{
public static class OrderExtension
{
/// <summary>
/// 拉取订单
/// </summary>
/// <param name="baseUrl"></param>
/// <param name="apptoken"></param>
/// <returns></returns>
internal static OrderResponse PullOrders(this JsonHttpClient _client, string apptoken, string appsecret, DateTime? beginTime = null, DateTime? endTime = null, int length = 200)
{
(_client == null).ThrowIfTrue("PullOrders:请传入_client");
(apptoken.IsNullOrEmpty()).ThrowIfTrue("PullOrders:请传入apptoken");
(appsecret.IsNullOrEmpty()).ThrowIfTrue("PullOrders:请传入appsecret");
//var client = new JsonServiceClient(baseUrl);
var timeStamp = GetTimeStamp();
var appSign = $"apptoken={apptoken}&appsecret={appsecret}&timestamp={timeStamp}";
var signature = GetSign(appSign);
var getWtsListRequest = new BestsellerOrderGetWtsList();
getWtsListRequest.appToken = apptoken;
getWtsListRequest.signature = signature;
getWtsListRequest.timestamp = timeStamp;
getWtsListRequest.length = length;
if (beginTime != null && beginTime.Value != DateTime.MinValue) getWtsListRequest.beginTime = beginTime.Value;
if (endTime != null && endTime.Value != DateTime.MinValue) getWtsListRequest.endTime = endTime.Value;
var response = _client.Get(getWtsListRequest);
return response;
}
internal static OrderResponse PullOrderData(this JsonHttpClient _client, string apptoken, string appsecret, string docNo)
{
(_client == null).ThrowIfTrue("PullOrderData:请传入_client");
(apptoken.IsNullOrEmpty()).ThrowIfTrue("PullOrderData:请传入apptoken");
(appsecret.IsNullOrEmpty()).ThrowIfTrue("PullOrderData:请传入appsecret");
(docNo.IsNullOrEmpty()).ThrowIfTrue("PullOrderData:请传入docNo");
//var client = new JsonServiceClient(baseUrl);
var timeStamp = GetTimeStamp();
var appSign = $"apptoken={apptoken}&appsecret={appsecret}&timestamp={timeStamp}";
var signature = GetSign(appSign);
var getWtsListRequest = new BestsellerOrderGetData();
getWtsListRequest.appToken = apptoken;
getWtsListRequest.signature = signature;
getWtsListRequest.timestamp = timeStamp;
getWtsListRequest.docNo = docNo;
var response = _client.Get(getWtsListRequest);
return response;
}
/// <summary>
/// 确认接受三方检测单
/// </summary>
/// <param name="_client"></param>
/// <param name="apptoken"></param>
/// <param name="appsecret"></param>
/// <param name="orderNo"></param>
/// <returns></returns>
internal static OrderResponse AcceptOrderConfirm(this JsonHttpClient _client, string apptoken, string appsecret, string orderNo)
{
(_client == null).ThrowIfTrue("AcceptOrderConfirm:请传入_client");
(apptoken.IsNullOrEmpty()).ThrowIfTrue("AcceptOrderConfirm:请传入apptoken");
(appsecret.IsNullOrEmpty()).ThrowIfTrue("AcceptOrderConfirm:请传入appsecret");
(orderNo.IsNullOrEmpty()).ThrowIfTrue("AcceptOrderConfirm:请传入orderNo");
//var client = new JsonServiceClient(baseUrl);
var timeStamp = GetTimeStamp();
var appSign = $"apptoken={apptoken}&appsecret={appsecret}&timestamp={timeStamp}";
var signature = GetSign(appSign);
var paramsString = $"?appToken={apptoken}&signature={signature}&timestamp={timeStamp}";
var getWtsListRequest = new Dictionary<string, string>();
getWtsListRequest.Add("ORDER_NO", orderNo);
try
{
var response = _client.Post<OrderResponse>($"{Configs.RouteAcceptWts}{paramsString}", getWtsListRequest);
return response;
}
catch (Exception ex)
{
throw ex;
}
}
internal static OrderResponse RejectOrder(this JsonHttpClient _client, string apptoken, string appsecret, string orderNo)
{
(_client == null).ThrowIfTrue("RejectOrder:请传入_client");
(apptoken.IsNullOrEmpty()).ThrowIfTrue("RejectOrder:请传入apptoken");
(appsecret.IsNullOrEmpty()).ThrowIfTrue("RejectOrder:请传入appsecret");
(orderNo.IsNullOrEmpty()).ThrowIfTrue("RejectOrder:请传入orderNo");
//var client = new JsonServiceClient(baseUrl);
var timeStamp = GetTimeStamp();
var appSign = $"apptoken={apptoken}&appsecret={appsecret}&timestamp={timeStamp}";
var signature = GetSign(appSign);
var paramsString = $"?appToken={apptoken}&signature={signature}&timestamp={timeStamp}";
var getWtsListRequest = new Dictionary<string, string>();
getWtsListRequest.Add("ORDER_NO", orderNo);
try
{
var response = _client.Post<OrderResponse>($"{Configs.RouteRejectWts}{paramsString}", getWtsListRequest);
return response;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 创建第三方订单数据
/// </summary>
/// <param name="orders"></param>
/// <param name="conn"></param>
/// <returns></returns>
internal static List<ThirdReportOrder> AcceptThirdContractOrder(this List<BestsellerOrder> orders, Guid? ownerKvid = null, string ownerName = null, IDbConnection conn = null)
{
(orders.IsNullOrEmpty()).ThrowIfTrue("AcceptThirdContractOrder:请传入orders");
bool useTransaction = conn == null;//是否启用事务,如果外部未传入conn,启用内部事务
if (conn == null)
{
conn = KiviiContext.GetOpenedDbConnection<ThirdReportOrder>();
}
var rtns = new List<ThirdReportOrder>();
//找出最小创建日期的订单
var queryThirdReportOrders = conn.From<ThirdReportOrder>();
queryThirdReportOrders.Where(o => o.ThirdType == typeof(BestsellerOrder).FullName);
queryThirdReportOrders.Select(o => o.SerialNumber);
var thirdReportOrders = conn.Column<string>(queryThirdReportOrders);
try
{
foreach (var item in orders)
{
if (thirdReportOrders.Exists(o => o == item.ORDER_NO)) continue;
var third = new ThirdReportOrder();
third.SerialNumber = item.ORDER_NO;
third.Name = item.MAT_NAME;
third.ThirdName = item.BRAND_DISPLAY;
third.ThirdType = typeof(BestsellerOrder).FullName;
third.IsAccepted = false;
third.IsUploaded = false;
third.OperateTime = DateTime.Now;
third.ManufacturerName = item.APPLY_ORG_NAME;
third.ManufacturerContactName = item.CONTACT_PERSON;
third.SampleName = item.MAT_NAME;
third.BatchNumber = item.PRD_CODE;
third.Brand = item.BRAND_DISPLAY;
//thirdReportOrder.Content = JsonSerializer.SerializeToString(item);
third.Metadata = new Dictionary<string, string>();
foreach (var propertyInfo in item.GetType().GetProperties())
{
if (propertyInfo.Name == "ITEMS")
{
var items = item.ITEMS;
if (items.IsNullOrEmpty()) items = new List<BestsellerOrderDetail>();
third.Metadata.Add(propertyInfo.Name, JsonSerializer.SerializeToString(items));
continue;
}
if (propertyInfo.Name == "SAMPLES")
{
var items = item.SAMPLES;
if (items.IsNullOrEmpty()) items = new List<BestSellerOrderSample>();
third.Metadata.Add(propertyInfo.Name, JsonSerializer.SerializeToString(items));
continue;
}
var value = propertyInfo.GetValue(item);
third.Metadata.Add(propertyInfo.Name, value == null ? string.Empty : value.ToString());
}
conn.Insert(third);
//trans?.Commit();
third.RemoveAllOnlyProperties();
rtns.Add(third);
}
}
catch (Exception ex)
{
//trans?.Rollback();
throw ex;
}
return rtns;
}
/// <summary>
/// 回传报告结果
/// </summary>
/// <param name="_client"></param>
/// <param name="apptoken"></param>
/// <param name="appsecret"></param>
/// <param name="orderResult"></param>
/// <returns></returns>
internal static OrderResponse UploadOrderResult(this JsonHttpClient _client, string apptoken, string appsecret, OrderResult orderResult)
{
(_client == null).ThrowIfTrue("UploadOrderResult:请传入_client");
(apptoken.IsNullOrEmpty()).ThrowIfTrue("UploadOrderResult:请传入apptoken");
(appsecret.IsNullOrEmpty()).ThrowIfTrue("UploadOrderResult:请传入appsecret");
orderResult.ThrowIfNull("UploadOrderResult:请传入回传内容");
var timeStamp = GetTimeStamp();
var appSign = $"apptoken={apptoken}&appsecret={appsecret}&timestamp={timeStamp}";
var signature = GetSign(appSign);
var jsons = JsonSerializer.SerializeToString(orderResult);
var body = new Dictionary<string, string>();
body.Add("DATA", jsons);
var paramsString = $"?appToken={apptoken}&signature={signature}&timestamp={timeStamp}";
var response = _client.Post<OrderResponse>($"{Configs.RouteUpdateWtsResult}{paramsString}", body);
return response;
}
/// <summary>
/// 回传报告PDF
/// </summary>
/// <param name="_client"></param>
/// <param name="apptoken"></param>
/// <param name="appsecret"></param>
/// <param name="orderNo"></param>
/// <param name="orderPdfs"></param>
/// <returns></returns>
internal static OrderResponse UploadOrderPdf(this JsonHttpClient _client, string apptoken, string appsecret, string orderNo, List<OrderPdf> orderPdfs)
{
(_client == null).ThrowIfTrue("UploadOrderPdf:请传入_client");
(apptoken.IsNullOrEmpty()).ThrowIfTrue("UploadOrderPdf:请传入apptoken");
(appsecret.IsNullOrEmpty()).ThrowIfTrue("UploadOrderPdf:请传入appsecret");
orderNo.ThrowIfNullOrEmpty("请传入订单号");
orderPdfs.ThrowIfNullOrEmpty("UploadOrderPdf:请传入回传内容");
var timeStamp = GetTimeStamp();
var appSign = $"apptoken={apptoken}&appsecret={appsecret}&timestamp={timeStamp}";
var signature = GetSign(appSign);
var jsons = JsonSerializer.SerializeToString(orderPdfs);
var body = new Dictionary<string, string>();
body.Add("DATA", jsons);
body.Add("ORDER_NO", orderNo);
var paramsString = $"?appToken={apptoken}&signature={signature}&timestamp={timeStamp}";
Console.WriteLine($"-------PrePost:UploadOrderPdf:{JsonSerializer.SerializeToString(body)}\n");
var response = _client.Post<OrderResponse>($"{Configs.RouteUpdateWtsReport}{paramsString}", body);
return response;
}
/// <summary>
/// 确认完成检测
/// </summary>
/// <param name="_client"></param>
/// <param name="apptoken"></param>
/// <param name="appsecret"></param>
/// <param name="result"></param>
/// <returns></returns>
internal static OrderResponse UploadOrderComplete(this JsonHttpClient _client, string apptoken, string appsecret, OrderResult result)
{
(_client == null).ThrowIfTrue("UploadOrderComplete:请传入_client");
(apptoken.IsNullOrEmpty()).ThrowIfTrue("UploadOrderComplete:请传入apptoken");
(appsecret.IsNullOrEmpty()).ThrowIfTrue("UploadOrderComplete:请传入appsecret");
(result.ORDER_NO.IsNullOrEmpty()).ThrowIfTrue("UploadOrderComplete:请传入orderNo");
var timeStamp = GetTimeStamp();
var appSign = $"apptoken={apptoken}&appsecret={appsecret}&timestamp={timeStamp}";
var signature = GetSign(appSign);
var body = new Dictionary<string, string>();
body.Add("ORDER_NO", result.ORDER_NO);
body.Add("RPT_NO", result.RPT_ITEMS[0].RPT_NO);
var paramsString = $"?appToken={apptoken}&signature={signature}&timestamp={timeStamp}";
Console.WriteLine($"-------PrePost:UploadOrderComplete:{result.ORDER_NO}\n");
var response = _client.Post<OrderResponse>($"{Configs.RouteCloseWts}{paramsString}", body);
return response;
}
internal static void LinkReports(List<ThirdReportOrder> thirds = null)
{
var conn = KiviiContext.GetOpenedDbConnection<Report>();
if (thirds.IsNullOrEmpty())
{
thirds = conn.Select<ThirdReportOrder>(o => o.IsAccepted == false & o.IsOffseted == false & o.IsUploaded == false & o.ThirdType == typeof(BestsellerOrder).FullName);
}
if (thirds.IsNullOrEmpty()) return;
var queryReports = conn.From<Report>();
queryReports.Where(o => Sql.In(o.BizId, thirds.ConvertAll(p => p.SerialNumber)) & o.Status >= (int)ReportStatusType.ReportIssue).OrderBy(o => o.ReportId);
var allReports = conn.Select(queryReports);
if (allReports.IsNullOrEmpty()) return;
foreach (var third in thirds)
{
var reports = allReports.Where(o => o.BizId == third.SerialNumber).ToList();
if (reports.IsNullOrEmpty()) continue;
//if (reports.Exists(o => o.TestJudgement == "不合格"))
//{
// third.ReportIds = "存在不合格报告请手动关联!";
// third.AddOnlyProperties(o => o.ReportIds);
// conn.UpdateOnly(third);
// continue;
//}
third.ReportIds = string.Empty;
var reportIds = new List<string>();
foreach (var report in reports)
{
report.BizId = third.SerialNumber;
report.AddOnlyProperties(o => o.BizId);
report.BizKvid = third.Kvid;
report.AddOnlyProperties(o => o.BizKvid);
report.BizType = typeof(ThirdReportOrder).FullName;
report.AddOnlyProperties(o => o.BizType);
conn.UpdateOnly(report);
var thirdDetail = new ThirdReportOrderDetail();
thirdDetail.ThirdOrderKvid = third.Kvid;
thirdDetail.ReportId = report.ReportId;
thirdDetail.ReportKvid = report.Kvid;
thirdDetail.ThirdType = third.ThirdType;
thirdDetail.SerialNumber = third.SerialNumber;
thirdDetail.Name = third.Name;
thirdDetail.ThirdName = third.ThirdName;
thirdDetail.IsUploaded = false;
thirdDetail.OperateTime = DateTime.Now;
thirdDetail.Metadata = new Dictionary<string, string>();
thirdDetail.Metadata = report.Metadata;
foreach (var propertyInfo in report.GetType().GetProperties())
{
if (propertyInfo.Name == "Metadata") continue;
try
{
var value = propertyInfo.GetValue(report);
thirdDetail.Metadata.Add(propertyInfo.Name, value == null ? string.Empty : value.ToString());
}
catch { }
}
conn.Insert(thirdDetail);
reportIds.Add(report.ReportId);
}
if (third.Metadata.IsNullOrEmpty()) third.Metadata = new Dictionary<string, string>();
third.Metadata["Amount"] = reports.Sum(o => o.Amount + o.AmountTest).ToString();
third.AddOnlyProperties(o => o.Metadata);
third.ReportIds = string.Join("、", reportIds);
third.AddOnlyProperties(o => o.ReportIds);
third.IsAccepted = true;
third.AddOnlyProperties(o => o.IsAccepted);
conn.UpdateOnly(third);
}
}
public static string GetTimeStamp()
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
var timeStamp = ((int)(DateTime.Now - startTime).TotalSeconds).ToString(); // 相差秒数
return timeStamp;
//return string.Format("{0:yyyyMMddHHmmss}", DateTime.Now);//$"{DateTime.Now:yyyyMMddHHmmss}";
}
/// <summary>
/// apptoken=12345&appsecret=56789&timestamp=1632127400
/// </summary>
/// <param name="accessKey"></param>
/// <returns></returns>
public static string GetSign(string accessKey)
{
if (accessKey.IsNullOrEmpty()) accessKey = string.Empty;
MD5 md5 = new MD5CryptoServiceProvider();
byte[] targetData = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(accessKey));
StringBuilder sign = new StringBuilder("");
foreach (byte b in targetData)
{
sign.AppendFormat("{0:x2}", b);
}
return sign.ToString().ToUpper();
}
}
}
using Kivii.Lims;
using Kivii.Lims.Entities;
using Kivii.Linq;
using Kivii.Third.Bestseller.Entities;
using Kivii.Third.Bestseller.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Third.Bestseller.Jobs
{
public class OrderPullJob : IJob
{
public string Name => "拉取订单";
public string Description => "拉取订单";
public IJobContext TaskContext { get; set; }
public bool Execution()
{
#region 设置缓存1分钟内不能连续请求
var cache = KiviiContext.GetCacheClient();
var cacheKey = KiviiContext.GetUrnKey($"{typeof(BestsellerOrder).FullName}.PullOrder:LockedOneMinute");
var cacheValue = cache.Get<string>(cacheKey);
if (!cacheValue.IsNullOrEmpty())
{
throw new Exception(cacheValue);
}
#endregion
var baseUrl = TaskContext.Arguments["BaseUrl"];
baseUrl.ThrowIfNullOrEmpty("未配置参数:BaseUrl");
var token = TaskContext.Arguments["Token"];
token.ThrowIfNullOrEmpty("未配置参数:Token");
var secret = TaskContext.Arguments["Secret"];
secret.ThrowIfNullOrEmpty("未配置参数:Secret");
var length = TaskContext.Arguments.ContainsKey("Length") ? TaskContext.Arguments["Length"].ToInt() : 200;
var ownerKvidstr = TaskContext.Arguments["OwnerKvid"];
var ownerKvid = Guid.Empty;
if (!ownerKvidstr.IsNullOrEmpty()) Guid.TryParse(ownerKvidstr, out ownerKvid);
var ownerName = TaskContext.Arguments["OwnerName"];
try
{
var conn = KiviiContext.GetOpenedDbConnection<ThirdReportOrder>();
DateTime maxTranslateTime = conn.Scalar<ThirdReportOrder, DateTime>(o => Sql.Max(o.OperateTime), p => p.ThirdType == typeof(BestsellerOrder).FullName);
var client = new JsonHttpClient(baseUrl);
var response = client.PullOrders(token, secret, maxTranslateTime);
cache.Set(cacheKey, "一分钟内不可多次查询!", TimeSpan.FromMinutes(1));
if (response.code != 200)
{
TaskContext.Message = $"{response.message}";
return false;
}
if (response.data == null)
{
TaskContext.Message = $"未获取到数据!";
return true;
}
if (response.data.results.IsNullOrEmpty())
{
TaskContext.Message = $"未获取到数据!";
return true;
}
var results = response.data.results.AcceptThirdContractOrder(ownerKvid, ownerName, conn);
TaskContext.Message = $"新增{results.Count}条!";
return true;
}
catch (Exception ex)
{
TaskContext.Message = $"错误:{ex.Message}";
return false;
}
finally
{
var thread = KiviiContext.NewThread(() =>
{
//没有关联报告的 自动执行符合条件的关联
OrderExtension.LinkReports();
});
thread.Start();
}
}
public void Dispose()
{
}
}
public class OrderUploadJob : IJob
{
public string Name => "上传订单";
public string Description => "上传订单";
public IJobContext TaskContext { get; set; }
public bool Execution()
{
var conn = KiviiContext.GetOpenedDbConnection<ThirdReportOrder>();
try
{
var pbs = conn.Select<ThirdReportOrder>(o => o.ThirdType == typeof(BestsellerOrder).FullName & o.IsUploaded == false & o.IsAccepted == true);
if (pbs.IsNullOrEmpty())
{
TaskContext.Message = "暂无数据处理";
return true;
}
var pbKvids = pbs.ConvertAll(o => o.Kvid);
var instance = Activator.CreateInstance(typeof(BestsellerOrder)) as IEntityIsThirdReportOrder;
var successed = 0;
var skip = 0;
foreach (var kvid in pbKvids)
{
var result = instance.OnUploadThirdReport(kvid);
if (result) successed++;
else skip++;
}
TaskContext.Message = $"合计待回传订单:{pbKvids.Count}条,成功回传:{successed}条,跳过{skip}条。";
return true;
}
catch (Exception ex)
{
TaskContext.Message = $"错误:{ex.Message}";
throw;
}
}
public void Dispose()
{
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7658F888-E116-4C1B-8741-80BEDB0B604B}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Kivii.Third.Bestseller</RootNamespace>
<AssemblyName>Kivii.Third.Bestseller.V4.5</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Kivii.Common.V4.5, Version=5.6.2024.7000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Common.5.6.2024.7000\lib\net45\Kivii.Common.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Core.V4.5, Version=5.6.2024.7000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Core.5.6.2024.7000\lib\net45\Kivii.Core.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Linq.V4.5, Version=5.6.2024.7000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Linq.5.6.2024.7000\lib\net45\Kivii.Linq.V4.5.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Configs.cs" />
<Compile Include="Entities\Bestseller.cs" />
<Compile Include="Entities\BestsellerBase.cs" />
<Compile Include="Entities\ReportDetail.cs" />
<Compile Include="Extensions\OrderExtension.cs" />
<Compile Include="Jobs\OrderJob.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Requests\OrderRequest.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Kivii.Biz.Lims.V1.0\Src\Kivii.Biz.Lims.V1.0.csproj">
<Project>{c2a2c9b2-e412-4267-8dad-4c37a3fe33e3}</Project>
<Name>Kivii.Biz.Lims.V1.0</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
<None Include="Resources\北京毛纺所_绫致三方检测平台接口文档.docx" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ProjectFiles</ProjectView>
</PropertyGroup>
</Project>
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Kivii.Third.Bestseller.V4.5")]
[assembly: AssemblyDescription("绫致订单对接")]
[assembly:AssemblyDefaultAlias("Kivii.Third.Bestseller")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Kivii.Third.Bestseller.V4.5")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("7658f888-e116-4c1b-8741-80bedb0b604b")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("5.4.2024.8020")]
[assembly: AssemblyFileVersion("5.4.2024.8020")]
using Kivii.Third.Bestseller.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Third.Bestseller.Requests
{
#region Request
public class OrderResponse
{
public int code { get; set; }
public string message { get; set; }
public OrderResults data { get; set; }
}
public class OrderResults
{
public int recordsTotal { get; set; }
public string resp_code { get; set; }
public string message { get; set; }
public string errors { get; set; }
public List<BestsellerOrder> results { get; set; }
}
/// <summary>
/// 获取进行中的三方检测单据列表(包含单据基本信息和检测项信息)
/// </summary>
//[Route("/thirdapi/wtsapi/coord-wts/get-wts-list")]
[Route(Configs.RouteGetWtsList)]
public class BestsellerOrderGetWtsList : IReturn<OrderResponse>
{
[ApiMember(Description = "客户分配L")]
public string appToken { get; set; }
public string signature { get; set; }
public string timestamp { get; set; }
[ApiMember(Description = "时间(从)可填")]
public DateTime? beginTime { get; set; }
[ApiMember(Description = "时间(到)可填")]
public DateTime? endTime { get; set; }
[ApiMember(Description = "返回记录数(可填,默认为10)")]
public int length { get; set; }
[ApiMember(Description = "记录偏移量(可填,默认为0)")]
public int start { get; set; }
}
/// <summary>
/// 获取指定单号的三方检测单据详情(包含单据基本信息和检测项信息)
/// </summary>
//[Route("/thirdapi/wtsapi/coord-wts/get-wts-data")]
[Route(Configs.RouteGetWtsData)]
public class BestsellerOrderGetData : IReturn<OrderResponse>
{
[ApiMember(Description = "客户分配L")]
public string appToken { get; set; }
public string signature { get; set; }
public string timestamp { get; set; }
public string docNo { get; set; }
}
/// <summary>
/// 确认接受三方检测单
/// </summary>
//[Route("/thirdapi/wtsapi/coord-wts/accept-wts")]
[Route(Configs.RouteAcceptWts)]
public class BestsellerOrderAcceptConfirm : IReturn<OrderResponse>
{
[ApiMember(Description = "客户分配L")]
public string appToken { get; set; }
public string signature { get; set; }
public string timestamp { get; set; }
public string ORDER_NO { get; set; }
}
/// <summary>
/// 更新三方检测结果
/// </summary>
//[Route("/thirdapi/wtsapi/coord-wts/update-wts-result")]
[Route(Configs.RouteUpdateWtsResult)]
public class BestsellerOrderUploadResult : IReturn<OrderResponse>
{
[ApiMember(Description = "客户分配L")]
public string appToken { get; set; }
public string signature { get; set; }
public string timestamp { get; set; }
public OrderResult DATA { get; set; }
}
/// <summary>
/// 根据URL地址更新三方检测报告
/// </summary>
//[Route("/thirdapi/wtsapi/coord-wts/update-wts-report")]
[Route(Configs.RouteUpdateWtsReport)]
public class BestsellerOrderUploadPdf : IReturn<OrderResponse>
{
[ApiMember(Description = "客户分配L")]
public string appToken { get; set; }
public string signature { get; set; }
public string timestamp { get; set; }
public string ORDER_NO { get; set; }
public List<OrderPdf> DATA { get; set; }
}
/// <summary>
/// 确认完成检测
/// </summary>
//[Route("/thirdapi/wtsapi/coord-wts/close-wts")]
[Route(Configs.RouteCloseWts)]
public class BestsellerOrderUploadComplete : IReturn<OrderResponse>
{
[ApiMember(Description = "客户分配L")]
public string appToken { get; set; }
public string signature { get; set; }
public string timestamp { get; set; }
public string ORDER_NO { get; set; }
}
#endregion
}
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Kivii.Common" version="5.6.2024.7000" targetFramework="net45" />
<package id="Kivii.Core" version="5.6.2024.7000" targetFramework="net45" />
<package id="Kivii.Linq" version="5.6.2024.7000" targetFramework="net45" />
</packages>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment