刘磊
2025-12-18 1c7d84d153f22148c7c8dbf80aa646edb0c53648
同步
已添加16个文件
已复制1个文件
已重命名1个文件
已修改15个文件
1950 ■■■■ 文件已修改
项目代码/WMS/WMSClient/src/extension/widesea_wms/OrderInfo/Dt_AssemblyOrderInfo.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/extension/widesea_wms/OrderInfo/Dt_PaintingOrderInfo.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/router/tables.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/widesea_wms/OrderInfo/Dt_AssemblyOrderInfo.vue 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/widesea_wms/OrderInfo/Dt_PaintingOrderInfo.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSClient/src/views/widesea_wms/taskinfo/Dt_Task.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/.vs/WIDESEA_WMSServer/v17/HierarchyCache.v1.txt 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_BusinessServices/Dt_AreaInfoService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_Common/BDC/BDCEnum.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_IStorageBasicService/BasicInfo/IDt_BDCConfigurationService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_IStorageOutOrderRepository/OutboundOrder/IDt_AssemblyOrderInfoRepository.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_IStorageOutOrderRepository/OutboundOrder/IDt_PaintingOrderInfoRepository.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_IStorageOutOrderService/OutboundOrder/IDt_AssemblyOrderInfoService.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_IStorageOutOrderService/OutboundOrder/IDt_PaintingOrderInfoService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_IStorageTaskService/BDCManager/IBDCManager.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_Model/Models/BasicInfo/Dt_BDCConfiguration.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_Model/Models/Inbound/Dt_AssemblyOrderInfo.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_Model/Models/Inbound/Dt_PaintingOrderInfo.cs 148 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StoragIntegrationServices/MES/MESService.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StoragIntegrationServices/MES/Partial/pushOrderInfo.cs 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageBasicServices/BasicInfo/Dt_BDCConfigurationService.cs 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageOutOrderRepository/OutboundOrder/Dt_AssemblyOrderInfoRepository.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageOutOrderRepository/OutboundOrder/Dt_PaintingOrderInfoRepository.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_AssemblyOrderInfoService.cs 473 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_PaintingOrderInfoService.cs 473 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageTaskServices/BDCManager/BDCManager.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageTaskServices/BDCManager/Partial/BDCManager.cs 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_WMSServer/Controllers/BasicInfo/Dt_BDCConfigurationController.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_WMSServer/Controllers/MES/MESController.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_WMSServer/Controllers/OutboundOrder/Dt_AssemblyOrderInfoController.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WMSServer/WIDESEA_WMSServer/Controllers/OutboundOrder/Dt_PaintingOrderInfoController.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/widesea_wms/OrderInfo/Dt_AssemblyOrderInfo.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
/*****************************************************************************************
**  Author:jxx 2022
**  QQ:283591387
**完整文档见:http://v2.volcore.xyz/document/api ã€ä»£ç ç”Ÿæˆé¡µé¢ViewGrid】
**常用示例见:http://v2.volcore.xyz/document/vueDev
**后台操作见:http://v2.volcore.xyz/document/netCoreDev
*****************************************************************************************/
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
let extension = {
  components: {
    //查询界面扩展组件
    gridHeader: '',
    gridBody: '',
    gridFooter: '',
    //新建、编辑弹出框扩展组件
    modelHeader: '',
    modelBody: '',
    modelFooter: ''
  },
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
  methods: {
     //下面这些方法可以保留也可以删除
    onInit() {  //框架初始化配置前,
        //示例:在按钮的最前面添加一个按钮
        //   this.buttons.unshift({  //也可以用push或者splice方法来修改buttons数组
        //     name: '按钮', //按钮名称
        //     icon: 'el-icon-document', //按钮图标vue2版本见iview文档icon,vue3版本见element ui文档icon(注意不是element puls文档)
        //     type: 'primary', //按钮样式vue2版本见iview文档button,vue3版本见element ui文档button
        //     onClick: function () {
        //       this.$Message.success('点击了按钮');
        //     }
        //   });
        //示例:设置修改新建、编辑弹出框字段标签的长度
        this.boxOptions.labelWidth = 150;
    },
    onInited() {
      //框架初始化配置后
      //如果要配置明细表,在此方法操作
      //this.detailOptions.columns.forEach(column=>{ });
    },
    searchBefore(param) {
      //界面查询前,可以给param.wheres添加查询参数
      //返回false,则不会执行查询
      return true;
    },
    searchAfter(result) {
      //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
      return true;
    },
    addBefore(formData) {
      //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
      return true;
    },
    updateBefore(formData) {
      //编辑保存前formData为对象,包括明细表、删除行的Id
      return true;
    },
    rowClick({ row, column, event }) {
      //查询界面点击行事件
      // this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
    },
    modelOpenAfter(row) {
      //点击编辑、新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
      //(1)判断是编辑还是新建操作: this.currentAction=='Add';
      //(2)给弹出框设置默认值
      //(3)this.editFormFields.字段='xxx';
      //如果需要给下拉框设置默认值,请遍历this.editFormOptions找到字段配置对应data属性的key值
      //看不懂就把输出看:console.log(this.editFormOptions)
    }
  }
};
export default extension;
ÏîÄ¿´úÂë/WMS/WMSClient/src/extension/widesea_wms/OrderInfo/Dt_PaintingOrderInfo.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
/*****************************************************************************************
**  Author:jxx 2022
**  QQ:283591387
**完整文档见:http://v2.volcore.xyz/document/api ã€ä»£ç ç”Ÿæˆé¡µé¢ViewGrid】
**常用示例见:http://v2.volcore.xyz/document/vueDev
**后台操作见:http://v2.volcore.xyz/document/netCoreDev
*****************************************************************************************/
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
let extension = {
  components: {
    //查询界面扩展组件
    gridHeader: '',
    gridBody: '',
    gridFooter: '',
    //新建、编辑弹出框扩展组件
    modelHeader: '',
    modelBody: '',
    modelFooter: ''
  },
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
  methods: {
     //下面这些方法可以保留也可以删除
    onInit() {  //框架初始化配置前,
        //示例:在按钮的最前面添加一个按钮
        //   this.buttons.unshift({  //也可以用push或者splice方法来修改buttons数组
        //     name: '按钮', //按钮名称
        //     icon: 'el-icon-document', //按钮图标vue2版本见iview文档icon,vue3版本见element ui文档icon(注意不是element puls文档)
        //     type: 'primary', //按钮样式vue2版本见iview文档button,vue3版本见element ui文档button
        //     onClick: function () {
        //       this.$Message.success('点击了按钮');
        //     }
        //   });
        //示例:设置修改新建、编辑弹出框字段标签的长度
        this.boxOptions.labelWidth = 150;
    },
    onInited() {
      //框架初始化配置后
      //如果要配置明细表,在此方法操作
      //this.detailOptions.columns.forEach(column=>{ });
    },
    searchBefore(param) {
      //界面查询前,可以给param.wheres添加查询参数
      //返回false,则不会执行查询
      return true;
    },
    searchAfter(result) {
      //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
      return true;
    },
    addBefore(formData) {
      //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
      return true;
    },
    updateBefore(formData) {
      //编辑保存前formData为对象,包括明细表、删除行的Id
      return true;
    },
    rowClick({ row, column, event }) {
      //查询界面点击行事件
      // this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
    },
    modelOpenAfter(row) {
      //点击编辑、新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
      //(1)判断是编辑还是新建操作: this.currentAction=='Add';
      //(2)给弹出框设置默认值
      //(3)this.editFormFields.字段='xxx';
      //如果需要给下拉框设置默认值,请遍历this.editFormOptions找到字段配置对应data属性的key值
      //看不懂就把输出看:console.log(this.editFormOptions)
    }
  }
};
export default extension;
ÏîÄ¿´úÂë/WMS/WMSClient/src/router/tables.js
@@ -284,21 +284,28 @@
    // }
  },
  {
    path: '/VV_PalletStockInfo',
    name: 'VV_PalletStockInfo',
    component: () => import('@/views/widesea_wms/stock/VV_PalletStockInfo.vue'),
    // meta: {
    //   keepAlive: true
    // }
  },
  {
    path: '/locationInfoRow',
    name: 'locationInfoRow',
    component: () => import('@/views/widesea_wms/stock/locationInfoRow.vue'),
    meta: {
      keepAlive: false
    }
  },
  {
    path: '/Dt_PaintingOrderInfo',
    name: 'Dt_PaintingOrderInfo',
    component: () => import('@/views/widesea_wms/OrderInfo/Dt_PaintingOrderInfo.vue'),
    // meta: {
    //   keepAlive: true
    // }
  },
  {
    path: '/Dt_AssemblyOrderInfo',
    name: 'Dt_AssemblyOrderInfo',
    component: () => import('@/views/widesea_wms/OrderInfo/Dt_AssemblyOrderInfo.vue'),
    // meta: {
    //   keepAlive: true
    // }
  }
]
export default tables
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/widesea_wms/OrderInfo/Dt_AssemblyOrderInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
<!--
*Author:jxx
 *Contact:283591387@qq.com
 *代码由框架生成,任何更改都可能导致被代码生成器覆盖
 *业务请在@/extension/widesea_wms/invoices/Dt_OutOrder.js此处编写
 -->
<template>
    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
        :table="table" :extend="extend">
    </view-grid>
</template>
<script>
import extend from "@/extension/widesea_wms/OrderInfo/Dt_AssemblyOrderInfo.js";
import { ref, defineComponent } from "vue";
export default defineComponent({
    setup() {
        const table = ref({
            key: 'id',
            footer: "Foots",
            cnName: '涂装工单',
            name: 'Orderinfo/Dt_AssemblyOrderInfo',
            url: "/Dt_AssemblyOrderInfo/",
            sortName: "Id"
        });
        const editFormFields = ref({
            "orderNumber": "",
            "status": "",
            "orderDate": "",
            "warehouseId": "",
            "upperOutOrderId": "",
            "remarks": "",
        });
        const editFormOptions = ref([
        ]);
        const searchFormFields = ref({});
        const searchFormOptions = ref([
            [
                { "title": "工单号", "field": "workOrderNo", "type": "text" },
                { "title": "订单号", "field": "vehicleOrderNo", "type": "text" },
                { "title": "pvi", "field": "pvi", "type": "text" },
            ],
        ]);
        const columns = ref([{ field: 'Id', title: '主键', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
        { field: 'plantCode', title: '工厂', type: 'string', width: 220, require: true, align: 'left', sort: true },
        { field: 'splitStrategy', title: '生产模式', type: 'string', width: 110, require: true, align: 'left' },
        { field: 'vehicleOrderNo', title: '订单号', type: 'string', width: 220, require: true, align: 'left' },
        { field: 'orderType', title: '订单类型', type: 'string', width: 110, require: true, align: 'left', bind: { key: "OutOrderType", data: [] } },
        { field: 'workOrderNo', title: '工单号', type: 'string', width: 220, require: true, align: 'left' },
        { field: 'pvi', title: 'pvi', type: 'string', width: 220, require: true, align: 'left' },
        { field: 'sequenceNo', title: '工单顺序号', type: 'string', width: 220, require: true, align: 'left' },
        { field: 'vehicleCharacteristic', title: '车型特征值', type: 'string', width: 150, require: true, align: 'left', sort: true },
        { field: 'vehicleCode', title: '整车物料号', type: 'string', width: 110, require: true, align: 'left' },
        { field: 'biwMaterial', title: '白车身物料号', type: 'string', width: 220, require: true, align: 'left', sort: true },
        { field: 'pbMaterial', title: '彩车身物料号', type: 'string', width: 220, require: true, align: 'left' },
        { field: 'workOrderSendStatus', title: '工单下发状态', type: 'string', width: 220, require: true, align: 'left' },
        { field: 'spare1', title: '备用1', type: 'string', width: 110, require: true, align: 'left' },
        { field: 'spare2', title: '备用2', type: 'string', width: 110, require: true, align: 'left' },
        { field: 'spare3', title: '备用3', type: 'string', width: 110, require: true, align: 'left' },
        { field: 'creater', title: '创建人', type: 'string', sort: true, width: 110, align: 'left' },
        { field: 'createDate', title: '创建时间', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
        { field: 'modifier', title: '修改人', type: 'string', sort: true, width: 100, align: 'left' },
        { field: 'modifyDate', title: '修改时间', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
        ]);
        const detail = ref({
            cnName: "出库明细订单",
            table: "#detailTable",
            columns: [
            ],
            sortName: "id",
            key: "iD"
        });
        return {
            table,
            extend,
            editFormFields,
            editFormOptions,
            searchFormFields,
            searchFormOptions,
            columns,
            detail,
        };
    },
});
</script>
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/widesea_wms/OrderInfo/Dt_PaintingOrderInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
<!--
*Author:jxx
 *Contact:283591387@qq.com
 *代码由框架生成,任何更改都可能导致被代码生成器覆盖
 *业务请在@/extension/widesea_wms/invoices/Dt_OutOrder.js此处编写
 -->
<template>
    <view-grid ref="grid"
               :columns="columns"
               :detail="detail"
               :editFormFields="editFormFields"
               :editFormOptions="editFormOptions"
               :searchFormFields="searchFormFields"
               :searchFormOptions="searchFormOptions"
               :table="table"
               :extend="extend">
    </view-grid>
</template>
<script>
    import extend from "@/extension/widesea_wms/OrderInfo/Dt_PaintingOrderInfo.js";
    import { ref, defineComponent } from "vue";
    export default defineComponent({
        setup() {
            const table = ref({
                key: 'id',
                footer: "Foots",
                cnName: '涂装工单',
                name: 'Orderinfo/Dt_PaintingOrderInfo',
                url: "/Dt_PaintingOrderInfo/",
                sortName: "Id"
            });
            const editFormFields = ref({
                "orderNumber":"",
                "status":"",
                "orderDate":"",
                "warehouseId":"",
                "upperOutOrderId":"",
                "remarks":"",
            });
            const editFormOptions = ref([
            ]);
            const searchFormFields = ref({});
            const searchFormOptions = ref([
            [
                { "title": "工单号", "field": "workOrderNo", "type": "text" },
                { "title": "pvi", "field": "pvi", "type": "text" },
                { "title": "出库日期", "field": "orderDate", "type": "datetime" },
            ],
            ]);
            const columns = ref([{field:'Id',title:'主键',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
                       {field:'plantCode',title:'工厂',type:'string',width:220,require:true,align:'left',sort:true},
                       {field:'workshopCode',title:'车间',type:'string',width:150,require:true,align:'left',sort:true},
                       {field:'splitStrategy',title:'生产模式',type:'string',width:110,require:true,align:'left'},
                       {field:'workOrderNo',title:'工单号',type:'string',width:220,require:true,align:'left'},
                       {field:'workOrderType',title:'工单类型',type:'string',width:110,require:true,align:'left',bind: { key: "OutOrderType", data: []}},
                       {field:'pvi',title:'pvi',type:'string',width:220,require:true,align:'left'},
                       {field:'biwMaterial',title:'白车身物料号',type:'string',width:220,require:true,align:'left',sort:true},
                       {field:'vehicleCharacteristic',title:'车型特征值',type:'string',width:150,require:true,align:'left',sort:true},
                       {field:'skylightCharacteristic',title:'天窗特征值',type:'string',width:110,require:true,align:'left'},
                       {field:'carBodyCharacteristic',title:'车身颜色',type:'string',width:220,require:true,align:'left'},
                       {field:'twoToneCharacteristic',title:'双色车身',type:'string',width:110,require:true,align:'left'},
                       {field:'sequenceNo',title:'工单顺序号',type:'string',width:220,require:true,align:'left'},
                       {field:'config1',title:'CTC配置',type:'string',width:110,require:true,align:'left'},
                       {field:'pbMaterial',title:'彩车身物料号',type:'string',width:220,require:true,align:'left'},
                       {field:'config3',title:'备用3',type:'string',width:110,require:true,align:'left'},
                       {field:'workOrderSendStatus',title:'工单下发状态',type:'string',width:220,require:true,align:'left'},
                       {field:'creater',title:'创建人',type:'string',sort:true,width:110,align:'left'},
                       {field:'createDate',title:'创建时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'modifier',title:'修改人',type:'string',sort:true,width:100,align:'left'},
                       {field:'modifyDate',title:'修改时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       ]);
            const detail = ref({
                cnName: "出库明细订单",
                table: "#detailTable",
                columns: [
                ],
                sortName: "id",
                key: "iD"
            });
            return {
                table,
                extend,
                editFormFields,
                editFormOptions,
                searchFormFields,
                searchFormOptions,
                columns,
                detail,
            };
        },
    });
</script>
ÏîÄ¿´úÂë/WMS/WMSClient/src/views/widesea_wms/taskinfo/Dt_Task.vue
@@ -31,7 +31,7 @@
        const searchFormOptions = ref([
            [
                { "title": "任务号", "field": "taskNum", "type": "text" },
                { "title": "托盘/料箱号", "field": "palletCode", "type": "text" },
                { "title": "滑橇号", "field": "palletCode", "type": "text" },
                { "title": "任务类型", "field": "taskType", "type": "select", dataKey: "TaskType", data: [] },
                { "title": "任务状态", "field": "taskState", "type": "select", dataKey: "TaskStatus", data: [] },
@@ -51,7 +51,7 @@
        const columns = ref([{ field: 'TaskId', title: '主键', type: 'string', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
        { field: 'taskNum', title: '任务号', type: 'int', width: 110, align: 'left', sort: true },
        { field: 'pvi', title: 'pvi', type: 'int', width: 110, align: 'left',},
        { field: 'palletCode', title: '托盘/料箱号', type: 'string', width: 180, align: 'left' },
        { field: 'palletCode', title: '滑橇号', type: 'string', width: 180, align: 'left' },
        { field: 'pnboundNo', title: '单据号', type: 'string', width: 110, align: 'left',hidden:true },
        { field: 'groupID', title: '库存ID', type: 'int', width: 110, hidden: true, align: 'left' },
        { field: 'groupDetailId', title: '组盘明细ID', type: 'int', width: 110, hidden: true, align: 'left' },
ÏîÄ¿´úÂë/WMS/WMSServer/.vs/WIDESEA_WMSServer/v17/HierarchyCache.v1.txt
Binary files differ
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_BusinessServices/Dt_AreaInfoService.cs
@@ -20,7 +20,6 @@
        /// èŽ·å–åŒºåŸŸåˆ—è¡¨
        /// </summary>
        /// <returns></returns>
        [HttpGet, Route("GetArea"), AllowAnonymous]
        public object GetArea()
        {
            var data = BaseDal.QueryData();
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_Common/BDC/BDCEnum.cs
@@ -8,17 +8,43 @@
{
    public enum BodyType
    {
        WhiteBody = 1,
        /// <summary>
        /// ç™½è½¦èº«
        /// </summary>
        WhiteBody = 1,
        /// <summary>
        /// å½©è½¦èº«
        /// </summary>
        PaintedBody,
    }
    public enum BodyStatus
    {
        /// <summary>
        /// ç„Šè£…
        /// </summary>
        InWeldingShop = 1,
        /// <summary>
        /// BDC
        /// </summary>
        InBDC,
        /// <summary>
        /// æ¶‚装
        /// </summary>
        InPaintingShop,
        /// <summary>
        /// æ€»è£…
        /// </summary>
        InAssemblyShop,
        /// <summary>
        /// å®Œæˆ
        /// </summary>
        Completed
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_IStorageBasicService/BasicInfo/IDt_BDCConfigurationService.cs
@@ -32,7 +32,7 @@
        /// æ›´æ–°ç¼“存配置
        /// </summary>
        Task<Dt_BDCConfiguration> UpdateConfiguration(int maxWhiteBody, int maxPaintedBody,
            int maxBatteryCase, int maxEmptySled, string updatedBy);
            int maxBatteryCase, int maxEmptySled);
        /// <summary>
        /// æ£€æŸ¥ç™½è½¦èº«æ˜¯å¦å¯ä»¥å…¥åº“(未超过最大缓存数)
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_IStorageOutOrderRepository/OutboundOrder/IDt_AssemblyOrderInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
using WIDESEA_Core;
namespace WIDESEA_IStorageOutOrderRepository;
public interface IDt_AssemblyOrderInfoRepository : IRepository<Dt_AssemblyOrderInfo>
{
    /// <summary>
    /// ä¿®æ”¹å‡ºåº“订单(导航修改)
    /// </summary>
    /// <param name="outOrder"></param>
    /// <returns>是否成功</returns>
    //Task<bool> OutOrderUpdatedAsync(Dt_OutOrder outOrder);
    //Task<Dt_OutOrder> GetOutOrderByNumberAsync(string orderNumber);
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_IStorageOutOrderRepository/OutboundOrder/IDt_PaintingOrderInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
using WIDESEA_Core;
namespace WIDESEA_IStorageOutOrderRepository;
public interface IDt_PaintingOrderInfoRepository : IRepository<Dt_PaintingOrderInfo>
{
    /// <summary>
    /// ä¿®æ”¹å‡ºåº“订单(导航修改)
    /// </summary>
    /// <param name="outOrder"></param>
    /// <returns>是否成功</returns>
    //Task<bool> OutOrderUpdatedAsync(Dt_OutOrder outOrder);
    //Task<Dt_OutOrder> GetOutOrderByNumberAsync(string orderNumber);
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_IStorageOutOrderService/OutboundOrder/IDt_AssemblyOrderInfoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
namespace WIDESEA_IStorageOutOrderServices;
public interface IDt_AssemblyOrderInfoService : IService<Dt_AssemblyOrderInfo>
{
    ///// <summary>
    ///// æ·»åŠ ç”Ÿäº§å‡ºåº“å•
    ///// </summary>
    ///// <param name="model">出库数据</param>
    ///// <returns>成功或失败</returns>
    //WebResponseContent AddOutOrderProduction(SaveModel model);
    ///// <summary>
    ///// æ·»åŠ è°ƒæ‹¨å‡ºåº“å•
    ///// </summary>
    ///// <param name="model">出库数据</param>
    ///// <returns>成功或失败</returns>
    //WebResponseContent AddOutOrderTransfer(SaveModel model);
    ///// <summary>
    ///// æ ¹æ®å‡ºåº“单号查询出库订单
    ///// </summary>
    ///// <param name="orderNumber">出库单号</param>
    ///// <returns>出库订单</returns>
    //WebResponseContent GetOutOrderByNumber(string orderNumber);
    ///// <summary>
    ///// ä¿®æ”¹å‡ºåº“订单(导航修改)
    ///// </summary>
    ///// <param name="outOrder"></param>
    ///// <returns>是否成功</returns>
    //Task<bool> OutOrderUpdatedAsync(Dt_OutOrder outOrder);
    ///// <summary>
    ///// æ ¹æ®è®¢å•分配出库库存
    ///// </summary>
    ///// <param name="orderNo">订单编号</param>
    ///// <returns></returns>
    //Task<WebResponseContent> GetOutboundStockAsync(string orderNo);
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_IStorageOutOrderService/OutboundOrder/IDt_PaintingOrderInfoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
namespace WIDESEA_IStorageOutOrderServices;
public interface IDt_PaintingOrderInfoService : IService<Dt_PaintingOrderInfo>
{
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_IStorageTaskService/BDCManager/IBDCManager.cs
@@ -8,13 +8,20 @@
{
    public interface IBDCManager
    {
        int TotalCapacity { get; }
        List<DtLocationInfo> TotalCapacity { get; }
        int CurrentOccupancy { get; }
        List<Dt_CarBody> GetInventory();
        bool AddToBDC(Dt_CarBody body);
        Task<bool> AddToBDC(Dt_CarBody body);
        Dt_CarBody RetrieveFromBDC(string bodyId);
        List<Dt_CarBody> RetrieveByModel(string model);
        List<Dt_CarBody> RetrieveByColor(int color);
        void GenerateReport();
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_Model/Models/BasicInfo/Dt_BDCConfiguration.cs
@@ -62,6 +62,6 @@
        /// <summary>
        /// æ˜¯å¦å¯ç”¨
        /// </summary>
        public int IsActive { get; set; }
        public int IsActive { get; set; } = 1;
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_Model/Models/Inbound/Dt_AssemblyOrderInfo.cs
ÎļþÃû´Ó ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_Model/Models/Inbound/dt_OrderInfo.cs ÐÞ¸Ä
@@ -9,8 +9,8 @@
namespace WIDESEA_Model.Models
{
    [SugarTable(nameof(dt_OrderInfo), "总装工单信息")]
    public class dt_OrderInfo: BaseEntity
    [SugarTable(nameof(Dt_AssemblyOrderInfo), "总装工单信息")]
    public class Dt_AssemblyOrderInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
@@ -36,7 +36,7 @@
        [SugarColumn(IsNullable = true, ColumnDescription = "生产模式")]
        public string splitStrategy { get; set; }
        public string data { get; set; }
        //public string data { get; set; }
        /// <summary>
        /// è®¢å•号
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_Model/Models/Inbound/Dt_PaintingOrderInfo.cs
copy from "\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSServer/WIDESEA_Model/Models/Inbound/dt_OrderInfo.cs" copy to "\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSServer/WIDESEA_Model/Models/Inbound/Dt_PaintingOrderInfo.cs"
Îļþ´Ó ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_Model/Models/Inbound/dt_OrderInfo.cs ¸´ÖÆ
@@ -9,8 +9,8 @@
namespace WIDESEA_Model.Models
{
    [SugarTable(nameof(dt_OrderInfo), "总装工单信息")]
    public class dt_OrderInfo: BaseEntity
    [SugarTable(nameof(Dt_PaintingOrderInfo), "涂装工单信息")]
    public class Dt_PaintingOrderInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
@@ -29,6 +29,14 @@
        public string plantCode { get; set; }
        /// <summary>
        /// è½¦é—´
        /// </summary>
        [ImporterHeader(Name = "车间")]
        [ExporterHeader(DisplayName = "车间")]
        [SugarColumn(IsNullable = true, ColumnDescription = "车间")]
        public string workshopCode { get; set; }
        /// <summary>
        /// ç”Ÿäº§æ¨¡å¼
        /// </summary>
        [ImporterHeader(Name = "生产模式")]
@@ -36,26 +44,8 @@
        [SugarColumn(IsNullable = true, ColumnDescription = "生产模式")]
        public string splitStrategy { get; set; }
        public string data { get; set; }
        /// <summary>
        /// è®¢å•号
        /// </summary>
        [ImporterHeader(Name = "订单号")]
        [ExporterHeader(DisplayName = "订单号")]
        [SugarColumn(IsNullable = true, ColumnDescription = "订单号")]
        public string vehicleOrderNo { get; set; }
        /// <summary>
        /// è®¢å•类型
        /// </summary>
        [ImporterHeader(Name = "订单类型")]
        [ExporterHeader(DisplayName = "订单类型")]
        [SugarColumn(IsNullable = true, ColumnDescription = "订单类型")]
        public string orderType { get; set; }
        /// <summary>
        /// å·¥å•号  æ€»è£…(一单到底是生产工单号三车间共用)
        /// å·¥å•号  æ¶‚装
        /// </summary>
        [ImporterHeader(Name = "工单号")]
        [ExporterHeader(DisplayName = "工单号")]
@@ -63,36 +53,20 @@
        public string workOrderNo { get; set; }
        /// <summary>
        /// pvi号  ï¼ˆæŽ’产顺序号2)
        /// å·¥å•类型
        /// </summary>
        [ImporterHeader(Name = "工单类型")]
        [ExporterHeader(DisplayName = "工单类型")]
        [SugarColumn(IsNullable = true, ColumnDescription = "工单类型")]
        public string workOrderType { get; set; }
        /// <summary>
        /// pvi号
        /// </summary>
        [ImporterHeader(Name = "pvi号")]
        [ExporterHeader(DisplayName = "pvi号")]
        [SugarColumn(IsNullable = true, ColumnDescription = "pvi号")]
        public string pvi { get; set; }
        /// <summary>
        /// å·¥å•顺序号 æŽ’产顺序号1(序列号)
        /// </summary>
        [ImporterHeader(Name = "工单顺序号")]
        [ExporterHeader(DisplayName = "工单顺序号")]
        [SugarColumn(IsNullable = true, ColumnDescription = "工单顺序号")]
        public string sequenceNo { get; set; }
        /// <summary>
        /// è½¦åž‹ç‰¹å¾å€¼
        /// </summary>
        [ImporterHeader(Name = "车型特征值")]
        [ExporterHeader(DisplayName = "车型特征值")]
        [SugarColumn(IsNullable = true, ColumnDescription = "车型特征值")]
        public string vehicleCharacteristic { get; set; }
        /// <summary>
        /// æ•´è½¦ç‰©æ–™å·
        /// </summary>
        [ImporterHeader(Name = "整车物料号")]
        [ExporterHeader(DisplayName = "整车物料号")]
        [SugarColumn(IsNullable = true, ColumnDescription = "整车物料号")]
        public string vehicleCode { get; set; }
        /// <summary>
        /// ç™½è½¦èº«ç‰©æ–™å·
@@ -103,12 +77,68 @@
        public string biwMaterial { get; set; }
        /// <summary>
        /// è½¦åž‹ç‰¹å¾å€¼
        /// </summary>
        [ImporterHeader(Name = "车型特征值")]
        [ExporterHeader(DisplayName = "车型特征值")]
        [SugarColumn(IsNullable = true, ColumnDescription = "车型特征值")]
        public string vehicleCharacteristic { get; set; }
        /// <summary>
        /// å¤©çª—特征值
        /// </summary>
        [ImporterHeader(Name = "天窗特征值")]
        [ExporterHeader(DisplayName = "天窗特征值")]
        [SugarColumn(IsNullable = true, ColumnDescription = "天窗特征值")]
        public string skylightCharacteristic { get; set; }
        /// <summary>
        /// è½¦èº«é¢œè‰²
        /// </summary>
        [ImporterHeader(Name = "车身颜色")]
        [ExporterHeader(DisplayName = "车身颜色")]
        [SugarColumn(IsNullable = true, ColumnDescription = "车身颜色")]
        public string carBodyCharacteristic { get; set; }
        /// <summary>
        /// åŒè‰²è½¦èº«
        /// </summary>
        [ImporterHeader(Name = "双色车身")]
        [ExporterHeader(DisplayName = "双色车身")]
        [SugarColumn(IsNullable = true, ColumnDescription = "双色车身")]
        public string twoToneCharacteristic { get; set; }
        /// <summary>
        /// å·¥å•顺序号 æŽ’产顺序号1(序列号)
        /// </summary>
        [ImporterHeader(Name = "工单顺序号")]
        [ExporterHeader(DisplayName = "工单顺序号")]
        [SugarColumn(IsNullable = true, ColumnDescription = "工单顺序号")]
        public string sequenceNo { get; set; }
        /// <summary>
        /// CTC配置
        /// </summary>
        [ImporterHeader(Name = "CTC配置")]
        [ExporterHeader(DisplayName = "CTC配置")]
        [SugarColumn(IsNullable = true, ColumnDescription = "CTC配置")]
        public string config1 { get; set; }
        /// <summary>
        /// å½©è½¦èº«ç‰©æ–™å·
        /// </summary>
        [ImporterHeader(Name = "彩车身物料号")]
        [ExporterHeader(DisplayName = "彩车身物料号")]
        [SugarColumn(IsNullable = true, ColumnDescription = "彩车身物料号")]
        public string pbMaterial { get; set; }
        /// <summary>
        /// å¤‡ç”¨3
        /// </summary>
        [ImporterHeader(Name = "备用3")]
        [ExporterHeader(DisplayName = "备用3")]
        [SugarColumn(IsNullable = true, ColumnDescription = "备用3")]
        public string config3 { get; set; }
        /// <summary>
        /// å·¥å•下发状态  1-排产下发;2-撤回
@@ -119,34 +149,8 @@
        public string workOrderSendStatus { get; set; }
        /// <summary>
        /// å¤‡ç”¨1
        /// </summary>
        [ImporterHeader(Name = "备用1")]
        [ExporterHeader(DisplayName = "备用1")]
        [SugarColumn(IsNullable = true, ColumnDescription = "备用1")]
        public string spare1 { get; set; }
        /// <summary>
        /// å¤‡ç”¨2
        /// </summary>
        [ImporterHeader(Name = "备用2")]
        [ExporterHeader(DisplayName = "备用2")]
        [SugarColumn(IsNullable = true, ColumnDescription = "备用2")]
        public string spare2 { get; set; }
        /// <summary>
        /// å¤‡ç”¨3
        /// </summary>
        [ImporterHeader(Name = "备用3")]
        [ExporterHeader(DisplayName = "备用3")]
        [SugarColumn(IsNullable = true, ColumnDescription = "备用3")]
        public string spare3 { get; set; }
        /// <summary>
        /// å‘送时间
        /// </summary>
        //public string sendTime { get; set; }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StoragIntegrationServices/MES/MESService.cs
@@ -30,8 +30,9 @@
        private readonly LogFactory LogFactory = new LogFactory();
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IDt_CarBodyRepository _carBodyRepository;
        private readonly IDt_AssemblyOrderInfoRepository _assemblyOrderInfoRepository;
        public MESService(ILocationInfoRepository locationRepository, IDt_TaskRepository taskRepository, ISys_ConfigService configService, IDt_StationManagerRepository stationManagerRepository, IDt_AreaInfoRepository dt_AreaInfoRepository, IDt_PalletInfoRepository palletInfoRepository, IDt_PalletStockInfoRepository palletStockInfoRepository, IDt_OutOrderRepository OutOrderRepository, IUnitOfWorkManage unitOfWorkManage, IDt_CarBodyRepository carBodyRepository)
        public MESService(ILocationInfoRepository locationRepository, IDt_TaskRepository taskRepository, ISys_ConfigService configService, IDt_StationManagerRepository stationManagerRepository, IDt_AreaInfoRepository dt_AreaInfoRepository, IDt_PalletInfoRepository palletInfoRepository, IDt_PalletStockInfoRepository palletStockInfoRepository, IDt_OutOrderRepository OutOrderRepository, IUnitOfWorkManage unitOfWorkManage, IDt_CarBodyRepository carBodyRepository, IDt_AssemblyOrderInfoRepository assemblyOrderInfoRepository)
        {
            _locationRepository = locationRepository;
            _taskRepository = taskRepository;
@@ -43,6 +44,7 @@
            _OutOrderRepository = OutOrderRepository;
            _unitOfWorkManage = unitOfWorkManage;
            _carBodyRepository = carBodyRepository;
            _assemblyOrderInfoRepository = assemblyOrderInfoRepository;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StoragIntegrationServices/MES/Partial/pushOrderInfo.cs
@@ -35,6 +35,7 @@
                var ListTaskDto = new List<WMSTaskDTO>();
                var ListTask = new List<Dt_Task>();
                var ListAssemblyOrderInfo = new List<Dt_AssemblyOrderInfo>();
                foreach (var item in result.data)
                {
                    var palletStockInfos = _palletStockInfoRepository.QueryData(x => x.OrderID == item.workOrderNo);
@@ -87,45 +88,47 @@
                    }
                    Dt_AssemblyOrderInfo assemblyOrderInfo = new Dt_AssemblyOrderInfo
                    {
                        biwMaterial = item.biwMaterial,
                        CreateDate = DateTime.Now,
                        Creater = "System",
                        orderType = item.orderType,
                        pbMaterial = item.pbMaterial,
                        plantCode = result.plantCode,
                        pvi = item.pvi,
                        sequenceNo = item.sequenceNo,
                        spare1 = item.spare1,
                        spare2 = item.spare2,
                        spare3 = item.spare3,
                        splitStrategy = result.splitStrategy,
                        vehicleCharacteristic = item.vehicleCharacteristic,
                        vehicleCode = item.vehicleCode,
                        vehicleOrderNo = item.vehicleOrderNo,
                        workOrderNo = item.workOrderNo,
                        workOrderSendStatus = item.workOrderSendStatus,  //1-排产 2-撤回
                    };
                    ListAssemblyOrderInfo.Add(assemblyOrderInfo);
                }
                pushOrderInfo orderInfo = new pushOrderInfo
                {
                };
                Dt_OutOrder outOrder = new()
                {
                    CreateDate = DateTime.Now,
                    Creater = "System",
                    Status = 1,
                    //UpperOutOrderId = result.workOrderNo,
                    OrderNumber = result.data[0].workOrderNo,
                    WarehouseId = 1,
                    OrderDate = DateTime.Now,
                    UpperOutOrderId = 1,
                    Remarks = "测试订单"
                };
                var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
                var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue;
                var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveTask)?.ConfigValue;
                if (wmsBase == null || ipAddress == null)
                {
                    throw new InvalidOperationException("WMS IP æœªé…ç½®");
                }
                var wmsIpAddress = wmsBase + ipAddress;
                var WCSresult = HttpHelper.PostAsync(wmsIpAddress, ListTaskDto.ToJsonString()).Result;
                var content = JsonConvert.DeserializeObject<WebResponseContent>(WCSresult);
                _unitOfWorkManage.BeginTran();
                _OutOrderRepository.AddData(outOrder);
                _taskRepository.AddData(ListTask);
                if (ListTaskDto.Count > 0)
                {
                    var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
                    var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue;
                    var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveTask)?.ConfigValue;
                    if (wmsBase == null || ipAddress == null)
                    {
                        throw new InvalidOperationException("WMS IP æœªé…ç½®");
                    }
                    var wmsIpAddress = wmsBase + ipAddress;
                    var WCSresult = HttpHelper.PostAsync(wmsIpAddress, ListTaskDto.ToJsonString()).Result;
                    var content = JsonConvert.DeserializeObject<WebResponseContent>(WCSresult);
                    _taskRepository.AddData(ListTask);
                }
                _assemblyOrderInfoRepository.AddData(ListAssemblyOrderInfo);
                _unitOfWorkManage.CommitTran();
                responseContent.OK();
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageBasicServices/BasicInfo/Dt_BDCConfigurationService.cs
@@ -30,12 +30,17 @@
            return currentConfig;
        }
        public override WebResponseContent UpdateData(SaveModel saveModel)
        {
            return base.UpdateData(saveModel);
        }
        public async Task<Dt_BDCConfiguration> UpdateConfiguration(int maxWhiteBody, int maxPaintedBody,
           int maxBatteryCase, int maxEmptySled, string updatedBy)
       int maxBatteryCase, int maxEmptySled)
        {
            // ç¦ç”¨å½“前配置
            var currentConfigs = await BaseDal.QueryDataAsync(c => c.IsActive == 1);
            currentConfigs.ForEach(c => c.IsActive = 2);
            // åˆ›å»ºæ–°é…ç½®
@@ -46,7 +51,7 @@
                MaxBatteryCaseCache = maxBatteryCase,
                MaxEmptySledCache = maxEmptySled,
                LastUpdatedTime = DateTime.Now,
                UpdatedBy = updatedBy,
                UpdatedBy = App.User.UserName,
                IsActive = 1
            };
@@ -55,10 +60,14 @@
            return newConfig;
        }
        /// <summary>
        /// ç™½è½¦èº«æ˜¯å¦å¯å…¥åº“
        /// </summary>
        /// <returns></returns>
        public async Task<bool> CanAddWhiteBody()
        {
            var config = await GetCurrentConfiguration();
            var currentCount =  GetWhiteBodyCount();
            var currentCount = GetWhiteBodyCount();
            // é¢„ç•™5%的缓冲空间
            var threshold = (int)(config.MaxWhiteBodyCache * 0.95);
@@ -68,39 +77,54 @@
        public async Task<bool> CanAddPaintedBody()
        {
            var config = await GetCurrentConfiguration();
            var currentCount =  GetPaintedBodyCount();
            var currentCount = GetPaintedBodyCount();
            // é¢„ç•™5%的缓冲空间
            var threshold = (int)(config.MaxPaintedBodyCache * 0.95);
            return currentCount < threshold;
        }
        public async Task<bool> CanAddEmptySled()
        {
            var config = await GetCurrentConfiguration();
            var currentCount =  GetEmptySledCount();
            var currentCount = GetEmptySledCount();
            // é¢„ç•™5%的缓冲空间
            var threshold = (int)(config.MaxEmptySledCache * 0.95);
            return currentCount < threshold;
        }
        /// <summary>
        /// ç™½è½¦èº«åº“存数量
        /// </summary>
        /// <returns></returns>
        public int GetWhiteBodyCount()
        {
            return _palletStockInfoRepository.QueryData(b => b.CarType == (int)BodyType.WhiteBody && b.StockStatus == (int)BodyStatus.InBDC).Count;
        }
        /// <summary>
        /// å½©è½¦èº«åº“存数量
        /// </summary>
        /// <returns></returns>
        public int GetPaintedBodyCount()
        {
            return  _palletStockInfoRepository.QueryData(b => b.CarType == (int)BodyType.PaintedBody && b.StockStatus == (int)BodyStatus.InBDC).Count;
            return _palletStockInfoRepository.QueryData(b => b.CarType == (int)BodyType.PaintedBody && b.StockStatus == (int)BodyStatus.InBDC).Count;
        }
        /// <summary>
        /// ç”µæ± å£³åº“存数量
        /// </summary>
        /// <returns></returns>
        public int GetBatteryCaseCount()
        {
            return _palletStockInfoRepository.QueryData(b => b.StockStatus == (int)BodyStatus.InBDC).Count;
        }
        /// <summary>
        /// ç©ºæ»‘橇库存数量
        /// </summary>
        /// <returns></returns>
        public int GetEmptySledCount()
        {
            return _palletStockInfoRepository.QueryData(s => s.StockStatus == (int)BodyStatus.InBDC).Count;
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageOutOrderRepository/OutboundOrder/Dt_AssemblyOrderInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
using WIDESEA_Core;
namespace WIDESEA_StorageOutOrderRepository;
public class Dt_AssemblyOrderInfoRepository : RepositoryBase<Dt_AssemblyOrderInfo>, IDt_AssemblyOrderInfoRepository
{
    public Dt_AssemblyOrderInfoRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageOutOrderRepository/OutboundOrder/Dt_PaintingOrderInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
using WIDESEA_Core;
namespace WIDESEA_StorageOutOrderRepository;
public class Dt_PaintingOrderInfoRepository : RepositoryBase<Dt_PaintingOrderInfo>, IDt_PaintingOrderInfoRepository
{
    public Dt_PaintingOrderInfoRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
    {
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_AssemblyOrderInfoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,473 @@
namespace WIDESEA_StorageOutOrderServices;
public class Dt_AssemblyOrderInfoService : ServiceBase<Dt_AssemblyOrderInfo, IDt_AssemblyOrderInfoRepository>, IDt_AssemblyOrderInfoService
{
    private readonly LogFactory LogFactory = new LogFactory();
    private readonly IUnitOfWorkManage _unitOfWorkManage;
    private readonly IDt_OutOrderProductionService _outOrderProductionService;
    private readonly IDt_OutOrderProductionDetailService _outOrderProductionDetailService;
    private readonly IDt_OutOrderDtailService _outOrderDtailService;
    private readonly IDt_OutOrderTransferRepository _OutOrderTransferRepository;
    private readonly IDt_OutOrderTransferDetailRepository _OutOrderTransferDetailRepository;
    private readonly IDt_MaterielInfoRepository _materielInfoRepository;
    private readonly IStockInfoRepository _stockInfoRepository;
    private readonly IDt_OutOrderAndStockRepository _outOrderAndStockRepository;
    private readonly IDt_TaskRepository _taskRepository;
    public Dt_AssemblyOrderInfoService(IDt_AssemblyOrderInfoRepository BaseDal,
                              IUnitOfWorkManage unitOfWorkManage,
                              IDt_OutOrderProductionService outOrderProductionService,
                              IDt_OutOrderProductionDetailService outOrderProductionDetailService,
                              IDt_OutOrderDtailService outOrderDtailService,
                              IDt_OutOrderTransferDetailRepository outOrderTransferDetailRepository,
                              IDt_OutOrderTransferRepository outOrderTransferRepository,
                              IDt_MaterielInfoRepository materielInfoRepository,
                              IStockInfoRepository stockInfoRepository,
                              IDt_OutOrderAndStockRepository outOrderAndStockRepository,
                              IDt_TaskRepository taskRepository) : base(BaseDal)
    {
        _unitOfWorkManage = unitOfWorkManage;
        _outOrderProductionService = outOrderProductionService;
        _outOrderProductionDetailService = outOrderProductionDetailService;
        _outOrderDtailService = outOrderDtailService;
        _OutOrderTransferDetailRepository = outOrderTransferDetailRepository;
        _OutOrderTransferRepository = outOrderTransferRepository;
        _materielInfoRepository = materielInfoRepository;
        _stockInfoRepository = stockInfoRepository;
        _outOrderAndStockRepository = outOrderAndStockRepository;
        _taskRepository = taskRepository;
    }
    /// <summary>
    /// æ ¹æ®è®¢å•分配出库库存
    /// </summary>
    /// <param name="orderNo">订单编号</param>
    /// <returns></returns>
    public async Task<WebResponseContent> GetOutboundStockAsync(string orderNo)
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            // èŽ·å–è®¢å•
            //var order = await BaseDal.GetOutOrderByNumberAsync(orderNo);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "根据订单编号获取订单数据", JsonConvert.SerializeObject(order));
            //// æ£€æŸ¥è®¢å•是否获取成功
            //if (order == null)
            //{
            //    return content.Error("获取订单失败");
            //}
            //// èŽ·å–è®¢å•ä¸­çš„ç¬¬ä¸€ä¸ªç‰©æ–™ç¼–å·
            //var materielInfo = await _materielInfoRepository.QueryFirstAsync(x => x.MaterielID == order.OrderDetailList.MaterialId);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "获取订单物料编号", JsonConvert.SerializeObject(materielInfo));
            //#region å…ˆå…¥å…ˆå‡º
            //// èŽ·å–è¯¥ç‰©æ–™æ‰€æœ‰å¯å‡ºåº“åº“å­˜
            //var filteredStocks = await _stockInfoRepository.QueryDataAsync(x => true);
            //filteredStocks.OrderBy(x => x.CreateDate).ToList();
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "获取该物料所有可出库库存", JsonConvert.SerializeObject(filteredStocks));
            //#endregion å…ˆå…¥å…ˆå‡º
            //#region æŸ¥æ‰¾é è¿‘出库口库存
            //// é»˜è®¤åˆ—越大越靠近出库口
            //filteredStocks = filteredStocks.OrderByDescending(x => x.LocationInfo.Column).OrderBy(x => x.CreateDate).ToList();
            //#endregion æŸ¥æ‰¾é è¿‘出库口库存
            //#region ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾ï¼Œå†æŸ¥æ‰¾åŒåˆ—二深位
            //filteredStocks = PickStocks(filteredStocks);
            //#endregion ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾ï¼Œå†æŸ¥æ‰¾åŒåˆ—二深位
            //// åˆ›å»ºä»»åŠ¡åˆ—è¡¨
            //var (tasks, updateOrder, stock) = CreateTasks(order, filteredStocks);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "创建任务列表,修改订单分配数量,获取出库分配库存",
            //    $"任务列表:{JsonConvert.SerializeObject(tasks)},订单列表:{JsonConvert.SerializeObject(updateOrder)},已分配库存:{JsonConvert.SerializeObject(stock)}");
            //// æ›´æ–°åº“存状态
            //var stockList = UpdateStocks(stock);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "更新库存状态", JsonConvert.SerializeObject(stockList));
            //// åˆ›å»ºè®¢å•库存列表
            //List<Dt_OutOrderAndStock>? orderStocks = CreateOrderStock(stock, updateOrder);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "创建订单库存列表", JsonConvert.SerializeObject(orderStocks));
            //// å¼€å§‹äº‹åŠ¡
            //_unitOfWorkManage.BeginTran();
            //// æ›´æ–°åº“å­˜
            //var isStockUpdated = _stockInfoRepository.UpdateData(stockList);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务更新库存", isStockUpdated);
            //// æ›´æ–°è®¢å•
            //var isOrderUpdated = await BaseDal.OutOrderUpdatedAsync(updateOrder);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务更新订单", isOrderUpdated);
            ////添加订单库存
            //var isOrderStockCread = await _outOrderAndStockRepository.AddDataAsync(orderStocks) > 0;
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务添加订单库存", isOrderStockCread);
            //// åˆ›å»ºä»»åŠ¡
            //var isTaskCreated = await _taskRepository.Create(tasks);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务创建任务", isTaskCreated);
            //// æäº¤æˆ–回滚事务
            //if (isStockUpdated && isTaskCreated && isOrderUpdated && isOrderStockCread)
            //{
            //    LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "数据处理完成,提交事务", "无参数");
            //    _unitOfWorkManage.CommitTran();
            //}
            //else
            //{
            //    LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "添加数据库失败,请检查数据是否正确,数据回滚", $"更新库存:{isStockUpdated},更新订单:{isOrderUpdated},添加订单库存:{isOrderStockCread},创建任务:{isTaskCreated}");
            //    _unitOfWorkManage.RollbackTran();
            //    throw new Exception("添加数据库失败,请检查数据是否正确,数据回滚");
            //}
            return content.OK(); //data: orderStocks
        }
        catch (Exception ex)
        {
            _unitOfWorkManage.RollbackTran();
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, $"系统异常,异常信息:{ex.Message}", "无参数");
            return content.Error(ex.Message);
        }
    }
    #region å†…部调用
    /// <summary>
    /// ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾
    /// </summary>
    /// <param name="filteredStocks">可出库库存</param>
    /// <returns>排序好的出库库存</returns>
    public List<DtStockInfo> PickStocks(List<DtStockInfo> filteredStocks)
    {
        var oneDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == 1).ToList();
        var twoDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == 2).ToList();
        var results = new List<DtStockInfo>();
        foreach (var oneDepth in oneDepthList)
        {
            // å°† Line å­—符串转换为整数
            int oneDepthLine = oneDepth.LocationInfo.Row;
            // è®¡ç®—相对行
            int relativeLine = oneDepthLine % 2 == 1 ? oneDepthLine + 1 : oneDepthLine - 1;
            // æŸ¥æ‰¾æœ€æŽ¥è¿‘的二深位记录
            var closestTwoDepth = twoDepthList
                .Where(t => t.LocationInfo.Row == relativeLine)
                .Where(x => x.LocationInfo.Column == oneDepth.LocationInfo.Column)
                .Where(x => x.LocationInfo.Layer == oneDepth.LocationInfo.Layer)
                .FirstOrDefault();
            // å¦‚果找到了最接近的二深位记录,将其与一深位一起添加到结果列表
            if (closestTwoDepth != null)
            {
                results.Add(oneDepth);
                results.Add(closestTwoDepth);
            }
            else
            {
                // å¦‚果没有找到最接近的二深位记录,将一深位添加到结果列表
                results.Add(oneDepth);
            }
        }
        return results;
    }
    #endregion å†…部调用
    #region ç§æœ‰æ–¹æ³•
    #region ç”Ÿäº§å‡ºåº“单
    /// <summary>
    /// æ ¹æ®ä¸»æ•°æ®æž„建生产出库单对象。
    /// </summary>
    private Dt_OutOrderProduction CreateProductionOrder(Dictionary<string, object> mainData)
    {
        return new Dt_OutOrderProduction
        {
            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
            WarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
            Status = (int)OutOrderTypeEnum.Issue,
            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
            Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
            OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now,
        };
    }
    /// <summary>
    /// æ ¹æ®æ˜Žç»†æ•°æ®å’Œç”Ÿäº§å‡ºåº“单ID构建生产出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderProductionDetail> CreateProductionDetails(List<Dictionary<string, object>> detailData)
    {
        var details = new List<Dt_OutOrderProductionDetail>();
        foreach (var item in detailData)
        {
            var detail = new Dt_OutOrderProductionDetail
            {
                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
                Remarks = item.GetValueOrDefault("Remarks")?.ToString(),
                CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
                Creater = item.GetValueOrDefault("Creater")?.ToString(),
                BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(),
            };
            details.Add(detail);
        }
        return details;
    }
    /// <summary>
    /// æ ¹æ®ç”Ÿäº§å‡ºåº“单对象和生产出库单ID构建系统出库单对象。
    /// </summary>
    private Dt_OutOrder CreateSystemOrder(Dt_OutOrderProduction production)
    {
        return new Dt_OutOrder
        {
            Status = production.Status,
            CreateDate = DateTime.Now,
            Creater = production.Creater,
            OrderDate = DateTime.Now,
            OrderNumber = production.OrderNumber,
            Remarks = production.Remarks,
            WarehouseId = production.WarehouseId,
        };
    }
    /// <summary>
    /// æ ¹æ®ç”Ÿäº§å‡ºåº“单明细列表和系统出库单ID构建系统出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderProductionDetail> productionDetails)
    {
        var orderDetails = new List<Dt_OutOrderDetail>();
        foreach (var item in productionDetails)
        {
            var detail = new Dt_OutOrderDetail
            {
                AllocatedQuantity = 0,
                BatchNumber = item.BatchNumber,
                CompletedQuantity = 0,
                CreateDate = item.CreateDate,
                Creater = item.Creater,
                MaterialId = item.MaterialId,
                OutboundQuantity = item.Quantity,
                Remarks = item.Remarks,
                MaterialName = item.Remarks // ç‰©æ–™åç§°
            };
            orderDetails.Add(detail);
        }
        return orderDetails;
    }
    #endregion ç”Ÿäº§å‡ºåº“单
    #region è°ƒæ‹¨å‡ºåº“单
    /// <summary>
    /// æ ¹æ®ä¸»æ•°æ®æž„建调拨出库单对象。
    /// </summary>
    private Dt_OutOrderTransfer CreateTransferOrder(Dictionary<string, object> mainData)
    {
        return new Dt_OutOrderTransfer
        {
            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
            SourceWarehouseId = mainData.GetValueOrDefault("SourceWarehouseId")?.ObjToInt() ?? 0,
            DestinationWarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
            Status = (int)OutOrderTypeEnum.Allocate,
            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
            Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
            OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now,
        };
    }
    /// <summary>
    /// æ ¹æ®æ˜Žç»†æ•°æ®å’Œè°ƒæ‹¨å‡ºåº“单ID构建调拨出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderTransferDetail> CreateTransferDetails(List<Dictionary<string, object>> detailData)
    {
        var details = new List<Dt_OutOrderTransferDetail>();
        foreach (var item in detailData)
        {
            var detail = new Dt_OutOrderTransferDetail
            {
                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
                Remarks = item.GetValueOrDefault("Remarks")?.ToString(),
                CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
                Creater = item.GetValueOrDefault("Creater")?.ToString(),
                BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(),
            };
            details.Add(detail);
        }
        return details;
    }
    /// <summary>
    /// æ ¹æ®ç”Ÿäº§å‡ºåº“单对象和生产出库单ID构建系统出库单对象。
    /// </summary>
    private Dt_OutOrder CreateSystemOrder(Dt_OutOrderTransfer transfer)
    {
        return new Dt_OutOrder
        {
            Status = transfer.Status,
            CreateDate = DateTime.Now,
            Creater = transfer.Creater,
            OrderDate = DateTime.Now,
            OrderNumber = transfer.OrderNumber,
            Remarks = transfer.Remarks,
            WarehouseId = transfer.SourceWarehouseId,
        };
    }
    /// <summary>
    /// æ ¹æ®ç”Ÿäº§å‡ºåº“单明细列表和系统出库单ID构建系统出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderTransferDetail> transferDetails)
    {
        var orderDetails = new List<Dt_OutOrderDetail>();
        foreach (var item in transferDetails)
        {
            var detail = new Dt_OutOrderDetail
            {
                AllocatedQuantity = 0,
                BatchNumber = item.BatchNumber,
                CompletedQuantity = 0,
                CreateDate = item.CreateDate,
                Creater = item.Creater,
                MaterialId = item.MaterialId,
                OutboundQuantity = item.Quantity,
                Remarks = item.Remarks,
                MaterialName = item.Remarks // ç‰©æ–™åç§°
            };
            orderDetails.Add(detail);
        }
        return orderDetails;
    }
    #endregion è°ƒæ‹¨å‡ºåº“单
    #region å‡ºåº“分配
    /// <summary>
    /// åˆ›å»ºä»»åŠ¡åˆ—è¡¨
    /// </summary>
    /// <param name="order">订单对象</param>
    /// <param name="filteredStocks">筛选后的库存列表</param>
    /// <returns>【任务列表,更新分配数量订单,创建任务的库存】</returns>
    private (List<Dt_Task>, Dt_OutOrder, List<DtStockInfo>) CreateTasks(Dt_OutOrder order, List<DtStockInfo> filteredStocks)
    {
        var tasks = new List<Dt_Task>();
        var stocks = new List<DtStockInfo>();
        foreach (var stock in filteredStocks)
        {
            // å¦‚果已分配数量达到出库数量,停止分配
            if (order.OrderDetailList.AllocatedQuantity >= order.OrderDetailList.OutboundQuantity)
                break;
            // å¦‚果托盘任务已存在,跳过
            if (_taskRepository.QueryFirst(x => x.PalletCode == stock.PalletCode) != null)
                continue;
            // åˆ›å»ºä»»åŠ¡
            tasks.Add(new Dt_Task
            {
                CreateDate = DateTime.Now, // åˆ›å»ºæ—¶é—´
                Creater = App.User.UserName, // åˆ›å»ºäºº
                CurrentAddress = stock.LocationCode, //当前位置
                Dispatchertime = DateTime.Now, //调度时间(任务下发时间)
                Grade = 1, // ç­‰çº§
                //PVI = stock.StockInfoDetails[0].MaterielCode, // ç‰©æ–™å·
                NextAddress = stock.LocationCode, // ä¸‹ä¸€ä½ç½®
                PalletCode = stock.PalletCode, //托盘号
                Remark = stock.Remark, //备注
                Roadway = stock.LocationInfo.RoadwayNo, //巷道
                SourceAddress = stock.LocationCode, //来源位置
                TargetAddress = order.OrderDetailList.Remarks, //目标地址
                TaskNum = _taskRepository.GetTaskNo().Result, //任务号
                TaskState = (int)TaskOutStatusEnum.OutNew, //任务状态
                TaskType = (int)TaskTypeEnum.Outbound, //任务类型
            });
            // æ›´æ–°å·²åˆ†é…æ•°é‡
            order.OrderDetailList.AllocatedQuantity += stock.StockInfoDetails.Sum(x => x.StockQuantity);
            stocks.Add(stock);
        }
        return (tasks, order, stocks);
    }
    /// <summary>
    /// æ›´æ–°åº“存状态
    /// </summary>
    /// <param name="filteredStocks">筛选后的库存列表</param>
    /// <returns>更新后的库存列表</returns>
    private List<DtStockInfo> UpdateStocks(List<DtStockInfo> filteredStocks)
    {
        var updatedStocks = new List<DtStockInfo>();
        foreach (var stock in filteredStocks)
        {
            // æ›´æ–°åº“存状态
            stock.LocationInfo.LocationStatus = (int)LocationEnum.Lock;
            stock.StockInfoDetails.ForEach(x =>
            {
                x.Status = (int)StockStateEmun.出库锁定;
            });
            updatedStocks.Add(stock);
        }
        return updatedStocks;
    }
    /// <summary>
    /// åˆ›å»ºè®¢å•库存列表
    /// </summary>
    /// <param name="stock">筛选后的库存列表</param>
    /// <param name="order">订单对象</param>
    /// <returns>订单库存列表</returns>
    private List<Dt_OutOrderAndStock> CreateOrderStock(List<DtStockInfo> stock, Dt_OutOrder order)
    {
        var orderStocks = new List<Dt_OutOrderAndStock>();
        foreach (var item in stock)
        {
            orderStocks.Add(new Dt_OutOrderAndStock()
            {
                AllocatedQuantity = order.OrderDetailList.AllocatedQuantity,
                MaterialNo = item.StockInfoDetails[0].MaterielCode,
                MaterialName = order.OrderDetailList.MaterialName,
                OrderNumber = order.OrderNumber,
                OutboundQuantity = order.OrderDetailList.OutboundQuantity,
                PalletCode = item.PalletCode,
                PalletQuantity = item.StockInfoDetails.Sum(x => x.StockQuantity),
                State = item.StockInfoDetails[0].Status,
                BatchNumber = order.OrderDetailList.BatchNumber,
                CompletedQuantity = order.OrderDetailList.CompletedQuantity,
                Creater = App.User.UserName,
                CreateDate = DateTime.Now,
                GroupId = item.Id,
                LocationCode = item.LocationInfo.LocationCode,
                OutOrderId = order.Id,
            });
        }
        return orderStocks;
    }
    #endregion å‡ºåº“分配
    #endregion ç§æœ‰æ–¹æ³•
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_PaintingOrderInfoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,473 @@
namespace WIDESEA_StorageOutOrderServices;
public class Dt_PaintingOrderInfoService : ServiceBase<Dt_PaintingOrderInfo, IDt_PaintingOrderInfoRepository>, IDt_PaintingOrderInfoService
{
    private readonly LogFactory LogFactory = new LogFactory();
    private readonly IUnitOfWorkManage _unitOfWorkManage;
    private readonly IDt_OutOrderProductionService _outOrderProductionService;
    private readonly IDt_OutOrderProductionDetailService _outOrderProductionDetailService;
    private readonly IDt_OutOrderDtailService _outOrderDtailService;
    private readonly IDt_OutOrderTransferRepository _OutOrderTransferRepository;
    private readonly IDt_OutOrderTransferDetailRepository _OutOrderTransferDetailRepository;
    private readonly IDt_MaterielInfoRepository _materielInfoRepository;
    private readonly IStockInfoRepository _stockInfoRepository;
    private readonly IDt_OutOrderAndStockRepository _outOrderAndStockRepository;
    private readonly IDt_TaskRepository _taskRepository;
    public Dt_PaintingOrderInfoService(IDt_PaintingOrderInfoRepository BaseDal,
                              IUnitOfWorkManage unitOfWorkManage,
                              IDt_OutOrderProductionService outOrderProductionService,
                              IDt_OutOrderProductionDetailService outOrderProductionDetailService,
                              IDt_OutOrderDtailService outOrderDtailService,
                              IDt_OutOrderTransferDetailRepository outOrderTransferDetailRepository,
                              IDt_OutOrderTransferRepository outOrderTransferRepository,
                              IDt_MaterielInfoRepository materielInfoRepository,
                              IStockInfoRepository stockInfoRepository,
                              IDt_OutOrderAndStockRepository outOrderAndStockRepository,
                              IDt_TaskRepository taskRepository) : base(BaseDal)
    {
        _unitOfWorkManage = unitOfWorkManage;
        _outOrderProductionService = outOrderProductionService;
        _outOrderProductionDetailService = outOrderProductionDetailService;
        _outOrderDtailService = outOrderDtailService;
        _OutOrderTransferDetailRepository = outOrderTransferDetailRepository;
        _OutOrderTransferRepository = outOrderTransferRepository;
        _materielInfoRepository = materielInfoRepository;
        _stockInfoRepository = stockInfoRepository;
        _outOrderAndStockRepository = outOrderAndStockRepository;
        _taskRepository = taskRepository;
    }
    /// <summary>
    /// æ ¹æ®è®¢å•分配出库库存
    /// </summary>
    /// <param name="orderNo">订单编号</param>
    /// <returns></returns>
    public async Task<WebResponseContent> GetOutboundStockAsync(string orderNo)
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            // èŽ·å–è®¢å•
            //var order = await BaseDal.GetOutOrderByNumberAsync(orderNo);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "根据订单编号获取订单数据", JsonConvert.SerializeObject(order));
            //// æ£€æŸ¥è®¢å•是否获取成功
            //if (order == null)
            //{
            //    return content.Error("获取订单失败");
            //}
            //// èŽ·å–è®¢å•ä¸­çš„ç¬¬ä¸€ä¸ªç‰©æ–™ç¼–å·
            //var materielInfo = await _materielInfoRepository.QueryFirstAsync(x => x.MaterielID == order.OrderDetailList.MaterialId);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "获取订单物料编号", JsonConvert.SerializeObject(materielInfo));
            //#region å…ˆå…¥å…ˆå‡º
            //// èŽ·å–è¯¥ç‰©æ–™æ‰€æœ‰å¯å‡ºåº“åº“å­˜
            //var filteredStocks = await _stockInfoRepository.QueryDataAsync(x => true);
            //filteredStocks.OrderBy(x => x.CreateDate).ToList();
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "获取该物料所有可出库库存", JsonConvert.SerializeObject(filteredStocks));
            //#endregion å…ˆå…¥å…ˆå‡º
            //#region æŸ¥æ‰¾é è¿‘出库口库存
            //// é»˜è®¤åˆ—越大越靠近出库口
            //filteredStocks = filteredStocks.OrderByDescending(x => x.LocationInfo.Column).OrderBy(x => x.CreateDate).ToList();
            //#endregion æŸ¥æ‰¾é è¿‘出库口库存
            //#region ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾ï¼Œå†æŸ¥æ‰¾åŒåˆ—二深位
            //filteredStocks = PickStocks(filteredStocks);
            //#endregion ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾ï¼Œå†æŸ¥æ‰¾åŒåˆ—二深位
            //// åˆ›å»ºä»»åŠ¡åˆ—è¡¨
            //var (tasks, updateOrder, stock) = CreateTasks(order, filteredStocks);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "创建任务列表,修改订单分配数量,获取出库分配库存",
            //    $"任务列表:{JsonConvert.SerializeObject(tasks)},订单列表:{JsonConvert.SerializeObject(updateOrder)},已分配库存:{JsonConvert.SerializeObject(stock)}");
            //// æ›´æ–°åº“存状态
            //var stockList = UpdateStocks(stock);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "更新库存状态", JsonConvert.SerializeObject(stockList));
            //// åˆ›å»ºè®¢å•库存列表
            //List<Dt_OutOrderAndStock>? orderStocks = CreateOrderStock(stock, updateOrder);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "创建订单库存列表", JsonConvert.SerializeObject(orderStocks));
            //// å¼€å§‹äº‹åŠ¡
            //_unitOfWorkManage.BeginTran();
            //// æ›´æ–°åº“å­˜
            //var isStockUpdated = _stockInfoRepository.UpdateData(stockList);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务更新库存", isStockUpdated);
            //// æ›´æ–°è®¢å•
            //var isOrderUpdated = await BaseDal.OutOrderUpdatedAsync(updateOrder);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务更新订单", isOrderUpdated);
            ////添加订单库存
            //var isOrderStockCread = await _outOrderAndStockRepository.AddDataAsync(orderStocks) > 0;
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务添加订单库存", isOrderStockCread);
            //// åˆ›å»ºä»»åŠ¡
            //var isTaskCreated = await _taskRepository.Create(tasks);
            //LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "事务创建任务", isTaskCreated);
            //// æäº¤æˆ–回滚事务
            //if (isStockUpdated && isTaskCreated && isOrderUpdated && isOrderStockCread)
            //{
            //    LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "数据处理完成,提交事务", "无参数");
            //    _unitOfWorkManage.CommitTran();
            //}
            //else
            //{
            //    LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, "添加数据库失败,请检查数据是否正确,数据回滚", $"更新库存:{isStockUpdated},更新订单:{isOrderUpdated},添加订单库存:{isOrderStockCread},创建任务:{isTaskCreated}");
            //    _unitOfWorkManage.RollbackTran();
            //    throw new Exception("添加数据库失败,请检查数据是否正确,数据回滚");
            //}
            return content.OK(); //data: orderStocks
        }
        catch (Exception ex)
        {
            _unitOfWorkManage.RollbackTran();
            LogFactory.GetLog("出库分配并创建任务").InfoFormat(true, $"系统异常,异常信息:{ex.Message}", "无参数");
            return content.Error(ex.Message);
        }
    }
    #region å†…部调用
    /// <summary>
    /// ä¸€æ·±ä½ä¼˜å…ˆæŸ¥æ‰¾
    /// </summary>
    /// <param name="filteredStocks">可出库库存</param>
    /// <returns>排序好的出库库存</returns>
    public List<DtStockInfo> PickStocks(List<DtStockInfo> filteredStocks)
    {
        var oneDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == 1).ToList();
        var twoDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == 2).ToList();
        var results = new List<DtStockInfo>();
        foreach (var oneDepth in oneDepthList)
        {
            // å°† Line å­—符串转换为整数
            int oneDepthLine = oneDepth.LocationInfo.Row;
            // è®¡ç®—相对行
            int relativeLine = oneDepthLine % 2 == 1 ? oneDepthLine + 1 : oneDepthLine - 1;
            // æŸ¥æ‰¾æœ€æŽ¥è¿‘的二深位记录
            var closestTwoDepth = twoDepthList
                .Where(t => t.LocationInfo.Row == relativeLine)
                .Where(x => x.LocationInfo.Column == oneDepth.LocationInfo.Column)
                .Where(x => x.LocationInfo.Layer == oneDepth.LocationInfo.Layer)
                .FirstOrDefault();
            // å¦‚果找到了最接近的二深位记录,将其与一深位一起添加到结果列表
            if (closestTwoDepth != null)
            {
                results.Add(oneDepth);
                results.Add(closestTwoDepth);
            }
            else
            {
                // å¦‚果没有找到最接近的二深位记录,将一深位添加到结果列表
                results.Add(oneDepth);
            }
        }
        return results;
    }
    #endregion å†…部调用
    #region ç§æœ‰æ–¹æ³•
    #region ç”Ÿäº§å‡ºåº“单
    /// <summary>
    /// æ ¹æ®ä¸»æ•°æ®æž„建生产出库单对象。
    /// </summary>
    private Dt_OutOrderProduction CreateProductionOrder(Dictionary<string, object> mainData)
    {
        return new Dt_OutOrderProduction
        {
            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
            WarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
            Status = (int)OutOrderTypeEnum.Issue,
            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
            Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
            OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now,
        };
    }
    /// <summary>
    /// æ ¹æ®æ˜Žç»†æ•°æ®å’Œç”Ÿäº§å‡ºåº“单ID构建生产出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderProductionDetail> CreateProductionDetails(List<Dictionary<string, object>> detailData)
    {
        var details = new List<Dt_OutOrderProductionDetail>();
        foreach (var item in detailData)
        {
            var detail = new Dt_OutOrderProductionDetail
            {
                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
                Remarks = item.GetValueOrDefault("Remarks")?.ToString(),
                CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
                Creater = item.GetValueOrDefault("Creater")?.ToString(),
                BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(),
            };
            details.Add(detail);
        }
        return details;
    }
    /// <summary>
    /// æ ¹æ®ç”Ÿäº§å‡ºåº“单对象和生产出库单ID构建系统出库单对象。
    /// </summary>
    private Dt_OutOrder CreateSystemOrder(Dt_OutOrderProduction production)
    {
        return new Dt_OutOrder
        {
            Status = production.Status,
            CreateDate = DateTime.Now,
            Creater = production.Creater,
            OrderDate = DateTime.Now,
            OrderNumber = production.OrderNumber,
            Remarks = production.Remarks,
            WarehouseId = production.WarehouseId,
        };
    }
    /// <summary>
    /// æ ¹æ®ç”Ÿäº§å‡ºåº“单明细列表和系统出库单ID构建系统出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderProductionDetail> productionDetails)
    {
        var orderDetails = new List<Dt_OutOrderDetail>();
        foreach (var item in productionDetails)
        {
            var detail = new Dt_OutOrderDetail
            {
                AllocatedQuantity = 0,
                BatchNumber = item.BatchNumber,
                CompletedQuantity = 0,
                CreateDate = item.CreateDate,
                Creater = item.Creater,
                MaterialId = item.MaterialId,
                OutboundQuantity = item.Quantity,
                Remarks = item.Remarks,
                MaterialName = item.Remarks // ç‰©æ–™åç§°
            };
            orderDetails.Add(detail);
        }
        return orderDetails;
    }
    #endregion ç”Ÿäº§å‡ºåº“单
    #region è°ƒæ‹¨å‡ºåº“单
    /// <summary>
    /// æ ¹æ®ä¸»æ•°æ®æž„建调拨出库单对象。
    /// </summary>
    private Dt_OutOrderTransfer CreateTransferOrder(Dictionary<string, object> mainData)
    {
        return new Dt_OutOrderTransfer
        {
            OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(),
            SourceWarehouseId = mainData.GetValueOrDefault("SourceWarehouseId")?.ObjToInt() ?? 0,
            DestinationWarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0,
            Status = (int)OutOrderTypeEnum.Allocate,
            Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(),
            Creater = mainData.GetValueOrDefault("Creater")?.ToString(),
            CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
            OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now,
        };
    }
    /// <summary>
    /// æ ¹æ®æ˜Žç»†æ•°æ®å’Œè°ƒæ‹¨å‡ºåº“单ID构建调拨出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderTransferDetail> CreateTransferDetails(List<Dictionary<string, object>> detailData)
    {
        var details = new List<Dt_OutOrderTransferDetail>();
        foreach (var item in detailData)
        {
            var detail = new Dt_OutOrderTransferDetail
            {
                MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0,
                Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0,
                Remarks = item.GetValueOrDefault("Remarks")?.ToString(),
                CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now,
                Creater = item.GetValueOrDefault("Creater")?.ToString(),
                BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(),
            };
            details.Add(detail);
        }
        return details;
    }
    /// <summary>
    /// æ ¹æ®ç”Ÿäº§å‡ºåº“单对象和生产出库单ID构建系统出库单对象。
    /// </summary>
    private Dt_OutOrder CreateSystemOrder(Dt_OutOrderTransfer transfer)
    {
        return new Dt_OutOrder
        {
            Status = transfer.Status,
            CreateDate = DateTime.Now,
            Creater = transfer.Creater,
            OrderDate = DateTime.Now,
            OrderNumber = transfer.OrderNumber,
            Remarks = transfer.Remarks,
            WarehouseId = transfer.SourceWarehouseId,
        };
    }
    /// <summary>
    /// æ ¹æ®ç”Ÿäº§å‡ºåº“单明细列表和系统出库单ID构建系统出库单明细列表。
    /// </summary>
    private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderTransferDetail> transferDetails)
    {
        var orderDetails = new List<Dt_OutOrderDetail>();
        foreach (var item in transferDetails)
        {
            var detail = new Dt_OutOrderDetail
            {
                AllocatedQuantity = 0,
                BatchNumber = item.BatchNumber,
                CompletedQuantity = 0,
                CreateDate = item.CreateDate,
                Creater = item.Creater,
                MaterialId = item.MaterialId,
                OutboundQuantity = item.Quantity,
                Remarks = item.Remarks,
                MaterialName = item.Remarks // ç‰©æ–™åç§°
            };
            orderDetails.Add(detail);
        }
        return orderDetails;
    }
    #endregion è°ƒæ‹¨å‡ºåº“单
    #region å‡ºåº“分配
    /// <summary>
    /// åˆ›å»ºä»»åŠ¡åˆ—è¡¨
    /// </summary>
    /// <param name="order">订单对象</param>
    /// <param name="filteredStocks">筛选后的库存列表</param>
    /// <returns>【任务列表,更新分配数量订单,创建任务的库存】</returns>
    private (List<Dt_Task>, Dt_OutOrder, List<DtStockInfo>) CreateTasks(Dt_OutOrder order, List<DtStockInfo> filteredStocks)
    {
        var tasks = new List<Dt_Task>();
        var stocks = new List<DtStockInfo>();
        foreach (var stock in filteredStocks)
        {
            // å¦‚果已分配数量达到出库数量,停止分配
            if (order.OrderDetailList.AllocatedQuantity >= order.OrderDetailList.OutboundQuantity)
                break;
            // å¦‚果托盘任务已存在,跳过
            if (_taskRepository.QueryFirst(x => x.PalletCode == stock.PalletCode) != null)
                continue;
            // åˆ›å»ºä»»åŠ¡
            tasks.Add(new Dt_Task
            {
                CreateDate = DateTime.Now, // åˆ›å»ºæ—¶é—´
                Creater = App.User.UserName, // åˆ›å»ºäºº
                CurrentAddress = stock.LocationCode, //当前位置
                Dispatchertime = DateTime.Now, //调度时间(任务下发时间)
                Grade = 1, // ç­‰çº§
                //PVI = stock.StockInfoDetails[0].MaterielCode, // ç‰©æ–™å·
                NextAddress = stock.LocationCode, // ä¸‹ä¸€ä½ç½®
                PalletCode = stock.PalletCode, //托盘号
                Remark = stock.Remark, //备注
                Roadway = stock.LocationInfo.RoadwayNo, //巷道
                SourceAddress = stock.LocationCode, //来源位置
                TargetAddress = order.OrderDetailList.Remarks, //目标地址
                TaskNum = _taskRepository.GetTaskNo().Result, //任务号
                TaskState = (int)TaskOutStatusEnum.OutNew, //任务状态
                TaskType = (int)TaskTypeEnum.Outbound, //任务类型
            });
            // æ›´æ–°å·²åˆ†é…æ•°é‡
            order.OrderDetailList.AllocatedQuantity += stock.StockInfoDetails.Sum(x => x.StockQuantity);
            stocks.Add(stock);
        }
        return (tasks, order, stocks);
    }
    /// <summary>
    /// æ›´æ–°åº“存状态
    /// </summary>
    /// <param name="filteredStocks">筛选后的库存列表</param>
    /// <returns>更新后的库存列表</returns>
    private List<DtStockInfo> UpdateStocks(List<DtStockInfo> filteredStocks)
    {
        var updatedStocks = new List<DtStockInfo>();
        foreach (var stock in filteredStocks)
        {
            // æ›´æ–°åº“存状态
            stock.LocationInfo.LocationStatus = (int)LocationEnum.Lock;
            stock.StockInfoDetails.ForEach(x =>
            {
                x.Status = (int)StockStateEmun.出库锁定;
            });
            updatedStocks.Add(stock);
        }
        return updatedStocks;
    }
    /// <summary>
    /// åˆ›å»ºè®¢å•库存列表
    /// </summary>
    /// <param name="stock">筛选后的库存列表</param>
    /// <param name="order">订单对象</param>
    /// <returns>订单库存列表</returns>
    private List<Dt_OutOrderAndStock> CreateOrderStock(List<DtStockInfo> stock, Dt_OutOrder order)
    {
        var orderStocks = new List<Dt_OutOrderAndStock>();
        foreach (var item in stock)
        {
            orderStocks.Add(new Dt_OutOrderAndStock()
            {
                AllocatedQuantity = order.OrderDetailList.AllocatedQuantity,
                MaterialNo = item.StockInfoDetails[0].MaterielCode,
                MaterialName = order.OrderDetailList.MaterialName,
                OrderNumber = order.OrderNumber,
                OutboundQuantity = order.OrderDetailList.OutboundQuantity,
                PalletCode = item.PalletCode,
                PalletQuantity = item.StockInfoDetails.Sum(x => x.StockQuantity),
                State = item.StockInfoDetails[0].Status,
                BatchNumber = order.OrderDetailList.BatchNumber,
                CompletedQuantity = order.OrderDetailList.CompletedQuantity,
                Creater = App.User.UserName,
                CreateDate = DateTime.Now,
                GroupId = item.Id,
                LocationCode = item.LocationInfo.LocationCode,
                OutOrderId = order.Id,
            });
        }
        return orderStocks;
    }
    #endregion å‡ºåº“分配
    #endregion ç§æœ‰æ–¹æ³•
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageTaskServices/BDCManager/BDCManager.cs
@@ -4,48 +4,33 @@
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_BasicInfoRepository;
using WIDESEAWCS_BasicInfoService;
namespace WIDESEA_StorageTaskServices
{
    public class BDCManager : IBDCManager
    public partial class BDCManager : IBDCManager
    {
        private readonly List<Dt_PalletStockInfo> _storageLocations;
        private readonly List<DtLocationInfo> _locationInfos;
        private readonly object _lock = new object();
        private readonly IDt_BDCConfigurationService _BDCConfigurationService;
        private readonly ILocationInfoRepository _locationRepository;
        private readonly IDt_RoadWayInfoRepository _roadWayInfoRepository;
        private readonly IDt_RoadWayRepository _roadWayRepository;
        public int TotalCapacity => _locationInfos.Count;
        // æ›´æ–°æž„造函数
        public BDCManager(IDt_BDCConfigurationService BDCConfigurationService, ILocationInfoRepository locationInfoRepository, IDt_RoadWayInfoRepository roadWayInfoRepository )
        {
            _BDCConfigurationService = BDCConfigurationService;
            _locationRepository = locationInfoRepository;
            _roadWayInfoRepository = roadWayInfoRepository;
        }
        public List<DtLocationInfo> TotalCapacity => _locationRepository.QueryData();
        public int CurrentOccupancy => _storageLocations.Count;
        public bool AddToBDC(Dt_CarBody body)
        {
            throw new NotImplementedException();
        }
        public void GenerateReport()
        {
            throw new NotImplementedException();
        }
        public List<Dt_CarBody> GetInventory()
        {
            throw new NotImplementedException();
        }
        public List<Dt_CarBody> RetrieveByColor(int color)
        {
            throw new NotImplementedException();
        }
        public List<Dt_CarBody> RetrieveByModel(string model)
        {
            throw new NotImplementedException();
        }
        public Dt_CarBody RetrieveFromBDC(string bodyId)
        {
            throw new NotImplementedException();
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageTaskServices/BDCManager/Partial/BDCManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_StorageTaskServices
{
    public partial class BDCManager
    {
        public async Task<bool> AddToBDC(Dt_CarBody body)
        {
            // æ ¹æ®è½¦èº«ç±»åž‹æ£€æŸ¥æ˜¯å¦å¯ä»¥å…¥åº“
            if (body.CarType == (int)BodyType.WhiteBody)
            {
                if (!await _BDCConfigurationService.CanAddWhiteBody())
                {
                    Console.WriteLine($"无法入库:白车身已达到最大缓存限制");
                    return false;
                }
            }
            else // å½©è½¦èº«
            {
                if (!await _BDCConfigurationService.CanAddPaintedBody())
                {
                    Console.WriteLine($"无法入库:彩车身已达到最大缓存限制");
                    return false;
                }
            }
            //TotalCapacity.Where(x=>x.EnalbeStatus == (int)EnableEnum.Enable && x.LocationStatus == (int)LocationEnum.Free).OrderByDescending.FirstOrDefault();
            return true;
        }
        public void GenerateReport()
        {
            throw new NotImplementedException();
        }
        public List<Dt_CarBody> GetInventory()
        {
            throw new NotImplementedException();
        }
        public List<Dt_CarBody> RetrieveByColor(int color)
        {
            throw new NotImplementedException();
        }
        public List<Dt_CarBody> RetrieveByModel(string model)
        {
            throw new NotImplementedException();
        }
        public Dt_CarBody RetrieveFromBDC(string bodyId)
        {
            throw new NotImplementedException();
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -12,6 +12,7 @@
using WIDESEA_IStoragIntegrationServices;
using WIDESEA_StoragIntegrationServices;
using WIDESEAWCS_BasicInfoRepository;
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob.Models;
@@ -21,6 +22,7 @@
public partial class Dt_TaskService : ServiceBase<Dt_Task, IDt_TaskRepository>, IDt_TaskService
{
    private readonly LogFactory LogFactory = new LogFactory();
    //private readonly BDCManager bDCManager = new BDCManager();
    private readonly IUnitOfWorkManage _unitOfWorkManage;
    private readonly IDt_Task_HtyRepository _task_HtyRepository;
    private readonly IMapper _mapper;
@@ -30,9 +32,12 @@
    private readonly IDt_StationManagerRepository _stationManagerRepository;
    private readonly ISys_ConfigService _configService;
    private readonly IDt_PalletStockInfoRepository _palletStockInfoRepository;
    private readonly IDt_PalletStockInfoDetailRepository _palletStockInfoDetailRepository;
    private readonly IDt_PalletStockInfo_htyRepository _palletStockInfo_HtyRepository;
    private readonly IBoxingInfoRepository _boxingInfoRepository;
    private readonly IDt_CarBodyRepository _carBodyRepository;
    private readonly IDt_BDCConfigurationRepository _bdcConfigurationRepository;
    private readonly IDt_BDCConfigurationService _bdcConfigurationService;
    private readonly IDt_RoadWayRepository _roadWayRepository;
    private readonly IDt_RoadWayInfoRepository _roadWayInfoRepository;
    public Dt_TaskService(IDt_TaskRepository BaseDal,
                                IUnitOfWorkManage unitOfWorkManage,
@@ -42,7 +47,7 @@
                                ITaskExecuteDetailRepository taskExecuteDetailRepository,
                                ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository,
                                IDt_StationManagerRepository stationManagerRepository,
                                ISys_ConfigService configService, IDt_PalletStockInfoRepository palletStockInfoRepository, IDt_PalletStockInfo_htyRepository palletStockInfo_HtyRepository, IBoxingInfoRepository boxingInfoRepository, IDt_PalletStockInfoDetailRepository palletStockInfoDetailRepository) : base(BaseDal)
                                ISys_ConfigService configService, IDt_PalletStockInfoRepository palletStockInfoRepository, IDt_PalletStockInfo_htyRepository palletStockInfo_HtyRepository, IDt_CarBodyRepository carBodyRepository, IDt_BDCConfigurationRepository bdcConfigurationRepository, IDt_BDCConfigurationService bDCConfigurationService, IDt_RoadWayRepository roadWayRepository, IDt_RoadWayInfoRepository roadWayInfoRepository) : base(BaseDal)
    {
        _unitOfWorkManage = unitOfWorkManage;
@@ -55,8 +60,11 @@
        _configService = configService;
        _palletStockInfoRepository = palletStockInfoRepository;
        _palletStockInfo_HtyRepository = palletStockInfo_HtyRepository;
        _boxingInfoRepository = boxingInfoRepository;
        _palletStockInfoDetailRepository = palletStockInfoDetailRepository;
        _carBodyRepository = carBodyRepository;
        _bdcConfigurationRepository = bdcConfigurationRepository;
        _bdcConfigurationService = bDCConfigurationService;
        _roadWayRepository = roadWayRepository;
        _roadWayInfoRepository = roadWayInfoRepository;
    }
    #region å¤–部接口方法
@@ -85,14 +93,14 @@
            var taskHty = CreateHistoricalTask(task);
            //获取组盘信息
            var boxinginfo = await _boxingInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode);
            var carBody = await _carBodyRepository.QueryFirstAsync(x => x.PalletCode == task.PalletCode);
            // æ ¹æ®åˆ›å»ºåº“存实例模型
            //var boxDetail = boxinginfo.BoxingInfoDetails.Adapt<List<Dt_PalletStockInfoDetail>>();
            Dt_PalletStockInfo palletStockInfo = new Dt_PalletStockInfo
            {
                CreateDate = DateTime.Now,
                Creater = task.Creater,
                LocationCode = task.TargetAddress,
                StockStatus = 2,
@@ -100,7 +108,7 @@
            };
            // æ‰§è¡Œæ•°æ®åº“事务
            bool isResult = await ExecuteTransaction(palletStockInfo, taskHty, locationInf, task.TaskId, boxinginfo);
            bool isResult = await ExecuteTransaction(palletStockInfo, taskHty, locationInf, task.TaskId, carBody);
            if (isResult)
            {
                _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(locationInf, lastStatus, (int)StatusChangeTypeEnum.AutomaticStorage, task.TaskNum);
@@ -141,7 +149,7 @@
            stockInfo_Hty.FinishTime = DateTime.Now;
            stockInfo_Hty.OperateType = (int)OperateTypeEnum.自动完成;
            var boxinfo = _boxingInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
            var boxinfo = _carBodyRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
            // äº‹åŠ¡å¤„ç†
            await _unitOfWorkManage.UseTranAsync(async () =>
@@ -404,7 +412,7 @@
                _unitOfWorkManage.CommitTran();
            }
            content.OK();
        }
        catch (Exception ex)
@@ -617,21 +625,6 @@
    #endregion å†…部调用方法
    #region private å†…部方法
    private async Task DeleteStockInfoDetailsAsync(IEnumerable<Dt_PalletStockInfoDetail> details)
    {
        if (details != null)
        {
            var ids = details.Select(x => (object)x.Id).ToArray();
            var isStockDetailUpdated = await _palletStockInfoDetailRepository.DeleteDataByIdsAsync(ids);
            if (!isStockDetailUpdated)
            {
                throw new Exception("库存详情信息更新失败");
            }
        }
    }
    /// <summary>
    /// åˆ›å»ºåŽ†å²ä»»åŠ¡è®°å½•
    /// </summary>
@@ -665,7 +658,7 @@
    /// <param name="taskHty">历史任务对象</param>
    /// <param name="taskId">任务ID</param>
    /// <returns></returns>
    private async Task<bool> ExecuteTransaction(Dt_PalletStockInfo stock, Dt_Task_Hty taskHty, DtLocationInfo locationInfo, int taskId, DtBoxingInfo boxingInfo)
    private async Task<bool> ExecuteTransaction(Dt_PalletStockInfo stock, Dt_Task_Hty taskHty, DtLocationInfo locationInfo, int taskId, Dt_CarBody boxingInfo)
    {
        _unitOfWorkManage.BeginTran();
        try
@@ -678,7 +671,7 @@
            //删除组盘数据
            if (boxingInfo != null)
            {
                var box = _boxingInfoRepository.DeleteData(boxingInfo);
                var box = _carBodyRepository.DeleteData(boxingInfo);
                //boxingInfo.CurrentStatue = 5;
                //isDeleteBoxing = await _boxingInfoRepository.Db.DeleteNav<DtBoxingInfo>(x => x.Id == boxingInfo.Id)
                //                        .Include(x => x.BoxingInfoDetails)
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs
@@ -31,10 +31,6 @@
        WebResponseContent content = new WebResponseContent();
        try
        {
            //string palletCode = saveModel.MainData["palletCode"].ToString();
            //string station = saveModel.MainData["station"].ToString();
            // è°ƒç”¨BaseDal.QueryFirstAsync方法,查询任务
            var task = await BaseDal.QueryFirstAsync(x => x.PalletCode == input.PalletCode);
            if (task != null)
            {
@@ -46,14 +42,20 @@
            {
                throw new Exception($"站台{input.Position}不存在");
            }
            var carBody = _carBodyRepository.QueryFirst(x => x.PalletCode == input.PalletCode);
            BDCManager bDCManager = new BDCManager(_bdcConfigurationService, _locationRepository, _roadWayInfoRepository);
            await bDCManager.AddToBDC(carBody);
            // èŽ·å–åº“ä½
            var location = RequestLocation(stationInfo.Roadway);
            if (location == null)
            {
                return content.Error("无法获取货位信息或库位已满");
            }
            var newtask = new Dt_Task
            {
                CurrentAddress = input.Position,
@@ -61,7 +63,6 @@
                Roadway = stationInfo.Roadway,
                TargetAddress = location.LocationCode,
                Dispatchertime = DateTime.Now,
                NextAddress = stationInfo.Roadway,
                OrderNo = null,
                PalletCode = input.PalletCode,
@@ -70,10 +71,9 @@
                TaskType = (int)TaskInboundTypeEnum.Inbound,
                TaskNum = await BaseDal.GetTaskNo(),
                Creater = "Systeam",
            };
            _unitOfWorkManage.BeginTran();
            BaseDal.AddData(newtask);
@@ -81,7 +81,7 @@
            _locationRepository.UpdateData(location);
            _unitOfWorkManage.CommitTran();
            content.OK("申请入库成功",data: newtask);
            content.OK("申请入库成功", data: newtask);
        }
        catch (Exception er)
        {
@@ -121,7 +121,7 @@
                return location;
            }
            catch (Exception err)
            {
            {
                Console.WriteLine(err.Message.ToString());
                return null;
            }
@@ -132,10 +132,10 @@
    private DtLocationInfo GetEmptyLocation(List<DtLocationInfo> dtLocationInfos)
    {
        var locationinfo = dtLocationInfos.Where(x => x.LocationStatus == (int)LocationEnum.Free && x.EnalbeStatus == 1).OrderBy(x => x.Column).ThenBy(x => x.Row).ThenBy(x => x.Layer).FirstOrDefault();   //.ThenByDescending(x => x.Depth)
        return locationinfo;
    }
    #endregion èŽ·å–è´§ä½
    #endregion åº“位分配
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_WMSServer/Controllers/BasicInfo/Dt_BDCConfigurationController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using Microsoft.AspNetCore.Mvc;
using WIDESEA_BusinessServices;
using WIDESEA_Core.BaseController;
using WIDESEA_IBusinessServices;
using WIDESEA_Model.Models;
using WIDESEAWCS_BasicInfoService;
namespace WIDESEA_WMSServer.Controllers
{
    [Route("api/Dt_BDCConfiguration")]
    [ApiController]
    public class Dt_BDCConfigurationController : ApiBaseController<IDt_BDCConfigurationService, Dt_BDCConfiguration>
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        public Dt_BDCConfigurationController(IDt_BDCConfigurationService service, IHttpContextAccessor httpContextAccessor) : base(service)
        {
            _httpContextAccessor = httpContextAccessor;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_WMSServer/Controllers/MES/MESController.cs
@@ -42,7 +42,6 @@
        return _MESService.prebind(json);
    }
    /// <summary>
    /// æ€»è£…工单
    /// </summary>
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_WMSServer/Controllers/OutboundOrder/Dt_AssemblyOrderInfoController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
namespace WIDESEA_WMSServer.Controllers;
/// <summary>
/// ç³»ç»Ÿè®¢å•接口
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class Dt_AssemblyOrderInfoController : ApiBaseController<IDt_AssemblyOrderInfoService, Dt_AssemblyOrderInfo>
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public Dt_AssemblyOrderInfoController(IDt_AssemblyOrderInfoService service, IHttpContextAccessor httpContextAccessor) : base(service)
    {
        _httpContextAccessor = httpContextAccessor;
    }
}
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_WMSServer/Controllers/OutboundOrder/Dt_PaintingOrderInfoController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
namespace WIDESEA_WMSServer.Controllers;
/// <summary>
/// ç³»ç»Ÿè®¢å•接口
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class Dt_PaintingOrderInfoController : ApiBaseController<IDt_PaintingOrderInfoService, Dt_PaintingOrderInfo>
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public Dt_PaintingOrderInfoController(IDt_PaintingOrderInfoService service, IHttpContextAccessor httpContextAccessor) : base(service)
    {
        _httpContextAccessor = httpContextAccessor;
    }
}