| | |
| | | onClick: function () { |
| | | } |
| | | }, |
| | | { |
| | | name: "æ¡ç æå°", |
| | | // icon: 'el-icon-upload2', |
| | | class: '', |
| | | value: 'printForm', |
| | | type: 'primary', |
| | | onClick: function () { |
| | | } |
| | | }, |
| | | ] |
| | | |
| | | export default buttons |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | var EmptyTrayOutboundBtn = this.buttons.find(x => x.value == "EmptyTrayOutbound"); |
| | | if (EmptyTrayOutboundBtn != null) { |
| | | EmptyTrayOutboundBtn.onClick = () => { |
| | |
| | | name: 'StockDetailByMateriel', |
| | | component: () => import('@/views/stock/stockInfoDetailByMaterielSum.vue') |
| | | } |
| | | ,{ |
| | | path:'/printForm', |
| | | name: 'printForm', |
| | | component: () => import('@/views/outbound/printForm.vue') |
| | | }, |
| | | ] |
| | | |
| | | export default viewgird |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="print-input-container"> |
| | | <!-- 页颿 é¢ --> |
| | | <div class="page-title">ç©ææ è¯å¡æå°åæ°è¾å
¥</div> |
| | | |
| | | <!-- 表ååºå --> |
| | | <el-card class="input-card"> |
| | | <el-form |
| | | ref="printFormRef" |
| | | :model="printForm" |
| | | :rules="formRules" |
| | | label-width="100px" |
| | | size="default" |
| | | > |
| | | <!-- ååå¸å± --> |
| | | <el-row :gutter="20"> |
| | | <!-- 第ä¸å --> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æå·" prop="materialCode"> |
| | | <el-input |
| | | v-model="printForm.materialCode" |
| | | placeholder="请è¾å
¥ç©æç¼ç " |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="åå" prop="materialName"> |
| | | <el-input |
| | | v-model="printForm.materialName" |
| | | placeholder="请è¾å
¥ç©æåç§°" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="è§æ ¼" prop="specification"> |
| | | <el-input |
| | | v-model="printForm.specification" |
| | | placeholder="请è¾å
¥ç©æè§æ ¼" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ¹å·" prop="batchNumber"> |
| | | <el-input |
| | | v-model="printForm.batchNumber" |
| | | placeholder="请è¾å
¥æ¹å·ï¼çæäºç»´ç ç¨ï¼" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ååº" prop="factory"> |
| | | <el-input |
| | | v-model="printForm.factory" |
| | | placeholder="请è¾å
¥ååºåç§°" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <!-- 第äºå --> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä¾åºåç¼ç " prop="supplierCode"> |
| | | <el-input |
| | | v-model="printForm.supplierCode" |
| | | placeholder="请è¾å
¥ä¾åºåç¼ç " |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="éè´åå·" prop="purchaseOrderNo"> |
| | | <el-input |
| | | v-model="printForm.purchaseOrderNo" |
| | | placeholder="请è¾å
¥éè´åå·" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ°é/æ»æ°" prop="quantityTotal"> |
| | | <el-input |
| | | v-model="printForm.quantityTotal" |
| | | placeholder="ä¾ï¼100/5000" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ¹æ¬¡" prop="batch"> |
| | | <el-input |
| | | v-model="printForm.batch" |
| | | placeholder="请è¾å
¥æ¹æ¬¡å·" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ¥æ" prop="date"> |
| | | <el-date-picker |
| | | v-model="printForm.date" |
| | | type="date" |
| | | placeholder="éæ©æ¥æ" |
| | | format="YYYY-MM-DD" |
| | | value-format="YYYY-MM-DD" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- æ¹éæ·»å ï¼å¯éï¼ --> |
| | | <el-form-item label="æå°ä»½æ°"> |
| | | <el-input-number |
| | | v-model="printCopyCount" |
| | | :min="1" |
| | | :max="50" |
| | | label="份æ°" |
| | | placeholder="请è¾å
¥æå°ä»½æ°" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <!-- æä½æé® --> |
| | | <el-form-item class="form-actions"> |
| | | <el-button type="primary" @click="submitForm">确认并æå¼æå°å¼¹çª</el-button> |
| | | <el-button @click="resetForm">é置表å</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- å¼å
¥æå°å¼¹çªç»ä»¶ --> |
| | | <print-view ref="printViewRef" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | // å¼å
¥æå°å¼¹çªç»ä»¶ |
| | | import printView from "@/extension/outbound/extend/printView.vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | |
| | | export default { |
| | | name: "PrintInputPage", |
| | | components: { printView }, |
| | | data() { |
| | | return { |
| | | // è¡¨åæ°æ®ï¼å¯¹åºprintViewæéçåæ°ï¼ |
| | | printForm: { |
| | | materialCode: "", // æå· |
| | | supplierCode: "", // ä¾åºåç¼ç |
| | | materialName: "", // åå |
| | | purchaseOrderNo: "", // éè´åå· |
| | | specification: "", // è§æ ¼ |
| | | quantityTotal: "", // æ°é/æ»æ° |
| | | batchNumber: "", // æ¹å·ï¼äºç»´ç å
å®¹ï¼ |
| | | batch: "", // æ¹æ¬¡ |
| | | factory: "", // ååº |
| | | date: "", // æ¥æï¼é»è®¤å½åæ¥æï¼ |
| | | }, |
| | | // æå°ä»½æ°ï¼æ¯ææ¹éçæå¤æ¡ç¸åæ°æ®ï¼ |
| | | printCopyCount: 1, |
| | | // 表åéªè¯è§å |
| | | formRules: { |
| | | materialCode: [{ required: true, message: "请è¾å
¥æå·", trigger: "blur" }], |
| | | materialName: [{ required: true, message: "请è¾å
¥åå", trigger: "blur" }], |
| | | batchNumber: [{ required: true, message: "请è¾å
¥æ¹å·", trigger: "blur" }], |
| | | date: [{ required: true, message: "è¯·éæ©æ¥æ", trigger: "change" }], |
| | | }, |
| | | }; |
| | | }, |
| | | mounted() { |
| | | // åå§åé»è®¤æ¥æä¸ºå½å¤© |
| | | const today = new Date(); |
| | | this.printForm.date = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, "0")}-${today.getDate().toString().padStart(2, "0")}`; |
| | | }, |
| | | methods: { |
| | | // æäº¤è¡¨åï¼æå¼æå°å¼¹çª |
| | | submitForm() { |
| | | this.$refs.printFormRef.validate((valid) => { |
| | | if (!valid) { |
| | | ElMessage.warning("请å®åå¿
填项åæäº¤"); |
| | | return; |
| | | } |
| | | |
| | | 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) { |
| | | console.error("æå¼æå°å¼¹çªå¤±è´¥ï¼", error); |
| | | ElMessage.error("æå¼æå°å¼¹çªå¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // é置表å |
| | | 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; |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .print-input-container { |
| | | padding: 20px; |
| | | max-width: 1000px; |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .page-title { |
| | | font-size: 20px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 20px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .input-card { |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .form-actions { |
| | | text-align: center; |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | .form-actions .el-button { |
| | | margin: 0 10px; |
| | | padding: 10px 20px; |
| | | } |
| | | |
| | | /* éé
å°å±å¹ */ |
| | | @media (max-width: 768px) { |
| | | .print-input-container { |
| | | padding: 10px; |
| | | } |
| | | |
| | | .el-form-item { |
| | | margin-bottom: 15px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | using Autofac.Core; |
| | | using MailKit.Search; |
| | | using Microsoft.Extensions.Logging; |
| | | using Microsoft.Extensions.Logging; |
| | | using SqlSugar; |
| | | using SqlSugar.Extensions; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Dynamic; |
| | | using System.Linq; |
| | | using System.Reflection; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using WIDESEA_Common.AllocateEnum; |
| | | using WIDESEA_Common.OrderEnum; |
| | | using WIDESEA_Core; |
| | |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.CodeConfigEnum; |
| | | using WIDESEA_Core.DB; |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_Core.Seed; |
| | | using WIDESEA_IAllocateService; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_IInboundService; |
| | | using WIDESEA_IOutboundService; |
| | | using WIDESEA_Model.Models; |
| | |
| | | public readonly IOutboundService _outboundService; |
| | | public readonly IRepository<Dt_AllocateOrder> _allocateOrderRepository; |
| | | public readonly IRepository<Dt_AllocateOrderDetail> _allocateOrderDetailRepository; |
| | | |
| | | private readonly IMaterielInfoService _materielInfoService; |
| | | public readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository; |
| | | |
| | | private readonly ILogger<AllocateService> _logger; |
| | |
| | | IRepository<Dt_AllocateOrder> allocateOrderRepository, |
| | | IRepository<Dt_AllocateOrderDetail> allocateOrderDetailRepository, |
| | | IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, |
| | | ILogger<AllocateService> logger) : base(BaseDal) |
| | | ILogger<AllocateService> logger, |
| | | IMaterielInfoService materielInfoService) : base(BaseDal) |
| | | { |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _inboundService = inboundService; |
| | |
| | | _allocateOrderDetailRepository = allocateOrderDetailRepository; |
| | | _logger = logger; |
| | | _inboundOrderDetailRepository = inboundOrderDetailRepository; |
| | | _materielInfoService = materielInfoService; |
| | | } |
| | | |
| | | public IRepository<Dt_AllocateOrder> Repository => BaseDal; |
| | |
| | | { |
| | | if (BaseDal.QueryFirst(x => x.UpperOrderNo == allocateOrder.UpperOrderNo) != null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"è°æ¨åå·éå¤"); |
| | | return WebResponseContent.Instance.Error($"{allocateOrder.UpperOrderNo}è°æ¨åå·éå¤"); |
| | | } |
| | | allocateOrder.OrderNo = CreateCodeByRule(nameof(RuleCodeEnum.AllocateOrderCodeRule)); |
| | | var materielCodes = allocateOrder.Details.Select(x => x.MaterielCode).Distinct().ToList(); |
| | | var materielInfos = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().Where(x => materielCodes.Contains(x.MaterielCode)).ToList(); |
| | | foreach (var item in allocateOrder.Details) |
| | | { |
| | | if (materielInfos.Any()) |
| | | { |
| | | item.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | } |
| | | Db.InsertNav(allocateOrder).Include(x => x.Details).ExecuteCommand(); |
| | | await AddInOutData(allocateOrder); |
| | | return WebResponseContent.Instance.OK(); |
| | |
| | | List<Dt_AllocateOrderDetail> allocateOrderDetails = new List<Dt_AllocateOrderDetail>(); |
| | | List<Dt_AllocateOrderDetail> updateAllocateOrderDetails = new List<Dt_AllocateOrderDetail>(); |
| | | List<int> detailIds = new List<int>(); |
| | | |
| | | var materielCodes = allocateOrder.Details.Select(x => x.MaterielCode).Distinct().ToList(); |
| | | var materielInfos = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().Where(x => materielCodes.Contains(x.MaterielCode)).ToList(); |
| | | |
| | | foreach (var item in model.Details) |
| | | { |
| | | if (string.IsNullOrEmpty(item.Barcode)) |
| | | { |
| | | |
| | | } |
| | | else |
| | | if (!string.IsNullOrEmpty(item.Barcode)) |
| | | { |
| | | Dt_AllocateOrderDetail? allocateOrderDetail = allocateOrder.Details.FirstOrDefault(x => x.Barcode == item.Barcode); |
| | | if (allocateOrderDetail == null) |
| | |
| | | BarcodeQty = (decimal)item.BarcodeQty, |
| | | OrderQuantity = item.OrderQuantity |
| | | }; |
| | | if (materielInfos.Any()) |
| | | { |
| | | allocateOrderDetail.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | allocateOrderDetails.Add(allocateOrderDetail); |
| | | } |
| | | else |
| | |
| | | allocateOrderDetail.BarcodeUnit = item.BarcodeUnit; |
| | | allocateOrderDetail.BarcodeQty = item.BarcodeQty; |
| | | allocateOrderDetail.OrderQuantity = item.OrderQuantity; |
| | | |
| | | if (materielInfos.Any()) |
| | | { |
| | | allocateOrderDetail.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | |
| | | updateAllocateOrderDetails.Add(allocateOrderDetail); |
| | | detailIds.Add(allocateOrderDetail.Id); |
| | |
| | | <ItemGroup> |
| | | <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" /> |
| | | <ProjectReference Include="..\WIDESEA_IAllocateService\WIDESEA_IAllocateService.csproj" /> |
| | | <ProjectReference Include="..\WIDESEA_IBasicService\WIDESEA_IBasicService.csproj" /> |
| | | <ProjectReference Include="..\WIDESEA_IInboundService\WIDESEA_IInboundService.csproj" /> |
| | | <ProjectReference Include="..\WIDESEA_IOutboundService\WIDESEA_IOutboundService.csproj" /> |
| | | <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" /> |
| | |
| | | { |
| | | ReqCode = Guid.NewGuid().ToString(), |
| | | ReqTime = DateTime.Now.ToString(), |
| | | BusinessType = "2", |
| | | BusinessType = "3", |
| | | FactoryArea = inboundOrder.FactoryArea, |
| | | OperationType = 1, |
| | | Operator = inboundOrder.Operator, |
| | |
| | | |
| | | private readonly static object _locker = new object(); |
| | | static List<LocationCache> locationCaches = new List<LocationCache>(); |
| | | private int locationCacheTime = 10; |
| | | private int locationCacheTime = 20; |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | |
| | | if (first != null) |
| | | { |
| | | locationCaches.Add(new LocationCache { LocationCode = first?.LocationCode, DateTime = DateTime.Now }); |
| | | |
| | | |
| | | using (var sugarClient = new SqlSugarClient(new ConnectionConfig |
| | | { |
| | |
| | | using WIDESEA_Core.CodeConfigEnum; |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_ICheckService; |
| | | using WIDESEA_IOutboundService; |
| | | using WIDESEA_Model.Models; |
| | |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly WebSocketServer _webSocketServer; |
| | | private readonly ILogger<ReCheckOrderService> _logger; |
| | | |
| | | private readonly IMaterielInfoService _materielInfoService; |
| | | public readonly IOutboundService _outboundService; |
| | | public IRepository<Dt_ReCheckOrder> Repository => BaseDal; |
| | | public ReCheckOrderService(IRepository<Dt_ReCheckOrder> BaseDal, IUnitOfWorkManage unitOfWorkManage, WebSocketServer webSocketServer, ILogger<ReCheckOrderService> logger, IOutboundService outboundService) : base(BaseDal) |
| | | public ReCheckOrderService(IRepository<Dt_ReCheckOrder> BaseDal, IUnitOfWorkManage unitOfWorkManage, WebSocketServer webSocketServer, ILogger<ReCheckOrderService> logger, IOutboundService outboundService, IMaterielInfoService materielInfoService) : base(BaseDal) |
| | | { |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _webSocketServer = webSocketServer; |
| | | _logger = logger; |
| | | _outboundService = outboundService; |
| | | _materielInfoService = materielInfoService; |
| | | } |
| | | |
| | | public async Task<WebResponseContent> ReceiveReCheckOrder(Dt_ReCheckOrder models, int operateType) |
| | |
| | | |
| | | if (BaseDal.QueryFirst(x => x.OrderNo == model.OrderNo) != null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åå·éå¤"); |
| | | return WebResponseContent.Instance.Error($"{model.OrderNo}åå·éå¤"); |
| | | } |
| | | |
| | | var materielInfo = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().First(x => model.MaterielCode.Equals(x.MaterielCode)); |
| | | |
| | | model.Creater = "MES"; |
| | | model.CreateDate = DateTime.Now; |
| | | model.MaterielName = materielInfo?.MaterielName ?? ""; |
| | | BaseDal.AddData(model); |
| | | var outboundOrders = ConvertToOutboundOrders(model); |
| | | |
| | |
| | | recheckOrder.FactoryArea = model.FactoryArea; |
| | | recheckOrder.Modifier = "MES"; |
| | | recheckOrder.ModifyDate = DateTime.Now; |
| | | |
| | | var materielInfo = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().First(x => model.MaterielCode.Equals(x.MaterielCode)); |
| | | recheckOrder.MaterielName= materielInfo?.MaterielName??""; |
| | | BaseDal.UpdateData(recheckOrder); |
| | | |
| | | if (isupdate) |
| | |
| | | </PropertyGroup> |
| | | |
| | | <ItemGroup> |
| | | <ProjectReference Include="..\WIDESEA_IBasicService\WIDESEA_IBasicService.csproj" /> |
| | | <ProjectReference Include="..\WIDESEA_ICheckService\WIDESEA_ICheckService.csproj" /> |
| | | <ProjectReference Include="..\WIDESEA_IOutboundService\WIDESEA_IOutboundService.csproj" /> |
| | | </ItemGroup> |
| | |
| | | |
| | | private IStockService _stockService; |
| | | private readonly IMaterialUnitService _materialUnitService; |
| | | private readonly IMaterielInfoService _materielInfoService; |
| | | private readonly IInboundOrderDetailService _inboundOrderDetailService; |
| | | private readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository; |
| | | private readonly IRepository<Dt_StockInfoDetail> _stockDetailRepository; |
| | |
| | | private readonly IRepository<Dt_StockInfo> _stockRepository; |
| | | public IRepository<Dt_InboundOrder> Repository => BaseDal; |
| | | |
| | | public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IMaterialUnitService materialUnitService, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_StockInfo> stockRepository, IRepository<Dt_LocationType> locationTypeRepository) : base(BaseDal) |
| | | public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IMaterialUnitService materialUnitService, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_StockInfo> stockRepository, IRepository<Dt_LocationType> locationTypeRepository, IMaterielInfoService materielInfoService) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | |
| | | _warehouseAreaRepository = warehouseAreaRepository; |
| | | _stockRepository = stockRepository; |
| | | _locationTypeRepository = locationTypeRepository; |
| | | _materielInfoService = materielInfoService; |
| | | } |
| | | |
| | | public async Task<WebResponseContent> ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType) |
| | |
| | | { |
| | | if (BaseDal.QueryFirst(x => x.UpperOrderNo == model.UpperOrderNo) != null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å
¥åºåå·éå¤"); |
| | | return WebResponseContent.Instance.Error($"{model.UpperOrderNo}å
¥åºåå·éå¤"); |
| | | } |
| | | } |
| | | |
| | | foreach (var model in models) |
| | | { |
| | | var materielCodes = model.Details.Select(x => x.MaterielCode).Distinct().ToList(); |
| | | var materielInfos = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().Where(x => materielCodes.Contains(x.MaterielCode)).ToList(); |
| | | |
| | | foreach (var item in model.Details) |
| | | { |
| | | var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync(item.MaterielCode, item.BarcodeQty); |
| | | item.Unit = purchaseToStockResult.Unit; |
| | | item.OrderQuantity = purchaseToStockResult.Quantity; |
| | | if (materielInfos.Any()) |
| | | { |
| | | item.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | } |
| | | if (model.OrderType != InOrderTypeEnum.AllocatInbound.ObjToInt()) |
| | | { |
| | |
| | | List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>(); |
| | | List<Dt_InboundOrderDetail> updateInboundOrderDetails = new List<Dt_InboundOrderDetail>(); |
| | | List<int> detailIds = new List<int>(); |
| | | var materielCodes = model.Details.Select(x => x.MaterielCode).Distinct().ToList(); |
| | | var materielInfos = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().Where(x => materielCodes.Contains(x.MaterielCode)).ToList(); |
| | | |
| | | foreach (var item in model.Details) |
| | | { |
| | | if (string.IsNullOrEmpty(item.Barcode)) |
| | | { |
| | | |
| | | } |
| | | else |
| | | if (!string.IsNullOrEmpty(item.Barcode)) |
| | | { |
| | | Dt_InboundOrderDetail? inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.Barcode == item.Barcode); |
| | | if (inboundOrderDetail == null) |
| | |
| | | var purchaseToStockResult = await _materialUnitService.ConvertPurchaseToStockAsync(item.MaterielCode, item.BarcodeQty); |
| | | inboundOrderDetail.Unit = purchaseToStockResult.Unit; |
| | | inboundOrderDetail.OrderQuantity = purchaseToStockResult.Quantity; |
| | | |
| | | if (materielInfos.Any()) |
| | | { |
| | | inboundOrderDetail.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | inboundOrderDetails.Add(inboundOrderDetail); |
| | | } |
| | | else |
| | | { |
| | | if (materielInfos.Any()) |
| | | { |
| | | inboundOrderDetail.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | inboundOrderDetail.lineNo = item.lineNo; |
| | | inboundOrderDetail.MaterielCode = item.MaterielCode; |
| | | inboundOrderDetail.SupplyCode = item.SupplyCode; |
| | |
| | | |
| | | public WebResponseContent UndoPalletGroup(string palletCode, string barcode = "") |
| | | { |
| | | |
| | | |
| | | if (string.IsNullOrWhiteSpace(palletCode)) |
| | | { |
| | | return WebResponseContent.Instance.Error("æçå·ä¸è½ä¸ºç©º"); |
| | | } |
| | | |
| | | |
| | | |
| | | try |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | // 2. æ¥è¯¢æçåºå主记å½ï¼é¿å
æ æ°æ®æå¼å¸¸ï¼ |
| | | var stock = _stockRepository.Db.Queryable<Dt_StockInfo>() |
| | |
| | | return WebResponseContent.Instance.Error($"æç{palletCode}䏿ªæ¾å°æ¡ç {barcode}çæç»è®°å½"); |
| | | } |
| | | |
| | | ResetInboundOrderStatus(new List<string> { targetDetail.OrderNo},new List<string> { targetDetail.Barcode}); |
| | | ResetInboundOrderStatus(new List<string> { targetDetail.OrderNo }, new List<string> { targetDetail.Barcode }); |
| | | // å é¤æå®æç» |
| | | _stockDetailRepository.DeleteData(targetDetail); |
| | | |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æçæ¤é失败ï¼{ex.Message}"); |
| | | } |
| | | } |
| | |
| | | if (!string.IsNullOrEmpty(options.Wheres)) |
| | | { |
| | | try |
| | | { |
| | | { |
| | | searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>(); |
| | | if (searchParametersList.Count > 0) |
| | | { |
| | |
| | | public string MaterielCode { get; set; } |
| | | |
| | | |
| | | public string MaterielName { get; set; } |
| | | /// <summary> |
| | | /// æ¹æ¬¡å· |
| | | /// </summary> |
| | |
| | | public string MaterielCode { get; set; } = null!; |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | public string MaterielName { get; set; } |
| | | |
| | | /// <summary> |
| | | /// å¤ æ³¨: |
| | | /// é»è®¤å¼: |
| | | ///</summary> |
| | |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return WebResponseContent.Instance.OK("忣æå", new |
| | | { |
| | | PickedQuantity = actualPickedQty, |
| | | Barcode = barcode, |
| | | MaterialCode = lockInfo.MaterielCode, |
| | | AutoSplitted = autoSplitResult != null, |
| | | RemainingStock = stockDetail.StockQuantity, |
| | | CurrentOutbound = stockDetail.OutboundQuantity, |
| | | // 妿æ¯èªå¨æå
ï¼è¿åç¸å
³ä¿¡æ¯ |
| | | UnallocatedCreated = autoSplitResult != null ? "æ¯" : "å¦" |
| | | }); |
| | | return WebResponseContent.Instance.OK("忣æå", autoSplitResult); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | _logger.LogError($"空箱ååºå¤±è´¥: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"空箱ååºå¤±è´¥ï¼{ex.Message}"); |
| | | _logger.LogError($"空箱ååºExecutePalletReturn失败: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"空箱ååºExecutePalletReturn失败ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | catch (Exception taskEx) |
| | | { |
| | | _logger.LogError($"ååºä»»å¡å建失败: {taskEx.Message}"); |
| | | _logger.LogError($"ååºä»»å¡CreateReturnTaskWithoutESSå建失败: {taskEx.Message}"); |
| | | // ä»»å¡å建失败ä¸å½±åæ°æ®ååº |
| | | } |
| | | _unitOfWorkManage.CommitTran(); |
| | |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | _logger.LogError($"ååºå¤±è´¥: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"ååºå¤±è´¥ï¼{ex.Message}"); |
| | | _logger.LogError($"ExecutePalletReturn ååºå¤±è´¥: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"ExecutePalletReturn ååºå¤±è´¥ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | |
| | | // å建ååºä»»å¡ï¼ä¸åéESSå½ä»¤ï¼ |
| | | var returnTaskInfo = await CreateEmptyPalletReturnTask(orderNo, palletCode, emptyStockInfo, currentTask); |
| | | |
| | | return WebResponseContent.Instance.OK("空æçååºæå"); |
| | | return WebResponseContent.Instance.OK("空æçååºæå", returnTaskInfo); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError($"空æçååºå¤±è´¥: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"空æçååºå¤±è´¥: {ex.Message}"); |
| | | _logger.LogError($"空æçååºå¤±è´¥ HandleEmptyPalletReturn: {ex.Message}"); |
| | | return WebResponseContent.Instance.Error($"空æçååºå¤±è´¥ HandleEmptyPalletReturn: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | /// <summary> |
| | | /// å走空箱 - ä¿®æ£çï¼æ£ç¡®å¤çæªåé
éå®è®°å½ |
| | | /// å走空箱 -æ£ç¡®å¤çæªåé
éå®è®°å½ |
| | | /// </summary> |
| | | public async Task<WebResponseContent> RemoveEmptyPallet(string orderNo, string palletCode) |
| | | { |
| | |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using Microsoft.Extensions.Logging; |
| | | using SqlSugar; |
| | | using WIDESEA_BasicService; |
| | | using WIDESEA_Common.AllocateEnum; |
| | | using WIDESEA_Common.OrderEnum; |
| | | using WIDESEA_Core; |
| | |
| | | { |
| | | private readonly IMapper _mapper; |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly IMaterielInfoService _materielInfoService; |
| | | public IRepository<Dt_OutboundOrder> Repository => BaseDal; |
| | | private readonly ILogger<OutboundOrderService> _logger; |
| | | private readonly IRepository<Dt_OutboundOrderDetail> _outboundOrderDetailRepository; |
| | | private readonly IMaterialUnitService _materialUnitService; |
| | | public OutboundOrderService(IRepository<Dt_OutboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> outboundOrderDetailRepository, ILogger<OutboundOrderService> logger, IMaterialUnitService materialUnitService) : base(BaseDal) |
| | | public OutboundOrderService(IRepository<Dt_OutboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> outboundOrderDetailRepository, ILogger<OutboundOrderService> logger, IMaterialUnitService materialUnitService, IMaterielInfoService materielInfoService) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _outboundOrderDetailRepository = outboundOrderDetailRepository; |
| | | _logger = logger; |
| | | _materialUnitService = materialUnitService; |
| | | _materielInfoService = materielInfoService; |
| | | } |
| | | |
| | | private int[] OrderTypes = new int[] { (int)InOrderTypeEnum.AllocatOutbound, (int)InOrderTypeEnum.InternalAllocat, (int)InOrderTypeEnum.ReCheck }; |
| | |
| | | |
| | | if (BaseDal.QueryFirst(x => x.UpperOrderNo == model.UpperOrderNo) != null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåå·éå¤"); |
| | | return WebResponseContent.Instance.Error($"{model.UpperOrderNo}åºåºåå·éå¤"); |
| | | } |
| | | |
| | | var materielCodes = model.Details.Select(x => x.MaterielCode).Distinct().ToList(); |
| | | var materielInfos = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().Where(x => materielCodes.Contains(x.MaterielCode)).ToList(); |
| | | |
| | | foreach (var item in model.Details) |
| | | { |
| | | var issueoStockResult = await _materialUnitService.ConvertFromToStockAsync(item.MaterielCode, item.BarcodeUnit, item.BarcodeQty); |
| | |
| | | item.OrderQuantity = issueoStockResult.Quantity; |
| | | var moveissueoStockResult = await _materialUnitService.ConvertFromToStockAsync(item.MaterielCode, item.BarcodeUnit, item.BarcodeMoveQty); |
| | | item.MoveQty = moveissueoStockResult.Quantity; |
| | | if (materielInfos.Any()) |
| | | { |
| | | item.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | |
| | | } |
| | | if (!OrderTypes.Contains(model.OrderType)) |
| | | { |
| | |
| | | List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>(); |
| | | List<Dt_OutboundOrderDetail> updateoutboundOrderDetails = new List<Dt_OutboundOrderDetail>(); |
| | | List<int> detailIds = new List<int>(); |
| | | |
| | | var materielCodes = model.Details.Select(x => x.MaterielCode).Distinct().ToList(); |
| | | var materielInfos = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().Where(x => materielCodes.Contains(x.MaterielCode)).ToList(); |
| | | |
| | | |
| | | foreach (var item in model.Details) |
| | | { |
| | | |
| | |
| | | var moveissueoStockResult = await _materialUnitService.ConvertFromToStockAsync(item.MaterielCode, item.BarcodeUnit, item.BarcodeMoveQty); |
| | | item.MoveQty = moveissueoStockResult.Quantity; |
| | | |
| | | if (materielInfos.Any()) |
| | | { |
| | | outboundOrderDetail.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | |
| | | outboundOrderDetails.Add(outboundOrderDetail); |
| | | } |
| | | else |
| | |
| | | outboundOrderDetail.OrderQuantity = issueoStockResult.Quantity; |
| | | var moveissueoStockResult = await _materialUnitService.ConvertFromToStockAsync(item.MaterielCode, item.BarcodeUnit, item.BarcodeMoveQty); |
| | | outboundOrderDetail.MoveQty = moveissueoStockResult.Quantity; |
| | | |
| | | if (materielInfos.Any()) |
| | | { |
| | | outboundOrderDetail.MaterielName = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode)?.MaterielName ?? ""; |
| | | } |
| | | |
| | | updateoutboundOrderDetails.Add(outboundOrderDetail); |
| | | detailIds.Add(outboundOrderDetail.Id); |
| | |
| | | /// </summary> |
| | | public class OutboundPickingService : ServiceBase<Dt_PickingRecord, IRepository<Dt_PickingRecord>>, IOutboundPickingService |
| | | { |
| | | #region æé 彿° |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | public IRepository<Dt_PickingRecord> Repository => BaseDal; |
| | | |
| | |
| | | _interfaceLog = interfaceLog; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region æ¥è¯¢æ¹æ³ |
| | | // è·åæªæ£éå表 |
| | |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | |
| | | #region è¾
婿¹æ³ |
| | | /// <summary> |
| | | /// ç»ä¸åææçç¶æ - è¿åæçç宿´ç¶æä¿¡æ¯ |
| | |
| | | |
| | | return result; |
| | | } |
| | | |
| | | |
| | | private async Task<string> GenerateNewBarcode() |
| | | { |
| | |
| | | } |
| | | return WebResponseContent.Instance.OK("æ£é确认æå", new { SplitResults = new List<SplitResult>() }); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | |
| | | #region èæåºå
¥åº |
| | |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | } |
| | | |
| | | #region æ¯æç±»å®ä¹ |
| | |
| | | |
| | | return new PageGridData<StockInfoDetailWithPalletDto> |
| | | { |
| | | Rows = dtoList, |
| | | Rows = dtoList.Where(x=>x.PalletCode != "æ æçç¼å·").ToList(), |
| | | Total = pageData.Total, |
| | | Summary = pageData.Summary |
| | | }; |
| | |
| | | { |
| | | await Db.Deleteable(task).ExecuteCommandAsync(); |
| | | } |
| | | _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); |
| | | |
| | | _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, WIDESEA_Common.StockEnum.StockChangeType.MaterielGroup); |
| | | try |
| | | { |
| | | _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); |
| | | |
| | | _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, WIDESEA_Common.StockEnum.StockChangeType.MaterielGroup); |
| | | } |
| | | catch(Exception ex) |
| | | { |
| | | _logger.LogInformation($"InboundTaskCompleted AddLocationStatusChangeRecord : {ex.Message} " ); |
| | | } |
| | | try |
| | | { |
| | | foreach (var inboundOrder in inboundOrders) |
| | | { |
| | |
| | | { |
| | | await Db.Deleteable(task).ExecuteCommandAsync(); |
| | | } |
| | | _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); |
| | | |
| | | try |
| | | { |
| | | _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); |
| | | } |
| | | catch(Exception ex) |
| | | { |
| | | _logger.LogInformation($"InEmptyTaskCompleted AddLocationStatusChangeRecord : {ex.Message} "); |
| | | } |
| | | |
| | | if (outboundOrder != null) |
| | | { |
| | |
| | | { |
| | | await Db.Deleteable(task).ExecuteCommandAsync(); |
| | | } |
| | | // è®°å½è´§ä½ç¶æåæ´ |
| | | _locationStatusChangeRecordService.AddLocationStatusChangeRecord( |
| | | locationInfo, |
| | | beforelocationStatus, |
| | | StockChangeType.Inbound.ObjToInt(), |
| | | "", |
| | | task.TaskNum |
| | | ); |
| | | |
| | | await RecalculateOrderStatus(task.OrderNo); |
| | | |
| | | try |
| | | { |
| | | // è®°å½è´§ä½ç¶æåæ´ |
| | | _locationStatusChangeRecordService.AddLocationStatusChangeRecord( |
| | | locationInfo, |
| | | beforelocationStatus, |
| | | StockChangeType.Inbound.ObjToInt(), |
| | | "", |
| | | task.TaskNum |
| | | ); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogInformation($"InPickTaskCompleted AddLocationStatusChangeRecord : {ex.Message} "); |
| | | } |
| | | |
| | | _logger.LogInformation($"æçååºå®æå¤çæå - ä»»å¡å·: {task.TaskNum}, æç: {task.PalletCode}, 订å: {task.OrderNo}"); |
| | | _ = Task.Run(async () => |
| | |
| | | _stockRepository.Db.Deleteable(stockInfo).ExecuteCommand(); |
| | | } |
| | | _stockService.StockInfoService.DeleteData(stockInfo); |
| | | _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); |
| | | |
| | | try |
| | | { |
| | | _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo?.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError($"TaskService OutEmptyTaskCompleted AddLocationStatusChangeRecord: {ex.Message} "); |
| | | } |
| | | return await Task.FromResult(WebResponseContent.Instance.OK()); |
| | | |
| | | } |
| | |
| | | .WriteTo.File( // é
ç½®è¾åºå°æä»¶ |
| | | path: "logs/log-.txt", // æ¥å¿æä»¶è·¯å¾ï¼ä¼èªå¨å建 logs æä»¶å¤¹ |
| | | rollingInterval: RollingInterval.Day, // æå¤©æ»å¨æ¥å¿æä»¶ |
| | | retainedFileCountLimit: 7, // æå¤ä¿ç7å¤©çæ¥å¿ |
| | | retainedFileCountLimit: 365, // æå¤ä¿ç7å¤©çæ¥å¿ |
| | | outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" |
| | | ) |
| | | .CreateLogger(); |