using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MadRunFabric.Common;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Logging;
using DistributionApi.IRepositories;
using Api.SignToken;
using System.Security.Claims;
using DistributionApi.Models.Input;
using MadRunFabric.Model;
using MongoDB.Bson;
using System.Threading;
using MadRunFabric.Model.MessageApi;
using Microsoft.Extensions.Configuration;
namespace DistributionApi.Controllers
{
///
/// 配送计划 - 省三院
///
[Authorize]
[ApiVersion("6.0")]
[Route("api/[controller]")]
[Produces("application/json")]
public class DistriWorkOrderPlanController : BaseController
{
private readonly ILogger _logger;
private readonly IConfiguration _configuration;
private readonly ISys_User_AccountRepository _sys_user_accountRepository;
private readonly ISignTokenService _signTokenService;
private readonly IDistri_Workorder_PlanRepository _distri_workorder_planrepository;
private readonly IDistri_Workorder_PlanTaskRepository _distri_workorder_plantaskrepository;
private readonly IDistri_WorkorderRepository _distri_workorderrepository;
private readonly IDistri_Workorder_ItemsRepository _distri_workorder_itemsrepository;
private readonly IDistri_Workorder_EvaluateRepository _distri_workorder_evaluaterepository;
private readonly IPro_Project_InfoRepository _pro_project_infoRepository;
private readonly IHangfirePlan_DistributionRepository _hangfireplan_distributionrepository;
private readonly IHangfireService _hangfireService;
private readonly IWechatService _wechatservice;
private readonly ISys_ClassGroupRepository _sys_classgrouprepository;
private readonly ISys_ClassGroup_User_MapRepository _sys_classgroup_user_maprepository;
private readonly ISys_User_AccountRepository _sys_user_accountrepository;
private readonly ISys_Role_InfoRepository _sys_role_inforepository;
private readonly IWo_Order_User_MapRepository _wo_order_user_maprepository;
private readonly ISys_User_AccountRepository _distri_sys_user_accountrepository;
public DistriWorkOrderPlanController(
ILogger logger,
IConfiguration configuration,
ISys_User_AccountRepository sys_user_accountRepository,
ISignTokenService signTokenService,
IDistri_Workorder_PlanRepository distri_workorder_planrepository,
IDistri_Workorder_PlanTaskRepository distri_workorder_plantaskrepository,
IDistri_WorkorderRepository distri_workorderrepository,
IDistri_Workorder_ItemsRepository distri_workorder_itemsrepository,
IDistri_Workorder_EvaluateRepository distri_workorder_evaluaterepository,
IPro_Project_InfoRepository pro_project_infoRepository,
IHangfirePlan_DistributionRepository hangfireplan_distributionrepository,
IHangfireService hangfireService,
IWechatService wechatservice,
ISys_ClassGroupRepository sys_classgrouprepository,
ISys_ClassGroup_User_MapRepository sys_classgroup_user_maprepository,
ISys_User_AccountRepository sys_user_accountrepository,
ISys_Role_InfoRepository sys_role_inforepository,
IWo_Order_User_MapRepository wo_order_user_maprepository,
ISys_User_AccountRepository distri_sys_user_accountrepository
)
{
_logger = logger;
_configuration = configuration;
_sys_user_accountRepository = sys_user_accountRepository;
_signTokenService = signTokenService;
_distri_workorder_planrepository = distri_workorder_planrepository;
_distri_workorder_plantaskrepository = distri_workorder_plantaskrepository;
_distri_workorderrepository = distri_workorderrepository;
_distri_workorder_itemsrepository = distri_workorder_itemsrepository;
_distri_workorder_evaluaterepository = distri_workorder_evaluaterepository;
_pro_project_infoRepository = pro_project_infoRepository;
_hangfireplan_distributionrepository = hangfireplan_distributionrepository;
_hangfireService = hangfireService;
_wechatservice = wechatservice;
_sys_classgrouprepository = sys_classgrouprepository;
_sys_classgroup_user_maprepository = sys_classgroup_user_maprepository;
_sys_user_accountrepository = sys_user_accountrepository;
_sys_role_inforepository = sys_role_inforepository;
_wo_order_user_maprepository = wo_order_user_maprepository;
_distri_sys_user_accountrepository = distri_sys_user_accountrepository;
}
#region 计划管理
///
/// 获取配送计划列表分页 by page
///
///
///
///
///
///
///
[HttpGet("getlistbypage")]
public async Task GetListByPageAsync(string keyword, string projectid, int planstate = -1, int pageindex = 1, int pagesize = 10)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
//var userstr = _signTokenService.GetUserInfoAsync(usercode).Result;
//var userinfo = userstr.ToJObject()["data"].ToString().ToObject();
string allprojectrole = _configuration["allprojectrole"];
var userinfos = _sys_user_accountRepository.GetUserInfo(usercode, allprojectrole);
var userinfo = JsonHelper.JsonToEntity(userinfos.ToJson());
//获取数据
int recordCount = 0;
var result = _distri_workorder_planrepository.GetListsByPage(keyword, projectid, planstate, userinfo, pageindex, pagesize, out recordCount);
var list = result.ToList();
//获取所有 HangFirePlan 关系图
var listHangFirePlan = await _hangfireplan_distributionrepository.GetAll();
foreach (var item in list)
{
if (!string.IsNullOrWhiteSpace(item.hangfireid))
{
var hfmo = listHangFirePlan.FirstOrDefault(x=>x.id == item.hangfireid);
if (hfmo != null)
{
item.plancycle = hfmo.plancycle;
item.planinterval = hfmo.planinterval;
item.plantimes = hfmo.plantimes;
item.extensiontime = hfmo.extensiontime;
}
}
}
var obj = new
{
rows = list.ToList(),
total = recordCount
};
return Success("获取成功", obj);
}
///
/// 获取配送计划详情
///
[HttpGet("getsingle")]
public async Task GetSingleAsync(string id)
{
if (string.IsNullOrEmpty(id))
return Error("参数错误");
var model = _distri_workorder_planrepository.GetDetails(id);
if (model != null)
{
if (!string.IsNullOrWhiteSpace(model.hangfireid))
{
var hfmo = await _hangfireplan_distributionrepository.GetSingle(model.hangfireid);
if (hfmo != null)
{
model.plancycle = hfmo.plancycle;
model.planinterval = hfmo.planinterval;
model.plantimes = hfmo.plantimes;
model.extensiontime = hfmo.extensiontime;
}
}
return Success("获取成功!", model);
}
return Success("获取成功", model);
}
///
/// 添加配送计划
///
[HttpPost("add")]
public async Task AddAsync(DistriWorkOrderPlanInput input)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value;
if (string.IsNullOrWhiteSpace(input.projectid))
return Error("请选择项目");
var pro = await _pro_project_infoRepository.GetSingle(input.projectid);
if (pro != null && pro.isend == 1)
return Error("该项目已暂停");
#region 判断验证
if (string.IsNullOrEmpty(input.projectid))
return Error("请选择项目");
if (string.IsNullOrEmpty(input.planname))
return Error("请选择计划名称");
if (input.goodslist == null || input.goodslist.Count <= 0)
return Error("请选择物品种类");
int goodsnum = input.goodslist.Sum(x => x.num);
if (goodsnum <= 0)
return Error("请填写物品数量");
if (input.deliverylist == null || input.deliverylist.Count <= 0)
return Error("请选择发货地址");
#endregion
var model = new Distri_Workorder_Plan();
#region model 添加配送计划对象
model.projectid = input.projectid;
model.channel = input.channel;
model.planname = input.planname;
model.plancontent = input.plancontent;
//model.planstate = input.planstate;
model.startdate = input.startdate;
model.enddate = input.enddate;
model.createtby = usercode;
model.goodslist = input.goodslist;
model.deliverylist = input.deliverylist;
model.deliveryname = input.deliveryname;
model.deliverytel = input.deliverytel;
#endregion
bool b = await _distri_workorder_planrepository.Add(model);
if (b)
{
#region 添加定时计划任务
//保存计划任务 - 方法
var planid = await addDistributionPlan(input, "");
model.hangfireid = planid;
await _distri_workorder_planrepository.UpdateOne(model);
//_logger.LogError(null, "ceshi2:" + input.ToJson());
//设置定时任务
var extensiontime = JsonHelper.ObjectToJson(input.extensiontime);
SetTaskAsync(model.id, input.plancycle, input.planinterval, input.plantimes, extensiontime);
#endregion
//if (DateTime.Now.Date == input.startdate.Date)
//{
// await AddHangfirePlanWorkorderAsync(model);
//}
return Success("保存成功");
}
else
return Error("保存失败");
}
///
/// 修改配送计划
///
[HttpPost("update")]
public async Task UpdateAsync(DistriWorkOrderPlanInput input)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value;
if (string.IsNullOrWhiteSpace(input.projectid))
return Error("请选择项目");
var pro = await _pro_project_infoRepository.GetSingle(input.projectid);
if (pro != null && pro.isend == 1)
return Error("该项目已暂停");
var model = await _distri_workorder_planrepository.GetSingle(p => p.id == input.id);
if (model != null)
{
#region 判断验证
if (string.IsNullOrEmpty(input.projectid))
return Error("请选择项目");
if (string.IsNullOrEmpty(input.planname))
return Error("请选择计划名称");
if (input.goodslist == null || input.goodslist.Count <= 0)
return Error("请选择物品种类");
int goodsnum = input.goodslist.Sum(x => x.num);
if (goodsnum <= 0)
return Error("请填写物品数量");
if (input.deliverylist == null || input.deliverylist.Count <= 0)
return Error("请选择发货地址");
#endregion
#region model 添加配送计划对象
model.projectid = input.projectid;
model.channel = input.channel;
model.planname = input.planname;
model.plancontent = input.plancontent;
model.planstate = input.planstate;
model.startdate = input.startdate;
model.enddate = input.enddate;
model.createtby = usercode;
model.goodslist = input.goodslist;
model.deliverylist = input.deliverylist;
model.deliveryname = input.deliveryname;
model.deliverytel = input.deliverytel;
#endregion
bool b = await _distri_workorder_planrepository.UpdateOne(model);
if (b)
{
#region 添加定时计划任务
//保存计划任务 - 方法
var planid = await addDistributionPlan(input, "");
model.hangfireid = planid;
await _distri_workorder_planrepository.UpdateOne(model);
//设置定时任务
var extensiontime = JsonHelper.ObjectToJson(input.extensiontime);
SetTaskAsync(model.id, input.plancycle, input.planinterval, input.plantimes, extensiontime);
//_logger.LogError(null, "ceshi2:" + input.ToJson());
#endregion
return Success("保存成功");
}
else
return Error("保存失败");
}
return Error("参数错误");
}
#region 不用的
/////
///// 完成计划 - 只是此计划完成,与循环无关
/////
/////
/////
/////
//[HttpPost("finish")]
//public async Task UpdateFinishAsync(string id)
//{
// string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
// if (string.IsNullOrEmpty(id))
// return Error("参数错误");
// var model = await _distri_workorder_planrepository.GetSingle(id);
// if (model == null)
// return Error("操作失败");
// if (model.planstate == (int)EnumDistriWorkOrderPlanstate.finish)
// return Error("操作失败,计划已完成");
// model.dealby = usercode; //处理人
// model.dealtime = DateTime.Now; //处理时间
// //配送计划状态:0创建计划,1已完成
// model.planstate = (int)EnumDistriWorkOrderPlanstate.finish;
// bool b = await _distri_workorder_planrepository.UpdateOne(model);
// if (b)
// {
// return Success("接单成功");
// }
// return Error("接单失败");
//}
#endregion
///
/// 删除配送计划
///
///
///
[HttpPost("delete")]
public async Task RemoveAsync(string[] ids)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
//使用逻辑删除
//物理删除的数据无法恢复
var res = 0;
if (ids == null && ids.Length <= 0)
return Error("请选择要删除的记录");
foreach (var item in ids)
{
var model_Plan = await _distri_workorder_planrepository.GetSingle(item);
model_Plan.isdelete = 1;
model_Plan.deleteby = usercode;
model_Plan.deletetime = DateTime.Now;
if (await _distri_workorder_planrepository.UpdateOne(model_Plan))
{
#region 查询此计划是否有未执行的工单,若有一并删除
var list_Wo = await _distri_workorderrepository.Get(r => r.planid.Equals(item) && r.wostate == (int)EnumEquipmentRunningState.create);
if (list_Wo.Count() > 0)
{
foreach (var item_Dis in list_Wo)
{
item_Dis.isdelete = 1;
item_Dis.deleteby = usercode;
item_Dis.dealtime = DateTime.Now;
await _distri_workorderrepository.UpdateOne(item_Dis);
}
}
#endregion
RemoveTask(model_Plan.id);
res += 1;
}
}
if (res == ids.Length)
return Success("删除成功");
else if (res > 0 && res < ids.Length)
return Error("部分删除失败,请查看后重新操作");
else
return Error("删除失败,请查看后重新操作");
}
///
/// 启动计划
///
///
///
[HttpPost("start")]
public async Task StartAsync(string[] ids)
{
var res = 0;
if (ids != null && ids.Length > 0)
{
try
{
foreach (var item in ids)
{
var ml = await _distri_workorder_planrepository.GetSingle(item);
ml.planstate = 0;
if (await _distri_workorder_planrepository.UpdateOne(ml))
{
var hl = await _hangfireplan_distributionrepository.GetSingle(ml.hangfireid);
var extensiontime = JsonHelper.ObjectToJson(hl.extensiontime);
SetTaskAsync(item, hl.plancycle, hl.planinterval, hl.plantimes, extensiontime);
res += 1;
}
}
if (res == ids.Length)
return Success("操作成功");
else if (res > 0 && res < ids.Length)
return Error("部分操作失败,请查看后重新操作");
else
return Error("操作失败,请查看后重新操作");
}
catch (Exception ex)
{
_logger.LogError(ex, "启动计划异常");
return Error("启动计划失败");
}
}
else
return Error("请选择要操作的记录");
}
///
/// 中止计划
///
///
///
[HttpPost("stop")]
public async Task StopAsync(string[] ids)
{
var res = 0;
if (ids != null && ids.Length > 0)
{
try
{
foreach (var item in ids)
{
var ml = await _distri_workorder_planrepository.GetSingle(item);
ml.planstate = 1;
if (await _distri_workorder_planrepository.UpdateOne(ml))
{
RemoveTask(ml.id);
res += 1;
}
}
if (res == ids.Length)
return Success("操作成功");
else if (res > 0 && res < ids.Length)
return Error("部分操作失败,请查看后重新操作");
else
return Error("操作失败,请查看后重新操作");
}
catch (Exception ex)
{
_logger.LogError(ex, "中止计划异常");
return Error("中止计划失败");
}
}
else
return Error("请选择要操作的记录");
}
#endregion
#region 方法 - 设置定时计划
///
/// 设置定时任务
///
///
///
///
///
private void SetTaskAsync(string planid, int plancycle, int planinterval, int plantimes,string extensiontime)
{
_logger.LogDebug("DistriWorkOrderPlanController/SetTask start ");
_hangfireService.AddDistriWorkOrderPlan(planid, plancycle, planinterval, plantimes, extensiontime);
}
///
/// 删除计划 - 到期删除
///
///
private void RemoveTask(string id)
{
_logger.LogDebug("DistriWorkOrderPlanController/RemoveTask remove");
_hangfireService.RemoveDistriWorkOrderPlan(id);
}
#endregion
#region 方法 - 保存计划任务定时
///
/// 保存计划任务定时 - 方法
///
///
///
///
private async Task addDistributionPlan(DistriWorkOrderPlanInput input, string planid)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
var model = new HangfirePlan_Distribution();
if (!string.IsNullOrWhiteSpace(planid))
{
model = await _hangfireplan_distributionrepository.GetSingle(planid);
}
else
{
model.id = ObjectId.GenerateNewId().ToString();
model.wotype = (int)EnumDistributionWoType.distribution;
model.createby = usercode;
model.createtime = DateTime.Now;
model.isdelete = 0;
//bool b = await _hangfireplan_distributionepository.Add(model);
}
model.plantype = 1; //定时计划
model.plancycle = input.plancycle;
model.plantimes = input.plantimes;
model.planinterval = input.planinterval;
model.planstate = input.planstate;
model.extensiontime = input.extensiontime;
var b = false;
if (string.IsNullOrWhiteSpace(planid))
b = await _hangfireplan_distributionrepository.Add(model);
else
b = await _hangfireplan_distributionrepository.UpdateOne(model);
if (b)
return model.id;
else
return "";
}
#endregion
#region 添加计划工单 - Hangfire循环定时 - 为Hangfire提供接口
///
/// 添加计划工单 - Hangfire循环定时
///
[AllowAnonymous]
[HttpPost("addhangfire")]
public async Task AddHangfireAsync(string planid)
{
_logger.LogDebug("DistriWorkOrderPlanController/AddHangfireAsync 添加计划工单 start");
if (string.IsNullOrWhiteSpace(planid))
{
_logger.LogError("AddHangfireAsync Error 计划不能为空");
return Error("计划不能为空");
}
var b = false;
//获取上一计划详情,作为生成模板
var modelPlan = await _distri_workorder_planrepository.GetSingle(planid);
if (modelPlan != null)
{
if (DateTime.Now.Date < modelPlan.startdate.Date)
{
_logger.LogDebug("AddHangfireAsync Error 未到计划执行时间,计划名称:" + modelPlan.planname);
return Error("未到计划执行时间");
}
if (DateTime.Now.Date > modelPlan.enddate.Date)
{
//删除计划 - 到期删除
RemoveTask(planid);
_logger.LogDebug("AddHangfireAsync Error 计划已结束,计划名称:" + modelPlan.planname);
return Error("计划已结束");
}
//Hangfire循环定时 - 方法
b = await AddHangfirePlanWorkorderAsync(modelPlan);
}
if (b)
{
_logger.LogDebug("DistriWorkOrderPlanController/AddHangfireAsync 添加成功");
return Success("添加成功");
}
else
{
_logger.LogError("DistriWorkOrderPlanController/AddHangfireAsync 添加失败");
return Error("添加失败");
}
}
///
/// 生成计划工单 - Hangfire循环定时 - 强制配送 - 方法
///
///
///
public async Task AddHangfirePlanWorkorderAsync(Distri_Workorder_Plan planmodel)
{
_logger.LogDebug("DistriWorkOrderPlanController/AddHangfirePlanWorkorderAsync Start ");
var model_Hangfire = await _hangfireplan_distributionrepository.GetSingle(planmodel.hangfireid);
int res = 0; int count = 0;
#region 自动分配计划工单至计划参与人 - 获取参与人(电梯岗/配送岗) - 与排班没有关系,选中计划添加参与人 - 注释目的:生成计划工单时不执行参与人,在计划执行时间段推送给参与人(接口saveautoassignhangfire中添加参与人)
////获取当前时间
//DateTime nowDateTime = DateTime.Now;
//string nowDate = nowDateTime.ToString("yyyy-MM-dd");
////当天 - 获取当天排班列表
//var listClassUser = (await _sys_classgroup_user_maprepository.Get(x => x.date == nowDate && x.isdelete == 0 && x.isstatus == 1 && x.projectid == planmodel.projectid)).ToList();
////当天参与计划 - 排班人列表
//var listClassUserByPlan = listClassUser.Where(x => x.distri_planList != null && x.distri_planList.Count > 0 && x.isjoin == true && x.distri_planList.Select(p => p.planid).Contains(planmodel.id));
//List listUserCode = new List();
//foreach (var item in listClassUserByPlan)
//{
// listUserCode.Add(item.usercode);
//}
#endregion
if (model_Hangfire != null)
{
#region 生成物品信息 - 主要是设置剩余数值
List list_task = new List();
foreach (var item_plan in planmodel.goodslist)
{
var model_task = new DistributionGoodsListByTask();
model_task.goodsid = item_plan.goodsid;
model_task.goodsname = item_plan.goodsname;
model_task.typeid = item_plan.typeid;
model_task.isremind = item_plan.isremind;
model_task.remark = item_plan.remark;
model_task.num = item_plan.num;
model_task.usednum = 0; //使用数量 - 主要是设置剩余数值
list_task.Add(model_task);
}
#endregion
#region 不用
//foreach (var item in model_Hangfire.extensiontime)
//{
// //Thread.Sleep(500);
// var model = new Distri_Workorder_PlanTask();
// #region 基本信息
// model.channel = planmodel.channel;
// model.projectid = planmodel.projectid;
// model.planid = planmodel.id;
// model.wocode = UniqueData.Gener("", 2); //计划工单编号 目前不用
// model.planwostate = (int)EnumDistriWorkOrderPlanWOstate.create;
// model.name = planmodel.planname;
// model.content = planmodel.plancontent;
// model.joinuserlist = new List(); //计划工单参与人
// model.goodslist = list_task;
// model.deliverylist = planmodel.deliverylist;
// model.deliveryname = planmodel.deliveryname;
// model.deliverytel = planmodel.deliverytel;
// model.starttime = DateTime.Parse(DateTime.Now.AddDays(item.startdate - 1).ToString("yyyy-MM-dd") + " " + item.starttime.ToString("HH:mm"));
// model.endtime = DateTime.Parse(DateTime.Now.AddDays(item.enddate - 1).ToString("yyyy-MM-dd") + " " + item.endtime.ToString("HH:mm"));
// model.createtby = planmodel.createtby;
// model.createtime = DateTime.Now;
// model.isdelete = 0;
// #endregion
// //DateTime starttime = DateTime.Parse(DateTime.Now.AddDays(item.startdate - 1).ToString("yyyy-MM-dd") + " " + item.starttime.ToString("HH:mm"));
// //DateTime endtime = DateTime.Parse(DateTime.Now.AddDays(item.enddate - 1).ToString("yyyy-MM-dd") + " " + item.endtime.ToString("HH:mm"));
// //开始时间小于当前时间不创建工单
// //if (starttime <= DateTime.Now) //临时注释
// //{ continue; }
// if (await _distri_workorder_plantaskrepository.Add(model))
// {
// res += 1;
// }
// count++;
//}
#endregion
var timeMode = new ExtensionTimeModel();
foreach (var item in model_Hangfire.extensiontime)
{
string hourS = item.starttime.ToString("HH");
string hourNowS = DateTime.Now.ToString("HH");
if (hourNowS == hourS)
{
timeMode.startdate = item.startdate;
timeMode.starttime = item.starttime;
timeMode.enddate = item.enddate;
timeMode.endtime = item.endtime;
}
break;
}
//Thread.Sleep(500);
var model = new Distri_Workorder_PlanTask();
#region 基本信息
model.channel = planmodel.channel;
model.projectid = planmodel.projectid;
model.planid = planmodel.id;
model.wocode = UniqueData.Gener("", 2); //计划工单编号 目前不用
model.planwostate = (int)EnumDistriWorkOrderPlanWOstate.create;
model.name = planmodel.planname;
model.content = planmodel.plancontent;
model.joinuserlist = new List(); //计划工单参与人
model.goodslist = list_task;
model.deliverylist = planmodel.deliverylist;
model.deliveryname = planmodel.deliveryname;
model.deliverytel = planmodel.deliverytel;
model.starttime = DateTime.Parse(DateTime.Now.AddDays(timeMode.startdate - 1).ToString("yyyy-MM-dd") + " " + timeMode.starttime.ToString("HH:mm"));
model.endtime = DateTime.Parse(DateTime.Now.AddDays(timeMode.enddate - 1).ToString("yyyy-MM-dd") + " " + timeMode.endtime.ToString("HH:mm"));
model.createtby = planmodel.createtby;
model.createtime = DateTime.Now;
model.isdelete = 0;
#endregion
DateTime starttime = DateTime.Parse(DateTime.Now.AddDays(timeMode.startdate - 1).ToString("yyyy-MM-dd") + " " + timeMode.starttime.ToString("HH:mm"));
//DateTime endtime = DateTime.Parse(DateTime.Now.AddDays(item.enddate - 1).ToString("yyyy-MM-dd") + " " + item.endtime.ToString("HH:mm"));
//开始时间小于当前时间不创建工单
//if (starttime <= DateTime.Now) //临时注释
//{ continue; }
if (await _distri_workorder_plantaskrepository.Add(model))
{
_logger.LogError("AddHangfirePlanWorkorderAsync 定时生成计划工单成功,计划工单名称:" + planmodel.planname + ",计划工单内容:" + planmodel.plancontent);
return true;
}
else
{
_logger.LogError("AddHangfirePlanWorkorderAsync 定时生成添加计划失败,计划工单名称:" + planmodel.planname + ",计划工单内容:" + planmodel.plancontent);
return false;
}
}
else
{
_logger.LogError("AddHangfirePlanWorkorderAsync 定时生成添加计划失败!计划工单名称:" + planmodel.planname + ",计划工单内容:" + planmodel.plancontent);
return false;
}
}
///
/// 自动定时计划 - 自动分配 随机工单 计划工单
///
[AllowAnonymous]
[HttpPost("saveautoassignhangfire")]
public async Task AddAutoAssignHangfireAsync(int wotype)
{
_logger.LogDebug("DistriWorkOrderPlanController/AddAutoAssignHangfireAsync ");
if (wotype == (int)EnumDistributionWoType.autoassign)
{
DateTime dtnow = DateTime.Now;
string nowDay = dtnow.ToString("yyyy-MM-dd");
//1、配送岗 抢单时效 3分钟(某单子此时间内没人抢,系统强制分配)
//抢单时效 - 分钟数
int receive_Time = _distri_workorder_planrepository.GetLimitCount("ReceiveOrder_Time");
//累积待配送量最大值
int limit_Max = _distri_workorder_planrepository.GetLimitCount("Distribution_MaxNum");
//待配送工单滞留时效 - 分钟数
int stuck_Time = _distri_workorder_planrepository.GetLimitCount("StuckOrder_Time");
DateTime dtnow_Out = dtnow.AddMinutes(-receive_Time);
var list = (await _distri_workorderrepository.Get(x => x.wosorts == (int)EnumDistributionWoSorts.random && x.isdelete == 0)).ToList();
//计划工单
var list_PlanTask = await _distri_workorder_plantaskrepository.Get(x => x.isdelete == 0);
//获取当天排班列表
var listClassUser = (await _sys_classgroup_user_maprepository.Get(x => x.date == nowDay && x.isdelete == 0 && x.isstatus == 1)).ToList();
//强制分配 - 添加接单人
//待分配工单
var list_wo = list.Where(x => x.createtime < dtnow_Out && x.wostate == (int)EnumDistributionState.create);
var list_num = list.Where(x => x.wostate == (int)EnumDistributionState.assign).ToList();
//计划工单 - 开始
var list_PlanTask_start = list_PlanTask.Where(x => x.planwostate <= (int)EnumDistriWorkOrderPlanWOstate.start && x.joinuserlist.Count>0).ToList(); //x.joinuserlist !=null &&
//班别列表
var listClass = (await _sys_classgrouprepository.Get(x => x.isdelete == 0)).ToList();
#region 获取用户符合条件的用户
//var listUser = (await _sys_user_accountrepository.Get(x => x.delete_flag == false && x.lock_flag == false)).ToList();
List listUserCode_ByPlan = new List();
List listUserCode = new List();
foreach (var item in listClassUser)
{
//获取条件 - 日期和班别code
var list_code = new List { }; //班别code
var dayone = item.date;
var list_r = item.classgroupList.ToList();
foreach (var item_r in list_r)
{
if (item_r.roleList != null && item_r.roleList.Count > 0)
{
//角色 - 班别
var mode_r = item_r.roleList.FirstOrDefault(x => x.ischeck == true); // && x.rolecode == rolecode // && x.rolecode == "SSY_PSG"
if (mode_r != null)
list_code.Add(item_r.code);
}
}
if (list_code != null && list_code.Count > 0)
{
listClass = listClass.Where(x => list_code.Contains(x.code)).ToList();
var model_Class = listClass.FirstOrDefault(x => DateTime.Parse(nowDay + " " + x.starttime) <= dtnow && DateTime.Parse(nowDay + " " + x.endtime) >= dtnow);
if(model_Class!=null)
{
//判断人员下面是否有未完成的计划工单(如果没有,则分配随机工单)
var list_p = list_PlanTask_start.Where(x => x.joinuserlist.Contains(item.usercode)).ToList();
if (list_p.Count <= 0)
{
listUserCode_ByPlan.Add(item.usercode);
}
listUserCode.Add(item.usercode); //随机工单
}
//foreach (var item_Class in listClass)
//{
// //判断人员下面是否有未完成的计划工单(如果没有,则分配随机工单)
// var list_p = list_PlanTask_start.Where(x => x.joinuserlist.Contains(item.usercode)).ToList();
// if (list_p.Count <= 0)
// {
// listUserCode_ByPlan.Add(item.usercode);
// }
// listUserCode.Add(item.usercode); //随机工单
//}
}
}
#endregion
#region 1、待强制分配工单
//缓存里临时 配送列表
var list_num_assign = list_num;
var listwo = list_wo;
foreach (var item in listwo)
{
//Thread.Sleep(500);
#region 获取待配送工单量最少用户
//var listUser = new List();
int n = limit_Max; //临时参数
var usercodeMin = "";
// 用户 和 工单数 list
var list_usernum = new List();
foreach (var itemUser in listUserCode)
{
var model_usernum = new UserAndNumList();
int num = list_num_assign.Count(x => x.touser.Contains(itemUser));
model_usernum.num = num;
model_usernum.usercode = itemUser;
list_usernum.Add(model_usernum);
//if (n > num)
//{
// n = num; //最小值赋值
// usercodeMin = itemUser;
//}
}
//获取单数最少的用户
var model_minusernum = list_usernum.OrderBy(x => x.num).FirstOrDefault();
if (model_minusernum != null)
{
n = model_minusernum.num;
usercodeMin = model_minusernum.usercode;
}
#endregion
var userinfo = (await _distri_sys_user_accountrepository.GetSingle(x => x.usercode == usercodeMin)); //x.delete_flag == false &&
if (n < limit_Max)
{
//2019-01-04 修改bug 多次配送同一个人
if (item.wostate == (int)EnumDistributionState.create && item.touser.Count <= 0)
{
#region 强制分配
item.touser = new List() { usercodeMin }; //配送岗 - 转派人/抢单人
item.totype = (int)EnumDistributionTotype.assign;
//配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价
item.wostate = (int)EnumDistributionState.assign;
item.assigtime = DateTime.Now;
bool b = await _distri_workorderrepository.UpdateOne(item);
#region 微信模板消息
if (item.channel == 4)
{
var model_Receiver = item.receiverlist.FirstOrDefault();
string content = "抢单人:" + usercodeMin + "-" + usercodeMin
+ "\n联系电话:" + (userinfo != null ? userinfo.mobile : "")
+ "\n收货地址:" + (model_Receiver != null ? model_Receiver.building_name : "") + (model_Receiver != null ? model_Receiver.floor_name : "") + " 科室:" + (model_Receiver != null ? model_Receiver.department_name : "")
+ "\n抢单时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
_logger.LogError("neirong: " + content);
SendWechatMsg(item.wocode, "配送员抢单成功!", "配送员已抢单成功,等待配送员取货", content, "", item.id, item.createtby); //默认是查看工单详情 PSDD
}
//int islast = item.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是
//AddItems(item.id, item.wocode, item.wostate, item.wostate_elevator, channel, islast, usercode, "", "配送岗" + username + "抢单:", usercode);
#endregion
_logger.LogDebug("DistriWorkOrderPlanController/AddAutoAssignHangfireAsync 自动定时计划 强制分配,分配人:" + item.touser.ToJson() + "工单:" + item.wocode);
#endregion
//添加对应待配送(已分配)
list_num_assign.Add(item);
}
}
}
#endregion
#region 2、自动分配计划工单至计划参与人 - 获取参与人(电梯岗/配送岗) - 与排班没有关系,选中计划添加参与人
//计划工单 - 新建
var list_PlanTask_create = list_PlanTask.Where(x => x.planwostate == (int)EnumDistriWorkOrderPlanWOstate.create && x.joinuserlist.Count == 0 && x.joinuserlist.Count <= 0).ToList(); // && x.starttime <= dtnow && x.endtime >= dtnow
foreach (var item_plan in list_PlanTask_create)
{
List listUserCode_Plan = new List();
//当天 - 获取当天排班列表
listClassUser = listClassUser.Where(x => x.projectid == item_plan.projectid).ToList();
#region 1、提前计划排班 - PC端管理员,主管等昨天的提前计划排班
//当天参与计划 - 排班人列表
var listClassUserByPlan = listClassUser.Where(x => x.distri_planList != null && x.distri_planList.Count > 0 && x.isjoin == true && x.distri_planList.Select(p => p.planid).Contains(item_plan.planid));
foreach (var item in listClassUserByPlan)
{
listUserCode_Plan.Add(item.usercode);
}
item_plan.joinuserlist = listUserCode_Plan.Distinct().ToList(); //计划工单参与人
await _distri_workorder_plantaskrepository.UpdateOne(item_plan);
#endregion
#region 2、无人接的计划工单 - A、无提前计划排班;B、无人抢单,需要自动分配
#region 获取待配送工单量最少用户
int n = limit_Max; //临时参数
var usercodeMin = "";
// 用户 和 工单数 list
var list_usernum = new List();
foreach (var itemUser in listUserCode_ByPlan)
{
var model_usernum = new UserAndNumList();
int num = list_PlanTask_start.Count(x => x.joinuserlist.Contains(itemUser));
model_usernum.num = num;
model_usernum.usercode = itemUser;
list_usernum.Add(model_usernum);
}
//获取单数最少的用户
var model_minusernum = list_usernum.OrderBy(x => x.num).FirstOrDefault();
if (model_minusernum != null)
{
n = model_minusernum.num;
usercodeMin = model_minusernum.usercode;
}
#endregion
if (n < limit_Max)
{
item_plan.joinuserlist = new List() { usercodeMin }; //计划工单参与人
await _distri_workorder_plantaskrepository.UpdateOne(item_plan);
}
#endregion
_logger.LogDebug("DistriWorkOrderPlanController/AddAutoAssignHangfireAsync 自动定时计划工单 强制分配参与人,参与人:" + item_plan.joinuserlist.ToJson() + "计划工单:" + item_plan.wocode);
}
#endregion
//配送岗 待配送工单滞留时效 30分钟(超时就记一次超时违规记录,可以有违规申诉)
#region 3、违规修改
DateTime dtnow_Wait = dtnow.AddMinutes(-stuck_Time);
var list_Wait = list.Where(x => x.assigtime < dtnow_Wait && x.isoffence == 0 && x.wostate == (int)EnumDistributionState.assign); //1、从指派/抢单时间算 2、待配送 x.wostate_elevator == (int)EnumDistributionState_elevator.delivery &&
foreach (var item in list_Wait)
{
item.isoffence = 1; //违规记录 - 待配送工单滞留时效
await _distri_workorderrepository.UpdateOne(item);
_logger.LogDebug("DistriWorkOrderPlanController/AddAutoAssignHangfireAsync 自动定时计划 违规处理,工单:" + item.wocode);
}
#endregion
//_logger.LogDebug("DistriWorkOrderPlanController/AddAutoAssignHangfireAsync 自动定时计划创建成功");
return Success("自动定时计划创建成功");
}
else
{
_logger.LogError("DistriWorkOrderPlanController/AddAutoAssignHangfireAsync 自动定时计划创建失败");
return Error("自动定时计划创建失败");
}
}
///
/// 用户 和 工单数 list
///
public class UserAndNumList
{
///
/// 数量
///
public int num { get; set; }
///
/// 用户账号
///
public string usercode { get; set; }
}
#endregion
#region 设置定时计划
#endregion
#region 计划工单
///
/// 获取计划工单列表分页 by page
///
///
///
///
///
///
///
[HttpGet("getplantasklistbypage")]
public IActionResult GetPlanTaskListByPageAsync(string keyword, string projectid, string stime, string etime, int datetype = -1, int planwostate = -1, int pageindex = 1, int pagesize = 10)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
//var userstr = _signTokenService.GetUserInfoAsync(usercode).Result;
//var userinfo = userstr.ToJObject()["data"].ToString().ToObject();
string allprojectrole = _configuration["allprojectrole"];
var userinfos = _sys_user_accountRepository.GetUserInfo(usercode, allprojectrole);
var userinfo = JsonHelper.JsonToEntity(userinfos.ToJson());
//获取当天、本周、本月、本年、累计时间
if (datetype != -1)
{
GetStartEndTime(datetype, out stime, out etime);
}
//获取数据
int recordCount = 0;
var result = _distri_workorder_planrepository.GetPlanTaskListsByPage(keyword, projectid, stime, etime, planwostate, userinfo, pageindex, pagesize, out recordCount);
var obj = new
{
rows = result.ToList(),
total = recordCount
};
return Success("获取成功", obj);
}
///
/// 获取计划工单详情
///
[HttpGet("getplanworkordersingle")]
public async Task GetPlanTaskSingleAsync(string id,string projectid, int channelcode = 0)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
if (string.IsNullOrEmpty(id))
return Error("参数错误");
var model = _distri_workorder_planrepository.GetPlanTaskDetails(id);
if (model != null)
{
var userlist = (await _distri_sys_user_accountrepository.Get(x => x.delete_flag == false && x.type != 2)).ToList();
//定时计划表
var hangfireplan_List = (await _hangfireplan_distributionrepository.Get(x => x.plantype == (int)EnumDistributionPlanType.timing && x.isdelete == 0)).ToList();
//计划表
var plan_List = (await _distri_workorder_planrepository.Get(x => x.isdelete == 0 )).ToList();
//分送工单表
var wo_List = (await _distri_workorderrepository.Get(x => x.wosorts == (int)EnumDistributionWoSorts.plan && x.isdelete == 0 && x.plantaskid == model.id && (x.wostate == (int)EnumDistributionState.finish || x.wostate == (int)EnumDistributionState.evaluated))).ToList();
#region 标记消息提醒工单(消息提醒,App推送)
string goodsDetail = "";
if (channelcode > 0)
{
if (model.planwostate == (int)EnumDistriWorkOrderPlanWOstate.start)
{
//维修工单号
var listmap = await _wo_order_user_maprepository.Get(x => x.woid == model.id && x.wocode == model.wocode && x.channelcode == channelcode && x.readby == usercode);
var modelmap = listmap.FirstOrDefault();
goodsDetail = (model.goodslist != null && model.goodslist.Count > 0) ? " 配送计划工单物品:" + model.goodslist.Select(x => x.goodsname).ToJson() : "";
if (modelmap == null)
{
//添加是否已读关系表
modelmap = new Wo_Order_User_Map();
modelmap.woid = model.id;
modelmap.wocode = model.wocode;
modelmap.wostate = model.planwostate;
modelmap.readby = usercode;
modelmap.channelcode = channelcode; //工单类型(枚举EnumOrderState) 维修工单 = 1, 保养工单 = 2, 运行工单 = 3, 超时工单 = 4, 配送工单 = 5, 计划工单 = 5
modelmap.isread = 1;
modelmap.isnotice = 1;
modelmap.readtime = DateTime.Now;
modelmap.note = (string.IsNullOrEmpty(model.content) ? "" : "计划工单内容:" + model.content) + goodsDetail; //保养内容
// modelmap.note = model.maintaincontent;
bool b = await _wo_order_user_maprepository.Add(modelmap);
}
else
{
modelmap.isread = 1;
modelmap.isnotice = 1;
modelmap.note = (string.IsNullOrEmpty(model.content) ? "" : "计划工单内容:" + model.content) + goodsDetail; //保养内容
bool b = await _wo_order_user_maprepository.UpdateOne(modelmap);
}
}
}
#endregion
if (!string.IsNullOrEmpty(projectid))
userlist = userlist.Where(x => x.projectlist.Contains(projectid)).ToList();
if (model.joinuserlist != null && model.joinuserlist.Count > 0)
{
model.joinusertel = userlist.Where(y => model.joinuserlist.Contains(y.usercode)).Select(x => x.mobile).ToList();
}
if (!string.IsNullOrEmpty(model.planid) && hangfireplan_List != null && hangfireplan_List.Count > 0)
{
if (plan_List != null && plan_List.Count > 0)
{
var model_Plan = plan_List.FirstOrDefault(x => x.id == model.planid);
if (model_Plan != null)
{
model.plantimes = hangfireplan_List.FirstOrDefault(x => x.id == model_Plan.hangfireid).plantimes;
}
}
}
var newlist = wo_List.Select(x => new
{
id = x.id,
wocode = x.wocode,
receiverlist = x.receiverlist
});
var obj = new
{
model = model,
items = wo_List
};
return Success("获取计划工单成功", obj);
}
return Error("获取失败");
}
///
/// 修改计划工单(修改且开始)
///
[HttpPost("updateplantask")]
public async Task UpdatePlanTaskAsync(string taskid, List goodslist)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value;
#region 判断验证
if (string.IsNullOrEmpty(taskid))
return Error("参数错误");
if (goodslist == null || goodslist.Count <= 0)
return Error("请选择物品种类");
int goodsnum = goodslist.Sum(x => x.num);
if (goodsnum <= 0)
return Error("请填写物品数量");
var model = await _distri_workorder_plantaskrepository.GetSingle(p => p.id == taskid);
if (model == null)
return Error("操作失败");
if (model.joinuserlist == null || model.joinuserlist.Count <= 0)
return Error("操作失败,参与人为空");
if (model.planwostate >= (int)EnumDistriWorkOrderPlanWOstate.start)
return Error("操作失败,计划工单已完成或已开始");
var pro = await _pro_project_infoRepository.GetSingle(model.projectid);
if (pro != null && pro.isend == 1)
return Error("该项目已暂停");
#endregion
//计划工单状态:0创建计划工单,1开始,2已完成
model.planwostate = (int)EnumDistriWorkOrderPlanWOstate.start;
model.goodslist = goodslist;
model.statetime = DateTime.Now; //开始时间
bool b = await _distri_workorder_plantaskrepository.UpdateOne(model);
if (b)
{
return Success("操作成功");
}
return Error("操作失败");
}
///
/// 抢单 - 计划工单
///
///
///
///
[HttpPost("receiveplantask")]
public async Task UpdateReceiveTaskAsync(string id)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
#region 验证判断
if (string.IsNullOrEmpty(id))
return Error("参数错误");
var model = await _distri_workorder_plantaskrepository.GetSingle(id);
if (model == null)
return Error("操作失败");
if (model.planwostate >= (int)EnumDistriWorkOrderPlanWOstate.start)
return Error("操作失败,计划工单已开始或已完成");
if (model.joinuserlist != null && model.joinuserlist.Count > 0)
return Error("操作失败,计划工单已有参与人或已抢单");
//判断此用户下是否有计划任务,如果有不让抢单,没有让抢单
var listWorkorder = (await _distri_workorder_plantaskrepository.Get(x => x.isdelete == 0 && x.joinuserlist.Contains(usercode) && x.planwostate < (int)EnumDistriWorkOrderPlanWOstate.finish)).ToList();
if (listWorkorder != null && listWorkorder.Count > 0)
return Error("您有" + listWorkorder.Count + "计划工单没有完成,不能进行抢单操作");
#endregion
model.joinuserlist = new List() { usercode }; //参与人
//计划工单状态:0创建计划工单,1开始,2已完成
bool b = await _distri_workorder_plantaskrepository.UpdateOne(model);
if (b)
return Success("操作成功");
return Error("操作失败");
}
///
/// 添加配合人 - 计划工单
///
///
///
///
[HttpPost("addreceiveplantask")]
public async Task AddReceiveTaskAsync(string id,string user)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
#region 验证判断
if (string.IsNullOrEmpty(id))
return Error("参数错误");
var model = await _distri_workorder_plantaskrepository.GetSingle(id);
if (model == null)
return Error("操作失败");
if (model.planwostate >= (int)EnumDistriWorkOrderPlanWOstate.start)
return Error("操作失败,计划工单已开始或已完成");
if(string.IsNullOrEmpty(user))
return Error("操作失败,添加配合人不能为空");
if (model.joinuserlist.Contains(user))
return Error("操作失败," + user + "已存在,请不要重复添加");
////判断此用户下是否有计划任务,如果有不让抢单,没有让抢单
//var listWorkorder = (await _distri_workorder_plantaskrepository.Get(x => x.isdelete == 0 && x.joinuserlist.Contains(user) && x.planwostate < (int)EnumDistriWorkOrderPlanWOstate.finish)).ToList();
//if (listWorkorder != null && listWorkorder.Count > 0)
// return Error("您有计划工单没有完成,不能进行抢单操作");
#endregion
model.joinuserlist.Add(user); //参与人
//计划工单状态:0创建计划工单,1开始,2已完成
bool b = await _distri_workorder_plantaskrepository.UpdateOne(model);
if (b)
return Success("操作成功");
return Error("操作失败");
}
///
/// 删除计划工单
///
///
///
[HttpPost("deleteplantask")]
public async Task RemovePlanTaskAsync(string[] ids)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
//使用逻辑删除
var res = 0;
if (ids == null && ids.Length <= 0)
return Error("请选择要删除的记录");
foreach (var item in ids)
{
var model = await _distri_workorder_plantaskrepository.GetSingle(item);
model.isdelete = 1;
model.deleteby = usercode;
model.deletetime = DateTime.Now;
if (await _distri_workorder_plantaskrepository.UpdateOne(model))
{
#region 查询此计划是否有未执行的工单,若有一并删除
var list_Wo = await _distri_workorderrepository.Get(r => r.plantaskid.Equals(item) && r.wostate == (int)EnumEquipmentRunningState.create);
if (list_Wo.Count() > 0)
{
foreach (var item_Dis in list_Wo)
{
item_Dis.isdelete = 1;
item_Dis.deleteby = usercode;
item_Dis.dealtime = DateTime.Now;
await _distri_workorderrepository.UpdateOne(item_Dis);
}
}
#endregion
res += 1;
}
}
if (res == ids.Length)
return Success("删除成功");
else if (res > 0 && res < ids.Length)
return Error("部分删除失败,请查看后重新操作");
else
return Error("删除失败,请查看后重新操作");
}
///
/// 开始 - 计划工单
///
///
///
[HttpPost("startplantask")]
public async Task StartAsync(string id)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
if (string.IsNullOrEmpty(id))
return Error("参数错误");
var model = await _distri_workorder_plantaskrepository.GetSingle(id);
if (model == null)
return Error("操作失败");
if (model.joinuserlist!=null && model.joinuserlist.Count>0)
return Error("操作失败,参与人为空");
if (model.planwostate >= (int)EnumDistriWorkOrderPlanWOstate.start)
return Error("操作失败,计划工单已完成或已开始");
//计划工单状态:0创建计划工单,1开始,2已完成
model.planwostate = (int)EnumDistriWorkOrderPlanWOstate.start;
model.statetime = DateTime.Now; //开始时间
bool b = await _distri_workorder_plantaskrepository.UpdateOne(model);
if (b)
{
return Success("操作成功");
}
return Error("操作失败");
}
///
/// 完成 - 计划工单
///
///
///
///
[HttpPost("finishplantask")]
public async Task UpdateFinishTaskAsync(string id)
{
string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value;
#region 验证判断
if (string.IsNullOrEmpty(id))
return Error("参数错误");
var model = await _distri_workorder_plantaskrepository.GetSingle(id);
if (model == null)
return Error("操作失败");
if (model.planwostate == (int)EnumDistriWorkOrderPlanWOstate.finish)
return Error("操作失败,计划工单已完成");
////判断此用户下是否有计划任务,如果有不让抢单,没有让抢单
//var listWorkorder = (await _distri_workorder_plantaskrepository.Get(x => x.isdelete == 0 && x.planwostate < (int)EnumDistriWorkOrderPlanWOstate.finish)).ToList();
//if (listWorkorder != null && listWorkorder.Count > 0)
// return Error("您有计划工单没有完成,不能操作完成");
#endregion
foreach (var item in model.goodslist)
{
if (item.usednum < item.num)
return Error("操作错误,已配送物品" + item.goodsname + "数量:" + item.usednum + "小于计划工单物品" + item.goodsname + "数量:" + item.num + ",没有分送完物品,不能操作完成");
}
model.dealby = usercode; //处理人
model.dealtime = DateTime.Now; //处理时间
//计划工单状态:0创建计划工单,1开始,2已完成
model.planwostate = (int)EnumDistriWorkOrderPlanWOstate.finish;
bool b = await _distri_workorder_plantaskrepository.UpdateOne(model);
if (b)
{
return Success("操作成功");
}
return Error("操作失败");
}
#endregion
///
/// 获取当天、本周、本月、本年、累计时间
///
///
///
///
public void GetStartEndTime(int datetype, out string start, out string end)
{
start = string.Empty;
end = string.Empty;
var datenow = DateTime.Now;
var datestart = datenow;
var dateend = datenow;
switch (datetype)
{
case 0://当天
break;
case 1://本周
int n = (int)datenow.DayOfWeek == 0 ? 7 : (int)datenow.DayOfWeek;
datestart = datenow.AddDays(1 - n);//本周周一
dateend = datestart.AddDays(6);//本周周日
break;
case 2://本月
datestart = datenow.AddDays(1 - datenow.Day); //本月月初
dateend = datestart.AddMonths(1).AddDays(-1); //本月月末
break;
case 3://本年
datestart = new DateTime(datenow.Year, 1, 1); //本年年初
dateend = new DateTime(datenow.Year, 12, 31); //本年年末
break;
case 4://全部
break;
default:
break;
}
if (datetype != 4)
{
start = datestart.ToString("yyyy-MM-dd");
end = dateend.ToString("yyyy-MM-dd");
}
}
#region 微信方法
///
/// 发送微信模板消息
///
/// 工单编号
/// 标题
/// 内容
/// 链接地址
/// 接收方
/// 模板id
private async void SendWechatMsg(string wocode, string title, string statename, string content, string menucode, string url, string openid, string templateid = "csH1KSQMz8nMnZhlcH7gpOo1aAIZZLiXecYlhGFzvuE")
{
if (string.IsNullOrEmpty(menucode))
menucode = "PSDD";
url = "menucode=" + menucode + "&id=" + url;
var obj = new
{
first = new { value = title, color = "#173177" },
keyword1 = new { value = statename },
keyword2 = new { value = wocode },
remark = new { value = content }
};
await _wechatservice.SendTemplateMsg(openid, url, obj.ToJson(), templateid);
}
/////
///// 发送微信消息
/////
///// 工单编号
///// 标题
///// 内容
///// 链接地址
///// 接收方
//private async void SendWechatMessage(string wocode, string title, string content, string url, string openid)
//{
// url = "menucode=CKXQ&id=" + url;
// content = content + "\n时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// await _wechatservice.SendNewsMsg(openid, title, content, url);
//}
#endregion
}
}