You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

448 lines
17 KiB
C#

10 months ago
using DSWeb.Areas.CommMng.DAL;
using DSWeb.Areas.MvcShipping.Comm;
using DSWeb.Areas.MvcShipping.DB;
using DSWeb.Areas.MvcShipping.Helper;
using DSWeb.Areas.MvcShipping.Job;
using DSWeb.Areas.MvcShipping.Models.MsOpSeaeRunBill;
using DSWeb.MvcShipping.Comm.Cookie;
using DSWeb.MvcShipping.DAL.MsOpSeaeRunBill;
using log4net;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Dynamic;
using System.Linq;
using System.Runtime.Caching;
using System.Web;
using System.Web.Mvc;
namespace DSWeb.MvcShipping.Controllers
{
public class MsOpSeaeRunBillController : Controller
{
private ILog logger = LogManager.GetLogger("MsOpSeaeRunBillController");
private RunBillContext runBillContext = new RunBillContext();
//新建
public ActionResult Create(string strBSNO)
{
ViewData["StrBSNO"] = strBSNO;
string BSNO = strBSNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).First();
var opseae = runBillContext.OpSeaes.First(s => s.BSNO == BSNO);
var info = runBillContext.InfoClients.SingleOrDefault(i => i.SHORTNAME == opseae.CUSTOMERNAME);
OpSeaeRunBill runBill = new OpSeaeRunBill();
runBill.CUSTOMERNAME = opseae.CUSTOMERNAME;
runBill.CARRIER = opseae.CARRIER;
runBill.FORWARDER = opseae.FORWARDER;
runBill.ADDR = info.ADDR;
runBill.STATUS = OpSeaeRunBillStatus.Create.ToString();
ViewData["Bill"] = JsonConvert.SerializeObject(runBill.AsEditViewModel());
return View("edit");
}
//编辑
public ActionResult Edit(string gid)
{
ViewData["GID"] = gid;
var bsnoList = runBillContext.OpSeaeRunBillItems.Where(b => b.ParentId == gid).Select(b => b.BSNO).ToList();
ViewData["StrBSNO"] = string.Join(",", bsnoList);
ViewData["Bill"] = JsonConvert.SerializeObject(runBillContext.OpSeaeRunBills.First(b => b.GID == gid).AsEditViewModel());
return View();
}
//获取客户的联系人、电话、地址等信息
public JsonResult GetCustomerInfo(string shortName)
{
var info = runBillContext.InfoClients.SingleOrDefault(i => i.SHORTNAME == shortName);
if (info != null)
{
return Json(info);
}
return null;
}
//根据bsno字符串获取opseae列表信息
public JsonResult GetOpseadList(string strBSNO)
{
string[] arrBSNO = strBSNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var list = runBillContext.OpSeaes.Where(s => arrBSNO.Contains(s.BSNO)).ToList();
return Json(new { Success = true, Message = "", data = list, totalCount = list.Count });
}
//保存
public JsonResult Save(string data, string strBSNO)
{
var viewModel = JsonConvert.DeserializeObject<RunBillEditViewModel>(data);
OpSeaeRunBill saveModel = null;
if (!string.IsNullOrEmpty(viewModel.GID))
{
saveModel = runBillContext.OpSeaeRunBills.First(b => b.GID == viewModel.GID);
viewModel.AsModel(saveModel);
runBillContext.OpSeaeRunBillItems.RemoveRange(runBillContext.OpSeaeRunBillItems.Where(i => i.ParentId == viewModel.GID));
}
else
{
saveModel = viewModel.AsModel();
saveModel.GID = Guid.NewGuid().ToString();
saveModel.CREATETIME = DateTime.Now;
saveModel.CREATEUSER = Convert.ToString(Session["USERID"]);
saveModel.CREATEUSERNAME = Convert.ToString(Session["SHOWNAME"]);
saveModel.BillNO = PubSysDAL.GetBillNo("0700");
if (string.IsNullOrWhiteSpace(saveModel.STATUS))
{
saveModel.STATUS = OpSeaeRunBillStatus.Create.ToString();
}
runBillContext.OpSeaeRunBills.Add(saveModel);
}
//判断时间区间
if (saveModel.RUNTIME.HasValue)
{
int hour = saveModel.RUNTIME.Value.Hour;
if (hour <= 12)
{
saveModel.TimeSpan = "上午";
}
else
{
saveModel.TimeSpan = "下午";
}
}
string[] arrBSNO = strBSNO.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var bsno in arrBSNO)
{
OpSeaeRunBillItem item = new OpSeaeRunBillItem();
item.GID = Guid.NewGuid().ToString();
item.BSNO = bsno;
item.ParentId = saveModel.GID;
runBillContext.OpSeaeRunBillItems.Add(item);
}
runBillContext.SaveChanges();
//推送
if (saveModel.STATUS == OpSeaeRunBillStatus.Dispatch.ToString())
{
var user = runBillContext.Users.FirstOrDefault(u => u.GID == saveModel.USERID);
if (!string.IsNullOrWhiteSpace(user.WeChatAccount))
{
WorkWeixinSendHelper.SendNotifyToUser(user.WeChatAccount, $"/MvcShipping/MsOpseaeRunBill/WxUserRedirect?userId={user.WeChatAccount}");
}
}
return Json(new { Success = true, Message = "保存成功", Data = saveModel.AsEditViewModel() });
}
//删除
public JsonResult Delete(string data) {
var viewModel = JsonConvert.DeserializeObject<RunBillEditViewModel>(data);
OpSeaeRunBill delModel = null;
delModel = runBillContext.OpSeaeRunBills.First(b => b.GID == viewModel.GID);
if (delModel.STATUS != OpSeaeRunBillStatus.Create.ToString())
{
return Json(new { Success = false, Message = "只能删除“创建”状态的跑单信息", Data = "" });
}
viewModel.AsModel(delModel);
runBillContext.OpSeaeRunBillItems.RemoveRange(runBillContext.OpSeaeRunBillItems.Where(i => i.ParentId == viewModel.GID));
runBillContext.OpSeaeRunBills.RemoveRange(runBillContext.OpSeaeRunBills.Where(i => i.GID == viewModel.GID));
runBillContext.SaveChanges();
return Json(new { Success = true, Message = "删除成功", Data = "" });
}
//列表页
public ActionResult Index()
{
return View();
}
//获取跑单列表数据
public JsonResult GetDataList(string condition, int start, int limit, int pageSize, string sort = null)
{
limit = start + pageSize;
var sessionInfo = new { USERID = Convert.ToString(Session["USERID"]), SHOWNAME = Convert.ToString(Session["SHOWNAME"]), COMPANYID = Convert.ToString(Session["COMPANYID"]) };
var count = runBillContext.Database.SqlQuery<int>(MsOpSeaeRunBillDAL.GetDataCountSql(condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]))).First();
var list = runBillContext.Database.SqlQuery<OpSeaeRunBill>(MsOpSeaeRunBillDAL.GetDataListSql(condition, Convert.ToString(Session["USERID"]), Convert.ToString(Session["SHOWNAME"]), Convert.ToString(Session["COMPANYID"]), sort, start, limit));
return Json(new { Success = true, Message = "查询成功", totalCount = count, data = list.AsListViewModelList() }, JsonRequestBehavior.AllowGet);
}
//确认接单
public JsonResult AcceptBill(string strGID)
{
string[] arrGID = strGID.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var uid = Convert.ToString(Session["USERID"]);
var staDispatch = OpSeaeRunBillStatus.Dispatch.ToString();
var list = runBillContext.OpSeaeRunBills.Where(s => s.STATUS == staDispatch && arrGID.Contains(s.GID)).ToList();
list.ForEach(b =>
{
b.ACCEPTTIME = DateTime.Now;
b.STATUS = OpSeaeRunBillStatus.Accept.ToString();
});
runBillContext.SaveChanges();
return Json(new { Success = true, Message = "操作成功" });
}
//转单
public JsonResult ChangeDispatch(string strGID, string userid, string username)
{
string[] arrGID = strGID.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var uid = Convert.ToString(Session["USERID"]);
var staComplete = OpSeaeRunBillStatus.Complete.ToString();
var list = runBillContext.OpSeaeRunBills.Where(s => s.STATUS != staComplete && arrGID.Contains(s.GID)).ToList();
var user = runBillContext.Users.FirstOrDefault(u => u.GID == userid);
if (list.Count == 0)
{
return Json(new { Success = false, Message = "没有可供操作的已选数据" });
}
list.ForEach(b =>
{
b.USERID = userid;
b.USERNAME = username;
b.TRANSFERTIME = DateTime.Now;
b.TRANSFERUSER = Convert.ToString(Session["USERID"]);
});
runBillContext.SaveChanges();
logger.Debug("跑单转单,准备推送通知");
if (!string.IsNullOrWhiteSpace(user.WeChatAccount))
{
WorkWeixinSendHelper.SendNotifyToUser(user.WeChatAccount, $"/MvcShipping/MsOpseaeRunBill/WxUserRedirect?userId={user.WeChatAccount}");
logger.Debug("推送通知:" + user.WeChatAccount);
}
if (list.Count == 1)
{
return Json(new { Success = true, Message = "操作成功", Data = list[0].AsEditViewModel() });
}
else
{
return Json(new { Success = true, Message = "操作成功" });
}
}
//转单
public JsonResult CancelChangeDispatch(string strGID)
{
string[] arrGID = strGID.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var uid = Convert.ToString(Session["USERID"]);
var staComplete = OpSeaeRunBillStatus.Complete.ToString();
var list = runBillContext.OpSeaeRunBills.Where(s => s.STATUS != staComplete && arrGID.Contains(s.GID)).ToList();
if (list.Count == 0)
{
return Json(new { Success = false, Message = "没有可供操作的已选数据" });
}
list.ForEach(b =>
{
b.USERID = b.TRANSFERUSER;
var user = runBillContext.Users.FirstOrDefault(u => u.GID == b.TRANSFERUSER);
b.USERNAME = user.SHOWNAME;
b.TRANSFERTIME = DateTime.Now;
b.TRANSFERUSER = Convert.ToString(Session["USERID"]);
});
runBillContext.SaveChanges();
if (list.Count == 1)
{
return Json(new { Success = true, Message = "操作成功", Data = list[0].AsEditViewModel() });
}
else
{
return Json(new { Success = true, Message = "操作成功" });
}
}
//派单
public JsonResult DispatchBill(string strGID)
{
string[] arrGID = strGID.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var uid = Convert.ToString(Session["USERID"]);
var staComplete = OpSeaeRunBillStatus.Complete.ToString();
var list = runBillContext.OpSeaeRunBills.Where(s => s.STATUS != staComplete && arrGID.Contains(s.GID)).ToList();
if (list.Count == 0)
{
return Json(new { Success = false, Message = "没有可供操作的已选数据" });
}
list.ForEach(b =>
{
b.STATUS = OpSeaeRunBillStatus.Dispatch.ToString();
});
runBillContext.SaveChanges();
//推送消息
logger.Debug("跑单派单,准备推送通知");
string[] arrUser = list.Select(b => "'" + b.USERID + "'").Distinct().ToArray();
string strUserIds = string.Join(",", arrUser);
var users = runBillContext.Database.SqlQuery<VUser>($"select * from vw_user where userid in ({strUserIds})").ToList();
logger.Debug($"推送用户数量:{users.Count}");
foreach (var u in users)
{
logger.Debug($"推送给用户:{u.WeChatAccount}");
if (!string.IsNullOrWhiteSpace(u.WeChatAccount))
{
WorkWeixinSendHelper.SendNotifyToUser(u.WeChatAccount, $"/MvcShipping/MsOpseaeRunBill/WxUserRedirect?userId={u.WeChatAccount}");
}
}
if (list.Count == 1)
{
return Json(new { Success = true, Message = "操作成功", Data = list[0].AsEditViewModel() });
}
else
{
return Json(new { Success = true, Message = "操作成功" });
}
}
//跑单完成
public JsonResult CompleteBill(string strGID)
{
string[] arrGID = strGID.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var uid = Convert.ToString(Session["USERID"]);
var staAccept = OpSeaeRunBillStatus.Accept.ToString();
var list = runBillContext.OpSeaeRunBills.Where(s => s.STATUS == staAccept && arrGID.Contains(s.GID)).ToList();
list.ForEach(b =>
{
b.COMPLETETIME = DateTime.Now;
b.STATUS = OpSeaeRunBillStatus.Complete.ToString();
});
runBillContext.SaveChanges();
return Json(new { Success = true, Message = "操作成功" });
}
public ActionResult TokenShow()
{
var c = MemoryCache.Default.Contains(WechatWorkTokenJob.WorkWeixinAccessTokenStoreKey);
if (c)
{
return Content($"{c}, {MemoryCache.Default[WechatWorkTokenJob.WorkWeixinAccessTokenStoreKey].ToString()}");
}
else
{
return Content($"{c}");
}
}
#region 企业号
//跳转
public ActionResult WxRedirect(string code, string state)
{
if (!MemoryCache.Default.Contains(WechatWorkTokenJob.WorkWeixinAccessTokenStoreKey))
{
return Content("token失效请联系管理员");
}
string token = MemoryCache.Default[WechatWorkTokenJob.WorkWeixinAccessTokenStoreKey].ToString();
string resp = WebRequestHelper.DoGet($"https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token={token}&code={code}");
var jsonObj = JsonConvert.DeserializeAnonymousType(resp, new
{
errcode = 0,
errmsg = "",
UserId = ""
});
if (jsonObj.errcode == 0)
{
return WxUserRedirect(jsonObj.UserId);
}
else
{
return Content("获取用户信息失败,请重试");
}
}
public ActionResult WxUserRedirect(string userId)
{
var user = runBillContext.Database.SqlQuery<VUser>("select * from vw_user where wechataccount=@uid", new SqlParameter("uid", userId)).FirstOrDefault();
if (user != null)
{
//获取用户信息存储到session
Session["USERID"] = user.userid;
Session["SHOWNAME"] = user.SHOWNAME;
Session["COMPANYID"] = user.COMPANYID;
return RedirectToAction("WxRunBillList");
}
else
{
return Content($"未找到用户:{userId},请联系管理员");
}
}
//跑单列表
public ActionResult WxRunBillList()
{
return View();
}
//跑单详情
public ActionResult WxRunBillDetail(string gid)
{
ViewData["gid"] = gid;
return View();
}
public ActionResult WxRunBillDetailData(string gid)
{
var bill = runBillContext.OpSeaeRunBills.FirstOrDefault(b => b.GID == gid);
if (bill != null)
{
var query = from a in runBillContext.OpSeaeRunBillItems
join s in runBillContext.OpSeaes on a.BSNO equals s.BSNO
where a.ParentId == gid
select s;
return Json(new
{
Success = true,
Bill = bill.AsListViewModel(),
Items = query.ToList(),
IsDispatch = bill.STATUS == OpSeaeRunBillStatus.Dispatch.ToString(),
IsAccept = bill.STATUS == OpSeaeRunBillStatus.Accept.ToString(),
IsTransfer = bill.STATUS != OpSeaeRunBillStatus.Complete.ToString()
});
}
else
{
return Json(new { Success = false });
}
}
public ActionResult WxRunBillTransfer(string gid)
{
ViewData["gid"] = gid;
return View();
}
#endregion
}
}