feat: 添加vue3-json-viewer并优化日志显示
refactor(WCS): 重构堆垛机任务选择和状态检查逻辑
fix(WCS): 修正堆垛机放货条件判断
fix(WMS): 修复组盘仓库ID匹配逻辑
perf: 优化API日志中间件的异步处理
style: 更新日志显示样式和交互
docs: 添加出库作业类型注释
chore: 更新设备通讯文档
| | |
| | | { |
| | | "lastSentAt": "2026-04-13T06:33:17.906Z" |
| | | "lastSentAt": "2026-04-14T08:08:15.956Z" |
| | | } |
| | |
| | | { |
| | | "lastSentAt": "2026-04-12T15:31:49.457Z" |
| | | "lastSentAt": "2026-04-14T08:55:27.403Z" |
| | | } |
| | |
| | | "vue-draggable-next": "^2.0.1", |
| | | "vue-router": "^4.0.0-0", |
| | | "vuex": "^4.0.0-0", |
| | | "vue3-json-viewer": "^2.4.1", |
| | | "wangeditor": "^4.7.6" |
| | | }, |
| | | "devDependencies": { |
| | |
| | | import { h, resolveComponent } from 'vue'; |
| | | import { createApp } from 'vue'; |
| | | import { ElDrawer } from 'element-plus'; |
| | | import { JsonViewer } from 'vue3-json-viewer'; |
| | | import 'vue3-json-viewer/dist/vue3-json-viewer.css'; |
| | | |
| | | let extension = { |
| | | components: { |
| | | //卿æ©å
ç»ä»¶æç»ä»¶è·¯å¾ |
| | |
| | | }, |
| | | onInited() { |
| | | this.height = this.height - 170; |
| | | }, |
| | | |
| | | // è¡ç¹å»äºä»¶ - æ¾ç¤ºåæ°è¯¦æ
æ½å± |
| | | rowClick({ row, column }) { |
| | | if (column.property === 'requestParam' && row.requestParam) { |
| | | this.showJsonDetail(row, 'request'); |
| | | } else if (column.property === 'responseParam' && row.responseParam) { |
| | | this.showJsonDetail(row, 'response'); |
| | | } |
| | | }, |
| | | |
| | | // æ¾ç¤º JSON 详æ
æ½å± |
| | | showJsonDetail(row, type = 'request') { |
| | | const content = type === 'request' ? row.requestParam : row.responseParam; |
| | | const title = type === 'request' ? 'ð 请æ±åæ°' : 'ð¥ ååºåæ°'; |
| | | |
| | | // è§£æ JSON 对象ï¼è§£æå¤±è´¥åä¿çåå§å符串 |
| | | let jsonData; |
| | | try { |
| | | jsonData = typeof content === 'string' ? JSON.parse(content) : content; |
| | | } catch (e) { |
| | | jsonData = String(content); |
| | | } |
| | | |
| | | // å建临æ¶å®¹å¨æ¸²ææ½å± |
| | | const container = document.createElement('div'); |
| | | document.body.appendChild(container); |
| | | |
| | | const app = createApp({ |
| | | render() { |
| | | const onClose = (val) => { |
| | | if (!val) { |
| | | app.unmount(); |
| | | document.body.removeChild(container); |
| | | } |
| | | }; |
| | | return ( |
| | | <div> |
| | | <ElDrawer |
| | | modelValue={true} |
| | | onUpdate:modelValue={onClose} |
| | | title={title} |
| | | size="40%" |
| | | destroyOnClose={true} |
| | | closeOnClickModal={true} |
| | | > |
| | | <JsonViewer |
| | | value={jsonData} |
| | | expanded={true} |
| | | expandDepth={5} |
| | | copyable={true} |
| | | sort={false} |
| | | theme="light" |
| | | /> |
| | | </ElDrawer> |
| | | </div> |
| | | ); |
| | | } |
| | | }); |
| | | |
| | | app.use(window.ElementPlus); |
| | | app.component('JsonViewer', JsonViewer); |
| | | app.mount(container); |
| | | } |
| | | } |
| | | }; |
| | |
| | | type: "string", |
| | | width: 120, |
| | | align: "left", |
| | | formatter: (row) => { |
| | | if (!row.requestParam) return '-'; |
| | | const preview = row.requestParam.length > 50 |
| | | ? row.requestParam.substring(0, 50) + '...' |
| | | : row.requestParam; |
| | | return `<span style="color: #409EFF; cursor: pointer;">${preview}</span>`; |
| | | } |
| | | }, |
| | | { |
| | | field: "responseParam", |
| | |
| | | type: "string", |
| | | width: 120, |
| | | align: "left", |
| | | formatter: (row) => { |
| | | if (!row.responseParam) return '-'; |
| | | const preview = row.responseParam.length > 50 |
| | | ? row.responseParam.substring(0, 50) + '...' |
| | | : row.responseParam; |
| | | return `<span style="color: #409EFF; cursor: pointer;">${preview}</span>`; |
| | | } |
| | | }, |
| | | { |
| | | field: "exceptionInfo", |
| | |
| | | overlay: false |
| | | } |
| | | }, |
| | | optimizeDeps: { |
| | | include: ['vue3-json-viewer'] |
| | | }, |
| | | build: { |
| | | sourcemap: false, |
| | | chunkSizeWarningLimit: 1200, |
| | |
| | | /// æ è¯ä»»å¡ä¸ºå
¥åºä½ä¸ç±»åã |
| | | /// </remarks> |
| | | public const short WorkTypeInbound = 1; |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸ç±»å - åºåº |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ è¯ä»»å¡ä¸ºåºåºä½ä¸ç±»åã |
| | | /// </remarks> |
| | | public const short WorkTypeOutbound = 2; |
| | | } |
| | | } |
| | |
| | | try |
| | | { |
| | | // åå¨è¯·æ±æ°æ® |
| | | requestParam = RequestDataLog(context); |
| | | requestParam = await RequestDataLog(context); |
| | | context.Request.Body.Position = 0; |
| | | } |
| | | catch { } |
| | |
| | | try |
| | | { |
| | | // åå¨ååºæ°æ® |
| | | responseParam = ResponseDataLog(context.Response); |
| | | responseParam = await ResponseDataLog(context.Response); |
| | | } |
| | | catch { } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | private string RequestDataLog(HttpContext context) |
| | | private async Task<string> RequestDataLog(HttpContext context) |
| | | { |
| | | var request = context.Request; |
| | | var sr = new StreamReader(request.Body); |
| | |
| | | object obj = new |
| | | { |
| | | QueryString = request.QueryString.ToString(), |
| | | BodyData = sr.ReadToEndAsync().Result |
| | | BodyData = JsonConvert.DeserializeObject( await sr.ReadToEndAsync()) |
| | | }; |
| | | |
| | | string data = JsonConvert.SerializeObject(obj); |
| | |
| | | return data; |
| | | } |
| | | |
| | | private string ResponseDataLog(HttpResponse response) |
| | | private async Task<string> ResponseDataLog(HttpResponse response) |
| | | { |
| | | response.Body.Position = 0; |
| | | using StreamReader stream = new StreamReader(response.Body, leaveOpen: true); |
| | | string body = stream.ReadToEnd(); |
| | | string body = await stream.ReadToEndAsync(); |
| | | response.Body.Position = 0; |
| | | return body; |
| | | } |
| | |
| | | if (Communicator is SiemensS7) |
| | | { |
| | | if (!IsConnected) throw new Exception($"éè®¯è¿æ¥é误ï¼è¯·æ£æ¥ç½ç»"); |
| | | DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); |
| | | DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceProParamName == "InputTaskNum")/*.OrderBy(x=>x.DeviceProOffset)*/.FirstOrDefault(); |
| | | if (devicePro == null) |
| | | { |
| | | return false; |
| | |
| | | // - æèä¸æç©æï¼RobotArmObject == 1ï¼ |
| | | // - ä»»å¡ç¶æä¸º RobotPickFinishï¼å·²è®°å½åè´§å®æï¼ |
| | | if ((latestState.CurrentAction == "PickFinished" || latestState.CurrentAction == "AllPickFinished") |
| | | && latestState.RobotArmObject == 0 |
| | | && latestState.RobotArmObject == 1 |
| | | && task.RobotTaskState == TaskRobotStatusEnum.RobotPickFinish.GetHashCode()) |
| | | { |
| | | _logger.LogInformation("ExecuteAsyncï¼æ»¡è¶³æ¾è´§æ¡ä»¶ï¼å¼å§å¤çåè´§å®æï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | |
| | | |
| | | // ========== æ£æ¥æ¯å¦å¯ä»¥åéæ°ä»»å¡ ========== |
| | | //if (!commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs)) |
| | | if (commonStackerCrane.StackerCraneStatusValue != StackerCraneStatus.Normal) |
| | | if (commonStackerCrane.StackerCraneStatusValue != StackerCraneStatus.Normal /*&& commonStackerCrane.StackerCraneAutoStatusValue != StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneWorkStatusValue != StackerCraneWorkStatus.Standby*/) |
| | | { |
| | | // å åæºä¸å¯ç¨ï¼å¦æ£å¨æ§è¡ä¸ä¸ä»»å¡ï¼ï¼ç´æ¥è¿å |
| | | _logger.LogDebug("Executeï¼å åæºä¸å¯ç¨ï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | QuartzLogger.Debug($"å åæºä¸å¯ç¨ï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | //_logger.LogDebug("Executeï¼å åæºä¸å¯ç¨ï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | //QuartzLogger.Debug($"å åæºä¸å¯ç¨ï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | |
| | | public class StackerCraneTaskCommand : DeviceCommand |
| | | { |
| | | /// <summary> |
| | | /// ä½ä¸å½ä»¤ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ§å¶å åæºçå¨ä½ï¼ |
| | | /// - 1: å¼å§æ§è¡ä»»å¡ |
| | | /// - 2: ä»»å¡å®æ/忢 |
| | | /// - 3: æ¶é²ä»»å¡å¼å§ |
| | | /// </remarks> |
| | | public short WorkAction { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ä»»å¡å· |
| | | /// </summary> |
| | | /// <remarks> |
| | |
| | | /// åºåºæ¶è¡¨ç¤ºè´§ç©ä»åªä¸ªä½ç½®ååºã |
| | | /// </remarks> |
| | | public short EndLayer { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸å½ä»¤ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ§å¶å åæºçå¨ä½ï¼ |
| | | /// - 1: å¼å§æ§è¡ä»»å¡ |
| | | /// - 2: ä»»å¡å®æ/忢 |
| | | /// - 3: æ¶é²ä»»å¡å¼å§ |
| | | /// </remarks> |
| | | public short WorkAction { get; set; } |
| | | } |
| | | } |
| | |
| | | //QuartzLogger.Info($"å¼å§éæ©ä»»å¡ï¼è®¾å¤: {deviceCode}ï¼ä¸ä¸ä»»å¡ç±»å: {commonStackerCrane.LastTaskType}", deviceCode); |
| | | |
| | | // æ ¹æ®ä¸ä¸ä»»å¡ç±»åå³å®æ¥è¯¢çç¥ |
| | | if (commonStackerCrane.LastTaskType == null) |
| | | if (commonStackerCrane.LastTaskType == null || commonStackerCrane.LastTaskType == TaskRelocationTypeEnum.Relocation.GetHashCode()) |
| | | { |
| | | // 没æä¸ä¸ä»»å¡ç±»åï¼æ¥è¯¢æ®éä»»å¡ |
| | | candidateTask = _taskService.QueryStackerCraneTask(deviceCode); |
| | |
| | | |
| | | // æ£æ¥ç«å°æ¯å¦è¢«å ç¨ |
| | | bool isOccupied = conveyorLine.IsOccupied(router.ChildPosi); |
| | | _logger.LogInformation("IsOutTaskStationAvailableï¼ç«å° {ChildPosi}ï¼æ¯å¦è¢«å ç¨: {IsOccupied}ï¼ä»»å¡å·: {TaskNum}", router.ChildPosi, isOccupied, task.TaskNum); |
| | | QuartzLogger.Info($"IsOutTaskStationAvailableï¼ç«å° {router.ChildPosi}ï¼æ¯å¦è¢«å ç¨: {isOccupied}", task.Roadway); |
| | | _logger.LogInformation("IsOutTaskStationAvailableï¼ç«å° {ChildPosi}ï¼æ¯å¦è¢«å ç¨: {IsOccupied}ï¼ä»»å¡å·: {TaskNum}", router.ChildPosi, !isOccupied, task.TaskNum); |
| | | QuartzLogger.Info($"IsOutTaskStationAvailableï¼ç«å° {router.ChildPosi}ï¼æ¯å¦è¢«å ç¨: {!isOccupied}", task.Roadway); |
| | | |
| | | return isOccupied; |
| | | } |
| | |
| | | import { h, createApp } from 'vue'; |
| | | import { ElDrawer, ElIcon } from 'element-plus'; |
| | | import { createApp } from 'vue'; |
| | | import { ElDrawer } from 'element-plus'; |
| | | import { JsonViewer } from 'vue3-json-viewer'; |
| | | import 'vue3-json-viewer/dist/vue3-json-viewer.css'; |
| | | |
| | | let extension = { |
| | | components: { |
| | |
| | | const jsonContent = type === 'request' ? row.requestJson : row.responseJson; |
| | | const title = type === 'request' ? 'ð è¯·æ± JSON' : 'ð¥ ååº JSON'; |
| | | |
| | | // æ ¼å¼å JSON |
| | | let formattedJson = ''; |
| | | // è§£æ JSON 对象ï¼è§£æå¤±è´¥åä¿çåå§å符串 |
| | | let jsonData; |
| | | try { |
| | | const obj = typeof jsonContent === 'string' ? JSON.parse(jsonContent) : jsonContent; |
| | | formattedJson = JSON.stringify(obj, null, 2); |
| | | jsonData = typeof jsonContent === 'string' ? JSON.parse(jsonContent) : jsonContent; |
| | | } catch (e) { |
| | | formattedJson = String(jsonContent); |
| | | jsonData = String(jsonContent); |
| | | } |
| | | |
| | | // å建临æ¶å®¹å¨æ¸²ææ½å± |
| | |
| | | |
| | | const app = createApp({ |
| | | render() { |
| | | return h('div', [ |
| | | h(ElDrawer, { |
| | | modelValue: true, |
| | | 'onUpdate:modelValue': (val) => { |
| | | const onClose = (val) => { |
| | | if (!val) { |
| | | app.unmount(); |
| | | document.body.removeChild(container); |
| | | } |
| | | }, |
| | | title: title, |
| | | size: '30%', |
| | | destroyOnClose: true, |
| | | closeOnClickModal: true |
| | | }, { |
| | | default: () => h('div', { |
| | | style: { |
| | | height: '100%', |
| | | backgroundColor: '#f5f5f5', |
| | | padding: '16px', |
| | | borderRadius: '4px' |
| | | } |
| | | }, [ |
| | | h('pre', { |
| | | style: { |
| | | margin: '0', |
| | | fontSize: '14px', |
| | | lineHeight: '1.5', |
| | | fontFamily: 'Consolas, Monaco, "Courier New", monospace', |
| | | whiteSpace: 'pre-wrap', |
| | | wordBreak: 'break-all' |
| | | } |
| | | }, formattedJson) |
| | | ]) |
| | | }) |
| | | ]); |
| | | }; |
| | | return ( |
| | | <div> |
| | | <ElDrawer |
| | | modelValue={true} |
| | | onUpdate:modelValue={onClose} |
| | | title={title} |
| | | size="30%" |
| | | destroyOnClose={true} |
| | | closeOnClickModal={true} |
| | | > |
| | | <JsonViewer |
| | | value={jsonData} |
| | | expanded={true} |
| | | expandDepth={5} |
| | | copyable={true} |
| | | sort={false} |
| | | theme="light" |
| | | /> |
| | | </ElDrawer> |
| | | </div> |
| | | ); |
| | | } |
| | | }); |
| | | |
| | | app.use(window.ElementPlus); |
| | | app.component('JsonViewer', JsonViewer); |
| | | app.mount(container); |
| | | }, |
| | | } |
| | |
| | | import { h, createApp } from 'vue'; |
| | | import { createApp } from 'vue'; |
| | | import { ElDrawer } from 'element-plus'; |
| | | import { JsonViewer } from 'vue3-json-viewer'; |
| | | import 'vue3-json-viewer/dist/vue3-json-viewer.css'; |
| | | |
| | | let extension = { |
| | | components: { |
| | |
| | | const content = type === 'request' ? row.requestParam : row.responseParam; |
| | | const title = type === 'request' ? 'ð 请æ±åæ°' : 'ð¥ ååºåæ°'; |
| | | |
| | | // æ ¼å¼å JSON |
| | | let formattedJson = ''; |
| | | // è§£æ JSON 对象ï¼è§£æå¤±è´¥åä¿çåå§å符串 |
| | | let jsonData; |
| | | try { |
| | | const obj = typeof content === 'string' ? JSON.parse(content) : content; |
| | | formattedJson = JSON.stringify(obj, null, 2); |
| | | jsonData = typeof content === 'string' ? JSON.parse(content) : content; |
| | | } catch (e) { |
| | | formattedJson = String(content); |
| | | jsonData = String(content); |
| | | } |
| | | |
| | | // å建临æ¶å®¹å¨æ¸²ææ½å± |
| | |
| | | |
| | | const app = createApp({ |
| | | render() { |
| | | return h('div', [ |
| | | h(ElDrawer, { |
| | | modelValue: true, |
| | | 'onUpdate:modelValue': (val) => { |
| | | const onClose = (val) => { |
| | | if (!val) { |
| | | app.unmount(); |
| | | document.body.removeChild(container); |
| | | } |
| | | }, |
| | | title: title, |
| | | size: '30%', |
| | | destroyOnClose: true, |
| | | closeOnClickModal: true |
| | | }, { |
| | | default: () => h('div', { |
| | | style: { |
| | | height: '30%', |
| | | backgroundColor: '#f5f5f5', |
| | | padding: '16px', |
| | | borderRadius: '4px' |
| | | } |
| | | }, [ |
| | | h('pre', { |
| | | style: { |
| | | margin: '0', |
| | | fontSize: '14px', |
| | | lineHeight: '1.5', |
| | | fontFamily: 'Consolas, Monaco, "Courier New", monospace', |
| | | whiteSpace: 'pre-wrap', |
| | | wordBreak: 'break-all' |
| | | } |
| | | }, formattedJson) |
| | | ]) |
| | | }) |
| | | ]); |
| | | }; |
| | | return ( |
| | | <div> |
| | | <ElDrawer |
| | | modelValue={true} |
| | | onUpdate:modelValue={onClose} |
| | | title={title} |
| | | size="30%" |
| | | destroyOnClose={true} |
| | | closeOnClickModal={true} |
| | | > |
| | | <JsonViewer |
| | | value={jsonData} |
| | | expanded={true} |
| | | expandDepth={5} |
| | | copyable={true} |
| | | sort={false} |
| | | theme="light" |
| | | /> |
| | | </ElDrawer> |
| | | </div> |
| | | ); |
| | | } |
| | | }); |
| | | |
| | | app.use(window.ElementPlus); |
| | | app.component('JsonViewer', JsonViewer); |
| | | app.mount(container); |
| | | } |
| | | } |
| | |
| | | port: 8080, |
| | | open: false |
| | | }, |
| | | optimizeDeps: { |
| | | include: ['vue3-json-viewer'] |
| | | }, |
| | | build: { |
| | | sourcemap: false |
| | | } |
| | |
| | | /// </summary> |
| | | [Description("ç¹å¤§æç")] |
| | | ExtraPallet = 4, |
| | | |
| | | /// <summary> |
| | | /// åæç©ºæç |
| | | /// </summary> |
| | | [Description("åæç©ºæç")] |
| | | HCTrayPallet = 5, |
| | | |
| | | /// <summary> |
| | | /// åæå容æç |
| | | /// </summary> |
| | | [Description("åæå容æç")] |
| | | HCFRPallet = 6, |
| | | } |
| | | } |
| | |
| | | try |
| | | { |
| | | // åå¨è¯·æ±æ°æ® |
| | | requestParam = RequestDataLog(context); |
| | | requestParam = await RequestDataLogAsync(context); |
| | | context.Request.Body.Position = 0; |
| | | } |
| | | catch { } |
| | |
| | | try |
| | | { |
| | | // åå¨ååºæ°æ® |
| | | responseParam = ResponseDataLog(context.Response); |
| | | responseParam = await ResponseDataLogAsync(context.Response); |
| | | } |
| | | catch { } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | private string RequestDataLog(HttpContext context) |
| | | private async Task<string> RequestDataLogAsync(HttpContext context) |
| | | { |
| | | var request = context.Request; |
| | | //request.EnableBuffering(); |
| | | //request.Body.Position = 0; |
| | | |
| | | var sr = new StreamReader(request.Body); |
| | | var sr = new StreamReader(request.Body, Encoding.UTF8); |
| | | |
| | | object obj; |
| | | string bodyData = sr.ReadToEndAsync().Result; |
| | | string bodyData = await sr.ReadToEndAsync(); |
| | | if (request.ContentLength <= 100000) |
| | | { |
| | | obj = new |
| | | { |
| | | QueryString = request.QueryString.ToString(), |
| | | BodyData = bodyData |
| | | BodyData = JsonConvert.DeserializeObject(bodyData) |
| | | //BodyData = bodyData |
| | | }; |
| | | } |
| | | else |
| | |
| | | return data; ; |
| | | } |
| | | |
| | | private string ResponseDataLog(HttpResponse response) |
| | | private async Task<string> ResponseDataLogAsync(HttpResponse response) |
| | | { |
| | | if (response.ContentLength <= 100000) |
| | | { |
| | | response.Body.Position = 0; |
| | | using StreamReader stream = new StreamReader(response.Body, leaveOpen: true); |
| | | string body = stream.ReadToEnd(); |
| | | using StreamReader stream = new StreamReader(response.Body, Encoding.UTF8, leaveOpen: true); |
| | | string body = await stream.ReadToEndAsync(); |
| | | response.Body.Position = 0; |
| | | return body; |
| | | } |
| | |
| | | return result ? content.OK("ç»çæå") : content.Error("ç»ç失败"); |
| | | } |
| | | |
| | | int WarehouseId = stock.Roadway switch |
| | | { |
| | | "注液ç»çæºæ¢°æ" => (await _warehouseService.Db.Queryable<Dt_Warehouse>().FirstAsync(w => w.WarehouseCode == "GWSC1")).WarehouseId, |
| | | "æ¢çæºæ¢°æ" => (await _warehouseService.Db.Queryable<Dt_Warehouse>().FirstAsync(w => w.WarehouseCode == "HCSC1")).WarehouseId |
| | | }; |
| | | |
| | | var entity = new Dt_StockInfo |
| | | { |
| | | PalletCode = stock.TargetPalletNo, |
| | | WarehouseId = stock.Roadway == "注液ç»çæºæ¢°æ" ? (await _warehouseService.Db.Queryable<Dt_Warehouse>().FirstAsync(w => w.WarehouseCode == "GW1")).WarehouseId : 0, |
| | | WarehouseId = WarehouseId, |
| | | StockStatus = StockStatusEmun.ç»çæå.GetHashCode(), |
| | | Creater = StockConstants.SYSTEM_USER, |
| | | Details = details |
| | |
| | | NextAddress = TaskAddressConstants.DEFAULT_ADDRESS, |
| | | TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS, |
| | | Roadway = stock.LocationDetails.RoadwayNo, |
| | | TaskType = TaskTypeEnum.Outbound.GetHashCode(), |
| | | TaskStatus = TaskStatusEnum.New.GetHashCode(), |
| | | TaskType = TaskOutboundTypeEnum.Outbound.GetHashCode(), |
| | | TaskStatus = TaskOutStatusEnum.OutNew.GetHashCode(), |
| | | Grade = 1, |
| | | TaskNum = await BaseDal.GetTaskNo(), |
| | | Creater = "system", |
| | |
| | | TaskType = TaskOutboundTypeEnum.OutEmpty.GetHashCode(), |
| | | TaskStatus = TaskStatusEnum.New.GetHashCode(), |
| | | Grade = 1, |
| | | Dispatchertime = DateTime.Now, |
| | | TaskNum = await BaseDal.GetTaskNo(), |
| | | Creater = "system", |
| | | }; |
| | |
| | | |
| | | location.LocationStatus = LocationStatusEnum.Free.GetHashCode(); |
| | | |
| | | task.TaskStatus = TaskOutStatusEnum.OutFinish.GetHashCode(); |
| | | |
| | | var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); |
| | | var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); |
| | | if (!updateLocationResult || !updateStockResult) |