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

5042 lines
273 KiB

using CounsellorBL.BLStructure;
using CounsellorBL.Common;
using CounsellorBL.GROUP;
using CounsellorBL.Helper;
using CounsellorBL.ORD.ConstDefinition;
using MonumentDefine;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using OT.COM.ArsenalDB;
using OT.COM.ArsenalDB.SQL;
using OT.COM.SignalerMessage;
using SoldierData.EnterprizeV4;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using WebMvcEF.Extensions;
using static MonumentDefine.Enums;
using Util = OT.COM.LogisticsUtil.Util;
namespace CounsellorBL.ORD
{
public class OrderService : SingleDataTableTemplate<tb_ord_order_detail>
{
public OrderService()
{
dgReadCommandPostDataHandler = readCommandPostDataHandler;
dgUpdateCommandGenerator = updateCommandGenerator;
dgDeleteCommandGenerator = deleteCommandGenerator;
}
public new CResponseMessage Read(CRequestMessage i_crmInput) => base.Read(i_crmInput);
public new CResponseMessage Update(CRequestMessage i_crmInput) => base.Update(i_crmInput);
private class OrderDetail
{
public string name { get; set; }
public string article_name { get; set; }
public string uid { get; set; }
public string order_uid { get; set; }
public string article2product_uid { get; set; }
public string member_uid { get; set; }
public string member_name { get; set; }
public int order_qty { get; set; }
public int take_qty { get; set; }
public int price { get; set; }
public int wholesale_price { get; set; }
public int status { get; set; }
public string branch_name { get; set; }
public int qty { get; set; }
public string branch_uid { get; set; }
public int seq { get; set; }
public string memo { get; set; }
public DateTime comment_time { get; set; }
public int wprice_payment { get; set; }
public string order_name { get; set; }
public int purchase_amount { get; set; }
public string purchase_order_uid { get; set; }
public DateTime purchase_create_date { get; set; }
public string specification { get; set; }
public DateTime create_date { get; set; }
public string dutyfree{ get; set; }
public int branch_seq { get; set; }
}
private class GroupBranch
{
/// <summary>
/// 社團名稱
/// </summary>
public string name { get; set; }
public string branch_name { get; set; }
/// <summary>
/// 分店uid
/// </summary>
public string uid { get; set; }
public string address { get; set;}
public string phone_number { get; set; }
public string contact_person { get; set; }
}
private class OrderResultData
{
public List<OrderMaster> records { get; set; }
public int totalCount { get; set; }
};
[Auth(false)]
public CResponseMessage ReadDetail(CRequestMessage i_crmInput)
{
string sMsg = null;
Command cRes = null;
CResponseMessage crmRes = null;
try
{
do
{
var command = Command.SetupSelectCmd(new tb_meb_member(), new tb_meb_member());
Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
string[] aMemberUID = new string[0];
List<OrderDetail> allData = new List<OrderDetail>();
if (dicCondition.ContainsKey(tb_meb_member.CN_UID))
{
if (dicCondition[tb_meb_member.CN_UID] != null)
{
var jaMemberUID = dicCondition[tb_meb_member.CN_UID] as JArray;
aMemberUID = jaMemberUID.Select(x => x.ToString()).ToArray();
}
}
string[] slicedArray = aMemberUID.ToArray();
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeA = lBlocks.GetInst();
qjeA.table = tb_ord_order_detail.TABLENAME;
qjeA.displaycols = new List<string>()
{
tb_ord_order_detail.CN_ORDER_QTY,
tb_ord_order_detail.CN_TAKE_QTY,
tb_ord_order_detail.CN_STATUS,
tb_ord_order_detail.CN_MEMBER_UID,
tb_ord_order_detail.CN_SPECIFICATION,
tb_ord_order_detail.CN_COMMENT_TIME,
tb_ord_order_detail.CN_MEMO,
tb_ord_order_detail.CN_ORDER_UID
};
List<WhereNode> lswnMain = new List<WhereNode>();
if (dicCondition.ContainsKey(tb_ord_order_detail.CN_ORDER_UID))
{
var jaOrderUID = dicCondition[tb_ord_order_detail.CN_ORDER_UID] as JArray;
var aOrderUID = jaOrderUID.Select(x => x.ToString()).ToArray();
lswnMain.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), aOrderUID));
}
if (dicCondition.ContainsKey(tb_ord_order_detail.CN_STATUS))
{
lswnMain.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
}
if (lswnMain.Any())
{
qjeA.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray());
}
QueryJsonElement qjeMain = lBlocks.GetInst();
qjeMain.table = tb_ord_order_master.TABLENAME;
qjeMain.jointype = QueryJsonElement.JOIN;
qjeMain.jointable = qjeA;
qjeMain.joincols = new Dictionary<string, string>() {
{ tb_ord_order_master.CN_UID,tb_ord_order_detail.CN_ORDER_UID }};
qjeMain.displaycols = new List<string>()
{
tb_ord_order_master.CN_BRANCH_UID,
tb_ord_order_master.CN_ORDER_CODE
};
qjeMain.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "order_name" } }
};
if (!dicCondition.ContainsKey(tb_ord_order_detail.CN_ORDER_UID))
{
qjeMain.wherecols = new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive);
}
QueryJsonElement qjeB = lBlocks.GetInst();
qjeB.table = tb_meb_member.TABLENAME;
qjeB.jointype = QueryJsonElement.LEFT_JOIN;
qjeB.jointable = qjeA;
qjeB.joincols = new Dictionary<string, string>() {
{ tb_meb_member.CN_UID,tb_ord_order_detail.CN_MEMBER_UID }};
qjeB.displaycols = new List<string>()
{
tb_meb_member.CN_WPRICE_PAYMENT,
};
qjeB.aliascols = new Dictionary<string, List<string>>
{
{ tb_meb_member.CN_NAME, new List<string>() { "member_name" } }
};
List<WhereNode> lswnMainMeb = new List<WhereNode>();
if (dicCondition.ContainsKey(tb_meb_member.CN_GROUP_USER_ID) && dicCondition.ContainsKey(tb_meb_member.CN_GROUP_ID))
{
lswnMainMeb.Add(new WhereNode(tb_meb_member.CN_GROUP_USER_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), dicCondition[tb_meb_member.CN_GROUP_USER_ID]));
lswnMainMeb.Add(new WhereNode(tb_meb_member.CN_GROUP_ID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), dicCondition[tb_meb_member.CN_GROUP_ID]));
qjeB.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMainMeb.ToArray());
}
if (dicCondition.ContainsKey(tb_meb_member.CN_UID) && dicCondition[tb_meb_member.CN_UID] != null)
{
var dbTYpe = GetMasterDBTableInfo(typeof(tb_meb_member));
dbTYpe.ConnectString = command.ConnectString;
var existSql = Command.SetupDirectSelect(dbTYpe, $"select value from STRING_SPLIT('{string.Join(",", slicedArray)}', ',') where value = c.uid");
qjeB.wherecols = new WhereNode(null, WhereNode.EColumnOperation.EOT_EXISTS, typeof(tb_meb_member), existSql);
}
QueryJsonElement qjeC = lBlocks.GetInst();
qjeC.table = tb_grp_branch.TABLENAME;
qjeC.jointype = QueryJsonElement.LEFT_JOIN;
qjeC.jointable = qjeMain;
qjeC.joincols = new Dictionary<string, string>() {
{ tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
qjeC.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
QueryJsonElement qjeD = lBlocks.GetInst();
qjeD.table = tb_prd_article2product.TABLENAME;
qjeD.jointype = QueryJsonElement.LEFT_JOIN;
qjeD.jointable = qjeA;
qjeD.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeD.displaycols = new List<string>() {
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_WHOLESALE_PRICE,
tb_prd_article2product.CN_UID,
tb_prd_article2product.CN_SEQ
};
QueryJsonElement qjeE = lBlocks.GetInst();
qjeE.table = tb_grp_article.TABLENAME;
qjeE.jointype = QueryJsonElement.LEFT_JOIN;
qjeE.jointable = qjeD;
qjeE.joincols = new Dictionary<string, string>() {
{ tb_grp_article.CN_UID,tb_prd_article2product.CN_ARTICLE_UID }};
qjeE.displaycols = new List<string>() { tb_grp_article.CN_DUTYFREE };
qjeE.aliascols = new Dictionary<string, List<string>>
{
{ tb_grp_article.CN_NAME, new List<string>() { "article_name" } }
};
QueryJsonElement qjeF = lBlocks.GetInst();
qjeF.table = tb_ord_purchase_detail.TABLENAME;
qjeF.jointype = QueryJsonElement.LEFT_JOIN;
qjeF.jointable = qjeA;
qjeF.joincols = new Dictionary<string, string>() {
{ tb_ord_purchase_detail.CN_ORDER_DETAIL_UID,tb_ord_order_detail.CN_UID }};
qjeF.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_purchase_detail.CN_AMOUNT, new List<string>() { "purchase_amount" } },
{ tb_ord_purchase_detail.CN_ORDER_DETAIL_UID, new List<string>() { "purchase_order_uid" } }
};
lBlocks.Add(qjeA);
lBlocks.Add(qjeMain);
lBlocks.Add(qjeB);
lBlocks.Add(qjeC);
lBlocks.Add(qjeD);
lBlocks.Add(qjeE);
lBlocks.Add(qjeF);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
cRes.ReadLevel = Command.EReadLevel.ERL_DIRTY;
var qds = ai.RunQueryList<OrderDetail>(cRes);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Logger.Info("單次查詢耗時:" + elapsedTime);
if (cRes.IsSuccess == false)
{
sMsg = cRes.LastErrorCode;
break;
}
allData.AddRange(qds);
var groupData = allData.GroupBy(x => new { x.member_uid, x.member_name });
var oResultData = new List<List<OrderDetail>>();
foreach (var data in groupData)
{
var takedDataList = new List<OrderDetail>();
var arrivedGroup = data.GroupBy(x => x.purchase_order_uid);
foreach (var takedData in arrivedGroup)
{
if (takedData.Key == null)
{
takedDataList.AddRange(takedData);
}
else
{
takedDataList.Add(takedData.FirstOrDefault());
}
}
var pro = takedDataList.GroupBy(x => new { x.uid, x.order_uid, x.branch_uid, x.branch_name, x.status, x.specification})
.Select(x => new OrderDetail
{
order_qty = x.Sum(c => c.order_qty),
take_qty = x.Sum(c => c.take_qty),
price = x.Key.status == (int)Enums.OrderStatus.Taked ?
(
(x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().purchase_amount) /
(x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().take_qty)
) :
x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().price,
wholesale_price = x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().wholesale_price,
specification = x.Key.specification,
uid = x.Key.uid,
order_uid = x.Key.order_uid,
seq = x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().seq,
name = x.FirstOrDefault()?.name,
member_uid = x.FirstOrDefault()?.member_uid,
member_name = x.FirstOrDefault()?.member_name,
status = x.Key.status,
article_name = x.FirstOrDefault()?.article_name,
order_name = x.FirstOrDefault()?.order_name,
memo = x.FirstOrDefault()?.memo,
branch_uid = x.Key.branch_uid,
branch_name = x.Key.branch_name,
comment_time = x.FirstOrDefault() == null ? DateTime.MinValue : x.FirstOrDefault().comment_time,
wprice_payment = x.FirstOrDefault() == null ? 0 : x.FirstOrDefault().wprice_payment,
dutyfree = x.FirstOrDefault()?.dutyfree
})
.OrderBy(x => x.status).ToList();
oResultData.Add(pro);
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, oResultData);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(ReadDetail)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage GetOrderRecord(CRequestMessage i_crmInput)
{
string sMsg;
Command cRes = null;
CResponseMessage crmRes = null;
try
{
do
{
Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); // 取得condition
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeOrder = lBlocks.GetInst();
qjeOrder.table = tb_ord_order_detail.TABLENAME;
qjeOrder.displaycols = new List<string>()
{
tb_ord_order_detail.CN_ORDER_QTY,
tb_ord_order_detail.CN_TAKE_QTY,
tb_ord_order_detail.CN_STATUS,
tb_ord_order_detail.CN_CREATE_DATE,
tb_ord_order_detail.CN_OPERATE_DATE,
tb_ord_order_detail.CN_SPECIFICATION
};
qjeOrder.wherecols = new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicCondition[tb_ord_order_detail.CN_MEMBER_UID]);
QueryJsonElement qjeMain = lBlocks.GetInst();
qjeMain.table = tb_ord_order_master.TABLENAME;
qjeMain.jointype = QueryJsonElement.JOIN;
qjeMain.jointable = qjeOrder;
qjeMain.joincols = new Dictionary<string, string>() {
{ tb_ord_order_master.CN_UID,tb_ord_order_detail.CN_ORDER_UID }};
qjeMain.displaycols = new List<string>() { tb_ord_order_master.CN_BRANCH_UID };
qjeMain.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "order_name" } }
};
QueryJsonElement qjeBranch = lBlocks.GetInst();
qjeBranch.table = tb_grp_branch.TABLENAME;
qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
qjeBranch.jointable = qjeMain;
qjeBranch.joincols = new Dictionary<string, string>() {
{ tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
QueryJsonElement qjeArticle2Product = lBlocks.GetInst();
qjeArticle2Product.table = tb_prd_article2product.TABLENAME;
qjeArticle2Product.jointype = QueryJsonElement.LEFT_JOIN;
qjeArticle2Product.jointable = qjeOrder;
qjeArticle2Product.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeArticle2Product.displaycols = new List<string>() {
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_UID,
tb_prd_article2product.CN_SEQ,
};
QueryJsonElement qjeArticle = lBlocks.GetInst();
qjeArticle.table = tb_grp_article.TABLENAME;
qjeArticle.jointype = QueryJsonElement.LEFT_JOIN;
qjeArticle.jointable = qjeArticle2Product;
qjeArticle.joincols = new Dictionary<string, string>() {
{ tb_grp_article.CN_UID,tb_prd_article2product.CN_ARTICLE_UID }};
qjeArticle.aliascols = new Dictionary<string, List<string>>
{
{ tb_grp_article.CN_NAME, new List<string>() { "article_name" } }
};
lBlocks.Add(qjeOrder);
lBlocks.Add(qjeMain);
lBlocks.Add(qjeBranch);
lBlocks.Add(qjeArticle2Product);
lBlocks.Add(qjeArticle);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
var qds = ai.RunQueryList<OrderDetailEx>(cRes);
var groupData = qds.GroupBy(x => new { x.branch_uid, x.uid, x.specification });
var res = new List<OrderDetailEx>();
var processStatus = new List<int>() { (int)Enums.OrderStatus.Taked, (int)Enums.OrderStatus.Return, (int)Enums.OrderStatus.Abandon };
foreach (var row in groupData)
{
var dic = row.FirstOrDefault();
dic.order_qty = row.Sum(x => Convert.ToInt32(x.order_qty));
dic.take_qty = row.Sum(x => Convert.ToInt32(x.take_qty));
res.Add(dic);
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, res);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(GetOrderRecord)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
private class OrderMasterPage
{
public string uid { get; set; }
public int count { get; set; }
}
private class OrderMaster
{
public string uid { get; set; }
public string article_uid { get; set; }
public int sn { get; set; }
public string order_code { get; set; }
public string group_uid { get; set; }
public string branch_uid { get; set; }
public string branch_name { get; set; }
public string name { get; set; }
public int received { get; set; }
public int receivable { get; set; }
public int receivedOld { get; set; }
public int receivableOld { get; set; }
public string progress { get; set; }
public DateTime? create_date { get; set; }
public DateTime? arrived_date { get; set; }
public int status { get; set; }
public int type { get; set; }
public string remark { get; set; }
public string isSame { get; set; }
}
private class OrderDetailEx : OrderDetail
{
public string group_uid { get; set; }
public string article_uid { get; set; }
public string order_code { get; set; }
public int type { get; set; }
public int detail_status { get; set; }
public DateTime? arrived_date { get; set; }
public DateTime? operate_date { get; set; }
public int received { get; set; }
public int receivable { get; set; }
public string remark { get; set; }
}
protected string readCommandPostDataHandler(CRequestMessage i_crmInput, ArsenalInterface i_aiArsenal, Command i_cCmd, JArray i_jaData, tb_sys_session i_sSessionUser, out object o_oReault,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
{
int nPageIdx = -1;
int nPageNum = -1;
string sMsg = "";
object oResultData = null;
try
{
do
{
sMsg = getCommonParameter(i_crmInput, BLWording.QRY_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession, false);
if (sMsg != null)
{
break;
}
if (i_crmInput != null)
{
if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_IDX)
&& Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_IDX].ToString(), out int nPageIdxFromUI)
&& nPageIdxFromUI >= 0)
{
nPageIdx = nPageIdxFromUI;
}
if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_NUM)
&& Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_NUM].ToString(), out int nPageNumFromUI)
&& nPageNumFromUI >= 0)
{
nPageNum = nPageNumFromUI;
}
}
Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); // 取得condition
var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
var userBranch = ProjectHelper.GetUserBranch(i_crmInput);
var result = readCommandPostDataHandlerRefactor(i_crmInput, dicCondition, lsBranch, userBranch, nPageIdx, nPageNum);
//// 新舊資料比對
//readCommandPostDataHandlerOld(i_crmInput, i_aiArsenal, i_cCmd, i_jaData, i_sSessionUser, out object oldOrderResult);
//string json = JsonConvert.SerializeObject(oldOrderResult);
//OrderResultData re = JsonConvert.DeserializeObject<OrderResultData>(json);
////var OrderResultDataRecords = (oldOrderResult as OrderResultData).records;
//var OrderResultDataRecords = re.records;
//foreach (var entity in result.records)
//{
// if (OrderResultDataRecords.Select(x => x.uid).Contains(entity.uid))
// {
// entity.receivedOld = OrderResultDataRecords.Find(x => x.uid == entity.uid).received;
// entity.receivableOld = OrderResultDataRecords.Find(x => x.uid == entity.uid).receivable;
// entity.isSame = entity.receivedOld == entity.received && entity.receivableOld == entity.receivableOld ? "" : "failed";
// }
//}
oResultData = new { records = result.records, TotalCount = result.TotalCount };
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
sMsg = $"{nameof(readCommandPostDataHandler)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
o_oReault = oResultData;
return sMsg;
}
/// <summary>
/// 保留舊版, 測試用
/// </summary>
/// <returns></returns>
protected string readCommandPostDataHandlerOld(CRequestMessage i_crmInput, ArsenalInterface i_aiArsenal, Command i_cCmd, JArray i_jaData, tb_sys_session i_sSessionUser, out object o_oReault,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
{
string sMsg;
Command cRes = null;
Command cResOrderMst = null;
object oResultData = null;
try
{
do
{
sMsg = getCommonParameter(i_crmInput, BLWording.QRY_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession, false);
if (sMsg != null)
{
break;
}
int nPageIdx = -1;
int nPageNum = -1;
if (i_crmInput != null)
{
if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_IDX)
&& Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_IDX].ToString(), out int nPageIdxFromUI)
&& nPageIdxFromUI >= 0)
{
nPageIdx = nPageIdxFromUI;
}
if (i_crmInput.param.ContainsKey(BLWording.QRY_PAGE_NUM)
&& Int32.TryParse(i_crmInput.param[BLWording.QRY_PAGE_NUM].ToString(), out int nPageNumFromUI)
&& nPageNumFromUI >= 0)
{
nPageNum = nPageNumFromUI;
}
}
tb_ord_order_master om = new tb_ord_order_master();
om.SetFullDirty();
JObject jtDataItem = (JObject)jaDataArray[0];
List<Tuple<string, string>> ordercols = null;
if (jtDataItem.ContainsKey(BLWording.ORDERDATA))
{
List<Dictionary<string, string>> lDic = jtDataItem[BLWording.ORDERDATA].ToObject<List<Dictionary<string, string>>>();
List<Tuple<string, string>> ltss = new List<Tuple<string, string>>();
lDic.ForEach(f =>
{
string sKey = f.Keys.First();
ltss.Add(Tuple.Create(sKey, f[sKey]));
});
ordercols = ltss;
}
Command cOrder = Command.SetupSelectCmdByParam(om, null, i_ordercols: ordercols);
Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); // 取得condition
var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
var userBranch = ProjectHelper.GetUserBranch(i_crmInput);
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
bool isGroup = false;
QueryJsonElement qjeMain = lBlocks.GetInst();
qjeMain.table = tb_ord_order_master.TABLENAME;
qjeMain.displaycols = new List<string>() {
tb_ord_order_master.CN_UID
};
List<WhereNode> lswnMain = new List<WhereNode>();
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Purchase));
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), BLWording.STATUS_FLAG_ON));
if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_start"))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_start"]));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_end"))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_order_master), Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_end"]).AddDays(1)));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_STATUS))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_STATUS]));
}
else
{
// 扣除封存訂單
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_ORDER_CODE))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ORDER_CODE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_ORDER_CODE]));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_start"))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ARRIVED_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_start"]));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_end"))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ARRIVED_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_order_master), Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_end"]).AddDays(1)));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_UID))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_UID]));
}
List<WhereNode> lswnGroup = new List<WhereNode>();
if (dicCondition.ContainsKey(tb_ord_order_master.CN_GROUP_UID))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_GROUP_UID]));
}
else if (dicCondition.ContainsKey("GroupOrBranch_uid")) // 處理shopping list 搜尋選項 uid 有可能是branch or group
{
tb_grp_group cGroup = new tb_grp_group();
cGroup.SetFullDirty();
WhereNode wnGroup = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicCondition["GroupOrBranch_uid"].ToString());
Command gSelect = Command.SetupSelectCmd(cGroup, wnGroup);
ArsenalInterface aiGroup = ArsenalDBMgr.GetInst(gSelect);
var qdsGroup = aiGroup.RunQueryList<tb_grp_group>(gSelect);
if (qdsGroup.Any())
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition["GroupOrBranch_uid"].ToString()));
isGroup = true;
}
}
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), lsBranch.ToArray()));
if (dicCondition.ContainsKey(tb_ord_order_master.CN_BRANCH_UID))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString()));
}
else if (dicCondition.ContainsKey("GroupOrBranch_uid") && !isGroup)
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition["GroupOrBranch_uid"].ToString()));
}
else
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), userBranch.ToArray()));
}
QueryJsonElement qjeBranch = lBlocks.GetInst();
qjeBranch.table = tb_grp_branch.TABLENAME;
qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
qjeBranch.jointable = qjeMain;
qjeBranch.joincols = new Dictionary<string, string>() {
{ tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
Dictionary<string, string> mainOrderData = null;
string mainFullTextPattern = null;
if (i_crmInput != null && i_crmInput.param != null && i_crmInput.param.ContainsKey(BLWording.QRY_MASTER))
{
JArray joData = i_crmInput.param[BLWording.QRY_MASTER] as JArray;
if (joData.Any() && joData[0][BLWording.ORDERDATA] != null)
{
JArray jaData = joData[0][BLWording.ORDERDATA] as JArray;
mainOrderData = jaData[0].ToObject<Dictionary<string, string>>();
}
if (joData.Any() && joData[0][BLWording.FULLTEXT_PATTERN] != null)
{
mainFullTextPattern = joData[0][BLWording.FULLTEXT_PATTERN].ToString();
lswnMain.Add(new WhereNode(WhereNode.ENodeOperation.ENO_OR, new WhereNode[] { new WhereNode(tb_ord_order_master.CN_ORDER_CODE, WhereNode.EColumnOperation.EOT_LIKE, typeof(tb_ord_order_master), mainFullTextPattern),
new WhereNode(tb_ord_order_master.CN_NAME, WhereNode.EColumnOperation.EOT_LIKE, typeof(tb_ord_order_master), mainFullTextPattern) }));
}
}
if (lswnMain.Any())
{
qjeMain.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray());
}
List<Tuple<QueryJsonElement, string, string>> mainOrder = new List<Tuple<QueryJsonElement, string, string>>();
if (mainOrderData != null &&
(
mainOrderData.First().Key != "received" ||
mainOrderData.First().Key != "receivable"
)
)
{
if (mainOrderData.First().Key == tb_grp_branch.CN_BRANCH_NAME)
{
mainOrder.Add(Tuple.Create(qjeBranch, mainOrderData.First().Key, mainOrderData.First().Value));
}
else
{
mainOrder.Add(Tuple.Create(qjeMain, mainOrderData.First().Key, mainOrderData.First().Value));
}
}
else
{
mainOrder.Add(Tuple.Create(qjeMain, tb_ord_order_master.CN_CREATE_DATE, BLWording.ORDER_DESC));
}
qjeMain.ordercols = mainOrder;
lBlocks.Add(qjeMain);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cResOrderMst);
cResOrderMst.NeedCount = true;
ArsenalInterface ai = ArsenalDBMgr.GetInst(cResOrderMst);
var qdsOrderMst = ai.RunQueryDataSet(cResOrderMst, i_nPageIdx: nPageIdx, i_nNumOfPage: nPageNum);
List<string> orderMstArray = new List<string>();
foreach (DataRow data in qdsOrderMst.DATA.Tables[0].Rows)
{
orderMstArray.Add(data[tb_ord_order_master.CN_UID].ToString());
}
lBlocks = new QueryJsonElementCollection();
qjeMain = lBlocks.GetInst();
qjeMain.table = tb_ord_order_master.TABLENAME;
qjeMain.displaycols = new List<string>() {
tb_ord_order_master.CN_UID,
tb_ord_order_master.CN_TYPE,
tb_ord_order_master.CN_ORDER_CODE,
tb_ord_order_master.CN_STATUS,
tb_ord_order_master.CN_CREATE_DATE,
tb_ord_order_master.CN_GROUP_UID,
tb_ord_order_master.CN_BRANCH_UID,
tb_ord_order_master.CN_ARRIVED_DATE,
tb_ord_order_master.CN_ARTICLE_UID,
tb_ord_order_master.CN_NAME
};
qjeMain.wherecols = new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), orderMstArray.ToArray());
QueryJsonElement qjeOrder = lBlocks.GetInst();
qjeOrder.table = tb_ord_order_detail.TABLENAME;
qjeOrder.jointype = QueryJsonElement.LEFT_JOIN;
qjeOrder.jointable = qjeMain;
qjeOrder.joincols = new Dictionary<string, string>() {
{ tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
qjeOrder.displaycols = new List<string>() {
tb_ord_order_detail.CN_ORDER_QTY,
tb_ord_order_detail.CN_TAKE_QTY,
};
qjeOrder.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_detail.CN_STATUS, new List<string>() { "detail_status" } },
//{ QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
//{ QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } },
};
QueryJsonElement qjeGroup = lBlocks.GetInst();
qjeGroup.table = tb_grp_group.TABLENAME;
qjeGroup.jointype = QueryJsonElement.LEFT_JOIN;
qjeGroup.jointable = qjeMain;
qjeGroup.joincols = new Dictionary<string, string>() {
{ tb_grp_group.CN_UID,tb_ord_order_master.CN_GROUP_UID }};
qjeBranch = lBlocks.GetInst();
qjeBranch.table = tb_grp_branch.TABLENAME;
qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
qjeBranch.jointable = qjeMain;
qjeBranch.joincols = new Dictionary<string, string>() {
{ tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
QueryJsonElement qjeArticleProduct = lBlocks.GetInst();
qjeArticleProduct.table = tb_prd_article2product.TABLENAME;
qjeArticleProduct.jointype = QueryJsonElement.LEFT_JOIN;
qjeArticleProduct.jointable = qjeOrder;
qjeArticleProduct.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeArticleProduct.displaycols = new List<string>() {
tb_prd_article2product.CN_PRICE
};
if (dicCondition.ContainsKey(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID))
{
qjeArticleProduct.wherecols = new WhereNode(tb_prd_article2product.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_prd_article2product), dicCondition[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString());
}
QueryJsonElement qjePurchase = lBlocks.GetInst();
qjePurchase.table = tb_ord_purchase_detail.TABLENAME;
qjePurchase.jointype = QueryJsonElement.LEFT_JOIN;
qjePurchase.jointable = qjeOrder;
qjePurchase.joincols = new Dictionary<string, string>() {
{ tb_ord_purchase_detail.CN_ORDER_DETAIL_UID,tb_ord_order_detail.CN_UID }};
qjePurchase.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_purchase_detail.CN_AMOUNT, new List<string>() { "purchase_amount" } },
{ tb_ord_purchase_detail.CN_ORDER_DETAIL_UID, new List<string>() { "purchase_order_uid" } },
{ tb_ord_purchase_detail.CN_CREATE_DATE, new List<string>() { "purchase_create_date" } }
};
//qjeArticleProduct.groupcols = new List<Tuple<QueryJsonElement, string>>
//{
// Tuple.Create(qjeMain, tb_ord_order_master.CN_UID),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_ARTICLE_UID),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_TYPE),
// Tuple.Create(qjeMain,tb_ord_order_master.CN_STATUS),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_CREATE_DATE),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_ORDER_CODE),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_BRANCH_UID),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_ARRIVED_DATE),
// Tuple.Create(qjeMain, tb_grp_branch.CN_GROUP_UID),
// Tuple.Create(qjeMain, tb_grp_article.CN_NAME),
// Tuple.Create(qjeBranch, tb_grp_branch.CN_BRANCH_NAME),
// Tuple.Create(qjeArticleProduct, tb_prd_article2product.CN_PRICE)
//};
lBlocks.Add(qjeMain);
lBlocks.Add(qjeOrder);
lBlocks.Add(qjeGroup);
lBlocks.Add(qjeBranch);
lBlocks.Add(qjeArticleProduct);
lBlocks.Add(qjePurchase);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ai = ArsenalDBMgr.GetInst(cRes);
var qds = ai.RunQueryList<OrderDetailEx>(cRes);
var takedDataList = new List<OrderDetailEx>();
var arrivedGroup = qds.GroupBy(x => x.purchase_order_uid).ToList();
foreach (var takedData in arrivedGroup)
{
if (takedData.Key == null)
{
takedDataList.AddRange(takedData);
}
else
{
takedDataList.Add(takedData.OrderByDescending(x => x.purchase_create_date).FirstOrDefault());
}
}
var groupData = takedDataList.GroupBy(x => x.uid).ToList();
var res = new List<OrderMaster>();
foreach (var data in groupData)
{
//var received = string.IsNullOrEmpty(data["soldCount"]?.ToString()) || string.IsNullOrEmpty(data[tb_prd_article2product.CN_PRICE]?.ToString()) ? 0 : (int)data["soldCount"] * (int)data[tb_prd_article2product.CN_PRICE];
//var receivable = string.IsNullOrEmpty(?.ToString()) || string.IsNullOrEmpty(data[tb_prd_article2product.CN_PRICE]?.ToString()) ? 0 : (int)data["count"] * (int)data[tb_prd_article2product.CN_PRICE];
var received = 0;
var receivable = 0;
foreach (var detail in data)
{
if (detail.detail_status == (int)Enums.OrderStatus.Taked)
{
if (detail.take_qty != 0)
{
received += detail.purchase_amount;
receivable += detail.order_qty * detail.purchase_amount / detail.take_qty;
}
}
else
{
received += detail.take_qty * detail.price;
receivable += detail.order_qty * detail.price;
}
}
var orderDetail = data.FirstOrDefault();
var model = new OrderMaster()
{
uid = data.Key,
received = received,
receivable = receivable,
progress = receivable == 0 || received == 0 ? "0%" : Math.Round((decimal)received / receivable * 100, 0, MidpointRounding.AwayFromZero).ToString() + "%",
article_uid = orderDetail?.article_uid,
order_code = orderDetail?.order_code,
group_uid = orderDetail?.group_uid,
branch_uid = orderDetail?.branch_uid,
branch_name = orderDetail?.branch_name,
create_date = orderDetail?.create_date,
arrived_date = orderDetail?.arrived_date,
status = orderDetail == null ? 0 : orderDetail.status,
type = orderDetail == null ? 0 : orderDetail.type,
name = orderDetail.type == (int)Enums.ArticleType.Stock ? string.Format("【現貨】{0}", orderDetail?.name) : orderDetail?.name,
};
res.Add(model);
}
var orderData = res.OrderByDescending(x => x.create_date).ToList();
//var orderData = res.GroupBy(x => new
//{
// x.uid,
// x.article_uid,
// x.order_code,
// x.group_uid,
// x.branch_uid,
// x.branch_name,
// x.name,
// x.create_date,
// x.arrived_date,
// x.status,
// x.type
//}).Select(x => new OrderMaster
//{
// uid = x.Key.uid,
// article_uid = x.Key.article_uid,
// order_code = x.Key.order_code,
// group_uid = x.Key.group_uid,
// branch_uid = x.Key.branch_uid,
// branch_name = x.Key.branch_name,
// name = x.Key.name,
// received = x.Sum(c => c.received),
// receivable = x.Sum(c => c.receivable),
// progress = x.Sum(c => c.received) == 0 || x.Sum(c => c.receivable) == 0 ? "0%" : Math.Round((decimal)x.Sum(c => c.received) / x.Sum(c => c.receivable), 0, MidpointRounding.AwayFromZero).ToString() + "%",
// create_date = x.Key.create_date,
// arrived_date = x.Key.arrived_date,
// status = x.Key.status,
// type = x.Key.type
//}).OrderByDescending(x => x.create_date).ToList();
int sn = nPageIdx * nPageNum;
foreach (var d in orderData)
{
d.sn = ++sn;
}
oResultData = new { records = orderData, totalCount = qdsOrderMst.Total };
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
sMsg = $"{nameof(readCommandPostDataHandlerOld)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
o_oReault = oResultData;
return sMsg;
}
private string updateCommandGenerator(CRequestMessage i_crmInput, JArray i_jaData, tb_sys_session i_sSessionUser, out List<Command> o_lcCmds, List<string> i_saQryContainKeys,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
{
string sMsg = null;
List<Command> lCmds = new List<Command>();
ArsenalInterface ai = null;
try
{
do
{
var now = DateTime.Now;
foreach (JToken joData in i_jaData)
{
Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
if (!dicData.ContainsKey(tb_ord_order_master.CN_STATUS))
{
sMsg = "狀態錯誤";
break;
}
var status = Convert.ToInt32(dicData[tb_ord_order_master.CN_STATUS]);
JArray jwheredata = dicData[BLWording.WHEREDATA] as JArray;
foreach (JObject data in jwheredata)
{
var oData = data.ToObject<Dictionary<string, string>>();
string orderUID = oData[tb_ord_order_master.CN_UID];
string articleUID = oData.ContainsKey(tb_ord_order_master.CN_ARTICLE_UID) ? oData[tb_ord_order_master.CN_ARTICLE_UID] : null;
string branchUID = oData[tb_ord_incoming_return_record.CN_BRANCH_UID];
// 判斷現貨訂單到貨(現貨訂單沒有article_uid)
if (string.IsNullOrEmpty(articleUID))
{
if (status == (int)Enums.OrderMainStatus.Arrived)
{
// 查詢現貨數
tb_prd_article2product cPro = new tb_prd_article2product();
cPro.SetDirty(tb_prd_article2product.CN_UID, tb_prd_article2product.CN_QTY);
tb_prd_article2product cCon = new tb_prd_article2product() { order_uid = orderUID };
Command cSelect = Command.SetupSelectCmd(cPro, cCon);
ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_prd_article2product> qdsPro = ai.RunQueryList<tb_prd_article2product>(cSelect);
foreach (var product in qdsPro)
{
int productQty = GetOrderProductStock(orderUID, product.uid, product.specification);
if (product.qty > productQty)
{
// 新增進貨紀錄(訂單數量-已進貨量)
tb_ord_incoming_return_record cNew = new tb_ord_incoming_return_record()
{
article2product_uid = product.uid,
operating = (int)Enums.IncomingReturnOperating.Incoming,
qty = product.qty - productQty,
order_uid = orderUID,
};
lCmds.Add(Command.SetupInsertCmd(cNew));
}
// 更新到貨日期及狀態
tb_ord_order_master cArrived = new tb_ord_order_master() { arrived_date = DateTime.Now, status = (int)Enums.OrderMainStatus.Arrived };
tb_ord_order_master cArrivedCon = new tb_ord_order_master() { uid = orderUID };
lCmds.Add(Command.SetupUpdateCmd(cArrived, cArrivedCon));
}
}
else
{
tb_ord_order_master upData = new tb_ord_order_master() { status = status };
tb_ord_order_master upCon = new tb_ord_order_master() { uid = orderUID };
lCmds.Add(Command.SetupUpdateCmd(upData, upCon));
}
}
else
{
// 查詢訂單品項及數量
tb_ord_order_detail cOrder = new tb_ord_order_detail();
cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID,
tb_ord_order_detail.CN_TAKE_QTY, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_STATUS,
tb_ord_order_detail.CN_PRICE, tb_ord_order_detail.CN_MEMBER_UID, tb_ord_order_detail.CN_COMMENT_UID, tb_ord_order_detail.CN_COMMENT_TIME, tb_ord_order_detail.CN_SPECIFICATION);
tb_ord_order_detail cCon = new tb_ord_order_detail() { order_uid = orderUID };
Command cSelect = Command.SetupSelectCmd(cOrder, cCon);
ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
if (status == (int)Enums.OrderMainStatus.Arrived)
{
foreach (var product in qdsOrder.GroupBy(x => new { x.article2product_uid, x.specification }))
{
var orderQty = product.Sum(x => x.order_qty);
// 查詢商品已進貨數量
int productQty = GetOrderProductStock(orderUID, product.Key.article2product_uid, product.Key.specification);
if (orderQty > productQty)
{
// 新增進貨紀錄(訂單數量-已進貨量)
tb_ord_incoming_return_record cNew = new tb_ord_incoming_return_record()
{
article2product_uid = product.Key.article2product_uid,
operating = (int)Enums.IncomingReturnOperating.Incoming,
qty = orderQty - productQty,
order_uid = orderUID,
specification = product.Key.specification
};
lCmds.Add(Command.SetupInsertCmd(cNew));
}
// 更新order_detail.status
lCmds.AddRange(UpdateOrderIncomeReturnCmds(orderUID, product.Key.article2product_uid, product.Key.specification, (int)Enums.IncomingReturnOperating.Incoming, orderQty));
}
// 更新到貨日期及狀態
tb_ord_order_master cArrived = new tb_ord_order_master() { arrived_date = DateTime.Now, status = (int)Enums.OrderMainStatus.Arrived };
tb_ord_order_master cArrivedCon = new tb_ord_order_master() { uid = orderUID };
lCmds.Add(Command.SetupUpdateCmd(cArrived, cArrivedCon));
}
else // 封存
{
tb_ord_order_master upData = new tb_ord_order_master() { status = status };
tb_ord_order_master upCon = new tb_ord_order_master() { uid = orderUID };
lCmds.Add(Command.SetupUpdateCmd(upData, upCon));
foreach (var order in qdsOrder)
{
if (order.status == 1)
{
var indPrice = order.price / order.order_qty;
// 將原本訂單轉已收款 且數量為已收的數量
if (order.take_qty == 0)
{
tb_ord_order_detail upOrderDetail = new tb_ord_order_detail()
{
status = (int)Enums.OrderStatus.Return,
operate_date = now
};
tb_ord_order_detail upOrderDetailCon = new tb_ord_order_detail() { uid = order.uid };
lCmds.Add(Command.SetupUpdateCmd(upOrderDetail, upOrderDetailCon));
}
else if (order.take_qty > 0)
{
tb_ord_order_detail upOrderDetail = new tb_ord_order_detail()
{
status = (int)Enums.OrderStatus.Taked,
order_qty = order.take_qty,
take_qty = order.take_qty,
price = order.take_qty * indPrice,
operate_date = now
};
tb_ord_order_detail upOrderDetailCon = new tb_ord_order_detail() { uid = order.uid };
lCmds.Add(Command.SetupUpdateCmd(upOrderDetail, upOrderDetailCon));
string sNewArticleUid = Guid.NewGuid().ToString();
// 新增封存的Oder_detail 數量為剩下未收的數量
tb_ord_order_detail cNew = new tb_ord_order_detail()
{
uid = sNewArticleUid,
order_uid = orderUID,
article2product_uid = order.article2product_uid,
status = (int)Enums.OrderStatus.Return,
member_uid = order.member_uid,
order_qty = order.order_qty - order.take_qty,
take_qty = 0,
price = (order.order_qty - order.take_qty) * indPrice,
comment_uid = order.comment_uid,
comment_time = order.comment_time,
specification = order.specification,
operate_date = now
};
lCmds.Add(Command.SetupInsertCmd(cNew));
}
sMsg = getUpdateReturnCountCmd(order.member_uid, 1);
if (sMsg != null)
{
break;
}
}
}
}
}
}
}
if (sMsg != null)
{
break;
}
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_nCodeLine, i_sMemberName, i_sSourcePath);
Logger.Error(ex);
sMsg = $"{nameof(updateCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (!string.IsNullOrWhiteSpace(sMsg))
{
Logger.Error(sMsg);
}
o_lcCmds = lCmds;
return sMsg;
}
/// <summary>
/// 訂單彈窗內取得訂單數量及庫存
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
public CResponseMessage GetProduct(CRequestMessage i_crmInput)
{
string sMsg;
Command cRes = null;
CResponseMessage crmRes = null;
try
{
do
{
Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeA = lBlocks.GetInst();
qjeA.table = tb_ord_order_detail.TABLENAME;
qjeA.displaycols = new List<string>() {
tb_ord_order_detail.CN_SPECIFICATION,
};
qjeA.aliascols = new Dictionary<string, List<string>>
{
{ QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
{ QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } },
{ "' '", new List<string>() { "qty" } },
};
var orderUID = dicCondition[tb_ord_order_master.CN_UID].ToString();
qjeA.wherecols = new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), orderUID);
QueryJsonElement qjeD = lBlocks.GetInst();
qjeD.table = tb_prd_article2product.TABLENAME;
qjeD.jointype = QueryJsonElement.LEFT_JOIN;
qjeD.jointable = qjeA;
qjeD.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeD.displaycols = new List<string>() {
tb_prd_article2product.CN_UID,
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_SEQ
};
qjeD.groupcols = new List<Tuple<QueryJsonElement, string>>
{
Tuple.Create(qjeA, tb_ord_order_detail.CN_SPECIFICATION),
Tuple.Create(qjeD, tb_prd_article2product.CN_UID),
Tuple.Create(qjeD, tb_prd_article2product.CN_NAME),
Tuple.Create(qjeD, tb_prd_article2product.CN_PRICE),
Tuple.Create(qjeD, tb_prd_article2product.CN_SEQ)
};
qjeD.ordercols = new List<Tuple<QueryJsonElement, string, string>>()
{
Tuple.Create(qjeD, tb_prd_article2product.CN_SEQ,BLWording.ORDER_ASC)
};
lBlocks.Add(qjeA);
lBlocks.Add(qjeD);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
QueryDataSet qds = ai.RunQueryDataSet(cRes);
// 查詢進退貨紀錄
tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
cRecord.SetFullDirty();
tb_ord_incoming_return_record cCon = new tb_ord_incoming_return_record()
{
order_uid = orderUID
};
Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_incoming_return_record> qdsRecord = ai.RunQueryList<tb_ord_incoming_return_record>(cSelect);
if (qds.DATA.Tables.Count > 0)
{
foreach (DataRow data in qds.DATA.Tables[0].Rows)
{
var incomeQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Incoming && x.article2product_uid == data[tb_prd_article2product.CN_UID].ToString() && x.specification == data[tb_ord_order_detail.CN_SPECIFICATION].ToString()).Sum(x => x.qty);
var returnQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Return && x.article2product_uid == data[tb_prd_article2product.CN_UID].ToString() && x.specification == data[tb_ord_order_detail.CN_SPECIFICATION].ToString()).Sum(x => x.qty);
data["qty"] = incomeQty - returnQty;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, qds);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(GetProduct)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
/// <summary>
/// 現貨訂單已結團編輯頁顯示品項訂單數量及庫存量
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
public CResponseMessage GetStockOrderProduct(CRequestMessage i_crmInput)
{
string sMsg;
Command cRes = null;
CResponseMessage crmRes = null;
try
{
do
{
Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeA = lBlocks.GetInst();
qjeA.table = tb_ord_order_master.TABLENAME;
var orderUID = dicCondition[tb_ord_order_master.CN_UID].ToString();
qjeA.wherecols = new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), orderUID);
QueryJsonElement qjeProduct = lBlocks.GetInst();
qjeProduct.table = tb_prd_article2product.TABLENAME;
qjeProduct.jointype = QueryJsonElement.LEFT_JOIN;
qjeProduct.jointable = qjeA;
qjeProduct.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
qjeProduct.displaycols = new List<string>() {
tb_prd_article2product.CN_UID,
tb_prd_article2product.CN_SEQ,
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE
};
QueryJsonElement qjeDetail = lBlocks.GetInst();
qjeDetail.table = tb_ord_purchase_detail.TABLENAME;
qjeDetail.jointype = QueryJsonElement.LEFT_JOIN;
qjeDetail.jointable = qjeProduct;
qjeDetail.joincols = new Dictionary<string, string>() {
{ tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID,tb_prd_article2product.CN_UID }};
qjeDetail.aliascols = new Dictionary<string, List<string>>
{
{ QueryJsonElement.SUM(tb_ord_purchase_detail.CN_QTY), new List<string>() { "count"} },
{ "' '", new List<string>() { "qty"} }
};
qjeProduct.groupcols = new List<Tuple<QueryJsonElement, string>>
{
Tuple.Create(qjeProduct, tb_prd_article2product.CN_UID),
Tuple.Create(qjeProduct, tb_prd_article2product.CN_NAME),
Tuple.Create(qjeProduct, tb_prd_article2product.CN_PRICE),
Tuple.Create(qjeProduct, tb_prd_article2product.CN_SEQ)
};
qjeProduct.ordercols = new List<Tuple<QueryJsonElement, string, string>>()
{
Tuple.Create(qjeProduct, tb_prd_article2product.CN_SEQ,BLWording.ORDER_ASC)
};
lBlocks.Add(qjeA);
lBlocks.Add(qjeProduct);
lBlocks.Add(qjeDetail);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
QueryDataSet qds = ai.RunQueryDataSet(cRes);
tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
cRecord.SetFullDirty();
tb_ord_incoming_return_record cCon = new tb_ord_incoming_return_record()
{
order_uid = orderUID
};
Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_incoming_return_record> qdsRecord = ai.RunQueryList<tb_ord_incoming_return_record>(cSelect);
if (qds.DATA.Tables.Count > 0)
{
foreach (DataRow data in qds.DATA.Tables[0].Rows)
{
var incomeQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Incoming && x.article2product_uid == data[tb_prd_article2product.CN_UID].ToString()).Sum(x => x.qty);
var returnQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Return && x.article2product_uid == data[tb_prd_article2product.CN_UID].ToString()).Sum(x => x.qty);
data["count"] = string.IsNullOrEmpty(data["count"]?.ToString()) ? 0 : data["count"];
data["qty"] = incomeQty - returnQty;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, qds);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(GetProduct)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
private class ProductModel
{
public string article2product_uid { get; set; }
public int price { get; set; }
public bool isArticleName { get; set; }
public string specification { get; set; }
}
#region 列印功能
/// <summary>
/// 列印報表
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
public CResponseMessage Print(CRequestMessage i_crmInput)
{
string sMsg;
CResponseMessage crmRes = null;
try
{
do
{
// 填入報表
var printType = Convert.ToInt32(i_crmInput.param["printType"]);
var sPath = string.Empty;
switch (printType)
{
// 訂單統計報表
case 1:
sPath = GetStatisticalReportByPersonPath(i_crmInput);
break;
// 分店數量統計表
case 2:
sPath = GetStatisticalReportByBranchPath(i_crmInput);
break;
// 送單報表
case 3:
sPath = GetStatisticalReportBySendPath(i_crmInput);
break;
default:
break;
}
// 列印
sMsg = ReportExtension.ConvertToPdf(30, Path.Combine(AppDomain.CurrentDomain.BaseDirectory, sPath), out string sPdfPath);
if (sMsg != null)
{
break;
}
// 上傳檔案
FileUploadHelper fuh = new FileUploadHelper(GetFileUploadInfo(), i_crmInput);
sMsg = fuh.UploadLocalFile(sPdfPath, out tb_sys_uploadlog ulRes);
if (sMsg != null)
{
break;
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, new List<tb_sys_uploadlog>() { ulRes });
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(Print)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public class ReportDataModel
{
public string article2product_uid { get; set; }
public string specification { get; set; }
public int seq { get; set; }
}
/// <summary>
/// 取得統計報表資料
/// </summary>
/// <param name="i_crmInput"></param>
/// <param name="lsOrderDetail"></param>
/// <param name="dicQueryArrivedQty"></param>
/// <returns></returns>
private string GetStatisticalReportData(CRequestMessage i_crmInput, out List<OrderDetail> lsOrderDetail, out Dictionary<ReportDataModel, int> dicQueryArrivedQty)
{
string sMsg = null;
lsOrderDetail = new List<OrderDetail>();
dicQueryArrivedQty = new Dictionary<ReportDataModel, int>();
// 查詢資料
JArray jaData = i_crmInput.param[BLWording.QRY_MASTER] as JArray;
JArray jaWhereData = jaData[0][BLWording.WHEREDATA] as JArray;
string[] orderUIDs = jaWhereData.OfType<JObject>().Select(x => (x.TryGetValue(tb_ord_order_master.CN_UID, out JToken value) ? value : null)?.ToString()).Where(x => !string.IsNullOrEmpty(x)).ToArray();
// 查詢全部的訂單資訊
sMsg = GetOrderDetails(orderUIDs, false, out List<OrderDetail> allOrderDetail);
if (sMsg != null)
{
return sMsg;
}
// 查詢無訂單子表的訂單
var noDetailUIDs = allOrderDetail.Where(d => d.article2product_uid == null).Select(d => d.uid).ToArray();
List<OrderDetail> noDetailOrderDetail = new List<OrderDetail>();
if (noDetailUIDs.Count() > 0) {//添加此處防呆
sMsg = GetOrderDetails(noDetailUIDs, true, out noDetailOrderDetail);
if (sMsg != null)
{
return sMsg;
}
}
lsOrderDetail.AddRange(allOrderDetail.Where(d => d.article2product_uid != null));
lsOrderDetail.AddRange(noDetailOrderDetail.Where(d => d.article2product_uid != null));
// 紀錄分店商品的到貨數量
dicQueryArrivedQty = lsOrderDetail.GroupBy(x => new { x.uid, x.article2product_uid, x.specification, x.seq }).Select(g => new
{
g.Key.article2product_uid,
g.Key.specification,
g.Key.seq,
qty = GetOrderProductStock(g.Key.uid, g.Key.article2product_uid, g.Key.specification)
}).GroupBy(g => new { g.article2product_uid, g.specification, g.seq }).ToDictionary(g => new ReportDataModel() { article2product_uid = g.Key.article2product_uid, specification = g.Key.specification, seq = g.Key.seq }, g => g.Sum(x => x.qty));
return sMsg;
}
/// <summary>
/// 查詢訂單資訊,根據有沒有Detail查詢不同東西
/// </summary>
/// <param name="orderUIDs"></param>
/// <param name="isNoDetail"></param>
/// <param name="orderDetails"></param>
/// <returns></returns>
private string GetOrderDetails(string[] orderUIDs, bool isNoDetail, out List<OrderDetail> orderDetails)
{
orderDetails = new List<OrderDetail>();
// 撰寫QJE
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
// 訂單主表資訊
QueryJsonElement qjeOrderMaster = lBlocks.GetInst();
qjeOrderMaster.table = tb_ord_order_master.TABLENAME;
qjeOrderMaster.displaycols = new List<string>()
{
tb_ord_order_master.CN_BRANCH_UID,
tb_ord_order_master.CN_UID,
tb_ord_order_master.CN_CREATE_DATE
};
qjeOrderMaster.wherecols = new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), orderUIDs);
qjeOrderMaster.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "article_name" } }
};
lBlocks.Add(qjeOrderMaster);
// 訂單社團
QueryJsonElement qjeBranch = lBlocks.GetInst();
qjeBranch.table = tb_grp_branch.TABLENAME;
qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
qjeBranch.jointable = qjeOrderMaster;
qjeBranch.joincols = new Dictionary<string, string>()
{
{ tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }
};
qjeBranch.displaycols = new List<string>()
{
tb_grp_branch.CN_BRANCH_NAME
};
qjeBranch.aliascols = new Dictionary<string, List<string>>
{
{ tb_grp_branch.CN_SEQ, new List<string>() { "branch_seq" } }
};
lBlocks.Add(qjeBranch);
// 若是沒有OrderDetail則直接查Article2Product
QueryJsonElement qjeOrderDetail = lBlocks.GetInst();
if (!isNoDetail)
{
// 訂單子表
qjeOrderDetail.table = tb_ord_order_detail.TABLENAME;
qjeOrderDetail.jointype = QueryJsonElement.LEFT_JOIN;
qjeOrderDetail.jointable = qjeOrderMaster;
qjeOrderDetail.joincols = new Dictionary<string, string>()
{
{ tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }
};
qjeOrderDetail.displaycols = new List<string>()
{
tb_ord_order_detail.CN_ORDER_QTY,
tb_ord_order_detail.CN_TAKE_QTY,
tb_ord_order_detail.CN_STATUS,
tb_ord_order_detail.CN_MEMBER_UID,
tb_ord_order_detail.CN_SPECIFICATION,
tb_ord_order_detail.CN_CREATE_DATE
};
lBlocks.Add(qjeOrderDetail);
// 會員帳號
QueryJsonElement qjeMember = lBlocks.GetInst();
qjeMember.table = tb_meb_member.TABLENAME;
qjeMember.jointype = QueryJsonElement.LEFT_JOIN;
qjeMember.jointable = qjeOrderDetail;
qjeMember.joincols = new Dictionary<string, string>()
{
{ tb_meb_member.CN_UID,tb_ord_order_detail.CN_MEMBER_UID }
};
qjeMember.aliascols = new Dictionary<string, List<string>>
{
{ tb_meb_member.CN_NAME, new List<string>() { "member_name" } }
};
lBlocks.Add(qjeMember);
}
// 留言商品
QueryJsonElement qjeArticle2Product = lBlocks.GetInst();
var article2ProductJoincols = new Dictionary<string, string>();
if (isNoDetail)
{
article2ProductJoincols.Add(tb_prd_article2product.CN_ORDER_UID, tb_ord_order_master.CN_UID);
}
else
{
article2ProductJoincols.Add(tb_prd_article2product.CN_UID, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID);
}
qjeArticle2Product.table = tb_prd_article2product.TABLENAME;
qjeArticle2Product.jointype = QueryJsonElement.LEFT_JOIN;
qjeArticle2Product.jointable = isNoDetail ? qjeOrderMaster : qjeOrderDetail;
qjeArticle2Product.joincols = article2ProductJoincols;
qjeArticle2Product.displaycols = new List<string>()
{
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_QTY,
tb_prd_article2product.CN_SEQ
};
qjeArticle2Product.aliascols = new Dictionary<string, List<string>>
{
{ tb_prd_article2product.CN_UID, new List<string>() { "article2product_uid" } }
};
lBlocks.Add(qjeArticle2Product);
string sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null)
{
return sMsg;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
orderDetails = ai.RunQueryList<OrderDetail>(cRes).OrderBy(x => x.create_date).ThenBy(x => x.seq).ToList();
return sMsg;
}
/// <summary>
/// 訂單統計報表
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
private string GetStatisticalReportByPersonPath(CRequestMessage i_crmInput)
{
// 取回資料並整理資料
_ = GetStatisticalReportData(i_crmInput, out List<OrderDetail> lsOrderDetail, out Dictionary<ReportDataModel, int> dicQueryArrivedQty);
var groupData = lsOrderDetail.GroupBy(x => new { x.member_uid, x.member_name, x.branch_uid }).ToList();
// 套表
var sb = new StringBuilder();
string sPath = NpoiExtension.Report("訂單統計報表", (sheet) =>
{
var check = "R";
var uncheck = "£";
// 特殊符號字型
var Wingdings2Font = (XSSFFont)sheet.Workbook.CreateFont();
Wingdings2Font.FontName = "Wingdings 2";
Wingdings2Font.FontHeightInPoints = 12;
// 開始撰寫Excel
var row = 1;
var titleRow = row;
sheet.Cell(row++, 0).SetCellValue(""); // 商品名稱
row++; // 標題列
// 複製Row,因為現貨訂單若未有人訂貨則不會有order_detail且不會有member_uid,故在畫面上濾掉
var addRowCount = groupData.Count(g => !string.IsNullOrEmpty(g.Key.member_uid)) - 1;
sheet.InsertRow(row, 1, addRowCount);
// 撰寫商品列表,用foreach的原因是因為在這個情形計算index會比用for迴圈正確
var dicProductItem = new Dictionary<string, ProductModel>(); // 商品列表(名稱、{商品uid,單價})
var productIndex = 0;
foreach (var groupMember in groupData)
{
sb.Clear();
// 登記品項
var total = 0;
var itemNo = 1;
var liPosition = new List<int>();
var groupProduct = groupMember.GroupBy(x => new { x.article2product_uid, x.article_name, x.name, x.price, x.specification });
var itemCount = groupProduct.Count(); // 會員有幾項商品
foreach (var p in groupProduct)
{
bool isArticleName = string.IsNullOrEmpty(p.Key.name);
var specification = p.Key.specification == null ? "" : p.Key.specification;
var itemName = isArticleName ? p.Key.article_name : p.Key.article_name + "(" + p.Key.name + " " + specification + ")";
if (!dicProductItem.ContainsKey(itemName))
{
dicProductItem.Add(itemName, new ProductModel
{
article2product_uid = p.Key.article2product_uid,
price = p.Key.price,
isArticleName = isArticleName,
specification = p.Key.specification
});
}
liPosition.Add(sb.Length);
var orderQty = p.Sum(x => x.order_qty);
var takeQty = p.Sum(x => x.take_qty);
sb.AppendFormat("{0}{1} x {2}{3}", orderQty == takeQty ? check : uncheck, itemName, orderQty, itemNo < itemCount ? "\r\n" : "");
total += p.Key.price * orderQty;
itemNo++;
}
var richText = new XSSFRichTextString(sb.ToString());
foreach (var index in liPosition)
{
richText.ApplyFont(index, index + 1, Wingdings2Font);
}
// 填入EXCEL
var cell = 0;
if (!string.IsNullOrEmpty(groupMember.Key.member_uid))
{
sheet.Cell(row, cell++).SetCellValue(productIndex += 1); // NO
sheet.Cell(row, cell++).SetCellValue(groupMember.Select(x => x.branch_name).FirstOrDefault()); // 分區
sheet.Cell(row, cell++).SetCellValue(groupMember.Key.member_name); // 臉書帳號名
sheet.Cell(row, cell++).SetCellValue(richText);
sheet.Cell(row, cell++).SetCellValue(string.Format("{0}元", total)); // 金額
sheet.Cell(row, cell).SetCellValue(groupMember.Any(x => x.status == (int)Enums.OrderStatus.NotArrived) ? "N" : "Y"); // 到貨
sheet.AutoHeight(row++);
}
}
// 計算訂單數量、剩餘庫存數量、實際到貨數量總計
var lsOrder = new List<string>();
var orderTotal = 0;
var lsStock = new List<string>();
var stockTotal = 0;
var lsArrivedCount = new List<string>();
var arriverTotal = 0;
foreach (var item in dicProductItem)
{
string specification = item.Value.specification;
var orderCount = lsOrderDetail.Where(x => x.article2product_uid == item.Value.article2product_uid && x.specification == item.Value.specification).Sum(x => x.order_qty);
var arriverCount = dicQueryArrivedQty.Where(x => x.Key.article2product_uid == dicProductItem[item.Key].article2product_uid && x.Key.specification == dicProductItem[item.Key].specification).Sum(x => x.Value);
var stockCount = arriverCount - lsOrderDetail.Where(x => x.article2product_uid == item.Value.article2product_uid).Sum(x => x.take_qty);
lsOrder.Add(string.Format("{0} x {1}", item.Key, orderCount));
orderTotal += orderCount * dicProductItem[item.Key].price;
lsStock.Add(string.Format("{0} x {1}", item.Key, stockCount)); //item.Key? itemName?
stockTotal += stockCount * dicProductItem[item.Key].price;
lsArrivedCount.Add(string.Format("{0} x {1}", item.Key, arriverCount));
arriverTotal += arriverCount * dicProductItem[item.Key].price;
}
// 訂單數量、金額
string order = string.Join("\r\n", lsOrder);
ICell orderCell = sheet.Cell(row, 3);
orderCell.SetCellValue(order);
orderCell.CellStyle.WrapText = true;
sheet.Cell(row, 4).SetCellValue(string.Format("{0}元", orderTotal));
sheet.AutoHeight(row++);
// 剩餘庫存量、金額
string stock = string.Join("\r\n", lsStock);
ICell stockCell = sheet.Cell(row, 3);
stockCell.SetCellValue(stock);
stockCell.CellStyle.WrapText = true;
sheet.Cell(row, 4).SetCellValue(string.Format("{0}元", stockTotal));
sheet.AutoHeight(row++);
// 實際到貨數量、金額
string arrivedCount = string.Join("\r\n", lsArrivedCount);
ICell arrivedCountCell = sheet.Cell(row, 3);
arrivedCountCell.SetCellValue(arrivedCount);
arrivedCountCell.CellStyle.WrapText = true;
sheet.Cell(row, 4).SetCellValue(string.Format("{0}元", arriverTotal));
sheet.AutoHeight(row);
// 如果為同商品則顯示商品名稱,否則刪除名稱列
if (lsOrderDetail.GroupBy(x => x.article_name).Count() == 1)
{
sheet.Cell(titleRow, 0).SetCellValue(lsOrderDetail.GroupBy(x => x.article_name).Select(x => x.Key).FirstOrDefault());
}
else
{
sheet.ClearRow(titleRow, 1, true);
}
});
return sPath;
}
/// <summary>
/// 分店數量統計表
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
private string GetStatisticalReportByBranchPath(CRequestMessage i_crmInput)
{
// 取回資料並整理資料
_ = GetStatisticalReportData(i_crmInput, out List<OrderDetail> lsOrderDetail, out Dictionary<ReportDataModel, int> dicQueryArrivedQty);
var branchProducts = lsOrderDetail.GroupBy(x => new { x.branch_uid, x.branch_name, x.article2product_uid, x.article_name, x.name, x.specification, x.seq }).Select(g =>
{
var qty = g.Sum(x => x.order_qty);
var specification = g.Key.specification == null ? "" : g.Key.specification;
return new
{
g.Key.branch_uid,
g.Key.branch_name,
g.Key.article2product_uid,
g.Key.seq,
article_name = string.IsNullOrEmpty(g.Key.name) ? g.Key.article_name : string.Format("{0}({1})", g.Key.article_name, g.Key.name + " " + specification),
qty,
};
});
var allBranchs = branchProducts.GroupBy(x => new { x.branch_uid, x.branch_name }).ToArray();
var totalProducts = branchProducts.GroupBy(x => new { x.article2product_uid, x.article_name, x.seq }).Select(g => new
{
g.Key.article_name,
g.Key.seq,
qty = g.Sum(x => (int?)x.qty) ?? 0,
}).ToArray();
// 套表
string sPath = NpoiExtension.Report("分店數量統計表", (sheet) =>
{
var rowNumber = 1;
int firstRowNumber, lastRowNumber;
IRow row;
// 分店處理
sheet.InsertRow(rowNumber, count: allBranchs.Count() - 1);
foreach (var branch in allBranchs)
{
firstRowNumber = rowNumber;
// 寫入分店商品資料
sheet.InsertRow(rowNumber, count: branch.Count() - 1);
foreach (var product in branch)
{
row = sheet.GetRow(rowNumber);
row.GetCell(1).SetCellValue(product.article_name);
row.GetCell(2).SetCellValue(product.qty);
sheet.AutoHeight(rowNumber++);
}
// 寫入分店資訊
row = sheet.GetRow(firstRowNumber);
row.GetCell(0).SetCellValue(string.Format("【{0}】", branch.Key.branch_name));
// 合併儲存格
lastRowNumber = rowNumber - 1;
sheet.AddMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, 0, 0));
}
// 總計資料
firstRowNumber = rowNumber;
// 寫入總計商品資料
sheet.InsertRow(rowNumber, count: totalProducts.Count() - 1);
foreach (var product in totalProducts.OrderBy(x => x.seq))
{
row = sheet.GetRow(rowNumber);
row.GetCell(1).SetCellValue(product.article_name);
row.GetCell(2).SetCellValue(product.qty);
sheet.AutoHeight(rowNumber++);
}
// 合併儲存格
lastRowNumber = rowNumber - 1;
sheet.AddMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, 0, 0));
});
return sPath;
}
/// <summary>
/// 送單報表
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
private string GetStatisticalReportBySendPath(CRequestMessage i_crmInput)
{
// 取回資料並整理資料
_ = GetStatisticalReportData(i_crmInput, out List<OrderDetail> lsOrderDetail, out Dictionary<ReportDataModel, int> dicQueryArrivedQty);
var BranchGroupList = GetBranchGroupList();// 取回分店與社團的對應
var branchProducts = lsOrderDetail.GroupBy(x => new { x.branch_uid, x.branch_name, x.article2product_uid, x.article_name, x.name, x.specification, x.seq, x.branch_seq }).Select(g =>
{
var qty = g.Sum(x => x.order_qty);
var specification = g.Key.specification == null ? "" : g.Key.specification;
return new
{
g.Key.branch_uid,
g.Key.branch_name,
g.Key.article2product_uid,
g.Key.seq,
article_name = string.IsNullOrEmpty(g.Key.name) ? g.Key.article_name : string.Format("{0}({1})", g.Key.article_name, g.Key.name + " " + specification),
qty,
group_name = BranchGroupList.Find(item => item.uid == g.Key.branch_uid)?.name,
branch_seq = g.Key.branch_seq
};
}).OrderBy(g => g.group_name).ThenBy(g => g.branch_seq).ThenBy(item => item.branch_uid);
var totalProducts = branchProducts.GroupBy(x => new { x.article_name, x.seq }).Select(g => new
{
g.Key.article_name,
g.Key.seq,
qty = g.Sum(x => (int?)x.qty) ?? 0,
}).OrderBy(x => x.article_name).ToArray();
// 所有商品的社團總數
var GroupCount = branchProducts.GroupBy(x => new { x.group_name }).Count();
// 所有商品的分店總數
var BranchCount = branchProducts.GroupBy(x => new { x.branch_uid }).Count();
// 套表
string sPath = NpoiExtension.Report("送單報表", (sheet) =>
{
var rowNumber = 0;
IRow row;
// 分店商品資料
sheet.InsertRow(rowNumber, count: branchProducts.Count() + GroupCount + (BranchCount * 3));// 總行數
var previousGroupName = "";// 上一個社團名稱
var previousBranchGuid = "";// 上一個分店uid
var firstData = true;// 是第一筆資料
foreach (var product in branchProducts)
{
if (!firstData && !product.branch_uid.Equals(previousBranchGuid))// 分店分隔符號
{
row = sheet.GetRow(rowNumber++);
row.GetCell(0).SetCellValue(new string('-', 30 * 2));
row = sheet.GetRow(rowNumber++);
}
//insert group title name
if (!product.group_name.Equals(previousGroupName))
{
row = sheet.GetRow(rowNumber++);
row.GetCell(0).SetCellValue(string.Format("【{0}】", product.group_name));
}
//insert branch divider and address
if (!product.branch_uid.Equals(previousBranchGuid))
{
row = sheet.GetRow(rowNumber++);
var currentBranch = BranchGroupList.Find(x => x.uid == product.branch_uid);
row.GetCell(0).SetCellValue(string.Format("【聯絡方式】{0} {1} {2}", currentBranch?.address, $"{currentBranch?.phone_number}", $"{currentBranch?.contact_person}"));
}
previousGroupName = product.group_name;
previousBranchGuid = product.branch_uid;
firstData = false;
row = sheet.GetRow(rowNumber++);
row.GetCell(0).SetCellValue(string.Format("【{0}】{1} x {2}", product.branch_name, product.article_name, product.qty));
}
// 分店分隔符號
row = sheet.GetRow(rowNumber++);
row.GetCell(0).SetCellValue(new string('-', 30 * 2));
row = sheet.GetRow(rowNumber++);
// 寫入總計商品資料
sheet.InsertRow(rowNumber, count: totalProducts.Count());
foreach (var product in totalProducts)
{
row = sheet.GetRow(rowNumber++);
row.GetCell(0).SetCellValue(string.Format("【總計】{0} x {1}", product.article_name, product.qty));
}
});
return sPath;
}
#endregion 列印功能
protected string deleteCommandGenerator(CRequestMessage i_crmInput, JArray i_jaItems, tb_sys_session i_sSessionUser, out List<Command> o_lcResult, List<string> i_saQryContainKeys,
[System.Runtime.CompilerServices.CallerLineNumber] int i_nCodeLine = 0,
[System.Runtime.CompilerServices.CallerMemberName] string i_sMemberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string i_sSourcePath = "")
{
string sMsg = null;
List<Command> lcCmds = new List<Command>();
Command cRes = null;
try
{
do
{
foreach (JToken jtkItem in i_jaItems)
{
Dictionary<string, object> dicItem = jtkItem.ToObject<Dictionary<string, object>>();
sMsg = getManualLog(i_crmInput, dicItem, BLWording.LOG_ACTION_NAME_DELETESQL, out Command cLog);
if (sMsg != null)
{
break;
}
if (cLog != null)
{
lcCmds.Add(cLog);
}
string sMstUID = null;
if (dicItem.ContainsKey(BLWording.WHEREDATA) && dicItem[BLWording.WHEREDATA] is JObject wheredata)
{
Dictionary<string, object> wheredataDic = wheredata.ToObject<Dictionary<string, object>>();
if (wheredataDic.ContainsKey(tb_ord_order_master.CN_UID))
{
sMstUID = wheredataDic[tb_ord_order_master.CN_UID].ToString();
// 查詢orderdeatil
tb_ord_order_detail cOrder = new tb_ord_order_detail();
cOrder.SetDirty(tb_ord_order_detail.CN_COMMENT_UID, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID);
tb_ord_order_detail cOrderCon = new tb_ord_order_detail() { order_uid = sMstUID };
Command cSelect = Command.SetupSelectCmd(cOrder, cOrderCon);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
tb_ord_order_master cOrderMasterMain = new tb_ord_order_master();
cOrderMasterMain.SetDirty(tb_ord_order_master.CN_TYPE);
tb_ord_order_master cConMaster = new tb_ord_order_master()
{
uid = sMstUID,
};
Command cSelectMaster = Command.SetupSelectCmd(cOrderMasterMain, cConMaster);
ArsenalInterface aiMaster = ArsenalDBMgr.GetInst(cSelectMaster);
List<tb_ord_order_master> qdsOrderMasterMain = aiMaster.RunQueryList<tb_ord_order_master>(cSelectMaster);
// 判斷是否為現貨訂單
if (qdsOrderMasterMain[0].type == (int)Enums.ArticleType.Stock)
{
tb_prd_article2product cOrderProduct = new tb_prd_article2product();
cOrderProduct.SetDirty(tb_prd_article2product.CN_UID);
tb_prd_article2product cConProduct = new tb_prd_article2product()
{
order_uid = sMstUID,
};
Command cSelectProduct = Command.SetupSelectCmd(cOrderProduct, cConProduct);
ArsenalInterface aiProduct = ArsenalDBMgr.GetInst(cSelectProduct);
List<tb_prd_article2product> qdsProduct = aiProduct.RunQueryList<tb_prd_article2product>(cSelectProduct);
List<string> productUid = new List<string>();
foreach (var product in qdsProduct)
{
productUid.Add(product.uid);
}
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeA = lBlocks.GetInst();
qjeA.table = tb_ord_order_master.TABLENAME;
qjeA.displaycols = new List<string>() {
tb_ord_order_master.CN_UID
};
QueryJsonElement qjeDetail = lBlocks.GetInst();
qjeDetail.table = tb_ord_order_detail.TABLENAME;
qjeDetail.jointype = QueryJsonElement.LEFT_JOIN;
qjeDetail.jointable = qjeA;
qjeDetail.joincols = new Dictionary<string, string>() {
{ tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
QueryJsonElement qjeProduct = lBlocks.GetInst();
qjeProduct.table = tb_prd_article2product.TABLENAME;
qjeProduct.jointype = QueryJsonElement.LEFT_JOIN;
qjeProduct.jointable = qjeDetail;
qjeProduct.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeProduct.wherecols = new WhereNode(tb_prd_article2product.CN_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_prd_article2product), productUid.ToArray());
lBlocks.Add(qjeA);
lBlocks.Add(qjeDetail);
lBlocks.Add(qjeProduct);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ArsenalInterface ai2 = ArsenalDBMgr.GetInst(cRes);
List<tb_ord_order_master> qdsMaster = aiProduct.RunQueryList<tb_ord_order_master>(cRes);
foreach (var master in qdsMaster)
{
tb_ord_order_master updateMaster1 = new tb_ord_order_master { status_flag = BLWording.STATUS_FLAG_OFF };
tb_ord_order_master updateMasterCond1 = new tb_ord_order_master { uid = master.uid };
lcCmds.Add(Command.SetupUpdateCmd(updateMaster1, updateMasterCond1));
}
tb_ord_order_master updateMaster = new tb_ord_order_master { status_flag = BLWording.STATUS_FLAG_OFF };
tb_ord_order_master updateMasterCond = new tb_ord_order_master { uid = sMstUID };
lcCmds.Add(Command.SetupUpdateCmd(updateMaster, updateMasterCond));
continue;
}
// 刪除order
lcCmds.Add(Command.SetupDeleteCmd(new tb_ord_order_master() { uid = sMstUID }));
// 刪除comment
foreach (var c in qdsOrder)
{
lcCmds.Add(Command.SetupDeleteCmd(new tb_grp_comment() { uid = c.comment_uid }));
}
// 得到該article_uid
tb_prd_article2product aOrder = new tb_prd_article2product();
aOrder.SetDirty(tb_prd_article2product.CN_ARTICLE_UID);
tb_prd_article2product aCon = new tb_prd_article2product()
{
uid = qdsOrder[0].article2product_uid
};
Command aSelect = Command.SetupSelectCmd(aOrder, aCon);
ArsenalInterface aiArticle = ArsenalDBMgr.GetInst(aSelect);
List<tb_prd_article2product> qdsArticle = aiArticle.RunQueryList<tb_prd_article2product>(aSelect);
// 查詢order master 該article有幾筆
tb_ord_order_master cOrderMaster = new tb_ord_order_master();
cOrderMaster.SetDirty(tb_ord_order_master.CN_UID, tb_ord_order_master.CN_STATUS);
tb_ord_order_master cOrderMasterCon = new tb_ord_order_master() { article_uid = qdsArticle[0].article_uid };
Command oSelect = Command.SetupSelectCmd(cOrderMaster, cOrderMasterCon);
ArsenalInterface aiO = ArsenalDBMgr.GetInst(oSelect);
List<tb_ord_order_master> qdsOrderMaster = aiO.RunQueryList<tb_ord_order_master>(oSelect);
if (qdsOrderMaster.Count == 1)
{
// 將 post_status 更改回 貼文完成
tb_grp_article updateArticle = new tb_grp_article { post_status = (int)EPostStatus.EPS_ORDER };
tb_grp_article updateArticleCond = new tb_grp_article { uid = qdsArticle[0].article_uid };
lcCmds.Add(Command.SetupUpdateCmd(updateArticle, updateArticleCond));
}
else
{
// 判斷除此訂單外是否有已到貨訂單
var arrivedCount = qdsOrderMaster.Where(x => x.status == 2 && x.uid != sMstUID).ToList().Count;
// 將post_status 改回已結單
if (arrivedCount < 1)
{
tb_grp_article updateArticle = new tb_grp_article { post_status = (int)EPostStatus.EPS_ORDER };
tb_grp_article updateArticleCond = new tb_grp_article { uid = qdsArticle[0].article_uid };
lcCmds.Add(Command.SetupUpdateCmd(updateArticle, updateArticleCond));
}
}
}
}
}
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex), i_crmInput);
sMsg = $"{nameof(deleteCommandGenerator)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. Call from {i_sMemberName} {i_sSourcePath}({i_nCodeLine}).";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
o_lcResult = lcCmds;
return sMsg;
}
/// <summary>
/// 新增現貨訂單
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
public CResponseMessage CreateStockOrder(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmds = new List<Command>();
CResponseMessage crmRes = null;
try
{
do
{
JArray jaData = i_crmInput.param[BLWording.ADD_MASTER] as JArray;
JObject joData = jaData[0][BLWording.DATA] as JObject;
Dictionary<string, object> dicInput = joData.ToObject<Dictionary<string, object>>();
// 判斷為社團ID還是分店ID
tb_grp_branch cBranch = new tb_grp_branch();
cBranch.SetDirty(tb_grp_branch.CN_GROUP_UID);
tb_grp_branch cCon = new tb_grp_branch() { uid = dicInput[tb_ord_order_master.CN_BRANCH_UID].ToString() };
Command cSelect = Command.SetupSelectCmd(cBranch, cCon);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
tb_grp_branch qds = ai.RunQuerySingleORM<tb_grp_branch>(cSelect);
string sNewArticleUid = Guid.NewGuid().ToString();
// 新增現貨訂單
tb_ord_order_master cNew = new tb_ord_order_master()
{
uid = sNewArticleUid,
name = dicInput[tb_ord_order_master.CN_NAME].ToString(),
type = (int)Enums.ArticleType.Stock,
status = (int)Enums.OrderMainStatus.NotArrived,
order_code = new GROUP.Helper.FbHelper().GetOrderCode()
};
var uid = dicInput[tb_ord_order_master.CN_BRANCH_UID].ToString();
var groupUID = qds == null ? uid : qds.group_uid;
if (qds == null)
{
cNew.group_uid = uid;
}
else
{
cNew.branch_uid = uid;
cNew.group_uid = groupUID;
}
lCmds.Add(Command.SetupInsertCmd(cNew));
string sProductKey = nameof(tb_prd_article2product);
if (!joData.ContainsKey(sProductKey))
{
sMsg = "grp.no_product";
break;
}
List<tb_prd_article2product> la2pProducts = joData[sProductKey].ToObject<List<tb_prd_article2product>>();
List<tb_prd_article2product> products = new List<tb_prd_article2product>();
foreach (var f in la2pProducts)
{
string sProductUid = f.prd_uid;
if (sProductUid == null)
{
sProductUid = Guid.NewGuid().ToString();
// Create Product first
lCmds.Add(Command.SetupInsertCmd(new tb_prd_product()
{
uid = sProductUid,
name = f.name,
group_id = groupUID,
price = f.price,
wholesale_price = f.wholesale_price,
cost_price = f.cost_price
// todo:預設商品碼
}));
}
tb_prd_article2product cNewProduct = new tb_prd_article2product()
{
uid = Guid.NewGuid().ToString(),
price = f.price,
wholesale_price = f.wholesale_price,
name = f.name,
prd_uid = sProductUid,
seq = f.seq,
qty = f.qty,
specification = f.specification?.ToUpper(),
cost_price = f.cost_price
};
cNewProduct.order_uid = sNewArticleUid;
products.Add(cNewProduct);
lCmds.Add(Command.SetupInsertCmd(cNewProduct));
}
foreach (var item in products)
{
tb_ord_incoming_return_record cNewRecord = new tb_ord_incoming_return_record();
cNewRecord.uid = Guid.NewGuid().ToString();
cNewRecord.order_uid = sNewArticleUid;
cNewRecord.article2product_uid = item.uid;
cNewRecord.operating = 1;
cNewRecord.qty = item.qty;
lCmds.Add(Command.SetupInsertCmd(cNewRecord));
}
ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lCmds);
string sErrorCode = GetLastErrorCode(lCmds);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(CreateStockOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
private int GetOrderProductStock(string i_sOrderUID, string i_sarticle2productUID, string specification)
{
tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
cRecord.SetFullDirty();
tb_ord_incoming_return_record cCon = new tb_ord_incoming_return_record() { order_uid = i_sOrderUID, article2product_uid = i_sarticle2productUID };
if (specification != null)
{
cCon.specification = specification;
}
Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_incoming_return_record> qdsRecord = ai.RunQueryList<tb_ord_incoming_return_record>(cSelect);
var incomeQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Incoming).Sum(x => x.qty);
var returnQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Return).Sum(x => x.qty);
return incomeQty - returnQty;
}
private int GetProductStock(string i_sArticle2ProductUID, string i_sbranchUID = null)
{
tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
cRecord.SetFullDirty();
tb_ord_incoming_return_record cCon = new tb_ord_incoming_return_record() { article2product_uid = i_sArticle2ProductUID };
if (!string.IsNullOrEmpty(i_sbranchUID))
{
cCon.branch_uid = i_sbranchUID;
}
Command cSelect = Command.SetupSelectCmd(cRecord, cCon);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_incoming_return_record> qdsRecord = ai.RunQueryList<tb_ord_incoming_return_record>(cSelect);
var incomeQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Incoming).Sum(x => x.qty);
var returnQty = qdsRecord.Where(x => x.operating == (int)Enums.IncomingReturnOperating.Return).Sum(x => x.qty);
return incomeQty - returnQty;
}
/// <summary>
/// 當進退貨所造成存貨改變時,更新訂單到貨狀態
/// </summary>
/// <param name="i_sArticle2ProductUID"></param>
/// <param name="i_sBranchUID"></param>
/// <param name="i_iType"></param>
/// <param name="i_iQty"></param>
/// <returns></returns>
private List<Command> UpdateOrderIncomeReturnCmds(string i_sOrderUID, string i_sarticle2productUID, string specification, int i_iType, int i_iQty)
{
List<Command> lCmds = new List<Command>();
tb_ord_order_master cOrderMasterMain = new tb_ord_order_master();
cOrderMasterMain.SetDirty(tb_ord_order_master.CN_TYPE);
tb_ord_order_master cConMaster = new tb_ord_order_master()
{
uid = i_sOrderUID,
};
Command cSelectMaster = Command.SetupSelectCmd(cOrderMasterMain, cConMaster);
ArsenalInterface aiMaster = ArsenalDBMgr.GetInst(cSelectMaster);
List<tb_ord_order_master> qdsOrderMasterMain = aiMaster.RunQueryList<tb_ord_order_master>(cSelectMaster);
// 查詢訂單
tb_ord_order_detail cOrder = new tb_ord_order_detail();
cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_COMMENT_TIME, tb_ord_order_detail.CN_STATUS, tb_ord_order_detail.CN_TAKE_QTY);
tb_ord_order_detail cCon = new tb_ord_order_detail()
{
order_uid = i_sOrderUID,
article2product_uid = i_sarticle2productUID,
};
if (specification != null)
{
cCon.specification = specification;
}
Command cSelect = Command.SetupSelectCmd(cOrder, cCon);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
// 查詢目前存貨
var stockQty = GetOrderProductStock(i_sOrderUID, i_sarticle2productUID, specification);
// 更新訂單到貨狀態
// 進貨
// 得到該article_uid
tb_prd_article2product aOrder = new tb_prd_article2product();
aOrder.SetDirty(tb_prd_article2product.CN_ARTICLE_UID, tb_prd_article2product.CN_QTY);
tb_prd_article2product aCon = new tb_prd_article2product()
{
uid = i_sarticle2productUID
};
Command aSelect = Command.SetupSelectCmd(aOrder, aCon);
ArsenalInterface aiArticle = ArsenalDBMgr.GetInst(aSelect);
List<tb_prd_article2product> qdsArticle = aiArticle.RunQueryList<tb_prd_article2product>(aSelect);
var articleUid = qdsArticle[0].article_uid;
var qty = qdsArticle[0].qty;
if(qdsOrderMasterMain == null || qdsOrderMasterMain.Count < 1)
{
Logger.Error($@"{nameof(UpdateOrderIncomeReturnCmds)} Exception, {nameof(qdsOrderMasterMain)} is null,
{nameof(i_sOrderUID)}= {i_sOrderUID},
{nameof(i_sarticle2productUID)}= {i_sarticle2productUID},
{nameof(specification)}= {specification},
{nameof(i_iType)}= {i_iType},
{nameof(i_iQty)}= {i_iQty} ");
throw new Exception("Order Msater not found, 更新進退貨資料失敗");
}
// 判斷是否為現貨訂單
if (qdsOrderMasterMain[0].type == (int)Enums.ArticleType.Stock)
{
// 將 post_status 更改成 已到貨
tb_prd_article2product updateProduct = new tb_prd_article2product { qty = i_iType == (int)Enums.IncomingReturnOperating.Incoming ? qty + i_iQty : qty - i_iQty };
tb_prd_article2product updateProductCon = new tb_prd_article2product { uid = i_sarticle2productUID };
lCmds.Add(Command.SetupUpdateCmd(updateProduct, updateProductCon));
}
if (i_iType == (int)Enums.IncomingReturnOperating.Incoming)
{
stockQty = stockQty + i_iQty;
var takedQty = qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.Taked).Sum(x => x.take_qty);
if (stockQty > 0)
{
tb_ord_order_master cUpCon = new tb_ord_order_master() { uid = i_sOrderUID };
tb_ord_order_master cUpData = new tb_ord_order_master() { status = (int)Enums.OrderMainStatus.Arrived };
lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
// 將 post_status 更改成 已到貨
tb_grp_article updateArticle = new tb_grp_article { post_status = (int)EPostStatus.EPS_ARRIVED };
tb_grp_article updateArticleCond = new tb_grp_article { uid = articleUid };
lCmds.Add(Command.SetupUpdateCmd(updateArticle, updateArticleCond));
}
// 處理detail
stockQty = i_iQty;
foreach (var order in qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.NotArrived).OrderBy(x => x.comment_time))
{
if (stockQty >= order.order_qty)
{
tb_ord_order_detail cUpCon = new tb_ord_order_detail() { uid = order.uid };
tb_ord_order_detail cUpData = new tb_ord_order_detail() { status = (int)Enums.OrderStatus.NotTake };
lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
stockQty -= order.order_qty;
}
}
}
// 退貨
else
{
stockQty = stockQty - i_iQty;
var takedQty = qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.Taked).Sum(x => x.take_qty);
if (stockQty < takedQty)
{
return null;
}
var notTakedCount = qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.NotTake).ToList().Count;
if (stockQty > 0)
{
tb_ord_order_master cUpCon = new tb_ord_order_master() { uid = i_sOrderUID };
tb_ord_order_master cUpData = new tb_ord_order_master() { status = (int)Enums.OrderMainStatus.Arrived };
lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
}
else
{
tb_ord_order_master cUpCon = new tb_ord_order_master() { uid = i_sOrderUID };
tb_ord_order_master cUpData = new tb_ord_order_master() { status = (int)Enums.OrderMainStatus.NotArrived };
lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
if (notTakedCount == 0)
{
// 查詢order master 該article有幾筆
tb_ord_order_master cOrderMaster = new tb_ord_order_master();
cOrder.SetDirty(tb_ord_order_master.CN_UID);
tb_ord_order_master cOrderMasterCon = new tb_ord_order_master() { article_uid = articleUid };
Command oSelect = Command.SetupSelectCmd(cOrderMaster, cOrderMasterCon);
ArsenalInterface aiO = ArsenalDBMgr.GetInst(oSelect);
List<tb_ord_order_master> qdsOrderMaster = aiO.RunQueryList<tb_ord_order_master>(oSelect);
// 判斷除此訂單外是否有已到貨訂單
var arrivedCount = qdsOrderMaster.Where(x => x.status == 2 && x.uid != i_sOrderUID).ToList().Count;
// 將post_status 改回已結單
if (arrivedCount < 1)
{
tb_grp_article updateArticle = new tb_grp_article { post_status = (int)EPostStatus.EPS_ORDER };
tb_grp_article updateArticleCond = new tb_grp_article { uid = qdsArticle[0].article_uid };
lCmds.Add(Command.SetupUpdateCmd(updateArticle, updateArticleCond));
}
}
}
// 處理 detail
stockQty = stockQty - takedQty;
foreach (var order in qdsOrder.Where(x => x.status == (int)Enums.OrderStatus.NotTake).OrderBy(x => x.comment_time))
{
if (stockQty < order.order_qty)
{
tb_ord_order_detail cUpCon = new tb_ord_order_detail() { uid = order.uid };
tb_ord_order_detail cUpData = new tb_ord_order_detail() { status = (int)Enums.OrderStatus.NotArrived };
lCmds.Add(Command.SetupUpdateCmd(cUpData, cUpCon));
}
stockQty -= order.order_qty;
}
}
return lCmds;
}
/// <summary>
/// 新增進退貨資料
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
public CResponseMessage IncomeReturnRecord(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmds = new List<Command>();
CResponseMessage crmRes = null;
try
{
do
{
JArray jaData = i_crmInput.param[BLWording.ADD_MASTER] as JArray;
JObject joData = jaData[0] as JObject;
Dictionary<string, object> dicInput = joData.ToObject<Dictionary<string, object>>();
// 新增進退貨記錄
tb_ord_incoming_return_record cNew = new tb_ord_incoming_return_record();
cNew.FillData(dicInput);
lCmds.Add(Command.SetupInsertCmd(cNew));
var specification = dicInput[tb_ord_incoming_return_record.CN_SPECIFICATION] == null ? null : dicInput[tb_ord_incoming_return_record.CN_SPECIFICATION].ToString();
List<Command> lCmds2 = UpdateOrderIncomeReturnCmds(dicInput[tb_ord_incoming_return_record.CN_ORDER_UID].ToString(), dicInput[tb_ord_incoming_return_record.CN_ARTICLE2PRODUCT_UID].ToString(), specification, Convert.ToInt32(dicInput[tb_ord_incoming_return_record.CN_OPERATING]), Convert.ToInt32(dicInput[tb_ord_incoming_return_record.CN_QTY]));
if (lCmds2 == null)
{
sMsg = "退貨數量";
break;
}
// 更新訂單到貨狀態
lCmds.AddRange(lCmds2);
ArsenalInterface ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lCmds);
string sErrorCode = GetLastErrorCode(lCmds);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(IncomeReturnRecord)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage GetIncomeReturnRecord(CRequestMessage i_crmInput)
{
string sMsg;
Command cRes = null;
CResponseMessage crmRes = null;
try
{
do
{
Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput); // 取得condition
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeRecord = lBlocks.GetInst();
qjeRecord.table = tb_ord_incoming_return_record.TABLENAME;
qjeRecord.displaycols = new List<string>() {
tb_ord_incoming_return_record.CN_OPERATING,
tb_ord_incoming_return_record.CN_QTY,
tb_ord_incoming_return_record.CN_MEMO,
tb_ord_incoming_return_record.CN_CREATE_DATE
};
qjeRecord.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
new WhereNode(tb_ord_incoming_return_record.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_incoming_return_record), dicCondition[tb_ord_incoming_return_record.CN_BRANCH_UID]),
new WhereNode(tb_ord_incoming_return_record.CN_ARTICLE2PRODUCT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_incoming_return_record), dicCondition[tb_ord_incoming_return_record.CN_UID]));
QueryJsonElement qjeEmp = lBlocks.GetInst();
qjeEmp.table = tb_hr_employee.TABLENAME;
qjeEmp.jointype = QueryJsonElement.LEFT_JOIN;
qjeEmp.jointable = qjeRecord;
qjeEmp.joincols = new Dictionary<string, string>() {
{ tb_hr_employee.CN_UID,tb_ord_incoming_return_record.CN_CREATE_USER_UID }};
qjeEmp.displaycols = new List<string>() { tb_hr_employee.CN_NAME };
QueryJsonElement qjeProduct = lBlocks.GetInst();
qjeProduct.table = tb_prd_article2product.TABLENAME;
qjeProduct.jointype = QueryJsonElement.LEFT_JOIN;
qjeProduct.jointable = qjeRecord;
qjeProduct.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_incoming_return_record.CN_ARTICLE2PRODUCT_UID }};
qjeProduct.displaycols = new List<string>() { tb_prd_article2product.CN_SEQ };
qjeProduct.aliascols = new Dictionary<string, List<string>>
{
{ tb_prd_article2product.CN_NAME, new List<string>() { "product_name" } }
};
lBlocks.Add(qjeRecord);
lBlocks.Add(qjeEmp);
lBlocks.Add(qjeProduct);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
QueryDataSet qds = ai.RunQueryDataSet(cRes);
if (cRes.IsSuccess == false)
{
sMsg = cRes.LastErrorCode;
break;
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, qds);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(GetIncomeReturnRecord)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage CheckOut(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmds = new List<Command>();
List<Command> lCmdsDetail = new List<Command>();
CResponseMessage crmRes = null;
ArsenalInterface ai = null;
try
{
do
{
JObject oData = i_crmInput.param[BLWording.ADD_MASTER] as JObject;
Dictionary<string, object> joData = oData.ToObject<Dictionary<string, object>>();
JArray jaData = joData[BLWording.DATA] as JArray;
Dictionary<string, int> dicPoints = new Dictionary<string, int>();
if (joData.ContainsKey("shoppingPoints")) // 判斷是否使用購物金 並驗證金額大小
{
JArray jaPoints = joData["shoppingPoints"] as JArray;
foreach (var points in jaPoints)
{
var member_uid = points[tb_meb_member.CN_UID].ToString();
tb_meb_member cPoints = new tb_meb_member();
cPoints.SetDirty(tb_meb_member.CN_SHOPPING_ACCOUNT);
tb_meb_member cConPoints = new tb_meb_member()
{
uid = member_uid
};
Command pointsSelect = Command.SetupSelectCmd(cPoints, cConPoints);
ArsenalInterface aiPoints = ArsenalDBMgr.GetInst(pointsSelect);
var qdsPoints = aiPoints.RunQueryList<tb_meb_member>(pointsSelect);
if (Convert.ToDecimal(points[tb_meb_member.CN_SHOPPING_ACCOUNT]) > qdsPoints[0].shopping_account)
{
sMsg = "Shopping Points Wrong";
break;
}
else
{
dicPoints[member_uid] = Convert.ToInt32(points[tb_meb_member.CN_SHOPPING_ACCOUNT]);
}
}
}
if (sMsg != null)
{
break;
}
var addMainData = new List<tb_ord_purchase>();
var addPointsData = new List<tb_meb_shopping_points_record>();
var now = DateTime.Now;
// get create_uesr_id
var token = i_crmInput.token;
tb_sys_session cSession = new tb_sys_session();
cSession.SetDirty(tb_sys_session.CN_CREATE_USER_UID);
tb_sys_session cCon = new tb_sys_session()
{
uid = token
};
Command sessionSelect = Command.SetupSelectCmd(cSession, cCon);
ArsenalInterface aiSession = ArsenalDBMgr.GetInst(sessionSelect);
tb_sys_session qdsSession = aiSession.RunQuerySingleORM<tb_sys_session>(sessionSelect);
if (qdsSession != null && !string.IsNullOrEmpty(qdsSession.create_user_uid))
{
// get receive_branch_uid
tb_hr_employee cEmployee = new tb_hr_employee();
cEmployee.SetDirty(tb_hr_employee.CN_RECEIVE_BRANCH_UID);
tb_hr_employee eCon = new tb_hr_employee()
{
uid = qdsSession.create_user_uid
};
Command employeeSelect = Command.SetupSelectCmd(cEmployee, eCon);
ArsenalInterface aiEmployee = ArsenalDBMgr.GetInst(employeeSelect);
tb_hr_employee qdsEmployee = aiEmployee.RunQuerySingleORM<tb_hr_employee>(employeeSelect);
if (qdsEmployee != null) // 目前 receive_branch_uid 可以為null 後期須改為 != null
{
foreach (JObject row in jaData)
{
Dictionary<string, object> dicInput = row.ToObject<Dictionary<string, object>>();
string article2productUID = dicInput[tb_prd_article2product.CN_UID].ToString();
JArray orderUID = dicInput[tb_ord_order_detail.CN_ORDER_UID] as JArray;
var aOrderUid = orderUID.Select(x => x.ToString()).ToArray();
string specification = dicInput.ContainsKey(tb_ord_order_detail.CN_SPECIFICATION) ? dicInput[tb_ord_order_detail.CN_SPECIFICATION].ToString() : null;
dicInput.Remove(tb_prd_article2product.CN_UID);
// 用article2product_uid + member_uid + order_uid 查詢order_detail
tb_ord_order_detail cOrder = new tb_ord_order_detail();
cOrder.SetFullDirty();
List<WhereNode> lwWhereData = new List<WhereNode>();
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), article2productUID));
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aOrderUid));
if (specification != null)
{
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_SPECIFICATION, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), specification));
}
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
var jaMember = dicInput["member"] as JArray;
var aMember = jaMember.Select(x => x.ToString()).ToArray();
if (aMember[0] != "")
{
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aMember));
}
else
{
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_ISNULL, typeof(tb_ord_order_detail)));
}
Command cSelect = Command.SetupSelectCmd(cOrder, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwWhereData.ToArray()));
ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
var takeQty = Convert.ToInt32(dicInput[tb_ord_order_detail.CN_ORDER_QTY]);
int type = 0;
if (dicInput.ContainsKey("type"))
{
type = Convert.ToInt32(dicInput["type"]);
}
foreach (var memberOrder in qdsOrder.GroupBy(x => x.member_uid))
{
var memberUID = memberOrder.Key;
var purchaseUID = addMainData.Any(x => x.member_uid == memberUID) ?
addMainData.Where(x => x.member_uid == memberUID).Select(x => x.uid).SingleOrDefault() : Guid.NewGuid().ToString();
var amount = 0;
var returnCount = 0; // 計算退貨次數
foreach (var order in memberOrder)
{
var detailNum = order.order_qty - order.take_qty;
var updateDetailNum = takeQty >= detailNum ? detailNum : takeQty;
if (takeQty != 0) // 數量 = 0 不新增purchase
{
tb_ord_purchase_detail cDeatil = new tb_ord_purchase_detail()
{
purchase_uid = purchaseUID,
branch_uid = dicInput[tb_ord_purchase_detail.CN_BRANCH_UID].ToString(),
order_detail_uid = order.uid,
article2product_uid = article2productUID,
specification = order.specification != "" ? order.specification : null,
qty = updateDetailNum,
amount = updateDetailNum * Convert.ToInt32(dicInput[tb_prd_article2product.CN_PRICE])
};
lCmdsDetail.Add(Command.SetupInsertCmd(cDeatil));
amount += cDeatil.amount;
}
// 新增收款明細
// 調整訂單狀態、take_qty type = 1 為退貨 已取貨, = 2 為保留 未取貨
if (takeQty != 0)
{
if (takeQty >= detailNum) // 該筆detail 全拿
{
lCmds.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
{
status = (int)Enums.OrderStatus.Taked,
take_qty = updateDetailNum + order.take_qty,
operate_date = now
}
, new tb_ord_order_detail() { uid = order.uid }));
takeQty -= updateDetailNum;
}
else
{
if (type == 1) // 退貨
{
lCmds.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
{
status = (int)Enums.OrderStatus.Taked,
take_qty = updateDetailNum + order.take_qty,
order_qty = updateDetailNum + order.take_qty,
price = (updateDetailNum + order.take_qty) * order.price / order.order_qty,
operate_date = now
}
, new tb_ord_order_detail() { uid = order.uid }));
// 新增退貨訂單order
string sNewArticleUid = Guid.NewGuid().ToString();
tb_ord_order_detail cNew = new tb_ord_order_detail()
{
uid = sNewArticleUid,
order_uid = order.order_uid,
article2product_uid = order.article2product_uid,
member_uid = order.member_uid,
order_qty = order.order_qty - updateDetailNum - order.take_qty,
take_qty = 0,
price = (order.order_qty - updateDetailNum - order.take_qty) * order.price / order.order_qty,
status = (int)Enums.OrderStatus.Return,
comment_uid = order.comment_uid,
comment_time = order.comment_time,
operate_date = now,
specification = order.specification
};
lCmds.Add(Command.SetupInsertCmd(cNew));
returnCount += 1;
}
else // 保留
{
lCmds.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
{
status = (int)Enums.OrderStatus.NotTake,
take_qty = updateDetailNum + order.take_qty
}
, new tb_ord_order_detail() { uid = order.uid }));
}
takeQty -= updateDetailNum;
}
}
else
{
lCmds.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
{
status = type == 1 ? (int)Enums.OrderStatus.Return : (int)Enums.OrderStatus.NotTake,
take_qty = updateDetailNum,
operate_date = now
}
, new tb_ord_order_detail() { uid = order.uid }));
returnCount += type == 1 ? 1 : 0;
takeQty -= updateDetailNum;
}
}
if (Convert.ToInt32(dicInput[tb_ord_order_detail.CN_ORDER_QTY]) != 0) // 數量為零不新增
{
if (addMainData.Any(x => x.member_uid == memberUID))
{
var model = addMainData.Where(x => x.member_uid == memberUID).SingleOrDefault();
model.amount += amount;
}
else
{
if (dicPoints.ContainsKey(memberUID)) // 新增purchase時 檢查是否需要扣購物金
{
amount -= dicPoints[memberUID];
// 新增一筆扣款購物金
tb_meb_shopping_points_record cPointsNew = new tb_meb_shopping_points_record()
{
uid = Guid.NewGuid().ToString(),
member_uid = memberUID,
amount = -dicPoints[memberUID],
purchase_uid = purchaseUID
};
addPointsData.Add(cPointsNew);
}
tb_ord_purchase cNew = new tb_ord_purchase()
{
uid = purchaseUID,
member_uid = memberUID,
amount = amount,
receive_branch_uid = qdsEmployee.receive_branch_uid
};
addMainData.Add(cNew);
}
}
if (returnCount > 0)
{
sMsg = getUpdateReturnCountCmd(memberUID, returnCount);
if (sMsg != null)
{
break;
}
}
}
}
// 新增收款記錄 與新增點數
foreach (var mainData in addMainData)
{
lCmds.Add(Command.SetupInsertCmd(mainData));
// 新增一筆點數
tb_meb_shopping_points_record cPointsNew = new tb_meb_shopping_points_record()
{
uid = Guid.NewGuid().ToString(),
member_uid = mainData.member_uid,
amount = (int)(mainData.amount / 100),
purchase_uid = mainData.uid
};
addPointsData.Add(cPointsNew);
}
// 新增購物金扣款
foreach (var pointsData in addPointsData)
{
lCmds.Add(Command.SetupInsertCmd(pointsData));
}
lCmds.AddRange(lCmdsDetail);
var groupPointsData = addPointsData.GroupBy(x => x.member_uid);
foreach (var memberPointsData in groupPointsData)
{
tb_meb_member cPoints = new tb_meb_member();
cPoints.SetDirty(tb_meb_member.CN_SHOPPING_ACCOUNT);
tb_meb_member cConPoints = new tb_meb_member()
{
uid = memberPointsData.Key
};
Command pointsSelect = Command.SetupSelectCmd(cPoints, cConPoints);
ArsenalInterface aiPoints = ArsenalDBMgr.GetInst(pointsSelect);
var qdsPoints = aiPoints.RunQueryList<tb_meb_member>(pointsSelect);
lCmds.Add(Command.SetupUpdateCmd(new tb_meb_member()
{
shopping_account = qdsPoints[0].shopping_account + Convert.ToInt32(memberPointsData.Sum(x => x.amount))
}
, new tb_meb_member() { uid = memberPointsData.Key }));
}
if (lCmds.Any())
{
ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lCmds);
string sErrorCode = GetLastErrorCode(lCmds);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
}
}
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(CheckOut)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage SetMemo(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmds = new List<Command>();
Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput);
CResponseMessage crmRes = null;
try
{
do
{
foreach (var joData in dicCondition)
{
string memberUID = (joData.Value as dynamic).member_uid.ToString();
string memo = (joData.Value as dynamic).memo.ToString();
tb_ord_order_detail upData = new tb_ord_order_detail() { member_uid = memberUID, status = (int)Enums.OrderStatus.NotTake };
tb_ord_order_detail upCon = new tb_ord_order_detail();
upCon.memo = memo;
lCmds.Add(Command.SetupUpdateCmd(upCon, upData));
}
if (lCmds.Any())
{
ArsenalInterface ai = ArsenalDBMgr.GetInst(lCmds[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lCmds);
string sErrorCode = GetLastErrorCode(lCmds);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(SetMemo)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public class StockModel
{
public string uid { get; set; }
public string article2product_uid { get; set; }
public string article_name { get; set; }
public string name { get; set; }
public int price { get; set; }
public int qty { get; set; }
public int seq { get; set; }
public string specification { get; set; }
}
/// <summary>
/// 取得現貨區商品(現貨訂單、訂單已封存)
/// </summary>
/// <param name="i_crmInput"></param>
/// <returns></returns>
public CResponseMessage GetStockList(CRequestMessage i_crmInput)
{
string sMsg = null;
CResponseMessage crmRes = null;
try
{
do
{
Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput);
var session = ProjectHelper.GetLoginUser(i_crmInput);
if (session == null)
{
sMsg = "Session error!!";
Logger.Error($"Session error!! i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ");
}
sMsg = GetFinalData(dicCondition, session.receive_branch_uid, out List<StockModel> finalData, out List<tb_grp_group> qdsGroup);
if (null != sMsg)
{
break;
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, finalData);
if (qdsGroup.Any())
{
crmRes.param.Add("groupData", qdsGroup[0]);
}
else
{
tb_grp_branch branch = new tb_grp_branch();
branch.SetDirty(tb_grp_branch.CN_BRANCH_NAME, tb_grp_branch.CN_GROUP_UID, tb_grp_branch.CN_UID);
tb_grp_branch branchCon = new tb_grp_branch()
{
uid = dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString()
};
Command aSelect = Command.SetupSelectCmd(branch, branchCon);
ArsenalInterface aiBranch = ArsenalDBMgr.GetInst(aSelect);
List<tb_grp_branch> qdsBranch = aiBranch.RunQueryList<tb_grp_branch>(aSelect);
crmRes.param.Add("branchData", qdsBranch[0]);
}
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(GetStockList)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
private string GetFinalData(Dictionary<string, object> dicCondition, string branch_uid, out List<StockModel> finalData, out List<tb_grp_group> qdsGroup)
{
string sMsg = null;
finalData = new List<StockModel>();
do
{
var isGroup = false;
string groupUid = "";
qdsGroup = new List<tb_grp_group>();
if (dicCondition.ContainsKey(tb_ord_order_master.CN_BRANCH_UID))
{
tb_grp_group cGroup = new tb_grp_group();
cGroup.SetFullDirty();
WhereNode wnGroup = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString());
Command gSelect = Command.SetupSelectCmd(cGroup, wnGroup);
ArsenalInterface aiGroup = ArsenalDBMgr.GetInst(gSelect);
qdsGroup = aiGroup.RunQueryList<tb_grp_group>(gSelect);
if (qdsGroup.Any())
{
isGroup = true;
}
groupUid = dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString();
}
else
{
dicCondition[tb_ord_order_master.CN_BRANCH_UID] = branch_uid;
}
// 查詢條件 : 社團uid、分店uid?
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeMain = lBlocks.GetInst();
qjeMain.table = tb_ord_order_master.TABLENAME;
qjeMain.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
};
qjeMain.displaycols = new List<string>() { tb_ord_order_master.CN_UID, tb_ord_order_master.CN_BRANCH_UID };
// 現貨訂單
List<WhereNode> lwMain = new List<WhereNode>();
lwMain.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Stock));
lwMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), BLWording.STATUS_FLAG_ON));
lwMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
if (isGroup)
{
lwMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
}
else
{
lwMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]));
}
qjeMain.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain.ToArray());
QueryJsonElement qjeProduct = lBlocks.GetInst();
qjeProduct.table = tb_prd_article2product.TABLENAME;
qjeProduct.jointype = QueryJsonElement.JOIN;
qjeProduct.jointable = qjeMain;
qjeProduct.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
qjeProduct.displaycols = new List<string>() {
tb_prd_article2product.CN_QTY,
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_SEQ
};
qjeProduct.aliascols = new Dictionary<string, List<string>>
{
{ tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
};
lBlocks.Add(qjeMain);
lBlocks.Add(qjeProduct);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null)
{
break;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
List<StockModel> qds = ai.RunQueryList<StockModel>(cRes);
foreach (var order in qds)
{
order.specification = "";
}
// 封存訂單(訂單未取貨、退貨則視為現貨)
//List<WhereNode> lwMain2 = new List<WhereNode>();
//lwMain2.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
//if (isGroup)
//{
// lwMain2.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
//}
//else
//{
// lwMain2.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]));
//}
//qjeMain2.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain2.ToArray());
//qjeMain2.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
//QueryJsonElement qjeOrder = lBlocks.GetInst();
//qjeOrder.table = tb_ord_order_detail.TABLENAME;
//qjeOrder.jointype = QueryJsonElement.LEFT_JOIN;
//qjeOrder.jointable = qjeMain2;
//qjeOrder.joincols = new Dictionary<string, string>() {
// { tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
//qjeOrder.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_OR,
// new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake),
// new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Taked),
// new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Return),
// new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Abandon));
//qjeOrder.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
//qjeOrder.aliascols = new Dictionary<string, List<string>>
// {
// { QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
// { QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } }
// };
//QueryJsonElement qjeProduct2 = lBlocks.GetInst();
//qjeProduct2.table = tb_prd_article2product.TABLENAME;
//qjeProduct2.jointype = QueryJsonElement.LEFT_JOIN;
//qjeProduct2.jointable = qjeOrder;
//qjeProduct2.joincols = new Dictionary<string, string>() {
// { tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
//qjeProduct2.displaycols = new List<string>() {
// tb_prd_article2product.CN_NAME,
// tb_prd_article2product.CN_PRICE,
// tb_prd_article2product.CN_SEQ
// };
//qjeProduct2.aliascols = new Dictionary<string, List<string>>
// {
// { tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
// };
//qjeMain2.groupcols = new List<Tuple<QueryJsonElement, string>>
// {
// Tuple.Create(qjeMain2, tb_ord_order_master.CN_NAME),
// Tuple.Create(qjeMain2, tb_ord_order_master.CN_UID),
// Tuple.Create(qjeOrder, tb_ord_order_detail.CN_SPECIFICATION),
// Tuple.Create(qjeProduct2, tb_prd_article2product.CN_NAME),
// Tuple.Create(qjeProduct2, tb_prd_article2product.CN_PRICE),
// Tuple.Create(qjeProduct2, tb_prd_article2product.CN_UID),
// Tuple.Create(qjeProduct2, tb_prd_article2product.CN_SEQ)
// };
//lBlocks.Add(qjeMain2);
//lBlocks.Add(qjeOrder);
//lBlocks.Add(qjeProduct2);
//sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
//if (sMsg != null)
//{
// break;
//}
//ai = ArsenalDBMgr.GetInst(cRes);
//QueryDataSet qds2 = ai.RunQueryDataSet(cRes);
var qds2Model = new List<StockModel>() { };
//foreach (DataRow row in qds2.DATA.Tables[0].Rows)
//{
// var orderCount = Convert.ToInt32(row["count"]);
// var takeCount = Convert.ToInt32(row["soldCount"]);
// if (orderCount - takeCount > 0)
// {
// qds2Model.Add(new StockModel
// {
// uid = row[tb_ord_order_master.CN_UID].ToString(),
// article2product_uid = row[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString(),
// article_name = row["article_name"].ToString(),
// name = row[tb_prd_article2product.CN_NAME].ToString(),
// price = Convert.ToInt32(row[tb_prd_article2product.CN_PRICE]),
// qty = Convert.ToInt32(row["count"]) - Convert.ToInt32(row["soldCount"]),
// seq = Convert.ToInt32(row[tb_prd_article2product.CN_SEQ]),
// specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString()
// });
// }
//}
// 進貨量 > 訂購量
lBlocks.Clear();
cRes = null;
QueryJsonElement qjeMain3 = lBlocks.GetInst();
qjeMain3.table = tb_ord_order_master.TABLENAME;
qjeMain3.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
qjeMain3.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
};
List<WhereNode> lwMain3 = new List<WhereNode>();
lwMain3.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
lwMain3.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Article));
if (isGroup)
{
lwMain3.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
}
else
{
lwMain3.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]?.ToString()));
}
qjeMain3.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain3.ToArray());
QueryJsonElement qjeDetail = lBlocks.GetInst();
qjeDetail.table = tb_ord_order_detail.TABLENAME;
qjeDetail.jointype = QueryJsonElement.LEFT_JOIN;
qjeDetail.jointable = qjeMain3;
qjeDetail.joincols = new Dictionary<string, string>() {
{ tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
qjeDetail.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
qjeDetail.aliascols = new Dictionary<string, List<string>>
{
{ QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } }
};
QueryJsonElement qjeProduct3 = lBlocks.GetInst();
qjeProduct3.table = tb_prd_article2product.TABLENAME;
qjeProduct3.jointype = QueryJsonElement.JOIN;
qjeProduct3.jointable = qjeDetail;
qjeProduct3.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeProduct3.displaycols = new List<string>() {
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_SEQ
};
qjeProduct3.aliascols = new Dictionary<string, List<string>>
{
{ tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
};
qjeMain3.groupcols = new List<Tuple<QueryJsonElement, string>>
{
Tuple.Create(qjeMain3, tb_ord_order_master.CN_NAME),
Tuple.Create(qjeMain3, tb_ord_order_master.CN_UID),
Tuple.Create(qjeDetail, tb_ord_order_detail.CN_SPECIFICATION),
Tuple.Create(qjeProduct3, tb_prd_article2product.CN_NAME),
Tuple.Create(qjeProduct3, tb_prd_article2product.CN_PRICE),
Tuple.Create(qjeProduct3, tb_prd_article2product.CN_UID),
Tuple.Create(qjeProduct3, tb_prd_article2product.CN_SEQ)
};
lBlocks.Add(qjeMain3);
lBlocks.Add(qjeDetail);
lBlocks.Add(qjeProduct3);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ai = ArsenalDBMgr.GetInst(cRes);
QueryDataSet qds3 = ai.RunQueryDataSet(cRes);
//List<string> lsOrderUID = new List<string>();
//foreach (DataRow row in qds3.DATA.Tables[0].Rows)
//{
// lsOrderUID.Add(row[tb_ord_order_master.CN_UID].ToString());
//}
//List<tb_ord_incoming_return_record> qdsRecord = new List<tb_ord_incoming_return_record>();
//var arrayCount = lsOrderUID.Count / 1500;
//for (var i = 0; i <= arrayCount; i++)
//{
// string[] slicedArray = lsOrderUID.Skip(i * 1500).Take(1500).ToArray();
// // 查詢進貨數量
// tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
// cRecord.SetFullDirty();
// WhereNode wn = new WhereNode(tb_ord_incoming_return_record.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_incoming_return_record), slicedArray);
// Command cSelect = Command.SetupSelectCmd(cRecord, wn);
// ai = ArsenalDBMgr.GetInst(cSelect);
// qdsRecord.AddRange(ai.RunQueryList<tb_ord_incoming_return_record>(cSelect));
//}
List<tb_ord_incoming_return_record> qdsRecord = new List<tb_ord_incoming_return_record>();
{
lBlocks.Clear();
Command cInner = null;
QueryJsonElement qjeMain3_1 = lBlocks.GetInst();
qjeMain3_1.table = tb_ord_order_master.TABLENAME;
qjeMain3_1.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
//qjeMain3_1.aliascols = new Dictionary<string, List<string>>
//{
// { tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
//};
List<WhereNode> lwMain3_1 = new List<WhereNode>();
lwMain3_1.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
lwMain3_1.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Article));
if (isGroup)
{
lwMain3_1.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
}
else
{
lwMain3_1.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]?.ToString()));
}
qjeMain3_1.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain3_1.ToArray());
QueryJsonElement qjeDetail3_1 = lBlocks.GetInst();
qjeDetail3_1.table = tb_ord_order_detail.TABLENAME;
qjeDetail3_1.jointype = QueryJsonElement.LEFT_JOIN;
qjeDetail3_1.jointable = qjeMain3_1;
qjeDetail3_1.joincols = new Dictionary<string, string>() {
{ tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
//qjeDetail3_1.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
//qjeDetail3_1.aliascols = new Dictionary<string, List<string>>
//{
// { QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } }
//};
QueryJsonElement qjeProduct3_1 = lBlocks.GetInst();
qjeProduct3_1.table = tb_prd_article2product.TABLENAME;
qjeProduct3_1.jointype = QueryJsonElement.JOIN;
qjeProduct3_1.jointable = qjeDetail3_1;
qjeProduct3_1.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
//qjeProduct3_1.displaycols = new List<string>() {
// tb_prd_article2product.CN_NAME,
// tb_prd_article2product.CN_PRICE,
// tb_prd_article2product.CN_SEQ
//};
//qjeProduct3_1.aliascols = new Dictionary<string, List<string>>
//{
// { tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
//};
qjeMain3_1.groupcols = new List<Tuple<QueryJsonElement, string>>
{
Tuple.Create(qjeMain3_1, tb_ord_order_master.CN_NAME),
Tuple.Create(qjeMain3_1, tb_ord_order_master.CN_UID),
Tuple.Create(qjeDetail3_1, tb_ord_order_detail.CN_SPECIFICATION),
Tuple.Create(qjeProduct3_1, tb_prd_article2product.CN_NAME),
Tuple.Create(qjeProduct3_1, tb_prd_article2product.CN_PRICE),
Tuple.Create(qjeProduct3_1, tb_prd_article2product.CN_UID),
Tuple.Create(qjeProduct3_1, tb_prd_article2product.CN_SEQ)
};
lBlocks.Add(qjeMain3_1);
lBlocks.Add(qjeDetail3_1);
lBlocks.Add(qjeProduct3_1);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cInner);
if (sMsg != null)
{
break;
}
tb_ord_incoming_return_record cRecord = new tb_ord_incoming_return_record();
cRecord.SetFullDirty();
WhereNode wn = new WhereNode(tb_ord_incoming_return_record.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_INSQL, typeof(tb_ord_incoming_return_record), cInner);
Command cSelect = Command.SetupSelectCmd(cRecord, wn);
ai = ArsenalDBMgr.GetInst(cSelect);
qdsRecord.AddRange(ai.RunQueryList<tb_ord_incoming_return_record>(cSelect));
}
var groupItem = qdsRecord.GroupBy(x => new { x.article2product_uid, x.order_uid, x.operating, x.specification }).Select(x => new { order_uid = x.Key.order_uid, rticle2product_uid = x.Key.article2product_uid, specification = x.Key.specification, operating = x.Key.operating, qty = x.Sum(x => x.qty) }).ToDictionary(x=>Tuple.Create(x.operating,x.order_uid,x.rticle2product_uid,x.specification),x=>x);
qdsRecord = null;
foreach (DataRow row in qds3.DATA.Tables[0].Rows)
{
var article2productUID = row[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString();
var specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString() == "" ? null : row[tb_ord_order_detail.CN_SPECIFICATION].ToString();
int incomeQty = 0, returnQty = 0;
var keyIncome = Tuple.Create((int)Enums.IncomingReturnOperating.Incoming, row[tb_ord_order_master.CN_UID].ToString(), article2productUID, specification);
var keyReturn = Tuple.Create((int)Enums.IncomingReturnOperating.Return, row[tb_ord_order_master.CN_UID].ToString(), article2productUID, specification);
if (groupItem.ContainsKey(keyIncome))
{
incomeQty = groupItem[keyIncome].qty;
}
if (groupItem.ContainsKey(keyReturn))
{
returnQty = groupItem[keyReturn].qty;
}
var orderCount = row["count"] is DBNull ? 0 : Convert.ToInt32(row["count"]);
if (incomeQty - returnQty - orderCount > 0)
{
qds2Model.Add(new StockModel
{
uid = row[tb_ord_order_master.CN_UID].ToString(),
article2product_uid = article2productUID,
article_name = row["article_name"].ToString(),
name = row[tb_prd_article2product.CN_NAME].ToString(),
price = Convert.ToInt32(row[tb_prd_article2product.CN_PRICE]),
qty = incomeQty - returnQty - orderCount,
seq = Convert.ToInt32(row[tb_prd_article2product.CN_SEQ]),
specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString()
});
}
}
lBlocks.Clear();
cRes = null;
QueryJsonElement qjeMain4 = lBlocks.GetInst();
qjeMain4.table = tb_ord_order_master.TABLENAME;
qjeMain4.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
};
qjeMain4.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
// 已到貨訂單 已取貨與退貨 order_qty > take_qty 當現貨
List<WhereNode> lwMain4 = new List<WhereNode>();
lwMain4.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Arrived));
lwMain4.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Purchase));
if (isGroup)
{
lwMain4.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
}
else
{
lwMain4.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]));
}
qjeMain4.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain4.ToArray());
QueryJsonElement qjeOrder2 = lBlocks.GetInst();
qjeOrder2.table = tb_ord_order_detail.TABLENAME;
qjeOrder2.jointype = QueryJsonElement.LEFT_JOIN;
qjeOrder2.jointable = qjeMain4;
qjeOrder2.joincols = new Dictionary<string, string>() {
{ tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
qjeOrder2.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_OR,
new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Taked),
new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Return),
new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Abandon));
qjeOrder2.aliascols = new Dictionary<string, List<string>>
{
{ QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
{ QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } }
};
qjeOrder2.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
QueryJsonElement qjeProduct4 = lBlocks.GetInst();
qjeProduct4.table = tb_prd_article2product.TABLENAME;
qjeProduct4.jointype = QueryJsonElement.JOIN;
qjeProduct4.jointable = qjeOrder2;
qjeProduct4.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeProduct4.displaycols = new List<string>() {
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_SEQ
};
qjeProduct4.aliascols = new Dictionary<string, List<string>>
{
{ tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
};
qjeMain4.groupcols = new List<Tuple<QueryJsonElement, string>>
{
Tuple.Create(qjeMain4, tb_ord_order_master.CN_NAME),
Tuple.Create(qjeMain4, tb_ord_order_master.CN_UID),
Tuple.Create(qjeOrder2, tb_ord_order_detail.CN_SPECIFICATION),
Tuple.Create(qjeProduct4, tb_prd_article2product.CN_NAME),
Tuple.Create(qjeProduct4, tb_prd_article2product.CN_PRICE),
Tuple.Create(qjeProduct4, tb_prd_article2product.CN_UID),
Tuple.Create(qjeProduct4, tb_prd_article2product.CN_SEQ)
};
lBlocks.Add(qjeMain4);
lBlocks.Add(qjeOrder2);
lBlocks.Add(qjeProduct4);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ai = ArsenalDBMgr.GetInst(cRes);
QueryDataSet qds4 = ai.RunQueryDataSet(cRes);
foreach (DataRow row in qds4.DATA.Tables[0].Rows)
{
var orderCount = Convert.ToInt32(row["count"]);
var takeCount = Convert.ToInt32(row["soldCount"]);
if (orderCount - takeCount > 0)
{
qds2Model.Add(new StockModel
{
uid = row[tb_ord_order_master.CN_UID].ToString(),
article2product_uid = row[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString(),
article_name = row["article_name"].ToString(),
name = row[tb_prd_article2product.CN_NAME].ToString(),
price = Convert.ToInt32(row[tb_prd_article2product.CN_PRICE]),
qty = Convert.ToInt32(row["count"]) - Convert.ToInt32(row["soldCount"]),
seq = Convert.ToInt32(row[tb_prd_article2product.CN_SEQ]),
specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString()
});
}
}
// 扣掉現場銷貨的現貨order_detail qty
lBlocks.Clear();
cRes = null;
QueryJsonElement qjeMain5 = lBlocks.GetInst();
qjeMain5.table = tb_ord_order_master.TABLENAME;
qjeMain5.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "article_name"} },
};
qjeMain5.displaycols = new List<string>() { tb_ord_order_master.CN_UID };
List<WhereNode> lwMain5 = new List<WhereNode>();
lwMain5.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Arrived));
lwMain5.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Purchase));
if (isGroup)
{
lwMain5.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), groupUid));
}
else
{
lwMain5.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID]));
}
qjeMain5.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwMain5.ToArray());
QueryJsonElement qjeOrder5 = lBlocks.GetInst();
qjeOrder5.table = tb_ord_order_detail.TABLENAME;
qjeOrder5.jointype = QueryJsonElement.LEFT_JOIN;
qjeOrder5.jointable = qjeMain5;
qjeOrder5.joincols = new Dictionary<string, string>() {
{ tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
qjeOrder5.aliascols = new Dictionary<string, List<string>>
{
{ QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
{ QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } }
};
qjeOrder5.displaycols = new List<string>() { tb_ord_order_detail.CN_SPECIFICATION };
List<WhereNode> lwDetail5 = new List<WhereNode>();
lwDetail5.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
lwDetail5.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.Taked));
qjeOrder5.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_OR, lwDetail5.ToArray());
QueryJsonElement qjeProduct5 = lBlocks.GetInst();
qjeProduct5.table = tb_prd_article2product.TABLENAME;
qjeProduct5.jointype = QueryJsonElement.JOIN;
qjeProduct5.jointable = qjeOrder5;
qjeProduct5.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeProduct5.displaycols = new List<string>() {
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_SEQ
};
qjeProduct5.aliascols = new Dictionary<string, List<string>>
{
{ tb_prd_article2product.CN_UID, new List<string>() { tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID } },
};
qjeMain5.groupcols = new List<Tuple<QueryJsonElement, string>>
{
Tuple.Create(qjeMain5, tb_ord_order_master.CN_NAME),
Tuple.Create(qjeMain5, tb_ord_order_master.CN_UID),
Tuple.Create(qjeOrder5, tb_ord_order_detail.CN_SPECIFICATION),
Tuple.Create(qjeProduct5, tb_prd_article2product.CN_NAME),
Tuple.Create(qjeProduct5, tb_prd_article2product.CN_PRICE),
Tuple.Create(qjeProduct5, tb_prd_article2product.CN_UID),
Tuple.Create(qjeProduct5, tb_prd_article2product.CN_SEQ)
};
lBlocks.Add(qjeMain5);
lBlocks.Add(qjeOrder5);
lBlocks.Add(qjeProduct5);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ai = ArsenalDBMgr.GetInst(cRes);
QueryDataSet qds5 = ai.RunQueryDataSet(cRes);
foreach (DataRow row in qds5.DATA.Tables[0].Rows)
{
var orderCount = Convert.ToInt32(row["count"]);
if (orderCount > 0)
{
qds2Model.Add(new StockModel
{
uid = row[tb_ord_order_master.CN_UID].ToString(),
article2product_uid = row[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString(),
article_name = row["article_name"].ToString(),
name = row[tb_prd_article2product.CN_NAME].ToString(),
price = Convert.ToInt32(row[tb_prd_article2product.CN_PRICE]),
qty = -Convert.ToInt32(row["count"]),
seq = Convert.ToInt32(row[tb_prd_article2product.CN_SEQ]),
specification = row[tb_ord_order_detail.CN_SPECIFICATION].ToString(),
});
}
}
var Data = from x in qds.Concat(qds2Model).GroupBy(x => new { x.article2product_uid, x.specification })
select new StockModel
{
uid = x.FirstOrDefault().uid,
article2product_uid = x.Key.article2product_uid,
specification = x.Key.specification,
article_name = x.Select(x => x.article_name).FirstOrDefault(),
name = x.Select(x => x.name).FirstOrDefault(),
price = x.FirstOrDefault().price,
qty = x.Sum(c => c.qty),
seq = x.FirstOrDefault().seq
};
finalData = Data.Where(x => x.qty > 0).ToList<StockModel>();
}
while (false);
return sMsg;
}
public CResponseMessage UpdateDetail(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmdUpdate = new List<Command>();
CResponseMessage crmRes = null;
ArsenalInterface ai = null;
try
{
do
{
JArray jaData = i_crmInput.param[BLWording.UPD_MASTER] as JArray;
var now = DateTime.Now;
foreach (JToken joData in jaData)
{
Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
var orderQty = Convert.ToInt32(dicData[tb_ord_order_detail.CN_ORDER_QTY]); // 為 detail.order_qty - detail.take_qty
var returnQty = Convert.ToInt32(dicData[tb_ord_order_detail.CN_ORDER_QTY + "_copy"]);
var isEaqual = orderQty == returnQty;
var jaMember = dicData["member"] as JArray;
var aMember = jaMember.Select(x => x.ToString()).ToArray();
JArray orderUID = dicData[tb_ord_order_detail.CN_ORDER_UID] as JArray;
var aOrderUid = orderUID.Select(x => x.ToString()).ToArray();
// 用article2product_uid + member_uid + order_uid 查詢order_detail
tb_ord_order_detail cOrder = new tb_ord_order_detail();
cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_ORDER_UID, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_MEMBER_UID,
tb_ord_order_detail.CN_TAKE_QTY, tb_ord_order_detail.CN_PRICE, tb_ord_order_detail.CN_COMMENT_UID, tb_ord_order_detail.CN_COMMENT_TIME, tb_ord_order_detail.CN_STATUS, tb_ord_order_detail.CN_SPECIFICATION);
List<WhereNode> lwWhereData = new List<WhereNode>();
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicData[tb_ord_order_detail.CN_UID]));
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
if (dicData.ContainsKey(tb_ord_order_detail.CN_SPECIFICATION))
{
if (dicData[tb_ord_order_detail.CN_SPECIFICATION] != "" && dicData[tb_ord_order_detail.CN_UID] != null)
{
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_SPECIFICATION, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicData[tb_ord_order_detail.CN_SPECIFICATION]));
}
}
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aOrderUid));
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aMember));
Command cSelect = Command.SetupSelectCmd(cOrder, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwWhereData.ToArray()));
ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
foreach (var order in qdsOrder.OrderBy(x => x.comment_time))
{
// 判斷數量
if (returnQty > 0)
{
var orderDetailQty = order.order_qty - order.take_qty;
var updateNum = returnQty >= orderDetailQty ? orderDetailQty : returnQty;
tb_ord_order_detail cDetail = new tb_ord_order_detail();
if (orderDetailQty == updateNum)
{
// 如果已經收過款退貨改新增一筆退貨 原訂單改已收款
if (order.take_qty > 0 && order.status == (int)Enums.OrderStatus.NotTake)
{
// 新增退貨訂單order
string sNewArticleUid = Guid.NewGuid().ToString();
tb_ord_order_detail cNew = new tb_ord_order_detail()
{
uid = sNewArticleUid,
order_uid = order.order_uid,
article2product_uid = order.article2product_uid,
member_uid = order.member_uid,
order_qty = updateNum,
take_qty = 0,
price = updateNum * order.price / order.order_qty,
status = (int)Enums.OrderStatus.Return,
comment_uid = order.comment_uid,
comment_time = order.comment_time,
operate_date = now,
specification = order.specification
};
cDetail.order_qty = order.order_qty - updateNum;
cDetail.price = (order.order_qty - updateNum) * order.price / order.order_qty;
cDetail.status = (int)Enums.OrderStatus.Taked;
cDetail.operate_date = now;
lCmdUpdate.Add(Command.SetupInsertCmd(cNew));
}
else
{
cDetail.status = (int)Enums.OrderStatus.Return;
cDetail.operate_date = now;
}
}
else
{
// 部分退則改變訂單量
cDetail.order_qty = order.order_qty - updateNum;
cDetail.price = (order.order_qty - updateNum) * order.price / order.order_qty;
// 新增退貨訂單order
string sNewArticleUid = Guid.NewGuid().ToString();
tb_ord_order_detail cNew = new tb_ord_order_detail()
{
uid = sNewArticleUid,
order_uid = order.order_uid,
article2product_uid = order.article2product_uid,
member_uid = order.member_uid,
order_qty = updateNum,
take_qty = 0,
price = updateNum * order.price / order.order_qty,
status = (int)Enums.OrderStatus.Return,
comment_uid = order.comment_uid,
comment_time = order.comment_time,
operate_date = now,
specification = order.specification
};
lCmdUpdate.Add(Command.SetupInsertCmd(cNew));
}
tb_ord_order_detail cDetailCon = new tb_ord_order_detail() { uid = order.uid };
lCmdUpdate.Add(Command.SetupUpdateCmd(cDetail, cDetailCon));
// 更新退貨次數
sMsg = getUpdateReturnCountCmd(order.member_uid, 1);
if (sMsg != null)
{
break;
}
returnQty -= updateNum;
}
}
}
if (lCmdUpdate.Any())
{
ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lCmdUpdate);
string sErrorCode = GetLastErrorCode(lCmdUpdate);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(UpdateDetail)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage GetStockPurchase(CRequestMessage i_crmInput)
{
string sMsg = null;
CResponseMessage crmRes = null;
ArsenalInterface ai = null;
try
{
do
{
Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput);
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeProduct = lBlocks.GetInst();
qjeProduct.table = tb_prd_article2product.TABLENAME;
qjeProduct.displaycols = new List<string>() {
tb_prd_article2product.CN_UID,
tb_prd_article2product.CN_SEQ,
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE
};
qjeProduct.wherecols = new WhereNode(tb_prd_article2product.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_prd_article2product), dicCondition[tb_ord_order_master.CN_UID]);
QueryJsonElement qjeA = lBlocks.GetInst();
qjeA.table = tb_ord_order_master.TABLENAME;
qjeA.jointype = QueryJsonElement.JOIN;
qjeA.jointable = qjeProduct;
qjeA.joincols = new Dictionary<string, string>() {
{ tb_ord_order_master.CN_UID,tb_prd_article2product.CN_ORDER_UID }};
qjeA.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "order_name"} }
};
QueryJsonElement qjeDetail = lBlocks.GetInst();
qjeDetail.table = tb_ord_purchase_detail.TABLENAME;
qjeDetail.jointype = QueryJsonElement.JOIN;
qjeDetail.jointable = qjeProduct;
qjeDetail.joincols = new Dictionary<string, string>() {
{ tb_ord_purchase_detail.CN_ARTICLE2PRODUCT_UID,tb_prd_article2product.CN_UID }};
qjeDetail.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_purchase_detail.CN_QTY, new List<string>() { tb_ord_order_detail.CN_ORDER_QTY} }
};
qjeDetail.displaycols = new List<string>() { tb_ord_purchase_detail.CN_QTY };
QueryJsonElement qjeMain = lBlocks.GetInst();
qjeMain.table = tb_ord_purchase.TABLENAME;
qjeMain.jointype = QueryJsonElement.JOIN;
qjeMain.jointable = qjeDetail;
qjeMain.joincols = new Dictionary<string, string>() {
{ tb_ord_purchase.CN_UID,tb_ord_purchase_detail.CN_PURCHASE_UID }};
qjeMain.displaycols = new List<string>() { tb_ord_purchase.CN_MEMBER_UID };
QueryJsonElement qjeMember = lBlocks.GetInst();
qjeMember.table = tb_meb_member.TABLENAME;
qjeMember.jointype = QueryJsonElement.JOIN;
qjeMember.jointable = qjeMain;
qjeMember.joincols = new Dictionary<string, string>() {
{ tb_meb_member.CN_UID,tb_ord_purchase.CN_MEMBER_UID }};
qjeMember.aliascols = new Dictionary<string, List<string>>
{
{tb_meb_member.CN_NAME , new List<string>() { "member_name"} }
};
lBlocks.Add(qjeProduct);
lBlocks.Add(qjeA);
lBlocks.Add(qjeDetail);
lBlocks.Add(qjeMain);
lBlocks.Add(qjeMember);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null)
{
break;
}
ai = ArsenalDBMgr.GetInst(cRes);
List<OrderDetail> qds = ai.RunQueryList<OrderDetail>(cRes);
foreach (var data in qds)
{
data.status = (int)Enums.OrderStatus.Taked;
}
var groupData = qds.GroupBy(x => new { x.member_uid, x.member_name }).ToList();
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, groupData);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(GetStockPurchase)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage AbandonOrder(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmdUpdate = new List<Command>();
CResponseMessage crmRes = null;
ArsenalInterface ai = null;
try
{
do
{
JArray jaData = i_crmInput.param[BLWording.UPD_MASTER] as JArray;
var abandonReason = i_crmInput.param.ContainsKey(tb_ord_order_detail.CN_ABANDON_REASON) ? i_crmInput.param[tb_ord_order_detail.CN_ABANDON_REASON]?.ToString() : null;
foreach (JToken joData in jaData)
{
Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
var orderQty = Convert.ToInt32(dicData[tb_ord_order_detail.CN_ORDER_QTY]); // 為 detail.order_qty - detail.take_qty
var returnQty = Convert.ToInt32(dicData[tb_ord_order_detail.CN_ORDER_QTY + "_copy"]);
var isEaqual = orderQty == returnQty;
var jaMember = dicData["member"] as JArray;
var aMember = jaMember.Select(x => x.ToString()).ToArray();
JArray orderUID = dicData[tb_ord_order_detail.CN_ORDER_UID] as JArray;
var aOrderUid = orderUID.Select(x => x.ToString()).ToArray();
// 用article2product_uid + member_uid + order_uid 查詢order_detail
tb_ord_order_detail cOrder = new tb_ord_order_detail();
cOrder.SetDirty(tb_ord_order_detail.CN_UID, tb_ord_order_detail.CN_ORDER_UID, tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, tb_ord_order_detail.CN_ORDER_QTY, tb_ord_order_detail.CN_MEMBER_UID,
tb_ord_order_detail.CN_TAKE_QTY, tb_ord_order_detail.CN_PRICE, tb_ord_order_detail.CN_COMMENT_UID, tb_ord_order_detail.CN_COMMENT_TIME, tb_ord_order_detail.CN_SPECIFICATION);
List<WhereNode> lwWhereData = new List<WhereNode>();
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicData[tb_ord_order_detail.CN_UID]));
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), (int)Enums.OrderStatus.NotTake));
if (dicData.ContainsKey(tb_ord_order_detail.CN_SPECIFICATION))
{
if (dicData[tb_ord_order_detail.CN_SPECIFICATION] != "" && dicData[tb_ord_order_detail.CN_UID] != null)
{
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_SPECIFICATION, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), dicData[tb_ord_order_detail.CN_SPECIFICATION]));
}
}
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aOrderUid));
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_MEMBER_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_detail), aMember));
Command cSelect = Command.SetupSelectCmd(cOrder, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwWhereData.ToArray()));
ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
var now = DateTime.Now;
foreach (var order in qdsOrder.OrderBy(x => x.comment_time))
{
if (isEaqual)
{
// 全部棄單 => 將訂單狀態更改為棄單
tb_ord_order_detail orderDetail = new tb_ord_order_detail()
{
status = (int)Enums.OrderStatus.Abandon,
abandon_reason = abandonReason,
operate_date = now
};
tb_ord_order_detail orderDetailCon = new tb_ord_order_detail() { uid = order.uid };
lCmdUpdate.Add(Command.SetupUpdateCmd(orderDetail, orderDetailCon));
}
else
{
// 判斷數量
if (returnQty > 0)
{
var orderDetailQty = order.order_qty - order.take_qty;
var updateNum = returnQty >= orderDetailQty ? orderDetailQty : returnQty;
tb_ord_order_detail cDetail = new tb_ord_order_detail();
if (orderDetailQty == updateNum)
{
// 棄單量>=訂購量 => 全部棄
cDetail.status = (int)Enums.OrderStatus.Abandon;
cDetail.abandon_reason = abandonReason;
cDetail.operate_date = now;
}
else
{
// 更新原本訂單
cDetail.order_qty = order.order_qty - updateNum;
cDetail.price = (order.order_qty - updateNum) * order.price / order.order_qty;
// 新增棄單訂單order
string sNewArticleUid = Guid.NewGuid().ToString();
tb_ord_order_detail cNew = new tb_ord_order_detail()
{
uid = sNewArticleUid,
order_uid = order.order_uid,
article2product_uid = order.article2product_uid,
member_uid = order.member_uid,
order_qty = updateNum,
take_qty = 0,
price = updateNum * order.price / order.order_qty,
status = (int)Enums.OrderStatus.Abandon,
comment_uid = order.comment_uid,
comment_time = order.comment_time,
abandon_reason = abandonReason,
operate_date = now,
specification = order.specification
};
lCmdUpdate.Add(Command.SetupInsertCmd(cNew));
}
tb_ord_order_detail cDetailCon = new tb_ord_order_detail() { uid = order.uid };
lCmdUpdate.Add(Command.SetupUpdateCmd(cDetail, cDetailCon));
returnQty -= updateNum;
}
}
// 更新退貨次數
sMsg = getUpdateReturnCountCmd(order.member_uid, 1);
if (sMsg != null)
{
break;
}
}
}
if (lCmdUpdate.Any())
{
ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lCmdUpdate);
string sErrorCode = GetLastErrorCode(lCmdUpdate);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(AbandonOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage CheckOutToOrder(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmdInsert = new List<Command>();
CResponseMessage crmRes = null;
ArsenalInterface ai = null;
try
{
do
{
JArray jaData = i_crmInput.param[BLWording.QRY_MASTER] as JArray;
Dictionary<string, object> dicCondition = GetQueryMasterFirstWhereData(i_crmInput);
Dictionary<string, object> dicData = jaData[0][BLWording.DATA].ToObject<Dictionary<string, object>>();
JObject orderData = dicData["orderData"] as JObject;
JObject memberData = dicData["memberData"] as JObject;
var session = ProjectHelper.GetLoginUser(i_crmInput);
if (session == null)
{
sMsg = "Session error!!";
Logger.Error($"Session error!! i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ");
}
string receiveBranchUid = session.receive_branch_uid;
JArray detailData = dicData[BLWording.DATA] as JArray;
if (orderData.ContainsKey(tb_ord_order_master.CN_GROUP_UID))
{
if (orderData[tb_grp_branch.CN_UID].ToString() != receiveBranchUid)
{
sMsg = "請勿跨分店購買現貨";
break;
}
}
// 獲得該分店之現貨狀況
sMsg = GetFinalData(dicCondition, receiveBranchUid, out List<StockModel> finalData, out List<tb_grp_group> qdsGroup);
tb_grp_group cGroup = new tb_grp_group();
cGroup.SetDirty(tb_grp_group.CN_FB_GROUP_ID);
tb_grp_group cCon = new tb_grp_group()
{
uid = orderData[tb_ord_order_master.CN_GROUP_UID].ToString(),
};
Command cSelect = Command.SetupSelectCmd(cGroup, cCon);
ArsenalInterface ai2 = ArsenalDBMgr.GetInst(cSelect);
List<tb_grp_group> qdsGroupFBData = ai2.RunQueryList<tb_grp_group>(cSelect);
string memberUid = memberData != null ? memberData[tb_meb_member.CN_UID].ToString() : getAdditionalPurchaseMemberId(qdsGroupFBData[0].fb_group_id);
List<string> MasterUid = new List<string>();
foreach (JObject row in detailData)
{
Dictionary<string, object> dicInput = row.ToObject<Dictionary<string, object>>();
string article2productUid = dicInput[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString();
int takeQty = Convert.ToInt32(dicInput[tb_ord_order_detail.CN_TAKE_QTY]);
int price = Convert.ToInt32(dicInput[tb_ord_order_detail.CN_PRICE]);
string specification = dicInput.ContainsKey(tb_ord_order_detail.CN_SPECIFICATION) ? dicInput[tb_ord_order_detail.CN_SPECIFICATION].ToString() : null;
// 比較該分店之現貨與欲購買現貨的數量
var comparedData = finalData.Where(x => x.article2product_uid == article2productUid && x.specification == specification);
if (!comparedData.Any())
{
Logger.Debug("商品uid =" + article2productUid + " 規格:" + specification);
sMsg = "分店無此現貨商品";
break;
}
if (takeQty > comparedData.FirstOrDefault().qty)
{
sMsg = "分店現貨商品的數量數量不足";
break;
}
string sNewOrderMasterUid = Guid.NewGuid().ToString();
MasterUid.Add(sNewOrderMasterUid);
tb_ord_order_master cMasterNew = new tb_ord_order_master()
{
uid = sNewOrderMasterUid,
type = 3,
name = dicInput["article_name"].ToString(),
order_code = new GROUP.Helper.FbHelper().GetOrderCode(),
group_uid = orderData.ContainsKey(tb_ord_order_master.CN_GROUP_UID) ? orderData[tb_ord_order_master.CN_GROUP_UID].ToString() : orderData[tb_grp_group.CN_UID].ToString(),
branch_uid = session.receive_branch_uid,
status = (int)OrderMainStatus.Arrived,
};
lCmdInsert.Add(Command.SetupInsertCmd(cMasterNew));
string sNewOrderDetailUid = Guid.NewGuid().ToString();
tb_ord_order_detail cNew = new tb_ord_order_detail()
{
uid = sNewOrderDetailUid,
order_uid = sNewOrderMasterUid,
article2product_uid = article2productUid,
member_uid = memberUid,
order_qty = takeQty,
take_qty = 0,
price = takeQty * price,
specification = specification == "" ? null : specification,
status = (int)Enums.OrderStatus.NotTake,
comment_time = DateTime.Now,
};
lCmdInsert.Add(Command.SetupInsertCmd(cNew));
}
if (sMsg != null)
{
break;
}
if (lCmdInsert.Any())
{
ai = ArsenalDBMgr.GetInst(lCmdInsert[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lCmdInsert);
string sErrorCode = GetLastErrorCode(lCmdInsert);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param[BLWording.DATA] = MasterUid;
crmRes.param.Add("memberUid", memberUid);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(CheckOutToOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage QrcodeToPurchase(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmdInsert = new List<Command>();
List<Command> lCmdsDetail = new List<Command>();
List<Command> lCmdsUpdate = new List<Command>();
Command cRes = null;
CResponseMessage crmRes = null;
ArsenalInterface ai = null;
try
{
do
{
JArray jaData = i_crmInput.param[BLWording.UPD_MASTER] as JArray;
Dictionary<string, object> dicData = jaData[0][BLWording.DATA].ToObject<Dictionary<string, object>>();
JObject memberData = dicData["memberData"] as JObject;
string memberUid = memberData["member_uid"].ToString();
var addMainData = new List<tb_ord_purchase>();
var session = ProjectHelper.GetLoginUser(i_crmInput);
if (session == null)
{
sMsg = "Session error!!";
Logger.Error($"Session error!! i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ");
}
string receive_branch_uid = session.receive_branch_uid;
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeA = lBlocks.GetInst();
qjeA.table = tb_ord_order_detail.TABLENAME;
qjeA.displaycols = new List<string>()
{
tb_ord_order_detail.CN_UID,
tb_ord_order_detail.CN_ORDER_QTY,
tb_ord_order_detail.CN_TAKE_QTY,
tb_ord_order_detail.CN_STATUS,
tb_ord_order_detail.CN_MEMBER_UID,
tb_ord_order_detail.CN_SPECIFICATION,
tb_ord_order_detail.CN_COMMENT_TIME,
tb_ord_order_detail.CN_MEMO,
tb_ord_order_detail.CN_ORDER_UID
};
List<WhereNode> lswnMain = new List<WhereNode>();
lswnMain.Add(new WhereNode(tb_ord_order_detail.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), (int)Enums.OrderStatus.NotTake));
if (lswnMain.Any())
{
qjeA.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray());
}
QueryJsonElement qjeMain = lBlocks.GetInst();
qjeMain.table = tb_ord_order_master.TABLENAME;
qjeMain.jointype = QueryJsonElement.LEFT_JOIN;
qjeMain.jointable = qjeA;
qjeMain.joincols = new Dictionary<string, string>() {
{ tb_ord_order_master.CN_UID,tb_ord_order_detail.CN_ORDER_UID }};
qjeMain.displaycols = new List<string>()
{
tb_ord_order_master.CN_BRANCH_UID,
tb_ord_order_master.CN_ORDER_CODE
};
qjeMain.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_master.CN_NAME, new List<string>() { "order_name" } }
};
QueryJsonElement qjeB = lBlocks.GetInst();
qjeB.table = tb_meb_member.TABLENAME;
qjeB.jointype = QueryJsonElement.LEFT_JOIN;
qjeB.jointable = qjeA;
qjeB.joincols = new Dictionary<string, string>() {
{ tb_meb_member.CN_UID,tb_ord_order_detail.CN_MEMBER_UID }};
qjeB.displaycols = new List<string>()
{
tb_meb_member.CN_WPRICE_PAYMENT,
};
qjeB.aliascols = new Dictionary<string, List<string>>
{
{ tb_meb_member.CN_NAME, new List<string>() { "member_name" } },
};
qjeB.wherecols = new WhereNode(tb_meb_member.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_meb_member), memberUid);
QueryJsonElement qjeC = lBlocks.GetInst();
qjeC.table = tb_grp_branch.TABLENAME;
qjeC.jointype = QueryJsonElement.LEFT_JOIN;
qjeC.jointable = qjeMain;
qjeC.joincols = new Dictionary<string, string>() {
{ tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
qjeC.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
qjeC.wherecols = new WhereNode(tb_grp_branch.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_branch), receive_branch_uid);
QueryJsonElement qjeD = lBlocks.GetInst();
qjeD.table = tb_prd_article2product.TABLENAME;
qjeD.jointype = QueryJsonElement.JOIN;
qjeD.jointable = qjeA;
qjeD.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeD.displaycols = new List<string>() {
tb_prd_article2product.CN_NAME,
tb_prd_article2product.CN_PRICE,
tb_prd_article2product.CN_WHOLESALE_PRICE,
tb_prd_article2product.CN_SEQ
};
qjeD.aliascols = new Dictionary<string, List<string>>
{
{ tb_prd_article2product.CN_UID, new List<string>() { "article2product_uid" } },
};
QueryJsonElement qjeE = lBlocks.GetInst();
qjeE.table = tb_grp_article.TABLENAME;
qjeE.jointype = QueryJsonElement.LEFT_JOIN;
qjeE.jointable = qjeD;
qjeE.joincols = new Dictionary<string, string>() {
{ tb_grp_article.CN_UID,tb_prd_article2product.CN_ARTICLE_UID }};
qjeE.aliascols = new Dictionary<string, List<string>>
{
{ tb_grp_article.CN_NAME, new List<string>() { "article_name" } },
};
qjeE.displaycols = new List<string>() { tb_grp_article.CN_DUTYFREE, };
lBlocks.Add(qjeA);
lBlocks.Add(qjeMain);
lBlocks.Add(qjeB);
lBlocks.Add(qjeC);
lBlocks.Add(qjeD);
lBlocks.Add(qjeE);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ai = ArsenalDBMgr.GetInst(cRes);
var qds = ai.RunQueryList<OrderDetail>(cRes);
var pro = qds.GroupBy(x => new { x.uid, x.order_uid, x.branch_uid, x.branch_name, x.status, x.specification })
.Select(x => new OrderDetail
{
order_qty = x.Sum(c => c.order_qty),
take_qty = x.Sum(c => c.take_qty),
price = x.Select(x => x.price).FirstOrDefault(),
wholesale_price = x.Select(x => x.wholesale_price).FirstOrDefault(),
specification = x.Key.specification,
uid = x.Key.uid,
order_uid = x.Key.order_uid,
seq = x.Select(x => x.seq).FirstOrDefault(),
name = x.Select(x => x.name).FirstOrDefault(),
member_uid = x.Select(x => x.member_uid).FirstOrDefault(),
member_name = x.Select(x => x.member_name).FirstOrDefault(),
status = x.Key.status,
article_name = x.Select(x => x.article_name).FirstOrDefault(),
order_name = x.Select(x => x.order_name).FirstOrDefault(),
memo = x.Select(x => x.memo).FirstOrDefault(),
branch_uid = x.Key.branch_uid,
branch_name = x.Key.branch_name,
comment_time = x.Select(x => x.comment_time).FirstOrDefault(),
wprice_payment = x.Select(x => x.wprice_payment).FirstOrDefault(),
article2product_uid = x.FirstOrDefault().article2product_uid,
dutyfree = x.FirstOrDefault()?.dutyfree
});
var memberUID = memberUid;
var purchaseUID = addMainData.Any() ? addMainData.Select(x => x.uid).SingleOrDefault() : Guid.NewGuid().ToString();
var amount = 0;
foreach (var detail in pro)
{
// 新增收款明細
var price = detail.wprice_payment == 0 ? detail.price : detail.wholesale_price;
tb_ord_purchase_detail cDeatil = new tb_ord_purchase_detail()
{
purchase_uid = purchaseUID,
branch_uid = receive_branch_uid,
order_detail_uid = detail.uid,
article2product_uid = detail.article2product_uid,
qty = detail.order_qty - detail.take_qty,
amount = (detail.order_qty - detail.take_qty) * price,
specification = detail.specification
};
lCmdsDetail.Add(Command.SetupInsertCmd(cDeatil));
amount = cDeatil.amount;
lCmdsUpdate.Add(Command.SetupUpdateCmd(new tb_ord_order_detail()
{
status = (int)Enums.OrderStatus.Taked,
take_qty = cDeatil.qty + detail.take_qty,
operate_date = DateTime.Now
}
, new tb_ord_order_detail() { uid = detail.uid }));
if (addMainData.Any(x => x.member_uid == memberUID))
{
var model = addMainData.Where(x => x.member_uid == memberUID).SingleOrDefault();
model.amount += amount;
}
else
{
tb_ord_purchase cNew = new tb_ord_purchase()
{
uid = purchaseUID,
member_uid = memberUID,
amount = amount,
receive_branch_uid = receive_branch_uid
};
addMainData.Add(cNew);
}
}
foreach (var mainData in addMainData)
{
lCmdInsert.Add(Command.SetupInsertCmd(mainData));
tb_meb_shopping_points_record cPointsNew = new tb_meb_shopping_points_record()
{
uid = Guid.NewGuid().ToString(),
member_uid = mainData.member_uid,
amount = (int)(mainData.amount / 100),
purchase_uid = mainData.uid
};
lCmdInsert.Add(Command.SetupInsertCmd(cPointsNew));
}
lCmdInsert.AddRange(lCmdsDetail);
lCmdInsert.AddRange(lCmdsUpdate);
if (lCmdInsert.Any())
{
ArsenalInterface ai2 = ArsenalDBMgr.GetInst(lCmdInsert[0], GetDefaultSystemColumnInfo());
ai2.RunEditCmds(lCmdInsert);
string sErrorCode = GetLastErrorCode(lCmdInsert);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param.Add(BLWording.DATA, pro);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(CheckOutToOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public CResponseMessage ReturnArchiveOrder(CRequestMessage i_crmInput)
{
string sMsg = null;
List<Command> lCmdUpdate = new List<Command>();
CResponseMessage crmRes = null;
ArsenalInterface ai = null;
try
{
do
{
sMsg = getCommonParameter(i_crmInput, BLWording.UPD_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession);
JArray dataArray = jaDataArray[0]["data"] as JArray;
foreach (JToken joData in dataArray)
{
Dictionary<string, object> dicData = joData.ToObject<Dictionary<string, object>>();
string orderUID = dicData[tb_ord_order_master.CN_UID].ToString();
// 用article2product_uid + member_uid + order_uid 查詢order_detail
tb_ord_order_detail cOrder = new tb_ord_order_detail();
cOrder.SetFullDirty();
List<WhereNode> lwWhereData = new List<WhereNode>();
lwWhereData.Add(new WhereNode(tb_ord_order_detail.CN_ORDER_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_detail), orderUID));
Command cSelect = Command.SetupSelectCmd(cOrder, new WhereNode(WhereNode.ENodeOperation.ENO_AND, lwWhereData.ToArray()));
ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_ord_order_detail> qdsOrder = ai.RunQueryList<tb_ord_order_detail>(cSelect);
bool isArrived = false;
foreach (var order in qdsOrder)
{
int stock = GetOrderProductStock(order.order_uid, order.article2product_uid, order.specification);
if (stock > 0)
{
isArrived = true;
}
// 將原本轉退貨的訂單轉回已到貨
if (order.status == (int)Enums.OrderStatus.Return && order.take_qty == 0)
{
tb_ord_order_detail upOrderDetail = new tb_ord_order_detail()
{
status = (int)Enums.OrderStatus.NotTake,
operate_date = null
};
tb_ord_order_detail upOrderDetailCon = new tb_ord_order_detail() { uid = order.uid };
lCmdUpdate.Add(Command.SetupUpdateCmd(upOrderDetail, upOrderDetailCon));
sMsg = getUpdateReturnCountCmd(order.member_uid, -1);
if (sMsg != null)
{
break;
}
}
}
tb_ord_order_master upData = new tb_ord_order_master() { status = isArrived ? (int)Enums.OrderMainStatus.Arrived : (int)Enums.OrderMainStatus.NotArrived };
tb_ord_order_master upCon = new tb_ord_order_master() { uid = orderUID };
lCmdUpdate.Add(Command.SetupUpdateCmd(upData, upCon));
}
if (lCmdUpdate.Any())
{
ai = ArsenalDBMgr.GetInst(lCmdUpdate[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lCmdUpdate);
string sErrorCode = GetLastErrorCode(lCmdUpdate);
if (sErrorCode != null)
{
sMsg = sErrorCode;
break;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(ReturnArchiveOrder)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
public static string getAdditionalPurchaseMemberId(string groupId)
{
tb_meb_member cMember = new tb_meb_member();
cMember.SetDirty(tb_meb_member.CN_UID);
tb_meb_member cCon = new tb_meb_member()
{
name = "現貨銷售",
group_id = groupId
};
Command cSelect = Command.SetupSelectCmd(cMember, cCon);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_meb_member> qdsMember = ai.RunQueryList<tb_meb_member>(cSelect);
return qdsMember[0].uid;
}
public string getUpdateReturnCountCmd(string memberUid, int count)
{
string sMsg = null;
tb_meb_member cMember = new tb_meb_member();
cMember.SetDirty(tb_meb_member.CN_RETURN_COUNT);
tb_meb_member cCon = new tb_meb_member()
{
uid = memberUid
};
Command cSelect = Command.SetupSelectCmd(cMember, cCon);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_meb_member> qdsMember = ai.RunQueryList<tb_meb_member>(cSelect);
if (qdsMember.Count < 1)
{
return null;
}
Command cCmd = Command.SetupUpdateCmd(new tb_meb_member()
{
return_count = qdsMember[0].return_count + count
}
, new tb_meb_member() { uid = memberUid });
ai = ArsenalDBMgr.GetInst(cCmd, GetDefaultSystemColumnInfo());
ai.RunEditSingleCmd(cCmd);
string sErrorCode = GetLastErrorCode(cCmd);
if (sErrorCode != null)
{
sMsg = sErrorCode;
}
return sMsg;
}
public CResponseMessage GetOrders(CRequestMessage i_crmInput)
{
string sMsg;
Command cRes = null;
CResponseMessage crmRes = null;
try
{
do
{
sMsg = getCommonParameter(i_crmInput, BLWording.QRY_MASTER, out JArray jaDataArray, out tb_sys_session sUserSession, false);
if (sMsg != null)
{
break;
}
Dictionary<string, string> dicCondition = GetQueryMasterFirstQJEDicwherecols(i_crmInput); // 取得condition
var lsBranch = ProjectHelper.GetUserGroup(i_crmInput);
var userBranch = ProjectHelper.GetUserBranch(i_crmInput);
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
bool isGroup = false;
QueryJsonElement qjeMain = lBlocks.GetInst();
qjeMain.table = tb_ord_order_master.TABLENAME;
qjeMain.displaycols = new List<string>() {
tb_ord_order_master.CN_UID,
tb_ord_order_master.CN_TYPE,
tb_ord_order_master.CN_ORDER_CODE,
tb_ord_order_master.CN_STATUS,
tb_ord_order_master.CN_CREATE_DATE,
tb_ord_order_master.CN_GROUP_UID,
tb_ord_order_master.CN_BRANCH_UID,
tb_ord_order_master.CN_ARRIVED_DATE,
tb_ord_order_master.CN_ARTICLE_UID,
tb_ord_order_master.CN_NAME
};
List<WhereNode> lswnMain = new List<WhereNode>();
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_TYPE, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.ArticleType.Purchase));
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), BLWording.STATUS_FLAG_ON));
if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_start"))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_start"]));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_CREATE_DATE + "_end"))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_CREATE_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_order_master), Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_CREATE_DATE + "_end"]).AddDays(1)));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_STATUS))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_STATUS]));
}
else
{
// 扣除封存訂單
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_STATUS, WhereNode.EColumnOperation.EOT_NEQ, typeof(tb_ord_order_master), (int)Enums.OrderMainStatus.Archive));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_ORDER_CODE))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ORDER_CODE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_ORDER_CODE]));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_start"))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ARRIVED_DATE, WhereNode.EColumnOperation.EOT_GTEQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_start"]));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_ARRIVED_DATE + "_end"))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_ARRIVED_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_ord_order_master), Convert.ToDateTime(dicCondition[tb_ord_order_master.CN_ARRIVED_DATE + "_end"]).AddDays(1)));
}
if (dicCondition.ContainsKey(tb_ord_order_master.CN_UID))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_UID]));
}
List<WhereNode> lswnGroup = new List<WhereNode>();
if (dicCondition.ContainsKey(tb_ord_order_master.CN_GROUP_UID))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_GROUP_UID]));
}
else if (dicCondition.ContainsKey("GroupOrBranch_uid")) // 處理shopping list 搜尋選項 uid 有可能是branch or group
{
tb_grp_group cGroup = new tb_grp_group();
cGroup.SetFullDirty();
WhereNode wnGroup = new WhereNode(tb_grp_group.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_group), dicCondition["GroupOrBranch_uid"].ToString());
Command gSelect = Command.SetupSelectCmd(cGroup, wnGroup);
ArsenalInterface aiGroup = ArsenalDBMgr.GetInst(gSelect);
var qdsGroup = aiGroup.RunQueryList<tb_grp_group>(gSelect);
if (qdsGroup.Any())
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition["GroupOrBranch_uid"].ToString()));
isGroup = true;
}
}
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_GROUP_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), lsBranch.ToArray()));
if (dicCondition.ContainsKey(tb_ord_order_master.CN_BRANCH_UID))
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition[tb_ord_order_master.CN_BRANCH_UID].ToString()));
}
else if (dicCondition.ContainsKey("GroupOrBranch_uid") && !isGroup)
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_ord_order_master), dicCondition["GroupOrBranch_uid"].ToString()));
}
else
{
lswnMain.Add(new WhereNode(tb_ord_order_master.CN_BRANCH_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_ord_order_master), userBranch.ToArray()));
}
if (lswnMain.Any())
{
qjeMain.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND, lswnMain.ToArray());
}
QueryJsonElement qjeOrder = lBlocks.GetInst();
qjeOrder.table = tb_ord_order_detail.TABLENAME;
qjeOrder.jointype = QueryJsonElement.LEFT_JOIN;
qjeOrder.jointable = qjeMain;
qjeOrder.joincols = new Dictionary<string, string>() {
{ tb_ord_order_detail.CN_ORDER_UID,tb_ord_order_master.CN_UID }};
qjeOrder.displaycols = new List<string>() {
tb_ord_order_detail.CN_ORDER_QTY,
tb_ord_order_detail.CN_TAKE_QTY,
};
qjeOrder.aliascols = new Dictionary<string, List<string>>
{
{ tb_ord_order_detail.CN_STATUS, new List<string>() { "detail_status" } },
//{ QueryJsonElement.SUM(tb_ord_order_detail.CN_ORDER_QTY), new List<string>() { "count" } },
//{ QueryJsonElement.SUM(tb_ord_order_detail.CN_TAKE_QTY), new List<string>() { "soldCount" } },
};
QueryJsonElement qjeGroup = lBlocks.GetInst();
qjeGroup.table = tb_grp_group.TABLENAME;
qjeGroup.jointype = QueryJsonElement.LEFT_JOIN;
qjeGroup.jointable = qjeMain;
qjeGroup.joincols = new Dictionary<string, string>() {
{ tb_grp_group.CN_UID,tb_ord_order_master.CN_GROUP_UID }};
QueryJsonElement qjeBranch = lBlocks.GetInst();
qjeBranch = lBlocks.GetInst();
qjeBranch.table = tb_grp_branch.TABLENAME;
qjeBranch.jointype = QueryJsonElement.LEFT_JOIN;
qjeBranch.jointable = qjeMain;
qjeBranch.joincols = new Dictionary<string, string>() {
{ tb_grp_branch.CN_UID,tb_ord_order_master.CN_BRANCH_UID }};
qjeBranch.displaycols = new List<string>() { tb_grp_branch.CN_BRANCH_NAME };
QueryJsonElement qjeArticleProduct = lBlocks.GetInst();
qjeArticleProduct.table = tb_prd_article2product.TABLENAME;
qjeArticleProduct.jointype = QueryJsonElement.LEFT_JOIN;
qjeArticleProduct.jointable = qjeOrder;
qjeArticleProduct.joincols = new Dictionary<string, string>() {
{ tb_prd_article2product.CN_UID,tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID }};
qjeArticleProduct.displaycols = new List<string>() {
tb_prd_article2product.CN_PRICE
};
if (dicCondition.ContainsKey(tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID))
{
qjeArticleProduct.wherecols = new WhereNode(tb_prd_article2product.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_prd_article2product), dicCondition[tb_ord_order_detail.CN_ARTICLE2PRODUCT_UID].ToString());
}
//qjeArticleProduct.groupcols = new List<Tuple<QueryJsonElement, string>>
//{
// Tuple.Create(qjeMain, tb_ord_order_master.CN_UID),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_ARTICLE_UID),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_TYPE),
// Tuple.Create(qjeMain,tb_ord_order_master.CN_STATUS),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_CREATE_DATE),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_ORDER_CODE),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_BRANCH_UID),
// Tuple.Create(qjeMain, tb_ord_order_master.CN_ARRIVED_DATE),
// Tuple.Create(qjeMain, tb_grp_branch.CN_GROUP_UID),
// Tuple.Create(qjeMain, tb_grp_article.CN_NAME),
// Tuple.Create(qjeBranch, tb_grp_branch.CN_BRANCH_NAME),
// Tuple.Create(qjeArticleProduct, tb_prd_article2product.CN_PRICE)
//};
lBlocks.Add(qjeMain);
lBlocks.Add(qjeOrder);
lBlocks.Add(qjeGroup);
lBlocks.Add(qjeBranch);
lBlocks.Add(qjeArticleProduct);
sMsg = MakeSelectJoinByBlocks(lBlocks, out cRes);
if (sMsg != null)
{
break;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
var qds = ai.RunQueryList<OrderDetailEx>(cRes);
var groupData = qds.GroupBy(x => x.uid).ToList();
var res = new List<OrderMaster>();
foreach (var data in groupData)
{
var model = new OrderMaster()
{
uid = data.Key,
article_uid = data.Select(x => x.article_uid).FirstOrDefault(),
order_code = data.Select(x => x.order_code).FirstOrDefault(),
group_uid = data.Select(x => x.group_uid).FirstOrDefault(),
branch_uid = data.Select(x => x.branch_uid).FirstOrDefault(),
branch_name = data.Select(x => x.branch_name).FirstOrDefault(),
name = data.Select(x => x.type).FirstOrDefault() == (int)Enums.ArticleType.Stock ? string.Format("【現貨】{0}", data.Select(x => x.name).FirstOrDefault()) : data.Select(x => x.name).FirstOrDefault(),
create_date = data.Select(x => x.create_date).FirstOrDefault(),
arrived_date = data.Select(x => x.arrived_date).FirstOrDefault(),
status = data.Select(x => x.status).FirstOrDefault(),
type = data.Select(x => x.type).FirstOrDefault()
};
res.Add(model);
}
var orderData = res.OrderByDescending(x => x.create_date).ToList();
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param[BLWording.DATA] = orderData;
}
while (false);
}
catch (Exception ex)
{
LogHelper.DBLog(Util.GetLastExceptionMsg(ex));
sMsg = $"{nameof(GetProduct)} unknwon exception. i_crmInput={JsonConvert.SerializeObject(i_crmInput)}. ";
#if DEBUG
System.Diagnostics.Debug.WriteLine(sMsg);
#endif
}
if (null != sMsg)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
/// <summary>
/// 取得所有分店跟分店所屬社團的資訊
/// </summary>
/// <returns></returns>
private List<GroupBranch> GetBranchGroupList()
{
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
string sMsg = "";
QueryJsonElement branch = lBlocks.GetInst();
branch.table = tb_grp_branch.TABLENAME;
branch.displaycols = new List<string>() {
tb_grp_branch.CN_BRANCH_NAME ,
tb_grp_branch.CN_UID,
tb_grp_branch.CN_ADDRESS,
tb_grp_branch.CN_PHONE_NUMBER,
tb_grp_branch.CN_CONTACT_PERSON,
tb_grp_branch.CN_SEQ
};
QueryJsonElement group = lBlocks.GetInst();
group.table = tb_grp_group.TABLENAME;
group.displaycols = new List<string>() { tb_grp_group.CN_NAME};
group.jointype = QueryJsonElement.JOIN;
group.jointable = branch;
group.joincols = new Dictionary<string, string>() {{ tb_grp_group.CN_UID,tb_grp_branch.CN_GROUP_UID }};
lBlocks.Add(branch);
lBlocks.Add(group);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
if (sMsg != null)
{
throw new Exception(sMsg);
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
return ai.RunQueryList<GroupBranch>(cRes);
}
private (List<OrderMaster> records, int TotalCount) readCommandPostDataHandlerRefactor(CRequestMessage i_crmInput, Dictionary<string, string > dicCondition, List<string> lsBranch, List<string> userBranch, int nPageIdx, int nPageNum)
{
var records = new List<OrderMaster>();
var branchName = ProjectHelper.GetUserBranchAndName(i_crmInput);
// 查詢前10筆資料
var error = new SQLLib(new MSSQLDirectSQLHelper()).readCommandPostDataHandlerQueryDetailSortGuid(i_crmInput, dicCondition, lsBranch, userBranch, false, nPageIdx, nPageNum, out Command command_);
ArsenalInterface ai = ArsenalDBMgr.GetInst(command_);
var qdsOrderMst = ai.RunQueryList<OrderDetailEx>(command_);
if (!string.IsNullOrWhiteSpace(command_.LastErrorCode))
{
throw new Exception(command_.LastErrorCode);
}
// 查詢total數量
error = new SQLLib(new MSSQLDirectSQLHelper()).readCommandPostDataHandlerQueryDetailSortGuid(i_crmInput, dicCondition, lsBranch, userBranch, true, nPageIdx, nPageNum, out Command commandTotal_);
ai = ArsenalDBMgr.GetInst(commandTotal_);
var qdsOrderMstTotal = ai.RunQueryDataSet(commandTotal_, i_nPageIdx: nPageIdx, i_nNumOfPage: nPageNum);
if (!string.IsNullOrWhiteSpace(command_.LastErrorCode))
{
throw new Exception(command_.LastErrorCode);
}
Int32.TryParse(qdsOrderMstTotal.DATA.Tables[0].Rows[0]?[0]?.ToString(), out int TotalCount);
int sn = nPageIdx * nPageNum + 1;// 0 => 1
int received = 0;
int receivable = 0;
foreach (var detail in qdsOrderMst)
{
received = detail.received;
receivable = detail.receivable;
records.Add(new OrderMaster()
{
uid = detail.uid,
article_uid = detail.article_uid,
order_code = detail.order_code,
group_uid = detail.group_uid,
branch_uid = detail.branch_uid,
create_date = detail.create_date,
arrived_date = detail.arrived_date,
status = detail.status,
type = detail.type,
name = detail.name,
branch_name = branchName.Find(x => x.Uid == detail.branch_uid).BranchName,
received = received,
receivable = receivable,
progress = received == 0 || receivable == 0 ? "0%" : Math.Round((decimal)received / receivable * 100, 0, MidpointRounding.AwayFromZero).ToString() + "%",
remark = detail.remark,
sn = sn++,
});
}
return (records, TotalCount);
}
}
}