1066 lines
38 KiB
C#
1066 lines
38 KiB
C#
using DocumentFormat.OpenXml.Drawing.Charts;
|
|
using DocumentFormat.OpenXml.Office2010.Excel;
|
|
using Model;
|
|
using MyWeb;
|
|
using Newtonsoft.Json;
|
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
|
|
using PagedList;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Data.Entity;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Web.Http;
|
|
using System.Web.Razor.Tokenizer;
|
|
|
|
// api/Follower
|
|
//[ezAuthorize(Roles = "admin")]//群組:*
|
|
[ezAuthorize]
|
|
//[RoutePrefix("api/follower")]
|
|
public class FollowerController : ApiController
|
|
{
|
|
private Model.ezEntities _db = new Model.ezEntities();
|
|
// GET api/<controller>
|
|
// TODO: CRITICAL - 無參數 Get() 會載入所有信眾到內存(可能數千筆)
|
|
// 建議:停用此方法,強制使用分頁版本 Get(page, pageSize)
|
|
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.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)).ToList();
|
|
|
|
var prod = _db.followers.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.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).AsQueryable();////不確定是否新增欄位? 先註解
|
|
var qry = _db.followers.AsQueryable();
|
|
|
|
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) {
|
|
var tmpBirthday2 = Convert.ToDateTime(q.birthday2.Value).AddDays(1);
|
|
qry = qry.Where(o => o.birthday < tmpBirthday2);
|
|
}
|
|
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");
|
|
|
|
}
|
|
}
|
|
|
|
// 電話/證號搜尋 (使用 search_keywords HEX 編碼)
|
|
if (!string.IsNullOrEmpty(q.phone_idcode) && GlobalVariables.UseSearchKeywords)
|
|
{
|
|
MyWeb.encrypt enc = new MyWeb.encrypt();
|
|
string hexSearch = enc.ConvertToHex(q.phone_idcode.Trim());
|
|
if (!string.IsNullOrEmpty(hexSearch))
|
|
{
|
|
qry = qry.Where(o => o.search_keywords != null && o.search_keywords.Contains(hexSearch));
|
|
}
|
|
}
|
|
|
|
|
|
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 qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
|
|
var ret = new
|
|
{
|
|
list = qryList.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();
|
|
|
|
// 優化:使用子查詢在數據庫層面執行,避免載入所有家族成員 ID
|
|
// 生成 SQL: WHERE num IN (SELECT...) OR leader IN (SELECT...)
|
|
var qry = _db.followers.Where(f => cc.Contains(f.num) || (f.leader.HasValue && cc.Contains(f.leader.Value)));
|
|
|
|
|
|
|
|
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>();
|
|
var count = qry.Count(); //pageSize = count;//一次取回??
|
|
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
|
|
int i = 1;
|
|
var ret = new
|
|
{
|
|
list = qryList.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();
|
|
}
|
|
|
|
}
|
|
|
|
[HttpGet]
|
|
[Route("api/follower/GetAutoEnrollList/{id}")]
|
|
public IHttpActionResult GetAutoEnrollList(int id)
|
|
{
|
|
var prod = _db.auto_enroll.Where(q => q.f_num == id).ToList();
|
|
var ret = new
|
|
{
|
|
list = prod.Select(x => new
|
|
{
|
|
num = x.num,
|
|
auto_enroll_start_date = x.start_date.ToString("yyyy-MM-dd"),
|
|
auto_enroll_end_date = x.end_date.ToString("yyyy-MM-dd"),
|
|
auto_enroll_receipt_title = x.receipt_title?? "",
|
|
auto_enroll_receipt_address = x.receipt_address?? "",
|
|
}),
|
|
|
|
};
|
|
return Ok(ret);
|
|
}
|
|
|
|
[HttpPost]
|
|
[Route("api/follower/SaveAutoEnrollList")]
|
|
public IHttpActionResult SaveAutoEnrollList([FromBody] Model.auto_enroll item)
|
|
{
|
|
Model.auto_enroll autoEnroll;
|
|
if (item.num == 0)
|
|
{
|
|
// ===== 新增 =====
|
|
autoEnroll = new Model.auto_enroll()
|
|
{
|
|
f_num = item.f_num,
|
|
start_date = item.start_date,
|
|
end_date = item.end_date,
|
|
receipt_title = string.IsNullOrEmpty(item.receipt_title) ? null : item.receipt_title.Trim(),
|
|
receipt_address = string.IsNullOrEmpty(item.receipt_address) ? null : item.receipt_address.Trim(),
|
|
}
|
|
;
|
|
_db.auto_enroll.Add(autoEnroll);
|
|
_db.SaveChanges();
|
|
CreateOrdersForActivities(item.f_num, autoEnroll.num, item.start_date, item.end_date, item.receipt_title, item.receipt_address);
|
|
}
|
|
else
|
|
{
|
|
// ===== 更新 =====
|
|
autoEnroll = _db.auto_enroll.Where(q => q.num == item.num).FirstOrDefault();
|
|
if (autoEnroll == null) return NotFound();
|
|
|
|
autoEnroll.start_date = item.start_date;
|
|
autoEnroll.end_date = item.end_date;
|
|
autoEnroll.receipt_title = item.receipt_title?.Trim() ?? null;
|
|
autoEnroll.receipt_address = item.receipt_address?.Trim() ?? null;
|
|
_db.SaveChanges();
|
|
CreateOrdersForActivities(item.f_num, autoEnroll.num, item.start_date, item.end_date, item.receipt_title, item.receipt_address);
|
|
}
|
|
|
|
try
|
|
{
|
|
var ret = new
|
|
{
|
|
num = autoEnroll.num,
|
|
start_date = autoEnroll.start_date.ToString("yyyy-MM-dd"),
|
|
end_date = autoEnroll.end_date.ToString("yyyy-MM-dd"),
|
|
receipt_title = autoEnroll.receipt_title,
|
|
receipt_address = autoEnroll.receipt_address,
|
|
};
|
|
return Ok(ret);
|
|
}
|
|
catch(Exception ex)
|
|
{
|
|
return InternalServerError(ex);
|
|
}
|
|
}
|
|
|
|
[HttpPost]
|
|
[Route("api/follower/GetAffectedOrders")]
|
|
public IHttpActionResult GetAffectedOrders([FromBody] Model.auto_enroll item, bool is_delete = false)
|
|
{
|
|
if (item == null) return BadRequest();
|
|
try
|
|
{
|
|
IQueryable<pro_order> query = _db.pro_order
|
|
.Where(o => o.f_num == item.f_num
|
|
&& o.order_no.StartsWith("AU")
|
|
&& o.au_num == item.num);
|
|
|
|
if (is_delete)
|
|
{
|
|
// 刪除:查期間內所有自動報名訂單
|
|
query = query.Where(o =>
|
|
o.activity.startDate_solar >= item.start_date &&
|
|
o.activity.startDate_solar <= item.end_date
|
|
);
|
|
}
|
|
else
|
|
{
|
|
// 修改:查不在新範圍內的訂單
|
|
query = query.Where(o =>
|
|
o.activity.startDate_solar < item.start_date ||
|
|
o.activity.startDate_solar > item.end_date
|
|
);
|
|
}
|
|
|
|
var rawOrders = query.Select(o => new
|
|
{
|
|
o.order_no,
|
|
o.activity.subject,
|
|
o.activity.startDate_solar
|
|
}).ToList();
|
|
|
|
var affectedOrders = rawOrders.Select(o => new
|
|
{
|
|
order_no = o.order_no,
|
|
activityname = o.subject,
|
|
activitydate = o.startDate_solar?.ToString("yyyy/MM/dd") ?? ""
|
|
}).ToList();
|
|
|
|
return Ok(new
|
|
{
|
|
count = affectedOrders.Count,
|
|
list = affectedOrders
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return InternalServerError(ex.GetBaseException());
|
|
}
|
|
}
|
|
|
|
|
|
[HttpDelete]
|
|
[Route("api/follower/DeleteAutoEnroll/{id}")]
|
|
public IHttpActionResult DeleteAutoEnroll(int id)
|
|
{
|
|
try
|
|
{
|
|
var prod = _db.auto_enroll.Where(q => q.num == id).FirstOrDefault();
|
|
if (prod != null)
|
|
{
|
|
_db.auto_enroll.Remove(prod);
|
|
_db.SaveChanges();
|
|
return Ok();
|
|
}
|
|
else return NotFound();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return BadRequest(ex.Message);
|
|
}
|
|
}
|
|
|
|
|
|
[HttpGet]
|
|
[Route("api/follower/GetUnfilledActivityOrders/{id}")]
|
|
public IHttpActionResult GetUnfilledActivityOrders(int id, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false)
|
|
{
|
|
try
|
|
{
|
|
var config = _db.auto_enroll.FirstOrDefault(x => x.num == id);
|
|
if (config == null) return NotFound();
|
|
|
|
var query = from o in _db.pro_order
|
|
join a in _db.activities on o.activity_num equals a.num
|
|
where o.f_num == config.f_num
|
|
&& a.startDate_solar >= config.start_date
|
|
&& a.startDate_solar <= config.end_date
|
|
&& !_db.pro_order_detail.Any(d => d.order_no == o.order_no)
|
|
select new { o, a };
|
|
|
|
int totalCount = query.Count();
|
|
|
|
var pagedData = query
|
|
.OrderByDescending(x => x.o.order_no)
|
|
.Skip((page - 1) * pageSize)
|
|
.Take(pageSize)
|
|
.ToList()
|
|
.Select(x => new {
|
|
order_no = x.o.order_no,
|
|
startdate = x.a.startDate_solar?.ToString("yyyy/MM/dd") ?? "",
|
|
enddate = x.a.endDate_solar?.ToString("yyyy/MM/dd") ?? "",
|
|
activityname = x.a.subject,
|
|
category = x.a.activity_category_kind?.kind ?? ""
|
|
});
|
|
|
|
return Ok(new
|
|
{
|
|
list = pagedData,
|
|
count = totalCount,
|
|
page = page,
|
|
pageSize = pageSize
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return BadRequest(ex.Message);
|
|
}
|
|
}
|
|
|
|
|
|
[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.Where(x=> x.f_num == _follower);
|
|
qry = qry.OrderByDescending(o => o.num);
|
|
var count = qry.Count(); //pageSize = count;//一次取回??
|
|
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
|
|
int i = 1;
|
|
var ret = new
|
|
{
|
|
list = qryList.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.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,
|
|
startdate = x.activity.startDate_solar,
|
|
enddate = x.activity.endDate_solar,
|
|
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/pending_orders")]
|
|
public IHttpActionResult GetPendingOrders(int id, string targetDate)
|
|
{
|
|
|
|
DateTime today = DateTime.Today;
|
|
if (!DateTime.TryParse(targetDate, out DateTime limitDate))
|
|
{
|
|
limitDate = new DateTime(2099, 12, 31);
|
|
}
|
|
var orderrecord = _db.pro_order
|
|
.Where(x => x.f_num == id && x.activity.startDate_solar >= today && x.activity.startDate_solar < limitDate)
|
|
.Include(x => x.activity)
|
|
.ToList();
|
|
var data = new
|
|
{
|
|
list = orderrecord.Select(x => new
|
|
{
|
|
orderno = x.order_no,
|
|
activitydate = x.activity.startDate_solar.Value.ToString("yyyy/MM/dd"),
|
|
activityname = x.activity.subject,
|
|
})
|
|
};
|
|
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);
|
|
}
|
|
|
|
private void CreateOrdersForActivities(int f_num, int au_num, DateTime start_date, DateTime end_date, string receipt_title, string receipt_address)
|
|
{
|
|
var follower = _db.followers.Where(x => x.num == f_num).FirstOrDefault();
|
|
var activities = _db.activities
|
|
.Where(x =>
|
|
x.startDate_solar >= start_date &&
|
|
x.startDate_solar <= end_date
|
|
)
|
|
.ToList();
|
|
|
|
foreach (var activity in activities)
|
|
{
|
|
var existOrder = _db.pro_order
|
|
.Where(o => o.activity_num == activity.num && o.f_num == f_num)
|
|
.FirstOrDefault();
|
|
|
|
if (existOrder != null) {
|
|
existOrder.au_num = au_num;
|
|
_db.SaveChanges();
|
|
continue;
|
|
}
|
|
|
|
string newOrderNo = AutoOrderService.CreateAutoOrderNumber(_db);
|
|
string finalPhone = follower?.cellphone ?? follower?.phone ?? "";
|
|
|
|
var newOrder = new pro_order
|
|
{
|
|
order_no = newOrderNo,
|
|
up_time = DateTime.Now,
|
|
reg_time = DateTime.Now,
|
|
keyin1 = "A01",
|
|
f_num = f_num,
|
|
au_num = au_num,
|
|
phone = finalPhone,
|
|
address = string.IsNullOrEmpty(receipt_address) ? "" : receipt_address,
|
|
activity_num = activity.num,
|
|
receipt_title = receipt_title ?? "",
|
|
demo = "",
|
|
customize_data = "",
|
|
};
|
|
_db.pro_order.Add(newOrder);
|
|
|
|
// 抓取同活動分類的上一筆訂單,複製品項
|
|
var latestOrder = _db.pro_order
|
|
.Where(o =>
|
|
o.f_num == f_num &&
|
|
o.activity.kind == activity.kind &&
|
|
o.order_no != newOrderNo &&
|
|
_db.pro_order_detail.Any(d => d.order_no == o.order_no)
|
|
)
|
|
.OrderByDescending(o => o.order_no)
|
|
.FirstOrDefault();
|
|
|
|
if (latestOrder != null)
|
|
{
|
|
var prevDetails = _db.pro_order_detail
|
|
.Where(d => d.order_no == latestOrder.order_no)
|
|
.ToList();
|
|
|
|
foreach (var detail in prevDetails)
|
|
{
|
|
var newDetail = new pro_order_detail
|
|
{
|
|
order_no = newOrderNo,
|
|
actItem_num = detail.actItem_num,
|
|
parent_num = detail.parent_num,
|
|
print_id = detail.print_id,
|
|
f_num = detail.f_num,
|
|
f_num_tablet = detail.f_num_tablet,
|
|
address = detail.address,
|
|
from_id = detail.from_id,
|
|
from_id_tablet = detail.from_id_tablet,
|
|
bed_type = detail.bed_type,
|
|
qty = detail.qty,
|
|
price = detail.price,
|
|
start_date = DateTime.Today,
|
|
pay = detail.pay,
|
|
keyin1 = detail.keyin1,
|
|
demo = detail.demo,
|
|
customize_data = detail.customize_data,
|
|
printed_files = detail.printed_files,
|
|
UpdateTime = DateTime.Now,
|
|
};
|
|
_db.pro_order_detail.Add(newDetail);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
_db.SaveChanges();
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public static class AutoOrderService
|
|
{
|
|
private static readonly object _lock = new object();
|
|
|
|
public static string CreateAutoOrderNumber(Model.ezEntities _db)
|
|
{
|
|
lock (_lock)
|
|
{
|
|
string prefix = "AU" + DateTime.Now.ToString("yyMMdd");
|
|
|
|
var company = _db.companies.FirstOrDefault(q => q.num == 1);
|
|
if (company == null) return "";
|
|
|
|
string order_no;
|
|
if (!string.IsNullOrEmpty(company.last_auto_order_no) && company.last_auto_order_no.StartsWith(prefix))
|
|
{
|
|
string serialStr = company.last_auto_order_no.Replace(prefix, "");
|
|
int nextSerial = int.Parse(serialStr) + 1;
|
|
order_no = prefix + nextSerial.ToString("0000");
|
|
}
|
|
else
|
|
{
|
|
order_no = prefix + "0001";
|
|
}
|
|
|
|
company.last_auto_order_no = order_no;
|
|
_db.SaveChanges();
|
|
|
|
return order_no;
|
|
}
|
|
}
|
|
}
|