using HslCommunication; using Newtonsoft.Json; using Quartz.Util; 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 { public class MaterielInfoService : ServiceBase>, IMaterielInfoService { public MaterielInfoService(IRepository BaseDal) : base(BaseDal) { } public IRepository Repository => BaseDal; static string SearchDate = "2025-10-30 00:00:00"; /// /// 获取药品基础信息同步接口 /// /// public WebResponseContent GetMedicineGoodsInfom() { var responseContent = new WebResponseContent(); try { var url = "http://121.37.118.63:80/GYZ2/95fck/goodsInfo"; if (string.IsNullOrEmpty(SearchDate)) { // 默认查询过去24小时的数据 SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } // 请求参数 var requestData = new { searchDate = SearchDate }; SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 发起请求 var result = HttpHelper.Post(url, requestData.ToJsonString()); // 反序列化 var response = JsonConvert.DeserializeObject>(result); if (response == null || response.resultCode != "0") { // 调用异常接口 //SendErrorToUpstream(5, "", response.resultMsg ?? "上游接口返回失败", ""); return responseContent.Error(response?.resultMsg ?? "上游接口返回失败"); } if (response.data.Count < 1) { 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 = GetDosageForm(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); //ProductSynchronous(); return responseContent.OK("同步成功"); } catch (Exception ex) { Console.WriteLine("获取ERP物料信息异常:" + ex.Message); //SendErrorToUpstream(5, "", ex.Message, ""); return responseContent.Error(ex.Message); } } /// /// 创建药剂字典 /// private static readonly Dictionary _dosageFormMap = new Dictionary { {"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", "其他"} }; /// /// 根据剂型编号获取剂型分类 /// /// 剂型编号(001-117) /// 剂型分类(片剂/针剂/中成药/其它/其他) 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 "未知"; } public WebResponseContent ProductSynchronous() { try { List 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>(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); } } /// /// 发给下游wcs同步药品信息 /// /// public WebResponseContent ProductSynchronous1() { try { //把小件未下发的的信息和箱规为0,最低库存为0的过滤掉 //var list = BaseDal.Db.Queryable().Where(x => x.GoodStatusState == "未下发" && x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart).ToList(); var list = BaseDal.QueryData(x => x.MaterielSourceType == MaterielSourceTypeEnum.SelfMadePart && x.BoxQty > 0 && x.MinQty > 0 && x.GoodStatusState == "未下发").ToList(); if (list.Count < 1) { return new WebResponseContent().OK("无未下发药品"); } //找到了就将整个list发给下游系统 foreach (var item in list) { 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 url = "http://172.16.1.2:9357/file-admin/api/product/productSynchronous"; var result = HttpHelper.Post(url, medicineDTO.ToJsonString()); var resp = JsonConvert.DeserializeObject>(result); if (resp != null && resp.code == "0") { item.GoodStatusState = "下发完成"; } else { continue; } } BaseDal.UpdateData(list); //Db.Updateable(list).ExecuteCommand(); return new WebResponseContent { Status = true, Message = "成功" }; } catch (Exception ex) { Console.WriteLine("ProductSynchronous 异常:" + ex.Message); return new WebResponseContent { Status = false, Message = ex.Message }; } } 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>(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); } } }