ee6b82936b52250e46b57fcf12484a6f40c4dc50..98c5fbdce57cf9f0914ca5fb2c659c9396d3aed6
2025-12-03 pan
提交
98c5fb 对比 | 目录
2025-12-03 647556386
1
bd44b8 对比 | 目录
2025-12-03 647556386
Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxia...
09d106 对比 | 目录
2025-12-03 647556386
1
475fc7 对比 | 目录
2025-12-03 pan
提交
ac06ac 对比 | 目录
2025-12-03 pan
提交
151047 对比 | 目录
2025-12-03 647556386
虚拟出入库回传MES
c79710 对比 | 目录
2025-12-03 pan
提交
84bc96 对比 | 目录
2025-12-03 pan
Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxia...
61fb79 对比 | 目录
2025-12-03 pan
提交
f75185 对比 | 目录
2025-12-03 heshaofeng
Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxia...
afbd57 对比 | 目录
2025-12-03 heshaofeng
提价
2ebf58 对比 | 目录
2025-12-03 pan
提交
aa955b 对比 | 目录
2025-12-03 pan
Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxia...
9b6ad3 对比 | 目录
2025-12-03 pan
提交
7814aa 对比 | 目录
2025-12-03 heshaofeng
1
064c1a 对比 | 目录
2025-12-03 heshaofeng
Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxia...
b4dfb1 对比 | 目录
2025-12-03 heshaofeng
提交
871a7e 对比 | 目录
2025-12-03 pan
提交
1b80ac 对比 | 目录
2025-12-03 pan
提交
ec2387 对比 | 目录
2025-12-03 pan
提交
1a4654 对比 | 目录
2025-12-02 pan
Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxia...
991673 对比 | 目录
2025-12-02 pan
提交
366fe4 对比 | 目录
2025-12-02 heshaofeng
提交
768883 对比 | 目录
2025-12-02 heshaofeng
提交
c1f92d 对比 | 目录
2025-12-02 pan
Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxia...
d89c4f 对比 | 目录
2025-12-02 pan
提交
1527b8 对比 | 目录
已添加1个文件
已修改25个文件
2356 ■■■■■ 文件已修改
项目代码/WIDESEA_WMSClient/config/buttons.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/check/extend/StockSelect.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/inbound/extend/PickingRetuenPallet.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/EmptyTrayOutbound.vue 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js 492 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-shm 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-shm 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_AllocateService/AllocateService.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_CheckService/ReCheckOrderService.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/BaseRepository/RepositoryBase.cs 327 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_PickingRecord.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 535 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs 165 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/PickingReturnController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEA_WMSClient/config/buttons.js
@@ -199,6 +199,14 @@
    type: 'warning',
    onClick: function () {
    }
},{
    name: "空托出库",
    // icon: 'el-icon-upload2',
    class: '',
    value: 'EmptyTrayOutbound',
    type: 'primary',
    onClick: function () {
    }
},
]
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/check/extend/StockSelect.vue
@@ -209,7 +209,7 @@
        ? "api/Task/GenerateOutboundTask?orderDetailId="
        : "api/Task/GenerateOutboundTask?orderDetailId=";
      this.http
        .post(url + this.row.id, this.selection, "数据处理中")
        .post(url + this.row.id+"&station="+this.outboundForm.selectedPlatform, this.selection, "数据处理中")
        .then((x) => {
          if (!x.status) return this.$message.error(x.message);
          this.$message.success("操作成功");
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js
@@ -235,6 +235,7 @@
    const mountNode = document.createElement('div');
    document.body.appendChild(mountNode);
    const boxCodeReg = /^[A-Z]\d{9}$/;
    // å“åº”式表单数据:料箱码(必填,扫码枪/手动输入)
    const formData = reactive({ 
      boxCode: '',
@@ -269,15 +270,23 @@
    // æäº¤è¡¨å•的统一逻辑(供回车触发和按钮点击共用)
    const submitForm = async () => {
      const formRef = vnode.component.refs.batchInForm;
      if (!boxCodeReg.test(formData.boxCode.trim())) {
        ElMessage.warning('料箱码格式错误');
        selectBoxCodeInput();
        return;
      }
      try {
        // æ‰§è¡Œè¡¨å•校验(料箱码必填)
        await formRef.validate();
      } catch (err) {
        ElMessage.warning('请输入有效的料箱码');
        const errorMsg = err?.[0]?.message || '请输入有效的料箱码';
        ElMessage.warning(errorMsg);
        selectBoxCodeInput();
        return;
      }
      http.post('/api/InboundOrder/EmptyMaterielGroup', {
        palletCode: formData.boxCode.trim(),
        warehouseCode:formData.warehouseCode
@@ -333,7 +342,8 @@
        model: formData,
        rules: {
          boxCode: [
            { required: true, message: '请输入料箱码', trigger: ['blur', 'enter'] }
            { required: true, message: '请输入料箱码', trigger: ['blur', 'change'] },
            { pattern: boxCodeReg, message: '料箱码格式错误', trigger: ['blur', 'change'] }
          ],
          warehouseCode:[
            { required: true, message: '请选择区域', trigger: ['change', 'blur'] }
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue
@@ -169,6 +169,7 @@
  data() {
    return {
      palletVisible: this.visible,
      trayBarcodeReg:/^[A-Z]\d{9}$/,
      trayBarcode: '',
      barcode: '',
      materials: [],
@@ -209,9 +210,16 @@
            trigger: 'change'
          }
        ],
        trayBarcode:[
          {
            pattern: this.trayBarcodeReg,
            message: '托盘号格式错误(需为1个大写字母+9个数字,如A000008024)',
            trigger: 'blur'
         }
        ],
        warehouseType: [
          {
            massage: '请选择仓库',
            message: '请选择仓库',
            trigger: 'change'
          }
        ]
@@ -516,6 +524,7 @@
          inputEl.focus();
          this.currentFocus = 'tray';
          this.scanTarget = 'tray';
          inputEl.select();
        }
      }
    },
@@ -705,6 +714,16 @@
      this.error = '';
      if(!this.trayBarcodeReg.test(currentTrayBarcode)){
        ElMessage.warning({
          message: '托盘号格式错误',
          type: 'warning',
          duration: 3000
        })
        this.focusTrayInput();
        return;
      }
      // è®¾ç½®æ‰˜ç›˜æ¡ç åŽï¼Œè‡ªåŠ¨èšç„¦åˆ°ç‰©æ–™è¾“å…¥æ¡†
      this.focusBarcodeInput();
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/PickingRetuenPallet.vue
@@ -169,6 +169,7 @@
  data() {
    return {
      palletVisible: this.visible,
      trayBarcodeReg: /^[A-Z]\d{9}$/,
      trayBarcode: '',
      barcode: '',
      materials: [],
@@ -209,6 +210,13 @@
            trigger: 'change'
          }
        ],
        trayBarcode: [
        {
          pattern: /^[A-Z]\d{9}$/,
          message: '托盘号格式错误',
          trigger: 'blur'
        }
      ],
        warehouseType: [
          {
            massage: '请选择仓库',
@@ -516,6 +524,7 @@
          inputEl.focus();
          this.currentFocus = 'tray';
          this.scanTarget = 'tray';
          inputEl.select();
        }
      }
    },
@@ -705,6 +714,12 @@
      this.error = '';
      if (!this.trayBarcodeReg.test(currentTrayBarcode)) {
        ElMessage.error('托盘条码格式错误');
        this.focusTrayInput();
        return;
      }
      // è®¾ç½®æ‰˜ç›˜æ¡ç åŽï¼Œè‡ªåŠ¨èšç„¦åˆ°ç‰©æ–™è¾“å…¥æ¡†
      this.focusBarcodeInput();
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/outbound/extend/EmptyTrayOutbound.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
<template>
  <vol-box v-model="show" title="空托出库" :width="800" :height="600">
    <template #content>
      <el-form ref="form" :model="form" label-width="90px">
        <el-form-item label="出库区域:">
          <el-select v-model="locationType" placeholder="请选择出库区域">
            <el-option v-for="item in locationTypes" :key="item.locationType" :label="item.locationTypeDesc.toString()" :value="item.locationType">
            </el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <el-form ref="form" :model="form" label-width="90px">
        <el-form-item label="出库数量:">
          <el-select v-model="num" placeholder="请选择出库数量">
            <el-option v-for="item in 6" :key="item" :label="item.toString()" :value="item">
            </el-option>
          </el-select>
        </el-form-item>
      </el-form>
    </template>
    <template #footer>
      <div>
        <el-button type="danger" size="small" plain @click="submit">
          <i class="el-icon-check">确认</i>
        </el-button>
        <el-button size="small" type="primary" plain @click="() => { this.show = false }">
          <i class="el-icon-close">关闭</i>
        </el-button>
      </div>
    </template>
  </vol-box>
</template>
<script>
import VolBox from '@/components/basic/VolBox.vue'
export default {
  components: {
    'vol-box': VolBox
  },
  data() {
    return {
      num: 1,
      show: false,
      locationTypes: [],
      locationType:"",
    }
  },
  methods: {
    open() {
      this.show = true
      this.getData();
    },
    submit() {
      this.$emit('parentCall', ($vue) => {
        this.http.post(`/api/Task/PalletOutboundTask?num=${this.num}&locationType=${this.locationType}`, {}, '数据处理中...')
          .then((x) => {
            if (!x.status) {
              this.$message.error(x.message)
            } else {
              this.show = false
              this.$Message.success(x.message)
              $vue.refresh();
            }
          })
      })
    },
    getData() {
      this.http.post("api/LocationInfo/GetLocationTypes",null, "查询中")
        .then((x) => {
          this.locationTypes = x.data;
        })
    },
  }
}
</script>
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js
@@ -6,12 +6,13 @@
import gridBody from './extend/outOrderDetail.vue'
import gridHeader from './extend/NoStockOut.vue'
import gridFooter from './extend/EmptyTrayOutbound.vue'
let extension = {
  components: {
    //查询界面扩展组件
    gridHeader: gridHeader,
    gridBody: gridBody,
    gridFooter: '',
    gridFooter: gridFooter,
    //新建、编辑弹出框扩展组件
    modelHeader: '',
    modelBody: '',
@@ -20,6 +21,8 @@
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: {
    view: [
      /* {
       name: '出库',
       type: 'primary',
@@ -45,260 +48,260 @@
         });
       }
     }, */
      {
        name: '空托盘出库',
        type: 'primary',
        value: '空托盘出库',
        onClick: function () {
      // {
      //   name: '空托盘出库',
      //   type: 'primary',
      //   value: '空托盘出库',
      //   onClick: function () {
          const platformOptions = Array.from({ length: 1 }, (_, i) => {
            const num = 1;
            return { label: `站台${num}`, value: `1-2` };
          });
      //     const platformOptions = Array.from({ length: 1 }, (_, i) => {
      //       const num = 1;
      //       return { label: `站台${num}`, value: `1-2` };
      //     });
          const quantityOptions = Array.from({ length: 6 }, (_, i) => ({
            label: (i + 1).toString(),
            value: i + 1
          }));
      //     const quantityOptions = Array.from({ length: 6 }, (_, i) => ({
      //       label: (i + 1).toString(),
      //       value: i + 1
      //     }));
          const warehouseOptions = ref([]);
          const isLoadingWarehouses = ref(false);
      //     const warehouseOptions = ref([]);
      //     const isLoadingWarehouses = ref(false);
          const getWarehouseList = async () => {
            isLoadingWarehouses.value = true;
            try {
              const { data, status } = await http.post('/api/LocationInfo/GetLocationTypes');
              if (status && Array.isArray(data)) {
                // æ ¼å¼åŒ–仓库选项:适配ElSelect的label-value格式
                warehouseOptions.value = data.map(item => ({
                  label: item.locationTypeDesc,
                  value: item.locationType
                }));
              } else {
                ElMessage.error('获取区域列表失败');
                warehouseOptions.value = [];
              }
            } catch (err) {
              ElMessage.error('区域数据请求异常,请稍后重试');
              warehouseOptions.value = [];
            } finally {
              isLoadingWarehouses.value = false;
            }
          };
      //     const getWarehouseList = async () => {
      //       isLoadingWarehouses.value = true;
      //       try {
      //         const { data, status } = await http.post('/api/LocationInfo/GetLocationTypes');
      //         if (status && Array.isArray(data)) {
      //           // æ ¼å¼åŒ–仓库选项:适配ElSelect的label-value格式
      //           warehouseOptions.value = data.map(item => ({
      //             label: item.locationTypeDesc,
      //             value: item.locationType
      //           }));
      //         } else {
      //           ElMessage.error('获取区域列表失败');
      //           warehouseOptions.value = [];
      //         }
      //       } catch (err) {
      //         ElMessage.error('区域数据请求异常,请稍后重试');
      //         warehouseOptions.value = [];
      //       } finally {
      //         isLoadingWarehouses.value = false;
      //       }
      //     };
          const mountNode = document.createElement('div');
          document.body.appendChild(mountNode);
      //     const mountNode = document.createElement('div');
      //     document.body.appendChild(mountNode);
          const formData = reactive({
            warehouseCode: '',
            palletCode: '',
            selectedPlatform: platformOptions[0].value,
            quantity: 1
          });
      //     const formData = reactive({
      //       warehouseCode: '',
      //       palletCode: '',
      //       selectedPlatform: platformOptions[0].value,
      //       quantity: 1
      //     });
          const vnode = createVNode(ElDialog, {
            title: '空托盘出库',
            width: '500px',
            modelValue: true,
            appendToBody: true,
            onOpened: async () => {
              await getWarehouseList();
              const inputRef = vnode.component.refs.boxCodeInput;
              inputRef?.focus();
            },
            'onUpdate:modelValue': (isVisible) => {
              if (!isVisible) {
                render(null, mountNode);
                document.body.removeChild(mountNode);
              }
            },
            style: {
              padding: '20px 0',
              borderRadius: '8px'
            }
          }, {
            default: () => h(ElForm, {
              model: formData,
              rules: {
                warehouseCode: [
                  { required: true, message: '请选择区域', trigger: ['change', 'blur'] }
                ],
                palletCode: [
                  { type: 'string', message: '料箱号必须为字符串', trigger: 'blur' }
                ],
                selectedPlatform: [
                  { required: true, message: '请选择出库站台', trigger: 'change' }
                ],
                quantity: [
                  { required: true, message: '请选择空箱数量', trigger: 'change' }
                ]
              },
              ref: 'batchOutForm',
              labelWidth: '100px',
              style: {
                padding: '0 30px',
              }
            },
              [
                //   h(ElFormItem, {
                //     label: '仓库区域',
                //     prop: 'warehouseCode',
                //     style: {
                //       marginBottom: '24px'
                //     }
                //   }, [
                //     h(ElSelect, {
                //       placeholder: '请选择仓库区域',
                //       modelValue: formData.warehouseCode,
                //       'onUpdate:modelValue': (val) => {
                //         formData.warehouseCode = val;
                //       },
                //       style: {
                //         width: '100%',
                //         height: '40px',
                //         borderRadius: '4px',
                //         borderColor: '#dcdfe6'
                //       }
                //     }, warehouseOptions.value.map(platform =>
                //       h(ElOption, { label: platform.label, value: platform.value })
                //     ))
                //   ]),
                h(ElFormItem, {
                  label: '出库站台',
                  prop: 'selectedPlatform',
                  style: {
                    marginBottom: '24px'
                  }
                }, [
                  h(ElSelect, {
                    placeholder: '请选择出库站台',
                    modelValue: formData.selectedPlatform,
                    'onUpdate:modelValue': (val) => {
                      formData.selectedPlatform = val;
                    },
                    style: {
                      width: '100%',
                      height: '40px',
                      borderRadius: '4px',
                      borderColor: '#dcdfe6'
                    }
                  }, platformOptions.map(platform =>
                    h(ElOption, { label: platform.label, value: platform.value })
                  ))
                ]),
                //   h(ElFormItem,{
                //     label:'出库数量',
                //     prop:'quantity',
                //     style:{
                //       marginBottom:'24px'
                //     }
                //   },[h(ElSelect,{
                //     placeholder:'请选择空箱数量',
                //     modelValue:formData.quantity,
                //     'onUpdate:modelValue':(val)=>{
                //       formData.quantity=val;
                //     },
                //     style:{
                //       width:'100%',
                //       height:'40px',
                //       borderRadius:'4px',
                //       borderColor:'#dcdfe6'
                //     },
                //     filterable:false
                //   },
                //   quantityOptions.map(option=>
                //     h(ElOption,{
                //       label:option.label,
                //       value:option.value
                //     })
                //   )
                // )]),
                h(ElFormItem, {
                  label: '料箱号',
                  prop: 'palletCode',
                  style: {
                    marginBottom: '16px'
                  }
                }, [
                  h(ElInput, {
                    type: 'text',
                    placeholder: '可选输入料箱号,不填则自动分配空料箱',
                    modelValue: formData.palletCode,
                    'onUpdate:modelValue': (val) => {
                      formData.palletCode = val;
                    },
                    style: {
                      width: '100%',
                      height: '40px',
                      borderRadius: '4px',
                      borderColor: '#dcdfe6'
                    },
                    attrs: {
                      placeholderStyle: 'color: #909399;'
                    }
                  })
                ]),
      //     const vnode = createVNode(ElDialog, {
      //       title: '空托盘出库',
      //       width: '500px',
      //       modelValue: true,
      //       appendToBody: true,
      //       onOpened: async () => {
      //         await getWarehouseList();
      //         const inputRef = vnode.component.refs.boxCodeInput;
      //         inputRef?.focus();
      //       },
      //       'onUpdate:modelValue': (isVisible) => {
      //         if (!isVisible) {
      //           render(null, mountNode);
      //           document.body.removeChild(mountNode);
      //         }
      //       },
      //       style: {
      //         padding: '20px 0',
      //         borderRadius: '8px'
      //       }
      //     }, {
      //       default: () => h(ElForm, {
      //         model: formData,
      //         rules: {
      //           warehouseCode: [
      //             { required: true, message: '请选择区域', trigger: ['change', 'blur'] }
      //           ],
      //           palletCode: [
      //             { type: 'string', message: '料箱号必须为字符串', trigger: 'blur' }
      //           ],
      //           selectedPlatform: [
      //             { required: true, message: '请选择出库站台', trigger: 'change' }
      //           ],
      //           quantity: [
      //             { required: true, message: '请选择空箱数量', trigger: 'change' }
      //           ]
      //         },
      //         ref: 'batchOutForm',
      //         labelWidth: '100px',
      //         style: {
      //           padding: '0 30px',
      //         }
      //       },
      //         [
      //           //   h(ElFormItem, {
      //           //     label: '仓库区域',
      //           //     prop: 'warehouseCode',
      //           //     style: {
      //           //       marginBottom: '24px'
      //           //     }
      //           //   }, [
      //           //     h(ElSelect, {
      //           //       placeholder: '请选择仓库区域',
      //           //       modelValue: formData.warehouseCode,
      //           //       'onUpdate:modelValue': (val) => {
      //           //         formData.warehouseCode = val;
      //           //       },
      //           //       style: {
      //           //         width: '100%',
      //           //         height: '40px',
      //           //         borderRadius: '4px',
      //           //         borderColor: '#dcdfe6'
      //           //       }
      //           //     }, warehouseOptions.value.map(platform =>
      //           //       h(ElOption, { label: platform.label, value: platform.value })
      //           //     ))
      //           //   ]),
      //           h(ElFormItem, {
      //             label: '出库站台',
      //             prop: 'selectedPlatform',
      //             style: {
      //               marginBottom: '24px'
      //             }
      //           }, [
      //             h(ElSelect, {
      //               placeholder: '请选择出库站台',
      //               modelValue: formData.selectedPlatform,
      //               'onUpdate:modelValue': (val) => {
      //                 formData.selectedPlatform = val;
      //               },
      //               style: {
      //                 width: '100%',
      //                 height: '40px',
      //                 borderRadius: '4px',
      //                 borderColor: '#dcdfe6'
      //               }
      //             }, platformOptions.map(platform =>
      //               h(ElOption, { label: platform.label, value: platform.value })
      //             ))
      //           ]),
      //           //   h(ElFormItem,{
      //           //     label:'出库数量',
      //           //     prop:'quantity',
      //           //     style:{
      //           //       marginBottom:'24px'
      //           //     }
      //           //   },[h(ElSelect,{
      //           //     placeholder:'请选择空箱数量',
      //           //     modelValue:formData.quantity,
      //           //     'onUpdate:modelValue':(val)=>{
      //           //       formData.quantity=val;
      //           //     },
      //           //     style:{
      //           //       width:'100%',
      //           //       height:'40px',
      //           //       borderRadius:'4px',
      //           //       borderColor:'#dcdfe6'
      //           //     },
      //           //     filterable:false
      //           //   },
      //           //   quantityOptions.map(option=>
      //           //     h(ElOption,{
      //           //       label:option.label,
      //           //       value:option.value
      //           //     })
      //           //   )
      //           // )]),
      //           h(ElFormItem, {
      //             label: '料箱号',
      //             prop: 'palletCode',
      //             style: {
      //               marginBottom: '16px'
      //             }
      //           }, [
      //             h(ElInput, {
      //               type: 'text',
      //               placeholder: '可选输入料箱号,不填则自动分配空料箱',
      //               modelValue: formData.palletCode,
      //               'onUpdate:modelValue': (val) => {
      //                 formData.palletCode = val;
      //               },
      //               style: {
      //                 width: '100%',
      //                 height: '40px',
      //                 borderRadius: '4px',
      //                 borderColor: '#dcdfe6'
      //               },
      //               attrs: {
      //                 placeholderStyle: 'color: #909399;'
      //               }
      //             })
      //           ]),
                h('div', {
                  style: {
                    textAlign: 'right',
                    marginTop: '8px',
                    paddingRight: '4px'
                  }
                }, [
                  h(ElButton, {
                    type: 'text',
                    onClick: () => {
                      render(null, mountNode);
                      document.body.removeChild(mountNode);
                      ElMessage.info('取消出库操作');
                    },
                    style: {
                      marginRight: '8px',
                      color: '#606266'
                    }
                  }, '取消'),
                  h(ElButton, {
                    type: 'primary',
                    onClick: async () => {
                      const formRef = vnode.component.refs.batchOutForm;
                      try {
                        await formRef.validate();
                      } catch (err) {
                        return;
                      }
      //           h('div', {
      //             style: {
      //               textAlign: 'right',
      //               marginTop: '8px',
      //               paddingRight: '4px'
      //             }
      //           }, [
      //             h(ElButton, {
      //               type: 'text',
      //               onClick: () => {
      //                 render(null, mountNode);
      //                 document.body.removeChild(mountNode);
      //                 ElMessage.info('取消出库操作');
      //               },
      //               style: {
      //                 marginRight: '8px',
      //                 color: '#606266'
      //               }
      //             }, '取消'),
      //             h(ElButton, {
      //               type: 'primary',
      //               onClick: async () => {
      //                 const formRef = vnode.component.refs.batchOutForm;
      //                 try {
      //                   await formRef.validate();
      //                 } catch (err) {
      //                   return;
      //                 }
                      http.post('/api/Task/PalletOutboundTask?palletCode=' + formData.palletCode + '&endStation=' + formData.selectedPlatform, {
      //                 http.post('/api/Task/PalletOutboundTask?palletCode=' + formData.palletCode + '&endStation=' + formData.selectedPlatform, {
                      }).then(({ data, status, message }) => {
                        if (status) {
      //                 }).then(({ data, status, message }) => {
      //                   if (status) {
                          ElMessage.success(`出库成功`);
                          this.refresh();
                          render(null, mountNode);
                          document.body.removeChild(mountNode);
                        } else {
                          ElMessage.error(message || data?.message || '出库失败');
                        }
                      }).catch(() => {
                        ElMessage.error('请求失败,请稍后重试');
                      });
                    },
                    style: {
                      borderRadius: '4px',
                      padding: '8px 20px'
                    }
                  }, '确定')
                ])
              ])
          });
      //                     ElMessage.success(`出库成功`);
      //                     this.refresh();
      //                     render(null, mountNode);
      //                     document.body.removeChild(mountNode);
      //                   } else {
      //                     ElMessage.error(message || data?.message || '出库失败');
      //                   }
      //                 }).catch(() => {
      //                   ElMessage.error('请求失败,请稍后重试');
      //                 });
      //               },
      //               style: {
      //                 borderRadius: '4px',
      //                 padding: '8px 20px'
      //               }
      //             }, '确定')
      //           ])
      //         ])
      //     });
          vnode.appContext = this.$.appContext;
          render(vnode, mountNode);
        }
      }
      //     vnode.appContext = this.$.appContext;
      //     render(vnode, mountNode);
      //   }
      // }
    ], box: [], detail: []
  }, //扩展的按钮
  methods: {
@@ -364,6 +367,13 @@
        }
      }
      var EmptyTrayOutboundBtn = this.buttons.find(x => x.value == "EmptyTrayOutbound");
        if (EmptyTrayOutboundBtn != null) {
          EmptyTrayOutboundBtn.onClick = () => {
               this.$refs.gridFooter.open();
            }
        }
    },
    onInited() {
      //框架初始化配置后
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue
@@ -174,6 +174,20 @@
        bind: { key: "createType", data: [] },
      },
      {
        field: "fromWarehouse",
        title: "调出仓库",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "toWarehouse",
        title: "调入仓库",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "factoryArea",
        title: "厂区",
        type: "string",
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue
@@ -194,6 +194,20 @@
        bind: { key: "createType", data: [] },
      },
      {
        field: "fromWarehouse",
        title: "调出仓库",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "toWarehouse",
        title: "调入仓库",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "factoryArea",
        title: "厂区",
        type: "string",
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue
@@ -66,6 +66,7 @@
        { title: "物料编号", field: "materielCode" ,type:'like'},
        { title: "物料名称", field: "materielName" ,type:'like'},
        { title: "单据编号", field: "orderNo" ,type:'like'},
        { title: "托盘号", field: "palletCode" ,type:'like'},
      ],
    ]);
    const columns = ref([
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-shm
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-shm
Binary files differ
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_AllocateService/AllocateService.cs
@@ -439,6 +439,51 @@
            }
        }
        public override PageGridData<Dt_AllocateOrder> GetPageData(PageDataOptions options)
        {
            string wheres = ValidatePageOptions(options);
            //获取排序字段
            Dictionary<string, SqlSugar.OrderByType> orderbyDic = GetPageDataSort(options, TProperties);
            List<OrderByModel> orderByModels = new List<OrderByModel>();
            foreach (var item in orderbyDic)
            {
                OrderByModel orderByModel = new()
                {
                    FieldName = item.Key,
                    OrderByType = item.Value
                };
                orderByModels.Add(orderByModel);
            }
            int totalCount = 0;
            List<SearchParameters> searchParametersList = new List<SearchParameters>();
            if (!string.IsNullOrEmpty(options.Wheres))
            {
                try
                {
                    searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
                    options.Filter = searchParametersList;
                }
                catch { }
            }
            var data = BaseDal.Db.Queryable<Dt_AllocateOrder>()
                .WhereIF(!wheres.IsNullOrEmpty(), wheres)
                .OrderBy(orderByModels)
                .ToPageList(options.Page, options.Rows, ref totalCount);
            foreach (var item in data)
            {
                Dt_InboundOrder _InboundOrder = SqlSugarHelper.DbWMS.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == item.UpperOrderNo).First();
                if (_InboundOrder != null)
                {
                    item.OrderStatus = _InboundOrder.OrderStatus;
                    item.OrderType = _InboundOrder.OrderType;
                }
            }
            return new PageGridData<Dt_AllocateOrder>(totalCount, data);
        }
        public override PageGridData<Dt_InboundOrderDetail> GetDetailPage(PageDataOptions options)
        {
            string wheres = ValidatePageOptions(options);
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs
@@ -1,4 +1,5 @@
using Dm.filter;
using MailKit.Search;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Org.BouncyCastle.Asn1.Ocsp;
@@ -8,6 +9,7 @@
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Reflection.Metadata;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
@@ -25,7 +27,7 @@
using WIDESEA_Model.Models;
namespace WIDESEA_BasicService
{
{
    public class InvokeMESService : IInvokeMESService
    {
        private readonly IHttpClientFactory _httpClientFactory;
@@ -37,11 +39,12 @@
        private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
        private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
        private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
        private readonly IRepository<Dt_PickingRecord> _pickingRecoreRepository;
        private readonly IMaterialUnitService _materialUnitService;
        private readonly IOutboundOrderService _outboundOrderService;
        private readonly IOutboundOrderDetailService _outboundOrderDetailService;
        private readonly IOutStockLockInfoService _outStockLockInfoService;
        public InvokeMESService(IHttpClientFactory httpClientFactory, ILogger<InvokeMESService> logger, IRepository<Dt_FeedbackToMes> feedbacktomesRepository, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IOutStockLockInfoService outStockLockInfoService, IMaterialUnitService materialUnitService)
        public InvokeMESService(IHttpClientFactory httpClientFactory, ILogger<InvokeMESService> logger, IRepository<Dt_FeedbackToMes> feedbacktomesRepository, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IOutStockLockInfoService outStockLockInfoService, IMaterialUnitService materialUnitService, IRepository<Dt_PickingRecord> pickingRecoreRepository)
        {
            _httpClientFactory = httpClientFactory;
            _logger = logger;
@@ -53,6 +56,7 @@
            _outboundOrderDetailService = outboundOrderDetailService;
            _outStockLockInfoService = outStockLockInfoService;
            _materialUnitService = materialUnitService;
            _pickingRecoreRepository = pickingRecoreRepository;
        }
        /// <summary>
@@ -101,7 +105,7 @@
            _client.DefaultRequestHeaders.Clear();
            _client.DefaultRequestHeaders.Add("Accept", "application/json");
            _logger.LogInformation("InvokeMESService  FeedbackOutbound :  " + json);
            _logger.LogInformation("InvokeMESService  FeedbackOutbound :  "+ model.orderNo +"  , " + json);
            var response = await _client.PostAsync("AldMaterialOutbound/MaterialOutbound", content);
            string body = await response.Content.ReadAsStringAsync();
@@ -111,7 +115,7 @@
                throw new HttpRequestException(body);
            }
            _logger.LogInformation("InvokeMESService  FeedbackOutbound  body:  " + body);
            return JsonConvert.DeserializeObject<ResponseModel>(body);
        }
@@ -220,6 +224,7 @@
            }
        }
        /// <summary>
        /// 
        /// </summary>
@@ -275,7 +280,7 @@
                                               MaterialCode = group.Key.MaterielCode,
                                               LineNo = group.Key.InboundOrderRowNo,
                                               WarehouseCode = group.Key.WarehouseCode,
                                               Qty = group.Sum(x => x.BarcodeQty),
                                               Qty = group.Sum(x => x.BarcodeQty),
                                               Unit = group.Key.BarcodeUnit,
                                               Barcodes = group.Select(row => new BarcodeInfo
                                               {
@@ -283,7 +288,7 @@
                                                   Qty = row.BarcodeQty,
                                                   BatchNo = row.BatchNo,
                                                   SupplyCode = row.SupplyCode,
                                                   Unit = row.Unit
                                                   Unit = row.BarcodeUnit
                                               }).ToList()
                                           }).ToList();
                                        allocatefeedmodel.Details = groupedData;
@@ -366,11 +371,12 @@
            }
            return WebResponseContent.Instance.OK();
        }
        private async Task<WebResponseContent> HandleOutboundOrderBatchToMESCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
        {
            // å®šä¹‰é»˜è®¤è¿”回(成功态)
            WebResponseContent response = WebResponseContent.Instance.OK("回传MES处理完成");
            //0 = æœªå›žä¼ ï¼Œ1 = å·²å›žä¼ æˆåŠŸï¼Œ2 = å›žä¼ å¤±è´¥
            try
            {
                // æ ¡éªŒï¼šå·²å›žä¼ ç›´æŽ¥è¿”回错误
@@ -391,19 +397,111 @@
                    return WebResponseContent.Instance.Error("暂无需要处理的订单明细");
                }
                //  ç­›é€‰å·²å®Œæˆå‡ºåº“的明细ID
                var pickingRecords = await _pickingRecoreRepository.Db.Queryable<Dt_PickingRecord>().Where(x => x.OrderNo == orderNo && x.ReturnToMESStatus != 1 && !x.IsCancelled).ToListAsync();
                if (!pickingRecords.Any())
                    return WebResponseContent.Instance.Error("没有需要回传的分拣记录");
                var documentNo = UniqueValueGenerator.Generate();
                var feedModel = new FeedbackOutboundRequestModel
                {
                    reqCode = Guid.NewGuid().ToString(),
                    reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    business_type = outboundOrder.BusinessType,
                    factoryArea = outboundOrder.FactoryArea,
                    operationType = 1,
                    Operator = outboundOrder.Operator!=""? outboundOrder.Operator:App.User.UserName,
                    orderNo = outboundOrder.UpperOrderNo,
                    documentsNO = documentNo,
                    status = outboundOrder.OrderStatus,
                    details = new List<FeedbackOutboundDetailsModel>()
                };
                var detailIds = new List<int>();
                // å¡«å……明细和条码信息
                foreach (var detail in orderDetails)
                {
                    // æŸ¥è¯¢è¯¥æ˜Žç»†å¯¹åº”的锁定条码记录
                    var detailPicks = pickingRecords.Where(x => x.OrderNo == orderNo
                                   && detail.Id == x.OrderDetailId).ToList();
                    if (!detailPicks.Any())
                    {
                        continue;
                    }
                    var detailModel = new FeedbackOutboundDetailsModel
                    {
                        materialCode = detail.MaterielCode,
                        lineNo = detail.lineNo,
                        warehouseCode = detail.WarehouseCode,
                        qty = detail.BarcodeQty,
                        currentDeliveryQty = 0,
                        unit = detail.BarcodeUnit,
                        barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel>()
                    };
                    // å¡«å……条码信息(含单位转换)
                    foreach (var item in detailPicks)
                    {
                        if (item.PickQuantity <= 0)
                        {
                            continue;
                        }
                        var barModel = new WIDESEA_DTO.Outbound.BarcodesModel
                        {
                            barcode = item.Barcode,
                            supplyCode = item.SupplyCode,
                            batchNo = item.BatchNo,
                            unit = item.BarcodeUnit,
                            qty = item.PickQuantity
                        };
                        // å•位不一致时转换
                        if (detail.BarcodeUnit != detail.Unit)
                        {
                            var convertResult = await _materialUnitService.ConvertAsync(
                                item.MaterielCode, item.PickQuantity, detail.Unit, detail.BarcodeUnit);
                            barModel.unit = convertResult.Unit;
                            barModel.qty = convertResult.Quantity;
                        }
                        else
                        {
                            barModel.qty = item.PickQuantity;
                        }
                        detailModel.currentDeliveryQty += barModel.qty;
                        detailModel.barcodes.Add(barModel);
                    }
                    detailIds.Add(detail.Id);
                    feedModel.details.Add(detailModel);
                }
                feedModel.details = feedModel.details.GroupBy(item => new { item.materialCode, item.lineNo, item.warehouseCode, item.unit,item.qty  }).Select(group => new FeedbackOutboundDetailsModel
                {
                    materialCode = group.Key.materialCode,
                    lineNo = group.Key.lineNo,
                    warehouseCode = group.Key.warehouseCode,
                    qty = group.Key.qty,
                    currentDeliveryQty = group.Sum(x => x.currentDeliveryQty),
                    unit = group.Key.unit,
                    barcodes = group.SelectMany(x => x.barcodes.GroupBy(o => new { o.barcode, o.supplyCode, o.batchNo, o.unit }).Select(row => new WIDESEA_DTO.Outbound.BarcodesModel
                    {
                        barcode = row.Key.barcode,
                        supplyCode = row.Key.supplyCode,
                        batchNo = row.Key.batchNo,
                        unit = row.Key.unit,
                        qty = row.Sum(y => y.qty)
                    })).ToList()
                }).ToList();
                var allCompleted = true;
                // ç­›é€‰å¾…回传的明细(ReturnToMESStatus=0)
                var pendingDetails = orderDetails.Where(x => x.ReturnToMESStatus == 0).ToList();
                foreach (var detail in pendingDetails)
                {
                    if (detail.OverOutQuantity >= detail.NeedOutQuantity)
                    {
                        detailIds.Add(detail.Id);
                    }
                    else
                    if (detail.OverOutQuantity < detail.NeedOutQuantity)
                    {
                        allCompleted = false;
                    }
@@ -419,7 +517,7 @@
                int newStatus = allCompleted ? (int)OutOrderStatusEnum.出库完成 : (int)OutOrderStatusEnum.出库中;
                if (outboundOrder.OrderStatus != newStatus)
                {
                    // ä¿®æ­£åŽŸæœ‰è¯­æ³•é”™è¯¯ï¼šSetColumns æ˜¯èµ‹å€¼ï¼ˆ=)而非判断(==)
                    int updateCount = await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
                        .SetColumns(x => x.OrderStatus == newStatus)
                        .Where(x => x.OrderNo == orderNo)
@@ -428,82 +526,16 @@
                    if (updateCount <= 0)
                    {
                        _logger.LogWarning($"更新出库单状态失败 - OrderNo: {orderNo}, ç›®æ ‡çŠ¶æ€: {newStatus}");
                        // çŠ¶æ€æ›´æ–°å¤±è´¥ä¸ä¸­æ–­æµç¨‹ï¼Œä½†è®°å½•è­¦å‘Š
                    }
                }
                // æž„建回传MES的模型
                var documentNo = UniqueValueGenerator.Generate();
                var feedModel = new FeedbackOutboundRequestModel
                {
                    reqCode = Guid.NewGuid().ToString(),
                    reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    business_type = outboundOrder.BusinessType,
                    factoryArea = outboundOrder.FactoryArea,
                    operationType = 1,
                    Operator = outboundOrder.Operator,
                    orderNo = outboundOrder.UpperOrderNo,
                    documentsNO = documentNo,
                    status = outboundOrder.OrderStatus,
                    details = new List<FeedbackOutboundDetailsModel>()
                };
                // å¡«å……明细和条码信息
                foreach (var detail in orderDetails.Where(x => detailIds.Contains(x.Id)).ToList())
                {
                    // æŸ¥è¯¢è¯¥æ˜Žç»†å¯¹åº”的锁定条码记录
                    var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                        .Where(x => x.OrderNo == orderNo
                                   && detail.Id == x.OrderDetailId
                                   && (x.Status == (int)OutLockStockStatusEnum.拣选完成
                                       || x.Status == (int)OutLockStockStatusEnum.已回库))
                        .ToListAsync();
                    var detailModel = new FeedbackOutboundDetailsModel
                    {
                        materialCode = detail.MaterielCode,
                        lineNo = detail.lineNo,
                        warehouseCode = detail.WarehouseCode,
                        qty = detail.BarcodeQty,
                        currentDeliveryQty = detail.BarcodeQty,
                        unit = detail.BarcodeUnit,
                        barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel>()
                    };
                    // å¡«å……条码信息(含单位转换)
                    foreach (var item in detailLocks)
                    {
                        var barModel = new WIDESEA_DTO.Outbound.BarcodesModel
                        {
                            barcode = item.CurrentBarcode,
                            supplyCode = item.SupplyCode,
                            batchNo = item.BatchNo,
                            unit = item.BarcodeUnit,
                            qty = item.BarcodeQty
                        };
                        // å•位不一致时转换
                        if (item.BarcodeUnit != item.Unit)
                        {
                            var convertResult = await _materialUnitService.ConvertAsync(
                                item.MaterielCode, item.BarcodeQty, item.Unit, item.BarcodeUnit);
                            barModel.unit = convertResult.Unit;
                            barModel.qty = convertResult.Quantity;
                        }
                        detailModel.qty += barModel.qty;
                        detailModel.currentDeliveryQty += barModel.qty;
                        detailModel.barcodes.Add(barModel);
                    }
                    feedModel.details.Add(detailModel);
                }
                // è°ƒç”¨MES回传接口
                var mesResult = await FeedbackOutbound(feedModel);
                if (mesResult == null || mesResult.code != 200)
                {
                    // æ›´æ–°æ˜Žç»†ä¸ºå›žä¼ å¤±è´¥ï¼ˆReturnToMESStatus=2)
                    await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                        .SetColumns(it => new Dt_OutboundOrderDetail
@@ -516,17 +548,28 @@
                    return WebResponseContent.Instance.Error($"回传MES失败");
                }
                //MES回传成功:更新明细为回传成功状态
                await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                    .SetColumns(it => new Dt_OutboundOrderDetail
                    {
                        ReturnToMESStatus = 1,
                        documentsNO = documentNo,
                    })
                    .Where(x => detailIds.Contains(x.Id))
                    .ExecuteCommandAsync();
                foreach (var record in pickingRecords.Where(x => detailIds.Contains(x.OrderDetailId)).ToList())
                {
                    record.ReturnToMESStatus = 1;
                }
                var updates = pickingRecords.Where(x => detailIds.Contains(x.OrderDetailId)).ToList();
                updates.ForEach(x =>
                {
                    x.ReturnToMESStatus = 1;
                });
                await _pickingRecoreRepository.Db.Updateable(updates).ExecuteCommandAsync();
                if (allCompleted)
                {
                    //MES回传成功:更新明细为回传成功状态
                    await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                        .SetColumns(it => new Dt_OutboundOrderDetail
                        {
                            ReturnToMESStatus = 1,
                            documentsNO = documentNo,
                        })
                        .Where(x => detailIds.Contains(x.Id))
                        .ExecuteCommandAsync();
                }
                // æ ¡éªŒæ˜¯å¦æ‰€æœ‰æ˜Žç»†éƒ½å®Œæˆï¼Œæ›´æ–°è®¢å•最终状态
                if (allCompleted && newStatus == (int)OutOrderStatusEnum.出库完成)
                {
@@ -674,8 +717,8 @@
                                materialCode = group.Key.MaterielCode,
                                lineNo = group.Key.lineNo,
                                warehouseCode = group.Key.WarehouseCode,
                                qty = group.Sum(x => x.BarcodeQty),
                                currentDeliveryQty = group.Sum(x => x.BarcodeQty),
                                qty = group.Sum(x => x.PickedQty),
                                currentDeliveryQty = group.Sum(x => x.PickedQty),
                                unit = group.Key.BarcodeUnit,
                                barcodes = group.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
                                {
@@ -683,7 +726,7 @@
                                    supplyCode = lockInfo.SupplyCode,
                                    batchNo = lockInfo.BatchNo,
                                    unit = lockInfo.BarcodeUnit,
                                    qty = lockInfo.BarcodeQty
                                    qty = lockInfo.PickedQty
                                }).ToList()
                            }).ToList();
@@ -710,6 +753,11 @@
                            .Where(x => x.OrderNo == orderNo)
                            .ExecuteCommandAsync();
                        await _pickingRecoreRepository.Db.Updateable<Dt_PickingRecord>()
                                 .SetColumns(x => x.ReturnToMESStatus == 1)
                            .Where(x => x.OrderNo == orderNo)
                            .ExecuteCommandAsync();
                        return WebResponseContent.Instance.OK("回传MES成功");
                    }
                    else
@@ -729,7 +777,7 @@
                return WebResponseContent.Instance.Error("处理回传MES时发生异常,请联系管理员");
            }
        }
    }
    }
    public static class UniqueValueGenerator
    {
@@ -743,14 +791,23 @@
        public static string Generate()
        {
            var now = DateTime.Now;
            string datePart = now.ToString("yyyyMMdd");
            string datePart = now.ToString("MMdd");
            long ticksPart = now.Ticks;
            // æ‹¼æŽ¥ï¼šè®¡æ•°å™¨è¡¥0为3位(避免位数不一致)
            return $"{datePart}{ticksPart}";
        }
        public static string GenerateCount()
        {
            var now = DateTime.Now;
            string datePart = now.ToString("yyyyMMddHHmmss");
            // åŽŸå­é€’å¢žè®¡æ•°å™¨ï¼ˆå–æ¨¡1000,确保计数器仅3位,控制长度)
            long counterPart = Interlocked.Increment(ref _counter) % 1000;
            // æ‹¼æŽ¥ï¼šè®¡æ•°å™¨è¡¥0为3位(避免位数不一致)
            return $"{datePart}{ticksPart}{counterPart:D3}";
            return $"{datePart}{counterPart:D3}";
        }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_CheckService/ReCheckOrderService.cs
@@ -92,6 +92,11 @@
                {
                    return WebResponseContent.Instance.Error($"未找到单信息");
                }
                var isupdate = false;
                if (recheckOrder.SignSeq == model.SignSeq)
                {
                    isupdate = true;
                }
                recheckOrder.OrderNo = model.OrderNo;
                recheckOrder.MaterielCode = model.MaterielCode;
                recheckOrder.BatchNo = model.BatchNo;
@@ -107,14 +112,15 @@
                BaseDal.UpdateData(recheckOrder);
                _outboundService.OutboundOrderService.Db.Deleteable<Dt_OutboundOrder>().Where(x => x.OrderNo == model.OrderNo).ExecuteCommand();
                _outboundService.OutboundOrderDetailService.Db.Deleteable<Dt_OutboundOrderDetail>()
                 .Where(p => SqlFunc.Subqueryable<Dt_OutboundOrder>().Where(s => s.Id == p.OrderId && s.OrderNo == model.OrderNo).Any()).ExecuteCommand();
                if (isupdate)
                {
                    _outboundService.OutboundOrderService.Db.Deleteable<Dt_OutboundOrder>().Where(x => x.OrderNo == model.OrderNo).ExecuteCommand();
                    _outboundService.OutboundOrderDetailService.Db.Deleteable<Dt_OutboundOrderDetail>()
                     .Where(p => SqlFunc.Subqueryable<Dt_OutboundOrder>().Where(s => s.Id == p.OrderId && s.OrderNo == model.OrderNo).Any()).ExecuteCommand();
                var outboundOrders = ConvertToOutboundOrders(model);
                await _outboundService.OutboundOrderService.ReceiveOutboundOrder(outboundOrders, 1);
                    var outboundOrders = ConvertToOutboundOrders(model);
                    await _outboundService.OutboundOrderService.ReceiveOutboundOrder(outboundOrders, 1);
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Core/BaseRepository/RepositoryBase.cs
@@ -869,24 +869,258 @@
             .WhereIF(whereExpression != null, whereExpression).ToListAsync();
        }
        //public bool DeleteAndMoveIntoHty(TEntity entity, OperateTypeEnum operateType)
        //{
        //    Type type = entity.GetType();
        //    Assembly assembly = type.Assembly;
        //    Type? htyType = assembly.GetType(type.FullName + "_Hty");
        //    if (htyType != null)
        //    {
        //        object? obj = Activator.CreateInstance(htyType);
        //        PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
        //        PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType));
        //        PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId));
        //        if (obj != null && keyPro != null && operateTypePro != null && sourceIdPro != null)
        //        {
        //            operateTypePro.SetValue(obj, operateType.ToString());
        //            sourceIdPro.SetValue(obj, keyPro.GetValue(entity));
        //            List<PropertyInfo> propertyInfos = htyType.GetProperties().Where(x => x.Name != operateTypePro.Name && x.Name != sourceIdPro.Name && x.Name != keyPro.Name).ToList();
        //            for (int i = 0; i < propertyInfos.Count; i++)
        //            {
        //                PropertyInfo propertyInfo = propertyInfos[i];
        //                PropertyInfo? property = type.GetProperty(propertyInfo.Name);
        //                if (property != null)
        //                {
        //                    if (propertyInfo.Name == nameof(BaseEntity.Modifier))
        //                    {
        //                        propertyInfo.SetValue(obj, App.User.UserId > 0 ? App.User.UserName : "System");
        //                    }
        //                    else if (propertyInfo.Name == nameof(BaseEntity.ModifyDate))
        //                    {
        //                        propertyInfo.SetValue(obj, DateTime.Now);
        //                    }
        //                    else
        //                    {
        //                        propertyInfo.SetValue(obj, property.GetValue(entity));
        //                    }
        //                }
        //            }
        //            if (obj != null)
        //                _db.InsertableByObject(obj).AS(type.Name + "_Hty").ExecuteCommand();
        //        }
        //    }
        //    return DeleteData(entity);
        //}
        public bool DeleteAndMoveIntoHty(TEntity entity, OperateTypeEnum operateType)
        {
            Type type = entity.GetType();
            Assembly assembly = type.Assembly;
            Type? htyType = assembly.GetType(type.FullName + "_Hty");
            if (htyType != null)
            // æ ¸å¿ƒé€»è¾‘:用事务保证原子性,异常捕获避免流程中断,日志辅助排查
            bool isSuccess = false;
            string entityTypeName = entity?.GetType().Name ?? "未知实体";
            try
            {
                // å‰ç½®æ ¡éªŒï¼šå®žä½“不能为空
                if (entity == null)
                {
                    return false;
                }
                Type entityType = entity.GetType();
                Assembly assembly = entityType.Assembly;
                string htyTypeName = $"{entityType.FullName}_Hty";
                Type? htyType = assembly.GetType(htyTypeName);
                // 1. æ£€æŸ¥åŽ†å²è¡¨ç±»åž‹æ˜¯å¦å­˜åœ¨
                if (htyType == null)
                {
                    return false;
                }
                // 2. åˆ›å»ºåŽ†å²è¡¨å®žä¾‹ï¼ˆå¤„ç†æ— å‚æž„é€ å‡½æ•°ä¸å­˜åœ¨çš„æƒ…å†µï¼‰
                object? htyObj;
                try
                {
                    htyObj = Activator.CreateInstance(htyType);
                }
                catch (Exception ex)
                {
                    // _logger.LogError(ex, "DeleteAndMoveIntoHty:创建历史表实例 {HtyTypeName} å¤±è´¥", htyTypeName);
                    return false;
                }
                if (htyObj == null)
                {
                    // _logger.LogWarning("DeleteAndMoveIntoHty:历史表实例 {HtyTypeName} åˆ›å»ºç»“果为null", htyTypeName);
                    return false;
                }
                // 3. èŽ·å–æ ¸å¿ƒå±žæ€§ï¼ˆæŒ‡å®šBindingFlags确保获取公共实例属性)
                BindingFlags propFlags = BindingFlags.Public | BindingFlags.Instance;
                PropertyInfo? keyPro = typeof(TEntity).GetKeyProperty(); // è‡ªå®šä¹‰æ–¹æ³•需确保返回非空,此处增加判空
                PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType), propFlags);
                PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId), propFlags);
                // æ ¡éªŒæ ¸å¿ƒå±žæ€§æ˜¯å¦å­˜åœ¨
                if (keyPro == null)
                {
                    //_logger.LogError("DeleteAndMoveIntoHty:实体 {EntityType} æœªæ‰¾åˆ°ä¸»é”®å±žæ€§", entityType.FullName);
                    return false;
                }
                if (operateTypePro == null)
                {
                    //_logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æœªæ‰¾åˆ°OperateType属性", htyTypeName);
                    return false;
                }
                if (sourceIdPro == null)
                {
                    // _logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æœªæ‰¾åˆ°SourceId属性", htyTypeName);
                    return false;
                }
                // 4. èµ‹å€¼æ ¸å¿ƒå±žæ€§ï¼ˆæ ¡éªŒç±»åž‹åŒ¹é…ï¼Œé¿å…SetValue抛异常)
                try
                {
                    // å¤„理OperateType类型匹配:若历史表属性是枚举类型,直接传枚举而非字符串
                    if (operateTypePro.PropertyType == typeof(OperateTypeEnum))
                    {
                        operateTypePro.SetValue(htyObj, operateType);
                    }
                    else if (operateTypePro.PropertyType == typeof(string))
                    {
                        operateTypePro.SetValue(htyObj, operateType.ToString());
                    }
                    else
                    {
                        //_logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} çš„OperateType属性类型 {PropType} ä¸åŒ¹é…ï¼ˆä»…支持枚举/字符串)", htyTypeName, operateTypePro.PropertyType.FullName);
                        return false;
                    }
                    // èµ‹å€¼SourceId(校验类型匹配)
                    object sourceIdValue = keyPro.GetValue(entity)!;
                    if (sourceIdPro.PropertyType != sourceIdValue.GetType())
                    {
                        sourceIdValue = Convert.ChangeType(sourceIdValue, sourceIdPro.PropertyType); // ç±»åž‹è½¬æ¢
                    }
                    sourceIdPro.SetValue(htyObj, sourceIdValue);
                }
                catch (Exception ex)
                {
                    // _logger.LogError(ex, "DeleteAndMoveIntoHty:历史表 {HtyTypeName} æ ¸å¿ƒå±žæ€§èµ‹å€¼å¤±è´¥", htyTypeName);
                    return false;
                }
                // 5. èµ‹å€¼å…¶ä»–属性(排除核心属性)
                List<PropertyInfo> htyProperties = htyType.GetProperties(propFlags)
                    .Where(x => x.Name != operateTypePro.Name
                             && x.Name != sourceIdPro.Name
                             && x.Name != keyPro.Name)
                    .ToList();
                foreach (PropertyInfo htyProp in htyProperties)
                {
                    PropertyInfo? entityProp = entityType.GetProperty(htyProp.Name, propFlags);
                    if (entityProp == null) continue; // å®žä½“无该属性则跳过
                    try
                    {
                        object propValue;
                        // å¤„理修改人:避免App.User空引用
                        if (htyProp.Name == nameof(BaseEntity.Modifier))
                        {
                            propValue = App.User?.UserId > 0 ? App.User?.UserName : "System";
                        }
                        // å¤„理修改时间
                        else if (htyProp.Name == nameof(BaseEntity.ModifyDate))
                        {
                            propValue = DateTime.Now;
                        }
                        // å…¶ä»–属性从原实体取值
                        else
                        {
                            propValue = entityProp.GetValue(entity) ?? DBNull.Value; // å¤„理null值
                        }
                        // ç±»åž‹è½¬æ¢åŽèµ‹å€¼ï¼ˆé¿å…ç±»åž‹ä¸åŒ¹é…ï¼‰
                        if (propValue != DBNull.Value && propValue != null)
                        {
                            propValue = Convert.ChangeType(propValue, htyProp.PropertyType);
                        }
                        htyProp.SetValue(htyObj, propValue);
                    }
                    catch (Exception ex)
                    {
                        // _logger.LogWarning(ex, "DeleteAndMoveIntoHty:历史表 {HtyTypeName} å±žæ€§ {PropName} èµ‹å€¼å¤±è´¥ï¼Œè·³è¿‡è¯¥å±žæ€§", htyTypeName, htyProp.Name);
                    }
                }
                try
                {
                    // æ‰§è¡Œæ’入历史表
                    int insertRows = _db.InsertableByObject(htyObj).AS(entityType.Name + "_Hty").ExecuteCommand();
                    if (insertRows <= 0)
                    {
                        // _logger.LogError("DeleteAndMoveIntoHty:历史表 {HtyTypeName} æ’入失败(影响行数0)", htyTypeName);
                        _db.InsertableByObject(htyObj).AS(entityType.Name + "_Hty").ExecuteCommand();
                        return false;
                    }
                    // æ’入成功后执行删除
                    bool deleteSuccess = DeleteData(entity);
                    if (!deleteSuccess)
                    {
                        //_logger.LogError("DeleteAndMoveIntoHty:实体 {EntityType} åˆ é™¤å¤±è´¥", entityType.FullName);
                        DeleteData(entity);
                        return false;
                    }
                    // æäº¤äº‹åŠ¡
                    isSuccess = true;
                    //_logger.LogInformation("DeleteAndMoveIntoHty:实体 {EntityType} å·²æˆåŠŸç§»å…¥åŽ†å²è¡¨å¹¶åˆ é™¤åŽŸæ•°æ®", entityType.FullName);
                }
                catch (Exception ex)
                {
                    // _logger.LogError(ex, "DeleteAndMoveIntoHty:事务执行失败(插入历史表/删除原数据)", entityType.FullName);
                    return false;
                }
            }
            catch (Exception ex)
            {
                //  _logger.LogError(ex, "DeleteAndMoveIntoHty:处理实体 {EntityTypeName} æ—¶å‘生未捕获异常", entityTypeName);
                return false;
            }
            return isSuccess;
        }
public bool DeleteAndMoveIntoHty(List<TEntity> entities, OperateTypeEnum operateType)
{
    Type type = typeof(TEntity);
    Assembly assembly = type.Assembly;
    Type? htyType = assembly.GetType(type.FullName + "_Hty");
    if (htyType != null)
    {
        object? obj2 = Activator.CreateInstance(htyType);
        PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
        PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType));
        PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId));
        if (obj2 != null && keyPro != null && operateTypePro != null && sourceIdPro != null)
        {
            List<PropertyInfo> propertyInfos = htyType.GetProperties().Where(x => x.Name != operateTypePro.Name && x.Name != sourceIdPro.Name && x.Name != keyPro.Name).ToList();
            List<object> list = new List<object>();
            foreach (var item in entities)
            {
                object? obj = Activator.CreateInstance(htyType);
                PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
                PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType));
                PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId));
                if (obj != null && keyPro != null && operateTypePro != null && sourceIdPro != null)
                if (obj != null)
                {
                    operateTypePro.SetValue(obj, operateType.ToString());
                    sourceIdPro.SetValue(obj, keyPro.GetValue(entity));
                    List<PropertyInfo> propertyInfos = htyType.GetProperties().Where(x => x.Name != operateTypePro.Name && x.Name != sourceIdPro.Name && x.Name != keyPro.Name).ToList();
                    sourceIdPro.SetValue(obj, keyPro.GetValue(item));
                    for (int i = 0; i < propertyInfos.Count; i++)
                    {
                        PropertyInfo propertyInfo = propertyInfos[i];
@@ -901,74 +1135,23 @@
                            else if (propertyInfo.Name == nameof(BaseEntity.ModifyDate))
                            {
                                propertyInfo.SetValue(obj, DateTime.Now);
                            }
                            }
                            else
                            {
                                propertyInfo.SetValue(obj, property.GetValue(entity));
                                propertyInfo.SetValue(obj, property.GetValue(item));
                            }
                        }
                    }
                    if (obj != null)
                        _db.InsertableByObject(obj).AS(type.Name + "_Hty").ExecuteCommand();
                    list.Add(obj);
                }
            }
            return DeleteData(entity);
            if (list.Count > 0)
                _db.InsertableByObject(list).AS(type.Name + "_Hty").ExecuteCommand();
        }
        public bool DeleteAndMoveIntoHty(List<TEntity> entities, OperateTypeEnum operateType)
        {
            Type type = typeof(TEntity);
            Assembly assembly = type.Assembly;
            Type? htyType = assembly.GetType(type.FullName + "_Hty");
            if (htyType != null)
            {
                object? obj2 = Activator.CreateInstance(htyType);
                PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
                PropertyInfo? operateTypePro = htyType.GetProperty(nameof(IBaseHistoryEntity.OperateType));
                PropertyInfo? sourceIdPro = htyType.GetProperty(nameof(IBaseHistoryEntity.SourceId));
                if (obj2 != null && keyPro != null && operateTypePro != null && sourceIdPro != null)
                {
                    List<PropertyInfo> propertyInfos = htyType.GetProperties().Where(x => x.Name != operateTypePro.Name && x.Name != sourceIdPro.Name && x.Name != keyPro.Name).ToList();
                    List<object> list = new List<object>();
                    foreach (var item in entities)
                    {
                        object? obj = Activator.CreateInstance(htyType);
                        if (obj != null)
                        {
                            operateTypePro.SetValue(obj, operateType.ToString());
                            sourceIdPro.SetValue(obj, keyPro.GetValue(item));
                            for (int i = 0; i < propertyInfos.Count; i++)
                            {
                                PropertyInfo propertyInfo = propertyInfos[i];
                                PropertyInfo? property = type.GetProperty(propertyInfo.Name);
                                if (property != null)
                                {
                                    if (propertyInfo.Name == nameof(BaseEntity.Modifier))
                                    {
                                        propertyInfo.SetValue(obj, App.User.UserId > 0 ? App.User.UserName : "System");
                                    }
                                    else if (propertyInfo.Name == nameof(BaseEntity.ModifyDate))
                                    {
                                        propertyInfo.SetValue(obj, DateTime.Now);
                                    }
                                    else
                                    {
                                        propertyInfo.SetValue(obj, property.GetValue(item));
                                    }
                                }
                            }
                            list.Add(obj);
                        }
                    }
                    if (list.Count > 0)
                        _db.InsertableByObject(list).AS(type.Name + "_Hty").ExecuteCommand();
                }
            }
            return DeleteData(entities);
        }
    }
    return DeleteData(entities);
}
        //List<TResult> QueryMuch<T, T2, T3, TResult>(
        //    Expression<Func<T, T2, T3, object[]>> joinExpression,
        //    Expression<Func<T, T2, T3, TResult>> selectExpression,
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -40,16 +40,16 @@
        Task<WebResponseContent> RequestInboundTask(string palletCode, string stationCode);
        Task<WebResponseContent> PalletOutboundTask(string endStation, string palletCode = "");
        Task<WebResponseContent> PalletOutboundTask(int num, int locationType);
        Task<WebResponseContent> TaskCompleted(string taskNum);
        Task<WebResponseContent> GenerateOutboundTasksAsync(int[] keys, string outStation);
        Task<WebResponseContent> GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews);
        Task<WebResponseContent> GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews,string station=null);
        Task<WebResponseContent> GenerateOutboundBatchTasksAsync(int orderDetailId, decimal batchQuantity, string outStation);
        Task<WebResponseContent> GenerateAllocatOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews);
        Task<WebResponseContent> GenerateAllocatOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews, string station);
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs
@@ -147,5 +147,7 @@
        [SqlSugar.SugarColumn(IsIgnore = true)]
        public decimal RemainQuantity => AssignQuantity - PickedQty;
        public int ReturnToMESStatus { get; set; }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_PickingRecord.cs
@@ -91,6 +91,8 @@
        ///</summary>
        [SugarColumn(ColumnName = "barcodemoveQty", ColumnDescription = "数量")]
        public decimal BarcodeMoveQty { get; set; }
        public int ReturnToMESStatus { get; set; }
    }
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs
@@ -558,8 +558,7 @@
        }
        public (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>)
       AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews)
        public (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>)AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews)
        {
            // éªŒè¯ç”¨æˆ·é€‰æ‹©
            (bool, string) checkResult = CheckSelectStockDeital(outboundOrderDetail, stockSelectViews);
@@ -575,12 +574,9 @@
            decimal totalAssignedFromUserSelection = 0;
            // æŒ‰å…ˆè¿›å…ˆå‡ºæŽ’序用户选择的库存
            var userSelectedStocks = _stockService.StockInfoService.GetStockInfosByPalletCodes(
                stockSelectViews.Select(x => x.PalletCode).ToList());
            var userSelectedStocks = _stockService.StockInfoService.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList());
            var sortedUserSelectedStocks = userSelectedStocks
                .OrderBy(x => x.CreateDate)
                .ToList();
            var sortedUserSelectedStocks = userSelectedStocks.OrderBy(x => x.CreateDate).ToList();
            // åˆ†é…ç”¨æˆ·é€‰æ‹©çš„库存
            foreach (var stock in sortedUserSelectedStocks)
@@ -596,9 +592,7 @@
                    outboundOrderDetail.BatchNo, outboundOrderDetail.SupplyCode);
                // ç¡®å®šåˆ†é…æ•°é‡ï¼šå–用户选择数量、可用数量和剩余需求的最小值
                var assignQuantity = Math.Min(
                    Math.Min(userSelection.UseableQuantity, availableQuantity),
                    remainingNeedQuantity);
                var assignQuantity = Math.Min(Math.Min(userSelection.UseableQuantity, availableQuantity),remainingNeedQuantity);
                if (assignQuantity <= 0) continue;
@@ -623,42 +617,57 @@
            }
            // å¦‚果用户选择的库存不够,自动分配剩余部分
            decimal autoAssignedQuantity = 0;
            if (remainingNeedQuantity > 0)
            {
                List<Dt_StockInfo> autoStocks = _stockService.StockInfoService.GetUseableStocks(
                    outboundOrderDetail.MaterielCode, outboundOrderDetail.BatchNo, "");
                //// å¯é€‰ï¼šè¿™é‡Œå¯ä»¥æ ¹æ®ä¸šåŠ¡éœ€æ±‚å†³å®šæ˜¯å¦å…è®¸è‡ªåŠ¨åˆ†é…
                //// å¦‚果要求严格按用户选择出库,可以抛出异常
                //// throw new Exception($"用户选择的库存数量不足,还需{remainingNeedQuantity},请重新选择");
                // æŽ’除用户已选择的托盘
                autoStocks = autoStocks
                    .Where(x => !stockSelectViews.Select(v => v.PalletCode).Contains(x.PalletCode))
                    .ToList();
                //// å¦‚果需要自动分配,记录日志
                //_logger.LogInformation($"用户选择的库存数量不足,还需{remainingNeedQuantity},系统将自动分配");
                var (autoAssignStocks, stockAllocations) = _stockService.StockInfoService.GetOutboundStocks(
                    autoStocks, outboundOrderDetail.MaterielCode, remainingNeedQuantity, out decimal residueQuantity);
                //List<Dt_StockInfo> autoStocks = _stockService.StockInfoService.GetUseableStocks(
                //    outboundOrderDetail.MaterielCode,
                //    outboundOrderDetail.BatchNo,
                //    "");
                // æ£€æŸ¥è‡ªåŠ¨åˆ†é…ç»“æžœ
                autoAssignedQuantity = remainingNeedQuantity - residueQuantity;
                if (autoAssignedQuantity <= 0 && remainingNeedQuantity > 0)
                {
                    // éƒ¨åˆ†åˆ†é…æ˜¯å¯ä»¥æŽ¥å—的,记录警告但不报错
                    _logger.LogWarning($"自动分配失败,剩余需求{remainingNeedQuantity}无法满足");
                }
                else if (autoAssignedQuantity > 0)
                {
                    outStocks.AddRange(autoAssignStocks);
                //// æŽ’除用户已选择且已分配的托盘
                //var assignedPalletCodes = outStocks.Select(x => x.PalletCode).ToList();
                //autoStocks = autoStocks
                //    .Where(x => !assignedPalletCodes.Contains(x.PalletCode))
                //    .ToList();
                    // ä¸ºè‡ªåŠ¨åˆ†é…çš„åº“å­˜åˆ›å»ºé”å®šè®°å½•
                    var autoLockInfos = CreateLockInfosForAutoAssign(outboundOrder, outboundOrderDetail, autoAssignStocks, stockAllocations);
                    outStockLockInfos.AddRange(autoLockInfos);
                }
                //var (autoAssignStocks, stockAllocations) = _stockService.StockInfoService.GetOutboundStocks(
                //    autoStocks,
                //    outboundOrderDetail.MaterielCode,
                //    remainingNeedQuantity,
                //    out decimal residueQuantity);
                //if (autoAssignStocks != null && autoAssignStocks.Any())
                //{
                //    outStocks.AddRange(autoAssignStocks);
                //    // ä¸ºè‡ªåŠ¨åˆ†é…çš„åº“å­˜åˆ›å»ºé”å®šè®°å½•
                //    var autoLockInfos = CreateLockInfosForAutoAssign(outboundOrder, outboundOrderDetail, autoAssignStocks, stockAllocations);
                //    outStockLockInfos.AddRange(autoLockInfos);
                //    // æ›´æ–°å·²åˆ†é…æ•°é‡
                //    decimal autoAssignedQuantity = remainingNeedQuantity - residueQuantity;
                //    totalAssignedFromUserSelection += autoAssignedQuantity;
                //    remainingNeedQuantity = residueQuantity; // æ›´æ–°å‰©ä½™éœ€æ±‚
                //}
                //else if (remainingNeedQuantity > 0)
                //{
                //    _logger.LogWarning($"自动分配失败,剩余需求{remainingNeedQuantity}无法满足");
                //}
            }
            // æ›´æ–°é”å®šæ•°é‡
            outboundOrderDetail.LockQuantity += totalAssignedFromUserSelection + autoAssignedQuantity;
            outboundOrderDetail.LockQuantity += totalAssignedFromUserSelection + totalAssignedFromUserSelection;
            // æ›´æ–°çŠ¶æ€
            UpdateOrderDetailStatus(outboundOrderDetail, remainingNeedQuantity - autoAssignedQuantity);
            UpdateOrderDetailStatus(outboundOrderDetail, remainingNeedQuantity);
            List<Dt_LocationInfo> locationInfos = _locationInfoService.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList());
@@ -682,17 +691,21 @@
            decimal remainingAssign = assignQuantity;
            // æŒ‰å…ˆè¿›å…ˆå‡ºåˆ†é…åº“存明细
            var sorteds = stock.Details
            var query = stock.Details.AsQueryable()
                .Where(d => d.MaterielCode == detail.MaterielCode &&
                           (d.StockQuantity - d.OutboundQuantity) > 0);
               // .OrderBy(d => d.CreateDate);             
            if (!string.IsNullOrEmpty(detail.BatchNo))
            {
                sorteds= stock.Details.Where(x => x.BatchNo == detail.BatchNo);
                query = query.Where(x => x.BatchNo == detail.BatchNo);
            }
            var sortedDetails= sorteds.ToList().OrderBy(d => d.CreateDate);
            // å¦‚果出库单有供应商要求,按供应商过滤
            if (!string.IsNullOrEmpty(detail.SupplyCode))
            {
                query = query.Where(d => d.SupplyCode == detail.SupplyCode);
            }
            var sortedDetails= query.ToList().OrderBy(d => d.CreateDate);
            foreach (var stockDetail in sortedDetails)
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs
@@ -477,10 +477,21 @@
                    var completedLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                        .Where(it => it.CurrentBarcode == barcode &&
                                   (it.Status == (int)OutLockStockStatusEnum.拣选完成 ||
                                    it.Status == (int)OutLockStockStatusEnum.已释放 ||
                                    it.Status == (int)OutLockStockStatusEnum.已取走 ||
                                    it.PickedQty >= it.AssignQuantity)).FirstAsync();
                    if (completedLockInfo != null)
                        throw new Exception($"条码{barcode}已经完成分拣,不能重复分拣");
                    {
                        string statusMsg = completedLockInfo.Status switch
                        {
                            (int)OutLockStockStatusEnum.拣选完成 => "已经完成分拣",
                            (int)OutLockStockStatusEnum.已释放 => "已经释放",
                            (int)OutLockStockStatusEnum.已取走 => "已经取走",
                            _ => "已经完成分拣"
                        };
                        throw new Exception($"条码{barcode}{statusMsg},不能重复分拣");
                    }
                    else
                        return null;
                }
@@ -816,13 +827,13 @@
        private async Task<bool> CanCancelPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail)
        {
            if (lockInfo.Status == (int)OutLockStockStatusEnum.已释放 || lockInfo.Status == (int)OutLockStockStatusEnum.已取走)
                return false;
            // é”å®šä¿¡æ¯çŠ¶æ€æ£€æŸ¥
            if (lockInfo.Status != (int)OutLockStockStatusEnum.拣选完成)
                return false;
            ////// åº“存状态检查
            ////if (stockDetail.Status == StockStatusEmun.出库完成.ObjToInt())
            ////    return false;
            // å¦‚果是拆包记录,还需要检查父锁定信息状态
            if (lockInfo.IsSplitted == 1 && lockInfo.ParentLockId.HasValue)
@@ -830,7 +841,9 @@
                var parentLock = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                    .FirstAsync(x => x.Id == lockInfo.ParentLockId.Value);
                if (parentLock == null || parentLock.Status == (int)OutLockStockStatusEnum.回库中)
                if (parentLock == null || parentLock.Status == (int)OutLockStockStatusEnum.回库中 ||
                        parentLock.Status == (int)OutLockStockStatusEnum.已释放 ||
                        parentLock.Status == (int)OutLockStockStatusEnum.已取走)
                    return false;
            }
@@ -1388,8 +1401,8 @@
            await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
                .SetColumns(it => new Dt_OutStockLockInfo
                {
                    Status = (int)OutLockStockStatusEnum.已释放, // éœ€è¦æ–°å¢žè¿™ä¸ªçŠ¶æ€
                                                              // ReleaseTime = DateTime.Now,
                    Status = (int)OutLockStockStatusEnum.已释放,
                    Operator = App.User.UserName
                })
                .Where(it => lockIds.Contains(it.Id))
@@ -1805,7 +1818,7 @@
                    _logger.LogInformation($"订单状态更新 - OrderNo: {orderNo}, æ—§çŠ¶æ€: {outboundOrder.OrderStatus}, æ–°çŠ¶æ€: {newStatus}");
                }
            }
            catch (Exception ex)
@@ -1953,7 +1966,7 @@
                    .Where(x => x.OrderNo == orderNo && x.Status == (int)OutLockStockStatusEnum.拣选完成)
                    .ToListAsync();
                var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode })
                var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
                   .Select(group => new AllocateDtoDetail
                   {
                       MaterialCode = group.Key.MaterielCode,
@@ -1961,13 +1974,13 @@
                       WarehouseCode = group.Key.WarehouseCode,
                       Qty = group.Sum(x => x.PickedQty),
                       Unit = group.Key.Unit,
                       Unit = group.Key.BarcodeUnit,
                       Barcodes = group.Select(row => new BarcodeInfo
                       {
                           Barcode = row.CurrentBarcode,
                           SupplyCode = row.SupplyCode,
                           BatchNo = row.BatchNo,
                           Unit = row.Unit,
                           Unit = row.BarcodeUnit,
                           Qty = row.PickedQty
                       }).ToList()
@@ -2023,8 +2036,8 @@
                           materialCode = group.Key.MaterielCode,
                           lineNo = group.Key.lineNo,
                           warehouseCode = group.Key.WarehouseCode,
                           qty = group.Sum(x => x.BarcodeQty),
                           currentDeliveryQty = group.Sum(x => x.BarcodeQty),
                           qty = group.Sum(x => x.PickedQty),
                           currentDeliveryQty = group.Sum(x => x.PickedQty),
                           unit = group.Key.BarcodeUnit,
                           barcodes = group.Select(row => new WIDESEA_DTO.Outbound.BarcodesModel
                           {
@@ -2032,7 +2045,7 @@
                               supplyCode = row.SupplyCode,
                               batchNo = row.BatchNo,
                               unit = row.BarcodeUnit,
                               qty = row.BarcodeQty
                               qty = row.PickedQty
                           }).ToList()
                       }).ToList();
@@ -2079,8 +2092,7 @@
            {
                // 1. åˆ é™¤åº“存数量为0的明细记录
                var deleteDetailCount = await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
                    .Where(x => x.StockId == stockId && x.StockQuantity == 0 && (x.Status == StockStatusEmun.出库完成.ObjToInt() || x.Status ==
                                          StockStatusEmun.入库完成.ObjToInt()))
                    .Where(x => x.StockId == stockId && x.StockQuantity == 0)
                    .ExecuteCommandAsync();
                await _stockInfoService.Db.Deleteable<Dt_StockInfo>()
@@ -2723,6 +2735,34 @@
                    }
                    outboundOrderDetails.Add(outboundOrderDetail);
                    var newLockInfo = new Dt_OutStockLockInfo
                    {
                        OrderNo = outboundOrder.UpperOrderNo,
                        OrderDetailId = outboundOrderDetail.Id,
                        OutboundBatchNo = outboundOrderDetail.BatchNo,
                        MaterielCode = outboundOrderDetail.MaterielCode,
                        MaterielName = outboundOrderDetail.MaterielName,
                        StockId = 0,
                        OrderQuantity = outboundOrderDetail.OrderQuantity,
                        AssignQuantity = outboundOrderDetail.OverOutQuantity,
                        PickedQty = outboundOrderDetail.NoStockOutQty,
                        LocationCode = "空",
                        PalletCode = "空",
                        TaskNum = 0,
                        Status = (int)OutLockStockStatusEnum.拣选完成,
                        Unit = outboundOrderDetail.Unit,
                        SupplyCode = outboundOrderDetail.SupplyCode?? "无",
                        OrderType = outboundOrder.OrderType,
                        CurrentBarcode = inboundOrderDetail.Barcode,
                        IsSplitted = 1,
                        Operator = App.User.UserName,
                        lineNo= outboundOrderDetail.lineNo,
                        WarehouseCode = outboundOrderDetail.WarehouseCode ?? "无",
                        BarcodeQty=outboundOrderDetail.NoStockOutQty,
                        BarcodeUnit =outboundOrderDetail.BarcodeUnit,
                        BatchNo = outboundOrderDetail.BatchNo
                    };
                    _outStockLockInfoService.AddData(newLockInfo);
                }
                //判断入库单据明细是否全部是完成状态
                int e = inboundOrder.Details.Count();
@@ -2754,53 +2794,50 @@
                _outboundOrderService.UpdateData(outboundOrder);
                _unitOfWorkManage.CommitTran();
                if (inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
                //入库回传MES
                var infeedmodel = new FeedbackInboundRequestModel
                {
                    var feedmodel = new FeedbackInboundRequestModel
                    reqCode = Guid.NewGuid().ToString(),
                    reqTime = DateTime.Now.ToString(),
                    business_type = inboundOrder.BusinessType,
                    factoryArea = inboundOrder.FactoryArea,
                    operationType = 1,
                    Operator = App.User.UserName,
                    orderNo = inboundOrder.UpperOrderNo,
                    status = inboundOrder.OrderStatus,
                    details = new List<FeedbackInboundDetailsModel>()
                };
                var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
                    .Select(group => new FeedbackInboundDetailsModel
                    {
                        reqCode = Guid.NewGuid().ToString(),
                        reqTime = DateTime.Now.ToString(),
                        business_type = inboundOrder.BusinessType,
                        factoryArea = inboundOrder.FactoryArea,
                        operationType = 1,
                        Operator = inboundOrder.Operator,
                        orderNo = inboundOrder.UpperOrderNo,
                        status = inboundOrder.OrderStatus,
                        details = new List<FeedbackInboundDetailsModel>()
                        materialCode = group.Key.MaterielCode,
                        supplyCode = group.Key.SupplyCode,
                        batchNo = group.Key.BatchNo,
                        lineNo = group.Key.lineNo,
                        warehouseCode = group.Key.WarehouseCode,
                        qty = group.Sum(x => x.BarcodeQty),
                        // warehouseCode= "1072",
                        unit = group.Key.BarcodeUnit,
                        barcodes = group.Select(row => new FeedbackBarcodesModel
                        {
                            barcode = row.Barcode,
                            qty = row.BarcodeQty
                        }).ToList()
                    }).ToList();
                infeedmodel.details = groupedData;
                    };
                    var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
                       .Select(group => new FeedbackInboundDetailsModel
                       {
                           materialCode = group.Key.MaterielCode,
                           supplyCode = group.Key.SupplyCode,
                           batchNo = group.Key.BatchNo,
                           lineNo = group.Key.lineNo,
                           warehouseCode = group.Key.WarehouseCode,
                           qty = group.Sum(x => x.BarcodeQty),
                           // warehouseCode= "1072",
                           unit = group.Key.BarcodeUnit,
                           barcodes = group.Select(row => new FeedbackBarcodesModel
                           {
                               barcode = row.Barcode,
                               qty = row.BarcodeQty
                           }).ToList()
                       }).ToList();
                    feedmodel.details = groupedData;
                    var result = await _invokeMESService.FeedbackInbound(feedmodel);
                    if (result != null && result.code == 200)
                    {
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
                        .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
                        .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
                    }
                var result1 = await _invokeMESService.FeedbackInbound(infeedmodel);
                if (result1 != null && result1.code == 200)
                {
                    _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
                    .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                    _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
                    .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
                }
                if (outboundOrder.OrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                {
                    var feedmodel = new FeedbackOutboundRequestModel
                //出库回传MES
                var outfeedmodel = new FeedbackOutboundRequestModel
                    {
                        reqCode = Guid.NewGuid().ToString(),
                        reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
@@ -2813,26 +2850,24 @@
                        status = outboundOrder.OrderStatus,
                        details = new List<FeedbackOutboundDetailsModel>()
                    };
                    foreach (var detail in outboundOrder.Details)
                    {
                        // èŽ·å–è¯¥æ˜Žç»†å¯¹åº”çš„æ¡ç ä¿¡æ¯ï¼ˆä»Žé”å®šè®°å½•ï¼‰
                        var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                            .Where(x => x.OrderNo == outboundOrder.OrderNo &&
                                       x.OrderDetailId == detail.Id &&
                                         (x.Status == (int)OutLockStockStatusEnum.拣选完成 || x.Status == (int)OutLockStockStatusEnum.已回库))
                            .ToListAsync();
                foreach (var detail in outboundOrder.Details)
                {
                    // èŽ·å–è¯¥æ˜Žç»†å¯¹åº”çš„æ¡ç ä¿¡æ¯ï¼ˆä»Žé”å®šè®°å½•ï¼‰
                    var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                        .Where(x => x.OrderNo == outboundOrder.UpperOrderNo &&
                                    x.OrderDetailId == detail.Id &&
                                        (x.Status == (int)OutLockStockStatusEnum.拣选完成 || x.Status == (int)OutLockStockStatusEnum.已回库))
                        .ToListAsync();
                        var groupdata = detailLocks.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
                              .Select(group => new FeedbackOutboundDetailsModel
                              {
                                  materialCode = group.Key.MaterielCode,
                                  lineNo = group.Key.lineNo,
                                  lineNo = group.Key.lineNo,
                                  warehouseCode = group.Key.WarehouseCode,
                                  qty = group.Sum(x => x.BarcodeQty),
                                  currentDeliveryQty = group.Sum(x => x.BarcodeQty),
                                  qty = group.Sum(x => x.PickedQty),
                                  currentDeliveryQty = group.Sum(x => x.PickedQty),
                                  unit = group.Key.BarcodeUnit,
                                  barcodes = group.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
                                  {
@@ -2840,12 +2875,12 @@
                                      supplyCode = lockInfo.SupplyCode,
                                      batchNo = lockInfo.BatchNo,
                                      unit = lockInfo.BarcodeUnit,
                                      qty = lockInfo.BarcodeQty
                                      qty = lockInfo.PickedQty
                                  }).ToList()
                              }).ToList();
                        feedmodel.details.AddRange(groupdata);
                        outfeedmodel.details.AddRange(groupdata);
                    }
                    var result = await _invokeMESService.FeedbackOutbound(feedmodel);
                    var result = await _invokeMESService.FeedbackOutbound(outfeedmodel);
                    if (result != null && result.code == 200)
                    {
                        await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
@@ -2853,14 +2888,11 @@
                            .Where(x => x.OrderId == outboundOrder.Id)
                            .ExecuteCommandAsync();
                        await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
                            .SetColumns(x => x.ReturnToMESStatus == 1)
                            .Where(x => x.Id == outboundOrder.Id)
                            .ExecuteCommandAsync();
                    }
                    await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
                        .SetColumns(x => x.ReturnToMESStatus == 1)
                        .Where(x => x.Id == outboundOrder.Id)
                        .ExecuteCommandAsync();
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -2945,6 +2977,8 @@
                    {
                        return content.Error("没有找到重检单据数据。");
                    }
                }
                //  Dt_InboundOrder inboundOrder = GetInboundOrder(materielGroupDTO.OrderNo);
@@ -3013,7 +3047,7 @@
                        FactoryArea = item.FactoryArea,
                        Status = 0,
                        OrderNo = item.OrderNo,
                        BusinessType = InOrderTypeEnum.InternalAllocat.ObjToInt().ToString()
                        BusinessType = materielGroupDTO.orderTypes.ToString()
                    });
                    item.WarehouseCode = item.WarehouseCode;
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -18,6 +18,7 @@
using AutoMapper;
using Dm.filter;
using MailKit.Search;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Org.BouncyCastle.Asn1.Ocsp;
@@ -67,10 +68,10 @@
        private readonly IRepository<Dt_StockInfo> _stockRepository;
        private readonly ILocationInfoService _locationInfoService;
        private readonly IInboundOrderService _inboundOrderService;
        private readonly IInboundOrderDetailService _inboundOrderDetailService;
        private readonly IInboundOrderDetailService _inboundOrderDetailService;
        private readonly IRepository<Dt_AllocateOrderDetail> _allocateOrderDetailRepository;
        private readonly IRepository<Dt_AllocateOrder> _allocateOrderRepository;
        private readonly IRepository<Dt_AllocateOrder> _allocateOrderRepository;
        private readonly IRepository<Dt_ReCheckOrder> _reCheckOrderRepository;
        private readonly IRepository<Dt_OutboundBatch> _OutboundBatchRepository;
        private readonly IOutboundOrderService _outboundOrderService;
@@ -340,7 +341,7 @@
                    }
                    else if (inboundOrder.OrderType == InOrderTypeEnum.InternalAllocat.ObjToInt()) //智仓调智仓
                    {
                        _logger.LogInformation($"InboundTaskCompleted å›žå†™MES  : {inboundOrder.InboundOrderNo }  ,ordertype: {InOrderTypeEnum.InternalAllocat.ObjToInt()} "  );
                        _logger.LogInformation($"InboundTaskCompleted å›žå†™MES  : {inboundOrder.InboundOrderNo}  ,ordertype: {InOrderTypeEnum.InternalAllocat.ObjToInt()} ");
                        // BusinessTypeEnum.智仓调智仓
                        if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
                        {
@@ -454,7 +455,7 @@
        {
            _logger.LogInformation($"TaskService  OutAllocateTaskCompleted: {task.TaskNum}");
           return  await OutboundTaskCompleted(task);
            return await OutboundTaskCompleted(task);
        }
        public async Task<WebResponseContent> OutboundTaskCompleted(Dt_Task task)
        {
@@ -557,7 +558,7 @@
            }
        }
        public async Task<WebResponseContent> InPickTaskCompleted(Dt_Task task)
        {
            _logger.LogInformation($"TaskService InPickTaskCompleted: {task.TaskNum}");
@@ -616,32 +617,24 @@
                // æ›´æ–°åº“存信息
                stockInfo.LocationCode = task.TargetAddress;
                stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                // æ›´æ–°åº“存明细状态
                if (stockInfo.Details != null && stockInfo.Details.Any())
                {
                    foreach (var detail in stockInfo.Details)
                    {
                        detail.Status = StockStatusEmun.入库完成.ObjToInt();
                        // ç¡®ä¿åº“存数量与出库数量一致
                        if (detail.Status == StockStatusEmun.入库完成.ObjToInt())
                        {
                            detail.OutboundQuantity = 0; // å…¥åº“完成时出库数量清零
                        }
                        detail.Status = StockStatusEmun.入库完成.ObjToInt();
                        detail.OutboundQuantity = 0; // å…¥åº“完成时出库数量清零
                    }
                      _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
                    _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
                }
                  _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                // å¤„理回库相关的库存明细
                await ProcessStockDetailsForReturn(task, stockInfo.Id);
                _stockService.StockInfoService.Repository.UpdateData(stockInfo);
                // åˆ é™¤é›¶åº“存数据
                await DeleteZeroQuantityStockDetails(stockInfo.Id);
                await UpdateAffectedOrderDetails(task.OrderNo, returnLocks);
                // æ›´æ–°è´§ä½çŠ¶æ€
                if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt())
                {
@@ -651,17 +644,10 @@
                {
                    locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                }
                 _locationInfoService.Repository.UpdateData(locationInfo);
                // æ›´æ–°è®¢å•相关数据
                await UpdateOrderDataAfterReturn(task.OrderNo, returnLocks);
                _locationInfoService.Repository.UpdateData(locationInfo);
                // èŽ·å–å¹¶æ›´æ–°å‡ºåº“è®¢å•
                var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
                    .FirstAsync(x => x.OrderNo == task.OrderNo);
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                // åˆ é™¤ä»»åŠ¡è®°å½•
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
@@ -675,23 +661,35 @@
                    "",
                    task.TaskNum
                );
                if (outboundOrder != null)
                {
                    // æ£€æŸ¥è®¢å•状态是否需要更新
                    await CheckAndUpdateOrderStatusAfterReturn(task.OrderNo);
                    // å¤„理MES反馈
                    await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo);
                }
                else
                {
                    _logger.LogInformation($"TaskService InPickTaskCompleted: {task.TaskNum} ,未找到出库单。");
                }
                await RecalculateOrderStatus(task.OrderNo);
                _unitOfWorkManage.CommitTran(); // æäº¤äº‹åŠ¡
                _logger.LogInformation($"托盘回库完成处理成功 - ä»»åŠ¡å·: {task.TaskNum}, æ‰˜ç›˜: {task.PalletCode}, è®¢å•: {task.OrderNo}");
                _ = Task.Run(async () =>
                {
                    try
                    {
                        var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
                            .FirstAsync(x => x.OrderNo == task.OrderNo);
                _logger.LogInformation($"回库任务完成处理成功 - ä»»åŠ¡å·: {task.TaskNum}, æ‰˜ç›˜: {task.PalletCode}");
                        if (outboundOrder != null)
                        {
                            // æ£€æŸ¥è®¢å•是否已完成,只有完成时才向MES反馈
                            if (outboundOrder.OrderStatus == (int)OutOrderStatusEnum.出库完成)
                            {
                                await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo);
                            }
                            else
                            {
                                _logger.LogInformation($"订单{task.OrderNo}状态为{outboundOrder.OrderStatus},暂不向MES反馈");
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError($"异步MES反馈处理失败 - OrderNo: {task.OrderNo}, Error: {ex.Message}");
                    }
                });
            }
            catch (Exception ex)
            {
@@ -702,107 +700,151 @@
            return WebResponseContent.Instance.OK();
        }
        /// <summary>
        /// å›žåº“后更新订单数据
        // <summary>
        /// æ›´æ–°å—影响的订单明细锁定数量
        /// </summary>
        private async Task UpdateOrderDataAfterReturn(string orderNo, List<Dt_OutStockLockInfo> returnLocks)
        private async Task UpdateAffectedOrderDetails(string orderNo, List<Dt_OutStockLockInfo> returnLocks)
        {
            try
            {
                // èŽ·å–æ‰€æœ‰å—å½±å“çš„è®¢å•æ˜Žç»†ID
                // èŽ·å–å—å½±å“çš„è®¢å•æ˜Žç»†ID(去重)
                var affectedDetailIds = returnLocks
                    .Select(x => x.OrderDetailId)
                    .Distinct()
                    .ToList();
                if (!affectedDetailIds.Any())
                {
                    _logger.LogInformation($"没有受影响的订单明细 - OrderNo: {orderNo}");
                    return;
                }
                _logger.LogInformation($"更新{affectedDetailIds.Count}个受影响的订单明细 - OrderNo: {orderNo}");
                foreach (var detailId in affectedDetailIds)
                {
                    // è®¡ç®—该订单明细的回库总数量
                    var detailReturnLocks = returnLocks
                        .Where(x => x.OrderDetailId == detailId)
                        .ToList();
                    // é‡æ–°è®¡ç®—该订单明细的锁定数量
                    decimal currentLockQty = await CalculateOrderDetailLockQuantity(detailId);
                    decimal totalReturnQty = detailReturnLocks.Sum(x => x.AssignQuantity - x.PickedQty);
                    if (totalReturnQty > 0)
                    // æ£€æŸ¥æ•°æ®ä¸€è‡´æ€§
                    if (currentLockQty < 0)
                    {
                        // èŽ·å–è®¢å•æ˜Žç»†
                        var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
                            .FirstAsync(x => x.Id == detailId);
                        if (orderDetail != null)
                        {
                            // æ›´æ–°é”å®šæ•°é‡ï¼ˆå›žåº“后锁定数量应减少)
                            var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                                .Where(x => x.OrderDetailId == detailId &&
                                           x.Status == (int)OutLockStockStatusEnum.出库中)
                                .ToListAsync();
                            decimal remainingLockQty = remainingLocks.Sum(x => x.AssignQuantity - x.PickedQty);
                            // æ›´æ–°è®¢å•明细
                            await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                                .SetColumns(it => new Dt_OutboundOrderDetail
                                {
                                    LockQuantity = remainingLockQty,
                                })
                                .Where(it => it.Id == detailId)
                                .ExecuteCommandAsync();
                            // æ›´æ–°è®¢å•明细状态
                            await UpdateOrderDetailStatus(detailId);
                            _logger.LogInformation($"回库更新订单明细 - OrderDetailId: {detailId}, " +
                                                  $"扣减锁定数量: {totalReturnQty}, æ–°é”å®šæ•°é‡: {remainingLockQty}");
                        }
                        _logger.LogWarning($"锁定数量计算为负值 - OrderDetailId: {detailId}, å½“前值: {currentLockQty},重置为0");
                        currentLockQty = 0;
                    }
                    // èŽ·å–è®¢å•æ˜Žç»†
                    var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
                        .FirstAsync(x => x.Id == detailId);
                    if (orderDetail == null)
                    {
                        _logger.LogWarning($"未找到订单明细 - OrderDetailId: {detailId}");
                        continue;
                    }
                    // æ›´æ–°é”å®šæ•°é‡
                    if (orderDetail.LockQuantity != currentLockQty)
                    {
                        await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                            .SetColumns(it => new Dt_OutboundOrderDetail
                            {
                                LockQuantity = currentLockQty,
                            })
                            .Where(it => it.Id == detailId)
                            .ExecuteCommandAsync();
                        _logger.LogInformation($"更新订单明细锁定数量 - OrderDetailId: {detailId}, " +
                                              $"旧值: {orderDetail.LockQuantity}, æ–°å€¼: {currentLockQty}");
                    }
                    // æ›´æ–°è®¢å•明细状态
                    await UpdateOrderDetailStatus(orderDetail);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"UpdateOrderDataAfterReturn失败 - OrderNo: {orderNo}, Error: {ex.Message}");
                _logger.LogError($"UpdateAffectedOrderDetails失败 - OrderNo: {orderNo}, Error: {ex.Message}");
                throw;
            }
        }
        /// <summary>
        /// æ›´æ–°è®¢å•明细状态
        /// é‡æ–°è®¡ç®—订单明细锁定数量
        /// </summary>
        private async Task UpdateOrderDetailStatus(int orderDetailId)
        private async Task<decimal> CalculateOrderDetailLockQuantity(int orderDetailId)
        {
            try
            {
                var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
                    .FirstAsync(x => x.Id == orderDetailId);
                // æŸ¥æ‰¾è¯¥è®¢å•明细下所有状态为"出库中"的锁定记录
                var activeLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                    .Where(x => x.OrderDetailId == orderDetailId &&
                               x.Status == (int)OutLockStockStatusEnum.出库中)
                    .ToListAsync();
                if (orderDetail == null)
                // è¿‡æ»¤æ‹†åŒ…记录
                var filteredLocks = new List<Dt_OutStockLockInfo>();
                foreach (var lockInfo in activeLocks)
                {
                    _logger.LogWarning($"UpdateOrderDetailStatus失败:未找到订单明细,ID: {orderDetailId}");
                    return;
                    // å¦‚果是拆包记录,需要特殊处理
                    if (lockInfo.IsSplitted == 1 && lockInfo.ParentLockId.HasValue)
                    {
                        // æŸ¥æ‰¾çˆ¶é”å®šè®°å½•
                        var parentLock = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                            .Where(x => x.Id == lockInfo.ParentLockId.Value)
                            .FirstAsync();
                        // å¦‚果父记录存在且状态也是出库中,则只计算父记录
                        if (parentLock != null && parentLock.Status == (int)OutLockStockStatusEnum.出库中)
                        {
                            // çˆ¶è®°å½•已经在列表中,跳过当前拆包记录
                            continue;
                        }
                    }
                    filteredLocks.Add(lockInfo);
                }
                decimal totalLockQty = filteredLocks.Sum(x => x.AssignQuantity - x.PickedQty);
                _logger.LogDebug($"计算锁定数量 - OrderDetailId: {orderDetailId}, " +
                               $"找到{filteredLocks.Count}个有效锁定记录, " +
                               $"总锁定数量: {totalLockQty}");
                return totalLockQty;
            }
            catch (Exception ex)
            {
                _logger.LogError($"CalculateOrderDetailLockQuantity失败 - OrderDetailId: {orderDetailId}, Error: {ex.Message}");
                return 0;
            }
        }
        /// <summary>
        /// æ›´æ–°è®¢å•明细状态
        /// </summary>
        private async Task UpdateOrderDetailStatus(Dt_OutboundOrderDetail orderDetail)
        {
            try
            {
                int newStatus = orderDetail.OrderDetailStatus;
                // 1. æ£€æŸ¥æ˜¯å¦å·²å®Œæˆ
                // æ ¹æ®å®žé™…枚举值调整
                //  æ£€æŸ¥æ˜¯å¦å·²å®Œæˆï¼ˆå·²å‡ºåº“数量 >= éœ€æ±‚数量)
                if (orderDetail.OverOutQuantity >= orderDetail.NeedOutQuantity)
                {
                    newStatus = (int)OrderDetailStatusEnum.Over;
                    newStatus = (int)OrderDetailStatusEnum.Over; // å·²å®Œæˆ
                }
                // 2. æ£€æŸ¥æ˜¯å¦æ­£åœ¨è¿›è¡Œä¸­ï¼ˆæœ‰é”å®šæ•°é‡æˆ–部分拣选)
                else if (orderDetail.LockQuantity > 0 ||
                         (orderDetail.OverOutQuantity > 0 && orderDetail.OverOutQuantity < orderDetail.NeedOutQuantity))
                //  æ£€æŸ¥æ˜¯å¦æœ‰éƒ¨åˆ†å‡ºåº“或有锁定数量
                else if (orderDetail.OverOutQuantity > 0 || orderDetail.LockQuantity > 0)
                {
                    newStatus = (int)OrderDetailStatusEnum.Outbound;
                    newStatus = (int)OrderDetailStatusEnum.Outbound; // éƒ¨åˆ†å®Œæˆ/进行中
                }
                // 3. æ£€æŸ¥æ˜¯å¦æœ‰é”å®šä½†æœªæ‹£é€‰
                else if (orderDetail.LockQuantity > 0 && orderDetail.OverOutQuantity == 0)
                {
                    newStatus = (int)OrderDetailStatusEnum.AssignOverPartial;
                }
                // 4. å¦åˆ™ä¸ºæ–°è®¢å•
                // å¦åˆ™ä¸ºæ–°è®¢å•
                else
                {
                    newStatus = (int)OrderDetailStatusEnum.New;
                    newStatus = (int)OrderDetailStatusEnum.New; // æ–°å»º
                }
                // åªæœ‰çŠ¶æ€å˜åŒ–æ—¶æ‰æ›´æ–°
@@ -811,12 +853,12 @@
                    await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                        .SetColumns(it => new Dt_OutboundOrderDetail
                        {
                            OrderDetailStatus = newStatus,
                            OrderDetailStatus = newStatus,
                        })
                        .Where(it => it.Id == orderDetailId)
                        .Where(it => it.Id == orderDetail.Id)
                        .ExecuteCommandAsync();
                    _logger.LogInformation($"更新订单明细状态 - OrderDetailId: {orderDetailId}, " +
                    _logger.LogInformation($"更新订单明细状态 - OrderDetailId: {orderDetail.Id}, " +
                                          $"旧状态: {orderDetail.OrderDetailStatus}, æ–°çŠ¶æ€: {newStatus}, " +
                                          $"已出库: {orderDetail.OverOutQuantity}/{orderDetail.NeedOutQuantity}, " +
                                          $"锁定数量: {orderDetail.LockQuantity}");
@@ -824,23 +866,32 @@
            }
            catch (Exception ex)
            {
                _logger.LogError($"UpdateOrderDetailStatus失败 - OrderDetailId: {orderDetailId}, Error: {ex.Message}");
                _logger.LogError($"UpdateOrderDetailStatus失败 - OrderDetailId: {orderDetail.Id}, Error: {ex.Message}");
                throw;
            }
        }
        /// <summary>
        /// å›žåº“后检查并更新订单状态
        /// é‡æ–°è®¡ç®—并更新订单状态
        /// </summary>
        private async Task CheckAndUpdateOrderStatusAfterReturn(string orderNo)
        private async Task RecalculateOrderStatus(string orderNo)
        {
            try
            {
                // èŽ·å–è®¢å•çš„æ‰€æœ‰æ˜Žç»†
                var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
                    .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
                    .Where((o, item) => item.OrderNo == orderNo)
                    .Select((o, item) => o)
                    .ToListAsync();
                if (!orderDetails.Any())
                {
                    _logger.LogWarning($"未找到订单明细 - OrderNo: {orderNo}");
                    return;
                }
                // æ£€æŸ¥çŠ¶æ€
                bool allCompleted = true;
                bool hasInProgress = false;
@@ -854,7 +905,7 @@
                    // æ£€æŸ¥æ˜¯å¦æœ‰è¿›è¡Œä¸­çš„任务(锁定或部分拣选)
                    if (detail.LockQuantity > 0 ||
                        detail.OrderDetailStatus == OrderDetailStatusEnum.Outbound.ObjToInt())
                        detail.OrderDetailStatus == (int)OrderDetailStatusEnum.Outbound)
                    {
                        hasInProgress = true;
                    }
@@ -863,7 +914,11 @@
                var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
                    .FirstAsync(x => x.OrderNo == orderNo);
                if (outboundOrder == null) return;
                if (outboundOrder == null)
                {
                    _logger.LogWarning($"未找到出库订单 - OrderNo: {orderNo}");
                    return;
                }
                int newStatus;
                if (allCompleted)
@@ -890,57 +945,16 @@
                        .Where(x => x.OrderNo == orderNo)
                        .ExecuteCommandAsync();
                    _logger.LogInformation($"回库后更新订单状态 - OrderNo: {orderNo}, æ–°çŠ¶æ€: {newStatus}");
                    _logger.LogInformation($"更新订单状态 - OrderNo: {orderNo}, æ—§çŠ¶æ€: {outboundOrder.OrderStatus}, æ–°çŠ¶æ€: {newStatus}");
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"CheckAndUpdateOrderStatusAfterReturn失败 - OrderNo: {orderNo}, Error: {ex.Message}");
                _logger.LogError($"RecalculateOrderStatus失败 - OrderNo: {orderNo}, Error: {ex.Message}");
                throw;
            }
        }
        /// <summary>
        /// å¤„理回库的库存明细(增强版)
        /// </summary>
        private async Task ProcessStockDetailsForReturn(Dt_Task task, int stockId)
        {
            try
            {
                // èŽ·å–æ‰€æœ‰éœ€è¦å¤„ç†çš„åº“å­˜æ˜Žç»†
                var stockDetails = await _stockService.StockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
                    .Where(x => x.StockId == stockId)
                    .ToListAsync();
                foreach (var detail in stockDetails)
                {
                    // ç¡®ä¿åº“存状态正确
                    if (detail.Status == StockStatusEmun.入库确认.ObjToInt())
                    {
                        // å¦‚果已经是入库确认状态,更新为入库完成
                        detail.Status = StockStatusEmun.入库完成.ObjToInt();
                        detail.OutboundQuantity = 0;
                        await _stockService.StockInfoDetailService.Db.Updateable(detail).ExecuteCommandAsync();
                        _logger.LogInformation($"更新库存明细状态 - æ¡ç : {detail.Barcode}, " +
                                              $"新状态: {detail.Status}, å‡ºåº“数量: {detail.OutboundQuantity}");
                    }
                    else if (detail.Status == StockStatusEmun.出库锁定.ObjToInt() ||
                             detail.Status == StockStatusEmun.出库完成.ObjToInt())
                    {
                        // è¿™äº›çŠ¶æ€ä¸åº”è¯¥å­˜åœ¨ï¼Œè®°å½•è­¦å‘Š
                        _logger.LogWarning($"异常库存状态 - æ¡ç : {detail.Barcode}, çŠ¶æ€: {detail.Status}, " +
                                         $"任务号: {task.TaskNum}");
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"ProcessStockDetailsForReturn失败 - StockId: {stockId}, Error: {ex.Message}");
                throw;
            }
        }
        /// <summary>
        /// åˆ é™¤é›¶åº“存数据(增强版)
@@ -1033,51 +1047,57 @@
                            var detailModel = new AllocateDtoDetail
                            {
                                MaterialCode = detail.MaterielCode,
                                LineNo = detail.lineNo,
                                LineNo = detail.lineNo,
                                WarehouseCode = detail.WarehouseCode,
                                Qty = detailLocks.Sum(x=>x.PickedQty),
                                Qty = 0,
                                Unit = detail.BarcodeUnit,
                                Barcodes = new List<BarcodeInfo> ()
                                Barcodes = new List<BarcodeInfo>()
                            };
                            foreach (var item in detailLocks)
                            {
                                var barModel = new  BarcodeInfo
                                if (item.PickedQty > 0)
                                {
                                    Barcode = item.CurrentBarcode,
                                    SupplyCode = item.SupplyCode,
                                    BatchNo = item.BatchNo,
                                    Unit = item.BarcodeUnit,
                                    Qty = item.PickedQty
                                };
                                // å•位不一致时转换
                                if (item.BarcodeUnit != item.Unit)
                                {
                                    var convertResult = await _materialUnitService.ConvertAsync(item.MaterielCode, item.PickedQty, item.Unit, item.BarcodeUnit);
                                    barModel.Unit = convertResult.Unit;
                                    barModel.Qty = convertResult.Quantity;
                                    var barModel = new BarcodeInfo
                                    {
                                        Barcode = item.CurrentBarcode,
                                        SupplyCode = item.SupplyCode,
                                        BatchNo = item.BatchNo,
                                        Unit = detail.BarcodeUnit,
                                        Qty = 0
                                    };
                                    // å•位不一致时转换
                                    if (detail.BarcodeUnit != detail.Unit)
                                    {
                                        var convertResult = await _materialUnitService.ConvertAsync(item.MaterielCode, item.PickedQty, detail.Unit, detail.BarcodeUnit);
                                        barModel.Unit = convertResult.Unit;
                                        barModel.Qty = convertResult.Quantity;
                                    }
                                    else
                                    {
                                        barModel.Qty = item.PickedQty;
                                    }
                                    detailModel.Qty += barModel.Qty;
                                    detailModel.Barcodes.Add(barModel);
                                }
                                detailModel.Qty += barModel.Qty;
                                detailModel.Barcodes.Add(barModel);
                                allocatefeedmodel.Details.Add(detailModel);
                            }
                            var result = await _invokeMESService.FeedbackAllocate(allocatefeedmodel);
                            if (result != null && result.code == 200)
                            {
                                await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                                       .SetColumns(x => x.ReturnToMESStatus == 1)
                                       .Where(x => x.OrderId == outboundOrder.Id).ExecuteCommandAsync();
                            allocatefeedmodel.Details.Add(detailModel);
                        }
                        var result = await _invokeMESService.FeedbackAllocate(allocatefeedmodel);
                        if (result != null && result.code == 200)
                        {
                            await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                                   .SetColumns(x => x.ReturnToMESStatus == 1)
                                   .Where(x => x.OrderId == outboundOrder.Id).ExecuteCommandAsync();
                            await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
                                  .SetColumns(x => new Dt_OutboundOrder
                                  {
                                      ReturnToMESStatus = 1,
                                      Operator = App.User.UserName,
                                  }).Where(x => x.OrderNo == orderNo).ExecuteCommandAsync();
                                await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
                                      .SetColumns(x => new Dt_OutboundOrder
                                      {
                                          ReturnToMESStatus = 1,
                                          Operator = App.User.UserName,
                                      }).Where(x => x.OrderNo == orderNo).ExecuteCommandAsync();
                            }
                        }
                    }
                    else if (outboundOrder.OrderType == OutOrderTypeEnum.ReCheck.ObjToInt())
@@ -1085,78 +1105,91 @@
                        //不用回传
                    }
                    else
                    {
                        var feedmodel = new FeedbackOutboundRequestModel
                    {
                        if (outboundOrder != null && outboundOrder.IsBatch == 0)
                        {
                            reqCode = Guid.NewGuid().ToString(),
                            reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                            business_type = outboundOrder.BusinessType,
                            factoryArea = outboundOrder.FactoryArea,
                            operationType = 1,
                            Operator = outboundOrder.Operator,
                            orderNo = outboundOrder.UpperOrderNo,
                            documentsNO = outboundOrder.OrderNo,
                            status = outboundOrder.OrderStatus,
                            details = new List<FeedbackOutboundDetailsModel>()
                        };
                        foreach (var detail in orderDetails)
                        {
                            // èŽ·å–è¯¥æ˜Žç»†å¯¹åº”çš„æ¡ç ä¿¡æ¯ï¼ˆä»Žé”å®šè®°å½•ï¼‰
                            var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                                .Where(x => x.OrderNo == orderNo &&
                                           x.OrderDetailId == detail.Id &&
                                           (x.Status == (int)OutLockStockStatusEnum.拣选完成 || x.Status == (int)OutLockStockStatusEnum.已回库))
                                .ToListAsync();
                            var detailModel = new FeedbackOutboundDetailsModel
                            var feedmodel = new FeedbackOutboundRequestModel
                            {
                                materialCode = detail.MaterielCode,
                                lineNo = detail.lineNo, // æ³¨æ„ï¼šè¿™é‡Œå¯èƒ½éœ€è¦è°ƒæ•´å­—段名
                                warehouseCode = detail.WarehouseCode,
                                qty = detail.PickedQty,
                                currentDeliveryQty = detail.PickedQty,
                                unit = detail.Unit,
                                barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel>()
                                reqCode = Guid.NewGuid().ToString(),
                                reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                business_type = outboundOrder.BusinessType,
                                factoryArea = outboundOrder.FactoryArea,
                                operationType = 1,
                                Operator = outboundOrder.Operator,
                                orderNo = outboundOrder.UpperOrderNo,
                                documentsNO = outboundOrder.OrderNo,
                                status = outboundOrder.OrderStatus,
                                details = new List<FeedbackOutboundDetailsModel>()
                            };
                            foreach (var item in detailLocks)
                            foreach (var detail in orderDetails)
                            {
                                var barModel = new WIDESEA_DTO.Outbound.BarcodesModel
                                // èŽ·å–è¯¥æ˜Žç»†å¯¹åº”çš„æ¡ç ä¿¡æ¯ï¼ˆä»Žé”å®šè®°å½•ï¼‰
                                var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                                    .Where(x => x.OrderNo == orderNo &&
                                               x.OrderDetailId == detail.Id &&
                                               (x.Status == (int)OutLockStockStatusEnum.拣选完成 || x.Status == (int)OutLockStockStatusEnum.已回库))
                                    .ToListAsync();
                                var detailModel = new FeedbackOutboundDetailsModel
                                {
                                    barcode = item.CurrentBarcode,
                                    supplyCode = item.SupplyCode,
                                    batchNo = item.BatchNo,
                                    unit = item.BarcodeUnit,
                                    qty = item.PickedQty
                                    materialCode = detail.MaterielCode,
                                    lineNo = detail.lineNo, // æ³¨æ„ï¼šè¿™é‡Œå¯èƒ½éœ€è¦è°ƒæ•´å­—段名
                                    warehouseCode = detail.WarehouseCode,
                                    qty = 0,
                                    currentDeliveryQty = 0,
                                    unit = detail.Unit,
                                    barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel>()
                                };
                                // å•位不一致时转换
                                if (item.BarcodeUnit != item.Unit)
                                foreach (var item in detailLocks)
                                {
                                    var convertResult = await _materialUnitService.ConvertAsync(item.MaterielCode, item.PickedQty, item.Unit, item.BarcodeUnit);
                                    barModel.unit = convertResult.Unit;
                                    barModel.qty = convertResult.Quantity;
                                    if (item.PickedQty > 0)
                                    {
                                        var barModel = new WIDESEA_DTO.Outbound.BarcodesModel
                                        {
                                            barcode = item.CurrentBarcode,
                                            supplyCode = item.SupplyCode,
                                            batchNo = item.BatchNo,
                                            unit = item.BarcodeUnit,
                                            qty = item.PickedQty
                                        };
                                        // å•位不一致时转换
                                        if (detail.BarcodeUnit != detail.Unit)
                                        {
                                            var convertResult = await _materialUnitService.ConvertAsync(item.MaterielCode, item.PickedQty, detail.Unit, detail.BarcodeUnit);
                                            barModel.unit = convertResult.Unit;
                                            barModel.qty = convertResult.Quantity;
                                        }
                                        else
                                        {
                                            barModel.qty = item.PickedQty;
                                        }
                                        detailModel.qty += barModel.qty;
                                        detailModel.currentDeliveryQty += barModel.qty;
                                        detailModel.barcodes.Add(barModel);
                                    }
                                }
                                detailModel.qty += barModel.qty;
                                detailModel.currentDeliveryQty += barModel.qty;
                                detailModel.barcodes.Add(barModel);
                                feedmodel.details.Add(detailModel);
                            }
                            feedmodel.details.Add(detailModel);
                        }
                        var result = await _invokeMESService.FeedbackOutbound(feedmodel);
                        if (result != null && result.code == 200)
                        {
                            await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                                .SetColumns(x => x.ReturnToMESStatus == 1)
                                .Where(x => x.OrderId == outboundOrder.Id)
                                .ExecuteCommandAsync();
                            await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
                                .SetColumns(x => x.ReturnToMESStatus == 1)
                                .Where(x => x.OrderNo == orderNo)
                                .ExecuteCommandAsync();
                            var result = await _invokeMESService.FeedbackOutbound(feedmodel);
                            if (result != null && result.code == 200)
                            {
                                await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
                                    .SetColumns(x => x.ReturnToMESStatus == 1)
                                    .Where(x => x.OrderId == outboundOrder.Id)
                                    .ExecuteCommandAsync();
                                await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
                                    .SetColumns(x => x.ReturnToMESStatus == 1)
                                    .Where(x => x.OrderNo == orderNo)
                                    .ExecuteCommandAsync();
                            }
                        }
                        else if (outboundOrder != null && outboundOrder.IsBatch == 1)
                        {
                           await  _invokeMESService.BatchOrderFeedbackToMes(new List<string>(){outboundOrder.OrderNo },2);
                        }
                    }
                }
            }
@@ -1167,7 +1200,7 @@
        }
        public async Task<WebResponseContent> OutEmptyTaskCompleted(Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -31,95 +31,83 @@
        /// </summary>
        /// <param name="inTask"></param>
        /// <returns></returns>
        public async Task<WebResponseContent> PalletOutboundTask(string endStation, string palletCode = "")
        public async Task<WebResponseContent> PalletOutboundTask(int num, int locationType)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StockInfo stockInfo;
                if (string.IsNullOrEmpty(palletCode))
                {
                    stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletType == PalletTypeEnum.Empty.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && !string.IsNullOrWhiteSpace(x.LocationCode)).First();
                }
                else
                {
                    stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletType == PalletTypeEnum.Empty.ObjToInt() && x.PalletCode == palletCode && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).First();
                }
                var stockInfos = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletType == PalletTypeEnum.Empty.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).WhereIF(locationType != 0, x => x.LocationType == locationType).Take(num).ToList();
                if (stockInfo == null)
                if (stockInfos.Count() == 0)
                {
                    return WebResponseContent.Instance.Error("未找到空托盘库存");
                }
                Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
                if (locationInfo == null)
                foreach (var stockInfo in stockInfos)
                {
                    return WebResponseContent.Instance.Error("未找到空托盘库存对应的货位信息");
                }
                Dt_Task task = new Dt_Task()
                {
                    CurrentAddress = stockInfo.LocationCode,
                    Grade = 0,
                    NextAddress = endStation,
                    PalletCode = stockInfo.PalletCode,
                    Roadway = locationInfo.RoadwayNo,
                    SourceAddress = stockInfo.LocationCode,
                    TargetAddress = endStation,
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    TaskType = TaskTypeEnum.OutEmpty.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType
                };
                int beforeStatus = locationInfo.LocationStatus;
                _unitOfWorkManage.BeginTran();
                stockInfo.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
                int taskId = BaseDal.AddData(task);
                task.TaskId = taskId;
                _stockService.StockInfoService.UpdateData(stockInfo);
                _locationInfoService.UpdateData(locationInfo);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), "", task.TaskNum);
                _unitOfWorkManage.CommitTran();
                TaskModel esstask = new TaskModel()
                {
                    taskType = "carry",
                    taskGroupCode = "",
                    groupPriority = 0,
                    tasks = new List<TasksType>
                    Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
                    if (locationInfo == null)
                    {
                            new()
                            {
                                taskCode=task.TaskNum.ToString(),
                                taskPriority=0,
                                taskDescribe=new TaskDescribeType{
                                containerCode=stockInfo.PalletCode,
                                containerType= "CT_KUBOT_STANDARD",
                                fromLocationCode=stockInfo.LocationCode??"",
                                toStationCode="",
                                toLocationCode=endStation,
                                deadline=0,storageTag=""
                                }
                            }
                        return WebResponseContent.Instance.Error("未找到空托盘库存对应的货位信息");
                    }
                };
                var result = await _eSSApiService.CreateTaskAsync(esstask);
                _logger.LogInformation("创建任务PalletOutboundTask è¿”回:  " + result);
                if (result)
                {
                    return WebResponseContent.Instance.OK(200);
                }
                else
                {
                    return WebResponseContent.Instance.Error("下发机器人任务失败!");
                }
                    Dt_Task task = new Dt_Task()
                    {
                        CurrentAddress = stockInfo.LocationCode,
                        Grade = 0,
                        NextAddress = "1-2",
                        PalletCode = stockInfo.PalletCode,
                        Roadway = locationInfo.RoadwayNo,
                        SourceAddress = stockInfo.LocationCode,
                        TargetAddress = "1-2",
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        TaskType = TaskTypeEnum.OutEmpty.ObjToInt(),
                        WarehouseId = stockInfo.WarehouseId,
                        PalletType = stockInfo.PalletType
                    };
                    int beforeStatus = locationInfo.LocationStatus;
                    _unitOfWorkManage.BeginTran();
                    stockInfo.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                    locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
                    int taskId = BaseDal.AddData(task);
                    task.TaskId = taskId;
                    _stockService.StockInfoService.UpdateData(stockInfo);
                    _locationInfoService.UpdateData(locationInfo);
                    _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), "", task.TaskNum);
                    _unitOfWorkManage.CommitTran();
                    TaskModel esstask = new TaskModel()
                    {
                        taskType = "carry",
                        taskGroupCode = "",
                        groupPriority = 0,
                        tasks = new List<TasksType>
                        {
                                new()
                                {
                                    taskCode=task.TaskNum.ToString(),
                                    taskPriority=0,
                                    taskDescribe=new TaskDescribeType{
                                    containerCode=stockInfo.PalletCode,
                                    containerType= "CT_KUBOT_STANDARD",
                                    fromLocationCode=stockInfo.LocationCode??"",
                                    toStationCode="",
                                    toLocationCode="1-2",
                                    deadline=0,storageTag=""
                                    }
                                }
                        }
                    };
                    var result = await _eSSApiService.CreateTaskAsync(esstask);
                    _logger.LogInformation("创建任务PalletOutboundTask è¿”回:  " + result);
                }
                return content.OK("空托出库成功!");
            }
            catch (Exception ex)
            {
@@ -477,7 +465,14 @@
            }
        }
        public async Task<WebResponseContent> GenerateAllocatOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
        /// <summary>
        /// æ™ºä»“调智仓
        /// </summary>
        /// <param name="orderDetailId"></param>
        /// <param name="stockSelectViews"></param>
        /// <param name="station"></param>
        /// <returns></returns>
        public async Task<WebResponseContent> GenerateAllocatOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews, string station = null)
        {
            try
            {
@@ -504,7 +499,7 @@
                    return WebResponseContent.Instance.Error("找不到出库明细单据");
                }
                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(outboundOrder.Details.First().Id, stockSelectViews);
                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(outboundOrder.Details.First().Id, stockSelectViews,station);
                WebResponseContent content =await GenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5);
@@ -521,7 +516,7 @@
        /// <param name="orderDetailId"></param>
        /// <param name="stockSelectViews"></param>
        /// <returns></returns>
        public async Task<WebResponseContent> GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
        public async Task<WebResponseContent> GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews,string station=null)
        {
            try
            {
@@ -531,7 +526,7 @@
                {
                    return WebResponseContent.Instance.Error("找不到单据");
                }
                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(outboundOrder.Details.First().Id, stockSelectViews);
                (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(outboundOrder.Details.First().Id, stockSelectViews,station);
                WebResponseContent content =await GenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5);
@@ -550,7 +545,7 @@
        /// <param name="stockSelectViews"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) OutboundTaskDataHandle(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
        public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) OutboundTaskDataHandle(int orderDetailId, List<StockSelectViewDTO> stockSelectViews,string station=null)
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            Dt_OutboundOrderDetail outboundOrderDetail = _outboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId);
@@ -573,15 +568,15 @@
                (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews);
                if (result.Item1 != null && result.Item1.Count > 0)
                {
                    Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId);
                    Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId);
                    TaskTypeEnum typeEnum = outboundOrder.OrderType switch
                    {
                        (int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound,
                        (int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate,
                        (int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality,
                        _ => new TaskTypeEnum()
                        _ => TaskTypeEnum.Outbound
                    };
                    tasks = GetTasks(result.Item1, typeEnum);
                    tasks = GetTasks(result.Item1, typeEnum,station);
                    result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
                    result.Item3.ForEach(x =>
                    {
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs
@@ -1,4 +1,5 @@
using Autofac.Core;
using MailKit.Search;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@@ -8,15 +9,21 @@
using System.Threading.Tasks;
using WIDESEA_BasicService;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.BaseController;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.Enums;
using WIDESEA_DTO.Allocate;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Mes;
using WIDESEA_IBasicService;
using WIDESEA_IInboundService;
using WIDESEA_InboundService;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
using WIDESEA_OutboundService;
namespace WIDESEA_WMSServer.Controllers.Inbound
{
@@ -35,8 +42,11 @@
        private readonly ILocationInfoService _locationInfoService;
        private readonly IDailySequenceService _dailySequenceService;
        private readonly IMaterialUnitService _materialUnitService;
        private readonly IOutStockLockInfoService _outStockLockInfoService;
        private readonly IOutboundOrderDetailService _outboundOrderDetailService;
        private readonly IRepository<Dt_Task> _taskRepository;
        private readonly ILogger<InboundOrderController> _logger;
        public InboundOrderController(IInboundOrderService service, WIDESEA_IBasicService.IErpApiService erpApiService, WIDESEA_IBasicService.IInvokeMESService invokeMESService, IESSApiService eSSApiService, IDailySequenceService dailySequenceService, ILocationInfoService locationInfoService, ILogger<InboundOrderController> logger, IMaterialUnitService materialUnitService, IInboundService inboundService) : base(service)
        public InboundOrderController(IInboundOrderService service, WIDESEA_IBasicService.IErpApiService erpApiService, WIDESEA_IBasicService.IInvokeMESService invokeMESService, IESSApiService eSSApiService, IDailySequenceService dailySequenceService, ILocationInfoService locationInfoService, ILogger<InboundOrderController> logger, IMaterialUnitService materialUnitService, IInboundService inboundService, IOutStockLockInfoService outStockLockInfoService, IOutboundOrderDetailService outboundOrderDetailService, IRepository<Dt_Task> taskRepository) : base(service)
        {
            this.erpApiService = erpApiService;
            _invokeMESService = invokeMESService;
@@ -46,19 +56,23 @@
            _logger = logger;
            _materialUnitService = materialUnitService;
            _inboundService = inboundService;
            _outStockLockInfoService = outStockLockInfoService;
            _outboundOrderDetailService = outboundOrderDetailService;
            _taskRepository = taskRepository;
        }
        [HttpPost, Route("Test"), AllowAnonymous, MethodParamsValidate]
        public async Task<WebResponseContent> Test()
        {
            var originalTask = _taskRepository.Db.Queryable<Dt_Task>().First();
            _taskRepository.DeleteAndMoveIntoHty(originalTask, OperateTypeEnum.自动完成);
            // Service.Db.Deleteable<Dt_InboundOrder>().Where(x=>x.UpperOrderNo== "12020251100040").ExecuteCommand();
            //_inboundService.InboundOrderDetailService.Db.Deleteable<Dt_InboundOrderDetail>()
            // .Where(p => SqlFunc.Subqueryable<Dt_InboundOrder>().Where(s => s.Id == p.OrderId && s.UpperOrderNo == "12020251100040").Any()).ExecuteCommand();
            var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync("100513-00303", 1);
            //var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync("100513-00303", 1);
            var pdddurchaseToStockResult = await _materialUnitService.ConvertFromToStockAsync("100513-00303", "W013", 1);
            //var pdddurchaseToStockResult = await _materialUnitService.ConvertFromToStockAsync("100513-00303", "W013", 1);
            //var sddd = _locationInfoService.AssignLocation();
            //var code = sddd.LocationCode;
@@ -105,12 +119,12 @@
        [HttpPost, Route("ReceiveInboundOrder"), AllowAnonymous, MethodParamsValidate]
        public async Task<WebResponseContent> ReceiveInboundOrder([FromBody] InboundRequestModel model)
        {
            if(model.inBounds == null || !model.inBounds.Any())
            if (model.inBounds == null || !model.inBounds.Any())
            {
                return WebResponseContent.Instance.Error("入库单不能为空");
            }
            _logger.LogInformation("InboundOrderController ReceiveInboundOrder:  " +  JsonConvert.SerializeObject(model));
            _logger.LogInformation("InboundOrderController ReceiveInboundOrder:  " + JsonConvert.SerializeObject(model));
            List<Dt_InboundOrder> inboundOrders = new List<Dt_InboundOrder>();
            foreach (var item in model.inBounds)
@@ -168,7 +182,7 @@
                inboundOrders.Add(dt_InboundOrder);
            }
            var content =await Service.ReceiveInboundOrder(inboundOrders, model.operationType);
            var content = await Service.ReceiveInboundOrder(inboundOrders, model.operationType);
            if (content.Status) return WebResponseContent.Instance.OK(200);
            else return WebResponseContent.Instance.Error(content.Message);
@@ -214,9 +228,9 @@
        }
        [HttpPost, Route("BatchOrderFeedbackToMes"), AllowAnonymous]
        public async Task<WebResponseContent> BatchOrderFeedbackToMes([FromBody]  BatchOrderFeedbackToMesDto request)
        public async Task<WebResponseContent> BatchOrderFeedbackToMes([FromBody] BatchOrderFeedbackToMesDto request)
        {
           return await _invokeMESService.BatchOrderFeedbackToMes(request.orderNos, request.inout);
            return await _invokeMESService.BatchOrderFeedbackToMes(request.orderNos, request.inout);
        }
    }
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/PickingReturnController.cs
@@ -26,7 +26,7 @@
        }
        /// <summary>
        ///
        /// é‡æ£€  æ™ºä»“调智仓   ç»„盘入库
        /// </summary>
        /// <param name="materielGroupDTO"></param>
        /// <returns></returns>
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs
@@ -56,12 +56,9 @@
        }
        [HttpPost, Route("PalletOutboundTask"), AllowAnonymous, MethodParamsValidate]
        public async Task<WebResponseContent> PalletOutboundTask(string endStation, string palletCode = "")
        public async Task<WebResponseContent> PalletOutboundTask(int num, int locationType)
        {
            var result = await Service.PalletOutboundTask(endStation, palletCode);
            return result;
            return  await Service.PalletOutboundTask(num, locationType);
        }
@@ -83,9 +80,9 @@
        /// <param name="stockSelectViews"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("GenerateOutboundTask"), AllowAnonymous]
        public async Task<WebResponseContent> GenerateOutboundTask(int orderDetailId, [FromBody] List<StockSelectViewDTO> stockSelectViews)
        public async Task<WebResponseContent> GenerateOutboundTask(int orderDetailId, string station, [FromBody] List<StockSelectViewDTO> stockSelectViews)
        {
            return await Service.GenerateOutboundTask(orderDetailId, stockSelectViews);
            return await Service.GenerateOutboundTask(orderDetailId, stockSelectViews, station);
        }
        /// <summary>
@@ -95,9 +92,9 @@
        /// <param name="stockSelectViews"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("GenerateAllocatOutboundTask"), AllowAnonymous]
        public async Task<WebResponseContent> GenerateAllocatOutboundTask(int orderDetailId, [FromBody] List<StockSelectViewDTO> stockSelectViews)
        public async Task<WebResponseContent> GenerateAllocatOutboundTask(int orderDetailId, string station, [FromBody] List<StockSelectViewDTO> stockSelectViews)
        {
            return await Service.GenerateAllocatOutboundTask(orderDetailId, stockSelectViews);
            return await Service.GenerateAllocatOutboundTask(orderDetailId, stockSelectViews,station);
        }
        /// <summary>