提交 14a92a8c authored 作者: 彭寒菲's avatar 彭寒菲

接口

上级 4ad87b56
......@@ -186,8 +186,8 @@ namespace LQKJ.K3.MFG.PRD.App.ServicePlugIn
string sql2 = $@"/*dialect*/ select t1.FROWID zFROWID,t2.FROWID fFROWID,t1.FMATERIALIDSUB z,t4.FNUMBER znumber,
t6.FINCREASEQTY zmin,t1.FLACKQTY zLACKQTY,t1.FLACKQTY zsumLACKQTY,t2.FMATERIALIDSUB f,t5.FNUMBER fnumber,
t7.FINCREASEQTY fmin,t2.FLACKQTY,t3_z.*,t3_f.*,t1.FNEEDDATE fFNEEDDATE,
t1.FMOBILLNO fFSALEORDERNO,t1.FMOENTRYSEQ,t10.FNUMBER fxqwl,t11.FMATERIALID lackmaterial,t11.FLACKQTY sumlackqty
from T_PRD_PMPPBOMENTRY t1
t1.FMOBILLNO fFSALEORDERNO,t1.FMOENTRYSEQ,t10.FNUMBER fxqwl,t11.FMATERIALID lackmaterial,t11.FLACKQTY sumlackqty,t1.FREPLACEGROUP,
t1.FMOENTRYSEQ from T_PRD_PMPPBOMENTRY t1
left join T_PRD_PMPPBOMENTRY t2 on t1.FID = T2.FID and t1.FPARENTROWID=t2.FROWID
left join (
select FORDERBOMID zFORDERBOMID,T2.FMATERIALID,T2.FMATERIALTYPE z物料类型,T3.FREPLACEPOLICY z替代策略,
......@@ -212,7 +212,7 @@ namespace LQKJ.K3.MFG.PRD.App.ServicePlugIn
left join T_BD_MATERIAL t10 on t10.FMATERIALID=t1.FMATERIALID--产品物料(需求)
left join T_PRD_LACKENTRY t11 on t11.FMATERIALID=t1.FMATERIALIDSUB and t11.FID=t1.FID
where T1.FID={id} and (t2.FLACKQTY>1 or (t2.FLACKQTY is null and t1.FLACKQTY>1)) and (t1type .FISSUETYPE!=7 or(t1type .FISSUETYPE is null ) )
and t8.FERPCLSID!=5 and (t9.FERPCLSID!=5 or t9.FERPCLSID is null) ";
and t8.FERPCLSID!=5 and (t9.FERPCLSID!=5 or t9.FERPCLSID is null) ORDER by t1.FMOBILLNO,t1.FREPLACEGROUP,t1.FMOENTRYSEQ desc";
Logger.Info("sql2:", ctx.DBId + "," + sql2.ToString());
Logger.Info("sql1:", ctx.DBId + "," + sql1.ToString());
......


......@@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LQKJ.K3.MFG.PRD.App.Service
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LQKJ.K3.MFG.PRD.BusinessPlugIn", "..\LQKJ.K3.MFG.PRD.BusinessPlugIn\LQKJ.K3.MFG.PRD.BusinessPlugIn.csproj", "{BD10ED4F-5423-4B56-B2AF-04B43E184E32}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LQKJ.PushAndSaveWebApi.Stub", "..\LQKJ.WebApi.Stub\LQKJ.PushAndSaveWebApi.Stub.csproj", "{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......@@ -21,6 +23,10 @@ Global
{BD10ED4F-5423-4B56-B2AF-04B43E184E32}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD10ED4F-5423-4B56-B2AF-04B43E184E32}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD10ED4F-5423-4B56-B2AF-04B43E184E32}.Release|Any CPU.Build.0 = Release|Any CPU
{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.Operation;
using Kingdee.BOS.Core.DynamicForm.OperationWebService;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Interaction;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement;
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.Validation;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Log;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceFacade.KDServiceFx;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.BOS.WebApi.ServicesStub;
namespace LQKJ.WebApi.Stub
{
//自定义webapi接口
public class CustomWebApiService : AbstractWebApiBusinessService
{
public CustomWebApiService(KDServiceContext context)
: base(context)
{
//
}
//执行sql并返回查询结果 sql脚本
public SQLResult ExecutDataSet(string sql)
{
SQLResult sQLResult = new SQLResult();
if (string.IsNullOrWhiteSpace(sql))
{
sQLResult.resultCode = "0001";
sQLResult.resultMsg = "参数为空,请传正确的参数!";
return sQLResult;
}
if (this.KDContext.Session.AppContext == null)
{
sQLResult.resultCode = "0010";
sQLResult.resultMsg = "请重新登录!";
return sQLResult;
}
sQLResult.resultCode = "0000";
sql = DESHelper.Decrypt(sql, "MES&&DES");
try
{
sQLResult.data = DBServiceHelper.ExecuteDataSet(this.KDContext.Session.AppContext, sql);
}
catch (Exception ex)
{
sQLResult.resultCode = "0001";
sQLResult.resultMsg = ex.Message;
}
return sQLResult;
}
//执行sql并返回查询结果 返回字典集合
public SQLResult ExecuteDynamicObject(string sql)
{
SQLResult sQLResult = new SQLResult();
if (string.IsNullOrWhiteSpace(sql))
{
sQLResult.resultCode = "0001";
sQLResult.resultMsg = "参数为空,请传正确的参数!";
return sQLResult;
}
if (this.KDContext.Session.AppContext == null)
{
sQLResult.resultCode = "0010";
sQLResult.resultMsg = "请重新登录!";
return sQLResult;
}
sQLResult.resultCode = "0000";
sql = DESHelper.Decrypt(sql, "MES&&DES");
try
{
sQLResult.data = DBServiceHelper.ExecuteDynamicObject(this.KDContext.Session.AppContext, sql);
}
catch (Exception ex)
{
sQLResult.resultCode = "0001";
sQLResult.resultMsg = ex.Message;
}
return sQLResult;
}
public SQLResult ExecutBatch(string sql)
{
SQLResult sQLResult = new SQLResult();
if (string.IsNullOrWhiteSpace(sql))
{
sQLResult.resultCode = "0001";
sQLResult.resultMsg = "参数为空,请传正确的参数!";
return sQLResult;
}
if (this.KDContext.Session.AppContext == null)
{
sQLResult.resultCode = "0010";
sQLResult.resultMsg = "请重新登录!";
return sQLResult;
}
sQLResult.resultCode = "0000";
sql = DESHelper.Decrypt(sql, "MES&&DES");
var sqls = sql.Split(';').ToList();
try
{
sQLResult.data = DBServiceHelper.ExecuteBatch(this.KDContext.Session.AppContext, sqls);
}
catch (Exception ex)
{
sQLResult.resultCode = "0001";
sQLResult.resultMsg = ex.Message;
}
return sQLResult;
}
private IBillView CreateBillView(string formId, JSONObject model, out bool isToAudit)
{
//读取物料的元数据
FormMetadata meta = MetaDataServiceHelper.Load(this.KDContext.Session.AppContext, formId) as FormMetadata;
Form form = meta.BusinessInfo.GetForm();
//创建用于引入数据的单据view
Type type = Type.GetType("Kingdee.BOS.Web.Bill.BillView,Kingdee.BOS.Web");
var billView = (IDynamicFormViewService)Activator.CreateInstance(type);
//开始初始化billView:
//创建视图加载参数对象,指定各种参数,如FormId, 视图(LayoutId)等
BillOpenParameter openParam = CreateOpenParameter(meta, model, out isToAudit);
//动态领域模型服务提供类,通过此类,构建MVC实例
var provider = form.GetFormServiceProvider();
billView.Initialize(openParam, provider);
return billView as IBillView;
}
private BillOpenParameter CreateOpenParameter(FormMetadata meta, JSONObject model, out bool isToAudit)
{
Form form = meta.BusinessInfo.GetForm();
//指定FormId, LayoutId
BillOpenParameter openParam = new BillOpenParameter(form.Id, meta.GetLayoutInfo().Id);
//数据库上下文
openParam.Context = this.KDContext.Session.AppContext;
//本单据模型使用的MVC框架
openParam.ServiceName = form.FormServiceName;
//随机产生一个不重复的PageId,作为视图的标识
openParam.PageId = Guid.NewGuid().ToString();
//元数据
openParam.FormMetaData = meta;
//界面状态:新增 (修改、查看)
object pkValue;
if (!model.TryGetValue(form.PkFieldName, out pkValue))
{
openParam.Status = OperationStatus.ADDNEW;
isToAudit = true;
}
else
{
openParam.Status = OperationStatus.EDIT;
isToAudit = false;
//单据主键:本案例演示新建物料,不需要设置主键
openParam.PkValue = pkValue;
}
//界面创建目的:普通无特殊目的 (为工作流、为下推、为复制等)
openParam.CreateFrom = CreateFrom.Default;
var plugs = form.CreateFormPlugIns();
openParam.SetCustomParameter(FormConst.PlugIns, plugs);
PreOpenFormEventArgs args = new PreOpenFormEventArgs(this.KDContext.Session.AppContext, openParam);
foreach (var plug in plugs)
{ //触发插件PreOpenForm事件,供插件确认是否允许打开界面
plug.PreOpenForm(args);
}
return openParam;
}
/// <summary>
/// 下推并保存
/// </summary>
/// <returns></returns>
public Result PushAndSave(PushAndSaveArgs pushAndSaveArgs)
{
var isAutoSubmit = pushAndSaveArgs.isAutoSubmit;
Result result = new Result();
if (pushAndSaveArgs == null)
{
result.resultCode = "0001";
result.resultMsg = "参数为空,请传正确的参数!";
return result;
}
Logger.Info("pushAndSaveArgs", JsonUtil.Serialize(pushAndSaveArgs));
result.performances.Add(new Performance() { stage = "开始", pointTime = DateTime.Now });
if (this.KDContext.Session.AppContext == null)
{
result.resultCode = "0010";
result.resultMsg = "请重新登录!";
return result;
}
List<ListSelectedRow> listSelectedRows = new List<ListSelectedRow>();
DynamicObject dynamicObject;
FormMetadata billFormMetadata = null;
try
{
billFormMetadata = MetaDataServiceHelper.Load(this.KDContext.Session.AppContext, pushAndSaveArgs.FormId) as FormMetadata;
}
catch (KDException ex)
{
result.resultCode = "0001";
result.resultMsg = $"单据唯一标识{pushAndSaveArgs.FormId}参数不正确!";
return result;
}
bool isToAudit;
IBillView billView = CreateBillView(pushAndSaveArgs.FormId, pushAndSaveArgs.Model, out isToAudit);
if (pushAndSaveArgs.SrcIds == null || pushAndSaveArgs.SrcIds.Count == 0)
{
//构建一个IBillView实例
((IDynamicFormViewService)billView).LoadData();
dynamicObject = billView.Model.DataObject;
result.performances.Add(new Performance() { stage = "加载数据完成", pointTime = DateTime.Now });
}
else
{
foreach (string srcId in pushAndSaveArgs.SrcIds)
{
listSelectedRows.Add(new ListSelectedRow("0", srcId, pushAndSaveArgs.SrcIds.IndexOf(srcId), pushAndSaveArgs.SrcFormId) { EntryEntityKey = pushAndSaveArgs.SrcEntryKey });
}
var convertRules = ConvertServiceHelper.GetConvertRules(this.KDContext.Session.AppContext, pushAndSaveArgs.SrcFormId, pushAndSaveArgs.FormId);
ConvertRuleElement convertRuleElement2 = convertRules.Where(rule => rule.Id == pushAndSaveArgs.ConvertRule).FirstOrDefault();
if (convertRuleElement2 == null)
{
result.resultCode = "0001";
result.resultMsg = $"源单({pushAndSaveArgs.SrcFormId})、目标单({pushAndSaveArgs.FormId})和单据转换({pushAndSaveArgs.ConvertRule}),其中有一个参数不正确!";
return result;
}
PushArgs serviceArgs = new PushArgs(convertRuleElement2, listSelectedRows.ToArray())
{
TargetBillTypeId = "",//billtype
//TargetOrgId ="1",
//CustomParams = customParams,
//EntryUpperLimitValue = retInfo.EntryUpperLimitValue
};
var pushOption = OperateOption.Create();
pushOption.SetVariableValue("SelectByBillId", false);
pushOption.SetVariableValue("ConvertType", "ManualPush");
ConvertOperationResult innerConvertOperationResult = null;
try
{
var EntryName = "";
var EntryKey = "";
foreach (var item in pushAndSaveArgs.Model)
{
Element element1;
Element element = billView.BillBusinessInfo.GetElement(item.Key.Trim());
if (7 == 0 || element != null)
{
element1= element;
}
int num = item.Key.Trim().IndexOf("#");
if (num > -1)
{
string key = item.Key.Trim().Substring(num + 2);
element = billView.BillBusinessInfo.GetElement(key);
}
element1= element;
if (element == null) continue;
if (element is EntryEntity)
{
EntryName = (element1 as EntryEntity).EntryName;
EntryKey = (element1 as EntryEntity).Key;
}
else
{
continue;
}
}
innerConvertOperationResult = ConvertServiceHelper.Push(this.KDContext.Session.AppContext, serviceArgs, pushOption);
Dictionary<string, int> HSsrcId = new Dictionary<string, int>();
List<string> SrcIdlist = pushAndSaveArgs.SrcIds;
var DataEntities = innerConvertOperationResult.TargetDataEntities;
if(!EntryName.IsNullOrEmptyOrWhiteSpace())
{
foreach (var item in DataEntities)
{
var Entitys = item.DataEntity[EntryName] as DynamicObjectCollection;
foreach (var Entity in Entitys)
{
var LinkSId = (Entity[EntryKey + "_Link"] as DynamicObjectCollection)[0]["SId"].ToString();
if (HSsrcId.ContainsKey(LinkSId))
{
HSsrcId[LinkSId] = HSsrcId[LinkSId] + 1;
}
else
{
HSsrcId.Add(LinkSId, 1);
}
}
}
string NotInId = "";
if (HSsrcId.Count > 0)
{
foreach (var Id in SrcIdlist)
{
if (!HSsrcId.ContainsKey(Id))
{
NotInId += Id + ",";
}
else
{
if (HSsrcId[Id] == 0)
{
NotInId += Id + ",";
}
else
{
HSsrcId[Id] = HSsrcId[Id] - 1;
}
}
}
}
if (NotInId != "")
{
result.resultMsg = $"同步失败,源单分录主键{NotInId} 未下推成功!";
result.resultCode = "0001";
return result;
}
}
}
catch (KDException ex)
{
if (ex.Code == "BF")
{
result.resultMsg = $"源单分录主键{pushAndSaveArgs.SrcEntryKey}配置不正确!";
}
else
{
result.resultMsg = ex.Message;
}
result.resultCode = "0001";
return result;
}
if (!innerConvertOperationResult.IsSuccess)
{
GenMessages(result, innerConvertOperationResult, "下推");
return result;
}
var dynamicObjects = ((from p in innerConvertOperationResult.TargetDataEntities
select p.DataEntity).ToArray<DynamicObject>());
dynamicObject = dynamicObjects[0];
billView.Model.DataObject = dynamicObject;
}
Save save = new Save();
save.Initialize(new WebServiceContext(billView, null, null, new FormOperation()));
try
{
save.Map(pushAndSaveArgs.Model, dynamicObject);
}
catch (KDException ex)
{
result.resultMsg = ex.Message;
result.resultCode = "0001";
billView.CommitNetworkCtrl();
return result;
}
billView.CommitNetworkCtrl();
if (pushAndSaveArgs.IsInTransaction)
{
using (SessionScope scope = new SessionScope())
{
using (KDTransactionScope ts = new KDTransactionScope(TransactionScopeOption.Required))
{
result = SaveAndAudit(billView, billFormMetadata, isToAudit, isAutoSubmit);
if (result.resultCode == "0000")
{
ts.Complete();
}
return result;
}
}
}
else
{
return SaveAndAudit(billView, billFormMetadata, isToAudit, isAutoSubmit);
}
}
/// <summary>
/// 保存提交审核
/// </summary>
/// <param name="billView"></param>
private Result SaveAndAudit(IBillView billView, FormMetadata billFormMetadata, bool isToAudit, Ismode isAutoSubmit)
{
//0暂存
//1保存
//2保存提交
//3保存提交审核
Result result = new Result();
OperateOption option = OperateOption.Create();
option.SetNotShowConfirmInfo(true);
option.SetIgnoreWarning(true);
option.SetIgnoreInteractionFlag(true);
List<object> successIds = new List<object>();
IOperationResult saveResult = billView.Model.Save(option);
//1保存
//2保存提交
//3保存提交审核
if (isAutoSubmit == Ismode.save || isAutoSubmit == Ismode.submit || isAutoSubmit == Ismode.auto)
{
LoadSuccessIds(successIds, saveResult);
GenMessages(result, saveResult, "保存", !isToAudit);
if (successIds.Count == 0) return result;
if (!isToAudit && result.resultCode == "0000")
{
result.resultMsg = "同步成功";
}
if (isAutoSubmit == Ismode.save && result.resultCode == "0000"&& result.resultData.Count == 0)
{
GenMessages(result, saveResult, "保存", true);
//result.resultMsg = "同步成功";
}
}
if (isAutoSubmit == Ismode.submit || isAutoSubmit == Ismode.auto)
{
IOperationResult submitResult = BusinessDataServiceHelper.Submit(this.KDContext.Session.AppContext, billFormMetadata.BusinessInfo, successIds.ToArray(), FormOperationEnum.Submit.ToString());
LoadSuccessIds(successIds, submitResult);
GenMessages(result, submitResult, "提交");
if (successIds.Count == 0) return result;
if (isAutoSubmit == Ismode.submit && result.resultCode == "0000" && result.resultData.Count == 0)
{
GenMessages(result, saveResult, "提交", true);
// result.resultMsg = "同步成功";
}
}
if (isAutoSubmit == Ismode.auto)
{
IOperationResult auditResult = BusinessDataServiceHelper.Audit(this.KDContext.Session.AppContext, billFormMetadata.BusinessInfo, successIds.ToArray(), OperateOption.Create());
LoadSuccessIds(successIds, auditResult);
GenMessages(result, auditResult, "审核", true);
if (result.resultCode == "0000" && result.resultData.Count == 0)
{
GenMessages(result, saveResult, "审核", true);
}
if (result.resultCode == "0000")
{
result.resultMsg = "同步成功";
}
}
return result;
}
/// <summary>
/// 根据结果生成返回消息
/// </summary>
/// <param name="curResult"></param>
/// <param name="result"></param>
/// <param name="type"></param>
private void GenMessages(Result curResult, IOperationResult result, string type, bool isRecordSuccess = false)
{
var isSuccess = GenMessage(curResult, result, isRecordSuccess);
curResult.performances.Add(new Performance() { stage = type, pointTime = DateTime.Now });
curResult.resultCode = isSuccess ? "0000" : "0001";
curResult.resultMsg = type + (isSuccess ? "成功" : "失败");
}
/// <summary>
/// 根据结果生成返回消息明细
/// </summary>
/// <param name="curResult"></param>
/// <param name="result"></param>
private bool GenMessage(Result curResult, IOperationResult result, bool isRecordSuccess)
{
bool isSuccess = true;
if (result.ValidationErrors != null)
{
foreach (ValidationErrorInfo errorInfo in result.ValidationErrors)
{
string messageStr = errorInfo.Message.ToString();
ResultData resultData = new ResultData();
resultData.msg = messageStr;
curResult.resultData.Add(resultData);
isSuccess = false;
}
}
if (result.OperateResult != null)
{
foreach (OperateResult opResult in result.OperateResult)
{
if (opResult.SuccessStatus && isRecordSuccess)
{
if (string.IsNullOrWhiteSpace(opResult.Number)) continue;
ResultData resultData = new ResultData();
resultData.code = opResult.Number;
curResult.resultData.Add(resultData);
}
else if (!opResult.SuccessStatus)
{
string messageStr = opResult.Message.ToString();
ResultData resultData = new ResultData();
resultData.code = opResult.Number;
resultData.msg = messageStr;
curResult.resultData.Add(resultData);
isSuccess = false;
}
}
}
if (result.InteractionContext != null)
{
string messageStr = result.InteractionContext.SimpleMessage;
ResultData resultData = new ResultData();
resultData.msg = messageStr;
curResult.resultData.Add(resultData);
isSuccess = false;
}
return isSuccess;
}
/// <summary>
/// 加载成功的ID
/// </summary>
/// <param name="successIds"></param>
/// <param name="result"></param>
private void LoadSuccessIds(List<object> successIds, IOperationResult result)
{
successIds.Clear();
if (result.OperateResult != null)
{
foreach (var operateResult in result.OperateResult)
{
if (operateResult.SuccessStatus)
{
successIds.Add(operateResult.PKValue);
}
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace LQKJ.WebApi.Stub
{
public class DESHelper
{
/// <summary>
/// DES加密
/// </summary>
/// <param name="pToEncrypt"></param>
/// <param name="sKey">密钥(8位字符)</param>
/// <returns></returns>
public static string Encrypt(string pToEncrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
/// <summary>
/// 解密方法
/// </summary>
/// <param name="pToDecrypt">需要解密的字符串</param>
/// <param name="sKey">密匙</param>
/// <returns>解密后的字符串</returns>
public static string Decrypt(string pToDecrypt, string sKey)
{
try
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for (int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
//建立加密对象的密钥和偏移量,此值重要,不能修改
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
//建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
catch (Exception ex)
{
}
return "";
}
}
}
<?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>{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>LQKJ.PushAndSaveWebApi.Stub</RootNamespace>
<AssemblyName>LQKJ.PushAndSaveWebApi.Stub</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\K3Cloud\bin\</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="Kingdee.BOS, Version=7.7.2256.5, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Kingdee.BOS.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.App, Version=8.0.144.1, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\K3Cloud\bin\Kingdee.BOS.App.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.Core, Version=8.0.144.1, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\K3Cloud\bin\Kingdee.BOS.Core.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.DataEntity, Version=7.7.2256.5, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Kingdee.BOS.DataEntity.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.ServiceFacade.KDServiceFx, Version=7.7.2256.5, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Kingdee.BOS.ServiceFacade.KDServiceFx.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.ServiceHelper, Version=7.7.2256.5, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Kingdee.BOS.ServiceHelper.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.WebApi.FormService, Version=8.0.144.1, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\K3Cloud\bin\Kingdee.BOS.WebApi.FormService.dll</HintPath>
</Reference>
<Reference Include="Kingdee.BOS.WebApi.ServicesStub, Version=7.7.2256.5, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Debug\Kingdee.BOS.WebApi.ServicesStub.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Transactions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DESHelper.cs" />
<Compile Include="Performance.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="CustomWebApiService.cs" />
<Compile Include="PushAndSaveArgs.cs" />
<Compile Include="Result.cs" />
<Compile Include="ResultData.cs" />
<Compile Include="Save.cs" />
<Compile Include="SQLResult.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LQKJ.WebApi.Stub
{
/// <summary>
/// 性能
/// </summary>
public class Performance
{
/// <summary>
/// 阶段
/// </summary>
public string stage { get; set; }
/// <summary>
/// 时间点
/// </summary>
public DateTime pointTime { get; set; }
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("webapis")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("webapis")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("6ea92a22-fab9-4acc-ac0e-d76efa9bc67f")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
using Kingdee.BOS.JSON;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LQKJ.WebApi.Stub
{
/// <summary>
/// 下推/保存参数
/// </summary>
///
public enum Ismode { submit, draft, save, auto }//暂存,保存,保存提交,保存提交审核
public class PushAndSaveArgs
{
public PushAndSaveArgs()
{
IsAutoSubmitAndAudit = true;
IsInTransaction = true;
isAutoSubmit = Ismode.submit;
}
/// <summary>
/// 订单唯一标识
/// </summary>
public string FormId { get; set; }
/// <summary>
/// 源订单分录标识
/// </summary>
public string SrcEntryKey { get; set; }
/// <summary>
/// 源订单唯一标识
/// </summary>
public string SrcFormId { get; set; }
/// <summary>
/// 单据转换唯一标识
/// </summary>
public string ConvertRule { get; set; }
/// <summary>
/// 源单分录内码
/// </summary>
public List<string> SrcIds { get; set; }
/// <summary>
/// 是否自动提交审核
/// </summary>
public bool IsAutoSubmitAndAudit { get; set; }
/// <summary>
/// 是否在事务中
/// </summary>
public bool IsInTransaction { get; set; }
/// <summary>
/// 修改数据
/// </summary>
public JSONObject Model { get; set; }
public Ismode isAutoSubmit { get; set; }
}
}
using Kingdee.BOS.JSON;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LQKJ.WebApi.Stub
{
/// <summary>
/// 返回消息
/// </summary>
public class Result
{
public Result()
{
resultData = new List<ResultData>();
performances = new List<Performance>();
}
/// <summary>
/// 返回编码 0000为成功 0001为失败
/// </summary>
public string resultCode { get; set; }
/// <summary>
/// 返回消息
/// </summary>
public string resultMsg { get; set; }
/// <summary>
/// 性能数据
/// </summary>
public List<Performance> performances { get; set; }
/// <summary>
/// 返回数据
/// </summary>
public List<ResultData> resultData { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LQKJ.WebApi.Stub
{
/// <summary>
/// 返回明细
/// </summary>
public class ResultData
{
/// <summary>
/// 单据编码
/// </summary>
public string code { get; set; }
/// <summary>
/// 错误消息
/// </summary>
public string msg { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LQKJ.WebApi.Stub
{
public class SQLResult
{
/// <summary>
/// 返回编码 0000为成功 0001为失败
/// </summary>
public string resultCode { get; set; }
/// <summary>
/// 返回消息
/// </summary>
public string resultMsg { get; set; }
/// <summary>
/// 返回消息
/// </summary>
public object data { get; set; }
}
}
using Kingdee.BOS;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Log;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.BOS.WebApi.FormService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LQKJ.WebApi.Stub
{
public class Save : MapPropertyService
{
public override void Execute()
{
throw new NotImplementedException();
}
public void Map(JSONObject model, DynamicObject dynamicObject)
{
this.MapProperty(model, dynamicObject);
}
public Element GetElement(string elementName)
{
Element element = base.BillBusinessInfo.GetElement(elementName);
if (7 == 0 || element != null)
{
return element;
}
int num = elementName.IndexOf("#");
if (num > -1)
{
string key = elementName.Substring(num + 2);
element = base.BillBusinessInfo.GetElement(key);
}
return element;
}
/// <summary>
/// 映射属性
/// </summary>
/// <param name="billSynObj"></param>
/// <param name="targetObj"></param>
/// <param name="rowIndex"></param>
/// <param name="NeedUpDateFields"></param>
private void MapProperty(JSONObject model, DynamicObject targetObj, int rowIndex = 0)
{
//为空直接忽略
if (model == null) return;
if (targetObj == null) return;
foreach (var curField in model)
{
if (curField.Value != null)
{
string text = curField.Key.Trim();
try
{
Element element = this.GetElement(text);
if (element == null) continue;
if (element is SubHeadEntity)
{
DynamicObjectCollection dynamicObjectCollection = targetObj[(element as SubHeadEntity).EntryName] as DynamicObjectCollection;
string entryKey = (element as SubHeadEntity).Key;
string entryPKField = (element as SubHeadEntity).EntryPkFieldName;
this.MapCProperty(curField.Value as JSONArray, dynamicObjectCollection, entryKey, entryPKField);
}
else if (element is EntryEntity)
{
DynamicObjectCollection dynamicObjectCollection = targetObj[(element as EntryEntity).EntryName] as DynamicObjectCollection;
string entryKey = (element as EntryEntity).Key;
string entryPKField = (element as EntryEntity).EntryPkFieldName;
this.MapCProperty(curField.Value as JSONArray, dynamicObjectCollection, entryKey, entryPKField);
}
else if (element is Field)
{
Field field = element as Field;
#region 设置字段的值
if (field is RelatedFlexGroupField)
{// 维度关联字段
var fieldTargetObj = Convert.ToString(curField.Value);
if (fieldTargetObj == "0" || string.IsNullOrWhiteSpace(fieldTargetObj)) continue;
if (this._mapFlexFieldHelper == null)
{
this._mapFlexFieldHelper = new MapFlexFieldHelper(this.ServiceContext, this.Model, this.BillBusinessInfo);
}
this._mapFlexFieldHelper.SetFlexValue(field as RelatedFlexGroupField, targetObj, curField.Value, rowIndex);
}
//多选基础资料
else if (field is MulBaseDataField || field is MulAssistantField)
{
SetMulField(field, targetObj, curField.Value, rowIndex);
}
//批次字段和基础资料文本字段
else if (field is LotField || field is BaseDataTextField)
{
SetLotAndBaseDataTextField(field, targetObj, curField.Value, rowIndex);
}
//基础资料
else if (field is BaseDataField)
{
//会去掉强依赖,对于Number来搜索的,还是按正常的方式进行
SetBaseDataField(field as BaseDataField, targetObj, curField.Value, rowIndex);
}
//大文本字段赋值处理,暂时不处理,现在还没有大文本字段
else if (field is LargeTextField)
{
//SetLargeTextField(field as LargeTextField, targetObj, obj, sourceObj, rowIndex);
}
else if (field is CheckBoxField)
{
string curValue = curField.Value as string;
SetSimpleProperty(field, targetObj, curValue == "0" ? false : true, rowIndex);
}
else
{
SetSimpleProperty(field, targetObj, curField.Value is System.DBNull ? null : curField.Value, rowIndex);
}
}
#endregion
}
catch (KDException ex)
{
if (ex.Code == "FE")
{
throw ex;
}
string sMessage = $"给字段({text})设置值({curField.Value}):{ ex.Message}";
KDException kdException = new KDException("FE", sMessage);
throw kdException;
}
catch (Exception ex)
{
string sMessage = $"给字段({text})设置值({curField.Value}):{ ex.Message}";
KDException kdException = new KDException("FE", sMessage);
throw kdException;
}
}
}
}
/// <summary>
/// 单据体
/// </summary>
/// <param name="enity">单据体控件</param>
/// <param name="sourceRows">源数据值</param>
/// <param name="targetRows">目标行</param>
/// <param name="NeedUpDateFields"></param>
/// <param name="specialReferenceTable"></param>
private void MapCProperty(JSONArray entry, DynamicObjectCollection targetRows, string entryKey, string entryPKField)
{
Dictionary<string, DynamicObject> targetDic = new Dictionary<string, DynamicObject>();
Dictionary<string, DynamicObject> targetSICDic = new Dictionary<string, DynamicObject>();
List<DynamicObject> removedRows = new List<DynamicObject>();
foreach (DynamicObject targetRow in targetRows)
{
DealSrcInfo(entryKey, targetSICDic, removedRows, targetRow);
if (targetRow["Id"] == null) continue;
if (targetRow["Id"].ToString() == "0") continue;
if (string.IsNullOrWhiteSpace(targetRow["Id"].ToString())) continue;
targetDic.Add(targetRow["Id"].ToString(), targetRow);
}
foreach (var removeRow in removedRows)
{
targetRows.Remove(removeRow);
}
int entryCount = entry.Count;
HashSet<DynamicObject> entryRowHash = new HashSet<DynamicObject>();
int index = 0;
foreach (JSONObject entryRow in entry)
{
SetSrcEntryValue(entryRow, targetSICDic,targetRows);
object pkValue;
DynamicObject curRow;
//根据接口传过来的行内码,对某行进行赋值
if (entryRow.TryGetValue(entryPKField, out pkValue) && pkValue != null && targetDic.TryGetValue(pkValue.ToString(), out curRow))
{
MapProperty(entryRow, curRow, targetRows.IndexOf(curRow));
entryRowHash.Add(curRow);
index++;
}
}
List<DynamicObject> removeRows = new List<DynamicObject>();
foreach (DynamicObject targetRow in targetRows)
{
if (targetRow["Id"] == null) continue;
if (targetRow["Id"].ToString() == "0") continue;
if (string.IsNullOrWhiteSpace(targetRow["Id"].ToString())) continue;
var id = targetRow["Id"].ToString();
if (entryRowHash.Contains(targetRow)) continue;
removeRows.Add(targetRow);
}
foreach (var removeRow in removeRows)
{
targetRows.Remove(removeRow);
}
if (targetRows.Count < entry.Count)
{
this.Model.BatchCreateNewEntryRow(entryKey, entry.Count - targetRows.Count);
}
foreach (JSONObject entryRow in entry)
{
object pkValue;
DynamicObject curRow;
if (entryRow.TryGetValue(entryPKField, out pkValue) && pkValue != null && targetDic.TryGetValue(pkValue.ToString(), out curRow))
{
continue;
}
MapProperty(entryRow, targetRows[index], index);
index++;
}
}
private void SetSrcEntryValue(JSONObject item, Dictionary<string, DynamicObject> targetSICDic, DynamicObjectCollection targetRows)
{
if (!item.ContainsKey("ERP_SIC")) return;
var SIC = item["ERP_SIC"];
if (SIC == null || !string.IsNullOrWhiteSpace(SIC.ToString()) || SIC.ToString() != "0") return;
DynamicObject target;
if (!targetSICDic.TryGetValue(SIC.ToString(), out target))return;
MapProperty(item, target, targetRows.IndexOf(target));
}
private void DealSrcInfo(string entryKey, Dictionary<string, DynamicObject> targetSICDic, List<DynamicObject> removedRows, DynamicObject targetRow)
{
string entryLinkKey = entryKey + "_Link";
if (!targetRow.DynamicObjectType.Properties.ContainsKey(entryLinkKey)) return;
var entityLink = targetRow[entryKey + "_Link"] as DynamicObjectCollection;
if (entityLink.Count == 0) return;
var sid = entityLink[0]["SId"];
if (sid == null || !string.IsNullOrWhiteSpace(sid.ToString()) || sid.ToString() != "0") return;
if (!targetSICDic.ContainsKey(sid.ToString()))
{
targetSICDic.Add(sid.ToString(), targetRow);
}
else
{
removedRows.Add(targetRow);
}
}
}
}
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")]
D:\AAA我的文件夹\代码\欧智通\欧智通\OZT\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.PushAndSaveWebApi.Stub.csproj.CoreCompileInputs.cache
D:\AAA我的文件夹\代码\欧智通\欧智通\OZT\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.PushAndSaveWebApi.Stub.csproj.CopyComplete
D:\AAA我的文件夹\代码\欧智通\欧智通\OZT\K3Cloud\bin\LQKJ.PushAndSaveWebApi.Stub.dll
D:\AAA我的文件夹\代码\欧智通\欧智通\OZT\K3Cloud\bin\LQKJ.PushAndSaveWebApi.Stub.pdb
D:\AAA我的文件夹\代码\欧智通\欧智通\OZT\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.PushAndSaveWebApi.Stub.dll
D:\AAA我的文件夹\代码\欧智通\欧智通\OZT\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.PushAndSaveWebApi.Stub.pdb
D:\AAA我的文件夹\代码\新建文件夹\KingdeeCloudIntegrationInterface\K3Cloud\bin\LQKJ.WebApi.Stub.dll
D:\AAA我的文件夹\代码\新建文件夹\KingdeeCloudIntegrationInterface\K3Cloud\bin\LQKJ.WebApi.Stub.pdb
D:\AAA我的文件夹\代码\新建文件夹\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.csproj.CoreCompileInputs.cache
D:\AAA我的文件夹\代码\新建文件夹\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.csproj.CopyComplete
D:\AAA我的文件夹\代码\新建文件夹\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.dll
D:\AAA我的文件夹\代码\新建文件夹\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.pdb
D:\AAA我的文件夹\代码\新建文件夹\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.csproj.AssemblyReference.cache
D:\AAA我的文件夹\代码\新建文件夹1\KingdeeCloudIntegrationInterface\K3Cloud\bin\LQKJ.WebApi.Stub.dll
D:\AAA我的文件夹\代码\新建文件夹1\KingdeeCloudIntegrationInterface\K3Cloud\bin\LQKJ.WebApi.Stub.pdb
D:\AAA我的文件夹\代码\新建文件夹1\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.csproj.CoreCompileInputs.cache
D:\AAA我的文件夹\代码\新建文件夹1\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.csproj.CopyComplete
D:\AAA我的文件夹\代码\新建文件夹1\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.dll
D:\AAA我的文件夹\代码\新建文件夹1\KingdeeCloudIntegrationInterface\Code\LQKJ.WebApi.Stub\obj\Debug\LQKJ.WebApi.Stub.pdb

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31515.178
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LQKJ.WebApi.Stub", "LQKJ.WebApi.Stub.csproj", "{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6EA92A22-FAB9-4ACC-AC0E-D76EFA9BC67F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B8E1D3E5-83C3-4A91-9A2E-84EF5AC127F1}
EndGlobalSection
EndGlobal
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论