using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WX.CRM.BLL.Application.UserComBox;
using WX.CRM.BLL.Res;
using WX.CRM.BLL.Util;
using WX.CRM.Common;
using WX.CRM.IBLL.Res;
using WX.CRM.Model.DTO;
using WX.CRM.Model.Entity;
using WX.CRM.Model.MAP;
namespace WX.CRM.BLL.Deliver
{
public class DELIVER_BLL
{
private CACHE_BL cache_BL = new CACHE_BL();
private static IRES_CUSTOMER _customer = new RES_CUSTOMER_BL();
///
/// 插入或者更新一条 交付数据
///
///
///
public bool InserOrUpdate(WX_SZZYORDER_DELIVER_METHOD data) {
try
{
using (var db = new crmContext())
{
var model = db.WX_SZZYORDER_DELIVER_METHOD.FirstOrDefault(m => m.ORDER_ID == data.ORDER_ID);
if (model == null)
{
if (data.MAIL_PHONE.IndexOf("_") == 0)
{ //首位下划线 为简易加密后的手机号//并且为第一次入库
var phone = (Convert.ToInt64(data.MAIL_PHONE.Replace("_", "")) / 7 - 555).ToString();
var sw = new StringWriter();
_customer.ResgisterCustomer(phone, data.MAIL_RESID, "deliver", sw.ToString());//注册
data.MAIL_PHONE= phone.Substring(0, 3) + "****" + phone.Substring(7, 4);
}
db.WX_SZZYORDER_DELIVER_METHOD.Add(data);
}
else {
//由于 数据提交存在 前后顺序出现问题的情况
//已经提交的数据又会被修改回交付前
if (data.DELIVER_STATUS == 0 && model.DELIVER_STATUS != 0) return false;//不做回退更新
model.DELIVER_STATUS = data.DELIVER_STATUS;
model.MAIL_NAME = data.MAIL_NAME;
model.MAIL_RESID = data.MAIL_RESID;
model.MAIL_PHONE = data.MAIL_PHONE;
model.PROVINCE = data.PROVINCE;
model.CITY = data.CITY;
model.AREA = data.AREA;
model.ADDRESS = data.ADDRESS;
model.DELIVER_TIME = data.DELIVER_TIME;
}
return db.SaveChanges().GetResult();
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
return false;
}
}
///
/// 插入日志
///
///
///
public bool InserLog(WX_SZZYORDER_DELIVER_LOG log) {
try
{
using (var db = new crmContext())
{
if (db.WX_SZZYORDER_DELIVER_LOG.Any(m => m.DELIVER_PICTURE_ID == log.DELIVER_PICTURE_ID)) return false;
if (log.ORDER_ID == 0) return false;
//20220913 更新邮寄记录只保留一条
if (log.DELIVER_TYPE == (int)DELIVER_TYPE_ENUM.邮寄交付)
{
if (!string.IsNullOrEmpty(log.FILE_PATH))
{ //上传回执
var old = db.WX_SZZYORDER_DELIVER_LOG.FirstOrDefault(m => m.ORDER_ID == log.ORDER_ID && m.DELIVER_TYPE == (int)DELIVER_TYPE_ENUM.邮寄交付 && string.IsNullOrEmpty(m.FILE_PATH));
if (old != null)
{
old.FILE_PATH = log.FILE_PATH;
old.FILE_NAME = log.FILE_NAME;
}
else
{
db.WX_SZZYORDER_DELIVER_LOG.Add(log);
}
}
else
{ //上传快递单号
var old = db.WX_SZZYORDER_DELIVER_LOG.FirstOrDefault(m => m.ORDER_ID == log.ORDER_ID && m.DELIVER_TYPE == (int)DELIVER_TYPE_ENUM.邮寄交付 && string.IsNullOrEmpty(m.MAIL_NUMBER));
if (old != null)
{
old.MAIL_NUMBER = log.MAIL_NUMBER;
old.MAIL_TYPE = log.MAIL_TYPE;
}
else
{
db.WX_SZZYORDER_DELIVER_LOG.Add(log);
}
}
}
else
{
db.WX_SZZYORDER_DELIVER_LOG.Add(log);
}
return db.SaveChanges().GetResult();
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
return false;
}
}
///
/// 列表查询
///
///
///
///
///
public List GetList(ref Pager pager, DeliverOrderListDto querydto, QueryUserComboDto usercomboDto) {
List reslut = new List();
try
{
using (var db = new crmContext())
{
// var queryData = db.WX_SZZYORDER.AsQueryable();
//只展示 当期交付
// queryData = (from a in queryData
// join b in db.WX_SZZYSUBPRODUCT on a.SUBPRODUCTID equals b.SUBPRODUCTID
// where b.DELIVER_TYPE == 0 //当期交付
// select a);
var queryData = (from M in db.WX_SZZYORDER.AsQueryable()
join d in db.RES_CUSTOMER on M.RESID equals d.RESID
join b in db.WX_SZZYSUBPRODUCT on M.SUBPRODUCTID equals b.SUBPRODUCTID
where b.DELIVER_TYPE == 0 //当期交付
select new WX_SZZYORDERDTO
{
ORDERID = M.ORDERID,
EMPLOYEEID = M.EMPLOYEEID,
PASSWORD = M.PASSWORD,
USERID = M.USERID,
PRODUCTID = M.PRODUCTID,
PRODUCTNAME = M.PRODUCTNAME,
SUBPRODUCTID = M.SUBPRODUCTID,
SUBPRODUCTNAME = M.SUBPRODUCTNAME,
ORDERTYPE = M.ORDERTYPE,
UPGRADEORDERIDS = M.UPGRADEORDERIDS,
TOTALUPGRADEVALUE = M.TOTALUPGRADEVALUE,
NEEDPAY = M.NEEDPAY,
OPENORDER = M.OPENORDER,
SZZYORDERID = M.SZZYORDERID,
ORDERSTATUS = M.ORDERSTATUS,
CTIME = M.CTIME,
RETURNNEEDPAY = M.RETURNNEEDPAY,
CONTRACTCODE = M.CONTRACTCODE,
RET = M.RET,
RETP = M.RETP,
MSG = M.MSG,
RETURNDETAIL = M.RETURNDETAIL,
INNERUSERID = M.INNERUSERID,
OTIME = M.OTIME,
ENDTIME = M.ENDTIME,
RESID = d.UMID,
REQUESTSTATUS = M.REQUESTSTATUS,
ISFINANCEPAY = M.ISFINANCEPAY,
FINACEPAYDATE = M.FINACEPAYDATE,
REMARK = M.REMARK,
FINALPAY = M.FINALPAY,
ORDERSTATUSNAME = M.ORDERSTATUSNAME,
OPERATETIME = M.OPERATETIME,
STIME = M.STIME,
ETIME = M.ETIME,
SUSPENDCOMMENT = M.SUSPENDCOMMENT,
UPDATEORDERTIME = M.UPDATEORDERTIME,
ISOPEN = M.ISOPEN,
TEAMSERVE = M.TEAMSERVE,
FCTEXT = M.FCTEXT,
CUSTOMERUSERNAME = M.CUSTOMERUSERNAME,
ARRIVALPAY = M.ARRIVALPAY,
ARRIVALTIME = M.ARRIVALTIME,
SOURCE = M.SOURCE,
CNAME = M.CNAME,
OPENDAYS = M.OPENDAYS,
CUSTOMERCLASSIFY = M.CUSTOMERCLASSIFY,
SALEDEPTID = M.SALEDEPTID,
RISKCTRLSTATUS = M.RISKCTRLSTATUS,
ACTIVEPRODUCTCODE = M.ACTIVEPRODUCTCODE,
ACTIVEPRODUCTEXT = M.ACTIVEPRODUCTEXT,
ISTEST = M.ISTEST,
HASHGRECORD = M.HASHGRECORD,
OUTORDERO = M.OUTORDERO,
GIFTDAYS = M.GIFTDAYS,
GIFTDAYS2 = M.GIFTDAYS2,
REJECTREMARK = M.REJECTREMARK,
EXTERNAL_USERID = M.EXTERNAL_USERID,
WEWORK_REMOTEID = M.WEWORK_REMOTEID,
FUJIAN = M.FUJIAN,
DEPTCODE = M.DEPTCODE,
ESTIMATEOTIME = M.ESTIMATEOTIME,
EID = M.EID,
}
);
if (usercomboDto.userId.HasValue)
{
queryData = queryData.Where(m => m.INNERUSERID == usercomboDto.userId.Value);
}
else if (!string.IsNullOrEmpty(usercomboDto.groupIds))
{
var _groupids = OperationUtil.ConvertToDecimal(usercomboDto.groupIds.Split(','));
queryData = (from a in queryData
join b in db.BAS_INNERUSERGROUP on a.INNERUSERID equals b.INNERUSERID
where _groupids.Contains(b.GID.Value)
select a);
}
else if (!string.IsNullOrEmpty(usercomboDto.deptId))
{
//queryData = (from a in queryData
// join b in db.BAS_INNERUSERGROUP on a.INNERUSERID equals b.INNERUSERID
// join g in db.BAS_INNERGROUP on b.GID equals g.GID
// where depts.Contains(g.SALEDEPTID.Value)
// select a);
var depts = OperationUtil.ConvertToDecimal(usercomboDto.deptId.Split(','));
List ALLdeptIDS = new List();
List ALLgidS = new List();
UserServices userservices = new UserServices(cache_BL);
foreach (var item in depts)
{
List deptIDS = new List();
List gidS = new List();
userservices.GetAllDeptIDOrGidByDeptId(item, ref deptIDS, ref gidS);//获取所有的组别和gid
ALLdeptIDS.AddRange(deptIDS);
ALLgidS.AddRange(gidS);
}
queryData = (from a in queryData
join b in db.BAS_INNERUSERGROUP on a.INNERUSERID equals b.INNERUSERID
where ALLdeptIDS.Contains(b.DEPTID.Value) || ALLgidS.Contains(b.GID.Value)
select a);
}
else if (usercomboDto.companyId.HasValue)
{
queryData = (from a in queryData
join b in db.BAS_INNERUSERGROUP on a.INNERUSERID equals b.INNERUSERID
join g in db.BAS_INNERGROUP on b.GID equals g.GID
join m in db.BAS_SALESDEPARTMENT on g.SALEDEPTID equals m.SALEDEPTID
where m.COMPANYID == usercomboDto.companyId.Value
select a);
}
//客户id
if (!string.IsNullOrWhiteSpace(querydto.resId))
{
querydto.resId = querydto.resId.Trim();
queryData = queryData.Where(m => m.RESID == querydto.resId);
}
//客户姓名
if (!string.IsNullOrEmpty(querydto.cName))
{
queryData = queryData.Where(m => m.CNAME.Contains(querydto.cName));
}
//订单id
if (querydto.szzyOrderId.HasValue)
{
queryData = queryData.Where(m => m.ORDERID == querydto.szzyOrderId.Value);
}
//订单状态
if (!string.IsNullOrWhiteSpace(querydto.orderStatus))
{
var orderStatusArr = querydto.orderStatus.Split(',');
queryData = queryData.Where(m => orderStatusArr.Contains(m.ORDERSTATUS));
}
//订单开通时间
if (!string.IsNullOrWhiteSpace(querydto.ostime))
{
DateTime time = Convert.ToDateTime(querydto.ostime);
queryData = queryData.Where(m => m.OTIME >= time);
}
//订单开通时间
if (!string.IsNullOrWhiteSpace(querydto.oetime))
{
DateTime time = Convert.ToDateTime(querydto.oetime).AddDays(1).AddSeconds(-1);
queryData = queryData.Where(m => m.OTIME <= time);
}
//交付方式
if (querydto.orderDeliverType.HasValue)
{
if (querydto.orderDeliverType == -1)
{
//无记录 为未选择交付
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID into temp
from t in temp.DefaultIfEmpty()
where t == null
select a);
}
else {
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
where b.DELIVER_TYPE == querydto.orderDeliverType.Value
select a);
}
}
//交付状态
// 0未选择交付 1已在线交付 2已邮寄交付 3已在线且邮寄交付
if (querydto.orderDeliverStatus.HasValue) {
if (querydto.orderDeliverStatus.Value == 0)
{
//无记录 为未选择交付
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID into temp
from t in temp.DefaultIfEmpty()
where t == null || t.DELIVER_STATUS == querydto.orderDeliverStatus.Value
select a);
}
else {
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
where b.DELIVER_STATUS == querydto.orderDeliverStatus.Value
select a);
}
//if (querydto.orderDeliverStatus == 1) {//待交付
// queryData = (from a in queryData
// join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
// where b.DELIVER_STATUS == (int)DELIVER_STATUS_ENUM.未交付
// select a);
//}
//else {
// queryData = (from a in queryData
// join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
// where b.DELIVER_STATUS == (int)DELIVER_STATUS_ENUM.已在线交付
// || b.DELIVER_STATUS == (int)DELIVER_STATUS_ENUM.已邮寄交付
// || b.DELIVER_STATUS == (int)DELIVER_STATUS_ENUM.已在线且邮寄交付//暂时不存在并列情况
// select a);
//}
}
//收件人名称
if (!string.IsNullOrEmpty(querydto.mailName)) {
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
where b.DELIVER_TYPE == (int)DELIVER_TYPE_ENUM.邮寄交付 && b.MAIL_NAME.Contains(querydto.mailName.Trim())
select a);
}
//收货地址
if (!string.IsNullOrEmpty(querydto.addressInfo))
{
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
where b.DELIVER_TYPE == (int)DELIVER_TYPE_ENUM.邮寄交付
&& (b.PROVINCE.Contains(querydto.addressInfo.Trim())
|| b.CITY.Contains(querydto.addressInfo.Trim())
|| b.AREA.Contains(querydto.addressInfo.Trim())
|| b.ADDRESS.Contains(querydto.addressInfo.Trim()))
select a);
}
//快递单号
if (!string.IsNullOrEmpty(querydto.mailNumber))
{
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
join c in db.WX_SZZYORDER_DELIVER_LOG on a.ORDERID equals c.ORDER_ID into temp
from t in temp.DefaultIfEmpty()
where b.DELIVER_TYPE == (int)DELIVER_TYPE_ENUM.邮寄交付
&& t!=null && t.MAIL_NUMBER.Contains(querydto.mailNumber.Trim())
// && t.OrderByDescending(m => m.CTIME).FirstOrDefault(m => !string.IsNullOrEmpty(m.MAIL_NUMBER)).MAIL_NUMBER.Contains(querydto.mailNumber.Trim())
select a);
}
//交付开始时间
if (querydto.dstime.HasValue)
{
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
where b.DELIVER_TIME >= querydto.dstime.Value
select a);
}
//交付结束时间
if (querydto.detime.HasValue)
{
queryData = (from a in queryData
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
where b.DELIVER_TIME <= querydto.detime.Value.AddDays(1).AddSeconds(-1)
select a);
}
queryData = queryData.OrderByDescending(m => m.CTIME);
#region 分页与合并
//分页
PagerUtil.SetPager(ref queryData, ref pager);
//组合结果
foreach (var item in queryData.ToList())
{
DeliverOrderView r = new DeliverOrderView();
r.RESID = item.RESID;
r.DEPTCODE = item.DEPTCODE;
r.CNAME = item.CNAME;
r.INNERUSERID = item.INNERUSERID.ToString();
r.SUBPRODUCTNAME = item.SUBPRODUCTNAME;
r.ORDERID = item.ORDERID;
r.ORDERSTATUS = item.ORDERSTATUS;
r.ORDERSTATUSNAME = item.ORDERSTATUSNAME;
r.OPENDAYS = item.OPENDAYS;
r.OTIME = item.OTIME?.ToString("yyyy-MM-dd HH:mm:ss");
r.DELIVERSTATUS = "未选择交付";
r.DELIVERTYPE = "未选择交付";
r.MAILNAME = "--";
r.ADDRESSINFO = "--";
r.MAILPHONE = "--";
r.MAILNUMBER = "--";
r.MAILFIlE = "--";
r.MAILTYPE = "--";//快递公司
r.MAILRESID = "";
var deliver = db.WX_SZZYORDER_DELIVER_METHOD.FirstOrDefault(m => m.ORDER_ID == item.ORDERID);
if (deliver != null) {
r.DELIVERSTATUS = ((DELIVER_STATUS_ENUM)deliver.DELIVER_STATUS).ToString();
r.DELIVERTYPE = ((DELIVER_TYPE_ENUM)deliver.DELIVER_TYPE).ToString();
r.DTIME=deliver.DELIVER_TIME?.ToString("yyyy-MM-dd HH:mm:ss");
if (deliver.DELIVER_TYPE == (int)DELIVER_TYPE_ENUM.邮寄交付)
{
r.MAILNAME = deliver.MAIL_NAME;
r.ADDRESSINFO = string.Format("{0} {1} {2} {3}", deliver.PROVINCE, deliver.CITY, deliver.AREA, deliver.ADDRESS);
r.MAILPHONE = deliver.MAIL_PHONE;
r.MAILRESID = deliver.MAIL_RESID;
if (deliver.DELIVER_STATUS == (int)DELIVER_STATUS_ENUM.已在线且邮寄交付 || deliver.DELIVER_STATUS == (int)DELIVER_STATUS_ENUM.已邮寄交付)
{
var log = db.WX_SZZYORDER_DELIVER_LOG.Where(m => m.ORDER_ID == item.ORDERID && m.DELIVER_TYPE == (int)DELIVER_TYPE_ENUM.邮寄交付).OrderByDescending(m => m.CTIME).ToList();
var numberLog = log.FirstOrDefault(m => !string.IsNullOrEmpty(m.MAIL_NUMBER));//最新一条邮寄单号
var fileLog = log.FirstOrDefault(m => !string.IsNullOrEmpty(m.FILE_PATH));//最新一条邮寄回执
if (numberLog != null) { //找到了交付日志
r.MAILNUMBER = numberLog.MAIL_NUMBER;
r.MAILTYPE= numberLog.MAIL_TYPE==null? "" : ((MAIL_TYPE_ENUM)Convert.ToInt32(numberLog.MAIL_TYPE)).ToString();
}
if (fileLog!=null) {
r.MAILFIlE = "查看";
}
}
}
}
reslut.Add(r);
}
#endregion
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
}
return reslut;
}
///
/// 获取产品 交付连接
///
///
///
public string GetOrderDeliverLink(decimal? ORDERID) {
try
{
using (var db = new crmContext())
{
var link = (from a in db.WX_SZZYORDER
join b in db.WX_SZZYSUBPRODUCT on a.SUBPRODUCTID equals b.SUBPRODUCTID
where a.ORDERID == ORDERID
select b.DELIVER_URL).FirstOrDefault();
return link;
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
return "";
}
}
///
/// 获取产品 交付连接
///
///
///
public WX_SZZYORDER_DELIVER_METHOD GetDeliverInfo(decimal? ORDERID)
{
try
{
using (var db = new crmContext())
{
var info = (from a in db.WX_SZZYORDER
join b in db.WX_SZZYORDER_DELIVER_METHOD on a.ORDERID equals b.ORDER_ID
where a.ORDERID == ORDERID && b.DELIVER_TYPE==(int)DELIVER_TYPE_ENUM.邮寄交付
select b).FirstOrDefault();
return info;
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
return null;
}
}
///
/// 获取手机号
///
///
///
public string GetPhone(decimal? ORDERID) {
try
{
using (var db = new crmContext())
{
var method = db.WX_SZZYORDER_DELIVER_METHOD.FirstOrDefault(m=>m.ORDER_ID== ORDERID);
return method.MAIL_RESID;
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
return "";
}
}
public WX_SZZYORDER_DELIVER_METHOD GetOrderDeliver(decimal? ORDERID) {
try
{
using (var db = new crmContext())
{
return db.WX_SZZYORDER_DELIVER_METHOD.FirstOrDefault(m => m.ORDER_ID == ORDERID);
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
return null;
}
}
public List GetOrderDeliverLog(decimal? ORDERID) {
try
{
using (var db = new crmContext())
{
return db.WX_SZZYORDER_DELIVER_LOG.Where(m => m.ORDER_ID == ORDERID).ToList();
}
}
catch (Exception ex)
{
LogHelper.Error(ex);
return null;
}
}
public List GetEIds(string txt_deptId, string txt_userId)
{
using (var db = new crmContext())
{
var query = db.BAS_INNERUSER.AsQueryable();
if (!string.IsNullOrEmpty(txt_userId))
{
query.Where(w => w.PKID.ToString() == txt_userId);
}
return query.Select(o => o.EID.ToString()).ToList();
}
}
public List GetInfoByEid(params int[] EIds)
{
using (var db = new crmContext())
{
var query = db.BAS_INNERUSER.AsQueryable();
if (EIds!=null && EIds.Any())
{
var items = EIds.Select(o => Convert.ToDecimal(o)).ToList();
query.Where(w=> items.Contains(w.EID));
}
return query.ToList().Select(o => new BindListDto
{
EId = Convert.ToInt32(o.EID),
EName = o.UNAME
}).ToList();
}
}
}
public class DeliverOrderView {
public string RESID { get; set; }
public string DEPTCODE { get; set; }
public string CNAME { get; set; }
public string GNAME { get; set; }
public string INNERUSERID { get; set; }
public string SUBPRODUCTNAME { get; set; }
public decimal ORDERID { get; set; }
public string ORDERSTATUS { get; set; }
public string ORDERSTATUSNAME { get; set; }
public decimal? OPENDAYS { get; set; }
public string DELIVERTYPE { get; set; }
public string DELIVERSTATUS { get; set; }
public string MAILNAME { get; set; }
public string ADDRESSINFO { get; set; }
public string MAILPHONE { get; set; }
public string MAILRESID { get; set; }
public string MAILTYPE { get; set; }
public string MAILNUMBER { get; set; }
public string MAILFIlE { get; set; }
public string OTIME { get; set; }
public string DTIME { get; set; }
}
public class DeliverOrderListDto
{
public string resId { get; set; }
public string cName { get; set; }
public decimal? szzyOrderId { get; set; }
public string orderStatus { get; set; }
public int? orderDeliverStatus { get; set; }
public int? orderDeliverType { get; set; }
public string mailName { get; set; }
public string addressInfo { get; set; }
public string mailNumber { get; set; }
public string ostime { get; set; }
public string oetime { get; set; }
public string showPhone { get; set; }
public DateTime? dstime { get; set; }
public DateTime? detime { get; set; }
}
}