н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/MaterielInfoService.cs
@@ -1,12 +1,21 @@
using System;
using HslCommunication;
using Newtonsoft.Json;
using Quartz.Util;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_IWMsInfoServices;
using WIDESEA_Model.Models;
using static WIDESEA_DTO.SquareCabin.OrderDto;
using static WIDESEA_DTO.SquareCabin.TowcsDto;
namespace WIDESEA_WMsInfoServices
{
@@ -15,5 +24,358 @@
        public MaterielInfoService(IRepository<Dt_MaterielInfo> BaseDal) : base(BaseDal)
        {
        }
        public IRepository<Dt_MaterielInfo> Repository => BaseDal;
        static string SearchDate = "2016-11-01 00:00:00";
        /// <summary>
        /// èŽ·å–è¯å“åŸºç¡€ä¿¡æ¯åŒæ­¥æŽ¥å£
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetMedicineGoodsInfom()
        {
            var responseContent = new WebResponseContent();
            try
            {
                var url = "http://192.168.1.100:80/GYZ2/95fck/goodsInfo";
                if (string.IsNullOrEmpty(SearchDate))
                {
                    // é»˜è®¤æŸ¥è¯¢è¿‡åŽ»24小时的数据
                    SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                }
                string getDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                // è¯·æ±‚参数
                var requestData = new
                {
                    searchDate = SearchDate
                };
                // å‘起请求
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                // ååºåˆ—化
                var response = JsonConvert.DeserializeObject<UpstreamResponse<MedicationsInfo>>(result);
                if (response == null || response.resultCode != "0"||response.data==null)
                {
                    // è°ƒç”¨å¼‚常接口
                    //SendErrorToUpstream(5, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response?.resultMsg ?? "上游接口返回失败");
                }
                if (response.data.Count < 1)
                {
                    SearchDate = getDate;
                    return responseContent.OK("无新药品数据");
                }
                var codes = response.data.Select(x => x.goods_no).ToList();
                //获取所有已存在的商品编号
                var existingGoodsNos = BaseDal.QueryData(x => codes.Contains(x.MaterielCode)).Select(x => x.MaterielCode).ToList();
                // æ”¶é›†æ‰€æœ‰è¦æ’入的实体
                var entityList = response.data.Where(Medicat => !existingGoodsNos.Contains(Medicat.goods_no)).Select(Medicat => new Dt_MaterielInfo
                {
                    MaterielCode = Medicat.goods_no,
                    MaterielErpType = Medicat.goods_type,
                    item = Medicat.goods_tym, //通用名
                    MaterielName = Medicat.goods_spm,//物料名称
                    Dosage_form = Medicat.dosage_form,//药剂
                    Barcode = Medicat.barcode,//条形吗
                    MaterielSpec = Medicat.model,
                    Factory = Medicat.factory,
                    MaterielUnit = Medicat.unit,//单位
                    MaterielSourceType = MaterielSourceTypeEnum.PurchasePart,
                    // ä½¿ç”¨ ?? è¿ç®—符提供默认值
                    MaterielLength = (float?)Medicat.item_length,
                    MaterielWide = (float?)Medicat.item_width,
                    MaterielHeight = (float?)Medicat.item_hight,
                    MaterielVolume = (float?)Medicat.item_volumn,
                    MaterielWeight = (float?)Medicat.item_weight,
                    MaterielStoragecondition = float.TryParse(Medicat.storage_confition, out var val) ? val : null, //储存条件
                    Remark = Medicat.remark,
                    GoodStatusState = "未下发",
                    ModifyDate = Medicat.modify_date
                }).ToList();
                // ä¸€æ¬¡æ€§æ‰¹é‡æ’入数据库
                BaseDal.AddData(entityList);
                SearchDate = getDate;
                //ProductSynchronous();
                return responseContent.OK("同步成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine("获取ERP物料信息异常:" + ex.Message);
                //SendErrorToUpstream(5, "", ex.Message, "");
                return responseContent.Error(ex.Message);
            }
        }
        /// <summary>
        /// åˆ›å»ºè¯å‰‚å­—å…¸
        /// </summary>
        private static readonly Dictionary<string, string> _dosageFormMap = new Dictionary<string, string>
        {
            {"001", "片剂"}, {"002", "片剂"}, {"003", "片剂"}, {"004", "片剂"}, {"005", "片剂"},
            {"006", "片剂"}, {"007", "片剂"}, {"008", "片剂"}, {"009", "片剂"}, {"010", "片剂"},
            {"011", "其它"}, {"012", "片剂"}, {"013", "其它"}, {"014", "片剂"}, {"015", "片剂"},
            {"016", "片剂"}, {"017", "片剂"}, {"018", "其它"}, {"019", "其它"}, {"020", "其它"},
            {"021", "针剂"}, {"022", "针剂"}, {"023", "针剂"}, {"024", "针剂"}, {"025", "中成药"},
            {"026", "中成药"}, {"027", "其它"}, {"028", "其它"}, {"029", "其它"}, {"030", "其它"},
            {"031", "其它"}, {"032", "其它"}, {"033", "其它"}, {"034", "中成药"}, {"035", "中成药"},
            {"036", "中成药"}, {"037", "中成药"}, {"038", "其它"}, {"039", "其它"}, {"040", "其它"},
            {"041", "中成药"}, {"042", "中成药"}, {"043", "中成药"}, {"044", "其它"}, {"045", "中成药"},
            {"046", "中成药"}, {"047", "中成药"}, {"048", "中成药"}, {"049", "中成药"}, {"050", "中成药"},
            {"051", "中成药"}, {"052", "中成药"}, {"053", "中成药"}, {"054", "中成药"}, {"055", "中成药"},
            {"056", "其它"}, {"057", "其它"}, {"058", "其它"}, {"059", "其它"}, {"060", "其它"},
            {"061", "其它"}, {"062", "其它"}, {"063", "其它"}, {"064", "其它"}, {"065", "其它"},
            {"066", "其它"}, {"067", "中成药"}, {"068", "中成药"}, {"069", "中成药"}, {"070", "其它"},
            {"071", "其它"}, {"072", "其它"}, {"073", "中成药"}, {"074", "其它"}, {"075", "其它"},
            {"076", "中成药"}, {"077", "其它"}, {"078", "其它"}, {"079", "中成药"}, {"080", "中成药"},
            {"081", "中成药"}, {"082", "中成药"}, {"083", "其它"}, {"084", "中成药"}, {"085", "其它"},
            {"086", "中成药"}, {"087", "其它"}, {"088", "其它"}, {"089", "中成药"}, {"090", "中成药"},
            {"091", "其它"}, {"092", "其它"}, {"093", "其它"}, {"094", "中成药"}, {"095", "其它"},
            {"096", "其它"}, {"097", "其它"}, {"098", "其它"}, {"099", "其它"}, {"100", "其它"},
            {"101", "其它"}, {"102", "其它"}, {"103", "其它"}, {"104", "其它"}, {"105", "其它"},
            {"106", "其它"}, {"107", "其它"}, {"108", "其它"}, {"109", "其它"}, {"110", "其它"},
            {"111", "其它"}, {"112", "其它"}, {"113", "其它"}, {"114", "其它"}, {"115", "其它"},
            {"116", "其它"}, {"117", "其他"}
        };
        /// <summary>
        /// æ ¹æ®å‰‚型编号获取剂型分类
        /// </summary>
        /// <param name="dosageCode">剂型编号(001-117)</param>
        /// <returns>剂型分类(片剂/针剂/中成药/其它/其他)</returns>
        public static string GetDosageForm(string dosageCode)
        {
            if (string.IsNullOrEmpty(dosageCode))
                return "未知";
            // å¤„理编号格式,确保是3位数字
            if (dosageCode.Length == 1)
                dosageCode = "00" + dosageCode;
            else if (dosageCode.Length == 2)
                dosageCode = "0" + dosageCode;
            if (_dosageFormMap.TryGetValue(dosageCode, out string form))
            {
                return form;
            }
            return "未知";
        }
        /// <summary>
        /// å‘给下游wcs同步药品信息
        /// </summary>
        /// <returns></returns>
        #region åŒæ­¥ä¸‹æ¸¸ç‰©æ–™æŽ¥å£
        //public WebResponseContent ProductSynchronous()
        //{
        //    try
        //    {
        //        List<Dt_MaterielInfo> materielInfos = BaseDal.QueryData(x => x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart && x.BoxQty > 0 && x.MinQty > 0 && x.GoodStatusState == "未下发").ToList();
        //        if (materielInfos.Count < 1) return WebResponseContent.Instance.Error("无未下发药品");
        //        var url = "http://172.16.1.2:9357/file-admin/api/product/productSynchronous";
        //        foreach (var item in materielInfos)
        //        {
        //            var medicineDTO = new ProductInfo
        //            {
        //                //用户code
        //                customerCode = "905",
        //                //物料类型
        //                materialCode = item.MaterielErpType,
        //                //产品编码
        //                productCode = item.MaterielCode,
        //                //产品名
        //                productName = item.MaterielName,
        //                //产品条码
        //                productBarCode = item.Barcode,
        //                //药剂
        //                medicine = item.Dosage_form,//这里要调用方法,转化方法
        //                //规格
        //                productSpecifications = item.MaterielSpec,
        //                //单位
        //                unit = item.MaterielUnit,
        //                //长
        //                singleProductLongNum = (item.MaterielLength ?? 0).ToString(),
        //                //宽
        //                singleProductWideNum = (item.MaterielWide ?? 0).ToString(),
        //                //高
        //                singleProductHighNum = (item.MaterielHeight ?? 0).ToString(),
        //                //重量
        //                singleProductWeight = (item.MaterielWeight ?? 0).ToString(),
        //                //体积
        //                singleProductVolume = (item.MaterielVolume ?? 0).ToString(),
        //                //是否取消 0是不删除,1删除
        //                isDelete = "0"
        //            };
        //            var result = HttpHelper.Post(url, medicineDTO.ToJsonString());
        //            var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
        //            if (resp != null && resp.code == "0") item.GoodStatusState = "下发完成";
        //        }
        //        BaseDal.UpdateData(materielInfos);
        //        return WebResponseContent.Instance.OK();
        //    }
        //    catch (Exception ex)
        //    {
        //        Console.WriteLine("下发WCS物料信息异常:" + ex.Message);
        //        return WebResponseContent.Instance.Error(ex.Message);
        //    }
        //}
        #endregion
        #region æ‰‹åŠ¨å…³é—­æ•°æ®åº“è¿žæŽ¥ åŒæ­¥ä¸‹æ¸¸ç‰©æ–™
        public WebResponseContent ProductSynchronous()
        {
            using (var db = new SqlSugarClient(new ConnectionConfig
            {
                ConnectionString = "Data Source=.;Initial Catalog=WIDESEA_WMSDBF_Z22;User ID=sa;Password=48PYX_h7KS@f;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,  // å…³é”®é…ç½®ï¼Œè‡ªåŠ¨å…³é—­è¿žæŽ¥
                MoreSettings = new ConnMoreSettings()
                {
                    IsAutoRemoveDataCache = true
                }
            }))
            {
                try
                {
                    List<Dt_MaterielInfo> materielInfos = db.Queryable<Dt_MaterielInfo>().Where(x => x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart && x.BoxQty > 0 && x.MinQty > 0 && x.GoodStatusState == "未下发").ToList();
                    if (materielInfos.Count < 1)
                    {
                        return WebResponseContent.Instance.Error("无未下发药品");
                    }
                    var url = "http://172.16.1.2:9357/file-admin/api/product/productSynchronous";
                    foreach (var item in materielInfos)
                    {
                        var medicineDTO = new ProductInfo
                        {
                            //用户code
                            customerCode = "905",
                            //物料类型
                            materialCode = item.MaterielErpType,
                            //产品编码
                            productCode = item.MaterielCode,
                            //产品名
                            productName = item.MaterielName,
                            //产品条码
                            productBarCode = item.Barcode,
                            //药剂
                            medicine = item.Dosage_form,//这里要调用方法,转化方法
                            //规格
                            productSpecifications = item.MaterielSpec,
                            //单位
                            unit = item.MaterielUnit,
                            //长
                            singleProductLongNum = (item.MaterielLength ?? 0).ToString(),
                            //宽
                            singleProductWideNum = (item.MaterielWide ?? 0).ToString(),
                            //高
                            singleProductHighNum = (item.MaterielHeight ?? 0).ToString(),
                            //重量
                            singleProductWeight = (item.MaterielWeight ?? 0).ToString(),
                            //体积
                            singleProductVolume = (item.MaterielVolume ?? 0).ToString(),
                            //是否取消 0是不删除,1删除
                            isDelete = "0"
                        };
                        var result = HttpHelper.Post(url, medicineDTO.ToJsonString());
                        var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
                        if (resp != null && resp.code == "0") item.GoodStatusState = "下发完成";
                    }
                    db.Updateable(materielInfos).ExecuteCommand();
                    return WebResponseContent.Instance.OK();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("下发WCS物料信息异常:" + ex.Message);
                    return WebResponseContent.Instance.Error(ex.Message);
                }
            }
        }
        #endregion
        public override WebResponseContent DeleteData(object[] keys)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (keys.ToList().Count > 1) throw new Exception("一次只能选择一条数据");
                Dt_MaterielInfo goods = BaseDal.QueryFirst(x => keys.Contains(x.Id));
                var medicineDTO = new ProductInfo
                {
                    //用户code
                    customerCode = "905",
                    //物料类型
                    materialCode = "YY",
                    //产品编码
                    productCode = goods.MaterielCode,
                    //产品名
                    productName = goods.MaterielName,
                    //产品条码
                    productBarCode = goods.MaterielCode,
                    //规格
                    productSpecifications = goods.MaterielSpec,
                    //单位
                    unit = goods.MaterielUnit,
                    //长
                    singleProductLongNum = goods.MaterielLength.ToString(),
                    //宽
                    singleProductWideNum = goods.MaterielWide.ToString(),
                    //高
                    singleProductHighNum = goods.MaterielHeight.ToString(),
                    //重量
                    singleProductWeight = goods.MaterielWeight.ToString(),
                    //体积
                    singleProductVolume = goods.MaterielVolume.ToString(),
                    //是否取消 0是不删除,1删除
                    isDelete = "1"
                };
                var url = "http://172.16.1.2:9357/file-admin/api/product/productSynchronous";
                //var url = "http://172.16.1.245:9357/file-admin/api/product/productSynchronous";
                var result = HttpHelper.Post(url, medicineDTO.ToJsonString());
                var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
                if (resp != null && resp.code == "0") return base.DeleteData(keys);
                return WebResponseContent.Instance.Error("删除失败请重试");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public override WebResponseContent UpdateData(SaveModel saveModel)
        {
            if (saveModel.MainData["goodStatusState"].ToString() != "未下发")
            {
                saveModel.MainData.Remove("goodStatusState");
                saveModel.MainData.Add("goodStatusState", "未下发");
            }
            // å¦‚果现在这个物料信息是小件并且箱规或者最低库存为0,那么就要提示他
            if (saveModel.MainData["materielSourceType"].ToString() == "SelfMadePart" && (saveModel.MainData["boxQty"].ToString() == "0" || saveModel.MainData["minQty"].ToString() == "0"))
            {
                // è¿™é‡Œæ·»åŠ ä½ çš„é€»è¾‘
                return WebResponseContent.Instance.Error("箱规和最小库存数不可已为0");
            }
            return base.UpdateData(saveModel);
        }
    }
}