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<Dt_MaterielInfo, IRepository<Dt_MaterielInfo>>, IMaterielInfoService
|
{
|
public MaterielInfoService(IRepository<Dt_MaterielInfo> BaseDal) : base(BaseDal)
|
{
|
}
|
public IRepository<Dt_MaterielInfo> Repository => BaseDal;
|
|
|
static string SearchDate = "2025-10-30 00:00:00";
|
|
/// <summary>
|
/// 获取药品基础信息同步接口
|
/// </summary>
|
/// <returns></returns>
|
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<UpstreamResponse<MedicationsInfo>>(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);
|
}
|
}
|
|
/// <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 "未知";
|
}
|
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);
|
}
|
}
|
/// <summary>
|
/// 发给下游wcs同步药品信息
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent ProductSynchronous1()
|
{
|
try
|
{
|
//把小件未下发的的信息和箱规为0,最低库存为0的过滤掉
|
//var list = BaseDal.Db.Queryable<Dt_MaterielInfo>().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<TowcsResponse<object>>(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<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);
|
}
|
}
|
}
|