Files
17168ERP/web/App_Code/api/FollowerController.cs
2025-08-29 01:27:25 +08:00

691 lines
25 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 DocumentFormat.OpenXml.Office2010.Excel;
using MyWeb;
using System.Data.Entity;
// api/Follower
//[ezAuthorize(Roles = "admin")]//群組:*
[ezAuthorize]
//[RoutePrefix("api/follower")]
public class FollowerController : ApiController
{
private Model.ezEntities _db = new Model.ezEntities();
// GET api/<controller>
public IEnumerable<Model.follower> Get()
{
var list = _db.followers.ToList();
if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return list;
}
public IEnumerable<Model.follower> Get(int page, int pageSize = 10,
string sortBy="", bool sortDesc=false)
{
var list = _db.followers.OrderBy(o=>o.f_number).ToPagedList(page, pageSize);
if (list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return list;
}
// GET api/<controller>/5
public Model.follower Get(int id)
{
var item = _db.followers.Where(q => q.num == id).FirstOrDefault();
//if (item == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return item;
}
// POST api/<controller>
public void Post([FromBody] Model.follower item)
{
}
// PUT api/<controller>/5
public void Put(int id, [FromBody] Model.follower item)
{
}
// DELETE api/<controller>/5
public void Delete(int id)
{
var prod = _db.followers.AsEnumerable().Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
/*if (prod != null)
{
prod.pro_order_detail.Clear(); // Clear 方法來清除相關聯的 Child 資料,針對選擇性關聯欄位,它就會自動將欄位值更新成 null。
prod.pro_order.Clear();
prod.leader = null;//清空leader
_db.followers.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.Follower, (int)Model.admin_log.Status.Delete, prod.f_number+prod.u_name);
}
}*/
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.Follower, (int)Model.admin_log.Status.Delete, prod.f_number + prod.u_name);
}
}
}
[HttpDelete]
[Route("api/follower/Delete/{nums}")]
public void Delete(string nums)
{
if (!string.IsNullOrEmpty(nums))
{
var getDelItem = nums.TrimEnd(',').Split(',').Select(s => int.Parse(s));
var prod = _db.followers.AsEnumerable().Where(q => getDelItem.Contains(q.num)).ToList();
if (prod.Count() > 0)
{
foreach (var item in prod)
{
foreach (var item2 in item.pro_order_detail1)
item2.from_id = null; //清空訂單明細的陽上報恩者from_id //f_num設定串聯刪除
foreach (var item2 in item.pro_order)
item2.introducer = null;
item.leader = null;//清空leader
}
_db.followers.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.Follower, (int)Model.admin_log.Status.Delete, admin_log.LogViewBtn(prod.Select(x => x.f_number + x.u_name).ToList()));
}
}
}
}
[HttpGet]
[Route("api/follower/count")]
public int Count()
{
var count = _db.followers.Count();
return count;
}
[HttpPost]
[Route("api/follower/GetList")]
public IHttpActionResult GetList([FromBody] Model.ViewModel.follower q,
int page, int pageSize = 10, string sortBy = "", bool sortDesc = false)
{
////var qry = _db.followers.Where(a => a.IsDel == false).AsEnumerable();////不確定是否新增欄位? 先註解
var qry = _db.followers.AsEnumerable();
if (!string.IsNullOrEmpty(q.f_number))
qry = qry.Where(o => o.f_number.Contains(q.f_number.Trim()));
if (!string.IsNullOrEmpty(q.u_name))
qry = qry.Where(o => o.u_name.Contains(q.u_name.Trim()));
if (q.birthday.HasValue)
qry = qry.Where(o => o.birthday >= q.birthday.Value);
if (q.birthday2.HasValue)
qry = qry.Where(o => o.birthday < Convert.ToDateTime(q.birthday2.Value).AddDays(1));
if (!string.IsNullOrEmpty(q.address))
qry = qry.Where(o => o.address !=null && o.address.Contains(q.address?.Trim()));
//if (q.num.HasValue && q.num.Value>0)
// qry = qry.Where(o => o.num==q.num.Value);
if (q.ept_self.HasValue && q.ept_self.Value )//排除自己
{
qry = qry.Where(o => o.num != q.num.Value);
}
if (!string.IsNullOrEmpty(q.country))
qry = qry.Where(o => o.country== q.country);
if (!string.IsNullOrEmpty(q.country2))
{
if (q.country2 == "1")
{
qry = qry.Where(o => o.country == "158");
}else if (q.country2 == "2")
{
qry = qry.Where(o => o.country != "158");
}
}
if (sortBy.Equals("f_number"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.f_number);
else
qry = qry.OrderBy(o => o.f_number);
}
else if (sortBy.Equals("u_name"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.u_name);
else
qry = qry.OrderBy(o => o.u_name);
}
else if (sortBy.Equals("identity_type_desc"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.identity_type);
else
qry = qry.OrderBy(o => o.identity_type);
}
else if (sortBy.Equals("sex"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.sex);
else
qry = qry.OrderBy(o => o.sex);
}
else if (sortBy.Equals("birthday"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.birthday);
else
qry = qry.OrderBy(o => o.birthday);
}
else
qry = qry.OrderByDescending(o => o.num);
MyWeb.encrypt encrypt = new MyWeb.encrypt();
var tdesc = publicFun.enum_desc<Model.follower.type>();
var count = qry.Count(); //pageSize = count;//一次取回??
var ret = new
{
list = qry.ToPagedList(page, pageSize).Select(x => new
{
num = x.num,
f_number = x.f_number,
u_name = x.u_name,
sex = x.sex,
birthday = x.birthday, //?.ToString("yyyy/MM/dd"),
birthday2 = publicFun.chagenDate(x.birthday), //?.ToString("yyyy/MM/dd"),
sign = Model.follower.chagenSign(x.birthday), //NULL??
sexagenary = Model.follower.sexagenary(x.birthday),
identity_type = x.identity_type,
//identity_type_string = Enum.GetName( typeof(Model.follower.type), x.identity_type),
//identity_type_string1 = ((Model.follower.type)(x.identity_type??0)).ToString(),
identity_type_desc = tdesc[x.identity_type ?? 1] ,//TryGetValue..
phone = x.phone,
phoneDes = encrypt.DecryptAutoKey(x.phone), //--MyWeb.function X
refugedate=x.refugedate,
refuge_name = x.refuge_name,
email = x.email,
address = x.address,
cellphone = x.cellphone,
cellphoneDes = encrypt.DecryptAutoKey(x.cellphone),
}),
count = count
};
/* SQL:
SELECT
[Extent1].[num] AS [num],
[Extent1].[f_number] AS [f_number],
[Extent1].[u_name] AS [u_name],
[Extent1].[sex] AS [sex],
[Extent1].[identity_type] AS [identity_type],
[Extent1].[birthday] AS [birthday],
[Extent1].[phone] AS [phone],
[Extent1].[email] AS [email],
[Extent1].[refugedate] AS [refugedate],
[Extent1].[refuge_name] AS [refuge_name],
[Extent1].[address] AS [address],
[Extent1].[demo] AS [demo],
[Extent1].[nation] AS [nation],
[Extent1].[leader] AS [leader]
FROM [dbo].[followers] AS [Extent1]
*/
//LINQ查詢必需要寫成: 能轉成SQL指令的查詢, 故小心呼叫自訂函數(或無法)
//要學會用原生的寫法, 新式的寫法, 東西都往 MyWeb.function 裡塞, 是錯的, 要思考其合理性
//API應該儘量提供資料而不是"格式"
//日期轉字串: 如要用VUE做, 傳回date而不要tostring, 用filter + moment.js做
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
/*
write a post action: checkHashFollower
input: phone, idcode
pass to encrypt.cs: followerHash, get hash
query db: followers where follower_hash==hash to follower
output: follower (or null)
*/
[HttpPost]
[Route("api/follower/GetFamilyList")]
public IHttpActionResult GetFamilyList([FromBody] Model.ViewModel.follower q,
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)
{
//家族 : 家長是我的人,跟我同家長的人,我的家長本人,我本人
//var cc = _db.followers.AsEnumerable().Where(x => x.num == 103 || x.leader == 103).Select(x => x.num);
//var aa = _db.followers.Where(x => x.num == 103 || x.leader == 103).Select(x => x.num);
//var bb = _db.followers.Where(i => aa.Any(x => x == i.num) || aa.Any(x => x == i.leader)).ToList();
int myLeader = _db.followers.Where(x => x.num == _follower).Select(x => x.leader??0).FirstOrDefault(); //我的家長
var cc = _db.followers.Where(x => x.num == _follower || x.leader == _follower).Select(x => x.num);
//var qry =
//from c in foDt
//where c.leader == _follower ||
// ((from o in foDt
// where o.num == _follower
// select o.leader).Contains(c.leader) && c.leader != null) ||
// (from o in foDt
// where o.num == _follower
// select o.leader).Contains(c.num) ||
// c.num == _follower
//select c;
if (q.ept_self.HasValue && q.ept_self.Value) //排除自己
{
//qry =
//from c in foDt
//where c.leader == _follower ||
// ((from o in foDt
// where o.num == _follower
// select o.leader).Contains(c.leader) && c.leader != null)
// && c.num != _follower
//select c;
if (myLeader > 0)//有家長
{
//跟我同家長的人
cc = _db.followers.Where(x => x.num != _follower && (x.leader == _follower || x.leader == myLeader)).Select(x => x.num);
}
else
{
cc = _db.followers.Where(x => x.num != _follower && x.leader == _follower).Select(x => x.num);
}
}
//int ccc = cc.Count();
var qry = _db.followers.AsEnumerable().Where(f => cc.Any(x => x == f.num) || cc.Any(x => x == f.leader));
if (!string.IsNullOrEmpty(q.f_number))
qry = qry.Where(o => o.f_number.Contains(q.f_number.Trim()));
if (!string.IsNullOrEmpty(q.u_name))
qry = qry.Where(o => o.u_name.Contains(q.u_name.Trim()));
if (q.birthday.HasValue)
qry = qry.Where(o => o.birthday >= q.birthday.Value);
if (q.birthday2.HasValue)
qry = qry.Where(o => o.birthday < Convert.ToDateTime(q.birthday2.Value).AddDays(1));
if (!string.IsNullOrEmpty(q.address))
qry = qry.Where(o => o.address.Contains(q.address.Trim()));
qry = qry.OrderByDescending(o => o.num);
MyWeb.encrypt encrypt = new MyWeb.encrypt();
var tdesc = publicFun.enum_desc<Model.follower.type>();
int i = 1;
var count = qry.Count(); //pageSize = count;//一次取回??
var ret = new
{
list = qry.ToPagedList(page, pageSize).Select(x => new
{
id = i++,
num = x.num,
f_number = x.f_number,
u_name = x.u_name,
address = x.address,
birthday = x.birthday,
phone = x.phone,
phoneDes = encrypt.DecryptAutoKey(x.phone),
demo = x.demo,
identity_type_desc = tdesc[x.identity_type ?? 1],
f_num_selected = new
{
text = x.u_name,
val = x.num,
},
//data_tmp = new //tmp 暫存用
//{
// f_num_selected = new
// {
// text = x.u_name,
// val = x.num,
// },
// identity_type_desc = tdesc[x.identity_type ?? 1],
// birthday = x.birthday,
// phoneDes = encrypt.DecryptAutoKey(x.phone),
// demo = x.demo,
//},
appellation_id_selected = new
{
text = x.appellation?.title,
val = x.appellation_id,
},
}),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
else
{
return Ok("此訂單沒有姓名/名稱");
}
}
[HttpPost]
[Route("api/follower/familySave")]
public IHttpActionResult SaveDetailData([FromBody] Model.ViewModel.follower item)
{
if (item.leader.HasValue && item.leader.Value > 0 && item.f_num.HasValue && item.f_num.Value > 0)
{
if (item.num.HasValue && item.num.Value > 0)
{
//原先就有設定家長 , -> 家人 :不變 or 變更
if (item.num.Value == item.f_num.Value)
{
//變更其家人稱謂
Model.follower _data = _db.followers.Where(q => q.num == item.f_num.Value).FirstOrDefault();//修改
if (_data != null)
{
_data.appellation_id = item.appellation_id.Value;
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
else
return NotFound();
}
else
{
//移除原先的家長設定
Model.follower _data2 = _db.followers.Where(q => q.num == item.num.Value).FirstOrDefault();//修改
if (_data2 != null)
{
_data2.leader = null;
_data2.appellation_id = null;
_db.SaveChanges();
}
//變更其家長設定
Model.follower _data = _db.followers.Where(q => q.num == item.f_num.Value).FirstOrDefault();//修改
if (_data != null)
{
_data.leader = item.leader.Value;
_data.appellation_id = item.appellation_id.Value;
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
else
return NotFound();
}
}
else
{
//新增家人
//變更其家長設定
Model.follower _data = _db.followers.Where(q => q.num == item.f_num.Value).FirstOrDefault();//修改
if (_data != null)
{
_data.leader = item.leader.Value;
_data.appellation_id = item.appellation_id.Value;
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
else
return NotFound();
}
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/follower/familyDelete")]
public IHttpActionResult familyDelete([FromBody] Model.ViewModel.follower item)
{
if (item.leader.HasValue && item.leader.Value > 0 && item.num.HasValue && item.num.Value > 0)
{
//移除原先的家長設定
Model.follower _data2 = _db.followers.Where(q => q.num == item.num.Value).FirstOrDefault();//修改
if (_data2 != null)
{
_data2.leader = null;
_db.SaveChanges();
return Ok();
}
else
return NotFound();
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/follower/GetTabletList")]
public IHttpActionResult GetTabletList([FromBody] Model.follower q,
int page, int pageSize = 10, string sortBy = "", bool sortDesc = false)
{
int _follower = q.num;
pageSize = (pageSize < 0) ? 0 : pageSize;
if (_follower > 0)
{
var qry = _db.followers_tablet.AsEnumerable().Where(x=>( x.f_num??0) == _follower);
qry = qry.OrderByDescending(o => o.num);
var count = qry.Count(); //pageSize = count;//一次取回??
int i = 1;
var ret = new
{
list = qry.ToPagedList(page, pageSize).Select(x => new
{
id = i++,
num = x.num,
f_num = x.f_num,
type = x.type,
title = x.title,
}),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
return NotFound();
}
[HttpPost]
[Route("api/follower/tabletSave")]
public IHttpActionResult tabletSave([FromBody] Model.ViewModel.followers_tablet item)
{
if (item.num.HasValue && item.num.Value > 0)
{
//變更
Model.followers_tablet _data = _db.followers_tablet.Where(q => q.num == item.num.Value).FirstOrDefault();//修改
if (_data != null)
{
_data.type = item.type;
_data.title = item.title;
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
else
return NotFound();
}
else
{
//新增
Model.followers_tablet _data = new Model.followers_tablet();
_data.f_num = item.f_num;
_data.type = item.type;
_data.title = item.title;
_db.followers_tablet.Add(_data);
_db.SaveChanges();
var ret = _data.num;
return Ok(ret);
}
}
[HttpDelete]
[Route("api/follower/tabletDelete/{id}")]
public void tabletDelete(int id)
{
var prod = _db.followers_tablet.AsEnumerable().Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
_db.followers_tablet.Remove(prod);
_db.SaveChanges();//執行
}
}
[HttpPost]
[Route("api/follower/checkHashFollower")]
public IHttpActionResult CheckHashFollower([FromBody] dynamic request)
{
if (request == null || request.phone == null || request.id_code == null)
{
return BadRequest("Invalid input");
}
string phone = request.phone;
string id_code = request.id_code;
// Pass phone and idcode to encrypt.cs to get the followerHash
encrypt enc = new encrypt();
string followerHash = enc.followerHash(phone, id_code);
// Query the database for followers where follower_hash == followerHash
var follower = _db.followers.FirstOrDefault(f => f.follower_hash == followerHash);
// Return the follower or null
return Ok(follower);
}
[HttpPost]
[Route("api/follower/orderrecord")]
public IHttpActionResult GetOrderRecord(int id = 0)
{
//獲取信眾報名活動記錄
if (id == 0)
{
return Ok();
}
var orderrecord = _db.pro_order.Where(x => x.f_num == id).Include(x => x.pro_order_detail).Include(x => x.follower).ToList();
var data = new
{
list = orderrecord.Select(x => new
{
orderno = x.order_no,
startdate = x.reg_time,
endtime = x.up_time,
pwcount = x.pro_order_detail.Where(a => a.actItem.act_bom.Where(b => b.item_num == a.actItem_num && b.package_num == null).Count() == 0).Count(),
amount = x.pro_order_detail.Select(o => (float?)o.price).Sum(),
activityname = x.activity.subject,
category = x.activity.activity_category_kind.kind,
order_item = x.pro_order_detail.Where(b => b.parent_num == null).Select(c => c.actItem.subject).Distinct().ToList(),
})
};
return Ok(data);
}
[HttpPost]
[Route("api/follower/totalorderamount")]
public IHttpActionResult GetTotalOrderCount(int id)
{
//獲取信眾的報名次數和報名總功德金
var orderList = _db.pro_order.Where(x => x.f_num == id).Select(x => x.order_no).ToList();
var totalprice = _db.pro_order_detail.Where(d => orderList.Contains(d.order_no)).Sum(d => (float?)d.price) ?? 0;
/*var totalPrice = (from d in _db.pro_order_detail
join o in _db.pro_order on d.order_no equals o.order_no
where o.f_num == id
select d.price).Sum();*/
var activityTimes = _db.pro_order.Where(x => x.f_num == id).Count();
return Ok(new { totalamount = totalprice, activity_times = activityTimes });
}
[HttpPost]
[Route("api/follower/orderreordpwlist")]
public IHttpActionResult GetPwList([FromUri] string orderno)
{
if (string.IsNullOrEmpty(orderno))
{
return Ok();
}
var pwlist = _db.pro_order_detail.Where(x => x.order_no == orderno).OrderBy(k => k.actItem_num).ToList();
var data = new
{
list = pwlist.Select(j => new
{
id = j.num,
orderno = j.order_no,
printid = j.print_id,
price = j.price,
pwname = j.actItem.subject,
})
};
return Ok(data);
}
}