Files
17168ERP/web/App_Code/api/activityController.cs
yiming 27f916eb9c 修正多處 LINQ-to-Entities 查詢,避免 Nullable .Contains()、.ToString()、Request[] 直接使用造成翻譯失敗。
API 查詢同步改寫 .Contains()、.OrderBy()、複雜 GroupBy/Math.Round,必要時 materialize 或加 HasValue。
Participation rate / kind breakdown 改在記憶體計算,同時檢查整數陣列 .Contains() 的型別安全性。
2025-11-14 23:40:55 +08:00

1559 lines
56 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 System.Data.Entity;
// api/activity
//[ezAuthorize(Roles = "admin")]//群組:*
[ezAuthorize]
public class activityController : ApiController
{
private Model.ezEntities _db = new Model.ezEntities();
// GET api/<controller>
[AllowAnonymous]
public IEnumerable<Model.activity> Get(string startDate = null, string endDate = null)
{
var qry = _db.activities.AsQueryable();
if (!string.IsNullOrEmpty(startDate) && !string.IsNullOrEmpty(endDate))
{
var date = DateTime.Parse(startDate);
qry = qry.Where(x => x.startDate_solar <= date && x.endDate_solar > date);
}
var list = qry.OrderByDescending(x => x.startDate_solar).ThenByDescending(x => x.num).ToList();
if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return list;
}
public IEnumerable<Model.activity> Get(int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
//if (pageSize > 0) qry1 = qry1.ToPagedList(page, pageSize);
var list = _db.activities.OrderBy(o => o.num).ToPagedList(page, pageSize);
if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return list;
}
// GET api/<controller>/5
public Model.activity Get(int id)
{
var item = _db.activities.Where(q => q.num == id).FirstOrDefault();
//if (item == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return item;
}
// POST api/<controller>
public void Post([FromBody] Model.activity item)
{
}
// PUT api/<controller>/5
public void Put(int id, [FromBody] Model.activity item)
{
}
// DELETE api/<controller>/5
public void Delete(int id)
{
var prod = _db.activities.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
//刪除相關資料
var prod2 = _db.activity_relating.Where(q => q.activity_num == id).ToList(); //相關項目
if (prod2.Count > 0)
{
//查詢結果全部刪除
_db.activity_relating.RemoveRange(prod2);
}
var prod3 = _db.activity_spares.Where(q => q.activity_num == id).ToList(); //備品項目
if (prod3.Count > 0)
{
_db.activity_spares.RemoveRange(prod3);
}
//訊息、庫存、收支,從資料庫設定null
_db.activities.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.Activity, (int)Model.admin_log.Status.Delete, prod.subject);
}
}
}
[HttpDelete]
[Route("api/activity/DeleteItem/{id}")]
public void DeleteItem(int id)
{
var prod = _db.actItems.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
/*if (prod != null)
{
//var prod2 = _db.actItem_files.AsEnumerable().Where(q => q.actItem_num == id).ToList(); //相關項目
//if (prod2.Count > 0)
//{
// //查詢結果全部刪除
// _db.actItem_files.RemoveRange(prod2);
// _db.SaveChanges();
//}
_db.actItem_files.RemoveRange(prod.actItem_files);
_db.actItems.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.Item, (int)Model.admin_log.Status.Delete, prod.subject);
}
}*/
if (prod != null)
{
////prod.IsDel = true; ////不確定是否新增欄位? 先註解
_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.Item, (int)Model.admin_log.Status.Delete, prod.subject);
}
}
}
[HttpDelete]
[Route("api/activity/Delete/{nums}")]
public void Delete(string nums)
{
if (!string.IsNullOrEmpty(nums))
{
var ids = nums.TrimEnd(',').Split(',').Select(s => int.Parse(s));
var prod = _db.activities.Where(q => ids.Contains(q.num)).ToList();
if (prod.Count() > 0)
{
//var prod2 = _db.activity_relating.AsEnumerable().Where(q => ids.Contains(Convert.ToInt32(q.activity_num))).ToList();
var prod2 = _db.activity_relating.Where(q => ids.Contains(q.activity_num)).ToList();
if (prod2.Count > 0)
{
_db.activity_relating.RemoveRange(prod2);
// _db.SaveChanges();
}
//var prod3 = _db.activity_spares.AsEnumerable().Where(q => ids.Contains(Convert.ToInt32(q.activity_num))).ToList();
var prod3 = _db.activity_spares.Where(q => ids.Contains(q.activity_num)).ToList();
if (prod3.Count > 0)
{
_db.activity_spares.RemoveRange(prod3);
//_db.SaveChanges();
}
_db.activities.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.Activity, (int)Model.admin_log.Status.Delete, admin_log.LogViewBtn(prod.Select(x => x.subject).ToList()));
}
}
}
}
[HttpDelete]
[Route("api/activity/DeleteAllItem/{nums}")]
public void DeleteAllItem(string nums)
{
if (!string.IsNullOrEmpty(nums))
{
var ids = nums.TrimEnd(',').Split(',').Select(s => int.Parse(s));
var prod = _db.actItems.Where(q => ids.Contains(q.num)).ToList();
if (prod.Count() > 0)
{
//var prod2 = _db.actItem_files.AsEnumerable().Where(q => ids.Contains(Convert.ToInt32(q.actItem_num))).ToList();
var prod2 = _db.actItem_files.Where(q => ids.Contains(q.actItem_num)).ToList();
if (prod2.Count > 0)
{
_db.actItem_files.RemoveRange(prod2);
//_db.SaveChanges();
}
_db.actItems.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.Item, (int)Model.admin_log.Status.Delete, admin_log.LogViewBtn(prod.Select(x => x.subject).ToList()));
}
}
}
}
[HttpGet]
[Route("api/activity/count")]
public int Count()
{
var count = _db.activities.Count();
return count;
}
[HttpPost]
[Route("api/activity/GetList")]
public IHttpActionResult GetList([FromBody] Model.ViewModel.activity q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
var qry = _db.activities.AsQueryable();
if (!string.IsNullOrEmpty(q.subject))
qry = qry.Where(o => o.subject.Contains(q.subject));
if (q.kind.HasValue && q.kind > 0)
{
var _subKinds = new TreeView().subKinds(_db.activity_kind.Select(o => new TreeItem()
{
num = o.num,
root = o.root,
}).ToList(), q.kind.Value);
//qry = qry.Where(o => o.kind == q.kind);
qry = qry.Where(o => o.kind == q.kind.Value || _subKinds.Any(s => s == o.kind));
}
if (!string.IsNullOrEmpty(q.kindTxt))
qry = qry.Where(o => o.activity_kind.kind.Contains(q.kindTxt));
if (sortBy.Equals("subject"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.subject);
else
qry = qry.OrderBy(o => o.subject);
}
else if (sortBy.Equals("kind"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.kind);
else
qry = qry.OrderBy(o => o.kind);
}
else if (sortBy.Equals("startDate_solar"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.startDate_solar);
else
qry = qry.OrderBy(o => o.startDate_solar);
}
else if (sortBy.Equals("endDate_solar"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.endDate_solar);
else
qry = qry.OrderBy(o => o.endDate_solar);
}
else if (sortBy.Equals("dueDate"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.dueDate);
else
qry = qry.OrderBy(o => o.dueDate);
}
else
qry = qry.OrderByDescending(o => o.num);
var count = qry.Count(); //pageSize = count;//一次取回??
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
var ret = new
{
list = qryList.Select(x => new
{
num = x.num,
subject = x.subject,
kind = x.kind,
kindTxt = x.kind.HasValue ? x.activity_kind.kind : "",
kindsTxt = x.kind.HasValue ? new TreeView().kindText(_db.activity_kind.Select(o => new TreeItem()
{
kind = o.kind,
num = o.num,
root = o.root,
}).ToList(), x.kind) : "",
startDate_solar = x.startDate_solar,
endDate_solar = x.endDate_solar,
startDate_lunar = x.startDate_lunar,
endDate_lunar = x.endDate_lunar,
dueDate = x.dueDate,
}),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
[HttpPost]
[Route("api/activity/GetItemList")]
public IHttpActionResult GetItemList([FromBody] Model.ViewModel.actItem q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
//var stockDt = _db.stocks.AsEnumerable(); ;//庫存
// ❌ 錯誤寫法: var fileDt = _db.files.Where(f => f.subject.Contains(q.fileTxt)).Select(f => f.num.ToString());
// 改為整數陣列,避免後續查詢中使用 .ToString()
var fileDt = _db.files.Where(f => f.subject.Contains(q.fileTxt)).Select(f => f.num).ToArray();//文件
//每個品項在每個倉庫的結餘量
var stockDt = (
from t_min_max in (
from stock in _db.stocks
group stock by new { stock.kind, stock.actItem_num } into g
select new
{
g.Key.kind,
g.Key.actItem_num,
min_id = g.Min(x => x.num),
max_id = g.Max(x => x.num)
}
)
join t_min in _db.stocks on t_min_max.min_id equals t_min.num
join t_max in _db.stocks on t_min_max.max_id equals t_max.num into t_maxGroup
from t_max in t_maxGroup.DefaultIfEmpty()
select new
{
t_min_max.kind,
t_min_max.actItem_num,
final_last = t_min_max.min_id != t_min_max.max_id ? t_max.final_stock ?? 0 : t_min.final_stock ?? 0,
rent_last = t_min_max.min_id != t_min_max.max_id ? t_max.rent_stock ?? 0 : t_min.rent_stock ?? 0
}
).ToList();
////var qry = _db.actItems.Where(a => a.IsDel == false).AsEnumerable();////不確定是否新增欄位? 先註解
var qry = _db.actItems.AsQueryable();
if (!string.IsNullOrEmpty(q.subject))
qry = qry.Where(o => o.subject.Contains(q.subject.Trim()));
if (q.kind.HasValue && q.kind.Value > 0)
{
var _subKinds = new TreeView().subKinds(_db.actItem_kind.Select(o => new TreeItem()
{
num = o.num,
root = o.root,
}).ToList(), q.kind.Value);
qry = qry.Where(o => o.kind == q.kind.Value || _subKinds.Any(s => s == o.kind));
}
if (!string.IsNullOrEmpty(q.kindTxt))
qry = qry.Where(o => o.actItem_kind != null && o.actItem_kind.kind != null && o.actItem_kind.kind.Contains(q.kindTxt));
if (q.category.HasValue && q.category.Value > 0)
qry = qry.Where(o => o.category == q.category.Value);
if (!string.IsNullOrEmpty(q.categorys))
{
// ❌ 錯誤寫法: qry = qry.Where(o => q.categorys.Contains(o.category.HasValue ? o.category.Value.ToString() : "0"));
// LINQ to Entities 無法轉換資料庫欄位的 .ToString(),改為整數陣列比較
var categoryArray = q.categorys.Split(',').Select(x => int.TryParse(x, out int result) ? result : 0).ToArray();
qry = qry.Where(o => categoryArray.Contains(o.category ?? 0));
}
if (!string.IsNullOrEmpty(q.status))
qry = qry.Where(o => o.status.Contains(q.status));
if (!string.IsNullOrEmpty(q.extend))
qry = qry.Where(o => o.extend == q.extend);
if (!string.IsNullOrEmpty(q.fileTxt))
{
// ❌ 錯誤寫法: qry = qry.Where(o => o.actItem_files.Where(f2 => f2.actItem_num == o.num && fileDt.ToArray().Contains(f2.files_num.ToString())).Count() > 0);
// fileDt 已改為整數陣列,直接比較即可
qry = qry.Where(o => o.actItem_files.Where(f2 => f2.actItem_num == o.num && fileDt.Contains(f2.files_num)).Count() > 0);
}
//qry = qry.Where(o => o.actItem_files.Where(f2 => f2.actItem_num == o.num && f2.files_num.ToString().Contains( String.Join(",", fileDt.Select(p => p.ToString()).ToArray()) )).Count() >0 ) ;
if (sortBy.Equals("subject"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.subject);
else
qry = qry.OrderBy(o => o.subject);
}
else if (sortBy.Equals("kind"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.kind);
else
qry = qry.OrderBy(o => o.kind);
}
else if (sortBy.Equals("price"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.price);
else
qry = qry.OrderBy(o => o.price);
}
else if (sortBy.Equals("status"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.status);
else
qry = qry.OrderBy(o => o.status);
}
else
qry = qry.OrderByDescending(o => o.num);
var tdesc = publicFun.enum_desc<Model.activity.category>();
var count = qry.Count(); //pageSize = count;//一次取回??
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
var ret = new
{
list = qryList.Select(x => new
{
num = x.num,
subject = x.subject,
kind = x.kind,
kindTxt = x.kind.HasValue ? x.actItem_kind.kind : "",
kindsTxt = x.kind.HasValue ? new TreeView().kindText(_db.actItem_kind.Select(o => new TreeItem()
{
kind = o.kind,
num = o.num,
root = o.root,
}).ToList(), x.kind) : "",
category = x.category,
categoryTxt = x.category != null ? tdesc[x.category ?? 1] : "",
price = x.price,
status = x.status,
//stock = new
//{
// //cate1Qty = stockDt.Where(o => o.actItem_num==x.num && o.category == (int)Model.stock.type.Purchase).Select(o => o.qty).Sum(),
// //cate2Qty = stockDt.Where(o => o.actItem_num==x.num && o.category == (int)Model.stock.type.Reduce).Select(o => o.qty).Sum(),
// //cate3Qty = stockDt.Where(o => o.actItem_num==x.num && o.category == (int)Model.stock.type.Rent).Select(o => o.qty).Sum(),
// //cate4Qty = stockDt.Where(o => o.actItem_num==x.num && o.category == (int)Model.stock.type.Return).Select(o => o.qty).Sum(),
// catePQty= (x.stocks.Where(o => o.category == (int)Model.stock.type.Purchase || o.category == (int)Model.stock.type.Return).Select(o => o.qty).Sum()??0) -(x.stocks.Where(o => o.category == (int)Model.stock.type.Reduce || o.category == (int)Model.stock.type.Rent).Select(o => o.qty).Sum()??0) ,
// cateRQty= (x.stocks.Where(o => o.category == (int)Model.stock.type.Rent).Select(o => o.qty).Sum()??0 ) - (x.stocks.Where(o => o.category == (int)Model.stock.type.Return).Select(o => o.qty).Sum()??0) ,
//},
final_stock = stockDt.Where(o => o.actItem_num == x.num).Select(o => o.final_last).Sum(),
rent_stock = stockDt.Where(o => o.actItem_num == x.num).Select(o => o.rent_last).Sum(),
}),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
[HttpPost]
[Route("api/activity/GetItemBomList")]
public IHttpActionResult GetItemBomList([FromBody] Model.act_bom q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
int? this_id = q.item_num;
// 先找到父層
var parent = _db.act_bom.FirstOrDefault(w => w.package_num == null && w.item_num == this_id);
if (parent == null)
{
return Ok(new { list = new List<object>(), count = 0 });
}
// 只抓父層下的直接子項目,且只帶必要欄位
var qlist = _db.act_bom
.Where(w => w.package_num == parent.num)
.Select(b => new
{
b.num,
b.package_num,
b.item_num,
b.qty,
b.memo,
b.optional,
actItem = new
{
num = b.actItem.num,
subject = b.actItem.subject
}
})
.ToList();
var ret = new
{
list = qlist,
count = qlist.Count
};
return Ok(ret);
}
[HttpPost]
[Route("api/activity/SaveDetailBomList")]
public IHttpActionResult SaveDetailBomList([FromBody] Model.act_bom item)
{
if (item.item_num > 0)
{
//if有資料-修改 , else 新增
if (item.num > 0)
{
Model.act_bom act_bom = _db.act_bom
.Where(q => q.num == item.num).FirstOrDefault();//修改
if (act_bom != null)
{
if (item.package_num > 0) { act_bom.package_num = item.package_num; }
if (item.item_num > 0) { act_bom.item_num = item.item_num; }
act_bom.qty = item.qty;
act_bom.memo = item.memo;
////SAVE OTHER COLUMNS
//_files.reg_time = DateTime.Now;
_db.SaveChanges();
var ret = act_bom.num;
return Ok(ret);
}
else
return NotFound();
}
else
{
_db.act_bom.Add(item);
_db.SaveChanges();
var ret = item.num;
return Ok(ret);
}
}
else
{
return NotFound();
}
return NotFound();
}
[HttpPost]
[Route("api/activity/GetOrderList")]
public IHttpActionResult GetOrderList([FromBody] Model.ViewModel.activity q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
int _activity_id = q.num.HasValue && q.num.Value > 0 ? q.num.Value : 0;
//var relatingDt = _db.activity_relating.AsEnumerable().Where(o => o.activity_num == _activity_id); //活動的相關項目
//if (_activity_id > 0)
//{
// //有選活動
// var qry = _db.activity_relating.AsEnumerable().Where(o => o.activity_num== _activity_id);
// qry =qry.Where(o => o.actItem.status == "Y"); //狀態啟用
// if (!string.IsNullOrEmpty(q.subject))
// qry = qry.Where(o => o.actItem.subject.Contains(q.subject));
// if (!string.IsNullOrEmpty(q.kindTxt))
// qry = qry.Where(o => o.actItem.actItem_kind.kind.Contains(q.kindTxt));
// qry = qry.OrderByDescending(o => o.num);
// var ret = new
// {
// list = qry.ToPagedList(page, pageSize).Select(x => new
// {
// num = x.actItem_num,
// subject = x.actItem.subject,
// kind = x.actItem.kind,
// kindTxt = x.actItem.actItem_kind.kind,
// }),
// count = qry.Count()
// };
// if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
// return Ok(ret);
//}
//else
{
//抓 所有品項
////var qry = _db.actItems.Where(a => a.IsDel == false).AsQueryable();////不確定是否新增欄位? 先註解
var qry = _db.actItems.AsQueryable();
//qry = qry.Where(o => o.status == "Y"); //狀態啟用
if (!string.IsNullOrEmpty(q.subject))
qry = qry.Where(o => o.subject.Contains(q.subject));
if (!string.IsNullOrEmpty(q.kindTxt))
qry = qry.Where(o => o.actItem_kind.kind.Contains(q.kindTxt));
if (!string.IsNullOrEmpty(q.is_reconcile))
qry = qry.Where(o => o.is_reconcile == q.is_reconcile);
// ❌ 錯誤寫法: qry = qry.Where(o => "1,2,4".Contains(o.category.HasValue ? o.category.Value.ToString() : "0"));
// LINQ to Entities 無法轉換資料庫欄位的 .ToString(),改為整數陣列比較
var allowedCategories = new[] { 1, 2, 4 };
qry = qry.Where(o => allowedCategories.Contains(o.category ?? 0)); //報名,掛單,贊助
qry = qry.OrderByDescending(o => o.num);
var count = qry.Count(); //pageSize = count;//一次取回??
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
var ret = new
{
list = qryList.Select(x => new
{
num = x.num,
subject = x.subject,
kind = x.kind,
kindTxt = x.kind.HasValue ? x.actItem_kind.kind : "",
category = x.category,
//price = (_activity_id > 0) ? (relatingDt.Where(o => o.actItem_num == x.num).Select(o => o.price).FirstOrDefault()?? x.price) : (x.price ) , //預設金額,有活動抓活動預設,沒活動抓品項預設
price = (_activity_id > 0) ? (x.activity_relating.Select(o => o.price).FirstOrDefault() ?? x.price) : (x.price), //預設金額,有活動抓活動預設,沒活動抓品項預設
customize_data = x.customize_data ?? "",
files = x.actItem_files.Select(f => new
{
num = f.file.num,
subject = f.file.subject,
word = f.file.word,
cuz_column = f.file.customize_data ?? "", //定義欄位需求
}),
}),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
}
[HttpPost]
[Route("api/activity/GetItemFiles")]
public IHttpActionResult GetItemFiles([FromBody] Model.actItem_files q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
int this_id = q.actItem_num;
if (this_id > 0)
{
//檢查
var qry = _db.actItem_files
.Where(o => o.actItem_num == this_id);
var count = qry.Count(); //pageSize = count;//一次取回??
//if (count==0) throw new HttpResponseException(HttpStatusCode.NotFound);
var qry1 = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
int i = 1;
var list = qry1.Select(x => new
{
id = i++,
num = x.num,
actItem_num = x.actItem_num,
files_num_selected = new
{
text = x.file.subject,
val = x.files_num,
}
}).ToList();
//已有值
var ret = new
{
list = list,
count = count,
};
return Ok(ret);
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/activity/SaveDetailData")]
public IHttpActionResult SaveDetailData([FromBody] Model.actItem_files item)
{
if (item.actItem_num > 0)
{
//if有資料-修改 , else 新增
if (item.num > 0)
{
Model.actItem_files _files = _db.actItem_files
.Where(q => q.num == item.num).FirstOrDefault();//修改
if (_files != null)
{
if (item.actItem_num > 0) { _files.actItem_num = item.actItem_num; }
if (item.files_num > 0) { _files.files_num = item.files_num; }
_files.reg_time = DateTime.Now;
_db.SaveChanges();
var ret = _files.num;
return Ok(ret);
}
else
return NotFound();
}
else
{
Model.actItem_files _files = new Model.actItem_files();//新增
if (item.actItem_num > 0) { _files.actItem_num = item.actItem_num; }
if (item.files_num > 0) { _files.files_num = item.files_num; }
_files.reg_time = DateTime.Now;
_db.actItem_files.Add(_files);
_db.SaveChanges();
var ret = _files.num;
return Ok(ret);
}
}
else
{
return NotFound();
}
}
[HttpDelete]
[Route("api/activity/DeleteFilesItem/{id}")]//刪除品項的相關文件
public void DeleteFilesItem(int id)
{
var prod = _db.actItem_files.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
_db.actItem_files.Remove(prod);
_db.SaveChanges(); //執行
}
}
[HttpPost]
[Route("api/activity/GetKindDetail")]
public IHttpActionResult GetKindDetail([FromBody] Model.activity_kind_detail q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
int this_id = q.activity_kind_num;
if (this_id > 0)
{
//檢查
var qry = _db.activity_kind_detail.Where(o => o.activity_kind_num == this_id);
int i = 1;
//已有值
var count = qry.Count(); //pageSize = count;//一次取回??
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
var ret = new
{
list = qryList.Select(x => new
{
id = i++,
num = x.num,
activity_kind_num = x.activity_kind_num,
actItem_num = new
{
text = x.actItem?.subject,
val = x.actItem_num,
},
price = x.price ?? 0,
qty = x.qty ?? 0,
}),
count = count,
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/activity/SaveActKindDetail")]
public IHttpActionResult SaveActKindDetail([FromBody] Model.activity_kind_detail item)
{
if (item.activity_kind_num > 0)
{
//if有資料-修改 , else 新增
if (item.num > 0)
{
Model.activity_kind_detail _detail = _db.activity_kind_detail.Where(q => q.num == item.num).FirstOrDefault();//修改
if (_detail != null)
{
if (item.activity_kind_num > 0) { _detail.activity_kind_num = item.activity_kind_num; }
if (item.actItem_num > 0) { _detail.actItem_num = item.actItem_num; }
if (item.price.HasValue) { _detail.price = item.price.Value; }
else { _detail.price = null; }
if (item.qty.HasValue) { _detail.qty = item.qty.Value; }
else { _detail.qty = null; }
_detail.reg_time = DateTime.Now;
_db.SaveChanges();
var ret = _detail.num;
return Ok(ret);
}
else
return NotFound();
}
else
{
Model.activity_kind_detail _detail = new Model.activity_kind_detail();//新增
if (item.activity_kind_num > 0) { _detail.activity_kind_num = item.activity_kind_num; }
if (item.actItem_num > 0) { _detail.actItem_num = item.actItem_num; }
if (item.price.HasValue) { _detail.price = item.price.Value; }
else { _detail.price = null; }
if (item.qty.HasValue) { _detail.qty = item.qty.Value; }
else { _detail.qty = null; }
_detail.reg_time = DateTime.Now;
_db.activity_kind_detail.Add(_detail);
_db.SaveChanges();
var ret = _detail.num;
return Ok(ret);
}
}
else
{
return NotFound();
}
}
[HttpDelete]
[Route("api/activity/DeleteActKindDetail/{id}")]//刪除活動分類的detail
public void DeleteActKindDetail(int id)
{
var prod = _db.activity_kind_detail.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
_db.activity_kind_detail.Remove(prod);
_db.SaveChanges(); //執行
}
}
[HttpPost]
[Route("api/activity/GetActRelaList")]
public IHttpActionResult GetActRelaList([FromBody] Model.activity q, int page, int pageSize = 100,
string sortBy = "", bool sortDesc = false)
{ //if pagesize==-1 get all data
int this_act_id = q.num;
if (this_act_id > 0)
{
//檢查
var prod = _db.activities.Where(o => o.num == this_act_id).FirstOrDefault();
if (prod != null)
{
int kind = prod.kind ?? 0; //分類
var qry = _db.activity_relating.AsQueryable();
qry = qry.Where(o => o.activity_num == this_act_id);
qry = qry.OrderBy(o => o.num);
//IEnumerable<Model.activity_relating> qry1=qry.AsEnumerable();
IEnumerable<Model.activity_relating> qry1 = null;
//var retD = qry1;
var count = qry.Count(); //pageSize = count;//一次取回??
if (count > 0)
{
int i = 1;
//已有值
if (pageSize > 0)
{
qry1 = qry.ToPagedList(page, pageSize);
}
else
{
qry1 = qry.ToList();
}
var orderDetails = _db.pro_order_detail
.Where(o => o.pro_order.activity_num == this_act_id)
.ToList();
var ret = new
{
//list = qry1.ToPagedList(page, pageSize).Select(x => new
list = qry1.Select(x => new
{
id = i++,
num = x.num,
activity_num = x.activity_num,
act_item_selected = new
{
text = x.actItem?.subject,
val = x.actItem_num,
},
price = x.price ?? 0,
qty = x.qty ?? 0,
files = x.actItem?.actItem_files.Select(f => new
{
num = f.file.num,
subject = f.file.subject,
list = orderDetails
.Where(o => o.actItem_num == x.actItem_num)
.OrderBy(o => o.print_id)
.ThenBy(o => o.num)
.Select(o => new
{
num = o.num,
print_id = o.print_id,
order_no = o.order_no,
from_id = o.follower1?.u_name,
printed_files = o.printed_files,
isPrinted = (o.printed_files ?? "").Contains("\"" + f.file.num.ToString() + "\""),
}),
}),
}),
count = count,
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
else
{
//未有資料
//帶分類預設
if (kind > 0)
{
int i = 1;
var qry2 = _db.activity_kind_detail.Where(o => o.activity_kind_num == kind);
var count2 = qry2.Count(); //pageSize = count2;//一次取回??
var qry2List = (pageSize > 0) ? qry2.ToPagedList(page, pageSize).ToList() : qry2.ToList();
var ret = new
{
list = qry2List.Select(x => new
{
id = i++,
num = 0,
activity_num = this_act_id,
act_item_selected = new
{
text = x.actItem?.subject,
val = x.actItem_num,
},
price = x.price ?? 0,
qty = x.qty ?? 0,
files = new
{
num = "",
subject = "",
list = new
{
num = "",
from_id = "",
printed_files = "",
isPrinted = false,
},
},
}),
count = count2
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
else
{
return NotFound();
}
}
}
else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/activity/GetKindList")]
public IHttpActionResult GetKindList([FromBody] Model.ViewModel.activity_kind q,
int page, int pageSize = 10, string sortBy = "", bool sortDesc = false)
{
var qry = _db.activity_kind.AsQueryable();
if (q.num.HasValue && q.num > 0)
qry = qry.Where(o => o.num == q.num);
if (!string.IsNullOrEmpty(q.kind))
qry = qry.Where(o => o.kind != null && o.kind.Contains(q.kind));
//qry = qry.OrderBy(O => O.kind).ThenBy(o => o.num);
var qry2 = new TreeView().get_data2(qry.Select(o => new TreeItem()
{
kind = o.kind,
num = o.num,
root = o.root,
range = o.range,
}).OrderBy(x => x.root).ThenBy(x => x.kind).ToList(), 0, 0);
var count = qry.Count(); //pageSize = count;//一次取回??
if (pageSize <= 0) pageSize = count;
var ret = new
{
list = qry2.ToPagedList(page, pageSize).Select(x => new
{
num = x.num,
kind = new TreeView().RptDash(x.Level) + x.kind,
}),
count = count
};
return Ok(ret);
}
[HttpGet]
[Route("api/activity/GetKindDate/{id}")]
public IHttpActionResult GetKindDate(int id)
{
if (id > 0)
{
var qry = _db.activity_kind.AsQueryable();
qry = qry.Where(o => o.num == id);
var prop3 = qry.FirstOrDefault();
if (prop3 != null)
{
System.Globalization.ChineseLunisolarCalendar chineseDate = new System.Globalization.ChineseLunisolarCalendar();
string _calendar = prop3.calendar;
DateTime _today = DateTime.Now;
string _startDate_solar = "";
string _endDate_solar = "";
string _startDate_lunar = "";
string _endDate_lunar = "";
if (_calendar == "國曆")
{
DateTime _newDay = Convert.ToDateTime(DateTime.Now.Year + "/" + prop3.month + "/" + prop3.day);
if (_today.Month >= prop3.month && _today.Day >= prop3.day)
{
//過期->預設明年
_newDay = Convert.ToDateTime(DateTime.Now.AddYears(1).Year + "/" + prop3.month + "/" + prop3.day);
}
else
{
//未過期->預設今年
}
_startDate_solar = _newDay.ToString("yyyy-MM-dd");
_endDate_solar = _newDay.ToString("yyyy-MM-dd");
DateTime _newDay2 = Convert.ToDateTime(chineseDate.GetYear(_newDay) + "/" + chineseDate.GetMonth(_newDay) + "/" + chineseDate.GetDayOfMonth(_newDay));
_startDate_lunar = _newDay2.ToString("yyyy-MM-dd");
_endDate_lunar = _newDay2.ToString("yyyy-MM-dd");
//TaiwanLunisolarCalendar tlc = new TaiwanLunisolarCalendar();
//DateTime _newDay3 = Convert.ToDateTime(tlc.GetYear(_newDay) + "/" + tlc.GetMonth(_newDay) + "/" + tlc.GetDayOfMonth(_newDay));
// -> TaiwanLunisolarCalendar 民國年農曆
}
else
{
}
var ret = new
{
startDate_solar = _startDate_solar,
endDate_solar = _endDate_solar,
startDate_lunar = _startDate_lunar,
endDate_lunar = _endDate_lunar,
};
return Ok(ret);
}
else
return NotFound();
}
else
return NotFound();
}
[HttpPost]
[Route("api/activity/SaveRelatingData")]
public IHttpActionResult SaveRelatingData([FromBody] Model.activity_relating item)
{
if (item.activity_num > 0)
{
//if有資料-修改 , else 新增
if (item.num > 0)
{
Model.activity_relating _data = _db.activity_relating.Where(q => q.num == item.num).FirstOrDefault();//修改
if (_data != null)
{
if (item.activity_num > 0) { _data.activity_num = item.activity_num; }
if (item.actItem_num > 0) { _data.actItem_num = item.actItem_num; }
if (item.price.HasValue) { _data.price = item.price.Value; }
else { _data.price = null; }
if (item.qty.HasValue) { _data.qty = item.qty.Value; }
else { _data.qty = null; }
_data.reg_time = DateTime.Now;
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
else
return NotFound();
}
else
{
Model.activity_relating _data = new Model.activity_relating();//新增
if (item.activity_num > 0) { _data.activity_num = item.activity_num; }
if (item.actItem_num > 0) { _data.actItem_num = item.actItem_num; }
if (item.price.HasValue) { _data.price = item.price.Value; }
else { _data.price = null; }
if (item.qty.HasValue) { _data.qty = item.qty.Value; }
else { _data.qty = null; }
_data.reg_time = DateTime.Now;
_db.activity_relating.Add(_data);
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
}
else
{
return NotFound();
}
}
[HttpDelete]
[Route("api/activity/DeleteRelatingData/{id}")]//刪除活動的相關資料
public void DeleteRelatingData(int id)
{
var prod = _db.activity_relating.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
_db.activity_relating.Remove(prod);
_db.SaveChanges(); //執行
}
}
[HttpPost]
[Route("api/activity/GetActSparesList")]
public IHttpActionResult GetActSparesList([FromBody] Model.activity q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
int this_act_id = q.num;
if (this_act_id > 0)
{
//檢查
var prod = _db.activities.Where(o => o.num == this_act_id).FirstOrDefault();
if (prod != null)
{
int kind = prod.kind ?? 0; //分類
var qry1 = _db.activity_spares.Where(o => o.activity_num == this_act_id).OrderBy(o => o.num);
var count = qry1.Count(); //pageSize = count;//一次取回??
int i = 1;
var qry1List = (pageSize > 0) ? qry1.ToPagedList(page, pageSize).ToList() : qry1.ToList();
var ret = new
{
list = qry1List.Select(x => new
{
id = i++,
num = x.num,
activity_num = x.activity_num,
act_item_selected = new
{
text = x.actItem?.subject,
val = x.actItem_num,
},
demo = x.demo,
totalqty = (x.actItem.stocks.Where(o => (o.category == (int)Model.stock.type.Purchase || o.category == (int)Model.stock.type.Return)).Select(o => o.qty).Sum() ?? 0) - x.actItem.stocks.Where(o => (o.category == (int)Model.stock.type.Reduce || o.category == (int)Model.stock.type.Rent)).Select(o => o.qty).Sum() ?? 0
}),
count = count,
};
return Ok(ret);
}
else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/activity/SaveSparesData")]
public IHttpActionResult SaveSparesData([FromBody] Model.activity_spares item)
{
if (item.activity_num > 0)
{
//if有資料-修改 , else 新增
if (item.num > 0)
{
Model.activity_spares _data = _db.activity_spares.Where(q => q.num == item.num).FirstOrDefault();//修改
if (_data != null)
{
if (item.activity_num > 0) { _data.activity_num = item.activity_num; }
if (item.actItem_num > 0) { _data.actItem_num = item.actItem_num; }
_data.demo = item.demo;
_data.reg_time = DateTime.Now;
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
else
return NotFound();
}
else
{
Model.activity_spares _data = new Model.activity_spares();//新增
if (item.activity_num > 0) { _data.activity_num = item.activity_num; }
if (item.actItem_num > 0) { _data.actItem_num = item.actItem_num; }
_data.demo = item.demo;
_data.reg_time = DateTime.Now;
_db.activity_spares.Add(_data);
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
}
else
{
return NotFound();
}
}
[HttpDelete]
[Route("api/activity/DeleteSparesData/{id}")]//刪除活動的備品資料
public void DeleteSparesData(int id)
{
var prod = _db.activity_spares.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
_db.activity_spares.Remove(prod);
_db.SaveChanges(); //執行
}
}
[HttpPost]
[Route("api/activity/OrderCheckIn")]
public IHttpActionResult OrderCheckIn([FromBody] Model.activity_check item)
{
if (item.f_num.HasValue && item.activity_num.HasValue && item.qty.HasValue && item.status.HasValue)
{
//同一天不能簽到兩次以上
Model.activity_check check = _db.activity_check
.Where(q => q.f_num == item.f_num && q.activity_num == item.activity_num && q.status == item.status
&& (System.Data.Entity.Core.Objects.EntityFunctions.TruncateTime(q.reg_time) == DateTime.Today))
.FirstOrDefault();
if (check == null)
{
Model.activity_check data = new Model.activity_check();//新增
data.f_num = item.f_num;
data.activity_num = item.activity_num;
data.qty = item.qty;
data.status = item.status;
data.reg_time = DateTime.Now;
_db.activity_check.Add(data);
_db.SaveChanges();
var ret = data.num;
return Ok(ret);
}
else
return NotFound();
}
else
return NotFound();
}
[HttpPost]
[Route("api/activity/GetCheckList")]
public IHttpActionResult GetCheckList([FromBody] Model.ViewModel.activity_check q, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
var qry = _db.activity_check.AsQueryable();
if (!string.IsNullOrEmpty(q.activityTxt))
qry = qry.Where(o => o.activity.subject.Contains(q.activityTxt.Trim()));
if (q.status.HasValue && q.status.Value > 0)
qry = qry.Where(o => o.status == q.status.Value);
if (q.reg_time1.HasValue)
qry = qry.Where(o => o.reg_time >= q.reg_time1.Value);
if (q.reg_time2.HasValue)
qry = qry.Where(o => o.reg_time < Convert.ToDateTime(q.reg_time2.Value).AddDays(1));
if (q.activity_num.HasValue && q.activity_num > 0)
qry = qry.Where(o => o.activity_num == q.activity_num);
if (q.check_time.HasValue)
{
var checkDate = q.check_time.Value.Date;
var checkDateEnd = checkDate.AddDays(1);
qry = qry.Where(o => o.reg_time >= checkDate && o.reg_time < checkDateEnd);
}
if (sortBy.Equals("subject"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.activity_num);
else
qry = qry.OrderBy(o => o.activity_num);
}
else if (sortBy.Equals("statusTxt"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.status);
else
qry = qry.OrderBy(o => o.status);
}
else if (sortBy.Equals("qty"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.f_num).ThenBy(o => o.qty);
else
qry = qry.OrderBy(o => o.f_num).ThenBy(o => o.qty);
}
else if (sortBy.Equals("reg_time_date"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.reg_time);
else
qry = qry.OrderBy(o => o.reg_time);
}
else if (sortBy.Equals("reg_time_time"))
{
// ⚠️ 警告: TimeOfDay 屬性在某些 Entity Framework 版本中可能不支援
// 如果發生 System.NotSupportedException需改為先 ToList() 再排序
// 目前如果正常運作,則資料庫提供者支援此操作
if (sortDesc)
qry = qry.OrderByDescending(o => o.reg_time.Value.TimeOfDay);
else
qry = qry.OrderBy(o => o.reg_time.Value.TimeOfDay);
}
else
qry = qry.OrderByDescending(o => o.num);
var tdesc = publicFun.enum_desc<Model.activity_check.keyin1>();
var count = qry.Count(); //pageSize = count;//一次取回??
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
var ret = new
{
list = qryList.Select(x => new
{
num = x.num,
subject = x.activity?.subject,
status = x.status,
statusTxt = x.status != null ? tdesc[x.status ?? 1] : "",
qty = x.qty,
//u_name = x.f_num.HasValue? x.follower.u_name :"",
u_name = x.follower?.u_name,
//reg_timeDate = x.reg_time?.Date,
reg_time = x.reg_time,
}),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
[HttpDelete]
[Route("api/activity/DeleteCheck/{id}")]
public void DeleteCheck(int id)
{
var prod = _db.activity_check.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
_db.activity_check.Remove(prod);
_db.SaveChanges(); //執行
}
}
[HttpDelete]
[Route("api/activity/DeleteAllCheck/{nums}")]
public void DeleteAllCheck(string nums)
{
if (!string.IsNullOrEmpty(nums))
{
string[] num = nums.Split(',');
int[] ids = new int[num.Length];
for (int i = 0; i < num.Length; i++)
{
if (!string.IsNullOrEmpty(num[i]))
ids[i] = Convert.ToInt32(num[i]);
}
var prod = _db.activity_check.Where(q => ids.Contains(q.num)).ToList();
if (prod.Count() > 0)
{
_db.activity_check.RemoveRange(prod);
_db.SaveChanges();
}
}
}
[HttpPost]
[Route("api/activity/GetActivityBoard")]
public IHttpActionResult GetActivityBoard([FromBody] Model.ViewModel.activity_check q)
{
DateTime _now = DateTime.Now;
var qry = _db.activities.AsQueryable();
if (q.reg_time1.HasValue)
qry = qry.Where(o => o.reg_time >= q.reg_time1.Value);
if (q.reg_time2.HasValue)
qry = qry.Where(o => o.reg_time < Convert.ToDateTime(q.reg_time2.Value).AddDays(1));
qry = qry.Where(o => (_now >= o.startDate_solar && _now < o.endDate_lunar) || (_now < o.startDate_solar && o.dueDate.HasValue && DbFunctions.DiffDays(o.dueDate, _now) <= 180));
qry = qry.OrderByDescending(o => o.num);
qry = qry.Take(10);
var tdesc = publicFun.enum_desc<Model.activity_check.keyin1>();
var r1 = qry.ToList();
var r2 = r1.Select(x => new { num = x.num, subject = x.subject });
var count = qry.Count();
// 計算昨天和今天的日期範圍
var yesterdayStart = _now.Date.AddDays(-1);
var yesterdayEnd = _now.Date;
var todayStart = _now.Date;
var todayEnd = _now.Date.AddDays(1);
var ret = new
{
list = r1.Select(x => new
{
num = x.num,
subject = x.subject,
startDate_solar = x.startDate_solar,
endDate_solar = x.endDate_solar,
startDate_lunar = x.startDate_lunar,
endDate_lunar = x.endDate_lunar,
order_qty = x.pro_order.Count(),
check_qty_yest = x.activity_check.Where(c => c.reg_time.HasValue && c.reg_time.Value >= yesterdayStart && c.reg_time.Value < yesterdayEnd).Count(),
check_qty_today = x.activity_check.Where(c => c.reg_time.HasValue && c.reg_time.Value >= todayStart && c.reg_time.Value < todayEnd).Count(),
status = (_now >= x.startDate_solar && _now < x.endDate_lunar) ? "進行中" : ((_now < x.startDate_solar && x.dueDate.HasValue && (x.dueDate.Value - _now).Days <= 180) ? "報名中" : "") //進行中: 活動日期​已開始,未結束​ ; 報名中: 未開始,報名未截止​近半年(?)的活動​
}),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
[HttpPost]
[Route("api/activity/GetCategoryKindList")]
public IHttpActionResult GetCategoryKindList([FromBody] Model.ViewModel.activity_category_kind q,
int page, int pageSize = 10, string sortBy = "", bool sortDesc = false)
{
var qry = _db.activity_category_kind.AsQueryable();
if (q.num.HasValue && q.num > 0)
qry = qry.Where(o => o.num == q.num);
if (!string.IsNullOrEmpty(q.kind))
qry = qry.Where(o => o.kind != null && o.kind.Contains(q.kind));
qry = qry.OrderBy(O => O.kind).ThenBy(o => o.num);
var count = qry.Count(); //pageSize = count;//一次取回??
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
var ret = new
{
list = qryList.Select(x => new
{
num = x.num,
kind = x.kind,
}),
count = count
};
return Ok(ret);
}
}