liulijun
2026-03-10 7583978e1c6046b4cdfe9e1a18efd328a3b73e5d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core;
using WIDESEA_DTO.MES;
using WIDESEA_IBasicRepository;
using WIDESEA_IBasicService;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_IRecordService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
using WIDESEA_DTO.ERP;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core.Helper;
using System.Reflection;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Http;
using HslCommunication;
using SqlSugar;
using WIDESEA_Core.Enums;
 
namespace WIDESEA_OutboundService
{
    public class OutSGOrderService : ServiceBase<Dt_OutSGOrder, IOutSGOrderRepository>, IOutSGOrderService
    {
        public IOutSGOrderRepository Repository => BaseDal;
        private IBasicRepository _basicRepository;
        private IStockService _stockService;
        private IBasicService _basicService;
        private ILocationStatusChangeRecordService _locationStatusChangeRecordService;
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
 
        public OutSGOrderService(IOutSGOrderRepository BaseDal, IBasicRepository basicRepository, IStockService stockService, IBasicService basicService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IMapper mapper,IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _basicRepository = basicRepository;
            _stockService = stockService;
            _basicService = basicService;
            _locationStatusChangeRecordService = locationStatusChangeRecordService;
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
        }
 
        public override PageGridData<Dt_OutSGOrder> GetPageData(PageDataOptions options)
        {
            // 1. 调用基类方法获取分页数据
            PageGridData<Dt_OutSGOrder> pageData = base.GetPageData(options);
            
            // 2. 如果有数据,处理每个订单的物料编号和幅宽
            if (pageData.Rows != null && pageData.Rows.Count > 0)
            {
                // 获取所有订单ID
                var orderIds = pageData.Rows.Select(o => o.Id).ToList();
                
                // 批量查询所有关联的明细,过滤掉物料编号为空的数据
                var allDetails = BaseDal.Db.Queryable<Dt_OutSGOrderDetail>()
                    .Where(d => orderIds.Contains(d.OutSGOrderId) && !string.IsNullOrEmpty(d.MaterialNo))
                    .ToList();
                
                // 按订单ID分组
                var detailsByOrderId = allDetails.GroupBy(d => d.OutSGOrderId).ToDictionary(g => g.Key, g => g.ToList());
                
                // 处理每个订单
                foreach (var order in pageData.Rows)
                {
                    if (detailsByOrderId.TryGetValue(order.Id, out var details))
                    {
                        // 按物料编号和幅宽的组合分组:若物料代码相同但幅宽不同,会被分成不同的组
                        var materialGroups = details
                            .GroupBy(d => new { 
                                MaterialNo = d.MaterialNo, 
                                Width = d.Width 
                            })
                            .Select(g => $"{g.Key.MaterialNo}({g.Key.Width})").ToList();
                        
                        // 将分组结果合并为一个字符串,多个组之间用逗号分隔
                        order.MaterialNoWidth = string.Join(",", materialGroups);
                    }
                    else
                    {
                        order.MaterialNoWidth = "";
                    }
                }
            }
 
            return pageData;
        }
        
        public WebResponseContent AddOutSGOrder(List<SGOutOrderDTO> outOrderDTOs)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取所有排程单
                List<Dt_OutSGOrder> outSGOrders = BaseDal.Db.Queryable<Dt_OutSGOrder>().Includes(x => x.Details).ToList();
                List<Dt_OutSGOrderDetail> outSGOrderDetails= outSGOrders.SelectMany(x=>x.Details).ToList();
                ////判断单据
                //Dt_OutSGOrderDetail? ExistAddOutOrderDetail = outSGOrderDetails.FirstOrDefault(x => outOrderDTOs.Select(t => t.BoardMpsDetailId).Distinct().Contains(x.BoardMpsDetailId));
                //if (ExistAddOutOrderDetail != null)
                //{
                //    return content.Error($"出库排程明细{nameof(SGOutOrderDTO.BoardMpsDetailId)}:{ExistAddOutOrderDetail.BoardMpsDetailId}已存在");
                //}
                //获取所有物料
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0);
                SGOutOrderDTO? sGOutOrderDTO = outOrderDTOs.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialNo));
                //SGOutOrderDTO? sGOutOrderDTO = outOrderDTOs.FirstOrDefault(x => materielInfos.FirstOrDefault(t=>t.MaterielCode.StartsWith(x.MaterialNo))==null);
                if (sGOutOrderDTO != null)
                {
                    return content.Error($"生产排程{sGOutOrderDTO.OrderId}物料:{sGOutOrderDTO.MaterialNo}不存在");
                }
                List<Dt_OutSGOrder> AddOutSGOrders = new List<Dt_OutSGOrder>();
                foreach (var item in outOrderDTOs.OrderBy(x=>x.Number))
                {
                    //获取工单
                    Dt_OutSGOrder? ExistOutSGOrder = AddOutSGOrders.FirstOrDefault(x => x.OrderId == item.OrderId);
                    
                    //明细提前转换
                    Dt_OutSGOrderDetail outSGOrderDetail = _mapper.Map<Dt_OutSGOrderDetail>(item);
                    //获取物料
                    Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterialNo);
                    string code = ExtractFirstPercentContent(outSGOrderDetail.Remark);
                    //处理特殊指定排程判断
                    if (!code.IsNullOrEmpty() && code.StartsWith(outSGOrderDetail.MaterialNo))
                    {
                        materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == code);
                        if (materielInfo==null)
                        {
                            return content.Error($"生产排程{item.OrderId}指定排程物料:{code}不存在");
                        }
                        outSGOrderDetail.MaterialNo = code;
                    }
                    outSGOrderDetail.MaterialName = materielInfo.MaterielName;
                    
                    //判断工单是否已经存在
                    if (ExistOutSGOrder != null)
                    {
                        ExistOutSGOrder.Details.Add(outSGOrderDetail);
                    }
                    else
                    {
                        Dt_OutSGOrder outSGOrder = _mapper.Map<Dt_OutSGOrder>(item);
                        outSGOrder.Details = new List<Dt_OutSGOrderDetail>() { outSGOrderDetail };
                        AddOutSGOrders.Add(outSGOrder);
                    }
                }
                BaseDal.Db.InsertNav(AddOutSGOrders).Include(x => x.Details).ExecuteCommand();
                content.OK("接收排程成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public static string ExtractFirstPercentContent(string input)
        {
            if (string.IsNullOrEmpty(input))
                return null;
 
            Regex regex = new Regex(@"%(.*?)%");
            Match match = regex.Match(input);
 
            if (match.Success && match.Groups[1].Success)
            {
                return match.Groups[1].Value.Trim();
            }
 
            return null;
        }
    }
}