647556386
2025-04-10 c57ec7977738765a3a813d73f20e09a89867e39b
前端页面更新
已修改12个文件
已添加1个文件
289 ■■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/TaskController.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/config/buttons.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/basic/extend/GetOrderQuantityView.vue 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/APIEnum/APIEnum.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IPurchaseOrderDetailService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/PurchaseOrderDetailService.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/PurchaseOrderDetailController.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -273,5 +273,12 @@
        /// </summary>
        /// <returns></returns>
        WebResponseContent AgvBoxApplyPass(AgvCTUCancelDTO applyPassDTO, APIEnum SecureReply = APIEnum.AGV_CTUCancelTask);
        /// <summary>
        /// æŽ¥å—WMS手动完成任务
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent RecWMSTaskCompleted(int taskNum);
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/TaskController.cs
@@ -92,5 +92,10 @@
        //        return WebResponseContent.Instance.Error(ex.Message);
        //    }
        //}
        [HttpPost, HttpGet, Route("RecWMSTaskCompleted"), AllowAnonymous]
        public WebResponseContent RecWMSTaskCompleted(int taskNum)
        {
            return Service.RecWMSTaskCompleted(taskNum);
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -844,5 +844,27 @@
        {
            return BaseDal.QueryFirst(x => x.PalletCode == PalletCode && x.SourceAddress == locationCode && (x.TaskState == (int)TaskStatusEnum.SC_Execute || x.TaskState == (int)TaskStatusEnum.SC_Executing));
        }
        /// <summary>
        /// æŽ¥å—WMS手动完成任务
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent RecWMSTaskCompleted(int taskNum)
        {
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null)
                {
                    task.TaskState = TaskStatusEnum.Finish.ObjToInt();
                    BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.人工完成);
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/config/buttons.js
@@ -93,9 +93,10 @@
    }
},
{
    name: "手 åЍ å®Œ æˆ",
    name: "ä»» åŠ¡ æ‰‹ åЍ å®Œ æˆ",
    icon: '',
    class: '',
    type: 'success',
    value: 'TaskHandCompleted',
    onClick: function () {
    }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/basic/extend/GetOrderQuantityView.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
<template>
    <vol-box
      :lazy="true"
      v-model="model"
      title="选择采购单最大数量"
      :width="280"
      :padding="0"
    >
      <div>
        <div>
          <!-- æœç´¢é…ç½® -->
          <div class="search-form">
            <label>采购单数量:</label>
            <el-input style="width: 160px" v-model="MaterialCode"></el-input>
          </div>
          <el-table
            ref="singleTable"
            :data="filteredData"
            style="width: 100%; height: 100%"
            highlight-current-row
            height="500px"
            @selection-change="handleSelectionChange"
          >
            >
            <el-table-column type="selection" width="55"> </el-table-column>
            <el-table-column
              v-for="(item, index) in tableColumns.filter((x) => !x.hidden)"
              :key="index"
              :prop="item.prop"
              :label="item.title"
              align="center"
            >
            </el-table-column>
          </el-table>
        </div>
      </div>
      <template #footer>
        <div><el-button type="primary" @click="onSelect">确认</el-button></div>
      </template>
    </vol-box>
  </template>
  <script>
  import VolBox from "@/components/basic/VolBox.vue";
  /******注意:如果出现提示没有权限的问题,见后台开发文档上的【重写后台权限】*****/
  //这里使用的vue2语法,也可以写成vue3语法
  export default {
    components: {
      "vol-box": VolBox,
    },
    methods: {},
    data() {
      return {
        model: false, //弹出框
        wareId: null,
        showDetialBox: false,
        MaterialCode:null,
        selection:null,
        tableData: [],
        filteredData: [],
        tableColumns: [
          {
            prop: "quantity",
            title: "采购单数量",
            type: "string",
          },
        ],
      };
    },
    watch: {
      MaterialCode(newVal) {
        this.filterLocalData(newVal);
      }
    },
    methods: {
      open(val) {
        //打开主表选择数据
        this.model = true;
        this.wareId=val;
        this.getData();
      },
      filterLocalData(code) {
        if (code) {
          this.filteredData = this.tableData.filter((item) => {
              return item.quantity.includes(code);
          });
          console.log(this.filteredData.length);
          console.log(this.tableData.length);
        } else {
          this.filteredData = [...this.tableData]; // é‡ç½®ä¸ºå®Œæ•´æ•°æ®
        }
      },
      handleSelectionChange(val) {
          this.selection = val;
          if (this.selection.length > 1) {
              this.$message.error("仅选择一条数据");
              // æ¸…空选中的第一条数据
              this.$refs.singleTable.clearSelection();
          }
          console.log(this.selection);
      },
      getData() {
        this.http
          .post(
            "/api/PurchaseOrderDetail/GetOrderQuantity?purchaseOrderNo="  + this.wareId,
            null,
            "查询中"
          )
          .then((x) => {
            this.tableData=x.data.map((i) => ({
              "quantity":i
            }))
            this.filteredData=x.data.map((i) => ({
              "quantity":i
            }))
          });
      },
      onSelect() {
        if (!this.selection) {
          return this.$message.error("请选择数据");
        }
        this.$emit("parentCall", ($parent) => {
          //如:回写编辑表单数据
          $parent.editFormFields.quantity = this.selection[0].quantity;
          this.model = false;
        });
        this.MaterialCode = null;
        this.tableData = [];
        this.filteredData = [];
      },
    },
  };
  </script>
  <style lang="less" scoped>
  .search-form {
    display: flex;
    padding: 10px;
    line-height: 34px;
    button {
      margin-left: 10px;
    }
  }
  </style>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.js
@@ -2,6 +2,7 @@
import gridBody from './extend/materielcodeprintView.vue'
import modelHeader from './extend/materielcodeSelectView.vue'
import modelBody from './extend/purchaseOrderNoSelectView.vue'
import modelFooter from './extend/GetOrderQuantityView.vue'
let extension = {
  components: {
    //查询界面扩展组件
@@ -11,7 +12,7 @@
    //新建、编辑弹出框扩展组件
    modelHeader: modelHeader,
    modelBody: modelBody,
    modelFooter: ''
    modelFooter: 'modelFooter'
  },
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
@@ -70,6 +71,22 @@
            }
          });
        });
        this.editFormOptions.forEach((option) => {
          option.forEach((item) => {
            if (item.field == 'quantity') {
              //初始化弹出框选择器配置
              item.extra = {
                icon: 'el-icon-zoom-out', //显示图标
                text: '采购单最大数量', //显示文本
                style: 'color: #3a8ee6;font-size: 13px;cursor: pointer;',
                //触发事件
                click: (item) => {
                  this.$refs.modelFooter.open(this.editFormFields.purchaseOrderNo);
                }
              };
            }
          });
        });
        // warehouseIdOption.onChange = (val, option) => {
        //   this.editFormFields.materielCode = "";
        //   materielCodeOption.data = [];
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js
@@ -39,20 +39,27 @@
      let TaskHandCompletedBtn = this.buttons.find(x => x.value == 'TaskHandCompleted');
      if (TaskHandCompletedBtn) {
        TaskHandCompletedBtn.onClick = function () {
          let rows = this.$refs.table.getSelected();
          if (rows.length == 0) return this.$error("请选择数据!");
          if (rows.length > 1) return this.$error("请选择一条数据!");
          var param = rows[0].taskNum;
          this.http
            .post("api/Task/TaskCompleted?taskNum="+param, "数据处理中...")
            .then((x) => {
              if (x.status) {
                this.$Message.success('任务手动完成');
                this.refresh();
              } else {
                return this.$error(x.message);
              }
            });
          this.$confirm("是否确认完成任务","手动任务完成警告",{
              confirmButtonText: "确定",
              cancelButtonText: "取消",
              type: "warning",
              center: true,
              }).then(() => {
                let rows = this.$refs.table.getSelected();
                if (rows.length == 0) return this.$error("请选择数据!");
                if (rows.length > 1) return this.$error("请选择一条数据!");
                var param = rows[0].taskNum;
                this.http
                .post("api/Task/TaskCompleted?taskNum="+param, "数据处理中...")
                .then((x) => {
                    if (x.status) {
                    this.$Message.success('任务手动完成');
                    this.refresh();
                  } else {
                    return this.$error(x.message);
                  }
                });
              });
        }
      }
      },
´úÂë¹ÜÀí/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue
@@ -71,7 +71,7 @@
        {
          title: "数量",
          field: "quantity",
          required: true,
          type:"int"
        },
      ],
      [
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/APIEnum/APIEnum.cs
@@ -46,6 +46,11 @@
        /// åº“存板出库
        /// </summary>
        [Description("库存板出库")]
        WMS_MES_ProductOutBound
        WMS_MES_ProductOutBound,
        /// <summary>
        /// å›žè°ƒWCS任务完成
        /// </summary>
        [Description("回调WCS任务完成")]
        FeedBackWCSTaskCompleted
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IPurchaseOrderDetailService.cs
@@ -14,5 +14,7 @@
    {
        WebResponseContent GetPurchaseOrderDetailMaterielCode(int warehouseId);
        WebResponseContent GetPurchaseOrderNos(string materielCode);
        WebResponseContent GetOrderQuantity(string purchaseOrderNo);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/PurchaseOrderDetailService.cs
@@ -50,5 +50,18 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent GetOrderQuantity(string purchaseOrderNo)
        {
            try
            {
                List<Dt_PurchaseOrder> purchaseOrders = BaseDal.Db.Queryable<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == purchaseOrderNo).ToList();
                List<float> orderQuantity = purchaseOrders.Select(x => x.OrderQuantity).ToList();
                return WebResponseContent.Instance.OK(data: orderQuantity);
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Completed.cs
@@ -4,6 +4,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.APIEnum;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OtherEnum;
@@ -29,14 +30,17 @@
                }
                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                {
                    FeedBackWCSTaskCompleted(taskNum);
                    return InboundTaskCompleted(taskNum);
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                {
                    FeedBackWCSTaskCompleted(taskNum);
                    return OutboundTaskCompleted(taskNum);
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
                {
                    FeedBackWCSTaskCompleted(taskNum);
                    return RelocationTaskCompleted(task);
                }
                else
@@ -110,5 +114,25 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent FeedBackWCSTaskCompleted(int taskNum)
        {
            try
            {
                Dt_ApiInfo? url = _apiInfoRepository.QueryData(x => x.ApiCode == APIEnum.FeedBackWCSTaskCompleted.ToString()).First();
                string? apiAddrss = url.ApiAddress;
                if (string.IsNullOrEmpty(apiAddrss))
                {
                    return WebResponseContent.Instance.Error($"{taskNum},未找到WCS任务完成接口,请检查接口配置");
                }
                string responseStr = HttpHelper.Get(apiAddrss + "?taskNum=" + taskNum);
                WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? WebResponseContent.Instance.Error("未找到任务完成返回值");
                return content;
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/PurchaseOrderDetailController.cs
@@ -28,5 +28,11 @@
        {
            return Service.GetPurchaseOrderNos(materielCode);
        }
        [HttpPost, HttpGet, Route("GetOrderQuantity"), AllowAnonymous]
        public WebResponseContent GetOrderQuantity(string purchaseOrderNo)
        {
            return Service.GetOrderQuantity(purchaseOrderNo);
        }
    }
}