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 Api.SignToken; using Microsoft.Extensions.Logging; using DistributionApi.IRepositories; using System.Security.Claims; using DistributionApi.Models.Input; using MadRunFabric.Model; using MadRunFabric.Model.MessageApi; using Microsoft.Extensions.Configuration; namespace DistributionApi.Controllers { /// /// 配送工单 /// [Authorize] [ApiVersion("6.0")] [Route("api/[controller]")] [Produces("application/json")] public class DistriWorkOrderController : BaseController { private readonly ILogger _logger; private readonly IConfiguration _configuration; private readonly ISys_User_AccountRepository _sys_user_accountRepository; private readonly ISignTokenService _signTokenService; private readonly IDistri_WorkorderRepository _distri_workorderrepository; private readonly IDistri_Workorder_ItemsRepository _distri_workorder_itemsrepository; private readonly IDistri_Workorder_EvaluateRepository _distri_workorder_evaluaterepository; private readonly IDistri_Workorder_ExceptionRepository _distri_workorder_exceptionrepository; private readonly IDistri_Workorder_PlanTaskRepository _distri_workorder_plantaskrepository; private readonly ISys_User_AccountRepository _distri_sys_user_accountrepository; private readonly IDistri_Workorder_UpdateRecordRepository _distri_workorder_updaterrecordrepository; private readonly IWo_Order_User_MapRepository _wo_order_user_maprepository; private readonly IWechatService _wechatservice; private readonly IDistri_Workorder_OffenceRecordRepository _distri_workorder_offencerecordrepository; public DistriWorkOrderController( ILogger logger, IConfiguration configuration, ISys_User_AccountRepository sys_user_accountRepository, ISignTokenService signTokenService, IDistri_WorkorderRepository distri_workorderrepository, IDistri_Workorder_ItemsRepository distri_workorder_itemsrepository, IDistri_Workorder_EvaluateRepository distri_workorder_evaluaterepository, IDistri_Workorder_ExceptionRepository distri_workorder_exceptionrepository, IDistri_Workorder_PlanTaskRepository distri_workorder_plantaskrepository, ISys_User_AccountRepository distri_sys_user_accountrepository, IDistri_Workorder_UpdateRecordRepository distri_workorder_updaterrecordrepository, IWo_Order_User_MapRepository wo_order_user_maprepository, IWechatService wechatservice, IDistri_Workorder_OffenceRecordRepository distri_workorder_offencerecordrepository ) { _logger = logger; _configuration = configuration; _sys_user_accountRepository = sys_user_accountRepository; _signTokenService = signTokenService; _distri_workorderrepository = distri_workorderrepository; _distri_workorder_itemsrepository = distri_workorder_itemsrepository; _distri_workorder_evaluaterepository = distri_workorder_evaluaterepository; _distri_workorder_exceptionrepository = distri_workorder_exceptionrepository; _distri_workorder_plantaskrepository = distri_workorder_plantaskrepository; _distri_sys_user_accountrepository = distri_sys_user_accountrepository; _distri_workorder_updaterrecordrepository = distri_workorder_updaterrecordrepository; _wo_order_user_maprepository = wo_order_user_maprepository; _wechatservice = wechatservice; _distri_workorder_offencerecordrepository = distri_workorder_offencerecordrepository; } /// /// 获取配送工单列表分页 - 随机工单 和 分送工单 by page /// /// /// 工单分类(-1所有1随机工单,2计划工单) /// 配送工单状态:-1所有 0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 44已完成 /// /// /// /// /// [HttpGet("getlistbypage")] public IActionResult GetListByPageAsync(string keyword, string projectid, string stime, string etime, int datetype = -1, int wosorts = -1, int wostate = -1, int wxstate = -1, int pageindex = 1, int pagesize = 10) { string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; 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_workorderrepository.GetListsByPage(keyword, projectid, wosorts,wostate, wxstate, stime, etime, rolecode, usercode, userinfo, pageindex, pagesize, out recordCount); var obj = new { rows = result.ToList(), total = recordCount }; return Success("获取成功", obj); } /// /// 获取配送工单详情 /// [HttpGet("getsingle")] public async Task GetSingleAsync(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 dModel = await _distri_workorderrepository.GetSingle(id.Trim()); var model = _distri_workorderrepository.GetDetails(id); if (dModel != null) { var list_Evalua = await _distri_workorder_evaluaterepository.Get(s => s.woid.Equals(dModel.id) & s.isdelete == 0); var list_Item = await _distri_workorder_itemsrepository.Get(s => s.woid.Equals(dModel.id) & s.isdelete == 0); var list_Exception = await _distri_workorder_exceptionrepository.Get(s => s.woid.Equals(dModel.id) & s.isdelete == 0 && s.type == 1); var list_Offence = await _distri_workorder_offencerecordrepository.Get(s => s.woid.Equals(dModel.id) & s.isdelete == 0); #region 标记消息提醒工单(消息提醒,App推送) string goodsDetail = ""; if (channelcode > 0 && (dModel.totype == (int)EnumDistributionTotype.send || dModel.totype == (int)EnumDistributionTotype.assign)) { if (dModel.wostate == 0 || dModel.wostate == 1) { //维修工单号 var listmap = await _wo_order_user_maprepository.Get(x => x.woid == dModel.id && x.wocode == dModel.wocode && x.channelcode == channelcode && x.readby == usercode); var modelmap = listmap.FirstOrDefault(); goodsDetail = (dModel.goodslist != null && dModel.goodslist.Count > 0) ? " 配送物品:" + dModel.goodslist.Select(x => x.goodsname).ToJson() : ""; if (modelmap == null) { //添加是否已读关系表 modelmap = new Wo_Order_User_Map(); modelmap.woid = dModel.id; modelmap.wocode = dModel.wocode; modelmap.wostate = dModel.wostate; modelmap.readby = usercode; modelmap.channelcode = channelcode; //工单类型(枚举EnumOrderState) 维修工单 = 1, 保养工单 = 2, 运行工单 = 3, 超时工单 = 4, 配送工单 = 5 modelmap.isread = 1; modelmap.isnotice = 1; modelmap.readtime = DateTime.Now; modelmap.note = (string.IsNullOrEmpty(dModel.detail) ? "" : "配送内容:" + dModel.detail) + 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(dModel.detail) ? "" : "配送内容:" + dModel.detail) + goodsDetail; //保养内容 bool b = await _wo_order_user_maprepository.UpdateOne(modelmap); } } } #endregion List tousertel = new List(); var userlist = (await _distri_sys_user_accountrepository.Get(x => x.delete_flag == false && x.type != 2)).ToList(); if (!string.IsNullOrEmpty(projectid)) userlist = userlist.Where(x => x.projectlist.Contains(projectid)).ToList(); if (dModel.touser != null && dModel.touser.Count > 0) { tousertel = userlist.Where(y => dModel.touser.Contains(y.usercode)).Select(x => x.mobile).ToList(); } var obj = new { model = model, tousertel = tousertel, items = list_Item, evaluate = list_Evalua, exception = list_Exception, offence = list_Offence }; return Success("获取工单成功", obj); } return Error("获取失败"); } /// /// 判断是否评价 (随机工单) - 在“添加工单”接口之前 /// [HttpPost("isevaluation")] public async Task IsEvaluationAsync() { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).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()); //微信随机工单需要评价,pc,app随机工单不用评价 if (userinfo.isallproject == 1) { //微信类型 if (userinfo.type == 2) { //4已完结/待评价 - 发货科室不进行评价不让下单 var list = (await _distri_workorderrepository.Get(x => x.channel == 4 && x.wosorts == (int)EnumDistributionWoSorts.random && x.wostate == (int)EnumDistributionState.finish && x.createtby == usercode && x.isdelete == 0)).ToList(); if (list != null && list.Count > 0) return Error("有" + list.Count + "条随机工单需进行评价后才能下单,工单:" + list.Select(x => x.wocode).ToString()); } } return Success("没有要评价的工单"); } /// /// 添加工单(随机工单,分送工单) /// 1、随机工单根据收货科室拆分工单 2019-04-24 lihai /// [HttpPost("add")] public async Task AddAsync(DistriWorkOrderInput input) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).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()); #region 判断验证 if (string.IsNullOrEmpty(input.projectid)) return Error("请选择项目"); if (!string.IsNullOrEmpty(input.plantaskid)) { 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("请选择发货地址"); } else { if (input.goodslist_chaidan == null || input.goodslist_chaidan.Count <= 0) return Error("请选择物品和发货地址"); int goodsnum = input.goodslist_chaidan.Sum(x => x.num); if (goodsnum <= 0) return Error("请填写物品数量"); } #endregion #region model 添加配送工单对象 #region 计划工单内容model 判断是否是计划任务工单 var model_PlanOrder = new Distri_Workorder_PlanTask(); string res = string.Empty; int addnum = 0; //拆弹个数 int addnum_total = 0; //应拆弹个数 if (!string.IsNullOrEmpty(input.plantaskid)) { var model = new Distri_Workorder(); model.projectid = input.projectid; model.channel = input.channel; model.deliverylist = (input.deliverylist != null && input.deliverylist.Count > 0) ? input.deliverylist.Distinct().ToList() : new List(); model.detail = input.detail; model.createtby = usercode; model.createname = username; model.emergencyid = 1; model.deliveryname = input.deliveryname; model.deliverytel = input.deliverytel; //获取工单列表 by plantaskid var list_wo = (await _distri_workorderrepository.Get(x => x.isdelete == 0 && x.plantaskid == input.plantaskid)).ToList(); model_PlanOrder = await _distri_workorder_plantaskrepository.GetSingle(input.plantaskid); if (model_PlanOrder == null) return Error("参数错误"); model.wosorts = (int)EnumDistributionWoSorts.plan; //工单分类(1随机工单,2计划工单) model.plantaskid = input.plantaskid; model.planid = model_PlanOrder.planid; model.touser = model_PlanOrder.joinuserlist.Distinct().ToList(); //参与人 附加给 所属人 model.wostate = (int)EnumDistributionState.delivery; if (model_PlanOrder.joinuserlist != null && model_PlanOrder.joinuserlist.Count > 0) { model.totype = (int)EnumDistributionTotype.send; model.assigtime = DateTime.Now; //model.wostate = (int)EnumDistributionState.delivery; } //计算计划工单 物品使用数量,并保存 var list_taskgoods = model_PlanOrder.goodslist; if (list_taskgoods != null && list_taskgoods.Count > 0) { #region 计算计划工单 物品使用数量 List list_task = new List(); foreach (var item_task in list_taskgoods) { //已使用数量初始化 int total = 0; int wo_num_total = 0; var mode_goods = input.goodslist.FirstOrDefault(x => x.goodsid == item_task.goodsid); if (mode_goods != null) wo_num_total = mode_goods.num; //提交数量 //total = 计划使用数量 + 当前提交数量 total = item_task.usednum + wo_num_total; if (total > item_task.num) return Error("操作错误("+ wo_num_total + "),分送工单添加物品" + mode_goods.goodsname + "数量:" + mode_goods.num + "不能大于计划工单剩余物品" + item_task.goodsname + "剩余数量:" + (item_task.num - item_task.usednum) + ""); //修改计划工单物品数量 //var model_task = new DistributionGoodsListByTask(); //model_task.goodsid = item_task.goodsid; //model_task.goodsname = item_task.goodsname; //model_task.typeid = item_task.typeid; //model_task.isremind = item_task.isremind; //model_task.remark = item_task.remark; //model_task.num = item_task.num; item_task.usednum = total; //使用数量 - 主要是设置剩余数值 ------- 使用数量 + 当前提交数量 list_task.Add(item_task); } model_PlanOrder.goodslist = list_task; ////保存物品数量到计划工单使用数量中 //await _distri_workorder_plantaskrepository.UpdateOne(model_PlanOrder); #endregion } model.receiverlist = (input.receiverlist != null && input.receiverlist.Count > 0) ? input.receiverlist.Distinct().ToList() : new List(); //工单编号 model.wocode = UniqueData.Gener("", 2); //紧急程度 if (input.goodslist != null && input.goodslist.Count > 0) { var list_goods = input.goodslist.Where(x => x.typeid == 2); if (list_goods != null && list_goods.Count() > 0) model.emergencyid = 2; } //物品列表 model.goodslist = (input.goodslist != null && input.goodslist.Count > 0) ? input.goodslist : new List();model.receiverlist = (input.receiverlist != null && input.receiverlist.Count > 0) ? input.receiverlist.Distinct().ToList() : new List(); //input.receiverlist res = await _distri_workorderrepository.AddRetID(model); addnum += 1; // 添加工单流程 int channel = input.channel; int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 string str_type = string.IsNullOrEmpty(input.plantaskid) ? "添加随机工单" : "添加分送工单"; AddItems(res, model.wocode, model.wostate, model.wostate_elevator, channel, islast, "", "", "" + username + str_type, usercode); //主管添加工单,且指派 if (model.wostate == (int)EnumDistributionState.assign) { int islasts = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islasts, input.touser, "", username + "转派工单,工单编号:" + model.wocode, usercode); } } else { //微信随机工单需要评价,pc,app随机工单不用评价 if (userinfo.isallproject == 1) { //微信类型 if (userinfo.type == 2) { //4已完结/待评价 - 发货科室不进行评价不让下单 - 只限制 科室微信端 - 主管可以提交工单不评价app端 var list = (await _distri_workorderrepository.Get(x => x.channel == 4 && x.wosorts == (int)EnumDistributionWoSorts.random && x.wostate == (int)EnumDistributionState.finish && x.createtby == usercode && x.isdelete == 0)).ToList(); if (list != null && list.Count > 0) return Error("有" + list.Count + "条随机工单需进行评价后才能下单,工单:" + list.Select(x => x.wocode).ToString()); } } #region 拆分工单 var goodslist_chaidan_input = input.goodslist_chaidan; var goodsList_chaidan = new List(); // 去重后的楼层科室 var floorid_list = goodslist_chaidan_input.Select(x => x.floorid).Distinct().ToList(); //应拆弹个数 addnum_total = floorid_list.Count; foreach (var item in floorid_list) { var model = new Distri_Workorder(); model.projectid = input.projectid; model.channel = input.channel; model.deliverylist = (input.deliverylist != null && input.deliverylist.Count > 0) ? input.deliverylist.Distinct().ToList() : new List(); model.detail = input.detail; model.createtby = usercode; model.createname = username; model.emergencyid = 1; model.deliveryname = input.deliveryname; model.deliverytel = input.deliverytel; model.wosorts = (int)EnumDistributionWoSorts.random; //工单分类(1随机工单,2计划工单) if (!string.IsNullOrEmpty(input.touser)) { //主管添加工单,且指派 model.touser = new List() { input.touser }; // 转派人/抢单人 model.totype = (int)EnumDistributionTotype.send; model.assigtime = DateTime.Now; model.wostate = (int)EnumDistributionState.assign; } // 物品列表 by floorid var goodslist_byfloorid = goodslist_chaidan_input.Where(x => x.floorid == item).ToList(); // 物品详情 var model_goods = goodslist_byfloorid.FirstOrDefault(); // 收货地址 var receiverlist = new List(); var model_receiver = new DistributionDddressModel(); if (model_goods != null) { model_receiver.buildingid = model_goods.buildingid; model_receiver.building_name = model_goods.building_name; model_receiver.floorid = model_goods.floorid; model_receiver.floor_name = model_goods.floor_name; model_receiver.department_name = model_goods.department_name; receiverlist.Add(model_receiver); } model.receiverlist = receiverlist; //(input.receiverlist != null && input.receiverlist.Count > 0) ? input.receiverlist.Distinct().ToList() : new List(); //工单编号 model.wocode = UniqueData.Gener("", 2); //紧急程度 if (goodslist_byfloorid != null && goodslist_byfloorid.Count > 0) { var list_goods = goodslist_byfloorid.Where(x => x.typeid == 2); if (list_goods != null && list_goods.Count() > 0) model.emergencyid = 2; } //物品列表 var goodslist_item = new List(); foreach (var item_goodslist in goodslist_byfloorid) { var model_goodslist_item = new DistributionGoodsList(); model_goodslist_item.goodsid = item_goodslist.goodsid; model_goodslist_item.goodsname = item_goodslist.goodsname; model_goodslist_item.typeid = item_goodslist.typeid; model_goodslist_item.isremind = item_goodslist.isremind; model_goodslist_item.remark = item_goodslist.remark; model_goodslist_item.num = item_goodslist.num; goodslist_item.Add(model_goodslist_item); } model.goodslist = goodslist_item; //(input.goodslist != null && input.goodslist.Count > 0) ? input.goodslist : new List();model.receiverlist = (input.receiverlist != null && input.receiverlist.Count > 0) ? input.receiverlist.Distinct().ToList() : new List(); //input.receiverlist res = await _distri_workorderrepository.AddRetID(model); addnum += 1; // 添加工单流程 int channel = input.channel; int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 string str_type = string.IsNullOrEmpty(input.plantaskid) ? "添加随机工单" : "添加分送工单"; AddItems(res, model.wocode, model.wostate, model.wostate_elevator, channel, islast, "", "", "" + username + str_type, usercode); //主管添加工单,且指派 if (model.wostate == (int)EnumDistributionState.assign) { int islasts = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islasts, input.touser, "", username + "转派工单,工单编号:" + model.wocode, usercode); } } #endregion } //model.emergencyid = input.wosorts == (int)EnumDistributionWoSorts.plan ? 2 : input.emergencyid; //如果计划是紧急分送工单,其他自己选择 #endregion #endregion if (!string.IsNullOrEmpty(res)) { _logger.LogDebug("neirong: distributionapi/api/DistriWorkOrder/add 添加工单(随机工单,分送工单)"); if (!string.IsNullOrEmpty(input.plantaskid)) { //保存物品数量到计划工单使用数量中 await _distri_workorder_plantaskrepository.UpdateOne(model_PlanOrder); } string addnum_string = string.Empty; if (addnum > 1) { if (addnum == addnum_total) addnum_string = "(因为配送地址的不同,已拆分" + addnum + "个工单)"; else addnum_string = "(因为配送地址的不同,已拆分" + addnum + "个工单,拆分失败" + (addnum_total - addnum) + "个工单)"; } return Success("保存成功"+ addnum_string); } else return Error("保存失败"); } /// /// 修改工单 /// [HttpPost("update")] public async Task UpdateAsync(DistriWorkOrderInput input) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; var model = await _distri_workorderrepository.GetSingle(p => p.id == input.id); if (model != null) { #region 判断验证 if (string.IsNullOrEmpty(input.projectid)) 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_Record = new Distri_Workorder_UpdateRecord(); if (model.wostate >= (int)EnumDistributionState.delivery || model.wostate_elevator >= (int)EnumDistributionState_elevator.delivery) { model_Record = await _distri_workorder_updaterrecordrepository.GetSingle(x => x.woid == model.id && x.isagree == 2 && x.isupdate == 0 && x.isupdatetype == 1 && x.isdelete == 0); if (model_Record == null) { //没有申请修改/取消 if (model.wostate >= (int)EnumDistributionState.delivery) return Error("配送岗已取货之后不能修改"); if (model.wostate >= (int)EnumDistributionState_elevator.delivery) return Error("电梯岗已取货之后不能修改"); } } #region model 添加配送工单对象 //model.wosorts = input.wosorts; //工单分类(1随机工单,2计划工单) //model.planid = input.planid; //model.plantaskid = input.plantaskid; //model.emergencyid = input.emergencyid; model.emergencyid = 1; if (input.goodslist != null && input.goodslist.Count > 0) { var list_goods = input.goodslist.Where(x => x.typeid == 2); if (list_goods != null && list_goods.Count() > 0) model.emergencyid = 2; } model.projectid = input.projectid; model.goodslist = (input.goodslist != null && input.goodslist.Count > 0) ? input.goodslist : new List(); model.deliverylist = (input.deliverylist != null && input.deliverylist.Count > 0) ? input.deliverylist : new List(); model.receiverlist = (input.receiverlist != null && input.receiverlist.Count > 0) ? input.receiverlist : new List(); model.detail = input.detail; model.deliveryname = input.deliveryname; model.deliverytel = input.deliverytel; #endregion bool b = await _distri_workorderrepository.UpdateOne(model); if (b) { _logger.LogDebug("neirong: distributionapi/api/DistriWorkOrder/update 修改工单"); //更新申请修改/取消表 if (model_Record != null) { model_Record.isupdate = 1; await _distri_workorder_updaterrecordrepository.Update(model_Record); _logger.LogDebug("neirong: distributionapi/api/DistriWorkOrder/update 申请修改工单"); } int channel = model.channel; int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, "", "", "" + username + "修改随机工单:", usercode); return Success("保存成功"); } return Error("保存失败"); } return Error("参数错误"); } #region 所有我的工单 - 随机工单 和 计划工单 - App /// /// 获取工单和计划工单列表分页 by page - 随机工单 和 计划工单 - App /// /// /// /// -1所有,1未完成,2已完成 /// -1所有 0新任务,1待取货,2配送中 /// /// /// [HttpGet("getplanandtasklistbypage")] public async Task GetPlanAndOrderListByPageAsync(string keyword, string projectid, string stime, string etime, int datetype = -1, int isfinish = 1, int wosorts = -1, int wostate = -1, int pageindex = 1, int pagesize = 10) { string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; 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_workorderrepository.GetPlanAndTaskListByPage(keyword, projectid, isfinish, wosorts, wostate, stime, etime, rolecode, usercode, userinfo, pageindex, pagesize, out recordCount); var list = result.ToList(); var userlist = (await _distri_sys_user_accountrepository.Get(x => x.delete_flag == false && x.type != 2)).ToList(); if (!string.IsNullOrEmpty(projectid)) userlist = userlist.Where(x => x.projectlist.Contains(projectid)).ToList(); foreach (var item in list) { if (item.touser!=null && item.touser.Count>0) { item.tousertel = userlist.Where(y=> item.touser.Contains(y.usercode)).Select(x=>x.mobile).ToList(); } } var obj = new { rows = list.ToList(), total = recordCount }; return Success("获取成功", obj); } /// /// 违规工单列表分页 - 随机工单 by page /// /// /// /// /// /// /// [HttpGet("getoffencewolistbypage")] public IActionResult GetOffenceWOListByPageAsync(string keyword, string projectid, string stime, string etime, int datetype = -1,int isappeal = -1, int pageindex = 1, int pagesize = 10) { string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; 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_workorderrepository.GetOffenceWOListByPageAsync(keyword, projectid, stime, etime, rolecode, usercode, userinfo, isappeal, pageindex, pagesize, out recordCount); var obj = new { rows = result.ToList(), total = recordCount }; return Success("获取成功", obj); } /// /// 获取当天、本周、本月、本年、累计时间 /// /// /// /// 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"); } } #endregion #region 电梯岗 / 配送岗操作 //工单状态(0新任务,1已接单(待取货),2已取货(待配送)) /// /// 接单 - 电梯岗 - 不用 /// /// /// [HttpPost("receivebyelevator")] public async Task UpdateReceiveByElevatorAsync(string id, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); #region 未处理工单超限 int limitmaxcount = _distri_workorderrepository.GetLimitMaxCount(usercode); if (limitmaxcount > 0) return Error("你已经有" + limitmaxcount + "个未处理工单,已超上限"); #endregion if (model.wostate_elevator == (int)EnumDistributionState_elevator.accept) return Error("您已接单"); if (model.wostate_elevator == (int)EnumDistributionState_elevator.delivery) return Error("您已取货"); model.touser_elevator = usercode; //电梯岗 - 接单人 model.wostate_elevator = (int)EnumDistributionState_elevator.accept; //电梯岗 - 工单状态(0无操作,1已接单(待取货),2已取货(待配送)) model.assigtime_elevator = DateTime.Now; bool b = await _distri_workorderrepository.UpdateOne(model); if (b) { //if (model.channel == 4 && model.wostate_elevator == (int)EnumDistributionState_elevator.create) //{ // var model_Dilivery = model.deliverylist.FirstOrDefault(); // string content = "取货地址:" + model_Dilivery != null ? model_Dilivery.building_name : "" + model_Dilivery != null ? model_Dilivery.floor_name : "" + " 科室:" + model_Dilivery != null ? model_Dilivery.department_name : "" // + "\n联系人:" + model_Dilivery != null ? model_Dilivery.fullname : "" // + "\n联系电话:" + model_Dilivery != null ? model_Dilivery.mobile : "" // + "\n接单人:" + usercode + "-" + username // + "\n接单时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // SendWechatMsg(model.wocode, "电梯岗接单成功!", "电梯岗已接单成功,等待配送岗取货", content, model.id, model.createtby); //} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator,channel, islast, usercode, "", "电梯岗" + username + "接单", usercode); return Success("接单成功"); } return Error("接单失败"); } /// /// 取货 - 电梯岗 - 不用 /// /// /// [HttpPost("deliverybyelevator")] public async Task UpdateDeliveryByElevatorAsync(string id, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); if(model.wostate_elevator == (int)EnumDistributionState_elevator.create) return Error("请接单后再取货"); if (model.wostate_elevator == (int)EnumDistributionState_elevator.delivery) return Error("您已取货"); //model.touser_elevator = usercode; //电梯岗 - 接单人 model.wostate_elevator = (int)EnumDistributionState_elevator.delivery; //电梯岗 - 工单状态(0无操作,1已接单(待取货),2已取货(待配送)) bool b = await _distri_workorderrepository.UpdateOne(model); if (b) { int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "电梯岗" + username + "取货", usercode); return Success("取货成功"); } return Error("取货失败"); } /// /// 退单退回 - 电梯岗/配送岗 /// 1、 当天配送工单已派单,添加退回按钮; /// /// /// [HttpPost("updatebackorder")] public async Task UpdateBackOrderAsync(string id) { DateTime dt = DateTime.Now; string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; #region 验证判断 if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); // 判断添加工单时间是当天的,方可退单 if (DateTime.Parse(model.createtime.ToString()).Date == DateTime.Parse(dt.ToString()).Date) return Error("操作失败,非当天工单不能退单"); #endregion /// 配送岗 if (rolecode == "SSY_PSG") { model.touser = new List(); //配送岗 - 转派人/抢单人 - 置空 model.totype = (int)EnumDistributionTotype.create; model.assigtime = new DateTime(); //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.create; } // 电梯岗 if (rolecode == "SSY_DTG") { if (model.touser.Contains(usercode)) { model.touser = new List(); //配送岗 - 转派人/抢单人 - 置空 model.totype = (int)EnumDistributionTotype.create; // 置空 model.assigtime = new DateTime(); // 置空 //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 // 置空 model.wostate = (int)EnumDistributionState.create; } else { model.touser_elevator = ""; //电梯岗 - 接单人 // 置空 model.wostate_elevator = (int)EnumDistributionState_elevator.create; //电梯岗 - 工单状态(0无操作,1已接单(待取货),2已取货(待配送)) // 置空 model.assigtime_elevator = new DateTime(); } } bool bo = await _distri_workorderrepository.UpdateOne(model); if (bo) { int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, model.channel, islast, model.touser.ToJson(), "", "配送岗" + username + "退单:", usercode); return Success("退单成功"); } return Error("退单失败"); } /// /// 同意 - 电梯岗 / 配送岗 /// /// 申请类型(1需要修改,2需要取消) /// /// [HttpPost("agree")] public async Task UpdateAgreeAsync(string id, int isupdatetype = 1, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; #region 验证判断 if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); var model_Record = new Distri_Workorder_UpdateRecord(); model_Record = await _distri_workorder_updaterrecordrepository.GetSingle(x => x.woid == model.id && x.isagree == 0 && x.isupdate == 0 && x.isdelete == 0); if (model_Record == null) return Error("操作失败"); int istype = model_Record.isupdatetype; #endregion model_Record.isagree = 2; bool b = await _distri_workorder_updaterrecordrepository.Update(model_Record); if (b) { ////if (model.channel == 4){} //string str = ""; //if (model_Record.isupdatetype == 2) //{ // var model_wo = await _distri_workorderrepository.GetSingle(id); // if (model_wo == null) // return Error("操作失败"); // model_wo.wostate = (int)EnumDistributionState.canceled; //取消 // bool b_wo = await _distri_workorderrepository.UpdateOne(model_wo); // if (b_wo) // str = ",且工单已取消"; //} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "同意修改/取消工单的申请", usercode); return Success("同意操作成功"); } return Error("同意操作失败"); } /// /// 不同意 - 电梯岗 / 配送岗 /// /// /// [HttpPost("disagree")] public async Task UpdateDisagreeAsync(string id, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; #region 验证判断 if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); var model_Record = new Distri_Workorder_UpdateRecord(); model_Record = await _distri_workorder_updaterrecordrepository.GetSingle(x => x.woid == model.id && x.isagree == 0 && x.isupdate == 0 && x.isdelete == 0); if (model_Record == null) return Error("操作失败"); #endregion model_Record.isagree = 1; bool b = await _distri_workorder_updaterrecordrepository.Update(model_Record); if (b) { //if (model.channel == 4){} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "不同意修改/取消工单的申请", usercode); return Success("不同意操作成功"); } return Error("不同意操作失败"); } /// /// 抢单 - 配送岗/电梯岗 /// /// /// /// [HttpPost("receive")] public async Task UpdateReceiveAsync(string id,int channel = 1) { string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).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()); #region 验证判断 if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); #endregion // 获取当前角色 - by 排班 string rolecode_ByUserMap = _distri_workorderrepository.GetUserCodeByClassMap(usercode); string rolename = string.Empty; // 电梯岗 if (rolecode_ByUserMap == "SSY_DTG") { rolename = "电梯岗"; #region 未处理工单超限 int limitmaxcount = _distri_workorderrepository.GetLimitMaxCount(usercode); if (limitmaxcount > 0) return Error("你已经有" + limitmaxcount + "个未处理工单,已超上限"); #endregion if (model.wostate_elevator == (int)EnumDistributionState_elevator.accept) return Error("您已接单"); if (model.wostate_elevator == (int)EnumDistributionState_elevator.delivery) return Error("您已取货"); model.touser_elevator = usercode; //电梯岗 - 接单人 model.wostate_elevator = (int)EnumDistributionState_elevator.accept; //电梯岗 - 工单状态(0无操作,1已接单(待取货),2已取货(待配送)) model.assigtime_elevator = DateTime.Now; } else if (rolecode_ByUserMap == "SSY_PSG") { rolename = "配送员"; if (model.wostate == (int)EnumDistributionState.assign) return Error("工单已转派或抢单,无需再抢单"); if (model.wostate >= (int)EnumDistributionState.delivery) return Error("工单已被取货,无需再抢单"); //判断此用户下是否有计划任务,如果有不让抢单,没有让抢单 var listPlanTask = (await _distri_workorder_plantaskrepository.Get(x => x.isdelete == 0 && x.joinuserlist.Contains(usercode) && userinfo.projectlist.Contains(x.projectid) && x.planwostate < (int)EnumDistriWorkOrderPlanWOstate.finish)).ToList(); if (listPlanTask != null && listPlanTask.Count > 0) return Error("您有计划任务没有完成,不能抢单"); if (model.wostate == (int)EnumDistributionState.create) { model.touser = new List() { usercode }; //配送岗 - 转派人/抢单人 model.totype = (int)EnumDistributionTotype.robbery; model.assigtime = DateTime.Now; //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.assign; } } else { return Error("接单失败"); } bool b = await _distri_workorderrepository.UpdateOne(model); if (b) { if (model.channel == 4) { var model_Receiver = model.receiverlist.FirstOrDefault(); string content = "抢单人:" + usercode + "-" + username + "\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(model.wocode, rolename + "抢单成功!", rolename + "已抢单成功,等待配送员取货", content, model.id, model.createtby); } int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", rolename + username + "接单:", usercode); return Success("接单成功"); } return Error("接单失败"); } /// /// 指派 - 配送岗 - 指派 /// /// /// /// /// /// [HttpPost("assign")] public async Task UpdateAssignAsync(string id, string touser,int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).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()); #region 验证判断 if (string.IsNullOrEmpty(id)) return Error("参数错误"); if (string.IsNullOrEmpty(touser)) return Error("转派的对象不能为空"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("保存失败"); #region 未处理工单超限 int limitmaxcount = _distri_workorderrepository.GetLimitMaxCount(usercode); if (limitmaxcount > 0) return Error("你已经有" + limitmaxcount + "个未处理工单,已超上限"); #endregion if (model.wostate == (int)EnumDistributionState.assign) return Error("工单已转派或已抢单,无需再转派抢单"); if (model.wostate >= (int)EnumDistributionState.delivery) return Error("工单已取货,无需再转派"); //判断此用户下是否有计划任务,如果有不让抢单,没有让抢单 var listPlanTask = (await _distri_workorder_plantaskrepository.Get(x => x.isdelete == 0 && x.joinuserlist.Contains(usercode) && userinfo.projectlist.Contains(x.projectid) && x.planwostate < (int)EnumDistriWorkOrderPlanWOstate.finish)).ToList(); if (listPlanTask != null && listPlanTask.Count > 0) return Error("您有计划任务没有完成,不能派单"); #endregion if (model.wostate == (int)EnumDistributionState.create) // || model.wostate == (int)EnumDistributionState.hangup || model.wostate == (int)EnumDistributionState.assign { model.touser = new List() { touser }; // 转派人/抢单人 model.totype = (int)EnumDistributionTotype.send; model.assigtime = DateTime.Now; //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.assign; var res = await _distri_workorderrepository.UpdateOne(model); int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, touser, "", username + "转派工单,工单编号:" + model.wocode, usercode); return Success("转派工单成功"); } return Error("转派工单失败"); } /// /// 批量转派 - 主管 /// /// /// /// /// /// [HttpPost("assignmany")] public async Task UpdateAssignManyAsync(string[] ids, string touser, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).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 (string.IsNullOrEmpty(touser)) return Error("转派的对象不能为空"); #region 未处理工单超限 int limitmaxcount = _distri_workorderrepository.GetLimitMaxCount(usercode); if (limitmaxcount > 0) return Error("你已经有" + limitmaxcount + "个未处理工单,已超上限"); #endregion int res = 0; if (ids != null && ids.Length > 0) { foreach (var item in ids) { var model = await _distri_workorderrepository.GetSingle(item); if (model != null) { if (model.wostate == (int)EnumDistributionState.create) { model.touser = new List() { touser }; model.totype = (int)EnumDistributionTotype.send; model.assigtime = DateTime.Now; //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.assign; var b = await _distri_workorderrepository.UpdateOne(model); if (b) { int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, touser, "", username + "指派工单,工单编号:" + model.wocode, usercode); res++; } } } } } if (res == ids.Length) { return Success("转派工单成功"); } else if (res > 0 && res < ids.Length) { return Error("部分工单转派失败,请稍后重试"); } else { return Error("转派工单失败"); } } /// /// 取货 - 配送岗/电梯岗(无电梯岗取货,需取货) /// /// /// /// [HttpPost("delivery")] public async Task UpdateDeliveryAsync(string id,int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); // 获取当前角色 - by 排班 string rolecode_ByUserMap = _distri_workorderrepository.GetUserCodeByClassMap(usercode); string rolename = string.Empty; // 电梯岗 if (rolecode_ByUserMap == "SSY_DTG") { rolename = "电梯岗"; if (model.wostate_elevator == (int)EnumDistributionState_elevator.create) return Error("请接单后再取货"); if (model.wostate_elevator == (int)EnumDistributionState_elevator.delivery) return Error("您已取货"); //model.touser_elevator = usercode; //电梯岗 - 接单人 model.wostate_elevator = (int)EnumDistributionState_elevator.delivery; //电梯岗 - 工单状态(0无操作,1已接单(待取货),2已取货(待配送)) } else if (rolecode_ByUserMap == "SSY_PSG") { rolename = "配送员"; if (model.wostate == (int)EnumDistributionState.delivery) return Error("工单已取货,无需再取货"); if (model.wostate >= (int)EnumDistributionState.finish) return Error("工单已完结/待评价,无需再取货"); //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.delivery; } else { return Error("接单失败"); } bool b = await _distri_workorderrepository.UpdateOne(model); if (b) { int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", rolename + username + "取货", usercode); return Success("取货成功"); } return Error("取货失败"); } /// /// 异常 - 配送岗(配送异常/取货异常) /// /// /// /// [HttpPost("exceptions")] public async Task UpdateExceptionsAsync(string id, List files, string exceptions,int type = 1, int isback_sended = 0, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; if (string.IsNullOrEmpty(id)) return Error("参数错误"); //if (string.IsNullOrEmpty(exceptions)) // return Error("异常说明不能为空"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); var model_ex = new Distri_Workorder_Exception(); if (type == 1) { if (model.wostate >= (int)EnumDistributionState.finish && model.wostate == (int)EnumDistributionState.delivery) return Error("工单已完成,不能操作"); //配送岗 - 转派人/抢单人 model.dealby = new List() { usercode }; model.dealtime = DateTime.Now; model.isexceptions = 1; //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起,7取货异常退单,9已评价 model.wostate = (int)EnumDistributionState.exceptions; } else { //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起,7取货异常退单,9已评价 model.wostate = (int)EnumDistributionState.backed; } bool b = await _distri_workorderrepository.UpdateOne(model); if (b) { model_ex.woid = id; model_ex.wocode = model.wocode; model_ex.projectid = model.projectid; model_ex.type = type; model_ex.isback_sended = isback_sended; model_ex.files = files; model_ex.content = exceptions; model_ex.createuser = usercode; model_ex.createusername = username; model_ex.isdelete = 0; model_ex.createtime = DateTime.Now; await _distri_workorder_exceptionrepository.Add(model_ex); //if (model.channel == 4){} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "配送岗" + usercode + "提交异常"+ (type == 1 ? "送达异常" : "取货异常"), usercode); return Success("异常操作成功"); } return Error("异常操作失败"); } /// /// 完结 - 签收确认 - 配送岗/主管 /// /// /// /// [HttpPost("finish")] public async Task UpdateFinishAsync(string id, List files, List filesplan, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").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 (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); if (model.wostate >= (int)EnumDistributionState.finish) return Error("工单已完结,不能再操作"); if (model.wostate == (int)EnumDistributionState.delivery || model.wostate == (int)EnumDistributionState.exceptions) { if (model.wostate == (int)EnumDistributionState.delivery && rolecode != "SSY_ZG") { if (model.wosorts == (int)EnumDistributionWoSorts.plan) { if (filesplan == null && filesplan.Count <= 0) return Error("收货人需要拍照"); model.planwopic = filesplan; } else { if (files == null && files.Count <= 0) return Error("收货人需要签字"); model.signbypic = files; } //配送岗 - 转派人/抢单人 model.dealby = new List() { usercode }; model.dealtime = DateTime.Now; } //异常的工单,在主管处可进行确定完结的操作,完结后也算工作量,不参与评价。 if (model.wostate == (int)EnumDistributionState.exceptions) { model.isexceptions = 0; if (rolecode != "SSY_ZG") return Error("异常工单,只有主管确定完结"); } //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.finish; bool b = await _distri_workorderrepository.UpdateOne(model); if (model.channel == 4) { var model_Receiver = model.receiverlist.FirstOrDefault(); string content = "抢单人:" + usercode + "-" + username + "\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"); SendWechatMsg(model.wocode, "工单完结成功!", "工单已完结成功,等待您的评价", content, model.id, model.createtby); } int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "" + username + "完结工单", usercode); return Success("完结成功"); } return Error("完结失败"); } /// /// 取消 - 配送岗 /// /// /// /// [HttpPost("cancel")] public async Task UpdateCancelAsync(string id, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; #region 验证判断 if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); #endregion //操作权限解释 - 下单人在下单后的修改和撤单操作权限是在电梯岗(配送岗)已取货之前均可操作 var model_Record = new Distri_Workorder_UpdateRecord(); if (model.wostate >= (int)EnumDistributionState.delivery || model.wostate >= (int)EnumDistributionState_elevator.delivery) { model_Record = await _distri_workorder_updaterrecordrepository.GetSingle(x => x.woid == model.id && x.isagree == 2 && x.isupdate == 0 && x.isdelete == 0); if (model_Record == null) { //没有申请修改/取消 if (model.wostate >= (int)EnumDistributionState.delivery) return Error("配送岗已取货之后不能取消"); if (model.wostate >= (int)EnumDistributionState_elevator.delivery) return Error("电梯岗已取货之后不能取消"); } } //配送岗 - 取消时间 model.canceltime = DateTime.Now; //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.canceled; bool b = await _distri_workorderrepository.UpdateOne(model); if (b) { //更新申请修改/取消表 if (model_Record != null) { model_Record.isupdate = 1; await _distri_workorder_updaterrecordrepository.Update(model_Record); } //if (model.channel == 4){} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "" + username + "取消工单", usercode); return Success("取消成功"); } return Error("取消失败"); } /// /// 评价 - 配送岗、科室人员 - 添加配送工单人员 /// /// /// /// /// /// /// /// /// [HttpPost("evaluate")] public async Task UpdateEvaluateAsync(string id, string wocode, int star, string evaluate, List label, List files, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; //string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model != null && model.wostate == (int)EnumDistributionState.finish) { if (model.createtby == usercode) { //配送岗 - 评价时间 model.evaluatetime = DateTime.Now; //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.evaluated; model.starnum = star; await _distri_workorderrepository.UpdateOne(model); Distri_Workorder_Evaluate model_ev = new Distri_Workorder_Evaluate(); model_ev.woid = id; model_ev.wocode = model.wocode; model_ev.projectid = model.projectid; model_ev.channel = channel; model_ev.evaluate = evaluate; model_ev.label = label; model_ev.starnum = star; model_ev.createuser = usercode; model_ev.createusername = username; model_ev.isdelete = 0; model_ev.createtime = DateTime.Now; await _distri_workorder_evaluaterepository.Add(model_ev); //if (model.channel == 4){} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "" + username + "评价工单,分数:" + star * 20 + "(" + star + "星级)", usercode); return Success("评价成功"); } return Error("无权评价"); } return Error("操作失败"); } /// /// 超时系统评价 - 配送 /// [AllowAnonymous] [HttpPost("distritimeoutevaluate")] public async Task TimeOutEvaluateForDistriAsync(int star = 5, string createusername = "系统", int channel = 5) { // 获取评价规定时间间隔 int hour = _distri_workorderrepository.GetEvaluateHour(); if (hour > 0) { //处理时间从2019-03-01 00:00:00开始,如果在时间间隔内没有评价,系统自动评价5分 var lists = await _distri_workorderrepository.Get(x => x.isdelete == 0 && x.wostate == (int)EnumDistributionState.finish && x.dealtime < DateTime.Now.AddHours(-hour)); //&& x.dealtime.Value >= DateTime.Parse("2019-03-01 00:00:00")); foreach (var model in lists) { //配送岗 - 评价时间 model.evaluatetime = DateTime.Now; //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 model.wostate = (int)EnumDistributionState.evaluated; model.starnum = star; await _distri_workorderrepository.UpdateOne(model); Distri_Workorder_Evaluate model_ev = new Distri_Workorder_Evaluate(); model_ev.woid = model.wocode; model_ev.wocode = model.wocode; model_ev.projectid = model.projectid; model_ev.channel = channel; model_ev.evaluate = ""; //evaluate; model_ev.label = new List(); model_ev.starnum = star; model_ev.createuser = ""; model_ev.createusername = createusername; model_ev.isdelete = 0; model_ev.createtime = DateTime.Now; await _distri_workorder_evaluaterepository.Add(model_ev); //if (model.channel == 4){} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, "", "", "" + createusername + "评价工单,分数:" + star * 20 + "(" + star + "星级)", ""); } return Success("评价成功"); } else { return Error("未设置时间间隔"); } } /// /// 挂起 - 配送岗 - 不用 /// /// /// /// //[HttpPost("hangup")] //public async Task UpdateHangupAsync(string id, int channel = 1) //{ // string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; // string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; // if (string.IsNullOrEmpty(id)) // return Error("参数错误"); // var model = await _distri_workorderrepository.GetSingle(id); // if (model == null) // return Error("操作失败"); // //if (model.wostate == (int)EnumDistributionState.hangup) // // return Error("工单已挂起,不能再操作"); // //配送岗 - 取消时间 // model.canceltime = DateTime.Now; // //配送工单状态:0创建工单,1转派或者抢单(待取货),2已取货(配送中),3货物异常(异常),4已完结/待评价,5已取消,6挂起 ,9已评价 // model.wostate = (int)EnumDistributionState.hangup; // bool b = await _distri_workorderrepository.UpdateOne(model); // if (b) // { // int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 // AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "配送岗" + usercode + "取消工单", usercode); // return Success("挂起成功"); // } // return Error("挂起失败"); //} /// /// 违规申诉 - 配送岗 /// /// /// /// /// /// /// /// /// [HttpPost("offence")] public async Task UpdateOffenceAsync(string id, string content, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model != null && model.isoffence == 1) { var model_offence = (await _distri_workorder_offencerecordrepository.GetSingle(x => x.woid == model.id && x.createby == usercode)); if (model_offence == null) { var model_Offence = new Distri_Workorder_OffenceRecord(); model_Offence.woid = id; model_Offence.wocode = model.wocode; model_Offence.channel = channel; model_Offence.content = content; model_Offence.createby = usercode; model_Offence.createtime = DateTime.Now; await _distri_workorder_offencerecordrepository.Add(model_Offence); int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "配送岗" + username + "违规申诉", usercode); return Success("操作成功"); } return Error("已违规申诉过"); } return Error("操作失败"); } /// /// 审核违规申诉 - 主管 /// /// /// /// /// 是否审核通过 1不通过 2通过 /// /// [HttpPost("auditoffence")] public async Task UpdateAuditOffenceAsync(string id, string content, int isaudit = 1, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model != null && model.isoffence == 1) { var model_Offence = (await _distri_workorder_offencerecordrepository.GetSingle(x => x.woid == model.id && model.touser.Contains(x.createby))); if (model_Offence != null) { model_Offence.isaudit = isaudit; model_Offence.content_rejectreason = content; model_Offence.dealby = usercode; model_Offence.dealtime = DateTime.Now; bool b = await _distri_workorder_offencerecordrepository.UpdateOne(model_Offence); if (b) { if (isaudit == 2) { //是否违规 0否 1是 model.isoffence = 0; await _distri_workorderrepository.UpdateOne(model); } } //if (model.channel == 4){} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 string str_Isaudit = isaudit == 1 ? "(不通过)" : "(已通过) "; AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "" + username + "审核违规申诉" + str_Isaudit + "", usercode); return Success("操作成功"); } return Error("参数错误,请确认是否是配送岗提交的违规申诉"); } return Error("操作失败"); } #endregion /// /// 删除配送工单 /// /// /// [HttpPost("delete")] public async Task DeleteAsync(string[] ids, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value; //使用逻辑删除 var res = 0; if (ids != null && ids.Length > 0) { foreach (var id in ids) { var model = await _distri_workorderrepository.GetSingle(id); model.isdelete = 1; model.deleteby = usercode; model.deletetime = DateTime.Now; if (await _distri_workorderrepository.UpdateOne(model)) { #region 删除相关表数据 //评价 var list_Evaluates = await _distri_workorder_evaluaterepository.Get(p => p.woid == model.id && p.isdelete == 0); foreach (var item_evaluate in list_Evaluates) { item_evaluate.isdelete = 1; item_evaluate.deleteby = usercode; item_evaluate.deletetime = DateTime.Now; await _distri_workorder_evaluaterepository.UpdateOne(item_evaluate); } //工单流程 var items = await _distri_workorder_itemsrepository.Get(p => p.woid == model.id && p.isdelete == 0); foreach (var item in items) { item.isdelete = 1; item.deleteby = usercode; item.deletetime = DateTime.Now; await _distri_workorder_itemsrepository.UpdateOne(item); } //异常 var list_exceptio = await _distri_workorder_exceptionrepository.Get(p => p.woid == model.id && p.isdelete == 0); foreach (var item in list_exceptio) { item.isdelete = 1; item.deleteby = usercode; item.deletetime = DateTime.Now; await _distri_workorder_exceptionrepository.UpdateOne(item); } //违规 var list_offence = await _distri_workorder_offencerecordrepository.Get(p => p.woid == model.id && p.isdelete == 0); foreach (var item in list_offence) { item.isdelete = 1; item.deleteby = usercode; item.deletetime = DateTime.Now; await _distri_workorder_offencerecordrepository.UpdateOne(item); } //修改取消申请 var list_updaterrecord = await _distri_workorder_updaterrecordrepository.Get(p => p.woid == model.id && p.isdelete == 0); foreach (var item in list_updaterrecord) { item.isdelete = 1; item.deleteby = usercode; item.deletetime = DateTime.Now; await _distri_workorder_updaterrecordrepository.UpdateOne(item); } #endregion int islast = model.wostate == (int)EnumDistributionState.canceled ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", username + "取消工单", usercode); res += 1; } } if (res == ids.Length) return Success("删除成功"); else if (res > 0 && res < ids.Length) return Error("部分删除失败"); else return Error("删除失败"); } else return Error("请选择要删除的记录"); } #region 科室(下单人) /// /// 申请修改/取消 - 下单人 /// /// /// 申请内容 /// 申请类型(1需要修改,2需要取消) /// /// [HttpPost("apply")] public async Task UpdateApplyAsync(string id,string detail, int isupdatetype = 1, int channel = 1) { string usercode = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Sid).Value; string rolecode = User.Claims.FirstOrDefault(c => c.Type == "RoleCode").Value; if (string.IsNullOrEmpty(id)) return Error("参数错误"); var model = await _distri_workorderrepository.GetSingle(id); if (model == null) return Error("操作失败"); //已取货后修改或者撤单,需要申请 if (model.wosorts == (int)EnumDistributionWoSorts.plan) return Error("计划分送工单不能修改"); if (model.wostate < (int)EnumDistributionState.delivery) return Error("工单配送岗未取货,不需要申请方可修改/取消"); if (model.wostate < (int)EnumDistributionState_elevator.delivery) return Error("工单电梯岗未取货,不需要申请方可修改/取消"); var model_Record = new Distri_Workorder_UpdateRecord(); model_Record.woid = model.id; model_Record.wocode = model.wocode; model_Record.channel = channel; model_Record.planid = model.planid; model_Record.plantaskid = model.plantaskid; model_Record.wotype = model.wosorts; model_Record.detail = detail; model_Record.isagree = 0; model_Record.isupdate = 0; model_Record.isupdatetype = isupdatetype; model_Record.createby = usercode; model_Record.createtime = DateTime.Now; bool b = await _distri_workorder_updaterrecordrepository.Add(model_Record); if (b) { //if (model.channel == 4){} int islast = model.wostate == (int)EnumDistributionState.finish ? 1 : 0; //是否最后一步 0否 1是 AddItems(model.id, model.wocode, model.wostate, model.wostate_elevator, channel, islast, usercode, "", "" + username + "申请修改/取消工单", usercode); return Success("申请修改/取消成功"); } return Error("申请修改/取消失败"); } #endregion #region 方法 /// /// 添加工单记录 /// /// 工单编号 /// 工单状态 /// 是否催办(0不催办1催办) /// 是否最后一步 0否 1是 /// 指派下一步人员 /// 指派下一步部门 /// 处理说明 /// 当前操作人 private async void AddItems(string woid, string wocode, int wostate,int wostate_elevator,int channel, int islast, string touser, string todept, string detail, string usercode) { try { #region 更新上一步明细 if (wostate > 0) { var listItem = (await _distri_workorder_itemsrepository.Get(x => x.woid == woid)).OrderByDescending(x => x.createtime); if (listItem.Count() > 0) { var itemmodel = listItem.FirstOrDefault(); itemmodel.sureuser = new List { usercode }; itemmodel.suretime = DateTime.Now; itemmodel.itemstate = 1; itemmodel.islast = islast; await _distri_workorder_itemsrepository.UpdateOne(itemmodel); } } #endregion #region 添加下一步明细 var model = new Distri_Workorder_Items(); model.woid = woid; model.wocode = wocode; model.wostate = wostate; model.itemstate = 0; model.isdelete = 0; model.createby = usercode; model.createtime = DateTime.Now; model.detail = detail; model.islast = islast; model.channel = channel; if (wostate < (int)EnumEquipmentRunningState.deal) { //model.ishasten = ishasten; #region 创建、转派、抢单 model.dealby = new List { touser }; #endregion } else if (wostate == (int)EnumEquipmentRunningState.deal) { #region 结单 model.dealtime = DateTime.Now; model.dealby = new List { usercode }; #endregion } await _distri_workorder_itemsrepository.Add(model); #endregion } catch (Exception ex) { _logger.LogDebug("工单日志记录异常", ex); } } #endregion #region 微信方法 /// /// 发送微信模板消息 /// /// 工单编号 /// 标题 /// 内容 /// 链接地址 /// 接收方 /// 模板id private async void SendWechatMsg(string wocode, string title, string statename, string content, string url, string openid, string templateid = "csH1KSQMz8nMnZhlcH7gpOo1aAIZZLiXecYlhGFzvuE") { url = "menucode=PSDD&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 } }