API 查詢同步改寫 .Contains()、.OrderBy()、複雜 GroupBy/Math.Round,必要時 materialize 或加 HasValue。 Participation rate / kind breakdown 改在記憶體計算,同時檢查整數陣列 .Contains() 的型別安全性。
1559 lines
56 KiB
C#
1559 lines
56 KiB
C#
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);
|
||
}
|
||
|
||
}
|