sjz
2025-09-12 0c1a03e880bbf795b771a9c8ee4b7b271c262b58
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 Masuit.Tools;
using MES.Service.DB;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using SqlSugar;
using System.Globalization;
 
namespace MES.Service.service.BasicData;
 
public class MesDeliveryNoteManager : Repository<MesDeliveryNotice>
{
    private readonly MesDeliveryNoteDetailManager deliveryNoteDetailManager = new();
 
    /// <summary>
    /// 保存送货单数据
    /// </summary>
    /// <param name="deliveryNoteWrapper">送货单包装类(包含主表和明细数据)</param>
    /// <returns>是否保存成功</returns>
    public bool Save(DeliveryNoteWrapper deliveryNoteWrapper)
    {
        var deliveryNote = deliveryNoteWrapper.DeliveryNote;
        var mesDeliveryNote = GetMesDeliveryNote(deliveryNote);
        var mesDeliveryNoteDetails = GetMesDeliveryNoticeDetails(deliveryNoteWrapper.DeliveryNoteDetails, mesDeliveryNote.DeliveryNo);
 
        return UseTransaction(db =>
        {
            return deliveryNote.Type switch
            {
                "1" => SaveOrUpdateData(db, mesDeliveryNote, mesDeliveryNoteDetails) ? 1 : 0,
                "2" => UpdateData(db, mesDeliveryNote, mesDeliveryNoteDetails) ? 1 : 0,
                _ => throw new NotImplementedException($"未实现的类型:{deliveryNote.Type}")
            };
        }) > 0;
    }
 
    /// <summary>
    /// 更新送货单数据
    /// </summary>
    private bool UpdateData(SqlSugarScope db, MesDeliveryNotice mesDeliveryNote, List<MesDeliveryNoticeDetail> mesDeliveryNoteDetails)
    {
        var detailIds = mesDeliveryNoteDetails.Select(s => s.Guid).ToArray();
 
        // 删除主表数据
        var deleteMain = db.Deleteable<MesDeliveryNotice>().Where(a => a.DeliveryNo == mesDeliveryNote.DeliveryNo).ExecuteCommand() > 0;
 
        // 删除明细数据
        var deleteDetails = db.Deleteable<MesDeliveryNoticeDetail>().Where(s => detailIds.Contains(s.Guid)).ExecuteCommand() > 0;
 
        if (deleteMain && deleteDetails)
        {
            return true;
        }
        throw new NotImplementedException("送货单更新失败");
    }
 
    /// <summary>
    /// 保存或更新送货单数据
    /// </summary>
    private bool SaveOrUpdateData(SqlSugarScope db, MesDeliveryNotice mesDeliveryNote, List<MesDeliveryNoticeDetail> mesDeliveryNoteDetails)
    {
        // 若存在则先删除主表数据
        if (!mesDeliveryNote.DeliveryNo.IsNullOrEmpty())
        {
            db.Deleteable<MesDeliveryNotice>().Where(s => s.DeliveryNo == mesDeliveryNote.DeliveryNo).ExecuteCommand();
        }
 
        // 删除关联的明细数据
        if (mesDeliveryNoteDetails.Count > 0)
        {
            db.Deleteable<MesDeliveryNoticeDetail>().Where(s => s.DeliveryNo == mesDeliveryNote.DeliveryNo).ExecuteCommand();
        }
 
        // 插入主表数据
        var insertMain = db.Insertable(mesDeliveryNote).IgnoreColumns(true).ExecuteCommand() > 0;
 
        // 插入明细数据
        var insertDetails = db.Insertable(mesDeliveryNoteDetails).PageSize(1).IgnoreColumnsNull().ExecuteCommand() > 0;
 
        if (insertMain && insertDetails)
        {
            return true;
        }
        throw new NotImplementedException("送货单保存失败");
    }
 
    /// <summary>
    /// 批量保存送货单
    /// </summary>
    public bool SaveList(List<DeliveryNoteWrapper> deliveryNoteWrappers)
    {
        var results = deliveryNoteWrappers.Select(Save).ToList();
        return results.All(b => b);
    }
 
    /// <summary>
    /// 转换送货单主表数据
    /// </summary>
    private MesDeliveryNotice GetMesDeliveryNote(deliveryNote deliveryNote)
    {
        // 查找已有记录
        var existing = base.GetSingle(it => it.DeliveryNo == deliveryNote.DeliveryNo);
        var mesDeliveryNote = existing ?? new MesDeliveryNotice();
 
        // 主表字段映射
        mesDeliveryNote.DeliveryNo = deliveryNote.DeliveryNo;
        mesDeliveryNote.SupplierId = deliveryNote.SupplierId;
 
        // 处理日期字段
        // 处理日期字段(数据库存储为字符串类型的时间戳)
        if (deliveryNote.FDate != null)
        {
            // 直接赋值字符串,无需转换为DateTime
            mesDeliveryNote.DeliveryDate = deliveryNote.FDate;
        }
 
        mesDeliveryNote.Remark = deliveryNote.Remark;
        mesDeliveryNote.FReceiveOrgId = deliveryNote.FReceiveOrgId;
       
        mesDeliveryNote.CreateDate = DateTime.Now;
 
        return mesDeliveryNote;
    }
 
    /// <summary>
    /// 转换送货单明细数据
    /// </summary>
    private List<MesDeliveryNoticeDetail> GetMesDeliveryNoticeDetails(
        List<deliveryNoteDetail> deliveryNoteDetails,
        string deliveryNo)
    {
        return deliveryNoteDetails.Select(detail =>
        {
            // 查找已有明细记录
            var existingDetail = deliveryNoteDetailManager.GetSingle(it => it.DeliveryNo == deliveryNo && it.LineNo == detail.LineNo);
            var mesDetail = existingDetail ?? new MesDeliveryNoticeDetail();
 
            // 明细字段映射
            mesDetail.DeliveryNo = deliveryNo;
            mesDetail.ProductCode = detail.ProductCode;
            mesDetail.PurchaseQty = detail.PurchaseQty.HasValue ? Convert.ToDecimal(detail.PurchaseQty) : 0;
            mesDetail.DeliveryQty = detail.DeliveryQty.HasValue ? Convert.ToDecimal(detail.DeliveryQty) : 0;
            mesDetail.IncludeQty = detail.IncludeQty.HasValue ? Convert.ToDecimal(detail.IncludeQty) : 0;
            mesDetail.PurchaseUnit = detail.PurchaseUnit;
            mesDetail.InventoryUnit = detail.InventoryUnit;
            mesDetail.Remark = detail.Remark;
            mesDetail.PoErpNo = detail.FBillNo;
            mesDetail.ErplineId = detail.OrderlineId;
            mesDetail.IsGift = detail.IsGift;
            mesDetail.LineNo = detail.LineNo;
            mesDetail.SynchronousDate = DateTime.Now;
 
            return mesDetail;
        }).ToList();
    }
}