jt
2021-06-10 5d0d028456874576560552f5a5c4e8b801786f11
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
179
180
181
182
183
184
using HH.WMS.Entitys;
using HH.WMS.Entitys.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HH.WMS.Entitys.Basic;
using HH.WMS.DAL;
using HH.WMS.Common;
using HH.WMS.BLL;
using HH.WMS.DAL.CoreServer;
using HH.WMS.BLL.Interface;
 
namespace HH.WMS.BLL.CoreServer
{
    public class WaveServiceBLL : DapperBaseBLL
    {
        #region 生成波次分拣单
        /// <summary>
        /// 生成波次分拣单
        /// </summary>
        /// <param name="r"></param>
        /// <returns></returns>
        public OperateResult WaveCreate(BatchesResult r)
        {
            return UseTransaction(trans =>
            {
                //生成波次主表
                CreateDAL<DapperDAL<TN_WM_WAVE_MSTEntity>>().Add(r.WaveMst, trans);
                //生成波次子表
                CreateDAL<DapperDAL<TN_WM_WAVE_DTLEntity>>().AddRange(r.WaveMst.WaveDtlList, trans);
 
                if (r.ShortageOutList.Any())
                {
                    //存缺件的生成新的发货单--主表
                    CreateDAL<DapperDAL<TN_WM_OUT_MSTEntity>>().AddRange(r.ShortageOutList, trans);
                    var shortageOutDtl = new List<TN_WM_OUT_DTLEntity>();
                    r.ShortageOutList.ForEach(f => shortageOutDtl.AddRange(f.OutDtlList));
                    //子表
                    CreateDAL<DapperDAL<TN_WM_OUT_DTLEntity>>().AddRange(shortageOutDtl, trans);
                }
                //没有缺货的出库单,要改变状态
                var stayOutMst = r.OutMstList.FindAll(f => !r.ShortageOutList.Exists(e => e.CN_S_OP_NO == f.CN_S_OP_NO));
                if (stayOutMst.Any())
                {
                    //设置状态为待出库,赋值所属波次
                    CreateDAL<WaveServiceDAL>().UpdateOutState(stayOutMst, trans);
                }
                //全部缺货和取消的出库单
                CreateDAL<WaveServiceDAL>().CancelAndAllShortageOut(r.CancelAndAllShortageOut, trans);
                //记录仓库库存锁定明细
                CreateDAL<DapperDAL<TN_WM_B_OUTLOCKING_DTLEntity>>().AddRange(r.OutLockingDtlList, trans);
                //生成减少库存业务主表
                CreateDAL<DapperDAL<TN_WM_REDUCE_INVENTORY_MSTEntity>>().AddRange(r.ReduceInventoryMstList, trans);
                //生成减少库存业务子表
                r.ReduceInventoryMstList.ForEach(p =>
                {
                    //所有出库单子表数据
                    r.ReduceInventoryDtlList.AddRange(p.DTLEntity);
                });
                CreateDAL<DapperDAL<TN_WM_REDUCE_INVENTORY_DTLEntity>>().AddRange(r.ReduceInventoryDtlList, trans);
                //生成分拣单主表
                CreateDAL<DapperDAL<TN_WM_SORTING_LISTEntity>>().AddRange(r.SortingList, trans);
                //分拣单子表数据
                var sortingDtlList = new List<TN_WM_SORTING_DTLEntity>();
                r.SortingList.ForEach(p =>
                {
                    sortingDtlList.AddRange(p.SortingDtlList);
                });
                //生成分拣单子表
                CreateDAL<DapperDAL<TN_WM_SORTING_DTLEntity>>().AddRange(sortingDtlList, trans);
                //库区量表分配量上升
                CreateDAL<WaveServiceDAL>().UpdateAreaAlloc(r.StockAreaList, trans);
            });
        }
        #endregion
 
        #region 执行分拣
        /// <summary>
        /// 执行分拣
        /// </summary>
        /// <param name="sortingEntity"></param>
        /// <returns></returns>
        public OperateResult ExecuteSorting(TN_WM_SORTING_LISTEntity sortingEntity)
        {
            return UseTransaction(trans =>
            {
                //更新分拣单分拣中
                CreateDAL<DapperDAL<TN_WM_SORTING_LISTEntity>>().Update(new
                {
                    CN_S_STATE = Constants.Sorting_Being
                }, new
                {
                    CN_S_SORTING_NO = sortingEntity.CN_S_SORTING_NO
                }, trans);
                //更新波次状态为分拣中
                CreateDAL<DapperDAL<TN_WM_WAVE_MSTEntity>>().Update(new
                {
                    CN_S_STATE = Constants.Sorting_Being
                }, new
                {
                    CN_S_WAVE_NO = sortingEntity.CN_S_FROM_NO
                }, trans);
                //增加分拣明细
                CreateDAL<DapperDAL<TN_WM_SORTING_LOCATIONEntity>>().AddRange(sortingEntity.SortingLocationList, trans);
                if (sortingEntity.Tasks.Any())
                {
                    //增加出库任务
                    CreateDAL<DapperDAL<TN_WM_TASKEntity>>().AddRange(sortingEntity.Tasks, trans);
                    //起点置为预出库锁定,终点预入库锁定
                    foreach (var task in sortingEntity.Tasks)
                    {
                        if (task.EndAreaEntity.CN_C_IS_AUTO == Constants.Y)
                        {
                            CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new
                            {
                                CN_S_LOCATION_STATE = Constants.Location_State_OutLock
                            }, new
                            {
                                CN_S_LOCATION_CODE = task.CN_S_START_BIT
                            }, trans);
                            //存在终点
                            if (!string.IsNullOrEmpty(task.CN_S_END_BIT))
                            {
                                CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new
                                {
                                    CN_S_LOCATION_STATE = Constants.Location_State_InLock
                                }, new
                                {
                                    CN_S_LOCATION_CODE = task.CN_S_END_BIT
                                }, trans);
 
                                //发送ams任务
                                var sendAms = BLLCreator.Create<OtherSysApi>().SendAmsTask(task);
                                if (!sendAms.Success)
                                    throw new Exception(sendAms.Msg);
                            }
                        }
                    }
                }
            });
        }
        #endregion
 
        #region 执行任务
        /// <summary>
        /// 执行任务
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public OperateResult ExecuteTask(TN_WM_TASKEntity entity)
        {
            return UseTransaction(trans =>
            {
                //设置终点货位
                CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Update(new
                {
                    CN_S_END_BIT = entity.CN_S_END_BIT,
                    CN_B_SENDAMS = true,
                }, new
                {
                    CN_S_TASK_NO = entity.CN_S_TASK_NO
                }, trans);
                //货位状态
                if (entity.EndAreaEntity.CN_C_IS_AUTO == Constants.Y)
                {
                    CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new
                    {
                        CN_S_LOCATION_STATE = Constants.Location_State_InLock
                    }, new
                    {
                        CN_S_LOCATION_CODE = entity.CN_S_END_BIT
                    }, trans);
                }
                //发送ams任务
                var sendAms = BLLCreator.Create<OtherSysApi>().SendAmsTask(entity);
                if (!sendAms.Success)
                    throw new Exception(sendAms.Msg);
            });
        }
        #endregion
    }
}