Files
17168ERP/web/App_Code/api/orderController.cs
2025-11-12 18:57:51 +08:00

1277 lines
52 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using PagedList;
using Newtonsoft.Json;
using System.Collections;
using static TreeView;
using Model;
using System.IdentityModel.Metadata;
using MyWeb;
using DocumentFormat.OpenXml.Drawing.Charts;
// api/order
//[ezAuthorize(Roles = "admin")]//群組:*
//[ezAuthorize]
public class orderController : ApiController
{
private Model.ezEntities _db = new Model.ezEntities();
// GET api/<controller>
// TODO: CRITICAL - 無參數 Get() 會載入所有訂單到內存(可能數千筆)
// 建議:停用此方法,強制使用分頁版本 Get(page, pageSize)
// 或改為return _db.pro_order.AsQueryable(); 讓客戶端決定如何處理
public IEnumerable<Model.pro_order> Get()
{
var list = _db.pro_order.ToList();
if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return list;
}
public IEnumerable<Model.pro_order> Get(int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
var list = _db.pro_order.OrderBy(o => o.order_no).ToPagedList(page, pageSize);
if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return list;
}
// GET api/<controller>/5
public Model.pro_order Get(string id)
{
var item = _db.pro_order.Where(q => q.order_no == id).FirstOrDefault();
//if (item == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return item;
}
// POST api/<controller>
public void Post([FromBody] Model.pro_order item)
{
}
// PUT api/<controller>/5
public void Put(int id, [FromBody] Model.pro_order item)
{
}
// DELETE api/<controller>/5
public void Delete(string id)
{
var prod = _db.pro_order.Where(q => q.order_no == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
//刪除掛單表單
var prod3 = _db.bed_order.Where(q => q.order_no == id).ToList();
if (prod3.Count > 0)
{
//刪除掛單明細
foreach (var item3 in prod3)
{
var prod4 = _db.bed_order_detail.Where(q => q.bed_order_no == item3.bed_order_no).ToList();
if (prod4.Count > 0)
{
_db.bed_order_detail.RemoveRange(prod4); //查詢結果全部刪除
}
}
_db.bed_order.RemoveRange(prod3); //查詢結果全部刪除
}
_db.pro_order_detail.RemoveRange(prod.pro_order_detail);
_db.pro_order.Remove(prod);
_db.SaveChanges();//執行
Model.admin_log admin_log = new Model.admin_log();
MyWeb.admin admin = new MyWeb.admin();//api裡不可以用MyWeb
if (admin.isLoign())
{
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Delete, prod.order_no);
}
}
}
[HttpDelete]
[Route("api/order/DeleteItem/{id}")]
public void DeleteDetail(int id) //刪除訂單明細
{
if (id > 0)
{
var prod = _db.pro_order_detail.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
//刪除掛單表單
var prod3 = _db.bed_order.Where(q => q.order_no == prod.order_no).ToList();
if (prod3.Count > 0) //count = 1
{
//刪除掛單明細
foreach (var item3 in prod3)
{
var prod4 = _db.bed_order_detail.Where(q => q.bed_order_no == item3.bed_order_no).ToList();
if (prod4.Count > 0)
{
_db.bed_order_detail.RemoveRange(prod4); //查詢結果全部刪除
}
}
_db.bed_order.RemoveRange(prod3); //查詢結果全部刪除
}
_db.pro_order_detail.Remove(prod);
_db.SaveChanges(); //執行
}
}
}
[HttpDelete]
[Route("api/order/DeleteAll/{nums}")]
public void DeleteAll(string nums)
{
if (!string.IsNullOrEmpty(nums))
{
var ids = nums.TrimEnd(',').Split(',');
var prod = _db.pro_order.Where(q => ids.Contains(q.order_no)).ToList();
if (prod.Count() > 0)
{
var prod2 = _db.pro_order_detail.Where(q => ids.Contains(Convert.ToString(q.order_no))).ToList();
if (prod2.Count > 0)
{
foreach (var item2 in prod2)
{
var prod3 = _db.bed_order.Where(q => q.order_no == item2.order_no && q.o_detail_id == item2.num).ToList();
if (prod3.Count > 0)
{
foreach (var item3 in prod3)
{
var prod4 = _db.bed_order_detail.Where(q => q.bed_order_no == item3.bed_order_no).ToList();
if (prod4.Count > 0)
{
_db.bed_order_detail.RemoveRange(prod4);
}
}
_db.bed_order.RemoveRange(prod3);
}
//var prod32 = _db.bed_order.AsEnumerable().Where(q => q.order_no == item2.order_no && q.o_detail_id == item2.num).ToList();
//var prod42 = _db.bed_order_detail.AsEnumerable().Where(q => prod32.Select(qf => qf.order_no).ToArray().Contains(q.bed_order_no)).ToList();
//_db.bed_order_detail.RemoveRange(prod42);
//_db.bed_order.RemoveRange(prod32);
}
_db.pro_order_detail.RemoveRange(prod2);
//_db.SaveChanges();
}
_db.pro_order.RemoveRange(prod);
_db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log();
MyWeb.admin admin = new MyWeb.admin();//api裡不可以用MyWeb
if (admin.isLoign())
{
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Delete, admin_log.LogViewBtn(prod.Select(x => x.order_no).ToList()));
}
}
}
}
[HttpGet]
[Route("api/order/count")]
public int Count()
{
var count = _db.pro_order.Count();
return count;
}
[HttpPost]
[Route("api/order/GetList")]
public IHttpActionResult GetList([FromBody] Model.ViewModel.pro_order q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
var qry = _db.pro_order.AsQueryable();
//var aIDt = _db.actItems.AsEnumerable().Where(f => f.subject.Contains(q.actItemTxt.Trim())).Select(f => f.num);//品項
if (!string.IsNullOrEmpty(q.order_no))
qry = qry.Where(o => o.order_no.Contains(q.order_no.Trim()));
if (!string.IsNullOrEmpty(q.keyin1))
qry = qry.Where(o => o.keyin1.Contains(q.keyin1));
if (q.f_num.HasValue && q.f_num > 0)
qry = qry.Where(o => o.f_num == q.f_num);
if (q.activity_num.HasValue && q.activity_num > 0)
qry = qry.Where(o => o.activity_num == q.activity_num);
if (q.up_time1.HasValue)
qry = qry.Where(o => o.up_time >= q.up_time1.Value);
if (q.up_time2.HasValue)
qry = qry.Where(o => o.up_time < Convert.ToDateTime(q.up_time2.Value).AddDays(1));
if (!string.IsNullOrEmpty(q.address))
qry = qry.Where(o => o.address.Contains(q.address.Trim()));
if (!string.IsNullOrEmpty(q.subject))
qry = qry.Where(o => o.activity_num.HasValue && o.activity.subject.Contains(q.subject.Trim()));
if (!string.IsNullOrEmpty(q.u_name))
qry = qry.Where(o => o.f_num.HasValue && o.follower.u_name.Contains(q.u_name.Trim()));
if (!string.IsNullOrEmpty(q.introducerTxt))
qry = qry.Where(o => o.introducer.HasValue && o.follower1.u_name.Contains(q.introducerTxt.Trim()));
if (!string.IsNullOrEmpty(q.actItemTxt))
{
//qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.ToArray().Contains(f2.actItem_num?.ToString())).Count() > 0);
// qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.Any(x => x == f2.actItem_num)).Count() > 0);
qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem.subject.Contains(q.actItemTxt.Trim())).Count() > 0);
}
if (!string.IsNullOrEmpty(q.country))
qry = qry.Where(o => o.f_num != null && o.follower != null && o.follower.country == q.country);
if (!string.IsNullOrEmpty(q.country2))
{
if (q.country2 == "1")
{
qry = qry.Where(o => o.f_num != null && o.follower != null && o.follower.country == "158");
}
else if (q.country2 == "2")
{
qry = qry.Where(o => o.f_num != null && o.follower != null && o.follower.country != "158");
}
}
if (sortBy.Equals("order_no"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.order_no);
else
qry = qry.OrderBy(o => o.order_no);
}
else if (sortBy.Equals("keyin1_txt"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.keyin1);
else
qry = qry.OrderBy(o => o.keyin1);
}
else if (sortBy.Equals("up_time"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.up_time);
else
qry = qry.OrderBy(o => o.up_time);
}
else if (sortBy.Equals("u_name"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.follower != null ? o.follower.u_name : "");
else
qry = qry.OrderBy(o => o.follower != null ? o.follower.u_name : "");
}
else if (sortBy.Equals("subject"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.activity != null ? o.activity.subject : "");
else
qry = qry.OrderBy(o => o.activity != null ? o.activity.subject : "");
}
else
qry = qry.OrderByDescending(o => o.reg_time);
var count = qry.Count(); //pageSize = count;//一次取回??
var ret = new
{
list = qry.ToPagedList(page, pageSize).Select(x => new
{
order_no = x.order_no,
f_num = x.f_num,
u_name = x.f_num.HasValue ? x.follower.u_name : "",
activity_num = x.activity_num,
subject = x.activity_num.HasValue ? x.activity.subject : "",
keyin1 = x.keyin1,
up_time = x.up_time,
keyin1_txt = Model.pro_order.keyin1_value_to_text(x.keyin1),
}),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
[HttpPost]
[Route("api/order/GetItemList")]
public IHttpActionResult GetItemList([FromBody] Model.ViewModel.pro_order_detail q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
string order_no = q.order_no;
if (!string.IsNullOrEmpty(order_no))
{
//檢查
var prod = _db.pro_order.Where(o => o.order_no == order_no).FirstOrDefault();
if (prod != null)
{
try
{
int activity = prod.activity_num.HasValue ? prod.activity_num.Value : 0; //活動
var bedDt = _db.bed_order_detail.Where(b => b.bed_order.order_no == order_no); ;//掛單明細
//var qry1 = _db.pro_order_detail.AsEnumerable();
//qry1 = qry1.Where(o => o.order_no == order_no);
//var qry1 = prod.pro_order_detail.AsEnumerable();
var qry1 = prod.pro_order_detail.AsQueryable();
//if (!string.IsNullOrEmpty(q.subject))
// qry = qry.Where(o => o.subject.Contains(q.subject));
if (q.actItem_kind_num.HasValue)
{
//項目分類
var _subKinds = new TreeView().subKinds(_db.actItem_kind.Select(o => new TreeItem()
{
num = o.num,
root = o.root,
}).ToList(), q.actItem_kind_num.Value);
qry1 = qry1.Where(o => o.actItem.kind == q.actItem_kind_num || _subKinds.Any(s => s == o.actItem.kind));
}
if (sortBy.Equals("subject"))
{
if (sortDesc)
qry1 = qry1.OrderByDescending(o => o.actItem.subject);
else
qry1 = qry1.OrderBy(o => o.actItem.subject);
}
else
{
qry1 = qry1.OrderByDescending(o => o.num);
}
var tdesc = publicFun.enum_desc<Model.pro_order.detailKeyin1>();
int i = 1;
//已有值
var qry1_list = qry1.ToList();
if (pageSize > 0) qry1_list =
(List<pro_order_detail>)qry1_list.ToPagedList(page, pageSize);
var count = qry1_list.Count();
var ret = new
{
list = qry1_list.Select(x => new
{
id = i++,
num = x.num,
order_no = x.order_no,
actitem_num_selected = new
{
text = x.actItem_num.HasValue ? x.actItem.subject : "",
val = x.actItem_num.HasValue ? x.actItem_num.Value : 0,
},
parent_num = x.parent_num,
f_num_selected = new
{
text = x.f_num.HasValue ? x.follower.u_name : "",
val = x.f_num.HasValue ? x.f_num.Value : 0,
},
f_num_tablet = x.f_num_tablet,
print_id = x.print_id,
address = x.address,
due_date = x.due_date,
start_date = x.start_date,
extend_date = x.extend_date,
from_id_selected = new
{
text = x.from_id.HasValue ? x.follower1.u_name : "",
val = x.from_id.HasValue ? x.from_id : 0,
},
from_id_tablet = x.from_id_tablet,
price = x.price ?? 0,
qty = x.qty ?? 0,
writeBedQty = bedDt.Where(b => b.bed_order.o_detail_id.Value == x.num && b.checkIn_date.HasValue && b.bed_kind_detail_id.HasValue).Count(), //已劃數量
notBedQty = bedDt.Where(b => b.bed_order.o_detail_id.Value == x.num && (!b.checkIn_date.HasValue || !b.bed_kind_detail_id.HasValue)).Count(), //未劃數量
//total = x.total.HasValue ? x.total.Value : 0,
category = x.actItem?.category,
//pay = x.pay ?? 0,
pay = x.pro_order_record.Select(c => c.price).Sum(),
pay_date = x.pay_date,
keyin1_selected = new
{
text = tdesc[x.keyin1.HasValue && x.keyin1.Value > 0 ? x.keyin1.Value : 1],
val = x.keyin1,
},
demo = x.demo,
files = x.actItem?.actItem_files.Select(f => new
{
num = f.file.num,
subject = f.file.subject,
word = f.file.word,
cuz_column = f.file.customize_data ?? "", //??
paperset = f.file.paperset ?? "",
}),
customize_data = x.customize_data ?? "",
customize_data_comb = new
{
from_id_cuz_data = "",
activity_cuz_data = "",
actitem_cuz_data = "",
order_cuz_data = "",
},
printed_files = x.printed_files ?? "",
isPackage = (x.actItem.act_bom
.Any(ab => ab.package_num == null && ab.item_num != null)
? 1 : 0),
bom_order = (x.actItem.act_bom
.Any(ab => ab.package_num == null && ab.item_num != null)
? x.num.ToString()
: (x.parent_num.ToString() + x.num.ToString())
),
//cash_record = x.pro_order_record.Select( c => new {
// c,
// //pay_kind = tdesc2[c.payment.HasValue && x.keyin1.Value > 0 ? x.keyin1.Value : 1],
//}),
})
.ToList()
.OrderByDescending(x => (x.isPackage + (x.parent_num == null ? 0 : 1)))
//.ThenBy(x => (x.parent_num == null ? 1 : 2)) // Top-level items first
.ThenBy(x => x.bom_order) // Group child items with their parents
.ThenBy(x => x.parent_num) // Group child items with their parents
.ThenBy(x => x.num) // Order by num within each group
.ToList(),
count = count,
};
if (prod.pro_order_detail.Count() == 0)
{
//未有資料
//帶活動預設
if (activity > 0)
{
i = 1;
//var qry2 = _db.activity_relating.AsEnumerable();
//qry2 = qry2.Where(o => o.activity_num == activity);
var qry2 = _db.activity_relating
.Where(o => o.activity_num == activity);
if (q.actItem_kind_num.HasValue)
{
//項目分類
var _subKinds = new TreeView().subKinds(_db.actItem_kind.Select(o => new TreeItem()
{
num = o.num,
root = o.root,
}).ToList(), q.actItem_kind_num.Value);
qry2 = qry2.Where(o => o.actItem.kind == q.actItem_kind_num || _subKinds.Any(s => s == o.actItem.kind));
}
var count2 = qry2.Count();
pageSize = (pageSize <= 0) ? count2 : pageSize;
var qry2a = qry2.Select(ar => new
{
ar.num,
order_no = q.order_no,
actItem = ar.actItem,
actitem_num_selected = new
{
text = ar.actItem.subject,
val = ar.actItem_num,
},
parent_num = q.num,
f_num_selected = new
{
text = "",
val = 0,
},
f_num_tablet = "",
address = "",
// due_date =
// start_date =
// extend_date =
from_id_selected = new
{
text = "",
val = 0,
},
from_id_tablet = "",
price = ar.price > 0 ? ar.price : ar.actItem.price,
ar.qty,
//writeBedQty
//notBedQty
category = ar.actItem.category,
pay = 0,
//pay_date
keyin1_selected = new
{
text = "",
val = 0,
},
demo = ar.actItem.demo,
files = ar.actItem.actItem_files.Select(af => new
{
num = af.file.num,
subject = af.file.subject,
word = af.file.word,
cuz_column = af.file.customize_data ?? "", //定義欄位需求
paperset = af.file.paperset ?? "",
}),
customize_data = ar.actItem.customize_data ?? "",
customize_data_comb = new
{
from_id_cuz_data = "",
activity_cuz_data = "",
actitem_cuz_data = ar.actItem.customize_data,
order_cuz_data = "",
},
printed_files = "",
ar.reg_time,
//actItem = ar.actItem,
isPackage = ar.actItem.act_bom
.Any(ab => ab.package_num == null && ab.item_num != null)
? 1 : 0
});
//var orderedQry2a = sortDesc
// ? qry2a.OrderByDescending(ar => ar.num)
// : qry2a.OrderBy(ar => ar.num);
var orderedQry2a = qry2a
.OrderByDescending(ar => ar.isPackage) // Ensure top-level items come first
.ThenBy(ar => sortDesc ? 0 : 1) // This is a trick to conditionally switch between ThenBy and ThenByDescending
.ThenBy(ar => sortDesc ? ar.num : 0) // Apply existing sort order based on sortDesc
.ThenByDescending(ar => sortDesc ? 0 : ar.num); // Apply existing sort order based on sortDesc
var ret2 = new
{
list = orderedQry2a.ToList()
//.ToPagedList(page, pageSize)
.Select(x => new
{
id = i++,
num = 0, //?
order_no = order_no, // ?
actitem_num_selected = new
{
text = x.actItem.subject,
val = x.actItem.num,
},
f_num_selected = new
{
text = "",
val = 0,
},
address = "",
due_date = DateTime.Today.AddMonths(x.actItem.cycle ?? 0).ToString("yyyy-MM-dd"), // 期滿日期:依據 項目維護 所設定的 收費週期 計算後帶入日期
start_date = DateTime.Today.ToString("yyyy-MM-dd"), //預設今天
extend_date = (x.actItem.extend ?? "").Equals("Y") ? DateTime.Today.AddMonths(x.actItem.cycle ?? 0).ToString("yyyy-MM-dd") : "", //應續約日:預設的日期值與期滿日期相同(項目是"續約項目"者)
from_id_selected = new
{
text = prod.f_num.HasValue ? prod.follower.u_name : "", //預設帶報名者
val = prod.f_num.HasValue ? prod.f_num.Value : 0,
},
price = x.price ?? 0,
qty = x.qty ?? 0,
writeBedQty = 0,
notBedQty = 0,
//total = x.price.HasValue && x.qty.HasValue ? Convert.ToDouble(x.price.Value) * Convert.ToInt32(x.qty.Value) :0,
category = x.actItem?.category,
pay = 0,
pay_date = "",
keyin1_selected = new
{
text = tdesc[1],
val = 1,
},
demo = "",
files = x.actItem?.actItem_files.Select(f => new
{
num = f.file.num,
subject = f.file.subject,
word = f.file.word,
cuz_column = f.file.customize_data ?? "", //定義欄位需求
paperset = f.file.paperset ?? "",
}),
customize_data = "",
customize_data_comb = new
{
from_id_cuz_data = prod.f_num.HasValue ? prod.follower.customize_data ?? "" : "",
activity_cuz_data = prod.activity_num.HasValue ? prod.activity.customize_data ?? "" : "",
actitem_cuz_data = x.actItem.customize_data,
order_cuz_data = prod.customize_data,
},
printed_files = "",
x.isPackage
//cash_record = new { },
}),
count = count2
};
if (ret2.list == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return Ok(ret2);
}
else
{
//不須帶預設資料,自行新增項目
return Ok();
}
}
else
return Ok(ret);
}
catch (Exception ex)
{
return NotFound();
}
}
else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/order/SaveDetailData")]
public IHttpActionResult SaveDetailData([FromBody] Model.pro_order_detail item)
{
if (!string.IsNullOrEmpty(item.order_no))
{
//if有資料-修改 , else 新增
if (item.num > 0)
{
Model.pro_order_detail order = _db.pro_order_detail
.Include("actItem")
.Include("actItem.act_bom")
.Where(q => q.num == item.num)
.FirstOrDefault();//修改
if (order != null)
{
order.actItem_num = (item.actItem_num.HasValue && item.actItem_num.Value > 0)
? item.actItem_num : null;
order.f_num = (item.f_num.HasValue && item.f_num.Value > 0)
? item.f_num : null;
order.from_id = (item.from_id.HasValue && item.from_id.Value > 0)
? item.from_id : null;
order.f_num_tablet = item.f_num_tablet;
order.from_id_tablet = item.from_id_tablet;
order.print_id = item.GenerateSequentialId();
order.address = item.address;
order.start_date = item.start_date.HasValue
? item.start_date : null;
order.due_date = item.due_date.HasValue
? item.due_date : null;
order.extend_date = item.extend_date.HasValue
? item.extend_date : null;
order.price = item.price.HasValue
? item.price : null;
order.qty = (item.qty.HasValue && item.qty.Value > 0)
? item.qty : null;
order.pay = item.pay.HasValue
? item.pay : null;
order.pay_date = item.pay_date.HasValue
? item.pay_date : null;
order.keyin1 = item.keyin1;
order.demo = item.demo;
order.customize_data = item.customize_data;
order.UpdateTime = DateTime.Now;
_db.SaveChanges();
var ret = new
{
num = order.num,
customize_data = order.customize_data,
print_id = order.print_id,
f_num_tablet = order.f_num_tablet,
isPackage = order.actItem != null ? (order.actItem.act_bom
.Any(ab => ab.package_num == null && ab.item_num != null)
? 1 : 0) : 0
};
return Ok(ret);
}
else
{
return NotFound();
}
}
else
{
Model.pro_order_detail orderDetail = new Model.pro_order_detail()
{
order_no = item.order_no,
parent_num = item.parent_num,
actItem_num = (item.actItem_num.HasValue && item.actItem_num.Value > 0)
? item.actItem_num : null,
f_num = (item.f_num.HasValue && item.f_num.Value > 0)
? item.f_num : null,
from_id = (item.from_id.HasValue && item.from_id.Value > 0)
? item.from_id : null,
f_num_tablet = item.f_num_tablet,
from_id_tablet = item.from_id_tablet,
print_id = item.GenerateSequentialId(),
address = item.address,
start_date = item.start_date.HasValue
? item.start_date : null,
due_date = item.due_date.HasValue
? item.due_date : null,
extend_date = item.extend_date.HasValue
? item.extend_date : null,
price = item.price.HasValue
? item.price : null,
qty = (item.qty.HasValue && item.qty.Value > 0)
? item.qty : null,
pay = item.pay.HasValue
? item.pay : null,
pay_date = item.pay_date.HasValue
? item.pay_date : null,
keyin1 = item.keyin1,
demo = item.demo,
customize_data = item.customize_data,
UpdateTime = DateTime.Now,
};
_db.pro_order_detail.Add(orderDetail);
_db.SaveChanges();
// 重新查詢以獲取完整的關聯數據
var savedOrder = _db.pro_order_detail
.Include("actItem")
.Include("actItem.act_bom")
.FirstOrDefault(x => x.num == orderDetail.num);
var isPackage = savedOrder.actItem != null ? (savedOrder.actItem.act_bom
.Any(ab => ab.package_num == null && ab.item_num != null)
? 1 : 0) : 0;
var ret = new
{
num = savedOrder.num,
customize_data = savedOrder.customize_data,
print_id = savedOrder.print_id,
f_num_tablet = savedOrder.f_num_tablet,
isPackage = isPackage
};
return Ok(ret);
}
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/order/GetUnpayList")]
public IHttpActionResult GetUnpayList([FromBody] Model.ViewModel.follower q, string order_no, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
int _follower = q.num.HasValue && q.num.Value > 0 ? q.num.Value : 0;
if (_follower > 0)
{
try
{
//家族 : 家長是我的人,跟我同家長的人,我的家長本人,我本人
var ccList = _db.followers.Where(x => x.num == _follower || x.leader == _follower).Select(x => x.num).ToList();
var qry = _db.followers.Where(f => ccList.Contains(f.num) || (f.leader.HasValue && ccList.Contains(f.leader.Value)));
//未付款資料
var unpayDt = _db.pro_order_detail.AsQueryable();
var coDt = unpayDt.Where(x => x.keyin1 == (int)Model.pro_order.detailKeyin1.Collection);//只列出報名狀態為"收款中"的項目
//未付款訂單
var orderDt = _db.pro_order.AsQueryable();
if (!string.IsNullOrEmpty(order_no))
orderDt = orderDt.Where(x => x.order_no == order_no);
orderDt = orderDt.Where(x => coDt.Select(d => d.order_no).Contains(x.order_no));
//orderDt = orderDt.Where(x => qry.Select(d => d.num).Contains(x.f_num.Value));
orderDt = orderDt.Where(x => qry.Select(f => f.num).Any(f => f == x.f_num));
orderDt = orderDt.OrderByDescending(x => x.reg_time);
int i = 1;
//已有值
var count = orderDt.Count();
var ret = new
{
list = orderDt.ToPagedList(page, pageSize).Select(x => new
{
id = i++,
order_no = x.order_no,
up_time = x.up_time,
reg_time = x.reg_time,
f_num = x.f_num,
u_name = x.f_num.HasValue ? x.follower.u_name : "",
totalPrice = unpayDt.Where(d => d.order_no == x.order_no).Select(o => o.price ?? 0 * o.qty ?? 0).Sum(), //訂單金額
payPrice = unpayDt.Where(d => d.order_no == x.order_no).Select(o => o.pay).Sum(), //已收金額
}),
count = count,
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
catch (Exception ex)
{
}
}
return NotFound();
}
[HttpPost]
[Route("api/order/GetUnpayDetail")]
public IHttpActionResult GetUnpayDetail([FromBody] Model.ViewModel.pro_order q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
//未付款資料
var unpayDt = _db.pro_order_detail.AsQueryable();
unpayDt = unpayDt.Where(x => x.keyin1 == (int)Model.pro_order.detailKeyin1.Collection);//只列出報名狀態為"收款中"的項目
if (!string.IsNullOrEmpty(q.order_no))
unpayDt = unpayDt.Where(x => x.order_no == q.order_no);
unpayDt = unpayDt.OrderByDescending(x => x.num);
int i = 1;
//已有值
var count = unpayDt.Count();
var ret = new
{
list = unpayDt.ToPagedList(page, pageSize).Select(x => new
{
id = i++,
order_no = x.order_no,
actItem_num = x.actItem_num,
actItem_numTxt = x.actItem_num.HasValue ? x.actItem.subject : "",
f_num = x.f_num,
u_name = x.f_num.HasValue ? x.follower.u_name : "",
price = x.price ?? 0 * x.qty ?? 0, //訂單金額
pay = x.pay ?? 0, //已收金額
}),
count = count,
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
[HttpGet]
[Route("api/order/printFileLog/{num}/{detail}")]
public IHttpActionResult printFileLog(int num, int detail)
{
string _num = "\"" + num.ToString() + "\"";
Model.pro_order_detail order = _db.pro_order_detail.Where(q => q.num == detail && !((q.printed_files ?? "").Contains(_num))).FirstOrDefault();//修改
if (order != null)
{
order.printed_files = (order.printed_files ?? "") + _num + ",";
_db.SaveChanges();
return Ok(order.printed_files);
}
return NotFound();
}
[HttpPost]
[Route("api/order/printMultiFileLog")]
public IHttpActionResult printMultiFileLog([FromBody] List<int> list, int item, int file)
{
string _num = "\"" + file.ToString() + "\"";
var order = _db.pro_order_detail.Where(q => list.Any(a => a == q.num) && !((q.printed_files ?? "").Contains(_num))).ToList();
if (order.Count > 0)
{
foreach (var row in order)
row.printed_files = (row.printed_files ?? "") + _num + ",";
_db.SaveChanges();
return Ok();
}
return NotFound();
}
[HttpGet]
[Route("api/order/copyDetailData/{num}/{qty}")]
public IHttpActionResult copyDetailData(int num, int qty)
{
if (qty > 0)
{
var detail = _db.pro_order_detail.Where(q => q.num == num).FirstOrDefault();
if (detail != null)
{
string jsonStr = JsonConvert.SerializeObject(detail, new JsonSerializerSettings() { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii });
for (int i = 0; i < qty; i++)
{
Model.pro_order_detail order = new Model.pro_order_detail();//新增
//Get properties from EF that are read / write and not marked witht he NotMappedAttribute
//var sourceProperties = typeof(Model.pro_order_detail)
// .GetProperties()
// .Where(p => p.CanRead && p.CanWrite &&
// p.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.NotMappedAttribute), true).Length == 0);
//foreach (var property in sourceProperties)
//{
// Copy value
// property.SetValue(order, property.GetValue(detail, null), null);
//}
//order = (Model.pro_order_detail)detail.Clone();
order = JsonConvert.DeserializeObject<Model.pro_order_detail>(jsonStr);
// order = detail; //直接給物件,會傳址,若order.pay = null , 則 detail.pay = null , 且 _db.SaveChanges();只會新增一筆
order.print_id = "";
order.pay = null;
order.keyin1 = (int)Model.pro_order.detailKeyin1.Unconfirmed;
order.printed_files = null;
_db.pro_order_detail.Add(order);
}
_db.SaveChanges();
return Ok();
}
}
return NotFound();
}
[HttpPost]
[Route("api/order/GetPastOrderList")]
public IHttpActionResult GetPastOrderList([FromBody] Model.pro_order q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
int u_name = q.f_num ?? 0;
if (u_name > 0 && (!string.IsNullOrEmpty(q.order_no)))
{
//檢查
var prod = _db.pro_order.Where(o => o.f_num == u_name && o.order_no != q.order_no).ToList();
if (prod.Count > 0)
{
var orderNumbers = prod.Select(x => x.order_no).ToList();
var qry = _db.pro_order_detail
.Where(o => orderNumbers.Contains(o.order_no))
.Select(x => new
{
num = x.num,
order_no = x.order_no,
up_time = x.pro_order.up_time,
activity_selected = new
{
text = x.pro_order.activity_num.HasValue ? x.pro_order.activity.subject : "",
val = x.pro_order.activity_num.HasValue ? x.pro_order.activity_num.Value : 0,
},
actitem_num_selected = new
{
text = x.actItem_num.HasValue ? x.actItem.subject : "",
val = x.actItem_num.HasValue ? x.actItem_num.Value : 0,
}
})
.OrderBy(x => x.num); // 加一個預設排序
var count = qry.Count();
IEnumerable<dynamic> resultList;
if (pageSize < 0)
{
resultList = qry.ToList();
}
else
{
var pagedList = qry.ToPagedList(page, pageSize);
resultList = pagedList;
}
var ret = new
{
list = resultList.Select((x, index) => new
{
id = index + 1,
num = x.num,
order_no = x.order_no,
up_time = x.up_time,
activity_selected = x.activity_selected,
actitem_num_selected = x.actitem_num_selected
}),
count = count,
};
return Ok(ret);
}
}
return Ok("沒有以往報名");
}
[HttpPost]
[Route("api/order/copyMultiPastItem")]
public IHttpActionResult copyMultiPastItem([FromBody] List<int> list, string order_no)
{
var detail = _db.pro_order_detail.Where(q => list.Any(a => a == q.num)).OrderByDescending(q => q.order_no).ToList();
if (detail.Count > 0 && (!string.IsNullOrEmpty(order_no)))
{
foreach (var row in detail)
{
string jsonStr = JsonConvert.SerializeObject(row, new JsonSerializerSettings() { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii });
Model.pro_order_detail order = new Model.pro_order_detail();//新增
order = JsonConvert.DeserializeObject<Model.pro_order_detail>(jsonStr);
order.order_no = order_no;
order.pay = null;
order.keyin1 = (int)Model.pro_order.detailKeyin1.Unconfirmed;
order.printed_files = null;
_db.pro_order_detail.Add(order);
}
_db.SaveChanges();
return Ok();
}
return NotFound();
}
[HttpPost]
[Route("api/order/GetPayOrderList")]
public IHttpActionResult GetPayOrderList([FromBody] Model.pro_order_record q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
int detail_num = q.detail_num ?? 0;
if (detail_num > 0)
{
//檢查
var prod = _db.pro_order_record.Where(o => o.detail_num == detail_num)
.OrderByDescending(o => o.pay_date).ToList();
int i = 1;
var count = prod.Count();
var ret = new
{
list = prod.ToPagedList(page, pageSize).Select(x => new
{
id = i++,
num = x.num,
order_no = x.pro_order_detail.order_no,
pay_date = x.pay_date,
payment_selected = new
{
text = x.payment.HasValue && x.payment.Value > 0 ? x.accounting_kind2.kind : "",
val = x.payment.HasValue ? x.payment.Value : 0,
},
price = x.price ?? 0,
organization = x.organization,
bank_code = x.bank_code,
}),
count = count,
};
return Ok(ret);
}
return Ok("沒有資料");
}
[HttpDelete]
[Route("api/order/DeleteRecordDetail/{id}")]//刪除收款註記
public void DeleteRecordDetail(int id)
{
var prod = _db.pro_order_record.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
_db.pro_order_record.Remove(prod);
_db.SaveChanges(); //執行
}
}
[HttpPost]
[Route("api/order/SaveRecordDetail")]//取得子項目
public IHttpActionResult SaveRecordDetail([FromBody] Model.pro_order_record item)
{
if (item.detail_num > 0)
{
float total = _db.pro_order_detail.Where(x => x.num == item.detail_num).Select(x => x.price.Value * x.qty.Value).Sum();
float pay = _db.pro_order_record.Where(x => x.detail_num == item.detail_num).Select(x => x.price.Value).Sum();
if (pay + item.price.Value <= total)
{
//if有資料-修改 , else 新增
if (item.num > 0)
{
_db.Entry(item).State = System.Data.Entity.EntityState.Modified;
_db.SaveChanges();
//Model.bed_kind_detail _detail = _db.bed_kind_detail.Where(q => q.num == item.num).FirstOrDefault();//修改
//if (_detail != null)
//{
// _detail.bed_name = item.bed_name;
// if (item.bed_type.HasValue) { _detail.bed_type = item.bed_type.Value; }
// else { _detail.bed_type = null; }
// _detail.demo = item.demo;
// _db.SaveChanges();
var ret = item.num;
return Ok(ret);
//}
//else
// return NotFound();
}
else
{
item.reg_time = DateTime.Now;
_db.pro_order_record.Add(item);
_db.SaveChanges();
var ret = item.num;
return Ok(ret);
}
}
else
{
return Ok("已收金額不能超過小計");
}
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/order/GetChildItems")]//取得BOM子項目
public IHttpActionResult GetChildItems(int item_num,
string order_no, int order_detail_num)
{
var parentItem = _db.act_bom.FirstOrDefault(item => item.item_num == item_num);
if (parentItem != null)
{
var bom = parentItem.act_bom1.ToList();
// Create a new list for pro_order_detail items
List<dynamic> orderDetails = new List<dynamic>();
// Iterate over each bom item to create a new pro_order_detail
int? null_int = null;
var tempCounter = -1;
foreach (var x in bom)
{
var newOrderDetail = new
{
order_no = order_no,
num = tempCounter--, // 每個項目遞減,確保唯一性, 暫時KEY
actitem_num_selected = new
{
text = x.actItem.subject,
val = x.item_num,
},
f_num_selected = new
{
text = "",
val = null_int,
},
actItem_num = x.item_num,
parent_num = order_detail_num,
from_id_selected = new
{
text = "", //預設帶報名者?
val = null_int,
},
price = 0,//x.price ?? 0,
qty = 0,//x.qty ?? 0,
writeBedQty = 0,
notBedQty = 0,
category = x.actItem?.category,
pay = 0,
pay_date = "",
keyin1_selected = new
{
text = "",//tdesc[1],
val = null_int,
},
demo = "",
files = new { },// ??,
customize_data = "",
customize_data_comb = new
{
from_id_cuz_data = "",
activity_cuz_data = "",
actitem_cuz_data = x.actItem.customize_data,
order_cuz_data = "",
},
// Initialize other necessary properties as needed
};
// Add the newly created pro_order_detail to the list
orderDetails.Add(newOrderDetail);
}
// Return the list of pro_order_detail items
// Assuming your method returns IHttpActionResult, you can wrap the result with Ok()
return Ok(orderDetails);
}
else
{
// Handle the case where there is no parent item found
return NotFound(); // Or however you wish to handle this scenario
}
//var childItems = _db.act_bom
// .Where(bom => bom.item_num == item_num && bom.package_num == bom.num).ToList();
//return Ok(childItems);
//return NotFound();
}
}