feat(出库时效): 添加出库时效配置功能
- 新增独立的 outbound_time_config.json 配置文件管理出库时效参数
- 实现前端配置页面和后端API接口
- 优化机器人任务处理逻辑,添加任务编号缓存
- 分离电芯条码为累积批次和当前批次
- 更新相关状态管理和任务处理逻辑
| | |
| | | public int[]? LastPutPositions { get; set; } |
| | | |
| | | /// <summary> |
| | | /// çµæ± /è´§ä½æ¡ç å表 |
| | | /// çµæ± /è´§ä½æ¡ç å表ï¼ç´¯ç§¯æææ¹æ¬¡ï¼ä¸éå¤ï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å¨ç»çæä½æ¶ç¨äºè®°å½çæçæçæ¡ç ã |
| | | /// å¨ç»çæä½æ¶ç¨äºç´¯ç§¯è®°å½ææçµè¯æ¡ç ï¼æ¯æ¬¡è¯»åæ°æ¡ç æ¶è¿½å ï¼å»éï¼ã |
| | | /// ä»
卿¶å° allputfinishedï¼å
¨é¨æ¾è´§å®æï¼æ¶æ¸
空ã |
| | | /// æ¯ä¸ªæ¡ç æ ¼å¼ä¸º "TRAY" + æ¥æ + æ¶é´ + éæºæ°ã |
| | | /// </remarks> |
| | | public List<string> CellBarcode { get; set; } = new List<string>(); |
| | | |
| | | /// <summary> |
| | | /// å½åæ¹æ¬¡ççµè¯æ¡ç å表 |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ¯æ¬¡è¯»åæ°æ¡ç æ¶è®¾ç½®ä¸ºæ¬æ¹æ¬¡çæ¡ç ï¼ä»
ç¨äº WMS æäº¤æ¶ææ¹æ¬¡æäº¤ã |
| | | /// æ¯æ¬¡æ°æ¹æ¬¡è¯»åæ¶è¦çï¼å¨ allputfinished æ¶æ¸
空ã |
| | | /// </remarks> |
| | | public List<string> CurrentBatchBarcodes { get; set; } = new List<string>(); |
| | | |
| | | /// <summary> |
| | | /// æºæ¢°æå½åæ£å¨æ§è¡çä»»å¡ |
| | |
| | | /// æå¸¦çº¿ä¸çµè¯æ¯å¦å°ä½ã |
| | | /// </remarks> |
| | | public bool BatteryArrived { get; set; } = false; |
| | | |
| | | /// <summary> |
| | | /// å½åæ§è¡ä¸çæºå¨äººä»»å¡ç¼å· |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ä¸å任塿¶ç¼åä»»å¡ç¼å·ï¼ç¨äº RobotJob å¿«éæ¥æ¾æ§è¡ä¸çä»»å¡ï¼ |
| | | /// é¿å
æ¯æ¬¡è½®è¯¢å
¨è¡¨æ«æãä»»å¡å®ææ¶æ¸
空为 nullã |
| | | /// </remarks> |
| | | public int? CurrentTaskNum { get; set; } |
| | | } |
| | | } |
| | |
| | | using Autofac.Core;
|
| | | using Masuit.Tools;
|
| | | using Microsoft.AspNetCore.Authorization;
|
| | | using Microsoft.AspNetCore.Mvc;
|
| | | using WIDESEAWCS_Core;
|
| | | using WIDESEAWCS_Core.BaseController;
|
| | | using WIDESEAWCS_DTO.TaskInfo;
|
| | | using WIDESEAWCS_ITaskInfoService;
|
| | | using WIDESEAWCS_Model.Models;
|
| | |
|
| | |
| | | return WebResponseContent.Instance.Error();
|
| | | }
|
| | |
|
| | |
|
| | | [HttpGet, HttpPost, Route("GetRobotTaskTotalNum"), AllowAnonymous]
|
| | | public int GetRobotTaskTotalNum( int taskType, string? palletCode)
|
| | | {
|
| | | return Service.GetRobotTaskTotalNum(taskType, palletCode);
|
| | | }
|
| | |
|
| | | // æå¨æºæ¢°æä»»å¡
|
| | | [HttpGet, HttpPost, Route("CreateRobotTaskManually"), AllowAnonymous]
|
| | | public WebResponseContent CreateRobotTaskManually([FromBody] ManualRobotTaskDto request)
|
| | |
| | | } |
| | | |
| | | // 轮询è·å该设å¤çå¾
å¤çä»»å¡ |
| | | var task = _taskProcessor.GetTask(robotCrane); |
| | | // ä¼å
éè¿ç¶æä¸ç¼åçä»»å¡ç¼å·æ¥æ¾æ§è¡ä¸çä»»å¡ |
| | | Dt_RobotTask? task = null; |
| | | if (state.CurrentTaskNum.HasValue) |
| | | { |
| | | task = _taskProcessor.GetTaskByNum(state.CurrentTaskNum.Value); |
| | | } |
| | | |
| | | // ç¼åçä»»å¡å·æªæ¾å°å¯¹åºä»»å¡æ¶ï¼æè®¾å¤ç¼ç è·åæ°ä»»å¡ |
| | | task ??= _taskProcessor.GetTask(robotCrane); |
| | | |
| | | // å¦ææ²¡æè·åå°å¾
å¤çä»»å¡ï¼ä¸RobotArmObject为1ï¼æç©æï¼ï¼åè·åè¯¥è®¾å¤æ§è¡ä¸çä»»å¡ |
| | | //if (task == null && state.RobotArmObject == 1) |
| | |
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// æä»»å¡ç¼å·è·åæºå¨äººä»»å¡
|
| | | /// </summary>
|
| | | /// <remarks>
|
| | | /// ç¨äº RobotJob å¿«éæ¥æ¾æ§è¡ä¸çä»»å¡ï¼é¿å
å
¨è¡¨æ«æã
|
| | | /// ä¼å
éè¿ç¶æä¸ç¼åç CurrentTaskNum å®ä½ä»»å¡ã
|
| | | /// </remarks>
|
| | | /// <param name="taskNum">æºå¨äººä»»å¡ç¼å·</param>
|
| | | /// <returns>å¹é
çä»»å¡å¯¹è±¡ï¼å¦ææ²¡æåè¿å null</returns>
|
| | | public Dt_RobotTask? GetTaskByNum(int taskNum)
|
| | | {
|
| | | return _robotTaskService.Repository.QueryFirst(x => x.RobotTaskNum == taskNum);
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// æè®¾å¤ç¼ç è·åå½åæºå¨äººçæ§è¡ä¸ä»»å¡
|
| | | /// </summary>
|
| | | /// <remarks>
|
| | |
| | |
|
| | | // å°ä»»å¡å
³èå°ç¶æå¯¹è±¡
|
| | | state.CurrentTask = task;
|
| | | state.CurrentTaskNum = task.RobotTaskNum;
|
| | |
|
| | | if (isScanNG)
|
| | | {
|
| | |
| | |
|
| | | // å°ä»»å¡å
³èå°ç¶æå¯¹è±¡
|
| | | state.CurrentTask = task;
|
| | | state.CurrentTaskNum = task.RobotTaskNum;
|
| | |
|
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
|
| | | {
|
| | |
| | |
|
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
|
| | | state.CurrentTask = task;
|
| | | state.CurrentTaskNum = task.RobotTaskNum;
|
| | |
|
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
|
| | | {
|
| | |
| | | {
|
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
|
| | | state.CurrentTask = task;
|
| | | state.CurrentTaskNum = task.RobotTaskNum;
|
| | |
|
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
|
| | | {
|
| | |
| | | {
|
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
|
| | | state.CurrentTask = task;
|
| | | state.CurrentTaskNum = task.RobotTaskNum;
|
| | |
|
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
|
| | | {
|
| | |
| | | // éé/ä½ç½®ç¼å·
|
| | | Channel = x,
|
| | |
|
| | | // çµæ± æ¡ç ï¼å¦æç¶æä¸ææ¡ç å表ï¼å对åºä½ç½®çæ¡ç ï¼å¦å为空
|
| | | // çµæ± æ¡ç ï¼ä½¿ç¨å½åæ¹æ¬¡æ¡ç å表ï¼å对åºä½ç½®çæ¡ç ï¼å¦å为空
|
| | | //CellBarcode = state.CellBarcode?.Count > 0 ? state.CellBarcode[x - 1] : ""
|
| | | CellBarcode = !state.CellBarcode.IsNullOrEmpty() ? state.CellBarcode[idx].ToString() ?? string.Empty : string.Empty
|
| | | CellBarcode = !state.CurrentBatchBarcodes.IsNullOrEmpty() ? state.CurrentBatchBarcodes[idx].ToString() ?? string.Empty : string.Empty
|
| | | })
|
| | | .ToList()
|
| | | };
|
| | |
| | | QuartzLogHelper.LogInfo(_logger, $"åéæ¶æ¯ï¼ãGroup,diskFinishedã", state.RobotCrane.DeviceName); |
| | | |
| | | state.CurrentTask = null; |
| | | state.CurrentTaskNum = null; |
| | | state.RobotTaskTotalNum = 0; |
| | | state.CellBarcode = new List<string>(); |
| | | state.CurrentBatchBarcodes = new List<string>(); |
| | | state.ChangePalletPhase = 0; |
| | | state.CurrentBatchIndex = 1; |
| | | state.IsInFakeBatteryMode = false; |
| | |
| | | } |
| | | |
| | | state.CurrentTask = null; |
| | | state.CurrentTaskNum = null; |
| | | state.RobotTaskTotalNum = 0; |
| | | state.CellBarcode = new List<string>(); |
| | | state.CurrentBatchBarcodes = new List<string>(); |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished"); |
| | | QuartzLogHelper.LogInfo(_logger, $"åéæ¶æ¯ï¼ãGroup,diskFinishedã", state.RobotCrane.DeviceName); |
| | |
| | | } |
| | | |
| | | state.CurrentTask = null; |
| | | state.CurrentTaskNum = null; |
| | | state.RobotTaskTotalNum = 0; |
| | | state.CellBarcode = new List<string>(); |
| | | state.CurrentBatchBarcodes = new List<string>(); |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished"); |
| | | QuartzLogHelper.LogInfo(_logger, $"åéæ¶æ¯ï¼ãGroup,diskFinishedã", state.RobotCrane.DeviceName); |
| | |
| | | |
| | | // æ¸
çç¶æï¼ä¸ºä¸ä¸ä¸ªä»»å¡ååå¤ |
| | | state.CurrentTask = null; // æ¸
é¤å½åä»»å¡ |
| | | state.CurrentTaskNum = null; // æ¸
é¤å½åä»»å¡ç¼å· |
| | | state.RobotTaskTotalNum = 0; // é置任å¡è®¡æ° |
| | | state.CellBarcode = new List<string>(); // æ¸
空æ¡ç å表 |
| | | state.CurrentBatchBarcodes = new List<string>(); // æ¸
空å½åæ¹æ¬¡æ¡ç |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished"); |
| | | QuartzLogHelper.LogInfo(_logger, $"åéæ¶æ¯ï¼ãGroup,diskFinishedã", state.RobotCrane.DeviceName); |
| | |
| | | if (stateToUpdate != null) |
| | | { |
| | | stateToUpdate.CurrentTask = task; |
| | | stateToUpdate.CurrentTaskNum = task.RobotTaskNum; |
| | | |
| | | if (_stateManager.TryUpdateStateSafely(ipAddress, stateToUpdate)) |
| | | { |
| | |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsyncï¼è¯»åççµè¯æ¡ç å¯ä¸ï¼ç»§ç»æ§è¡ï¼ä»»å¡å·: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | |
| | | // å°æ¡ç æ·»å å°ç¶æä¸ï¼ä¾åç»æ¾è´§æ¶ä½¿ç¨ |
| | | stateForUpdate.CellBarcode = new List<string>() |
| | | // å°æ¡ç ç´¯ç§¯å° CellBarcodeï¼å»éï¼ï¼å¹¶è®¾ç½®å½åæ¹æ¬¡æ¡ç |
| | | if (!stateForUpdate.CellBarcode.Contains(trayBarcode1)) |
| | | stateForUpdate.CellBarcode.Add(trayBarcode1); |
| | | if (!stateForUpdate.CellBarcode.Contains(trayBarcode2)) |
| | | stateForUpdate.CellBarcode.Add(trayBarcode2); |
| | | |
| | | // 设置å½åæ¹æ¬¡æ¡ç ï¼ç¨äº WMS æäº¤ |
| | | stateForUpdate.CurrentBatchBarcodes = new List<string>() |
| | | { |
| | | trayBarcode1,trayBarcode2 |
| | | }; |
| | |
| | | name: 'PDA', |
| | | component: () => import('@/views/system/PDA.vue') |
| | | } |
| | | , { |
| | | path: '/outboundTimeConfig', |
| | | name: 'outboundTimeConfig', |
| | | component: () => import('@/views/system/outboundTimeConfig.vue') |
| | | } |
| | | ] |
| | | |
| | | export default viewgird |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="config-container"> |
| | | <el-card class="config-card"> |
| | | <template #header> |
| | | <span>åºåºæ¶æé
ç½®</span> |
| | | </template> |
| | | <el-form :model="form" label-width="180px" v-loading="loading"> |
| | | <el-form-item label="GW馿¾å
¥åºæ¶æï¼å°æ¶ï¼"> |
| | | <el-input-number |
| | | v-model="form.gw1FirstHours" |
| | | :min="0.01" |
| | | :max="999" |
| | | :precision="2" |
| | | :step="1" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="GWäºæ¾å
¥åºæ¶æï¼å°æ¶ï¼"> |
| | | <el-input-number |
| | | v-model="form.gw1SecondHours" |
| | | :min="0.01" |
| | | :max="999" |
| | | :precision="2" |
| | | :step="0.01" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="CWåºåºæ¶æï¼å°æ¶ï¼"> |
| | | <el-input-number |
| | | v-model="form.cw1Hours" |
| | | :min="0.01" |
| | | :max="999" |
| | | :precision="2" |
| | | :step="1" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleSave" :loading="saving"> |
| | | ä¿å |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { ref, onMounted } from "vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | import http from "@/api/http"; |
| | | |
| | | export default { |
| | | name: "outboundTimeConfig", |
| | | setup() { |
| | | const loading = ref(false); |
| | | const saving = ref(false); |
| | | const form = ref({ |
| | | gw1FirstHours: 24, |
| | | gw1SecondHours: 0.05, |
| | | cw1Hours: 3, |
| | | }); |
| | | |
| | | /// å è½½å½åé
ç½® |
| | | const loadConfig = async () => { |
| | | loading.value = true; |
| | | try { |
| | | const res = await http.post("/api/OutboundTimeConfig/get", {}, false); |
| | | if (res.status) { |
| | | form.value = { |
| | | gw1FirstHours: res.data.gw1FirstHours, |
| | | gw1SecondHours: res.data.gw1SecondHours, |
| | | cw1Hours: res.data.cw1Hours, |
| | | }; |
| | | } |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | }; |
| | | |
| | | /// ä¿åé
ç½® |
| | | const handleSave = async () => { |
| | | saving.value = true; |
| | | try { |
| | | const res = await http.post("/api/OutboundTimeConfig/update", form.value, false); |
| | | if (res.status) { |
| | | ElMessage.success("ä¿åæå"); |
| | | } else { |
| | | ElMessage.error(res.message || "ä¿å失败"); |
| | | } |
| | | } finally { |
| | | saving.value = false; |
| | | } |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | loadConfig(); |
| | | }); |
| | | |
| | | return { form, loading, saving, handleSave }; |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .config-container { |
| | | padding: 20px; |
| | | } |
| | | .config-card { |
| | | max-width: 600px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEA_Core.Core |
| | | { |
| | | /// <summary> |
| | | /// åºåºæ¶æé
ç½®é项ï¼ç»å® appsettings.json ä¸ç OutboundTimeConfig è |
| | | /// </summary> |
| | | public class OutboundTimeConfigOptions |
| | | { |
| | | /// <summary> |
| | | /// é
ç½®èåç§° |
| | | /// </summary> |
| | | public const string SectionName = "OutboundTimeConfig"; |
| | | |
| | | /// <summary> |
| | | /// GW馿¾å
¥åºæ¶æï¼å°æ¶ï¼ï¼é»è®¤24å°æ¶ |
| | | /// </summary> |
| | | public double Gw1FirstHours { get; set; } = 24; |
| | | |
| | | /// <summary> |
| | | /// GWäºæ¾å
¥åºæ¶æï¼å°æ¶ï¼ï¼é»è®¤0.05å°æ¶ï¼çº¦3åéï¼ |
| | | /// </summary> |
| | | public double Gw1SecondHours { get; set; } = 0.05; |
| | | |
| | | /// <summary> |
| | | /// CWåºåºæ¶æï¼å°æ¶ï¼ï¼é»è®¤3å°æ¶ |
| | | /// </summary> |
| | | public double Cw1Hours { get; set; } = 3; |
| | | } |
| | | } |
| | |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Common.TaskEnum; |
| | | using WIDESEA_Common.WareHouseEnum; |
| | | using Microsoft.Extensions.Options; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | |
| | | private readonly IMesLogService _mesLogService; |
| | | private readonly IMesUploadHelper _mesUploadHelper; |
| | | private readonly ISqlSugarClient _sqlSugarClient; |
| | | private readonly IOptionsMonitor<OutboundTimeConfigOptions> _outboundTimeOptions; |
| | | |
| | | public IRepository<Dt_Task> Repository => BaseDal; |
| | | |
| | |
| | | IMESDeviceConfigService mesDeviceConfigService, |
| | | IMesLogService mesLogService, |
| | | IMesUploadHelper mesUploadHelper, |
| | | ISqlSugarClient sqlSugarClient) : base(BaseDal) |
| | | ISqlSugarClient sqlSugarClient, |
| | | IOptionsMonitor<OutboundTimeConfigOptions> outboundTimeOptions) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _stockInfoService = stockInfoService; |
| | |
| | | _mesLogService = mesLogService; |
| | | _mesUploadHelper = mesUploadHelper; |
| | | _sqlSugarClient = sqlSugarClient; |
| | | _outboundTimeOptions = outboundTimeOptions; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <param name="stockInfo">åºåä¿¡æ¯</param> |
| | | private void SetOutboundDateByRoadway(Dt_Task task, Dt_StockInfo stockInfo) |
| | | { |
| | | var config = _outboundTimeOptions.CurrentValue; |
| | | var now = DateTime.Now; |
| | | if (task.Roadway.Contains("GW")) |
| | | { |
| | | stockInfo.OutboundDate = string.IsNullOrEmpty(stockInfo.Remark) |
| | | ? now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_FIRST) |
| | | ? now.AddHours(config.Gw1FirstHours) |
| | | : stockInfo.Remark == StockRemarkConstants.GW1 |
| | | ? now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_SECOND) |
| | | : now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_FIRST); |
| | | ? now.AddHours(config.Gw1SecondHours) |
| | | : now.AddHours(config.Gw1FirstHours); |
| | | |
| | | stockInfo.Remark = string.IsNullOrEmpty(stockInfo.Remark) |
| | | ? StockRemarkConstants.GW1 |
| | |
| | | } |
| | | else if (task.Roadway.Contains("CW")) |
| | | { |
| | | stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_CW1); |
| | | stockInfo.OutboundDate = now.AddHours(config.Cw1Hours); |
| | | if (stockInfo.Remark == StockRemarkConstants.GW2) |
| | | stockInfo.Remark = StockRemarkConstants.CW1; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Microsoft.AspNetCore.Authorization; |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using Microsoft.Extensions.Options; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.Core; |
| | | |
| | | namespace WIDESEA_WMSServer.Controllers |
| | | { |
| | | /// <summary> |
| | | /// åºåºæ¶æé
ç½®æ§å¶å¨ï¼è¯»åç¬ç«ç outbound_time_config.json é
ç½®æä»¶ |
| | | /// </summary> |
| | | [Route("api/[controller]")] |
| | | [ApiController] |
| | | [Authorize] |
| | | public class OutboundTimeConfigController : ControllerBase |
| | | { |
| | | private readonly IOptionsMonitor<OutboundTimeConfigOptions> _optionsMonitor; |
| | | private readonly IWebHostEnvironment _env; |
| | | |
| | | /// <summary> |
| | | /// é
ç½®æä»¶å |
| | | /// </summary> |
| | | private const string ConfigFileName = "outbound_time_config.json"; |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="optionsMonitor">åºåºæ¶æé
ç½® Options çæ§å¨</param> |
| | | /// <param name="env">Web 宿主ç¯å¢ï¼ç¨äºå®ä½é
ç½®æä»¶è·¯å¾</param> |
| | | public OutboundTimeConfigController(IOptionsMonitor<OutboundTimeConfigOptions> optionsMonitor, IWebHostEnvironment env) |
| | | { |
| | | _optionsMonitor = optionsMonitor; |
| | | _env = env; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åå½ååºåºæ¶æé
ç½® |
| | | /// </summary> |
| | | /// <returns>å½åé
ç½®å¼</returns> |
| | | [HttpPost("get")] |
| | | public IActionResult Get() |
| | | { |
| | | var config = _optionsMonitor.CurrentValue; |
| | | return Ok(WebResponseContent.Instance.OK("è·åæå", new |
| | | { |
| | | config.Gw1FirstHours, |
| | | config.Gw1SecondHours, |
| | | config.Cw1Hours |
| | | })); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ´æ°åºåºæ¶æé
ç½®ï¼åå
¥ç¬ç«ç outbound_time_config.json æä»¶ |
| | | /// </summary> |
| | | /// <param name="config">æ°çé
ç½®å¼</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | [HttpPost("update")] |
| | | public IActionResult Update([FromBody] OutboundTimeConfigOptions config) |
| | | { |
| | | if (config.Gw1FirstHours <= 0 || config.Gw1SecondHours <= 0 || config.Cw1Hours <= 0) |
| | | { |
| | | return Ok(WebResponseContent.Instance.Error("é
ç½®å¼å¿
须大äº0")); |
| | | } |
| | | |
| | | try |
| | | { |
| | | var filePath = Path.Combine(_env.ContentRootPath, ConfigFileName); |
| | | |
| | | // æå»ºé
ç½® JSONï¼å
è£¹å¨ OutboundTimeConfig èä¸ä»¥å¹é
Options ç»å® |
| | | var configSection = new JObject |
| | | { |
| | | ["Gw1FirstHours"] = config.Gw1FirstHours, |
| | | ["Gw1SecondHours"] = config.Gw1SecondHours, |
| | | ["Cw1Hours"] = config.Cw1Hours |
| | | }; |
| | | var jsonObj = new JObject |
| | | { |
| | | [OutboundTimeConfigOptions.SectionName] = configSection |
| | | }; |
| | | |
| | | // åå
¥æä»¶ï¼æ ¼å¼åè¾åº |
| | | System.IO.File.WriteAllText(filePath, jsonObj.ToString(Formatting.Indented)); |
| | | |
| | | return Ok(WebResponseContent.Instance.OK("é
ç½®æ´æ°æå")); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return Ok(WebResponseContent.Instance.Error($"é
ç½®æ´æ°å¤±è´¥: {ex.Message}")); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | hostingContext.Configuration.ConfigureApplication(); |
| | | config.Sources.Clear(); |
| | | config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); |
| | | config.AddJsonFile("outbound_time_config.json", optional: true, reloadOnChange: true); |
| | | }); |
| | | |
| | | builder.Host.UseSerilog((context, services, loggerConfiguration) => |
| | |
| | | builder.Services.AddSingleton<RoundRobinService>(); |
| | | builder.Services.Configure<AutoOutboundTaskOptions>( |
| | | builder.Configuration.GetSection("AutoOutboundTask")); |
| | | builder.Services.Configure<OutboundTimeConfigOptions>( |
| | | builder.Configuration.GetSection(OutboundTimeConfigOptions.SectionName)); |
| | | builder.Services.AddMemoryCacheSetup(); // ç¼åæå¡ |
| | | builder.Services.AddWebSocketSetup(); |
| | | builder.Services.AddSqlsugarSetup(); // SqlSugar æ°æ®åºé
ç½® |
| | |
| | | </ItemGroup> |
| | | |
| | | <ItemGroup> |
| | | <Content Update="outbound_time_config.json"> |
| | | <CopyToOutputDirectory>Always</CopyToOutputDirectory> |
| | | </Content> |
| | | </ItemGroup> |
| | | |
| | | <ItemGroup> |
| | | <Content Update="wwwroot\swg-login.html"> |
| | | <CopyToOutputDirectory>Never</CopyToOutputDirectory> |
| | | </Content> |
| | |
| | | "MainDB": "DB_WIDESEA", //å½å项ç®ç主åºï¼æå¯¹åºçè¿æ¥å符串çEnabledå¿
须为true |
| | | //è¿æ¥å符串 |
| | | //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=", |
| | | "ConnectionString": "Data Source=192.168.60.30;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", |
| | | "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", |
| | | //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", |
| | | //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=WMS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", |
| | | //æ§WMSæ°æ®åºè¿æ¥ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "OutboundTimeConfig": { |
| | | "Gw1FirstHours": 24.0, |
| | | "Gw1SecondHours": 0.05, |
| | | "Cw1Hours": 3.0 |
| | | } |
| | | } |