wangxinhui
6 天以前 a9bba690fdead98f549d000ec29aa0cd6887cd22
Merge branch 'master' of http://115.159.85.185:8098/r/KuKa/BeiJingBeiQiAGV
已添加27个文件
已修改18个文件
14275 ■■■■■ 文件已修改
项目代码/PDA/.vscode/launch.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/PDA/common/http.interceptor.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/PDA/pages.json 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/PDA/pages/Inbound/Inbound.vue 130 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/PDA/pages/login/login.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSClient/package-lock.json 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSClient/src/api/http.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSClient/src/extension/basicinfo/extend/materialInfos.vue 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSClient/src/extension/basicinfo/materialInfo.js 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSClient/src/router/viewGird.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSClient/src/views/basicinfo/materialInfo.vue 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSClient/vite.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/.vs/WIDESEAWCS_Server/v18/DocumentLayout.backup.json 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_BasicInfoRepository/Dt_ContainerInfoRepository.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_BasicInfoRepository/Dt_MaterialInfoRepository.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_BasicInfoService/Dt_MaterialInfoService.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvStatusUpdateDTO.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvTaskSendDTO.cs 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_DTO/PDA/ContainerbindingDTO.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoRepository/IDt_ContainerInfoRepository.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoRepository/IDt_MaterialInfoRepository.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoService/IDt_MaterialInfoService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_ContainerInfo.cs 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_Inventory.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_MaterialInfo.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_MaterialInfo_Hty.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/TaskInfo/Dt_TaskExecuteDetail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/BasicInfo/Dt_MaterialInfoController.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/PDA/PDAController.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Log/AGV任务下发/2026-04-20/任务下发接口260420.txt 725 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Log/AGV任务下发/2026-04-22/任务下发接口260422.txt 11660 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Log/AGV任务下发/2026-04-28/任务下发接口260428.txt 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/Program.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Server/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Tasks/AGV/CommonAGVJob.cs 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/Baseconversion.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/TaskAcquisition_Back1_Job.cs 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/TaskAcquisition_Back2_Job.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/TaskAcquisition_Front_Job.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/AGV协议/对接文档 (AGV&WMS) _20260423.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/项目方案/零件号及对应工位.pptx 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/PDA/.vscode/launch.json
@@ -8,7 +8,7 @@
            "type": "chrome",
            "request": "launch",
            "name": "针对 localhost å¯åЍ Chrome",
            "url": "http://localhost:8080",
            "url": "http://localhost:8081",
            "webRoot": "${workspaceFolder}"
        }
    ]
ÏîÄ¿´úÂë/PDA/common/http.interceptor.js
@@ -1,5 +1,5 @@
let baseUrl = 'http://127.0.0.1:5000'
//let baseUrl = 'http://127.0.0.1:5000'
let baseUrl = 'http://127.0.0.1:9291'
const install = (Vue, vm) => {
    // æ­¤ä¸ºè‡ªå®šä¹‰é…ç½®å‚数,具体参数见上方说明
    Vue.prototype.$u.http.setConfig({
ÏîÄ¿´úÂë/PDA/pages.json
@@ -4,6 +4,12 @@
    },
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/login/login",
            "style": {
                "navigationBarTitleText": "登录"
            }
        },
        {
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "首页"
@@ -13,12 +19,6 @@
            "path": "pages/home/home",
            "style": {
                "navigationBarTitleText": "我的"
            }
        },
        {
            "path": "pages/login/login",
            "style": {
                "navigationBarTitleText": "登录"
            }
        },
        {
ÏîÄ¿´úÂë/PDA/pages/Inbound/Inbound.vue
@@ -2,7 +2,7 @@
    <view>
        <uni-segmented-control :current="current" :values="items" @clickItem="onClickItem">
        </uni-segmented-control>
        <view v-show="current === 0">
        <!-- <view v-show="current === 0">
            <view style="padding: 5%;">
                <uni-forms label-width="120">
                    <uni-forms-item label="托盘编码">
@@ -20,9 +20,9 @@
                </uni-forms>
                <button @click="InboundTask" type="primary" size="default" style="margin-top: 2%;">搬运</button>
            </view>
        </view>
        <view v-show="current === 1">
            <view style="padding: 5%;">
        </view> -->
        <view v-show="current === 0">
            <!-- <view style="padding: 5%;">
                <uni-forms label-width="120">
                    <uni-forms-item label="托盘编码">
                        <uni-easyinput type="text" :focus="barcodefocus" @input="inputChangebarcode"
@@ -57,9 +57,28 @@
                    </view>
                </uni-forms>
                <button @click="GroupPlate" type="primary" size="default" style="margin-top: 2%;">组盘</button>
            </view> -->
            <view style="padding: 5%;">
                <uni-forms label-width="120">
                    <uni-forms-item label="零件编号:">
                        <uni-easyinput type="text" placeholder="请扫描零件号" ref='midInput' :focus="focus" v-model="materSn" @blur="inputChangebarcode" />
                    </uni-forms-item>
                    <uni-forms-item label="载具编号">
                        <uni-easyinput type="text" :focus="barcodefocus1"
                            v-model="VehicleNumber" placeholder="请输入载具编号" ref='midInput' />
                    </uni-forms-item>
                    <uni-forms-item label="车型信息">
                        <uni-easyinput type="text"
                            v-model="Carmodel" placeholder="自动获取车型(除开手动输入零件号)" ref='midInput' />
                    </uni-forms-item>
                    <uni-forms-item label="当前位置:">
                        <uni-easyinput type="text" placeholder="请输入备料点位" ref='midInput' :focus="focus2" v-model="Position"/>
                    </uni-forms-item>
                </uni-forms>
                <button @click="GroupPlate" type="primary" size="default" style="margin-top: 2%;">组盘</button>
            </view>
        </view>
        <view v-show="current === 2">
        <view v-show="current === 1">
            <view style="padding: 5%;">
                <uni-forms label-width="120">
                    <uni-forms-item label="托盘编码">
@@ -84,12 +103,19 @@
            return {
                barcodeFocus:true,
                focus: false,
                focus2:false,
                istrue: false,
                addressFocus:false,
                barcodefocus: false,
                barcodefocus1:false,
                range: [],
                rangethree:[],
                group: [],
                group: [{
                    orderNo:1,
                    warehouseName:'hello测试',
                    materialNo:'123'
                }
                ],
                AreaId: 0,
                acrossFloor:0,
                quantity: "",
@@ -97,10 +123,14 @@
                TargetAddress: "",
                PalletCode1: "",
                PalletCode2: "",
                VehicleNumber:"",// è½½å…·ç¼–号
                PalletCode3: "",
                materSn: "",
                items: ['入库','物料绑定', '物料解绑'],
                current: 0
                //items: ['入库','物料绑定', '物料解绑'],
                items: ['物料绑定', '物料解绑'],
                current: 0,
                Position: '', //容器所在位置
                Carmodel:'', // è½¦åž‹
            }
        },
        onLoad(res) {
@@ -182,27 +212,40 @@
                    }
                })
            },
            GroupPlate() {
                if (this.PalletCode2.length <= 0 && this.InBoundOrder.length) {
            GroupPlate() { // ç»„盘 ç‰©æ–™ç»‘定
                // if (this.PalletCode2.length <= 0 && this.InBoundOrder.length) {
                //     this.$refs.luToast.show({
                //         title: "请输入起点站台",
                //         type: "error"
                //     })
                //     return;
                // }
                if (this.VehicleNumber.length <= 0
                || this.materSn.length <= 0
                || this.Position.length <= 0
                || this.Carmodel.length <= 0) {
                    this.$refs.luToast.show({
                        title: "请输入起点站台",
                        title: "数据输入不完整!",
                        type: "error"
                    })
                    return;
                }
                var param = {
                    "PalletCode": this.PalletCode2,
                    "groups": this.group
                    "VehicleNumber": this.VehicleNumber,
                    "materSn":this.materSn,
                    "Position": this.Position,
                    "Carmodel":this.Carmodel
                }
                this.$u.post('/api/BoxingInfo/AddGroupPlateAsync', param).then(res => {
                console.log(param)
                this.$u.post('/api/PDA/ContainerbindingAsync', param).then(res => {
                    if (res.status) {
                        this.$refs.luToast.show({
                            title: res.message,
                            type: "success"
                        })
                        this.PalletCode2 = "";
                        this.group = [];
                        this.barcodefocus = false;
                        this.Init();
                    } else {
                        this.$refs.luToast.show({
                            title: res.message,
@@ -211,7 +254,12 @@
                    }
                })
            },
            Init(){
                this.VehicleNumber = '';
                this.materSn = '';
                this.Position = '';
                this.Carmodel = '';
            },
            SolvePlate() {
                if (this.PalletCode3.length <= 0) {
                    this.$refs.luToast.show({
@@ -241,9 +289,9 @@
            },
            updateFocus() {
                this.$nextTick(() => {
                    this.materSn = '';
                    if (!this.focus) {
                        this.focus = true;
                    this.VehicleNumber = '';
                    if (!this.barcodefocus1) {
                        this.barcodefocus1 = true;
                    }
                });
            },
@@ -292,19 +340,35 @@
                })
            },
            inputChangebarcode() {
                this.$nextTick(() => {
                    this.$u.post('/api/BoxingInfo/GetPalletCodeInfo?palletCode=' + this.PalletCode2, "").then(
                        res => {
                            if (res.status) {
                                this.group = res.data;
                                console.log(this.group);
                                setTimeout(this.updateFocus, 200);
                                setTimeout(() => {
                                    this.voiceSpeech('../../static/success.mp3');
                                }, 100);
                var materSns = this.materSn;
                console.log(materSns)
                this.barcodefocus1 = true;
                if(materSns.indexOf(',') === -1){
                    return;
                            }
                        })
                })
                // 1. å¤„理零件号,取最后一段
                this.materSn = materSns.split(',').pop();
                // // 2. å¤„理车型,取第一段
                this.Carmodel = materSns.split(',')[0];
                // 3. å…³é”®ï¼šè¿”回处理后的值,uni-easyinput会自动更新v-model和界面
                console.log('处理后的零件号:', this.materSn);
                // this.$nextTick(() => {
                //     this.$u.post('/api/BoxingInfo/GetPalletCodeInfo?palletCode=' + this.PalletCode2, "").then(
                //         res => {
                //             if (res.status) {
                //                 this.group = res.data;
                //                 console.log(this.group);
                //                 setTimeout(this.updateFocus, 200);
                //                 setTimeout(() => {
                //                     this.voiceSpeech('../../static/success.mp3');
                //                 }, 100);
                //             }
                //         })
                // })
            },
            removeScanItem(orderNo) {
                this.group = this.group.filter(item => item.orderNo !== orderNo);
ÏîÄ¿´úÂë/PDA/pages/login/login.vue
@@ -156,7 +156,7 @@
        methods: {
            ///获取验证码
            getVierificationCode() {
                this.$u.get('/api/Sys_User/getVierificationCode', {}).then(res => {
                this.$u.get('/api/User/getVierificationCode', {}).then(res => {
                    if (res.img != null) {
                        this.codeImgSrc = "data:image/png;base64," + res.img;
                        this.email = res.uuid;
@@ -219,7 +219,7 @@
                        userName: this.user,
                        verificationCode: this.code
                    }
                    this.$u.post('/api/Sys_User/login', {
                    this.$u.post('/api/User/login', {
                        UUID: this.email,
                        passWord: this.pass,
                        userName: this.user,
ÏîÄ¿´úÂë/WIDESEA_WCSClient/package-lock.json
@@ -372,6 +372,12 @@
            "strip-ansi": "^6.0.1"
          },
          "dependencies": {
            "is-fullwidth-code-point": {
              "version": "3.0.0",
              "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
              "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
              "dev": true
            },
            "strip-ansi": {
              "version": "6.0.1",
              "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -401,48 +407,6 @@
            "ansi-styles": "^6.1.0",
            "string-width": "^5.0.1",
            "strip-ansi": "^7.0.1"
          }
        },
        "wrap-ansi-cjs": {
          "version": "npm:wrap-ansi@7.0.0",
          "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
          "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
          "dev": true,
          "requires": {
            "ansi-styles": "^4.0.0",
            "string-width": "^4.1.0",
            "strip-ansi": "^6.0.0"
          },
          "dependencies": {
            "ansi-styles": {
              "version": "4.3.0",
              "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
              "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
              "dev": true,
              "requires": {
                "color-convert": "^2.0.1"
              }
            },
            "string-width": {
              "version": "4.2.3",
              "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
              "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
              "dev": true,
              "requires": {
                "emoji-regex": "^8.0.0",
                "is-fullwidth-code-point": "^3.0.0",
                "strip-ansi": "^6.0.1"
              }
            },
            "strip-ansi": {
              "version": "6.0.1",
              "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
              "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
              "dev": true,
              "requires": {
                "ansi-regex": "^5.0.1"
              }
            }
          }
        }
      }
@@ -667,6 +631,11 @@
      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
      "dev": true,
      "optional": true
    },
    "@popperjs/core": {
      "version": "npm:@sxzz/popperjs-es@2.11.8",
      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz",
      "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ=="
    },
    "@tootallnate/once": {
      "version": "1.1.2",
@@ -1341,13 +1310,6 @@
        "lodash-unified": "^1.0.2",
        "memoize-one": "^6.0.0",
        "normalize-wheel-es": "^1.2.0"
      },
      "dependencies": {
        "@popperjs/core": {
          "version": "npm:@sxzz/popperjs-es@2.11.8",
          "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz",
          "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ=="
        }
      }
    },
    "emoji-regex": {
@@ -3589,6 +3551,54 @@
        }
      }
    },
    "wrap-ansi-cjs": {
      "version": "npm:wrap-ansi@7.0.0",
      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
      "dev": true,
      "requires": {
        "ansi-styles": "^4.0.0",
        "string-width": "^4.1.0",
        "strip-ansi": "^6.0.0"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "5.0.1",
          "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
          "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "string-width": {
          "version": "4.2.3",
          "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
          "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
          "dev": true,
          "requires": {
            "emoji-regex": "^8.0.0",
            "is-fullwidth-code-point": "^3.0.0",
            "strip-ansi": "^6.0.1"
          }
        },
        "strip-ansi": {
          "version": "6.0.1",
          "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
          "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
          "dev": true,
          "requires": {
            "ansi-regex": "^5.0.1"
          }
        }
      }
    },
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz",
ÏîÄ¿´úÂë/WIDESEA_WCSClient/src/api/http.js
@@ -15,7 +15,7 @@
    axios.defaults.baseURL = window.webConfig.webApiBaseUrl;
}
else if (process.env.NODE_ENV == 'debug') {
    axios.defaults.baseURL = 'http://127.0.0.1:8098/';
    axios.defaults.baseURL = 'http://127.0.0.1:9291/';
}
else if (process.env.NODE_ENV == 'production') {
ÏîÄ¿´úÂë/WIDESEA_WCSClient/src/extension/basicinfo/extend/materialInfos.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
<template>
  <div>
    <vol-box
      v-model="showDetialBox"
      :lazy="true"
      width="1200px"
      :padding="15"
      title="完整路由查看"
    >
      <div
        style="margin-bottom: 1%"
        v-for="(item, index) in routerDatas"
        :key="index"
      >
        <el-row>
          <el-col>
            <div
              class="grid-content right-text"
              style="font-weight: bold; font-size: 18px"
            >
              <span>{{ item.type == "Out" ? "出库路由" : "入库路由" }}</span>
            </div>
          </el-col>
        </el-row>
        <el-steps :active="item.routes.length" align-center simple>
          <el-step
            v-for="itemRouter in item.routes"
            :key="itemRouter"
            :title="itemRouter"
            icon=""
          ></el-step>
        </el-steps>
      </div>
    </vol-box>
  </div>
</template>
  <script>
import VolBox from "@/components/basic/VolBox.vue";
export default {
  components: { VolBox },
  data() {
    return {
      active: 0,
      showDetialBox: false,
      routerDatas: [],
    };
  },
  methods: {
    open() {
      this.showDetialBox = true;
      this.getData();
    },
    getData() {
      this.http.post("/api/Router/GetAllWholeRouters", {}, true).then((x) => {
        if (!x.status) return this.$message.error(x.message);
        this.routerDatas = x.data;
      });
    },
  },
  created() {},
};
</script>
  <style scoped>
.el-col {
  border-radius: 4px;
}
.grid-content {
  border-radius: 4px;
  min-height: 36px;
}
.content-text {
  display: flex;
  align-items: center;
  justify-content: center;
}
.left-text {
  display: flex;
  align-items: center;
  justify-content: flex-start;
}
</style>
  <style>
.el-table .warning-row {
  background: #fcf1e2;
}
.el-table .success-row {
  background: #f0f9eb;
}
.el-table .error-row {
  background: #fde2e2;
}
</style>
ÏîÄ¿´úÂë/WIDESEA_WCSClient/src/extension/basicinfo/materialInfo.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
import gridBody from './extend/materialInfos.vue';
let extension = {
  components: {
    //查询界面扩展组件
    gridHeader: "",
    gridBody: gridBody,
    gridFooter: "",
    //新建、编辑弹出框扩展组件
    modelHeader: "",
    modelBody: "",
    modelFooter: "",
  },
  tableAction: "", //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
  methods: {
    //下面这些方法可以保留也可以删除
    onInit() {
      // console.log(this.detailOptions.buttons);
      // console.log(this.$refs.detail)
      var detailImport = this.detailOptions.buttons.find(
        (item) => item.value == "import"
      );
      if (detailImport) {
        detailImport.onClick = function () {
          this.$refs.gridBody.open();
        };
      }
      // this.buttons.unshift({
      //   //也可以用push或者splice方法来修改buttons数组
      //   name: "开启服务", //按钮名称
      //   icon: "el-icon-document", //按钮图标vue2版本见iview文档icon,vue3版本见element ui文档icon(注意不是element puls文档)
      //   type: "primary", //按钮样式vue2版本见iview文档button,vue3版本见element ui文档button
      //   onClick: function () {
      //     this.$Message.success("开启服务");
      //   },
      // });
    },
    onInited() {
      //框架初始化配置后
      //如果要配置明细表,在此方法操作
      // this.detailOptions.columns.forEach(column=>{ });
      // console.log(this)
    },
    searchBefore(param) {
      //界面查询前,可以给param.wheres添加查询参数
      //返回false,则不会执行查询
      return true;
    },
    searchAfter(result) {
      //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
      return true;
    },
    addBefore(formData) {
      //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
      return true;
    },
    updateBefore(formData) {
      //编辑保存前formData为对象,包括明细表、删除行的Id
      return true;
    },
    rowClick({ row, column, event }) {
      //查询界面点击行事件
      // this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
    },
    modelOpenAfter(row) {
      //点击编辑、新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
      //(1)判断是编辑还是新建操作: this.currentAction=='Add';
      //(2)给弹出框设置默认值
      //(3)this.editFormFields.字段='xxx';
      //如果需要给下拉框设置默认值,请遍历this.editFormOptions找到字段配置对应data属性的key值
      //看不懂就把输出看:console.log(this.editFormOptions)
    },
    updated() {
      //console.log(this.$refs)
      this.$nextTick(() => {
        if (this.$refs.upload_excel) {
          alert("点击了上传按钮");
          this.$refs.upload_excel.upload = function () {
            console.log("点击了上传按钮");
          };
        }
        // alert(1)
      });
    },
  },
};
export default extension;
ÏîÄ¿´úÂë/WIDESEA_WCSClient/src/router/viewGird.js
@@ -62,6 +62,10 @@
    path: '/router',
    name: 'router',
    component: () => import('@/views/basicinfo/router.vue')
  },{
    path: '/materialInfo',
    name: 'Dt_MaterialInfo',
    component: () => import('@/views/basicinfo/materialInfo.vue')
  }
]
ÏîÄ¿´úÂë/WIDESEA_WCSClient/src/views/basicinfo/materialInfo.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,193 @@
<template>
  <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
    :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
    :table="table" :extend="extend">
  </view-grid>
</template>
<script>
import extend from "@/extension/basicinfo/materialInfo.js";
import { ref, defineComponent } from "vue";
export default defineComponent({
  setup() {
    const table = ref({
      key: "id",
      footer: "Foots",
      cnName: "物料绑定管理",
      name: "Dt_MaterialInfo",
      url: "/materialInfo/",
      sortName: "CreateDate",
    });
    const editFormFields = ref({
      taskNum: "",
      palletCode: "",
      roadway: "",
      taskType: "",
      taskState: "",
      wMSId: "",
      sourceAddress: "",
      targetAddress: "",
      currentAddress: "",
      nextAddress: "",
      creater: "",
      createDate: "",
      grade: "",
    });
    const editFormOptions = ref([[{ title: "优先级", field: "grade", type: "int" },]]);
    const searchFormFields = ref({
      taskNum: "",
      palletCode: "",
      roadway: "",
      sourceAddress: "",
      targetAddress: "",
      currentAddress: "",
      nextAddress: "",
      creater: "",
      createDate: "",
    });
    const searchFormOptions = ref([
      [
        { title: "任务号", field: "taskNum", type: "int" },
        { title: "托盘编号", field: "palletCode", type: "text" },
        {
          title: "任务类型",
          field: "taskType",
          type: "selectList",
          dataKey: "taskType",
          data: [],
        },
        {
          title: "任务状态",
          field: "taskState",
          type: "selectList",
          dataKey: "taskState",
          data: [],
        },
      ],
      [
        { title: "起始地址", field: "sourceAddress", type: "text" },
        { title: "目标地址", field: "targetAddress", type: "text" },
        { title: "当前位置", field: "currentAddress", type: "text" },
        { title: "下一位置", field: "nextAddress", type: "text" },
      ],
      [
        { title: "巷道号", field: "roadway", type: "text" },
        { title: "创建人", field: "creater", type: "text" },
        { title: "创建时间", field: "createDate", type: "datetime" },
      ],
    ]);
    const columns = ref([
      {
        field: "id",
        title: "id",
        type: "int",
        width: 90,
        hidden: true,
        readonly: true,
        require: true,
        align: "left",
      },
      {
        field: "ContainerCode",
        title: "容器编号",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "Position",
        title: "容器当前位置",
        type: "string",
        width: 160,
        align: "left",
      },
      {
        field: "EndPosition",
        title: "容器出场位置",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "IsNew",
        title: "是否属于新增容器",
        type: "int",
        width: 120,
        align: "left",
        bind: { key: "taskType", data: [] },
      },
      {
        field: "IsBind",
        title: "是否绑定",
        type: "int",
        width: 150,
        align: "left",
        bind: { key: "taskState", data: [] },
      },
      {
        field: "Carmodel",
        title: "车型",
        type: "string",
        width: 120,
        align: "left",
      },
      {
        field: "createDate",
        title: "创建时间",
        type: "datetime",
        width: 150,
        align: "left",
      },
      {
        field: "modifyDate",
        title: "修改时间",
        type: "datetime",
        width: 160,
        align: "left",
      },
      {
        field: "creater",
        title: "创建人",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "modifier",
        title: "修改人",
        type: "string",
        width: 90,
        align: "left",
      },
      {
        field: "remark",
        title: "备注",
        type: "string",
        width: 100,
        align: "left",
        hidden: true,
      },
    ]);
    const detail = ref({
      cnName: "",
      table: "",
      columns: [],
      sortName: "",
      key: "",
    });
    return {
      table,
      extend,
      editFormFields,
      editFormOptions,
      searchFormFields,
      searchFormOptions,
      columns,
      detail,
    };
  },
});
</script>
ÏîÄ¿´úÂë/WIDESEA_WCSClient/vite.config.js
@@ -12,7 +12,7 @@
    }
  },
  server: {
    port: 8080,
    port: 8081,
    overlay: {
      warning: false,
      errors: false
ÏîÄ¿´úÂë/WIDESEA_WCSServer/.vs/WIDESEAWCS_Server/v18/DocumentLayout.backup.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
{
  "Version": 1,
  "WorkspaceRootPath": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\bjagv\\beijingbeiqiagv\\\u9879\u76EE\u4EE3\u7801\\widesea_wcsserver\\wideseawcs_tasks\\taskacquisition\\taskacquisition_back1_job.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\taskacquisition\\taskacquisition_back1_job.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\bjagv\\beijingbeiqiagv\\\u9879\u76EE\u4EE3\u7801\\widesea_wcsserver\\wideseawcs_tasks\\agv\\commonagvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\agv\\commonagvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\bjagv\\beijingbeiqiagv\\\u9879\u76EE\u4EE3\u7801\\widesea_wcsserver\\wideseawcs_model\\models\\taskinfo\\dt_task.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\taskinfo\\dt_task.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 3,
          "Children": [
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "Dt_Task.cs",
              "DocumentMoniker": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "ToolTip": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "ViewState": "AgIAADgAAAAAAAAAAAAgwF0AAAAjAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2026-04-28T02:21:47.364Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "CommonAGVJob.cs",
              "DocumentMoniker": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "ToolTip": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "ViewState": "AgIAAFMAAAAAAAAAAAAQwGgAAAA6AAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2026-04-28T01:58:09.73Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "TaskAcquisition_Back1_Job.cs",
              "DocumentMoniker": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Tasks\\TaskAcquisition\\TaskAcquisition_Back1_Job.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\TaskAcquisition\\TaskAcquisition_Back1_Job.cs",
              "ToolTip": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Tasks\\TaskAcquisition\\TaskAcquisition_Back1_Job.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\TaskAcquisition\\TaskAcquisition_Back1_Job.cs",
              "ViewState": "AgIAAEIAAAAAAAAAAAAgwFQAAABbAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2026-04-22T02:42:49.651Z",
              "EditorCaption": ""
            }
          ]
        }
      ]
    }
  ]
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/.vs/WIDESEAWCS_Server/v18/DocumentLayout.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
{
  "Version": 1,
  "WorkspaceRootPath": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\",
  "Documents": [
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\bjagv\\beijingbeiqiagv\\\u9879\u76EE\u4EE3\u7801\\widesea_wcsserver\\wideseawcs_tasks\\agv\\commonagvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\agv\\commonagvjob.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|e:\\bjagv\\beijingbeiqiagv\\\u9879\u76EE\u4EE3\u7801\\widesea_wcsserver\\wideseawcs_tasks\\taskacquisition\\taskacquisition_back1_job.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{294E4915-0241-4C8C-BA99-7588B945863A}|WIDESEAWCS_Tasks\\WIDESEAWCS_Tasks.csproj|solutionrelative:wideseawcs_tasks\\taskacquisition\\taskacquisition_back1_job.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    },
    {
      "AbsoluteMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|e:\\bjagv\\beijingbeiqiagv\\\u9879\u76EE\u4EE3\u7801\\widesea_wcsserver\\wideseawcs_model\\models\\taskinfo\\dt_task.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
      "RelativeMoniker": "D:0:0:{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}|WIDESEAWCS_Model\\WIDESEAWCS_Model.csproj|solutionrelative:wideseawcs_model\\models\\taskinfo\\dt_task.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
    }
  ],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": 2,
          "Children": [
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
            },
            {
              "$type": "Document",
              "DocumentIndex": 2,
              "Title": "Dt_Task.cs",
              "DocumentMoniker": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "ToolTip": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "RelativeToolTip": "WIDESEAWCS_Model\\Models\\TaskInfo\\Dt_Task.cs",
              "ViewState": "AgIAADgAAAAAAAAAAAAgwF0AAAAjAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2026-04-28T02:21:47.364Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 0,
              "Title": "CommonAGVJob.cs",
              "DocumentMoniker": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs",
              "ToolTip": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs*",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\AGV\\CommonAGVJob.cs*",
              "ViewState": "AgIAAFEAAAAAAAAAAAAgwGMAAABGAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2026-04-28T01:58:09.73Z",
              "EditorCaption": ""
            },
            {
              "$type": "Document",
              "DocumentIndex": 1,
              "Title": "TaskAcquisition_Back1_Job.cs",
              "DocumentMoniker": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Tasks\\TaskAcquisition\\TaskAcquisition_Back1_Job.cs",
              "RelativeDocumentMoniker": "WIDESEAWCS_Tasks\\TaskAcquisition\\TaskAcquisition_Back1_Job.cs",
              "ToolTip": "E:\\BJAGV\\BeiJingBeiQiAGV\\\u9879\u76EE\u4EE3\u7801\\WIDESEA_WCSServer\\WIDESEAWCS_Tasks\\TaskAcquisition\\TaskAcquisition_Back1_Job.cs",
              "RelativeToolTip": "WIDESEAWCS_Tasks\\TaskAcquisition\\TaskAcquisition_Back1_Job.cs",
              "ViewState": "AgIAAB0AAAAAAAAAAAAQwFQAAABbAAAAAAAAAA==",
              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
              "WhenOpened": "2026-04-22T02:42:49.651Z",
              "EditorCaption": ""
            }
          ]
        }
      ]
    }
  ]
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_BasicInfoRepository/Dt_ContainerInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_BasicInfoRepository
{
    public class Dt_ContainerInfoRepository : RepositoryBase<Dt_ContainerInfo>, IDt_ContainerInfoRepository
    {
        public Dt_ContainerInfoRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_BasicInfoRepository/Dt_MaterialInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_BasicInfoRepository
{
    public class Dt_MaterialInfoRepository : RepositoryBase<Dt_MaterialInfo>, IDt_MaterialInfoRepository
    {
        public Dt_MaterialInfoRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_BasicInfoService/Dt_MaterialInfoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_DTO.PDA;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_BasicInfoService
{
    public class Dt_MaterialInfoService : ServiceBase<Dt_MaterialInfo, IDt_MaterialInfoRepository>, IDt_MaterialInfoService
    {
        private readonly IDt_ContainerInfoRepository _ContainerInfoRepository;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        public Dt_MaterialInfoService(IDt_MaterialInfoRepository BaseDal, IDt_ContainerInfoRepository dt_ContainerInfoRepository, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _ContainerInfoRepository = dt_ContainerInfoRepository;
            _unitOfWorkManage = unitOfWorkManage;
        }
        /// <summary>
        /// æ–°å¢žç»„盘信息
        /// </summary>
        /// <param name="containerbindingDTO"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task<WebResponseContent>  ContainerbindingAsync([FromBody] ContainerbindingDTO containerbindingDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                Dt_MaterialInfo dt_MaterialInfo = await BaseDal.QueryFirstAsync(x => x.ContainerCode == containerbindingDTO.VehicleNumber);
                if (dt_MaterialInfo != null) return content.Error("当前容器已绑定 è¯·å‹¿é‡å¤æäº¤");
                dt_MaterialInfo = await BaseDal.QueryFirstAsync(x => x.MaterialName == containerbindingDTO.materSn);
                if (dt_MaterialInfo != null) return content.Error("当前零件号已存在 è¯·å‹¿é‡å¤æäº¤");
                dt_MaterialInfo = new Dt_MaterialInfo();
                dt_MaterialInfo.MaterialName = containerbindingDTO.materSn;
                dt_MaterialInfo.ContainerCode = containerbindingDTO.VehicleNumber;
                dt_MaterialInfo.Position = containerbindingDTO.Position;
                dt_MaterialInfo.Carmodel = containerbindingDTO.Carmodel;
                string s = App.User.UserName;
                await BaseDal.AddDataAsync(dt_MaterialInfo);
                // 2. æ‰§è¡Œä¸€å®šä¼šæŠ¥é”™çš„代码:除以零
                //int a = 1;
                //int b = 0;
                //int result = a / b;  // è¿™é‡Œä¼šæŠ›å‡º DivideByZeroException
                Dt_ContainerInfo containerInfo = await _ContainerInfoRepository.QueryFirstAsync(x => x.ContainerCode == containerbindingDTO.VehicleNumber);
                if (containerInfo == null)
                {
                    containerInfo = new Dt_ContainerInfo();
                    containerInfo.RequestId = Guid.NewGuid().ToString().Replace("-", "");
                    containerInfo.ContainerCode = containerbindingDTO.VehicleNumber;
                    await _ContainerInfoRepository.AddDataAsync(containerInfo);
                }
                _unitOfWorkManage.CommitTran();
                return content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
                throw;
            }
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvStatusUpdateDTO.cs
@@ -35,8 +35,8 @@
        /// <summary>
        ///作业当前状态<br/>
        ///开始移动:MOVE_BEGIN<br/>
        ///料 ç®± å– æ–™ å®Œ æˆ:PICKER_RECEIVE<br/>
        ///料 ç®± ä¸‹ æ–™ å®Œ æˆ:PICKER_SEND<br/>
        ///货架 å– æ–™ å®Œ æˆ:PICKER_RECEIVE<br/>
        ///货架 ä¸‹ æ–™ å®Œ æˆ:PICKER_SEND<br/>
        ///等待放行:WAITFEEDBACK<br/>
        ///任务完成:COMPLETED<br/>
        ///任务取消完成:CANCELED<br/>
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/AGV/AgvTaskSendDTO.cs
@@ -1,4 +1,5 @@
using System;
using SixLabors.Fonts.Unicode;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -6,48 +7,83 @@
namespace WIDESEAWCS_DTO.Agv
{
    public class MissionDataItem
    public class MissionDataItem2
    {
        /// <summary>
        /// æ¬è¿æ–™ç®±åºå·ä»Ž1开始
        /// æ¬è¿è´§æž¶åºå·ä»Ž1开始
        /// </summary>
        public int Sequence { get; set; } = 1;
        /// <summary>
        /// æ–™ç®±å·
        /// è´§æž¶å·
        /// </summary>
        public string BinCode { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„起始点位
        /// è´§æž¶æ‰€åœ¨çš„起始点位
        /// </summary>
        public string StartPosition { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„起始槽位
        /// è´§æž¶æ‰€åœ¨çš„起始槽位
        /// </summary>
        public string StartSlotCode { get; set; }
        /// <summary>
        /// å–料箱时之前是否需要确认
        /// å–货架时之前是否需要确认
        /// </summary>
        public bool TakeActionConfirm { get; set; }
        /// <summary>
        /// å–料箱后是否需要通知
        /// å–货架后是否需要通知
        /// </summary>
        public bool TakeActionInform { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„目标点位
        /// è´§æž¶æ‰€åœ¨çš„目标点位
        /// </summary>
        public string EndPosition { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„目标槽位
        /// è´§æž¶æ‰€åœ¨çš„目标槽位
        /// </summary>
        public string EndSlotCode { get; set; }
        /// <summary>
        /// æ”¾æ–™ç®±æ—¶ä¹‹å‰æ˜¯å¦éœ€è¦ç¡®è®¤
        /// æ”¾è´§æž¶æ—¶ä¹‹å‰æ˜¯å¦éœ€è¦ç¡®è®¤
        /// </summary>
        public bool PutActionConfirm { get; set; }
        /// <summary>
        /// æ”¾æ–™ç®±åŽæ˜¯å¦éœ€è¦é€šçŸ¥
        /// æ”¾è´§æž¶åŽæ˜¯å¦éœ€è¦é€šçŸ¥
        /// </summary>
        public bool PutActionInform { get; set; }
    }
    /// <summary>
    ///货架移动任务(missionType=RACK_MOVE)
    /// </summary>
    public class MissionDataItem
    {
        /// <summary>
        /// æ¬è¿è´§æž¶åºå·ä»Ž1开始
        /// </summary>
        public int Sequence { get; set; } = 1;
        /// <summary>
        /// ä½œä¸šè·¯å¾„位置(放置的位置)
        /// </summary>
        public string Position { get; set; }
        /// <summary>
        /// ä½œä¸šä½ç½®ç±»åž‹ï¼šç‚¹ä½ï¼šNODE_POINT åŒºåŸŸï¼šNODE_AREA
        /// </summary>
        public string Type { get; set; } = "NODE_POINT";
        /// <summary>
        /// ä½œä¸šç‚¹ä½æ˜¯å¦éœ€è¦æ”¾ä¸‹è´§æž¶
        /// </summary>
        public bool PutDown { get; set; } = false;
        /// <summary>
        /// å½“前任务点结束后放行策略;自动 AUTO æ‰‹åЍ MANUAL
        /// </summary>
        public string PassStrategy { get; set; } = "AUTO";
        /// <summary>
        /// è‡ªåŠ¨è§¦å‘ç¦»å¼€å½“å‰ä»»åŠ¡èŠ‚ç‚¹çš„æ—¶é—´ï¼Œé»˜è®¤å•ä½:毫秒
        /// </summary>
        public int WaitingMillis { get; set; } = 0;
    }
    /// <summary>
    /// AGV任务发送
@@ -67,9 +103,9 @@
        /// </summary>
        public string MissionCode { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹ï¼šPICKER_MOVE
        /// ä»»åŠ¡ç±»åž‹ï¼šRACK_MOVE
        /// </summary>
        public string MissionType { get; set; } = "PICKER_MOVE";
        public string MissionType { get; set; } = "RACK_MOVE";
        /// <summary>
        /// ä»»åŠ¡çœ‹æ¿å±•ç¤ºä»»åŠ¡ç±»åž‹
        /// </summary>
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_DTO/PDA/ContainerbindingDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.PDA
{
    /// <summary>
    /// å®¹å™¨ç»‘定DTO
    /// </summary>
    public class ContainerbindingDTO
    {
        /// <summary>
        /// è½½å…·ç¼–号
        /// </summary>
        public string VehicleNumber {  get; set; }
        /// <summary>
        /// é›¶ä»¶ç¼–号
        /// </summary>
        public string materSn {  get; set; }
        /// <summary>
        /// å½“前点位
        /// </summary>
        public string Position {  get; set; }
        /// <summary>
        /// è½¦åž‹
        /// </summary>
        public string Carmodel { get; set; }
    }
    /// <summary>
    /// å®¹å™¨è§£ç»‘DTO
    /// </summary>
    public class ContainerUnbindingDTO
    {
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoRepository/IDt_ContainerInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_IBasicInfoRepository
{
    public interface IDt_ContainerInfoRepository : IRepository<Dt_ContainerInfo>
    {
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoRepository/IDt_MaterialInfoRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_IBasicInfoRepository
{
    public interface IDt_MaterialInfoRepository : IRepository<Dt_MaterialInfo>
    {
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_IBasicInfoService/IDt_MaterialInfoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_DTO.PDA;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_IBasicInfoService
{
    public interface IDt_MaterialInfoService : IService<Dt_MaterialInfo>
    {
        /// <summary>
        /// æ–°å¢žç»„盘信息
        /// </summary>
        /// <returns></returns>
        public Task<WebResponseContent> ContainerbindingAsync([FromBody] ContainerbindingDTO containerbindingDTO);
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_ContainerInfo.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models
{
    [SugarTable(nameof(Dt_ContainerInfo), "容器信息")]
    public class Dt_ContainerInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// è¯·æ±‚id,幂等uuid32位
        /// </summary>
        [SugarColumn(Length = 100, ColumnDescription = "请求id,幂等uuid32位")]
        public string RequestId { get; set; }
        /// <summary>
        /// å®¹å™¨ç±»åž‹
        /// </summary>
        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "容器类型", DefaultValue = "RACK")]
        public string ContainerType { get; set; } = "RACK";
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        [SugarColumn(Length = 100, ColumnDescription = "容器编号")]
        public string ContainerCode { get; set; }
        /// <summary>
        /// å®¹å™¨æ¨¡åž‹ç¼–码
        /// </summary>
        //[SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "容器模型编码")]
        //public string ContainerModelCode { get; set; }
        /// <summary>
        /// å®¹å™¨å…¥åœºè§’度
        /// </summary>
        //[SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "容器入场角度")]
        //public string EnterOrientation { get; set; }
        /// <summary>
        /// å®¹å™¨å½“前对应位置
        /// </summary>
        //[SugarColumn(Length = 100, ColumnDescription = "容器当前对应位置")]
        //public string Position { get; set; }
        /// <summary>
        /// æ˜¯å¦æ–°å¢žå¢žå®¹å™¨
        /// </summary>
        //[SugarColumn(ColumnDescription = "是否新增增容器", DefaultValue = "0")]
        //public bool IsNew { get; set; }
        /// <summary>
        /// å®¹å™¨æ ¡éªŒç 
        /// </summary>
        //[SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "容器校验码")]
        //public string ContainerValidationCode { get; set; }
        /// <summary>
        /// é…ç½®å®¹å™¨é»˜è®¤æ ¡éªŒç 
        /// </summary>
        //[SugarColumn(ColumnDescription = "配置容器默认校验码", IsNullable = true, DefaultValue = "0")]
        //public bool WithDefaultValidationCode { get; set; }
        // ä¸‹æ–¹æ˜¯å®¹å™¨å‡ºåœºçš„相关字段
        /// <summary>
        /// å®¹å™¨å‡ºåœºä½ç½®
        /// </summary>
        //[SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "容器出场位置")]
        //public string EndPosition { get; set; }
        /// <summary>
        /// å®¹å™¨å‡ºåœºåŽæ˜¯å¦åˆ é™¤
        /// </summary>
        //[SugarColumn(ColumnDescription = "容器出场后是否删除", IsNullable = true, DefaultValue = "0")]
        //public bool isDelete { get; set; }
        /// <summary>
        /// å®¹å™¨çš„空满状态,空:EMPTY æ»¡ï¼šFULL
        /// </summary>
        //[SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "容器的空满状态")]
        //public string emptyStatus { get; set; }
        /// <summary>
        /// å®¹å™¨çš„空满状态,空:EMPTY æ»¡ï¼šFULL
        /// </summary>
        //[SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "更新原因")]
        //public string reason { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_Inventory.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models
{
    /// <summary>
    /// åº“存表(货位信息)
    /// </summary>
    [SugarTable(nameof(Dt_Inventory), "库存表")]
    public class Dt_Inventory : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// è´§ä½id
        /// </summary>
        [SugarColumn(Length = 510, ColumnDescription = "货位id")]
        public string? location_id { get; set; }
        /// <summary>
        /// åº“区/区域id
        /// </summary>
        [SugarColumn(Length = 510, ColumnDescription = "库区/区域id")]
        public string? location_areaid { get; set; }
        /// <summary>
        /// è´§ä½çŠ¶æ€
        /// </summary>
        [SugarColumn(Length = 510, ColumnDescription = "货位状态")]
        public string? location_state { get; set; }
        /// <summary>
        /// è¡Œ
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "行")]
        public int? location_line { get; set; }
        /// <summary>
        /// åˆ—
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "列")]
        public int? location_column { get; set; }
        /// <summary>
        /// å±‚
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "层")]
        public int? location_layer { get; set; }
        /// <summary>
        /// æ˜¯å¦è¢«é”å®š
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "是否被锁定")]
        public bool? location_islocked { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段1
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段1")]
        public string? location_bak_1 { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段2
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段2")]
        public string? location_bak_2 { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段3
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段3")]
        public string? location_bak_3 { get; set; }
        /// <summary>
        /// è´§ä½æ·±åº¦
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "货位深度")]
        public int? location_deep { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_MaterialInfo.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models
{
    [SugarTable(nameof(Dt_MaterialInfo), "物料信息组盘表")]
    public class Dt_MaterialInfo : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§° é›¶ä»¶å·
        /// </summary>
        [SugarColumn(Length = 100, ColumnDescription = "物料名称")]
        public string MaterialName { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        [SugarColumn(Length = 100, ColumnDescription = "容器编号")]
        public string ContainerCode { get; set; }
        /// <summary>
        /// å®¹å™¨å½“前对应位置
        /// </summary>
        [SugarColumn(Length = 100, ColumnDescription = "容器当前对应位置")]
        public string Position { get; set; }
        /// <summary>
        /// å®¹å™¨å‡ºåœºä½ç½®
        /// </summary>
        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "容器出场位置")]
        public string EndPosition { get; set; }
        /// <summary>
        /// æ˜¯å¦æ–°å¢žå¢žå®¹å™¨
        /// </summary>
        [SugarColumn(ColumnDescription = "是否属于新增容器", DefaultValue = "0")]
        public bool IsNew { get; set; }
        /// <summary>
        /// å®¹å™¨æ˜¯å¦ç»‘定
        /// </summary>
        [SugarColumn(ColumnDescription = "容器是否绑定", DefaultValue = "1")]
        public bool IsBind { get; set; } = true;
        /// <summary>
        /// è½¦åž‹
        /// </summary>
        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "车型")]
        public string Carmodel { get; set; }
        /// <summary>
        /// åŒºåŸŸ
        /// </summary>
        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "区域")]
        public string Region { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段1
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段1")]
        public string? location_bak_1 { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段2
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段2")]
        public string? location_bak_2 { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段3
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段3")]
        public string? location_bak_3 { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/BasicInfo/Dt_MaterialInfo_Hty.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.DB.Models;
namespace WIDESEAWCS_Model.Models
{
    [SugarTable(nameof(Dt_MaterialInfo_Hty), "物料信息组盘历史记录表")]
    public class Dt_MaterialInfo_Hty : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(Length = 100, ColumnDescription = "物料名称")]
        public string MaterialName { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        [SugarColumn(Length = 100, ColumnDescription = "容器编号")]
        public string ContainerCode { get; set; }
        /// <summary>
        /// å®¹å™¨å½“前对应位置
        /// </summary>
        [SugarColumn(Length = 100, ColumnDescription = "容器当前对应位置")]
        public string Position { get; set; }
        /// <summary>
        /// å®¹å™¨å‡ºåœºä½ç½®
        /// </summary>
        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "容器出场位置")]
        public string EndPosition { get; set; }
        /// <summary>
        /// è½¦åž‹
        /// </summary>
        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "车型")]
        public string Carmodel { get; set; }
        /// <summary>
        /// åŒºåŸŸ
        /// </summary>
        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "区域")]
        public string Region { get; set; }
        /// <summary>
        /// æ˜¯å¦æ–°å¢žå¢žå®¹å™¨
        /// </summary>
        [SugarColumn(ColumnDescription = "是否属于新增容器", DefaultValue = "0")]
        public bool IsNew { get; set; }
        /// <summary>
        /// å®¹å™¨æ˜¯å¦ç»‘定
        /// </summary>
        [SugarColumn(ColumnDescription = "容器是否绑定", DefaultValue = "1")]
        public bool IsBind { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段1
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段1")]
        public string? location_bak_1 { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段2
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段2")]
        public string? location_bak_2 { get; set; }
        /// <summary>
        /// å¤‡ç”¨å­—段3
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 255, ColumnDataType = "nvarchar", ColumnDescription = "备用字段3")]
        public string? location_bak_3 { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -43,10 +43,10 @@
        [ImporterHeader(Name = "任务号")]
        [ExporterHeader(DisplayName = "任务号")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务号")]
        public int TaskNum { get; set; }
        public int TaskNum { get; set; } = 0;
        /// <summary>
        /// æ‰˜ç›˜ç¼–号
        /// æ‰˜ç›˜/容器 ç¼–号
        /// </summary>
        [ImporterHeader(Name = "托盘编号")]
        [ExporterHeader(DisplayName = "托盘编号")]
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Model/Models/TaskInfo/Dt_TaskExecuteDetail.cs
@@ -56,8 +56,8 @@
        /// <summary>
        /// ä»»åŠ¡çŠ¶æ€
        /// </summary>
        [ImporterHeader(Name = "主键")]
        [ExporterHeader(DisplayName = "主键")]
        [ImporterHeader(Name = "任务状态")]
        [ExporterHeader(DisplayName = "任务状态")]
        [SugarColumn(IsNullable = false, ColumnDescription = "任务状态")]
        public int TaskState { get; set; }
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -58,15 +58,15 @@
                switch (agvUpdateDTO.MissionStatus)
                {
                    case nameof(AGVStatusEnum.PICKER_RECEIVE):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        if (task == null) throw new Exception($"未找到货架【{agvUpdateDTO.ContainerCode}】任务");
                        _taskService.UpdateTask(task, TaskAGVCarryStatusEnum.AGV_CarryTakeFinish);
                        break;
                    case nameof(AGVStatusEnum.PICKER_SEND):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        if (task == null) throw new Exception($"未找到货架【{agvUpdateDTO.ContainerCode}】任务");
                        _taskService.UpdateTask(task, TaskAGVCarryStatusEnum.AGV_CarryReleaseFinish);
                        break;
                    case nameof(AGVStatusEnum.COMPLETED):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        if (task == null) throw new Exception($"未找到货架【{agvUpdateDTO.ContainerCode}】任务");
                        _taskService.TaskCompleted(task.TaskNum);
                        break;
                    default:
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/BasicInfo/Dt_MaterialInfoController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Core.BaseController;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_Server.Controllers.BasicInfo
{
    [Route("api/Dt_MaterialInfo")]
    [ApiController]
    public class Dt_MaterialInfoController : ApiBaseController<IDt_MaterialInfoService, Dt_MaterialInfo>
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        public Dt_MaterialInfoController(IDt_MaterialInfoService service, IHttpContextAccessor httpContextAccessor) : base(service)
        {
            _httpContextAccessor = httpContextAccessor;
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Controllers/PDA/PDAController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_DTO.Agv;
using WIDESEAWCS_DTO.PDA;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob.Repository;
namespace WIDESEAWCS_Server.Controllers.PDA
{
    [Route("api/[controller]")]
    [ApiController]
    public class PDAController : ControllerBase
    {
        private readonly IDt_StationManagerRepository _stationMangerRepository;
        private readonly ITaskService _taskService;
        private readonly ITaskRepository _taskRepository;
        private readonly IRouterRepository _routerRepository;
        private readonly IDt_MaterialInfoRepository _MaterialInfoRepository;
        private readonly IDt_ContainerInfoRepository _ContainerInfoRepository;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IDt_MaterialInfoService _IDt_MaterialInfoService;
        public PDAController(IDt_StationManagerRepository stationMangerRepository, ITaskService taskService, ITaskRepository taskRepository, IRouterRepository routerRepository, IDt_MaterialInfoRepository materialInfoRepository, IDt_ContainerInfoRepository containerInfoRepository, IDt_MaterialInfoService iDt_MaterialInfoService)
        {
            _stationMangerRepository = stationMangerRepository;
            _taskService = taskService;
            _taskRepository = taskRepository;
            _routerRepository = routerRepository;
            _MaterialInfoRepository = materialInfoRepository;
            _ContainerInfoRepository = containerInfoRepository;
            _IDt_MaterialInfoService = iDt_MaterialInfoService;
        }
        [HttpPost, HttpGet, Route("ContainerbindingAsync"), AllowAnonymous]
        public async Task<WebResponseContent> ContainerbindingAsync([FromBody] ContainerbindingDTO  containerbindingDTO)
        {
           return await _IDt_MaterialInfoService.ContainerbindingAsync(containerbindingDTO);
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Log/AGVÈÎÎñÏ·¢/2026-04-20/ÈÎÎñÏ·¢½Ó¿Ú260420.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,725 @@
2026/4/20 11:47:48.277
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:12:04.46
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:12:04.343
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:12:06.335
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:12:08.338
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:12:10.342
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:28:57.176
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:28:57.615
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:28:59.627
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:30:45.458
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:30:45.681
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:32:21.805
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:32:22.169
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:35:51.779
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:35:51.879
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:35:51.884
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:35:53.695
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:35:55.696
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:35:57.699
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:35:59.700
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:01.695
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:03.696
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:05.692
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:07.697
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:09.693
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:11.688
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:13.693
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:15.711
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:17.695
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:19.707
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:21.704
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:36:23.694
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:04.408
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:04.534
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:05.503
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:07.508
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:09.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:11.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:13.495
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:15.494
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:17.497
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:19.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:21.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:23.503
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:25.498
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:27.499
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:29.505
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:31.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:33.498
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:35.494
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:37.510
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:39.501
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:41.494
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:43.508
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:45.499
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:47.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:49.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:51.499
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:53.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:55.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:57.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:37:59.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:01.498
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:03.494
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:05.502
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:07.495
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:09.510
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:11.505
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:13.506
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:15.499
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:17.495
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:19.509
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:21.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:23.493
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:25.508
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:27.505
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:29.498
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:31.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:33.494
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:35.509
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:37.502
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:39.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:41.495
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:43.503
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:45.502
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:47.502
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:49.503
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:51.502
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:53.493
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:55.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:57.506
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:38:59.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:01.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:03.492
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:05.505
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:07.490
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:09.498
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:11.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:13.510
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:15.493
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:17.495
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:19.507
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:21.499
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:23.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:25.505
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:27.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:29.495
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:31.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:33.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:35.498
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:37.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:39.497
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:41.506
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:43.509
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:45.502
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:47.502
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:49.500
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:51.501
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:53.507
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:55.501
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:57.497
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:39:59.499
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:01.504
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:03.495
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:05.506
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:07.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:09.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:11.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:13.495
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:15.507
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:17.503
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:19.496
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:21.492
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:23.501
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:57.670
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:57.802
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:40:58.721
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:41:00.720
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:41:02.713
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:41:04.713
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:41:06.717
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:41:08.712
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:41:10.710
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:41:12.718
添加任务
"任务:11111122222"
-------------------------------
2026/4/20 16:41:14.718
添加任务
"任务:11111122222"
-------------------------------
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Log/AGVÈÎÎñÏ·¢/2026-04-22/ÈÎÎñÏ·¢½Ó¿Ú260422.txt
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Log/AGVÈÎÎñÏ·¢/2026-04-28/ÈÎÎñÏ·¢½Ó¿Ú260428.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
2026/4/28 10:34:43.209
添加任务
"任务:[{\"TaskId\":2,\"TaskNum\":0,\"PalletCode\":\"8001\",\"Roadway\":\"1\",\"TaskType\":400,\"TaskState\":400,\"SourceAddress\":\"1001\",\"TargetAddress\":\"2001\",\"CurrentAddress\":\"1001\",\"NextAddress\":\"2001\",\"ExceptionMessage\":null,\"Grade\":2,\"Dispatchertime\":null,\"Remark\":null,\"AGVSign\":null,\"Creater\":\"System\",\"CreateDate\":\"2026-04-28T09:54:50.8\",\"Modifier\":null,\"ModifyDate\":null}]"
-------------------------------
2026/4/28 10:36:56.400
添加任务
"任务:[{\"TaskId\":2,\"TaskNum\":0,\"PalletCode\":\"8001\",\"Roadway\":\"1\",\"TaskType\":400,\"TaskState\":400,\"SourceAddress\":\"1001\",\"TargetAddress\":\"2001\",\"CurrentAddress\":\"1001\",\"NextAddress\":\"2001\",\"ExceptionMessage\":null,\"Grade\":2,\"Dispatchertime\":null,\"Remark\":null,\"AGVSign\":null,\"Creater\":\"System\",\"CreateDate\":\"2026-04-28T09:54:50.8\",\"Modifier\":null,\"ModifyDate\":null}]"
-------------------------------
2026/4/28 10:39:03.295
添加任务
"任务:[{\"TaskId\":2,\"TaskNum\":0,\"PalletCode\":\"8001\",\"Roadway\":\"1\",\"TaskType\":400,\"TaskState\":400,\"SourceAddress\":\"1001\",\"TargetAddress\":\"2001\",\"CurrentAddress\":\"1001\",\"NextAddress\":\"2001\",\"ExceptionMessage\":\"未找到任务号$2起始点1001位置信息\",\"Grade\":2,\"Dispatchertime\":null,\"Remark\":null,\"AGVSign\":null,\"Creater\":\"System\",\"CreateDate\":\"2026-04-28T09:54:50.8\",\"Modifier\":\"System\",\"ModifyDate\":\"2026-04-28T10:37:13.597\"}]"
-------------------------------
2026/4/28 10:42:18.106
添加任务
"任务:[{\"TaskId\":2,\"TaskNum\":0,\"PalletCode\":\"8001\",\"Roadway\":\"1\",\"TaskType\":400,\"TaskState\":400,\"SourceAddress\":\"1001\",\"TargetAddress\":\"2001\",\"CurrentAddress\":\"1001\",\"NextAddress\":\"2001\",\"ExceptionMessage\":\"未找到任务号$2起始点1001位置信息\",\"Grade\":2,\"Dispatchertime\":null,\"Remark\":null,\"AGVSign\":null,\"Creater\":\"System\",\"CreateDate\":\"2026-04-28T09:54:50.8\",\"Modifier\":\"System\",\"ModifyDate\":\"2026-04-28T10:37:13.597\"}]"
-------------------------------
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/Program.cs
@@ -24,12 +24,12 @@
var builder = WebApplication.CreateBuilder(args);
//if (!HslCommunication.Authorization.SetAuthorizationCode("95f1611d-633c-46ea-b03a-38ede1629f74"))
//{
//    ConsoleHelper.WriteErrorLine("授权失败!当前程序只能使用24小时!");
//}
//else
//    ConsoleHelper.WriteSuccessLine("授权成功!");
if (!HslCommunication.Authorization.SetAuthorizationCode("95f1611d-633c-46ea-b03a-38ede1629f74"))
{
    ConsoleHelper.WriteErrorLine("授权失败!当前程序只能使用24小时!");
}
else
    ConsoleHelper.WriteSuccessLine("授权成功!");
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer<ContainerBuilder>(builder =>
{
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Server/appsettings.json
@@ -11,7 +11,7 @@
  "ConnectionStringsEncryption": false,
  "MainDB": "DB_WIDESEA", //当前项目的主库,所对应的连接字符串的Enabled必须为true
  //连接字符串
  "ConnectionString": "Data Source=;Initial Catalog=WIDESEAWCS_BeiQi;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=;Initial Catalog=WIDESEAWCS_BeiQi;User ID=sa;Password=123;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //"ConnectionString": "Data Source=192.168.32.240;Initial Catalog=WIDESEAWCS_OTS;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //跨域
  "Cors": {
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs
@@ -34,7 +34,6 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = _apiInfoRepository.QueryFirst(x => x.ApiCode == SendTask.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress)) throw new Exception($"未找到发送AGV任务接口,请检查接口配置");
                string request = JsonConvert.SerializeObject(taskModel, settings);
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Tasks/AGV/CommonAGVJob.cs
@@ -4,10 +4,12 @@
using Newtonsoft.Json.Linq;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using Quartz;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
@@ -44,11 +46,13 @@
        public Task Execute(IJobExecutionContext context)
        {
            var newTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskAGVCarryStatusEnum.AGV_CarryNew.ObjToInt())).ToList().OrderBy(x => x.Grade).ThenBy(x => x.TaskNum).ToList();
            var newTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == (int)TaskAGVCarryStatusEnum.AGV_CarryNew)).ToList().OrderBy(x => x.Grade).ThenBy(x => x.TaskNum).ToList();
            #region ä»»åŠ¡ä¸‹å‘
            if (newTasks.Count > 0)
            {
                WriteLog.Write_Log("AGV任务下发", "任务下发接口", "添加任务", $"任务:{newTasks.ToJson()}");
                foreach (var task in newTasks)
                {
                try
                {
                    AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
@@ -57,61 +61,55 @@
                    };
                    string taskGroupId = Guid.NewGuid().ToString().Replace("-", "");
                    foreach (var task in newTasks)
                    {
                        //获取目标点货位
                        Dt_StationManager stationManagerStart = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.CurrentAddress);
                        //获取拣选出库站台
                        Dt_StationManager stationManagerEnd = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.NextAddress);
                        // èŽ·å–èµ·å§‹ç«™å°
                        Dt_StationManager stationManagerEnd = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.SourceAddress);
                        // èŽ·å–ç›®çš„ç«™å°
                        Dt_StationManager finalmission = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.TargetAddress);
                        if (stationManagerStart == null || stationManagerStart == null) throw new Exception($"未找到任务号${task.TaskNum}起始点{task.CurrentAddress}或目标点{task.NextAddress}位置信息");
                        if (stationManagerEnd == null) throw new Exception($"未找到任务号${task.TaskId}起始点{task.SourceAddress}位置信息");
                        if (finalmission == null) throw new Exception($"未找到任务号${task.TaskId}目标点{task.TargetAddress}位置信息");
                        agvTaskSend.RequestId = taskGroupId;
                        agvTaskSend.MissionCode = task.TaskNum.ToString();
                        agvTaskSend.MissionCode = task.TaskId.ToString();
                        agvTaskSend.ViewBoardType = "W01";
                        //料箱子搬运任务
                        MissionDataItem missionDataItem = new MissionDataItem()
                        //货架子搬运任务
                        MissionDataItem Startingmission = new MissionDataItem() // èµ·ç‚¹
                        {
                            Sequence = task.TaskNum,
                            BinCode = task.PalletCode,
                            StartPosition = stationManagerStart.stationLocation,
                            EndPosition = stationManagerEnd.stationLocation,
                            TakeActionConfirm = false,
                            TakeActionInform = false,
                            PutActionConfirm = true,
                            PutActionInform = true,
                            Sequence = 1,
                            Position = stationManagerEnd.stationLocation,
                        };
                        agvTaskSend.MissionData.Add(missionDataItem);
                    }
                    if (newTasks.OrderByDescending(x => x.Grade).FirstOrDefault()?.Grade == 0)
                        MissionDataItem Finalmission = new MissionDataItem() // ç»ˆç‚¹
                        {
                            Sequence = 2,
                            Position = finalmission.stationLocation,
                        };
                        agvTaskSend.MissionData.Add(Startingmission);
                        agvTaskSend.MissionData.Add(Finalmission);
                        if (task.Grade == 0)
                    {
                        agvTaskSend.Priority = 99;
                    }
                    else
                    {
                        agvTaskSend.Priority = 99 - newTasks.OrderByDescending(x => x.Grade).FirstOrDefault().Grade;
                            agvTaskSend.Priority = 99 - task.Grade;
                    }
                    //发送AGV任务
                    WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
                    if (!content.Status)
                        throw new Exception(content.Message);
                    newTasks.ForEach(x =>
                    {
                        x.Dispatchertime = DateTime.Now;
                        x.TaskState = TaskAGVCarryStatusEnum.AGV_CarryExecuting.ObjToInt();
                    });
                        task.Dispatchertime = DateTime.Now;
                        task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryExecuting;
                    _taskService.UpdateData(newTasks);
                    Thread.Sleep(500);
                }
                catch (Exception ex)
                {
                    newTasks.ForEach(x =>
                    {
                        x.TaskState = TaskAGVCarryStatusEnum.AGV_CarryException.ObjToInt();
                        x.ExceptionMessage = ex.Message;
                    });
                        task.TaskState = (int)TaskAGVCarryStatusEnum.AGV_CarryException;
                        task.ExceptionMessage = ex.Message;
                    _taskService.UpdateData(newTasks);
                }
                }
            }
            #endregion
            return Task.CompletedTask;
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/Baseconversion.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Tasks.TaskAcquisition
{
    public class Baseconversion
    {
        /// <summary>
        /// 10进制转16进制
        /// </summary>
        /// <returns></returns>
        public string TenthTurn16(byte[] bytes)
        {
            try
            {
                string originalDecimalStr = Encoding.ASCII.GetString(bytes).TrimEnd('\0');
                // ä¸‹é¢è¿™ä¸€æ®µå°±æ˜¯ä½ è¦çš„:转 16 è¿›åˆ¶
                ulong number = ulong.Parse(originalDecimalStr);  // è½¬æˆæ•°å­—
                string hexStr = number.ToString("X");            // è½¬å¤§å†™16进制
                return hexStr;
            }
            catch (Exception)
            {
                return "";
                throw;
            }
        }
        /// <summary>
        /// 16进制转10进制
        /// </summary>
        /// <returns></returns>
        public string SixteenTurns10()
        {
            return "";
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/TaskAcquisition_Back1_Job.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using Quartz;
using SixLabors.ImageSharp;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_Tasks.TaskAcquisition;
namespace WIDESEAWCS_Tasks
{
    /// <summary>
    /// ä»»åŠ¡èŽ·å– åŽåº•板1 çš„任务
    /// </summary>
    ///
    [DisallowConcurrentExecution]
    public class TaskAcquisition_Back1_Job : JobBase, IJob
    {
        private readonly ITaskRepository _taskRepository;
        private readonly ITaskService _taskService;
        private readonly ISys_ConfigService _sys_ConfigService;
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        private readonly IDt_MaterialInfoRepository _IDt_MaterialInfoRepository;
        public TaskAcquisition_Back1_Job(ITaskRepository taskRepository, ITaskService taskService, ISys_ConfigService configService, IDt_StationManagerRepository stationManagerRepository, IDt_MaterialInfoRepository IDt_MaterialInfoRepository)
        {
            _taskRepository = taskRepository;
            _taskService = taskService;
            _sys_ConfigService = configService;
            _stationManagerRepository = stationManagerRepository;
            _IDt_MaterialInfoRepository = IDt_MaterialInfoRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            string ip = "127.0.0.1";
            int port = 502;
            string Region = "后底板1";
            ModbusTcp modbusTcp = new ModbusTcp(ip, port, Region);
            Baseconversion baseconversion = new Baseconversion();
            modbusTcp.Connect();
            Dictionary<int, int> Signal = new Dictionary<int, int>() { [10] = 2, [30] = 3, [50] = 4, [70] = 5 };
            Dictionary<int, int> FeedingPoint = new Dictionary<int, int>() { [10] = 2001, [30] = 2002, [50] = 2003, [70] = 2004 }; // å«æ–™çš„点位 ç»ˆç‚¹ä½ç½®
            try
            {
                for (int i = 10; i < 90; i += 20)
                {
                    byte[] SignalNumber = modbusTcp.Read(Signal[i].ToString(), 1); // ä¿¡å· 1:叫料 2:拉出空框
                    if (SignalNumber[1] == 1)
                    {
                        byte[] PartNumber = modbusTcp.Read(i.ToString(), 20); // è¯»å–零件号
                        if (PartNumber[1] == 0) continue;
                        string Ku1_Value = baseconversion.TenthTurn16(PartNumber);
                        if (Ku1_Value != "" && Ku1_Value != null)
                        {
                            // ç­‰åŠŸèƒ½æµ‹è¯•å®Œï¼Œè¿™é‡Œè¦åšæ—¥å¿—è®°å½•
                            Console.WriteLine(Ku1_Value);
                            // æ‰¾å¯¹åº”的零件号是否已经绑定(组盘)
                            Dt_MaterialInfo dt_MaterialInfo = _IDt_MaterialInfoRepository.QueryFirst(x => x.MaterialName == Ku1_Value);
                            if (dt_MaterialInfo != null && dt_MaterialInfo.IsBind && dt_MaterialInfo.EndPosition == null)
                            {
                                Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.PalletCode == dt_MaterialInfo.ContainerCode);
                                if (dt_Task != null) continue; //证明有当前任务
                                dt_Task = new Dt_Task();
                                dt_Task.PalletCode = dt_MaterialInfo.ContainerCode;
                                dt_Task.SourceAddress = dt_MaterialInfo.Position; // å½“前位置
                                dt_Task.TargetAddress = FeedingPoint[i].ToString(); // ç»ˆç‚¹ä½ç½®
                                dt_Task.Grade = 2;
                                dt_Task.TaskState = TaskAGVCarryStatusEnum.AGV_CarryNew.ObjToInt();
                                dt_Task.TaskType = TaskAGVCarryTypeEnum.Carry.ObjToInt();
                                dt_Task.Roadway = (Signal[i] - 1).ToString(); // åº“1 å«æ–™é‚£å°±æ˜¯1巷道
                                dt_Task.CurrentAddress = dt_MaterialInfo.Position; // å½“前位置
                                dt_Task.NextAddress = FeedingPoint[i].ToString(); // ç»ˆç‚¹ä½ç½®
                                dt_MaterialInfo.EndPosition = FeedingPoint[i].ToString(); // ç»ˆç‚¹ä½ç½®
                                _taskRepository.AddData(dt_Task);
                                _IDt_MaterialInfoRepository.UpdateData(dt_MaterialInfo);
                            }
                            // å¦‚果没绑定则不生成任务 å¦‚果查找到对应的零件号绑定了 åˆ™ç”Ÿæˆä¸€æ¡ä»»åŠ¡æ•°æ®
                        }
                    }
                    if (SignalNumber[1] == 2) // è¡¨ç¤ºæ‹‰å‡ºç©ºæ¡†
                    {
                        Dictionary<int, int> Endpointposition = new Dictionary<int, int>() { [10] = 3001, [20] = 3002, [30] = 3003, [40] = 3004 }; // å«æ–™çš„点位 ç»ˆç‚¹ä½ç½®
                        Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.SourceAddress == FeedingPoint[i].ToString() && x.TaskType == (int)TaskAGVCarryTypeEnum.CarryEmpty);
                        if (dt_Task != null) continue;
                        dt_Task = new Dt_Task();
                        dt_Task.PalletCode = "空框子";
                        dt_Task.SourceAddress = FeedingPoint[i].ToString();
                        dt_Task.TargetAddress = Endpointposition[i].ToString();
                        dt_Task.Grade = 2;
                        dt_Task.TaskState = TaskAGVCarryStatusEnum.AGV_CarryNew.ObjToInt();
                        dt_Task.TaskType = TaskAGVCarryTypeEnum.CarryEmpty.ObjToInt();
                        dt_Task.Roadway = (Signal[i] - 1).ToString(); // åº“1 å«æ–™é‚£å°±æ˜¯1巷道
                        dt_Task.CurrentAddress = FeedingPoint[i].ToString(); // å½“前位置
                        dt_Task.NextAddress = Endpointposition[i].ToString(); // ç»ˆç‚¹ä½ç½®
                        _taskRepository.AddData(dt_Task);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            // 16进制转成10进制
            // 2. 16进制 â†’ è½¬å›žåè¿›åˆ¶ï¼ˆä½ è¦çš„功能)
            ulong decimalResult = Convert.ToUInt64("123", 16);
            Console.WriteLine("16进制转回十进制:" + decimalResult);
            // å†™å…¥
            bool flag = modbusTcp.Write("30", decimalResult.ToString());
            modbusTcp.Disconnect();
            Console.WriteLine("进入了TaskAcquisition_Back1_Job");
            return Task.CompletedTask;
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/TaskAcquisition_Back2_Job.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_QuartzJob;
namespace WIDESEAWCS_Tasks
{
    /// <summary>
    /// ä»»åŠ¡èŽ·å– åŽåº•板2 çš„任务
    /// </summary>
    ///
    [DisallowConcurrentExecution]
    public class TaskAcquisition_Back2_Job : JobBase, IJob
    {
        private readonly ITaskRepository _taskRepository;
        private readonly ITaskService _taskService;
        private readonly ISys_ConfigService _sys_ConfigService;
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        public TaskAcquisition_Back2_Job(ITaskRepository taskRepository, ITaskService taskService, ISys_ConfigService configService, IDt_StationManagerRepository stationManagerRepository)
        {
            _taskRepository = taskRepository;
            _taskService = taskService;
            _sys_ConfigService = configService;
            _stationManagerRepository = stationManagerRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            /// ä¸»è¦è¯»å–对应的db块的偏移量获取上线点的要料信息从而生成任务至Task表
            Console.WriteLine("TaskAcquisition_Back2_Job正常进入....");
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                if (!device.IsConnected)
                {
                    return Task.CompletedTask;
                }
                device.Communicator.Read("10", 20);
            }
            return Task.CompletedTask;
        }
    }
}
ÏîÄ¿´úÂë/WIDESEA_WCSServer/WIDESEAWCS_Tasks/TaskAcquisition/TaskAcquisition_Front_Job.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_QuartzJob;
namespace WIDESEAWCS_Tasks
{
    /// <summary>
    /// ä»»åŠ¡èŽ·å– å‰åº•板 çš„任务
    /// </summary>
    ///
    [DisallowConcurrentExecution]
    public class TaskAcquisition_Front_Job : JobBase, IJob
    {
        private readonly ITaskRepository _taskRepository;
        private readonly ITaskService _taskService;
        private readonly ISys_ConfigService _sys_ConfigService;
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        public TaskAcquisition_Front_Job(ITaskRepository taskRepository, ITaskService taskService, ISys_ConfigService configService, IDt_StationManagerRepository stationManagerRepository)
        {
            _taskRepository = taskRepository;
            _taskService = taskService;
            _sys_ConfigService = configService;
            _stationManagerRepository = stationManagerRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            /// ä¸»è¦è¯»å–对应的db块的偏移量获取上线点的要料信息从而生成任务至Task表
            Console.WriteLine("TaskAcquisition_Front_Job正常进入....");
            return Task.CompletedTask;
        }
    }
}
ÏîÄ¿×ÊÁÏ/AGVЭÒé/¶Ô½ÓÎĵµ (AGV&WMS) _20260423.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/ÏîÄ¿·½°¸/Áã¼þºÅ¼°¶ÔÓ¦¹¤Î».pptx
Binary files differ