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
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.ERP;
using WIDESEA_IBasicRepository;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
 
namespace WIDESEA_OutboundService
{
    public class OutBSTOrderService : ServiceBase<Dt_OutBSTOrder, IOutBSTOrderRepository>, IOutBSTOrderService
    {
        public IOutBSTOrderRepository Repository => BaseDal;
        private readonly IBasicRepository _basicRepository;
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IOutBSTOrderDetailRepository _outBSTOrderDetailRepository;
 
        public OutBSTOrderService(IOutBSTOrderRepository BaseDal,IBasicRepository basicRepository,IMapper mapper,IUnitOfWorkManage unitOfWorkManage,IOutBSTOrderDetailRepository outBSTOrderDetailRepository) : base(BaseDal)
        {
            _basicRepository = basicRepository;
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
            _outBSTOrderDetailRepository = outBSTOrderDetailRepository;
        }
        /// <summary>
        /// 添加出库排程信息
        /// </summary>
        public WebResponseContent AddOutBSTOrder(List<BSTOutOrderDTO> bSTOutOrderDTOs)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取所有出库单
                List<Dt_OutBSTOrder> OldoutBSTOrders = BaseDal.Db.Queryable<Dt_OutBSTOrder>().Includes(x => x.Details).ToList();
                //新增
                List<BSTOutOrderDTO> outOrderDTOsAdd = bSTOutOrderDTOs.Where(x => x.Way == 1).ToList();
                //修改
                List<BSTOutOrderDTO> outOrderDTOsUpdate = bSTOutOrderDTOs.Where(x => x.Way == 2).ToList();
                //删除
                List<BSTOutOrderDTO> outOrderDTOsDel = bSTOutOrderDTOs.Where(x => x.Way == 3).ToList();
                //获取所有物料 
                List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.MaterialSourceId != 0);
 
                List<Dt_OutBSTOrder> outBSTAddOrders = new List<Dt_OutBSTOrder>();
                List<Dt_OutBSTOrder> outBSTUpOrders = new List<Dt_OutBSTOrder>();
                List<Dt_OutBSTOrder> outBSTDelOrders = new List<Dt_OutBSTOrder>();
                List<Dt_OutBSTOrderDetail> outBSTOrderDetailsDel = new List<Dt_OutBSTOrderDetail>();
                //新增
                if (outOrderDTOsAdd.Count>0)
                {
                    //判断单据
                    Dt_OutBSTOrder? ExistAddOutOrder = OldoutBSTOrders.FirstOrDefault(x => outOrderDTOsAdd.Select(x => x.BoardMpsId).Contains(x.BoardMpsId));
                    if (ExistAddOutOrder != null)
                    {
                        return content.Error($"出库排程Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{ExistAddOutOrder.BoardMpsId}已存在");
                    }
                    //判断是否存在物料
                    List<BstBoardMpsDetailItem> bstBoardMpsDetailItems = outOrderDTOsAdd.SelectMany(x => x.BstBoardMpsDetails).ToList();
                    BstBoardMpsDetailItem? bstBoardMpsDetailItem = bstBoardMpsDetailItems.FirstOrDefault(x => !materielInfos.Select(x => x.MaterialSourceId).Contains(x.MaterialId));
                    if (bstBoardMpsDetailItem != null)
                    {
                        return content.Error($"生产排程{nameof(bstBoardMpsDetailItem.BoardMpsId)}物料Id:{bstBoardMpsDetailItem.MaterialId}不存在");
                    }
                    foreach (var item in outOrderDTOsAdd)
                    {
                        if (outOrderDTOsUpdate.FirstOrDefault(x => x.BoardMpsId == item.BoardMpsId) != null)
                        {
                            continue;
                        }
                        List<Dt_OutBSTOrderDetail> bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map<Dt_OutBSTOrderDetail>(x)).ToList();
                        Dt_OutBSTOrder outBSTOrder = _mapper.Map<Dt_OutBSTOrder>(item);
                        outBSTOrder.Details=bSTOrderDetails;
                        outBSTAddOrders.Add(outBSTOrder);
                    }
                }
                //修改
                if (outOrderDTOsUpdate.Count > 0)
                {
                    List<Dt_OutBSTOrder>? ExistUpdateOutBSTOrders = OldoutBSTOrders.Where(x => outOrderDTOsUpdate.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)).ToList();
                    
                    foreach (var item in outOrderDTOsUpdate)
                    {
                        Dt_OutBSTOrder? outBSTOrderUpdate = ExistUpdateOutBSTOrders.FirstOrDefault(x=>x.BoardMpsId==item.BoardMpsId);
                        //如果订单已存在则进行更改
                        if (outBSTOrderUpdate != null)
                        {
                            if (outBSTOrderUpdate.OutBSTOrderStatus != OutOrderStatusEnum.未开始.ObjToInt())
                            {
                                return content.Error($"采购{nameof(outBSTOrderUpdate.BoardMpsId)}:{outBSTOrderUpdate.BoardMpsId}订单出库中,不可更改");
                            }
                            //更新数据
                            outBSTOrderDetailsDel.AddRange(outBSTOrderUpdate.Details);
                            List<Dt_OutBSTOrderDetail> bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map<Dt_OutBSTOrderDetail>(x)).ToList();
                            bSTOrderDetails.ForEach(x =>
                            {
                                x.OutBSTOrderId = outBSTOrderUpdate.Id;
                            });
                            outBSTOrderUpdate.Details = bSTOrderDetails;
                            outBSTOrderUpdate.BoardMpsId= item.BoardMpsId;
                            outBSTOrderUpdate.BoardMpsNo= item.BoardMpsNo;
                            outBSTOrderUpdate.ProductionDate = DateTimeOffset.FromUnixTimeMilliseconds(item.ProductionDate).DateTime;
                            outBSTUpOrders.Add(outBSTOrderUpdate);
                        }
                        else//如果不存在则进行新增
                        {
                            List<Dt_OutBSTOrderDetail> bSTOrderDetails = item.BstBoardMpsDetails.Select(x => _mapper.Map<Dt_OutBSTOrderDetail>(x)).ToList();
                            Dt_OutBSTOrder outBSTOrder = _mapper.Map<Dt_OutBSTOrder>(item);
                            outBSTOrder.Details = bSTOrderDetails;
                            outBSTAddOrders.Add(outBSTOrder);
                        }
                    }
                }
                //删除
                if (outOrderDTOsDel.Count > 0)
                {
                    List<Dt_OutBSTOrder>? ExistDeloutBSTOrders = OldoutBSTOrders.Where(x => outOrderDTOsDel.Select(x => x.BoardMpsId).Contains(x.BoardMpsId)).ToList();
                    //更新的单据是否存在
                    if (ExistDeloutBSTOrders.Count == outOrderDTOsDel.Count)
                    {
 
                    }
                    else
                    {
                        BSTOutOrderDTO? bSTOutOrderDTO = outOrderDTOsDel.FirstOrDefault(x => !ExistDeloutBSTOrders.Select(x => x.BoardMpsId).Contains(x.BoardMpsId));
                        return content.Error($"未找到指定生产排程单Id{nameof(BSTOutOrderDTO.BoardMpsId)}:{bSTOutOrderDTO?.BoardMpsId}");
                    }
                }
                _unitOfWorkManage.BeginTran();
                BaseDal.Db.InsertNav(outBSTAddOrders).Include(x => x.Details).ExecuteCommand();
                _outBSTOrderDetailRepository.DeleteData(outBSTOrderDetailsDel);
                BaseDal.Db.UpdateNav(outBSTUpOrders).Include(x => x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                content.OK("接收成功");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
    }
}