647556386
2026-01-27 036db6cdb6bd7818fc14d3970255d31938fe92a7
Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215
已添加1个文件
已修改7个文件
209 ■■■■ 文件已修改
项目代码/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/outbound/printForm.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/PrintFromDataDTO.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundController.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue
@@ -117,13 +117,13 @@
      ],
      [
        {
          title: "创建方式",
          field: "createType",
          title: "回传MES状态",
          field: "returnToMESStatus",
          type: "select",
          dataKey: "createType",
          dataKey: "outboundReturnToMESStatus",
          data: [],
        },
        { title: "创建者", field: "creater", type: "like" },
        { title: "物料编号", field: "materielCode", type: "like" },
        { title: "创建时间", field: "createDate", type: "datetime" },
      ],
    ]);
@@ -196,7 +196,7 @@
        field: "returnToMESStatus",
        title: "回传MES状态",
        width: 120,
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" },{ key: 5, value: "无需回传" }] },
        bind: { key: "outboundReturnToMESStatus", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" },{ key: 5, value: "无需回传" }] },
      },
      {
        field: "factoryArea",
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/printForm.vue
@@ -45,6 +45,8 @@
                v-model="printForm.barcode"
                placeholder="请输入批号(生成二维码用)"
                clearable
                @keyup.enter="fetchBarcodeData"
                :loading="fetchingData"
              />
            </el-form-item>
@@ -57,7 +59,7 @@
            </el-form-item>
          </el-col>
          <!-- ç¬¬äºŒåˆ— -->
          <el-col :span="12">
            <el-form-item label="供应商编码" prop="suplierCode">
              <el-input
@@ -104,7 +106,7 @@
          </el-col>
        </el-row>
        <!-- æ‰¹é‡æ·»åŠ ï¼ˆå¯é€‰ï¼‰ -->
        <el-form-item label="打印份数">
          <el-input-number
            v-model="printCopyCount"
@@ -115,7 +117,7 @@
          />
        </el-form-item>
        <!-- æ“ä½œæŒ‰é’® -->
        <el-form-item class="form-actions">
          <el-button type="primary" @click="submitForm">确认并打开打印弹窗</el-button>
          <el-button @click="resetForm">重置表单</el-button>
@@ -123,52 +125,87 @@
      </el-form>
    </el-card>
    <!-- å¼•入打印弹窗组件 -->
    <print-view ref="printViewRef" />
  </div>
</template>
<script>
// å¼•入打印弹窗组件
import printView from "@/extension/outbound/extend/printView.vue";
import { ElMessage } from "element-plus";
import http from '@/api/http.js'
export default {
  name: "PrintInputPage",
  components: { printView },
  data() {
    return {
      // è¡¨å•数据(对应printView所需的参数)
      printForm: {
        materialCode: "", // æ–™å·
        suplierCode: "", // ä¾›åº”商编码
        materialName: "", // å“å
        pruchaseOrderNo: "", // é‡‡è´­å•号
        materialSpec: "", // è§„æ ¼
        quantity: "", // æ•°é‡/总数
        barcode: "", // æ‰¹å·ï¼ˆäºŒç»´ç å†…容)
        batchNo: "", // æ‰¹æ¬¡
        factoryArea: "", // åŽ‚åŒº
        date: "", // æ—¥æœŸï¼ˆé»˜è®¤å½“前日期)
        materialCode: "",
        suplierCode: "",
        materialName: "",
        pruchaseOrderNo: "",
        materialSpec: "",
        quantity: "",
        barcode: "",
        batchNo: "",
        factoryArea: "",
        date: "",
      },
      // æ‰“印份数(支持批量生成多条相同数据)
      printCopyCount: 1,
      // è¡¨å•验证规则
      formRules: {
        materialCode: [{ required: true, message: "请输入料号", trigger: "blur" }],
        materialName: [{ required: true, message: "请输入品名", trigger: "blur" }],
        barcode: [{ required: true, message: "请输入批号", trigger: "blur" }],
        date: [{ required: true, message: "请选择日期", trigger: "change" }],
      },
      fetchingData: false
    };
  },
  mounted() {
    // åˆå§‹åŒ–默认日期为当天
    const today = new Date();
    this.printForm.date = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, "0")}-${today.getDate().toString().padStart(2, "0")}`;
  },
  methods: {
    // æäº¤è¡¨å•,打开打印弹窗
    async fetchBarcodeData() {
      if (!this.printForm.barcode.trim()) {
        return;
      }
      try {
        this.fetchingData = true;
        const response = await http.post(
          `/api/Outbound/PrintFromData?barcode=` + this.printForm.barcode.trim()
        );
        const data = response.data;
        if (data) {
          this.printForm.materialCode = data.materialCode || "";
          this.printForm.suplierCode = data.suplierCode || "";
          this.printForm.materialName = data.materialName || "";
          this.printForm.pruchaseOrderNo = data.pruchaseOrderNo || "";
          this.printForm.materialSpec = data.materialSpec || "";
          this.printForm.quantity = data.quantity || "";
          this.printForm.batchNo = data.batchNo || "";
          this.printForm.factoryArea = data.factoryArea || "";
          ElMessage.success("已根据批号自动填充数据");
        } else {
          ElMessage.info("未查询到该批号对应的物料数据");
        }
      } catch (error) {
        console.error("获取批号数据失败:", error);
        ElMessage.error("获取数据失败,请检查网络或批号是否正确");
      } finally {
        this.fetchingData = false;
      }
    },
    submitForm() {
      this.$refs.printFormRef.validate((valid) => {
        if (!valid) {
@@ -177,13 +214,10 @@
        }
        try {
          // æž„造打印数据(支持多份)
          const printData = [];
          for (let i = 0; i < this.printCopyCount; i++) {
            printData.push({ ...this.printForm });
          }
          // è°ƒç”¨printView的open方法,传递参数并打开弹窗
          this.$refs.printViewRef.open(printData);
          ElMessage.success(`已生成 ${this.printCopyCount} ä»½æ‰“印数据,即将打开打印弹窗`);
        } catch (error) {
@@ -193,10 +227,9 @@
      });
    },
    // é‡ç½®è¡¨å•
    resetForm() {
      this.$refs.printFormRef.resetFields();
      // é‡ç½®åŽæ¢å¤é»˜è®¤æ—¥æœŸ
      const today = new Date();
      this.printForm.date = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, "0")}-${today.getDate().toString().padStart(2, "0")}`;
      this.printCopyCount = 1;
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/PrintFromDataDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO.Outbound
{
    public class PrintFromDataDTO
    {
        public string materialCode { get; set; }
        public string materialName { get; set; }
        public string materialSpec { get; set; }
        public string factoryArea { get; set; }
        public string suplierCode { get;set; }
        public string pruchaseOrderNo { get; set; }
        public decimal quantity { get; set; }
        public string batchNo { get; set; }
        public DateTime date { get; set; }
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundService.cs
@@ -68,5 +68,7 @@
        /// <param name="orderNo"></param>
        /// <returns></returns>
        WebResponseContent RecheckPicking(RecheckPickingDTO pickingDTO);
        WebResponseContent PrintFromData(string barcode);
    }
}
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs
@@ -177,6 +177,12 @@
                    return content.Error($"该库区{palletDto.locationType}不存在空闲库位");
                }
                var nullpallet =_stockInfoRepository.QueryFirst(x => x.PalletType == -1 && x.PalletCode == palletDto.PalletCode);
                if (nullpallet != null)
                {
                    return content.Error($"该托盘{palletDto.PalletCode}已经进行空托组盘,不能在进行组盘");
                }
                foreach (var item in details)
                {
                    var datevaliDate = _inboundOrderRepository.Db.Queryable<Dt_MaterialExpirationDate>().Where(x => x.MaterialCode.Contains(item.MaterielCode.Substring(0, 6))).First();
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs
@@ -331,8 +331,6 @@
        public override PageGridData<Dt_OutboundOrder> GetPageData(PageDataOptions options)
        {
            string wheres = ValidatePageOptions(options);
            //获取排序字段
            Dictionary<string, SqlSugar.OrderByType> orderbyDic = GetPageDataSort(options, TProperties);
            List<OrderByModel> orderByModels = new List<OrderByModel>();
            foreach (var item in orderbyDic)
@@ -345,7 +343,7 @@
                orderByModels.Add(orderByModel);
            }
            ISugarQueryable<Dt_OutboundOrder> sugarQueryable1 = BaseDal.Db.Queryable<Dt_OutboundOrder>().Includes(x => x.Details);
            int totalCount = 0;
            List<SearchParameters> searchParametersList = new List<SearchParameters>();
            if (!string.IsNullOrEmpty(options.Wheres))
@@ -354,11 +352,50 @@
                {
                    searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
                    options.Filter = searchParametersList;
                    if (searchParametersList.Count > 0)
                    {
                        var materielCodeParam = searchParametersList.FirstOrDefault(x =>
                    x.Name.Equals("materielCode", StringComparison.OrdinalIgnoreCase));
                        if (materielCodeParam != null && !string.IsNullOrEmpty(materielCodeParam.Value?.ToString()))
                        {
                            string materielCode = materielCodeParam.Value.ToString().Trim();
                            sugarQueryable1 = sugarQueryable1.Where(x =>
                                x.Details.Any(d => d.MaterielCode.Contains(materielCode)));
                        }
                        var upperOrderNoParam = searchParametersList.FirstOrDefault(x =>
                            x.Name.Equals(nameof(Dt_OutboundOrder.UpperOrderNo).FirstLetterToLower(), StringComparison.OrdinalIgnoreCase));
                        if (upperOrderNoParam != null && !string.IsNullOrEmpty(upperOrderNoParam.Value?.ToString()))
                        {
                            string upperOrderNo = upperOrderNoParam.Value.ToString().Trim();
                            sugarQueryable1 = sugarQueryable1.Where(x => x.UpperOrderNo.Contains(upperOrderNo));
                        }
                        var orderNoParam = searchParametersList.FirstOrDefault(x =>
                            x.Name.Equals(nameof(Dt_OutboundOrder.OrderNo).FirstLetterToLower(), StringComparison.OrdinalIgnoreCase));
                        if (orderNoParam != null && !string.IsNullOrEmpty(orderNoParam.Value?.ToString()))
                        {
                            string orderNo = orderNoParam.Value.ToString().Trim();
                            sugarQueryable1 = sugarQueryable1.Where(x => x.OrderNo.Contains(orderNo));
                        }
                        var orderStatusParam = searchParametersList.FirstOrDefault(x =>
                            x.Name.Equals(nameof(Dt_OutboundOrder.OrderStatus).FirstLetterToLower(), StringComparison.OrdinalIgnoreCase));
                        if (orderStatusParam != null && !string.IsNullOrEmpty(orderStatusParam.Value?.ToString()))
                        {
                            string orderStatus = orderStatusParam.Value.ToString().Trim();
                            sugarQueryable1 = sugarQueryable1.Where(x => x.OrderStatus.Equals(orderStatus));
                        }
                        var returnToMESStatusParam = searchParametersList.FirstOrDefault(x =>
                            x.Name.Equals(nameof(Dt_OutboundOrder.ReturnToMESStatus).FirstLetterToLower(), StringComparison.OrdinalIgnoreCase));
                        if (returnToMESStatusParam != null && !string.IsNullOrEmpty(returnToMESStatusParam.Value?.ToString()))
                        {
                            string returnToMESStatus = returnToMESStatusParam.Value.ToString().Trim();
                            sugarQueryable1 = sugarQueryable1.Where(x => x.ReturnToMESStatus.Equals(returnToMESStatus));
                        }
                    }
                }
                catch { }
            }
            var data = BaseDal.Db.Queryable<Dt_OutboundOrder>()
                .WhereIF(!wheres.IsNullOrEmpty(), wheres)
            var data = sugarQueryable1
                .Where(x => x.OrderType == 0 || x.OrderType == 116)
                .OrderBy(orderByModels)
                .ToPageList(options.Page, options.Rows, ref totalCount);
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs
@@ -22,6 +22,7 @@
using WIDESEA_DTO.Base;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.CalcOut;
using WIDESEA_DTO.Outbound;
using WIDESEA_DTO.ReturnMES;
using WIDESEA_IBasicService;
using WIDESEA_IOutboundService;
@@ -62,6 +63,8 @@
        private readonly IESSApiService _eSSApiService;
        private readonly IRepository<Dt_AllocateOrder> _allocateOrderRepository;
        private readonly IRepository<Dt_AllocateMaterialInfo> _allocateMaterialInfoRepository;
        public readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository;
        public readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
        private Dictionary<string, string> stations = new Dictionary<string, string>
        {
@@ -75,7 +78,7 @@
            {"3-1","3-5" },
        };
        public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository, ILocationInfoService locationInfoService, IESSApiService eSSApiService, IRepository<Dt_AllocateOrder> allocateOrderRepository, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfoRepository)
        public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository, ILocationInfoService locationInfoService, IESSApiService eSSApiService, IRepository<Dt_AllocateOrder> allocateOrderRepository, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfoRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
@@ -98,6 +101,35 @@
            _eSSApiService = eSSApiService;
            _allocateOrderRepository = allocateOrderRepository;
            _allocateMaterialInfoRepository = allocateMaterialInfoRepository;
            _inboundOrderDetailRepository = inboundOrderDetailRepository;
            _inboundOrderRepository = inboundOrderRepository;
        }
        public WebResponseContent PrintFromData (string barcode)
        {
            var detail = _inboundOrderDetailRepository.QueryFirst(x => x.Barcode == barcode);
            if(detail == null)
            {
                return WebResponseContent.Instance.Error();
            }
            var inbound = _inboundOrderRepository.QueryFirst(x=>x.Id ==  detail.OrderId);
            if(inbound == null)
            {
                return WebResponseContent.Instance.Error();
            }
            var printFormData = new PrintFromDataDTO {
                materialCode = detail.Barcode,
                materialName = detail.MaterielName,
                materialSpec = detail.Unit,
                batchNo = detail.BatchNo,
                pruchaseOrderNo = inbound.UpperOrderNo,
                factoryArea = inbound.FactoryArea,
                suplierCode = inbound.SupplierId,
                quantity = detail.BarcodeQty
            };
            return WebResponseContent.Instance.OK(data:printFormData);
        }
        #region å‡ºåº“分配
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundController.cs
@@ -120,5 +120,11 @@
        {
            return _outboundService.RecheckPicking(pickingDTO);
        }
        [HttpPost, Route("PrintFromData"), AllowAnonymous]
        public WebResponseContent PrintFromData(string barcode)
        {
            return _outboundService.PrintFromData(barcode);
        }
    }
}