kazelee
7 天以前 2ca90a404fa1ab94eb6374f50c6ddd47a2b7f0e6
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
using System;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Web.Http;
using static HH.WCS.Mobox3.DSZSH.api.OtherModel;
using HH.WCS.Mobox3.DSZSH.util;
using HH.WCS.Mobox3.DSZSH.models;
using HH.WCS.Mobox3.DSZSH.wms;
using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
using static HH.WCS.Mobox3.DSZSH.api.ErpModel;
 
namespace HH.WCS.Mobox3.DSZSH.api {
    /// <summary>
    /// ERP 调用的接口
    /// </summary>
    [RoutePrefix("api")]
    public class ErpController : ApiController {
        /// <summary>
        /// ERP下发出库计划单
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("ErpSendOutboundPlan")]
        public ErpResult ErpSendOutboundPlan(ErpModel.ErpSendOutboundPlanInfo model) {
            LogHelper.InfoApi("ERP下发出库计划单", model);
            return ErpService.ErpSendOutboundPlan(model);
        }
    }
 
    public class ErpService {
        public static ErpResult ErpSendOutboundPlan(ErpModel.ErpSendOutboundPlanInfo model) {
            var db = new SqlHelper<object>().GetInstance();
            var orderNo = SYSHelper.GenerateSN("出库单号", "CKD", "yyMMdd");
            const string preLog = "API:ERP下发出库计划单:";
            try {
                if (model.pzjs <= 0) {
                    return NewErpResult(400, preLog + $"物料数量(pzjs)'{model.pzjs}'不合法!!要求:物料数量>0");
                }
 
                var outboundPlan = db.Queryable<TN_Outbound_Plan>()
                    .Where(p => p.JHDH == model.jhdh).First();
                if (outboundPlan != null) {
                    return NewErpResult(1, preLog + $"计划单号'{model.jhdh}'已在[出库计划单]中存在!!");
                }
 
                outboundPlan = new TN_Outbound_Plan {
                    JHDH = model.jhdh, // 计划单号 (唯一标识) 
                    CKZT = model.ckzt, // 出库状态 (需要返回) 
                    JHLB = model.jhlb, // 计划类别
                    CKDH = model.ckdh, // 参考单号
                    CPH = model.cph, // 车牌号
                    YSFS = model.ysfs, // 运输方式
                    CPZT = model.cpzt, // 产品状态
                    MDDW = model.mddw, // 买断单位
                    CPDM = model.cpdm, // 产品代码
                    CPLB = model.cplb, // 产品类别
                    CPLBMX = model.cplbmx, // 产品类别明细
                    PP = model.pp, // 品牌
                    DJ = model.dj, // 等级 (需要返回) 
                    GH = model.gh, // 罐号
                    PH = model.ph, // 批号 (需要返回) 
                    BZLX = model.bzlx, // 包装类型
                    PZDH = model.pzdh, // 派装单号
                    PZD_DW = model.pzd_dw, // 派装单单位
                    PZD_DYBH = model.pzd_dybh, // 派装单调运编号
                    PZJS = model.pzjs, // 派装件数
                    PZSL = model.pzsl, // 派装数量
                    PZ_RQ = model.pz_rq, // 派装日期(yyyy-mm-dd)
                    PZ_CZRQ = model.pz_czrq, // 派装操作日期
                    PZ_ZFBJ = model.pz_zfbj, // 派装作废标记
                    PZ_ZFRQ = model.pz_zfrq, // 派装作废日期
                    PZ_BZ = model.pz_bz, // 派装备注
                    CKDBH = model.ckdbh, // 出库单编号
                    SFJS = model.sfjs, // 实发件数 (需要返回) 
                    SFSL = model.sfsl, // 实发数量 (需要返回) 
                    SFCS = model.sfcs, // 实发车数 (需要返回) 
                    ZCSJ = model.zcsj, // 装车时间 (需要返回) 
                    JLDW = model.jldw, // 计量单位 (需要返回) 
                    FHRQ = model.fhrq, // 发货日期 (需要返回) 
                    CKDM = model.ckdm, // 仓库代码 (需要返回) 
                    FHR = model.fhr, // 发货人 (需要返回) 
                    CZYDM = model.czydm, // 操作员 (需要返回) 
                    SHR_USERNAME = model.shr_username, // 审核人
                    SHRQ = model.shrq, // 审核日期
                    ZFBJ = model.zfbj, // 作废标记
                    ZFRQ = model.zfrq, // 作废日期
                    JSDW = model.jsdw, // 结算单位
                    SHDW = model.shdw, // 收货单位
                    YSDW = model.ysdw, // 运输单位
                    LXR = model.lxr, // 联系人
                    RY_ZXG = model.ry_zxg, // 装卸工 (需要返回) 
                    RY_CCSJ = model.ry_ccsj, // 叉车司机 (需要返回) 
                    ERPHX_JHDH = model.erphx_jhdh, // erp交货单号
                    ERPHX_WLBM = model.erphx_wlbm, // erp物料编码
                    ERPHX_WLMC = model.erphx_wlmc, // erp物料名称
                    ERPHX_CJRQ = model.erphx_cjrq, // erp创建日期
                    HW = model.hw, // 货位 (需要返回) 
                    HWZT = model.hwzt // 货位状态 (需要返回) 
                };
 
                var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_ITEM_CODE == model.cpdm && d.N_ITEM_NUM >= model.pzjs).First();
                if (cgDetail == null) {
                    return NewErpResult(2, preLog + $"在[货品明细表]中没有找到合适的物料!要求:物料编码='{model.cpdm}',物料数量>={model.pzjs}");
                }
 
                var order = new TN_Outbound_Order {
                    S_NO = orderNo,
                    //S_ITEM_CODE = model.cpdm,
                    //S_BATCH = model.ph,
                    //N_END_NUM = (int)model.pzsl,
                    S_ITEM_CODE = model.cpdm,
                    S_BATCH = cgDetail.S_BATCH_NO,
                    N_END_NUM = (int)model.pzjs,
                    S_END_AREA = "QCCKQ", // ERP下发出库任务为汽车出库区
                    S_BS_NO = model.jhdh,
                    S_BS_TYPE = "ERP",
                };
 
                var detailList = new List<TN_Outbound_Detail>();
                var detail = new TN_Outbound_Detail {
                    S_OO_NO = orderNo,
                    S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                    S_BATCH_NO = cgDetail.S_BATCH_NO,
                    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                    N_COUNT = cgDetail.N_ITEM_NUM,
                    S_END_AREA = order.S_END_AREA, // order为detail的每一个货位设置终点值
                    S_BS_NO = order.S_BS_NO,
                    S_BS_TYPE = order.S_BS_TYPE,
                };
                detailList.Add(detail);
 
                using (var tran = db.Ado.UseTran()) {
                    if (db.Insertable(order).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        return NewErpResult(500, preLog + $"生成[出库单]失败!!数据:\n\n{JsonConvert.SerializeObject(order)}\n");
                    }
 
                    if (db.Insertable(detailList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        return NewErpResult(500, preLog + $"生成[出库单明细]失败!!数据:\n\n{JsonConvert.SerializeObject(detailList)}\n");
                    }
 
                    if (db.Insertable(outboundPlan).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        return NewErpResult(500, preLog + $"插入[出库计划记录表]失败!!数据:\n\n{JsonConvert.SerializeObject(outboundPlan)}\n");
                    }
 
                    tran.CommitTran();
                    return NewErpResult(0, preLog + $"生成[出库单]成功!!\n\n出库单:{JsonConvert.SerializeObject(order)}\n出库单明细:{JsonConvert.SerializeObject(detailList)}\n");
                }
            }
            catch (Exception ex) {
                return NewErpResult(1, preLog + $"发生了异常:{ex.Message}\n\n{ex.StackTrace}\n");
            }
        }
    }
 
    public partial class ErpModel {
        /// <summary>
        /// 反馈 ERP 的数据类型
        /// </summary>
        public class ErpResult {
            [JsonProperty("code")]
            public int Code { get; set; }
            [JsonProperty("message")]
            public string Message { get; set; }
        }
 
        public static ErpResult NewErpResult(int code, string message, string name = "") {
            LogHelper.Info(message, name);
            return new ErpResult { Code = code, Message = message };
        }
 
        public static ErpResult NewErpResult(Exception ex, string preLog = "", int errCode = -1) {
            LogHelper.InfoEx(ex, preLog);
            return new ErpResult { Code = errCode, Message = $"发生了[异常]:{ex.Message}" };
        }
    } 
 
}