1
hutongqing
2025-01-08 413f243b73ef073f4ac83889fda2f5bf6d1e727c
1
已删除8个文件
已修改56个文件
已添加19个文件
2477 ■■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/taskExecuteDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue 137 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/4b19083a-8625-44e6-abf9-57afb81eb2ae.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/8e07ae55-a2e7-4407-b10c-4a5a0c8d3f3a.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/ccde3d97-2f8a-4b5d-8f51-c9c973f8e004.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/read.lock 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/ConveyorWorkTypeEnum.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/W_ConveyorLineDBName.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/ConveyorLineJob_GM.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/干膜仓/StackerCraneJob_GM.cs 123 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/ConveyorLineJob_BC.cs 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/板材仓/StackerCraneJob_BC.cs 212 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/测试架仓/StackerCraneJob_CSJ.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/record/locationStatusChangeRecord.vue 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/record/stockQuantityChangeRecord.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/0533fbe9-c978-41ba-a3ad-5b6c54002ad8.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/169371da-5bcd-4f62-bffa-65387df1ce50.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/339ccc6a-95ea-4f78-8616-45299be9dd90.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/4b4ce8f6-d231-4356-8904-ece35b20d64d.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/51bc4fd8-adae-43fe-aa0e-8971136a692a.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/ad2b9174-0600-4c25-b074-3f17231855fc.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/c1f85c39-42dc-41e9-adff-a1cd854fb661.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d25efbec-11d1-4ce7-a481-6187db1d5fbb.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/f1ba7a1a-5550-4f7c-abf4-712c6fab55a2.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/read.lock 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/BasicService.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/MesOutboundOrderType.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/BaseServices/ServiceBase.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/Extensions/HttpContextExtension.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/Extensions/SwaggerContextExtension.cs 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/Extensions/WebSocketSetup.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/HttpContextUser/AspNetUser.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/LambdaExtensions.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MESRoot.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/RootList.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/SubstrateModel.cs 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/TestToolModel.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockViewDTO.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Task/WCSTaskDTO.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Task/WMSTaskDTO.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/WIDESEA_DTO.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IBasicService.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IMesOutboundOrderRepository.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesOutboundOrderService.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_ApiInfo.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielCodeInfo.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_PalletCodeInfo.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_PalletTypeInfo.cs 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_UserInfo.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrderDetail_Hty.cs 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrder_Hty.cs 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_PurchaseOrder.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_MesOutboundOrder.cs 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrderDetail_Hty.cs 107 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder_Hty.cs 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfoDetail_Hty.cs 91 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo_Hty.cs 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/System/Sys_Log.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task_Hty.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/WIDESEA_Model.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/MesOutboundOrderRepository.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesOutboundOrderService.cs 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_RecordService/Service/StockQuantityChangeRecordService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/ERP/ErpController.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/System/Sys_UserController.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/taskExecuteDetail.vue
@@ -113,7 +113,7 @@
      showDetialBox: false,
      row: {},
      steps: [],
      viewType: 1,
      viewType: 2,
      height: "200px",
      tableData: [],
      previousShow: false,
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue
@@ -5,7 +5,8 @@
 *业务请在@/extension/system/Sys_Log.js此处编写
 -->
<template>
    <view-grid ref="grid"
  <view-grid
    ref="grid"
               :columns="columns"
               :detail="detail"
               :editFormFields="editFormFields"
@@ -13,7 +14,8 @@
               :searchFormFields="searchFormFields"
               :searchFormOptions="searchFormOptions"
               :table="table"
               :extend="extend">
    :extend="extend"
  >
    </view-grid>
</template>
<script>
@@ -22,38 +24,122 @@
    export default defineComponent({
        setup() {
            const table = ref({
                key: 'Id',
      key: "Id",
                footer: "Foots",
                cnName: '系统日志',
                name: 'Sys_Log',
      cnName: "系统日志",
      name: "Sys_Log",
                url: "/Sys_Log/",
                sortName: "Id"
      sortName: "Id",
            });
            const editFormFields = ref({});
            const editFormOptions = ref([]);
            const searchFormFields = ref({"BeginDate":"","Url":"","LogType":[],"Success":[],"UserIP":"","ServiceIP":"","Role_Id":""});
            const searchFormOptions = ref([[{"title":"请求地址","field":"Url","type":"text"},{"title":"用户IP","field":"UserIP","type":"text"},{"title":"服务器IP","field":"ServiceIP","type":"text"}],[{"title":"开始时间","field":"BeginDate","type":"datetime"},{"dataKey":"restatus","data":[],"title":"响应状态","field":"Success","type":"selectList"},{"dataKey":"roles","data":[],"title":"角色ID","field":"Role_Id","type":"select"}],[{"dataKey":"log","data":[],"title":"日志类型","field":"LogType","colSize":12,"type":"checkbox"}]]);
            const columns = ref([{field:'Id',title:'Id',type:'int',width:90,hidden:true,readonly:true,require:true,align:'left'},
                       {field:'BeginDate',title:'开始时间',type:'datetime',width:140,align:'left',sortable:true},
                       {field:'UserName',title:'用户名称',type:'string',width:90,align:'left'},
                       {field:'Url',title:'请求地址',type:'string',width:110,align:'left'},
                       {field:'LogType',title:'日志类型',type:'string',bind:{ key:'log',data:[]},width:80,align:'left'},
                       {field:'Success',title:'响应状态',type:'int',bind:{ key:'restatus',data:[]},width:80,align:'left'},
                       {field:'ElapsedTime',title:'时长',type:'int',width:60,align:'left'},
                       {field:'RequestParameter',title:'请求参数',type:'string',width:70,align:'left'},
                       {field:'ResponseParameter',title:'响应参数',type:'string',width:70,align:'left'},
                       {field:'ExceptionInfo',title:'异常信息',type:'string',width:70,align:'left'},
                       {field:'UserIP',title:'用户IP',type:'string',width:90,align:'left'},
                       {field:'ServiceIP',title:'服务器IP',type:'string',width:90,hidden:true,align:'left'},
                       {field:'BrowserType',title:'浏览器类型',type:'string',width:90,align:'left'},
                       {field:'User_Id',title:'用户ID',type:'int',width:90,hidden:true,align:'left'},
                       {field:'Role_Id',title:'角色ID',type:'int',bind:{ key:'roles',data:[]},width:90,hidden:true,align:'left'},
                       {field:'EndDate',title:'结束时间',type:'datetime',width:150,hidden:true,align:'left',sortable:true}]);
    const searchFormFields = ref({
      url: "",
      requestParam: "",
      responseParam: "",
      beginDate: "",
    });
    const searchFormOptions = ref([
      [
        { title: "请求地址", field: "url", type: "like" },
        { title: "请求参数", field: "requestParam", type: "like" },
        { title: "响应参数", field: "responseParam", type: "like" },
      ],
      [{ title: "开始时间", field: "beginDate", type: "datetime" }],
    ]);
    const columns = ref([
      {
        field: "id",
        title: "Id",
        type: "int",
        width: 90,
        hidden: true,
        readonly: true,
        require: true,
        align: "left",
      },
      {
        field: "beginDate",
        title: "开始时间",
        type: "datetime",
        width: 140,
        align: "left",
        sortable: true,
      },
      {
        field: "elapsedTime",
        title: "时长",
        type: "int",
        width: 60,
        align: "left",
      },
      {
        field: "endDate",
        title: "结束时间",
        type: "datetime",
        width: 150,
        hidden: true,
        align: "left",
        sortable: true,
      },
      {
        field: "requestParam",
        title: "请求参数",
        type: "string",
        width: 70,
        align: "left",
      },
      {
        field: "responseParam",
        title: "响应参数",
        type: "string",
        width: 70,
        align: "left",
      },
      {
        field: "url",
        title: "请求地址",
        type: "string",
        width: 110,
        align: "left",
      },
      {
        field: "userName",
        title: "用户名称",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "success",
        title: "响应状态",
        type: "int",
        bind: { key: "restatus", data: [] },
        width: 80,
        align: "left",
        hidden: true,
      },
      {
        field: "userIP",
        title: "用户IP",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "userId",
        title: "用户ID",
        type: "int",
        width: 90,
        hidden: true,
        align: "left",
      },
    ]);
            const detail = ref({
                cnName: "#detailCnName",
                columns: [],
                sortName: "",
                key: ""
      key: "",
            });
            return {
                table,
@@ -68,3 +154,4 @@
        },
    });
</script>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
@@ -152,7 +152,6 @@
        type: "string",
        width: 90,
        align: "left",
        hidden: true,
      },
      {
        field: "grade",
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/4b19083a-8625-44e6-abf9-57afb81eb2ae.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/8e07ae55-a2e7-4407-b10c-4a5a0c8d3f3a.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/ccde3d97-2f8a-4b5d-8f51-c9c973f8e004.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/read.lock
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/ConveyorWorkTypeEnum.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Common
{
    public enum ConveyorWorkTypeEnum
    {
        Undefined = 0,
        Inbound = 1,
        Outbound = 2
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -27,7 +27,7 @@
namespace WIDESEAWCS_Model.Models
{
    [SugarTable(nameof(Dt_Task), "任务信息")]
    [SugarTable(nameof(Dt_Task), "任务信息"), SugarIndex("unique_task_taskNum", nameof(TaskNum), OrderByType.Asc, true)]
    public class Dt_Task : BaseEntity
    {
        /// <summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs
@@ -29,6 +29,7 @@
        {
            _httpContextAccessor = httpContextAccessor;
        }
        [HttpPost, Route("swgLogin"), AllowAnonymous]
        public dynamic SwgLogin([FromBody] SwaggerLoginRequest loginRequest)
        {
@@ -39,21 +40,9 @@
            try
            {
                LoginInfo loginInfo = new LoginInfo
                {
                    Password = loginRequest.pwd,
                    UserName = loginRequest.name
                };
                var result = Service.Login(loginInfo);
                if (result.Status)
                if (loginRequest.name == "admin" && loginRequest.pwd == $"admin!{DateTime.Now.ToString("yyyyMMdd")}")
                {
                    HttpContext.SuccessSwagger();
                    Dictionary<string, object>? dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(result.Data.Serialize());
                    if (dict != null)
                    {
                        HttpContext.SuccessSwaggerJwt((dict.ContainsKey("token") ? dict["token"].ToString() : "") ?? "");
                    }
                    string str = HttpContext.GetSuccessSwaggerJwt();
                    return new { result = true };
                }
            }
@@ -64,6 +53,7 @@
            return new { result = false };
        }
        [HttpPost, Route("login"), AllowAnonymous]
        public IActionResult Login([FromBody] LoginInfo loginInfo)
        {
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/W_ConveyorLineDBName.cs
@@ -51,12 +51,12 @@
        /// <summary>
        /// é¢„ç•™1
        /// </summary>
        Sapre1,
        Spare1,
        /// <summary>
        /// é¢„ç•™2
        /// </summary>
        Sapre2,
        Spare2,
        /// <summary>
        /// è¯·æ±‚信号
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/ConveyorLineJob_GM.cs
@@ -86,7 +86,7 @@
                        }
                        else if (item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt())
                        {
                            if(conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK)
                            if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK)//入库
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.NextAddress == item.StackerCraneCode);
                                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
@@ -114,6 +114,7 @@
                                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"系统自动流程,目标地址由{oldAddress}变更为{task.NextAddress},任务状态由{oldStatus}变更为{task.TaskState}");
                                    device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt());
                                    device.SetValue(W_ConveyorLineDB.ACK, true);
                                }
                            }
@@ -154,12 +155,14 @@
                                        device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum);
                                        device.SetValue(W_ConveyorLineDB.EndPos, task.NextAddress);
                                        device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress);
                                        device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt());
                                        device.SetValue(W_ConveyorLineDB.STB, true);
                                    }
                                }
                                else if(conveyorLineSignalWrite.STB && conveyorLineSignalRead.ACK && conveyorLineStatus.Goods)
                                {
                                    //todo ä»»åŠ¡å®Œæˆ
                                    _taskService.TaskCompleted(conveyorLineInfoRead.TaskNum);
                                    device.SetValue(W_ConveyorLineDB.STB, false);
                                }
                            }
                        }
@@ -170,9 +173,19 @@
                                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskState == TaskStatusEnum.New.ObjToInt() && string.IsNullOrEmpty(x.TargetAddress) && x.SourceAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType));
                                if(task != null)
                                {
                                    //todo è¾“送线工作模式需要判断
                                    device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt());
                                    device.SetValue(W_ConveyorLineDB.STB, true);
                                }
                            }
                            else if (conveyorLineSignalWrite.STB && conveyorLineSignalRead.ACK && !conveyorLineStatus.Alarm)
                            {
                                device.SetValue(W_ConveyorLineDB.STB, false);
                            }
                            else if (!conveyorLineSignalRead.STB && conveyorLineSignalWrite.ACK && !conveyorLineStatus.Alarm)
                            {
                                device.SetValue(W_ConveyorLineDB.ACK, false);
                            }
                        }
                    }
                    else
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸ÉĤ²Ö/StackerCraneJob_GM.cs
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Components.Routing;
using Newtonsoft.Json;
using Quartz;
using System;
using System.Collections.Generic;
@@ -6,7 +7,9 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
@@ -20,32 +23,50 @@
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
using WIDESEAWCS_Tasks.HoisterJob;
using WIDESEAWCS_Tasks.StackerCraneJob;
using WIDESEAWCS_Core.Caches;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class StackerCraneJob_GM : JobBase, IJob
    {
        private readonly ICacheService _cacheService;
        private readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskRepository _taskRepository;
        private readonly IRouterService _routerService;
        private readonly IStationMangerRepository _stationMangerRepository;
        private List<Dt_ApiInfo> apiInfos;
        public StackerCraneJob_GM(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository)
        public StackerCraneJob_GM(ITaskService taskService, ICacheService cacheService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskRepository = taskRepository;
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
            _cacheService = cacheService;
            string? apiInfoStr = _cacheService.Get("apiInfos");
            if (!string.IsNullOrEmpty(apiInfoStr))
            {
                List<Dt_ApiInfo>? infos = JsonConvert.DeserializeObject<List<Dt_ApiInfo>>(apiInfoStr);
                if (infos == null || infos.Count == 0)
                {
                    apiInfos = new List<Dt_ApiInfo>();
                }
                else
                {
                    apiInfos = infos;
                }
            }
        }
        public Task Execute(IJobExecutionContext context)
        {
            CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
            try
            {
                CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
                if (commonStackerCrane != null)
                {
                    if (!commonStackerCrane.IsEventSubscribed)
@@ -67,8 +88,8 @@
                                    commonStackerCrane.LastTaskType = task.TaskType;
                                    int oldState = task.TaskState;
                                    task.TaskState = TaskStatusEnum.SC_Executing.ObjToInt();
                                    task.ExceptionMessage = "";
                                    task.Dispatchertime = DateTime.Now;
                                    task.ExceptionMessage = "";
                                    _taskRepository.UpdateData(task);
                                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"系统自动流程,任务状态从【{oldState}】转到【{task.TaskState}】");
                                }
@@ -79,7 +100,7 @@
            }
            catch (Exception ex)
            {
                WriteError(commonStackerCrane.DeviceName, ex.Message, ex);
                WriteError(nameof(CommonStackerCraneJob), ex.Message, ex);
            }
            return Task.CompletedTask;
        }
@@ -92,30 +113,63 @@
        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e)
        {
            CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane;
            try
            {
                if (commonStackerCrane != null)
                {
                    if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5)
                    {
                        WriteInfo(commonStackerCrane.DeviceName, $"读取到任务完成信号,{e.TaskNum}");
                        Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == e.TaskNum);
                        if (task != null)
                        {
                            _taskService.TaskCompleted(e.TaskNum);
                        }
                        else
                        {
                            WriteInfo(commonStackerCrane.DeviceName, $"读取到任务完成信号,未找到对应的任务信息,{e.TaskNum}");
                        }
                    StackerCraneTaskCompleted(e.TaskNum, commonStackerCrane.DeviceCode);
                        commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
                    }
                }
            }
        public WebResponseContent StackerCraneTaskCompleted(int taskNum, string deviceCode)
        {
            try
            {
                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null)
                {
                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                    {
                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StackerCraneStationCode == task.NextAddress);
                        if (stationManger == null)
                        {
                            _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"AGV站点未配置,{task.NextAddress}");
                            _taskService.UpdateTaskExceptionMessage(taskNum, $"AGV站点未配置,{task.NextAddress}");
                            return WebResponseContent.Instance.Error($"AGV站点未配置,{task.NextAddress}");
                        }
                        int oldStatus = task.TaskState;
                        task.DeviceCode = "AGV_CSJ";
                        task.TaskState = TaskStatusEnum.AGV_Execute.ObjToInt();
                        task.CurrentAddress = stationManger.AGVStationCode;
                        task.NextAddress = task.TargetAddress;
                        _taskRepository.UpdateData(task);
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"系统自动流程,,任务状态从【{oldStatus}】转到【{task.TaskState}】");
                    }
                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup || task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
                    {
                        _taskService.TaskCompleted(taskNum);
                    }
                    else
                    {
                        WriteInfo(deviceCode, $"未找到该任务类型回调WMS任务完成接口,{task.TaskType}");
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"未找到该任务类型回调WMS任务完成接口,{task.TaskType}");
                        _taskService.UpdateTaskExceptionMessage(taskNum, $"未找到该任务类型回调WMS任务完成接口,{task.TaskType}");
                    }
                }
                else
                {
                    WriteInfo(deviceCode, $"未找到任务信息,任务号:{taskNum}");
                    return WebResponseContent.Instance.Error($"未找到任务信息,任务号:{taskNum}");
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                WriteError(commonStackerCrane?.DeviceCode ?? nameof(StackerCraneJob_YM), ex.Message, ex);
                WriteError(deviceCode, $"任务完成错误", ex);
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
@@ -153,23 +207,37 @@
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                if (OutTaskStationIsOccupied(task) != null || true)
                if (OutTaskStationIsOccupied(task) == null)
                {
                    return task;
                }
                else
                {
                    bool flag = false;
                    List<string> otherOutStaionCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress).Select(x => x.ChildPosi).ToList();
                    List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStaionCodes);
                    foreach (var item in tasks)
                    {
                        if (OutTaskStationIsOccupied(task) != null)
                        {
                            return task;
                            flag = true;
                            break;
                        }
                    }
                    if (!flag)
                    {
                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
                }
                }
            }
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.FeedBackWMSTaskCompleted.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url))
                {
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"未找到WMS移库判断接口");
                    WriteInfo(commonStackerCrane.DeviceCode, $"未找到WMS移库判断接口");
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到WMS移库判断接口");
                    return null;
                }
                HttpHelper.Post($"{url}?taskNum={task.TaskNum}&locationCode={task.NextAddress}", "");//todo è°ƒç”¨WMS任务完成方法
            }
            return task;
@@ -182,7 +250,7 @@
        /// <returns>如果未被占用,返回传入的任务信息,否则,返回null</returns>
        private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task)
        {
            Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.TargetAddress && x.StackerCraneCode == task.DeviceCode);
            Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.NextAddress && x.StackerCraneCode == task.DeviceCode);
            if (stationManger != null)
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode);
@@ -193,16 +261,19 @@
                    {
                        task.NextAddress = stationManger.StackerCraneStationCode;
                        _taskRepository.UpdateData(task);
                        client.SetValue(GroundStationDBName.R_IsCanPut, true, stationManger.StationCode);
                        return task;
                    }
                }
                else
                {
                    WriteInfo(task.DeviceCode, $"未找到出库站台【{stationManger.StationDeviceCode}】对应的通讯对象,无法判断出库站台是否被占用");
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到出库站台【{stationManger.StationDeviceCode}】对应的通讯对象,无法判断出库站台是否被占用");
                }
            }
            else
            {
                WriteInfo(task.DeviceCode, $"未找到站台【{task.NextAddress}】信息,无法校验站台");
                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到站台【{task.NextAddress}】信息,无法校验站台");
            }
            return null;
@@ -221,7 +292,7 @@
            stackerCraneTaskCommand.Barcode = task.PalletCode;
            stackerCraneTaskCommand.TaskNum = task.TaskNum;
            stackerCraneTaskCommand.WorkType = 1;
            stackerCraneTaskCommand.TrayType = 1;
            stackerCraneTaskCommand.TrayType = (Int16)task.PalletType;
            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//判断是否是入库任务
            {
                string[] startCodes = task.CurrentAddress.Split("-");
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/ConveyorLineJob_BC.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,205 @@
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.Helper;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_Tasks.ConveyorLineJob;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class ConveyorLineJob_BC : JobBase, IJob
    {
        private readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskRepository _taskRepository;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IRouterRepository _routerRepository;
        public ConveyorLineJob_BC(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskRepository = taskRepository;
            _stationMangerRepository = stationMangerRepository;
            _routerRepository = routerRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList();
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode);
                foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode)))
                {
                    DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_ConveyorLineDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(W_ConveyorLineDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    if (deviceProRead != null && deviceProWrite != null)
                    {
                        R_ConveyorLineInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineInfo>(deviceProRead.DeviceProAddress);
                        R_ConveyorLineStatus conveyorLineStatus = conveyorLineInfoRead.Status.ByteToBoolObject<R_ConveyorLineStatus>();
                        ConveyorLineSignal conveyorLineSignalRead = conveyorLineInfoRead.Signal.ByteToBoolObject<ConveyorLineSignal>();
                        W_ConveyorLineInfo conveyorLineInfoWrite = device.Communicator.ReadCustomer<W_ConveyorLineInfo>(deviceProWrite.DeviceProAddress);
                        ConveyorLineSignal conveyorLineSignalWrite = conveyorLineInfoWrite.Signal.ByteToBoolObject<ConveyorLineSignal>();
                        if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt())
                        {
                            if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK)
                            {
                                if (!string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))
                                {
                                    WebResponseContent content = _taskService.RequestWMSTask(conveyorLineInfoRead.Barcode, item.StationCode);
                                    if (content.Status)
                                    {
                                        device.SetValue(W_ConveyorLineDB.ACK, true);
                                    }
                                }
                            }
                            else if (!conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && conveyorLineSignalWrite.ACK)
                            {
                                device.SetValue(W_ConveyorLineDB.ACK, false);
                            }
                        }
                        else if (item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt())
                        {
                            if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK)//入库
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.NextAddress == item.StackerCraneCode);
                                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                                {
                                    Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == item.StationCode);
                                    if (stationManger == null)
                                    {
                                        WriteInfo(item.StationName, $"未找到对应站台信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                        continue;
                                    }
                                    string? locationCode = _taskService.RequestAssignLocation(task.TaskNum, stationManger.StackerCraneCode);
                                    if (string.IsNullOrEmpty(locationCode))
                                    {
                                        WriteInfo(item.StationName, $"请求分配货位返回信息错误,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                        continue;
                                    }
                                    string oldAddress = task.NextAddress;
                                    int oldStatus = task.TaskState;
                                    task.CurrentAddress = stationManger.StackerCraneStationCode;
                                    task.TargetAddress = locationCode;
                                    task.NextAddress = locationCode;
                                    task.DeviceCode = stationManger.StackerCraneCode;
                                    task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
                                    _taskRepository.UpdateData(task);
                                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"系统自动流程,目标地址由{oldAddress}变更为{task.NextAddress},任务状态由{oldStatus}变更为{task.TaskState}");
                                    device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt());
                                    device.SetValue(W_ConveyorLineDB.ACK, true);
                                }
                            }
                            else if (!conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && conveyorLineSignalWrite.ACK)
                            {
                                device.SetValue(W_ConveyorLineDB.ACK, false);
                            }
                            else
                            {
                                if (!conveyorLineSignalWrite.STB && !conveyorLineSignalRead.ACK && conveyorLineStatus.Goods)
                                {
                                    Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt());
                                    if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                                    {
                                        Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == item.StationCode);
                                        if (stationManger == null)
                                        {
                                            WriteInfo(item.StationName, $"未找到对应站台信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
                                        }
                                        Dt_Router router = _routerRepository.QueryFirst(x => x.InOutType == task.TaskType && (task.CurrentAddress == x.StartPosi));
                                        if (router == null)
                                        {
                                            WriteInfo(item.StationName, $"未找到路由配置信息,设备编号:{item.StationCode},任务号:{task.TaskNum}");
                                            continue;
                                        }
                                        string oldAddress = task.NextAddress;
                                        int oldStatus = task.TaskState;
                                        task.NextAddress = router.NextPosi;
                                        task.TargetAddress = router.NextPosi;
                                        task.TaskState = TaskStatusEnum.Line_Executing.ObjToInt();
                                        _taskRepository.UpdateData(task);
                                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"系统自动流程,目标地址由{oldAddress}变更为{task.NextAddress},任务状态由{oldStatus}变更为{task.TaskState}");
                                        device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum);
                                        device.SetValue(W_ConveyorLineDB.EndPos, task.NextAddress);
                                        device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress);
                                        device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt());
                                        device.SetValue(W_ConveyorLineDB.STB, true);
                                    }
                                }
                                else if (conveyorLineSignalWrite.STB && conveyorLineSignalRead.ACK && conveyorLineStatus.Goods)
                                {
                                    _taskService.TaskCompleted(conveyorLineInfoRead.TaskNum);
                                    device.SetValue(W_ConveyorLineDB.STB, false);
                                }
                            }
                        }
                        else if (item.StationType == StationTypeEnum.StationType_InStartAndOutEnd.ObjToInt())
                        {
                            if (!conveyorLineSignalWrite.STB && !conveyorLineSignalWrite.ACK && !conveyorLineSignalRead.STB && !conveyorLineSignalRead.ACK && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm)
                            {
                                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskState == TaskStatusEnum.New.ObjToInt() && string.IsNullOrEmpty(x.TargetAddress) && x.SourceAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType));
                                if (task != null)
                                {
                                    //todo è¾“送线工作模式需要判断
                                    device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Inbound.ObjToInt());
                                    device.SetValue(W_ConveyorLineDB.STB, true);
                                }
                            }
                            else if (conveyorLineSignalWrite.STB && conveyorLineSignalRead.ACK && !conveyorLineStatus.Alarm)
                            {
                                device.SetValue(W_ConveyorLineDB.STB, false);
                            }
                            else if (!conveyorLineSignalRead.STB && conveyorLineSignalWrite.ACK && !conveyorLineStatus.Alarm)
                            {
                                device.SetValue(W_ConveyorLineDB.ACK, false);
                            }
                        }
                    }
                    else
                    {
                        WriteInfo(device.DeviceName, $"未找到设备子编号{item.StationCode}的协议信息");
                    }
                }
            }
            return Task.CompletedTask;
        }
        public void OnlyInboundStationFunc()
        {
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/°å²Ä²Ö/StackerCraneJob_BC.cs
@@ -20,25 +20,47 @@
using WIDESEAWCS_Tasks.HoisterJob;
using WIDESEAWCS_Tasks.StackerCraneJob;
using WIDESEAWCS_Tasks;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Caches;
using Newtonsoft.Json;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class StackerCraneJob_BC : JobBase, IJob
    {
        private readonly ICacheService _cacheService;
        private readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskRepository _taskRepository;
        private readonly IRouterService _routerService;
        private readonly IStationMangerRepository _stationMangerRepository;
        private List<Dt_ApiInfo> apiInfos;
        public StackerCraneJob_BC(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository)
        public StackerCraneJob_BC(ITaskService taskService, ICacheService cacheService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IStationMangerRepository stationMangerRepository)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskRepository = taskRepository;
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
            _cacheService = cacheService;
            string? apiInfoStr = _cacheService.Get("apiInfos");
            if (!string.IsNullOrEmpty(apiInfoStr))
            {
                List<Dt_ApiInfo>? infos = JsonConvert.DeserializeObject<List<Dt_ApiInfo>>(apiInfoStr);
                if (infos == null || infos.Count == 0)
                {
                    apiInfos = new List<Dt_ApiInfo>();
                }
                else
                {
                    apiInfos = infos;
                }
            }
        }
        public Task Execute(IJobExecutionContext context)
@@ -52,12 +74,8 @@
                    {
                        commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                    }
                    if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal)
                    {
                        commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                        if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                    if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal && commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                        {
                            Dt_Task? task = GetTask(commonStackerCrane);
                            if (task != null)
@@ -69,8 +87,12 @@
                                    if (sendFlag)
                                    {
                                        commonStackerCrane.LastTaskType = task.TaskType;
                                       // _taskService.UpdateTaskStatusToNext(task.TaskNum);
                                    }
                                    int oldState = task.TaskState;
                                    task.TaskState = TaskStatusEnum.SC_Executing.ObjToInt();
                                    task.Dispatchertime = DateTime.Now;
                                    task.ExceptionMessage = "";
                                    _taskRepository.UpdateData(task);
                                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"系统自动流程,任务状态从【{oldState}】转到【{task.TaskState}】");
                                }
                            }
                        }
@@ -96,10 +118,59 @@
            {
                if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5)
                {
                    Console.Out.WriteLine("TaskCompleted" + e.TaskNum);
                   // _taskService.StackCraneTaskCompleted(e.TaskNum);
                    StackerCraneTaskCompleted(e.TaskNum, commonStackerCrane.DeviceCode);
                    commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
                }
            }
        }
        public WebResponseContent StackerCraneTaskCompleted(int taskNum, string deviceCode)
        {
            try
            {
                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null)
                {
                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                    {
                        Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StackerCraneStationCode == task.NextAddress);
                        if (stationManger == null)
                        {
                            _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"AGV站点未配置,{task.NextAddress}");
                            _taskService.UpdateTaskExceptionMessage(taskNum, $"AGV站点未配置,{task.NextAddress}");
                            return WebResponseContent.Instance.Error($"AGV站点未配置,{task.NextAddress}");
                        }
                        int oldStatus = task.TaskState;
                        task.DeviceCode = "AGV_CSJ";
                        task.TaskState = TaskStatusEnum.AGV_Execute.ObjToInt();
                        task.CurrentAddress = stationManger.AGVStationCode;
                        task.NextAddress = task.TargetAddress;
                        _taskRepository.UpdateData(task);
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"系统自动流程,,任务状态从【{oldStatus}】转到【{task.TaskState}】");
                    }
                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup || task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
                    {
                        _taskService.TaskCompleted(taskNum);
                    }
                    else
                    {
                        WriteInfo(deviceCode, $"未找到该任务类型回调WMS任务完成接口,{task.TaskType}");
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"未找到该任务类型回调WMS任务完成接口,{task.TaskType}");
                        _taskService.UpdateTaskExceptionMessage(taskNum, $"未找到该任务类型回调WMS任务完成接口,{task.TaskType}");
                    }
                }
                else
                {
                    WriteInfo(deviceCode, $"未找到任务信息,任务号:{taskNum}");
                    return WebResponseContent.Instance.Error($"未找到任务信息,任务号:{taskNum}");
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                WriteError(deviceCode, $"任务完成错误", ex);
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
@@ -137,23 +208,37 @@
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                if (OutTaskStationIsOccupied(task) != null || true)
                if (OutTaskStationIsOccupied(task) == null)
                {
                    return task;
                }
                else
                {
                    bool flag = false;
                    List<string> otherOutStaionCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress).Select(x => x.ChildPosi).ToList();
                    List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStaionCodes);
                    foreach (var item in tasks)
                    {
                        if (OutTaskStationIsOccupied(task) != null)
                        {
                            return task;
                            flag = true;
                            break;
                        }
                    }
                    if (!flag)
                    {
                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
                }
                }
            }
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.FeedBackWMSTaskCompleted.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url))
                {
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, $"未找到WMS移库判断接口");
                    WriteInfo(commonStackerCrane.DeviceCode, $"未找到WMS移库判断接口");
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到WMS移库判断接口");
                    return null;
                }
                HttpHelper.Post($"{url}?taskNum={task.TaskNum}&locationCode={task.NextAddress}", "");//todo è°ƒç”¨WMS任务完成方法
            }
            return task;
@@ -166,7 +251,7 @@
        /// <returns>如果未被占用,返回传入的任务信息,否则,返回null</returns>
        private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task)
        {
            Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.TargetAddress && x.StackerCraneCode == task.DeviceCode);
            Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.NextAddress && x.StackerCraneCode == task.DeviceCode);
            if (stationManger != null)
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode);
@@ -175,18 +260,21 @@
                    OtherDevice client = (OtherDevice)device;
                    if (client.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, stationManger.StationCode))//出库站台未被占用
                    {
                        task.TargetAddress = stationManger.StackerCraneStationCode;
                        task.NextAddress = stationManger.StackerCraneStationCode;
                        _taskRepository.UpdateData(task);
                        client.SetValue(GroundStationDBName.R_IsCanPut, true, stationManger.StationCode);
                        return task;
                    }
                }
                else
                {
                    WriteInfo(task.DeviceCode, $"未找到出库站台【{stationManger.StationDeviceCode}】对应的通讯对象,无法判断出库站台是否被占用");
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到出库站台【{stationManger.StationDeviceCode}】对应的通讯对象,无法判断出库站台是否被占用");
                }
            }
            else
            {
                WriteInfo(task.DeviceCode, $"未找到站台【{task.NextAddress}】信息,无法校验站台");
                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到站台【{task.NextAddress}】信息,无法校验站台");
            }
            return null;
@@ -205,19 +293,42 @@
            stackerCraneTaskCommand.Barcode = task.PalletCode;
            stackerCraneTaskCommand.TaskNum = task.TaskNum;
            stackerCraneTaskCommand.WorkType = 1;
            stackerCraneTaskCommand.TrayType = 1;
            stackerCraneTaskCommand.TrayType = (Int16)task.PalletType;
            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//判断是否是入库任务
            {
                //List<Dt_Router> routers = _routerService.QueryNextRoutes(task.CurrentAddress, task.Roadway);
                //if (routers.Count > 0)
                //{
                string[] startCodes = task.CurrentAddress.Split("-");
                if (startCodes.Length == 3)
                {
                stackerCraneTaskCommand.StartRow = Convert.ToInt16(startCodes[0]);
                stackerCraneTaskCommand.StartColumn = Convert.ToInt16(startCodes[1]);
                stackerCraneTaskCommand.StartLayer = Convert.ToInt16(startCodes[2]);
                }
                else
                {
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"入库任务起点错误,起点:【{task.CurrentAddress}】");
                    WriteInfo(task.DeviceCode, $"入库任务起点错误,起点:【{task.CurrentAddress}】");
                    return null;
                }
                string[] targetCodes = task.NextAddress.Split("-");
                if (targetCodes.Length == 5)
                {
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[1]);
                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[2]);
                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[3]);
                }
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"入库任务终点错误,终点:【{task.NextAddress}】");
                    WriteInfo(task.DeviceCode, $"入库任务终点错误,终点:【{task.NextAddress}】");
                    return null;
                }
            }
            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                string[] targetCodes = task.NextAddress.Split("-");
                if (targetCodes.Length == 3)
                {
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]);
@@ -227,73 +338,54 @@
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"入库任务终点错误,起点:【{task.NextAddress}】");
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"出库任务终点错误,终点:【{task.NextAddress}】");
                    WriteInfo(task.DeviceCode, $"出库任务终点错误,终点:【{task.NextAddress}】");
                    return null;
                }
                //}
                //else
                //{
                //    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到站台【{task.NextAddress}】信息,无法获取对应的堆垛机取货站台信息");
                //    return null;
                //}
            }
            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                //List<Dt_Router> routers = _routerService.QueryNextRoutes(task.Roadway, task.TargetAddress);
                //if (routers.Count > 0)
                {
                    string[] targetCodes = task.NextAddress.Split("-");
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]);
                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
                    string[] sourceCodes = task.CurrentAddress.Split("-");
                    if (sourceCodes.Length == 3)
                if (sourceCodes.Length == 5)
                    {
                        stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]);
                        stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
                        stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[1]);
                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[2]);
                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[3]);
                    }
                    else
                    {
                        //数据配置错误
                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"出库任务起点错误,起点:【{task.CurrentAddress}】");
                    WriteInfo(task.DeviceCode, $"出库任务起点错误,起点:【{task.CurrentAddress}】");
                        return null;
                    }
                }
                //else
                //{
                //    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到站台【{task.NextAddress}】信息,无法获取对应的堆垛机放货站台信息");
                //    return null;
                //}
            }
            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
            {
                string[] targetCodes = task.NextAddress.Split("-");
                if (targetCodes.Length == 3)
                if (targetCodes.Length == 5)
                {
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]);
                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[1]);
                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[2]);
                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[3]);
                }
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务终点错误,起点:【{task.NextAddress}】");
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务终点错误,终点:【{task.NextAddress}】");
                    WriteInfo(task.DeviceCode, $"移库任务终点错误,终点:【{task.NextAddress}】");
                    return null;
                }
                string[] sourceCodes = task.CurrentAddress.Split("-");
                if (sourceCodes.Length == 3)
                if (sourceCodes.Length == 5)
                {
                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]);
                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[1]);
                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[2]);
                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[3]);
                }
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务起点错误,起点:【{task.CurrentAddress}】");
                    WriteInfo(task.DeviceCode, $"移库任务起点错误,起点:【{task.CurrentAddress}】");
                    return null;
                }
            }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/²âÊԼܲÖ/StackerCraneJob_CSJ.cs
@@ -208,24 +208,25 @@
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                if (OutTaskStationIsOccupied(task) != null)
                if (OutTaskStationIsOccupied(task) == null)
                {
                    return task;
                }
                else
                {
                    bool flag = false;
                    List<string> otherOutStaionCodes = _routerService.QueryNextRoutes(commonStackerCrane.DeviceCode, task.NextAddress).Select(x => x.ChildPosi).ToList();
                    List<Dt_Task> tasks = _taskService.QueryStackerCraneOutTasks(commonStackerCrane.DeviceCode, otherOutStaionCodes);
                    foreach (var item in tasks)
                    {
                        if (OutTaskStationIsOccupied(task) != null)
                        {
                            return task;
                            flag = true;
                            break;
                        }
                    }
                    if (!flag)
                    {
                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
                }
            }
            }
            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/record/locationStatusChangeRecord.vue
@@ -36,9 +36,7 @@
        devicePlcType: "",
        deviceRemark: "",
      });
      const editFormOptions = ref([
      ]);
    const editFormOptions = ref([]);
      const searchFormFields = ref({
        locationCode: "",
        orderNo: "",
@@ -51,9 +49,27 @@
          { title: "任务号", field: "taskNum" },
        ],
        [
          { title: "变动前货位状态", field: "beforeStatus" ,type: "selectList",dataKey: "locationStatusEnum",data: [],},
          { title: "变动后货位状态", field: "afterStatus" ,type: "selectList",dataKey: "locationStatusEnum",data: [],},
          { title: "变动类型", field: "changeType" ,type: "selectList",dataKey: "stockChangeType",data: [],},
        {
          title: "变动前货位状态",
          field: "beforeStatus",
          type: "selectList",
          dataKey: "locationStatusEnum",
          data: [],
        },
        {
          title: "变动后货位状态",
          field: "afterStatus",
          type: "selectList",
          dataKey: "locationStatusEnum",
          data: [],
        },
        {
          title: "变动类型",
          field: "changeType",
          type: "selectList",
          dataKey: "locationChangeType",
          data: [],
        },
        ],
      ]);
      const columns = ref([
@@ -110,7 +126,7 @@
          type: "string",
          width: 90,
          align: "left",
          bind: { key: "stockChangeType", data: [] },
        bind: { key: "locationChangeType", data: [] },
        },
        {
          field: "orderId",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/record/stockQuantityChangeRecord.vue
@@ -110,7 +110,6 @@
          width: 150,
          align: "left",
        },
        {
          field: "taskNum",
          title: "任务号",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue
@@ -34,47 +34,18 @@
      const editFormFields = ref({});
      const editFormOptions = ref([]);
      const searchFormFields = ref({
        BeginDate: "",
        Url: "",
        LogType: [],
        Success: [],
        UserIP: "",
        ServiceIP: "",
        Role_Id: "",
      url: "",
      requestParam: "",
      responseParam: "",
      beginDate: "",
      });
      const searchFormOptions = ref([
        [
          { title: "请求地址", field: "url", type: "text" },
          { title: "用户IP", field: "userIP", type: "text" },
          { title: "服务器IP", field: "serviceIP", type: "text" },
        { title: "请求地址", field: "url", type: "like" },
        { title: "请求参数", field: "requestParam", type: "like" },
        { title: "响应参数", field: "responseParam", type: "like" },
        ],
        [
          { title: "开始时间", field: "beginDate", type: "datetime" },
        //   {
        //     dataKey: "restatus",
        //     data: [],
        //     title: "响应状态",
        //     field: "success",
        //     type: "selectList",
        //   },
        //   {
        //     dataKey: "roles",
        //     data: [],
        //     title: "角色ID",
        //     field: "role_Id",
        //     type: "select",
        //   },
        ],
        // [
        //   {
        //     dataKey: "log",
        //     data: [],
        //     title: "日志类型",
        //     field: "logType",
        //     colSize: 12,
        //     type: "checkbox",
        //   },
        // ],
      [{ title: "开始时间", field: "beginDate", type: "datetime" }],
      ]);
      const columns = ref([
        {
@@ -96,41 +67,20 @@
          sortable: true,
        },
        {
          field: "userName",
          title: "用户名称",
          type: "string",
          width: 90,
          align: "left",
        },
        {
          field: "url",
          title: "请求地址",
          type: "string",
          width: 110,
          align: "left",
        },
        {
          field: "logType",
          title: "日志类型",
          type: "string",
          bind: { key: "log", data: [] },
          width: 80,
          align: "left",
        },
        {
          field: "success",
          title: "响应状态",
          type: "int",
          bind: { key: "restatus", data: [] },
          width: 80,
          align: "left",
        },
        {
          field: "elapsedTime",
          title: "时长",
          type: "int",
          width: 60,
          align: "left",
      },
      {
        field: "endDate",
        title: "结束时间",
        type: "datetime",
        width: 150,
        hidden: true,
        align: "left",
        sortable: true,
        },
        {
          field: "requestParam",
@@ -147,30 +97,31 @@
          align: "left",
        },
        {
          field: "exceptionInfo",
          title: "异常信息",
        field: "url",
        title: "请求地址",
          type: "string",
          width: 70,
        width: 110,
          align: "left",
      },
      {
        field: "userName",
        title: "用户名称",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "success",
        title: "响应状态",
        type: "int",
        bind: { key: "restatus", data: [] },
        width: 80,
        align: "left",
        hidden: true,
        },
        {
          field: "userIP",
          title: "用户IP",
          type: "string",
          width: 90,
          align: "left",
        },
        {
          field: "serviceIP",
          title: "服务器IP",
          type: "string",
          width: 90,
          hidden: true,
          align: "left",
        },
        {
          field: "browserType",
          title: "浏览器类型",
          type: "string",
          width: 90,
          align: "left",
@@ -182,24 +133,6 @@
          width: 90,
          hidden: true,
          align: "left",
        },
        {
          field: "roleId",
          title: "角色ID",
          type: "int",
          bind: { key: "roles", data: [] },
          width: 90,
          hidden: true,
          align: "left",
        },
        {
          field: "endDate",
          title: "结束时间",
          type: "datetime",
          width: 150,
          hidden: true,
          align: "left",
          sortable: true,
        },
      ]);
      const detail = ref({
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/0533fbe9-c978-41ba-a3ad-5b6c54002ad8.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/169371da-5bcd-4f62-bffa-65387df1ce50.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/339ccc6a-95ea-4f78-8616-45299be9dd90.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/4b4ce8f6-d231-4356-8904-ece35b20d64d.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/51bc4fd8-adae-43fe-aa0e-8971136a692a.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/ad2b9174-0600-4c25-b074-3f17231855fc.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/c1f85c39-42dc-41e9-adff-a1cd854fb661.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/d25efbec-11d1-4ce7-a481-6187db1d5fbb.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/f1ba7a1a-5550-4f7c-abf4-712c6fab55a2.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/read.lock
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/BasicService.cs
@@ -14,20 +14,32 @@
{
    public class BasicService : IBasicService
    {
        public ICustomerInfoService CustomerInfoService { get; }
        public IPalletCodeInfoService PalletCodeInfoService { get; }
        public ISupplierInfoService SupplierInfoService { get; }
        public IUserInfoService UserInfoService { get; }
        public ILocationInfoService LocationInfoService { get; }
        public IMaterielInfoService MaterielInfoService { get; }
        public IWarehouseService WarehouseService { get; }
        public ISupplierInfoService SupplierInfoService { get; }
        public IMaterielCodeInfoService MaterielCodeInfoService { get; }
        public BasicService(ILocationInfoService locationInfoService, IMaterielInfoService materielInfoService, IWarehouseService warehouseService, ISupplierInfoService supplierInfoService)
        public BasicService(ILocationInfoService locationInfoService, IMaterielInfoService materielInfoService, IWarehouseService warehouseService, ISupplierInfoService supplierInfoService,ICustomerInfoService customerInfoService,IPalletCodeInfoService palletCodeInfoService, IUserInfoService userInfoService, IMaterielCodeInfoService materielCodeInfoService)
        {
            LocationInfoService = locationInfoService;
            MaterielInfoService = materielInfoService;
            WarehouseService = warehouseService;
            SupplierInfoService = supplierInfoService;
            CustomerInfoService = customerInfoService;
            PalletCodeInfoService = palletCodeInfoService;
            UserInfoService = userInfoService;
            MaterielCodeInfoService = materielCodeInfoService;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/MesOutboundOrderType.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_Common.OrderEnum
{
    /// <summary>
    ///
    /// </summary>
    public enum MesOutboundOrderTypeEnum
    {
        /// <summary>
        /// åŸºæ¿å‡ºåº“
        /// </summary>
        [Description("基板出库")]
        SubstrateOut = 100,
        /// <summary>
        /// åŸºæ¿ä½™æ–™é€€åº“
        /// </summary>
        [Description("基板余料退库")]
        SubstrateBack = 200,
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/BaseServices/ServiceBase.cs
@@ -122,7 +122,7 @@
            }
        }
        private Expression<Func<TEntity, bool>> GetWhereExpression(string propertyName, object propertyValue, ParameterExpression parameter, LinqExpressionType expressionType)
        protected Expression<Func<TEntity, bool>> GetWhereExpression(string propertyName, object propertyValue, ParameterExpression parameter, LinqExpressionType expressionType)
        {
            Type proType = typeof(TEntity).GetProperty(propertyName).PropertyType;
            ConstantExpression constant = proType.ToString() == "System.String"
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/Extensions/HttpContextExtension.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_Core.Extensions
{
    public static class HttpContextExtension
    {
        public static ISession GetSession(this HttpContext context)
        {
            try
            {
                return context.Session;
            }
            catch (Exception)
            {
                return default;
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/Extensions/SwaggerContextExtension.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Helper;
namespace WIDESEA_Core.Extensions
{
    public static class SwaggerContextExtension
    {
        public const string SwaggerCodeKey = "swagger-code";
        public const string SwaggerJwt = "swagger-jwt";
        public static bool IsSuccessSwagger()
        {
            return App.HttpContext?.GetSession()?.GetString(SwaggerCodeKey) == "success";
        }
        public static bool IsSuccessSwagger(this HttpContext context)
        {
            return context.GetSession()?.GetString(SwaggerCodeKey) == "success";
        }
        public static void SuccessSwagger()
        {
            App.HttpContext?.GetSession()?.SetString(SwaggerCodeKey, "success");
        }
        public static void SuccessSwagger(this HttpContext context)
        {
            context.GetSession()?.SetString(SwaggerCodeKey, "success");
        }
        public static void SuccessSwaggerJwt(this HttpContext context, string token)
        {
            var claims = new ClaimsIdentity(GetClaimsIdentity(token));
            context.User.AddIdentity(claims);
            context.GetSession().SetString(SwaggerJwt, token);
        }
        private static IEnumerable<Claim> GetClaimsIdentity(string token)
        {
            var jwtHandler = new JwtSecurityTokenHandler();
            // token校验
            if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token))
            {
                var jwtToken = jwtHandler.ReadJwtToken(token);
                return jwtToken.Claims;
            }
            return new List<Claim>();
        }
        public static string GetSuccessSwaggerJwt(this HttpContext context)
        {
            return context.GetSession().GetString(SwaggerJwt);
        }
        public static void RedirectSwaggerLogin(this HttpContext context)
        {
            var returnUrl = context.Request.GetDisplayUrl(); //获取当前url地址
            context.Response.Redirect("/swg-login.html?returnUrl=" + returnUrl);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/Extensions/WebSocketSetup.cs
@@ -5,6 +5,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Helper;
namespace WIDESEA_Core.Extensions
{
@@ -14,6 +15,12 @@
        {
            if (services == null) throw new ArgumentNullException(nameof(services));
            int port = AppSettings.Get("WebSocketPort").ObjToInt();
            if (port == 0)
            {
                port = 9296;
            }
            services.AddSingleton(x =>
            {
                WebSocketServer socketServer = new WebSocketServer();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/HttpContextUser/AspNetUser.cs
@@ -9,6 +9,7 @@
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Extensions;
using WIDESEA_Core.Helper;
using ICacheService = WIDESEA_Core.Caches.ICacheService;
@@ -46,21 +47,19 @@
        public string GetToken()
        {
            string token = _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", "") ?? "";
            string token = "";
            token = _cacheService.Get(UserId.ToString());
            if (!string.IsNullOrEmpty(token)) { return token; }
            token = _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", "") ?? "";
            if (!token.IsNullOrEmpty())
            {
                return token;
            }
            //if (_accessor.HttpContext?.IsSuccessSwagger() == true)
            //if (_accessor.HttpContext?.IsSuccessSwagger() ?? false)
            //{
            //    token = _accessor.HttpContext.GetSuccessSwaggerJwt();
            //    if (token.IsNotEmptyOrNull())
            //    {
            //        //UserInfo userInfo = JwtHelper.SerializeJwt(token);
            //        //if (userInfo.UserId > 0)
            //        //{
            //        //    return token;
            //        //}
            //        List<Claim> claims1 = _accessor.HttpContext.User.Claims.ToList();
            //        if (_accessor.HttpContext.User.Claims.Any(s => s.Type == JwtRegisteredClaimNames.Jti))
            //        {
@@ -72,8 +71,6 @@
            //        return token;
            //    }
            //}
            token = _cacheService.Get(UserId.ToString());
            if (!string.IsNullOrEmpty(token)) { return token; }
            return token;
            //    string token = _cacheService.Get(UserId.ToString());
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/EntityProperties.cs
@@ -5,10 +5,12 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Const;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
namespace WIDESEA_Core.Utilities
@@ -318,5 +320,48 @@
            }
            return null;
        }
        public static void ValidatePageOptions<TEntity>(PageDataOptions options, ref ISugarQueryable<TEntity> sugarQueryable)
        {
            string where = string.Empty;
            PropertyInfo[] entityProperties = typeof(TEntity).GetProperties();
            List<SearchParameters> searchParametersList = new List<SearchParameters>();
            if (options.Filter != null && options.Filter.Count > 0)
            {
                searchParametersList.AddRange(options.Filter);
            }
            else if (!string.IsNullOrEmpty(options.Wheres))
            {
                try
                {
                    searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
                    options.Filter = searchParametersList;
                }
                catch { }
            }
            for (int i = 0; i < searchParametersList.Count; i++)
            {
                if (string.IsNullOrEmpty(searchParametersList[i].Value))
                {
                    continue;
                }
                PropertyInfo? property = entityProperties.Where(c => c.Name.ToUpper() == searchParametersList[i].Name.ToUpper()).FirstOrDefault();
                if (property == null) continue;
                List<(bool, string, object)> results = property.ValidationValueForDbType(searchParametersList[i].Value.Split(',')).ToList();
                if (results == null || results.Count() == 0)
                {
                    continue;
                }
                for (int j = 0; j < results.Count(); j++)
                {
                    LinqExpressionType expressionType = searchParametersList[i].DisplayType.GetLinqCondition();
                    Expression<Func<TEntity, bool>> expression = property.GetWhereExpression<TEntity>(results[j].Item3, null, expressionType);
                    sugarQueryable = sugarQueryable.Where(expression);
                }
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/Utilities/LambdaExtensions.cs
@@ -179,5 +179,70 @@
            return p => false;
        }
        public static Expression<Func<TEntity, bool>> GetWhereExpression<TEntity>(this PropertyInfo propertyInfo, object propertyValue, ParameterExpression parameter, LinqExpressionType expressionType)
        {
            Type proType = propertyInfo.PropertyType;
            ConstantExpression constant = proType.ToString() == "System.String"
               ? Expression.Constant(propertyValue) : Expression.Constant(propertyValue.ToString().ChangeType(proType));
            // DateTime只选择了日期的时候自动在结束日期加一天,修复DateTime类型使用日期区间查询无法查询到结束日期的问题
            if ((proType == typeof(DateTime) || proType == typeof(DateTime?)) && expressionType == LinqExpressionType.LessThanOrEqual && propertyValue.ToString().Length == 10)
            {
                constant = Expression.Constant(Convert.ToDateTime(propertyValue.ToString()).AddDays(1));
            }
            parameter = parameter ?? Expression.Parameter(typeof(TEntity), "b");
            //创建节点的属性p=>p.name å±žæ€§name
            MemberExpression memberProperty = Expression.PropertyOrField(parameter, propertyInfo.Name);
            UnaryExpression member = Expression.Convert(memberProperty, constant.Type);
            Expression<Func<TEntity, bool>> expression = p => false;
            switch (expressionType)
            {
                //p=>p.propertyName == propertyValue
                case LinqExpressionType.Equal:
                    expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Equal(member, constant), parameter);
                    break;
                //p=>p.propertyName != propertyValue
                case LinqExpressionType.NotEqual:
                    expression = Expression.Lambda<Func<TEntity, bool>>(Expression.NotEqual(member, constant), parameter);
                    break;
                //   p => p.propertyName > propertyValue
                case LinqExpressionType.GreaterThan:
                    expression = Expression.Lambda<Func<TEntity, bool>>(Expression.GreaterThan(member, constant), parameter);
                    break;
                //   p => p.propertyName < propertyValue
                case LinqExpressionType.LessThan:
                    expression = Expression.Lambda<Func<TEntity, bool>>(Expression.LessThan(member, constant), parameter);
                    break;
                // p => p.propertyName >= propertyValue
                case LinqExpressionType.ThanOrEqual:
                    expression = Expression.Lambda<Func<TEntity, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter);
                    break;
                // p => p.propertyName <= propertyValue
                case LinqExpressionType.LessThanOrEqual:
                    expression = Expression.Lambda<Func<TEntity, bool>>(Expression.LessThanOrEqual(member, constant), parameter);
                    break;
                //   p => p.propertyName.Contains(propertyValue)
                // p => !p.propertyName.Contains(propertyValue)
                case LinqExpressionType.Contains:
                case LinqExpressionType.NotContains:
                    MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
                    constant = Expression.Constant(propertyValue, typeof(string));
                    if (expressionType == LinqExpressionType.Contains)
                    {
                        expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Call(member, method, constant), parameter);
                    }
                    else
                    {
                        expression = Expression.Lambda<Func<TEntity, bool>>(Expression.Not(Expression.Call(member, method, constant)), parameter);
                    }
                    break;
                default:
                    //
                    expression = p => false;
                    break;
            }
            return expression;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MESRoot.cs
@@ -20,19 +20,5 @@
        
        public T Content { get; set; }
    }
    /// <summary>
    ///测试架同步
    /// </summary>
    public class TestToolSynInfo
    {
        /// <summary>
        /// æµ‹è¯•架批次号
        /// </summary>
        public string ToolCode { get; set; }
        /// <summary>
        /// åˆå§‹å¯¿å‘½
        /// </summary>
        public int Life { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/RootList.cs
ÎļþÒÑɾ³ý
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/SubstrateModel.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO.MES
{
    /// <summary>
    /// åŸºæ¿å‡ºåº“
    /// </summary>
    public class SubstrateOutModel
    {
        /// <summary>
        /// ä»»åŠ¡å•å·
        /// </summary>
        public string TaskNo { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        public string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        public string MaterialName { get; set; }
        /// <summary>
        /// éœ€æ±‚数量
        /// </summary>
        public float RequiredQuantity { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        public string Unit { get; set; }
        /// <summary>
        /// çº¿ä½“
        /// </summary>
        public string Line { get; set; }
    }
    /// <summary>
    /// åŸºæ¿ä½™æ–™é€€åº“
    /// </summary>
    public class SubstrateBackModel
    {
        /// <summary>
        /// ç‰©æ–™æ‰¹æ¬¡
        /// </summary>
        public string MaterialLot { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        public string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åˆ†ç±»
        /// </summary>
        public string MaterialCategory { get; set; }
        /// <summary>
        /// é€€åº“数量
        /// </summary>
        public float Quantity { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        public string Unit { get; set; }
        /// <summary>
        /// è½½å…·ç¼–码
        /// </summary>
        public string CarrierCode { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ—¥æœŸ
        /// </summary>
        public string ProductionDate { get; set; }
        /// <summary>
        /// æœ‰æ•ˆæœŸ
        /// </summary>
        public string ExpirationDate { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/TestToolModel.cs
@@ -57,4 +57,18 @@
        public string TestToolCode { get; set; }
    }
    
    /// <summary>
    ///测试架同步
    /// </summary>
    public class TestToolSynInfo
    {
        /// <summary>
        /// æµ‹è¯•架批次号
        /// </summary>
        public string ToolCode { get; set; }
        /// <summary>
        /// åˆå§‹å¯¿å‘½
        /// </summary>
        public int Life { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/StockViewDTO.cs
@@ -10,53 +10,119 @@
namespace WIDESEA_DTO.Stock
{
    /// <summary>
    ///
    /// </summary>
    public class StockViewDTO
    {
        [SugarColumn(IsNullable = true, ColumnDescription = "货位号")]
        /// <summary>
        ///
        /// </summary>
        public string LocationCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string LocationName { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int Column { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int Row { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int Layer { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int Depth { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int LocationStatus { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int LocationType { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string RoadwayNo { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int EnalbeStatus { get; set; }
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        /// <summary>
        ///
        /// </summary>
        public int StockId { get; set; }
        [SugarColumn(IsNullable = true, ColumnDescription = "托盘号")]
        /// <summary>
        ///
        /// </summary>
        public string PalletCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public bool IsFull { get; set; }
        [SugarColumn(IsNullable = true, ColumnDescription = "物料号")]
        /// <summary>
        ///
        /// </summary>
        public string MaterielCode { get; set; }
        [SugarColumn(IsNullable = true, ColumnDescription = "批次号")]
        /// <summary>
        ///
        /// </summary>
        public string BatchNo { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int StockStatus { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string StockRemark { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string Creater { get; set; }
        /// <summary>
        ///
        /// </summary>
        public DateTime CreateDate { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string Modifier { get; set; }
        /// <summary>
        ///
        /// </summary>
        public DateTime? ModifyDate { get; set; }
        /// <summary>
        ///
        /// </summary>
        [Navigate(NavigateType.OneToMany, nameof(Dt_StockInfoDetail.StockId), nameof(StockId))]
        public List<Dt_StockInfoDetail> Details { get; set; }
    }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Task/WCSTaskDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO.Task
{
    /// <summary>
    ///
    /// </summary>
    public class WCSTaskDTO
    {
       // public int Task
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/Task/WMSTaskDTO.cs
@@ -6,6 +6,9 @@
namespace WIDESEA_DTO.Task
{
    /// <summary>
    /// ä»»åŠ¡DTO
    /// </summary>
    public class WMSTaskDTO
    {
        /// <summary>
@@ -53,10 +56,19 @@
        /// </summary>
        public int Grade { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int WarehouseId { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string AGVArea { get; set; }
        /// <summary>
        ///
        /// </summary>
        public int PalletType { get; set; }
    }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/WIDESEA_DTO.csproj
@@ -4,6 +4,7 @@
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
        <GenerateDocumentationFile>True</GenerateDocumentationFile>
  </PropertyGroup>
  <ItemGroup>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IBasicService.cs
@@ -28,5 +28,13 @@
        /// ä¾›åº”商业务层
        /// </summary>
        ISupplierInfoService SupplierInfoService { get; }
        IUserInfoService UserInfoService { get; }
        IPalletCodeInfoService PalletCodeInfoService { get; }
        ICustomerInfoService CustomerInfoService { get; }
        IMaterielCodeInfoService MaterielCodeInfoService { get; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundService.cs
@@ -17,5 +17,9 @@
        IReceiveOrderDetailService ReceiveOrderDetailService { get; }
        IReceiveOrderService ReceiveOrderService { get; }
        IPurchaseOrderService PurchaseOrderService { get; }
        IPurchaseOrderDetailService PurchaseOrderDetailService { get; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundRepository/IMesOutboundOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundRepository
{
    public interface IMesOutboundOrderRepository : IRepository<Dt_MesOutboundOrder>
    {
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IMesOutboundOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.MES;
using WIDESEA_DTO;
using WIDESEA_Model.Models;
namespace WIDESEA_IOutboundService
{
    public interface IMesOutboundOrderService : IService<Dt_MesOutboundOrder>
    {
        MesResponseContent SubstrateOut(SubstrateOutModel model);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundService.cs
@@ -9,6 +9,8 @@
{
    public interface IOutboundService:IDependency
    {
        IMesOutboundOrderService MesOutboundOrderService { get; };
        IOutboundOrderDetailService OutboundOrderDetailService { get; }
        IOutboundOrderService OutboundOrderService { get; }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs
@@ -18,12 +18,18 @@
        public IReceiveOrderService ReceiveOrderService { get; }
        public InboundService(IInboundOrderDetailService inboundOrderDetailService, IInboundOrderService inbounOrderService, IReceiveOrderDetailService receiveOrderDetailService, IReceiveOrderService receiveOrderService)
        public IPurchaseOrderService PurchaseOrderService { get; }
        public IPurchaseOrderDetailService PurchaseOrderDetailService { get; }
        public InboundService(IInboundOrderDetailService inboundOrderDetailService, IInboundOrderService inbounOrderService, IReceiveOrderDetailService receiveOrderDetailService, IReceiveOrderService receiveOrderService, IPurchaseOrderService purchaseOrderService, IPurchaseOrderDetailService purchaseOrderDetailService)
        {
            InboundOrderDetailService = inboundOrderDetailService;
            InbounOrderService = inbounOrderService;
            ReceiveOrderDetailService = receiveOrderDetailService;
            ReceiveOrderService = receiveOrderService;
            PurchaseOrderService = purchaseOrderService;
            PurchaseOrderDetailService = purchaseOrderDetailService;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_ApiInfo.cs
@@ -8,6 +8,9 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// æŽ¥å£ä¿¡æ¯
    /// </summary>
    [SugarTable(nameof(Dt_ApiInfo), "接口信息")]
    public class Dt_ApiInfo : BaseEntity
    {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielCodeInfo.cs
@@ -9,6 +9,9 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// ç‰©æ–™ç ä¿¡æ¯
    /// </summary>
    [SugarTable(nameof(Dt_MaterielCodeInfo), "物料码信息")]
    public class Dt_MaterielCodeInfo : BaseEntity
    {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_PalletCodeInfo.cs
@@ -8,6 +8,9 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// æ‰˜ç›˜ç¼–号信息
    /// </summary>
    [SugarTable(nameof(Dt_PalletCodeInfo), "托盘编号信息")]
    public class Dt_PalletCodeInfo : BaseEntity
    {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_PalletTypeInfo.cs
@@ -9,61 +9,61 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    ///
    /// æ‰˜ç›˜ç±»åž‹
    /// </summary>
    [SugarTable(nameof(Dt_PalletTypeInfo), "托盘类型")]
    public class Dt_PalletTypeInfo : BaseEntity
    {
        /// <summary>
        ///
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        ///
        /// æ‰˜ç›˜ç±»åž‹
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "托盘类型")]
        public int PalletType { get; set; }
        /// <summary>
        ///
        /// æ‰˜ç›˜ç±»åž‹åç§°
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "托盘类型名称")]
        public string TypeName { get; set; }
        /// <summary>
        ///
        /// é•¿åº¦
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "长度")]
        public int Length { get; set; }
        /// <summary>
        ///
        /// å®½åº¦
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "宽度")]
        public int Width { get; set; }
        /// <summary>
        ///
        /// é«˜åº¦
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "高度")]
        public int Height { get; set; }
        /// <summary>
        ///
        /// çŠ¶æ€
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "状态")]
        public int Enbale { get; set; }
        /// <summary>
        ///
        /// ä»“库编号
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库编号")]
        public int WarehouseId { get; set; }
        /// <summary>
        ///
        /// æ‰€å±žå±‚
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "所属层")]
        public string SortNum { get; set; }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_UserInfo.cs
@@ -8,6 +8,9 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// å‘˜å·¥ä¿¡æ¯
    /// </summary>
    [SugarTable(nameof(Dt_UserInfo), "员工信息")]
    public class Dt_UserInfo : BaseEntity
    {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrderDetail_Hty.cs
@@ -9,73 +9,34 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// å…¥åº“单明细
    /// </summary>
    [SugarTable(nameof(Dt_InboundOrderDetail_Hty), "入库单明细")]
    public class Dt_InboundOrderDetail_Hty : BaseEntity
    public class Dt_InboundOrderDetail_Hty : Dt_InboundOrderDetail, IBaseHistoryEntity
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id {  get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "入库单主键")]
        public int OrderId { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
        public string MaterielCode {  get; set; }
        [SugarColumn(IsNullable = false, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "批次号")]
        public string BatchNo {  get; set; }
        [SugarColumn(IsNullable = false, DecimalDigits = 2, ColumnDescription = "单据数量")]
        public decimal OrderQuantity {  get; set; }
        [SugarColumn(IsNullable = false, DecimalDigits = 2, ColumnDescription = "组盘数量", DefaultValue = "0")]
        public decimal ReceiptQuantity {  get; set; }
        [SugarColumn(IsNullable = false, DecimalDigits = 2, ColumnDescription = "上架数量", DefaultValue = "0")]
        public decimal OverInQuantity {  get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "订单明细状态")]
        public int OrderDetailStatus {  get; set; }
        [SugarColumn(IsNullable = true, ColumnDescription = "备注")]
        public string Remark {  get; set; }
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "源主键")]
        /// <summary>
        /// åŽŸè¡¨ä¸»é”®
        /// </summary>
        [ImporterHeader(Name = "原表主键")]
        [ExporterHeader(DisplayName = "原表主键")]
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "原表主键")]
        public int SourceId { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "备注")]
        /// <summary>
        /// æ“ä½œç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "操作类型")]
        [ExporterHeader(DisplayName = "操作类型")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "操作类型")]
        public string OperateType { get; set; }
        /// <summary>
        /// åˆ›å»ºäºº
        /// </summary>
        [ImporterHeader(Name = "创建人")]
        [ExporterHeader(DisplayName = "创建人")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "创建人")]
        public string Creater { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// ç§»å…¥åŽ†å²æ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "创建时间")]
        [ExporterHeader(DisplayName = "创建时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "创建时间")]
        public DateTime CreateDate { get; set; } = DateTime.Now;
        /// <summary>
        /// æ›´æ–°è€…
        /// </summary>
        [ImporterHeader(Name = "修改人")]
        [ExporterHeader(DisplayName = "修改人")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "修改人")]
        public string Modifier { get; set; }
        /// <summary>
        /// ä¿®æ”¹æ—¥æœŸ
        /// </summary>
        [ImporterHeader(Name = "修改日期")]
        [ExporterHeader(DisplayName = "修改日期")]
        [SugarColumn(IsNullable = true, ColumnDescription = "修改日期")]
        public DateTime? ModifyDate { get; set; }
        [ImporterHeader(Name = "移入历史时间")]
        [ExporterHeader(DisplayName = "移入历史时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "移入历史时间")]
        public DateTime InsertTime { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrder_Hty.cs
@@ -12,95 +12,33 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    ///
    /// å…¥åº“单历史
    /// </summary>
    [SugarTable(nameof(Dt_InboundOrder_Hty), "入库单历史")]
    public class Dt_InboundOrder_Hty
    public class Dt_InboundOrder_Hty : Dt_InboundOrder, IBaseHistoryEntity
    {
        /// <summary>
        ///
        /// åŽŸè¡¨ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "单据编号")]
        public string OrderNo { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "上游单据编号")]
        public string UpperOrderNo { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据类型")]
        public int OrderType { get; set; }
        /// <summary>
        /// å•据状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据状态")]
        public int OrderStatus { get; set; }
        /// <summary>
        /// åˆ›å»ºæ–¹å¼
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "创建方式")]
        public int CreateType { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// æºä¸»é”®
        /// </summary>
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "源主键")]
        [ImporterHeader(Name = "原表主键")]
        [ExporterHeader(DisplayName = "原表主键")]
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "原表主键")]
        public int SourceId { get; set; }
        /// <summary>
        /// æ“ä½œç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "操作类型")]
        [ExporterHeader(DisplayName = "操作类型")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "操作类型")]
        public string OperateType { get; set; }
        /// <summary>
        /// åˆ›å»ºäºº
        /// ç§»å…¥åŽ†å²æ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "创建人")]
        [ExporterHeader(DisplayName = "创建人")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "创建人")]
        public string Creater { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "创建时间")]
        [ExporterHeader(DisplayName = "创建时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "创建时间")]
        public DateTime CreateDate { get; set; } = DateTime.Now;
        /// <summary>
        /// æ›´æ–°è€…
        /// </summary>
        [ImporterHeader(Name = "修改人")]
        [ExporterHeader(DisplayName = "修改人")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "修改人")]
        public string Modifier { get; set; }
        /// <summary>
        /// ä¿®æ”¹æ—¥æœŸ
        /// </summary>
        [ImporterHeader(Name = "修改日期")]
        [ExporterHeader(DisplayName = "修改日期")]
        [SugarColumn(IsNullable = true, ColumnDescription = "修改日期")]
        public DateTime? ModifyDate { get; set; }
        [ImporterHeader(Name = "移入历史时间")]
        [ExporterHeader(DisplayName = "移入历史时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "移入历史时间")]
        public DateTime InsertTime { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_PurchaseOrder.cs
@@ -10,7 +10,7 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    ///
    /// é‡‡è´­å•
    /// </summary>
    [SugarTable(nameof(Dt_PurchaseOrder), "采购单"), ModelValidate]
    public class Dt_PurchaseOrder : BaseEntity
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_MesOutboundOrder.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.CodeConfigEnum;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    ///
    /// </summary>
    public class Dt_MesOutboundOrder : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// ä»“库主键
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库主键")]
        public int WarehouseId { get; set; }
        /// <summary>
        /// å•据编号
        /// </summary>
        [CodeRule(RuleCodeEnum.OutboundOrderRule)]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "单据编号", IsOnlyIgnoreUpdate = true)]
        public string OrderNo { get; set; }
        /// <summary>
        /// ä»»åŠ¡å•å·
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "任务单号")]
        public string TaskNo { get; set; }
        /// <summary>
        /// å•据类型
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据类型", IsOnlyIgnoreUpdate = true)]
        public int OrderType { get; set; }
        /// <summary>
        /// å•据状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据状态")]
        public int OrderStatus { get; set; }
        /// <summary>
        /// åˆ›å»ºæ–¹å¼
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "创建方式", IsOnlyIgnoreUpdate = true)]
        public int CreateType { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
        public string MaterialCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料名称")]
        public string MaterialName { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "单位")]
        public string Unit { get; set; }
        /// <summary>
        /// å•据数量
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据数量")]
        public float OrderQuantity { get; set; }
        /// <summary>
        /// å·²å‡ºæ•°é‡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "已出数量", DefaultValue = "0")]
        public float OverOutQuantity { get; set; }
        /// <summary>
        /// çº¿ä½“
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "线体")]
        public string Line { get; set; }
        /// <summary>
        /// çº¿è¾¹ä»“地址码
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "线边仓地址码")]
        public string TargetAddressCode { get; set; }
        /// <summary>
        /// è£åˆ‡å®½
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "裁切宽")]
        public float Width { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs
@@ -58,23 +58,24 @@
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "创建方式", IsOnlyIgnoreUpdate = true)]
        public int CreateType { get; set; }
        /// <summary>
        /// éƒ¨é—¨ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "部门编号")]
        public string DepartmentCode { get; set; }
        /// <summary>
        /// éƒ¨é—¨åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "部门名称")]
        public string DepartmentName { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// å‡ºåº“单明细
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrderDetail_Hty.cs
@@ -13,109 +13,30 @@
    /// 
    /// </summary>
    [SugarTable(nameof(Dt_OutboundOrderDetail_Hty), "出库单明细")]
    public class Dt_OutboundOrderDetail_Hty
    public class Dt_OutboundOrderDetail_Hty : Dt_OutboundOrderDetail, IBaseHistoryEntity
    {
        /// <summary>
        ///
        /// åŽŸè¡¨ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "出库单主键")]
        public int OrderId { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
        public string MaterielCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "批次号")]
        public string BatchNo { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, DecimalDigits = 2, ColumnDescription = "单据数量")]
        public decimal OrderQuantity { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, DecimalDigits = 2, ColumnDescription = "锁定数量", DefaultValue = "0")]
        public decimal LockQuantity { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, DecimalDigits = 2, ColumnDescription = "已出数量", DefaultValue = "0")]
        public decimal OverOutQuantity { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "订单明细状态")]
        public int OrderDetailStatus { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        ///
        /// </summary>
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "源主键")]
        [ImporterHeader(Name = "原表主键")]
        [ExporterHeader(DisplayName = "原表主键")]
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "原表主键")]
        public int SourceId { get; set; }
        /// <summary>
        ///
        /// æ“ä½œç±»åž‹
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "备注")]
        [ImporterHeader(Name = "操作类型")]
        [ExporterHeader(DisplayName = "操作类型")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "操作类型")]
        public string OperateType { get; set; }
        /// <summary>
        /// åˆ›å»ºäºº
        /// </summary>
        [ImporterHeader(Name = "创建人")]
        [ExporterHeader(DisplayName = "创建人")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "创建人")]
        public string Creater { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// ç§»å…¥åŽ†å²æ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "创建时间")]
        [ExporterHeader(DisplayName = "创建时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "创建时间")]
        public DateTime CreateDate { get; set; } = DateTime.Now;
        /// <summary>
        /// æ›´æ–°è€…
        /// </summary>
        [ImporterHeader(Name = "修改人")]
        [ExporterHeader(DisplayName = "修改人")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "修改人")]
        public string Modifier { get; set; }
        /// <summary>
        /// ä¿®æ”¹æ—¥æœŸ
        /// </summary>
        [ImporterHeader(Name = "修改日期")]
        [ExporterHeader(DisplayName = "修改日期")]
        [SugarColumn(IsNullable = true, ColumnDescription = "修改日期")]
        public DateTime? ModifyDate { get; set; }
        [ImporterHeader(Name = "移入历史时间")]
        [ExporterHeader(DisplayName = "移入历史时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "移入历史时间")]
        public DateTime InsertTime { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder_Hty.cs
@@ -11,66 +11,34 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    ///
    /// </summary>
    [SugarTable(nameof(Dt_OutboundOrder_Hty), "出库单")]
    public class Dt_OutboundOrder_Hty
    public class Dt_OutboundOrder_Hty : Dt_OutboundOrder, IBaseHistoryEntity
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "单据编号", IsOnlyIgnoreUpdate = true)]
        public string OrderNo { get; set; }
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "上游单据编号", IsOnlyIgnoreUpdate = true)]
        public string UpperOrderNo { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "单据类型", IsOnlyIgnoreUpdate = true)]
        public int OrderType { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "单据状态")]
        public int OrderStatus { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "创建方式", IsOnlyIgnoreUpdate = true)]
        public int CreateType { get; set; }
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
        public string Remark { get; set; }
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "源主键")]
        /// <summary>
        /// åŽŸè¡¨ä¸»é”®
        /// </summary>
        [ImporterHeader(Name = "原表主键")]
        [ExporterHeader(DisplayName = "原表主键")]
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "原表主键")]
        public int SourceId { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "备注")]
        /// <summary>
        /// æ“ä½œç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "操作类型")]
        [ExporterHeader(DisplayName = "操作类型")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "操作类型")]
        public string OperateType { get; set; }
        /// <summary>
        /// åˆ›å»ºäºº
        /// </summary>
        [ImporterHeader(Name = "创建人")]
        [ExporterHeader(DisplayName = "创建人")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "创建人")]
        public string Creater { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// ç§»å…¥åŽ†å²æ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "创建时间")]
        [ExporterHeader(DisplayName = "创建时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "创建时间")]
        public DateTime CreateDate { get; set; } = DateTime.Now;
        /// <summary>
        /// æ›´æ–°è€…
        /// </summary>
        [ImporterHeader(Name = "修改人")]
        [ExporterHeader(DisplayName = "修改人")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "修改人")]
        public string Modifier { get; set; }
        /// <summary>
        /// ä¿®æ”¹æ—¥æœŸ
        /// </summary>
        [ImporterHeader(Name = "修改日期")]
        [ExporterHeader(DisplayName = "修改日期")]
        [SugarColumn(IsNullable = true, ColumnDescription = "修改日期")]
        public DateTime? ModifyDate { get; set; }
        [ImporterHeader(Name = "移入历史时间")]
        [ExporterHeader(DisplayName = "移入历史时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "移入历史时间")]
        public DateTime InsertTime { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfoDetail_Hty.cs
@@ -9,81 +9,34 @@
namespace WIDESEA_Model.Models
{
    [SugarTable(nameof(Dt_StockInfoDetail_Hty), "库存信息明细")]
    public class Dt_StockInfoDetail_Hty
    /// <summary>
    /// åº“存信息明细历史
    /// </summary>
    [SugarTable(nameof(Dt_StockInfoDetail_Hty), "库存信息明细历史")]
    public class Dt_StockInfoDetail_Hty : Dt_StockInfoDetail, IBaseHistoryEntity
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "库存信息主键")]
        public int StockId { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料编号")]
        public string MaterielCode { get; set; }
        [SugarColumn(IsNullable = false, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "单据编号")]
        public string OrderNo { get; set; }
        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "批次号")]
        public string BatchNo { get; set; }
        [SugarColumn(IsNullable = false, Length = 100, ColumnDescription = "序列号")]
        public string SerialNumber { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "库存数量")]
        public decimal StockQuantity { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "出库数量", DefaultValue = "0")]
        public decimal OutboundQuantity { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "库存明细状态")]
        public int Status { get; set; }
        [SugarColumn(IsNullable = true, ColumnDescription = "备注")]
        public string Remark { get; set; }
        [Navigate(NavigateType.OneToOne, nameof(Dt_StockQuantityChangeRecord.StockDetailId), nameof(Id))]
        public Dt_StockQuantityChangeRecord StockQuantityChangeRecord { get; set; }
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "源主键")]
        /// <summary>
        /// åŽŸè¡¨ä¸»é”®
        /// </summary>
        [ImporterHeader(Name = "原表主键")]
        [ExporterHeader(DisplayName = "原表主键")]
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "原表主键")]
        public int SourceId { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "备注")]
        /// <summary>
        /// æ“ä½œç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "操作类型")]
        [ExporterHeader(DisplayName = "操作类型")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "操作类型")]
        public string OperateType { get; set; }
        /// <summary>
        /// åˆ›å»ºäºº
        /// </summary>
        [ImporterHeader(Name = "创建人")]
        [ExporterHeader(DisplayName = "创建人")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "创建人")]
        public string Creater { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// ç§»å…¥åŽ†å²æ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "创建时间")]
        [ExporterHeader(DisplayName = "创建时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "创建时间")]
        public DateTime CreateDate { get; set; } = DateTime.Now;
        /// <summary>
        /// æ›´æ–°è€…
        /// </summary>
        [ImporterHeader(Name = "修改人")]
        [ExporterHeader(DisplayName = "修改人")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "修改人")]
        public string Modifier { get; set; }
        /// <summary>
        /// ä¿®æ”¹æ—¥æœŸ
        /// </summary>
        [ImporterHeader(Name = "修改日期")]
        [ExporterHeader(DisplayName = "修改日期")]
        [SugarColumn(IsNullable = true, ColumnDescription = "修改日期")]
        public DateTime? ModifyDate { get; set; }
        [ImporterHeader(Name = "移入历史时间")]
        [ExporterHeader(DisplayName = "移入历史时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "移入历史时间")]
        public DateTime InsertTime { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo_Hty.cs
@@ -9,62 +9,34 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// åº“存信息历史
    /// </summary>
    [SugarTable(nameof(Dt_StockInfo_Hty), "库存信息")]
    public class Dt_StockInfo_Hty
    public class Dt_StockInfo_Hty : Dt_StockInfo, IBaseHistoryEntity
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "托盘编号")]
        public string PalletCode { get; set; }
        [SugarColumn(IsNullable = true, Length = 30, ColumnDescription = "货位编号")]
        public string LocationCode { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "是否满盘", DefaultValue = "0")]
        public bool IsFull { get; set; }
        [SugarColumn(IsNullable = false, ColumnDescription = "库存状态")]
        public int StockStatus { get; set; }
        [SugarColumn(IsNullable = true, ColumnDescription = "备注")]
        public string Remark { get; set; }
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "源主键")]
        /// <summary>
        /// åŽŸè¡¨ä¸»é”®
        /// </summary>
        [ImporterHeader(Name = "原表主键")]
        [ExporterHeader(DisplayName = "原表主键")]
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "原表主键")]
        public int SourceId { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "备注")]
        /// <summary>
        /// æ“ä½œç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "操作类型")]
        [ExporterHeader(DisplayName = "操作类型")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "操作类型")]
        public string OperateType { get; set; }
        /// <summary>
        /// åˆ›å»ºäºº
        /// </summary>
        [ImporterHeader(Name = "创建人")]
        [ExporterHeader(DisplayName = "创建人")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "创建人")]
        public string Creater { get; set; }
        /// <summary>
        /// åˆ›å»ºæ—¶é—´
        /// ç§»å…¥åŽ†å²æ—¶é—´
        /// </summary>
        [ImporterHeader(Name = "创建时间")]
        [ExporterHeader(DisplayName = "创建时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "创建时间")]
        public DateTime CreateDate { get; set; } = DateTime.Now;
        /// <summary>
        /// æ›´æ–°è€…
        /// </summary>
        [ImporterHeader(Name = "修改人")]
        [ExporterHeader(DisplayName = "修改人")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "修改人")]
        public string Modifier { get; set; }
        /// <summary>
        /// ä¿®æ”¹æ—¥æœŸ
        /// </summary>
        [ImporterHeader(Name = "修改日期")]
        [ExporterHeader(DisplayName = "修改日期")]
        [SugarColumn(IsNullable = true, ColumnDescription = "修改日期")]
        public DateTime? ModifyDate { get; set; }
        [ImporterHeader(Name = "移入历史时间")]
        [ExporterHeader(DisplayName = "移入历史时间")]
        [SugarColumn(IsNullable = false, ColumnDescription = "移入历史时间")]
        public DateTime InsertTime { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/System/Sys_Log.cs
@@ -8,6 +8,9 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// æŽ¥å£æ—¥å¿—
    /// </summary>
    [SugarTable(nameof(Sys_Log), "接口日志")]
    public class Sys_Log
    {
@@ -34,12 +37,6 @@
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "结束时间")]
        public DateTime EndDate { get; set; }
        /// <summary>
        /// æ—¥å¿—类型
        /// </summary>
        //[SugarColumn(IsNullable = true, ColumnDescription = "日志类型")]
        //public DateTime LogType { get; set; }
        /// <summary>
        /// è¯·æ±‚参数
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/TaskInfo/Dt_Task_Hty.cs
@@ -11,6 +11,9 @@
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// ä»»åŠ¡ä¿¡æ¯åŽ†å²
    /// </summary>
    [SugarTable(nameof(Dt_Task_Hty), "任务信息历史")]
    public class Dt_Task_Hty : Dt_Task, IBaseHistoryEntity
    {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/WIDESEA_Model.csproj
@@ -4,6 +4,7 @@
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
        <GenerateDocumentationFile>True</GenerateDocumentationFile>
  </PropertyGroup>
  <ItemGroup>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundRepository/MesOutboundOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_OutboundRepository
{
    public class MesOutboundOrderRepository : RepositoryBase<Dt_MesOutboundOrder>, IMesOutboundOrderRepository
    {
        public MesOutboundOrderRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/MesOutboundOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.MES;
using WIDESEA_DTO;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Core.Helper;
using WIDESEA_IBasicRepository;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
namespace WIDESEA_OutboundService
{
    public class MesOutboundOrderService : ServiceBase<Dt_MesOutboundOrder, IMesOutboundOrderRepository>, IMesOutboundOrderService
    {
        private readonly IBasicRepository _basicRepository;
        public MesOutboundOrderService(IMesOutboundOrderRepository BaseDal, IBasicRepository basicRepository) : base(BaseDal)
        {
            _basicRepository = basicRepository;
        }
        public MesResponseContent SubstrateOut(SubstrateOutModel model)
        {
            try
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA57.ToString());
                if (warehouse == null)
                {
                    return MesResponseContent.Instance.Error($"仓库基础信息未配置");
                }
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterialCode);
                if (materielInfo == null)
                {
                    return MesResponseContent.Instance.Error($"未找到该物料信息");
                }
                Dt_MesOutboundOrder mesOutboundOrder = new Dt_MesOutboundOrder()
                {
                    CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
                    Line = model.Line,
                    MaterialCode = model.MaterialCode,
                    MaterialName = model.MaterialName,
                    OrderQuantity = model.RequiredQuantity,
                    TaskNo = model.TaskNo,
                    Unit = model.Unit,
                    OrderType = MesOutboundOrderTypeEnum.SubstrateOut.ObjToInt(),
                    OrderStatus = OutOrderStatusEnum.未开始.ObjToInt(),
                    WarehouseId = warehouse.WarehouseId
                };
                BaseDal.AddData(mesOutboundOrder);
                return MesResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return MesResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs
@@ -9,17 +9,20 @@
{
    public class OutboundService : IOutboundService
    {
        public IMesOutboundOrderService MesOutboundOrderService { get; }
        public IOutboundOrderDetailService OutboundOrderDetailService { get; }
        public IOutboundOrderService OutboundOrderService { get; }
        public IOutStockLockInfoService OutboundStockLockInfoService { get; }
        public OutboundService(IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService)
        public OutboundService(IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IMesOutboundOrderService mesOutboundOrderService)
        {
            OutboundOrderDetailService = outboundOrderDetailService;
            OutboundOrderService = outboundOrderService;
            OutboundStockLockInfoService = outboundStockLockInfoService;
            MesOutboundOrderService = mesOutboundOrderService;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_RecordService/Service/StockQuantityChangeRecordService.cs
@@ -28,7 +28,7 @@
                {
                    x.PalleCode = stockInfo.PalletCode;
                    x.BeforeQuantity = beforeQuantity;
                    if (totalQuantity > beforeQuantity)
                    if (totalQuantity >= beforeQuantity)
                    {
                        x.ChangeQuantity = stockInfoDetails[index].StockQuantity;
                        currentQuantity += stockInfoDetails[index].StockQuantity;
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs
@@ -8,12 +8,14 @@
using System.Drawing.Printing;
using System.Dynamic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Const;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_Core.Utilities;
@@ -37,26 +39,46 @@
        public virtual PageGridData<StockViewDTO> GetPageData(PageDataOptions options)
        {
            List<StockViewDTO> stockViewDTOs = new List<StockViewDTO>();
            //string where = options.ValidatePageOptions(typeof(StockViewDTO).GetProperties());
            //获取排序字段
            //Dictionary<string, OrderByType> orderbyDic = options.GetPageDataSort(typeof(StockViewDTO).GetProperties());
            //List<OrderByModel> orderByModels = new List<OrderByModel>();
            //foreach (var item in orderbyDic)
            //{
            //    OrderByModel orderByModel = new OrderByModel()
            //    {
            //        FieldName = item.Key,
            //        OrderByType = item.Value
            //    };
            //    orderByModels.Add(orderByModel);
            //}
            int totalCount = 0;
            string where = string.Empty;
            ISugarQueryable<Dt_StockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_StockInfo>().Includes(x=>x.Details);
            if (!string.IsNullOrEmpty(options.Wheres))
            {
                try
                {
                    List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
                    if (searchParametersList.Count > 0)
                    {
                        {
                            SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower());
                            if (searchParameters != null)
                            {
                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details.Any(v => v.MaterielCode.Contains(searchParameters.Value)));
                            }
                        }
                        {
                            SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower());
                            if (searchParameters != null)
                            {
                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details.Any(v => v.BatchNo.Contains(searchParameters.Value)));
                            }
                        }
                    }
                }
                catch { }
            }
            EntityProperties.ValidatePageOptions(options, ref sugarQueryable1);
            ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>();
            
            List<StockViewDTO> list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a)
            EntityProperties.ValidatePageOptions(options, ref sugarQueryable);
            ISugarQueryable<StockViewDTO> list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a)
                => new StockViewDTO
            {
                LocationCode = b.LocationCode,
@@ -78,43 +100,21 @@
                StockId = b.Id,
                StockStatus = b.StockStatus,
                Details = b.Details,
            }).ToPageList(options.Page, options.Rows, ref totalCount);
            list.ForEach(x =>
                });
            int totalCount = 0;
            stockViewDTOs = list.ToPageList(options.Page, options.Rows, ref totalCount);
            stockViewDTOs.ForEach(x =>
                {
                    x.MaterielCode = string.Join(",", x.Details.Select(x => x.MaterielCode).Distinct());
                    x.BatchNo = string.Join(",", x.Details.Select(x => x.BatchNo).Distinct());
                }   
            );
            if (options.Wheres.IsNotEmptyOrNull())
            {
                List<SearchParameters> searchParameters = options.Wheres.DeserializeObject<List<SearchParameters>>();
                foreach (var item in searchParameters)
                {
                    switch (item.Name)
                    {
                        case "palletCode":
                            list = list.Where(x => x.PalletCode.Contains(item.Value)).ToList();
                            break;
                        case "locationStatus":
                            List<int> locationStatus = item.Value.Split(",").Select(int.Parse).ToList();
                            list = list.Where(x => locationStatus.Contains(x.LocationStatus)).ToList();
                            break;
                        case "stockStatus":
                            List<int> stockStatus = item.Value.Split(",").Select(int.Parse).ToList();
                            list = list.Where(x => stockStatus.Contains(x.StockStatus)).ToList();
                            break;
                        case "materielCode":
                            list = list.Where(x => x.MaterielCode.Contains(item.Value)).ToList();
                            break;
                        case "batchNo":
                            list=list.Where(x => x.BatchNo.Contains(item.Value)).ToList();
                            break;
                        default:
                            break;
                    }
                }
            }
            return new PageGridData<StockViewDTO>(totalCount, list);
            return new PageGridData<StockViewDTO>(totalCount, stockViewDTOs);
        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -246,5 +246,6 @@
            }
            return content;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs
@@ -78,5 +78,10 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        //public WebResponseContent UpdateTaskInfo(WCSTaskDTO taskDTO)
        //{
        //}
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/ERP/ErpController.cs
@@ -16,6 +16,7 @@
using WIDESEA_IBasicService;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
using WIDESEA_InboundService;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
using static WIDESEA_DTO.ErpResponseContent;
@@ -29,23 +30,15 @@
    [ApiController]
    public class ErpController : ControllerBase
    {
        private readonly IPurchaseOrderRepository _purchaseOrderRepository;
        private readonly IPurchaseOrderService _purchaseOrderService;
        private readonly ISupplierInfoService _supplierInfoService;
        private readonly IMaterielInfoService _materielInfoService;
        private readonly IOutboundOrderService _outboundOrderService;
        private readonly ICustomerInfoService _customerInfoService;
        private readonly IUserInfoService _userInfoService;
        private readonly IBasicService _basicService;
        private readonly IOutboundService _outboundService;
        private readonly IInboundService _inboundService;
        public ErpController(IPurchaseOrderRepository purchaseOrderRepository, IPurchaseOrderService purchaseOrderService, ISupplierInfoService supplierInfoService, IMaterielInfoService materielInfoService, IOutboundOrderService outboundOrderService,ICustomerInfoService customerInfoService, IUserInfoService userInfoService)
        public ErpController(IBasicService basicService, IOutboundService outboundService, IInboundService inboundService)
        {
            _purchaseOrderRepository = purchaseOrderRepository;
            _purchaseOrderService = purchaseOrderService;
            _supplierInfoService = supplierInfoService;
            _materielInfoService = materielInfoService;
            _outboundOrderService = outboundOrderService;
            _customerInfoService = customerInfoService;
            _userInfoService = userInfoService;
            _basicService = basicService;
            _outboundService = outboundService;
            _inboundService = inboundService;
        }
        /// <summary>
@@ -56,7 +49,7 @@
        [HttpPost, Route("ReceivePurchaseOrder"), AllowAnonymous, MethodParamsValidate]
        public ErpResponseContent ReceivePurchaseOrder([FromBody] Root<PurchaseOrderModel> model)
        {
            WebResponseContent content = _purchaseOrderService.ReceivePurchaseOrder(model.Content);
            WebResponseContent content = _inboundService.PurchaseOrderService.ReceivePurchaseOrder(model.Content);
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
@@ -69,7 +62,7 @@
        [HttpPost, Route("ReceiveUser"), AllowAnonymous, MethodParamsValidate]
        public ErpResponseContent ReceiveUser([FromBody] Root<UserInfoDTO> model)
        {
            WebResponseContent content = _userInfoService.ReceiveUser(model.Content);
            WebResponseContent content = _basicService.UserInfoService.ReceiveUser(model.Content);
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
@@ -82,7 +75,7 @@
        [HttpPost, Route("ReceiveSupplier"), AllowAnonymous, MethodParamsValidate]
        public ErpResponseContent ReceiveSupplier([FromBody] Root<SupplierDTO> model)
        {
            WebResponseContent content = _supplierInfoService.ReceiveSupplier(model.Content);
            WebResponseContent content = _basicService.SupplierInfoService.ReceiveSupplier(model.Content);
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
@@ -95,7 +88,7 @@
        [HttpPost, Route("ReceiveMaterial"), AllowAnonymous, MethodParamsValidate]
        public ErpResponseContent ReceiveMaterial([FromBody] Root<MaterielInfoDTO> model)
        {
            WebResponseContent content = _materielInfoService.ReceiveMaterial(model.Content);
            WebResponseContent content = _basicService.MaterielInfoService.ReceiveMaterial(model.Content);
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
@@ -108,7 +101,7 @@
        [HttpPost, Route("ReceiveCustomer"), AllowAnonymous, MethodParamsValidate]
        public ErpResponseContent ReceiveCustomer([FromBody] Root<CustomerInfoDTO> model)
        {
            WebResponseContent content = _customerInfoService.ReceiveCustomer(model.Content);
            WebResponseContent content = _basicService.CustomerInfoService.ReceiveCustomer(model.Content);
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
@@ -121,7 +114,7 @@
        [HttpPost, Route("ReceiveOutOrder"), AllowAnonymous, MethodParamsValidate]
        public ErpResponseContent ReceiveOutOrder([FromBody] Root<ErpOutOrderDTO> erpOutOrder)
        {
            WebResponseContent content = _outboundOrderService.ReceiveOutOrder(erpOutOrder.Content);
            WebResponseContent content = _outboundService.OutboundOrderService.ReceiveOutOrder(erpOutOrder.Content);
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs
@@ -22,22 +22,15 @@
    [ApiController]
    public class MesController : ControllerBase
    {
        private readonly IPurchaseOrderRepository _purchaseOrderRepository;
        private readonly IPurchaseOrderService _purchaseOrderService;
        private readonly ISupplierInfoService _supplierInfoService;
        private readonly IMaterielInfoService _materielInfoService;
        private readonly IOutboundOrderService _outboundOrderService;
        private readonly IOutboundService _outboundService;
        private readonly ITaskService _taskService;
        public MesController(IPurchaseOrderRepository purchaseOrderRepository, IPurchaseOrderService purchaseOrderService, ISupplierInfoService supplierInfoService, IMaterielInfoService materielInfoService, IOutboundOrderService outboundOrderService, ITaskService taskService)
        public MesController(IOutboundService outboundService, ITaskService taskService)
        {
            _purchaseOrderRepository = purchaseOrderRepository;
            _purchaseOrderService = purchaseOrderService;
            _supplierInfoService = supplierInfoService;
            _materielInfoService = materielInfoService;
            _outboundOrderService = outboundOrderService;
            _outboundService = outboundService;
            _taskService = taskService;
        }
        /// <summary>
        /// æŽ¥æ”¶MES测试架出库
        /// </summary>
@@ -48,6 +41,7 @@
        {
            return _taskService.TestToolOut(model.Content);
        }
        /// <summary>
        /// æŽ¥æ”¶MES测试架退库
        /// </summary>
@@ -58,6 +52,7 @@
        {
            return _taskService.TestToolBack(model.Content);
        }
        /// <summary>
        /// æµ‹è¯•架报废
        /// </summary>
@@ -68,15 +63,27 @@
        {
            return _taskService.TestScrap(model.Content);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="toolSynInfo"></param>
        /// <returns></returns>
        [HttpPost, Route("TestSynStock"), AllowAnonymous]
        public WebResponseContent TestSynStock([FromBody]TestToolSynInfo toolSynInfo)
        {
            return _taskService.TestSynStock(toolSynInfo);
        }
        [HttpPost, Route("testHttp"), AllowAnonymous, MethodParamsValidate]
        public string TestScrap(string str)
        /// <summary>
        ///
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost, Route("SubstrateOut"), AllowAnonymous]
        public MesResponseContent SubstrateOut([FromBody] Root<SubstrateOutModel> model)
        {
            return HttpMesHelper.GetStr(str);
            return _outboundService.MesOutboundOrderService.SubstrateOut(model.Content);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/System/Sys_UserController.cs
@@ -2,12 +2,14 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json;
using StackExchange.Profiling;
using WIDESEA_Core;
using WIDESEA_Core.Authorization;
using WIDESEA_Core.BaseController;
using WIDESEA_Core.Caches;
using WIDESEA_Core.Const;
using WIDESEA_Core.Extensions;
using WIDESEA_Core.Helper;
using WIDESEA_Core.HttpContextUser;
using WIDESEA_Core.Utilities;
@@ -37,6 +39,30 @@
        public IActionResult Login([FromBody] LoginInfo loginInfo)
        {
            return Json(Service.Login(loginInfo));
        }
        [HttpPost, Route("swgLogin"), AllowAnonymous]
        public dynamic SwgLogin([FromBody] SwaggerLoginRequest loginRequest)
        {
            if (loginRequest is null)
            {
                return new { result = false };
            }
            try
            {
                if (loginRequest.name == "admin" && loginRequest.pwd == $"admin!{DateTime.Now.ToString("yyyyMMdd")}")
                {
                    HttpContext.SuccessSwagger();
                    return new { result = true };
                }
            }
            catch (Exception ex)
            {
            }
            return new { result = false };
        }
        [HttpPost, Route("getCurrentUserInfo")]
@@ -98,4 +124,10 @@
        }
    }
    public class SwaggerLoginRequest
    {
        public string name { get; set; }
        public string pwd { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -43,6 +43,13 @@
            return Service.RequestInboundTask(saveModel);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="stationCode"></param>
        /// <param name="roadwayNo"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("DeviceRequestInboundTask"), AllowAnonymous]
        public WebResponseContent DeviceRequestInboundTask(string stationCode, string roadwayNo, string palletCode)
        {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Program.cs
@@ -106,8 +106,8 @@
//if (app.Environment.IsDevelopment())
{
    //todo
    //app.UseSwaggerAuthorized();
    app.UseSwaggerMiddle(() => Assembly.GetExecutingAssembly().GetManifestResourceStream("WIDESEA_WMSServer.index.html"));
    app.UseSwaggerAuthorized();
    app.UseSwaggerMiddle(() => Assembly.GetExecutingAssembly().GetManifestResourceStream("WIDESEA_WMSServer.index.html") ?? throw new Exception("WIDESEA_WMSServer.index.html文件"));
}//判断是否需要打开swagger
app.UseIpLimitMiddle();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -28,5 +28,6 @@
  "ApiName": "WIDESEA",
  "ExpMinutes": 120,
  "QuartzJobAutoStart": true,
  "PDAVersion": "2"
  "PDAVersion": "2",
  "WebSocketPort": 9296
}