|
|
package com.glxp.api.service.collect;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.io.FileUtil;
|
|
|
import cn.hutool.core.thread.ThreadUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.core.util.XmlUtil;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.alibaba.fastjson.TypeReference;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
import com.glxp.api.common.res.BaseResponse;
|
|
|
import com.glxp.api.dao.basic.BasicProductsDao;
|
|
|
import com.glxp.api.dao.collect.RelCodeBatchMapper;
|
|
|
import com.glxp.api.dao.inout.IoCodeTempDao;
|
|
|
import com.glxp.api.entity.auth.AuthAdmin;
|
|
|
import com.glxp.api.entity.basic.ProductInfoEntity;
|
|
|
import com.glxp.api.entity.basic.UdiEntity;
|
|
|
import com.glxp.api.entity.basic.UdiProductEntity;
|
|
|
import com.glxp.api.entity.collect.RelCodeBatch;
|
|
|
import com.glxp.api.entity.collect.RelCodeDetail;
|
|
|
import com.glxp.api.entity.inout.IoCodeTempEntity;
|
|
|
import com.glxp.api.exception.JsonException;
|
|
|
import com.glxp.api.req.collect.RelCodeBatchRequest;
|
|
|
import com.glxp.api.req.collect.RelCodeDetailRequest;
|
|
|
import com.glxp.api.res.collect.RelCodeBatchResponse;
|
|
|
import com.glxp.api.res.collect.RelCodeDetailByParentCodeResponse;
|
|
|
import com.glxp.api.service.auth.CustomerService;
|
|
|
import com.glxp.api.service.basic.ProductInfoService;
|
|
|
import com.glxp.api.service.basic.UdiProductService;
|
|
|
import com.glxp.api.util.HttpClient;
|
|
|
import com.glxp.api.util.alihealth.AlihealthUtils;
|
|
|
import com.glxp.api.util.udi.FilterUdiUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
import org.w3c.dom.Document;
|
|
|
import org.w3c.dom.Element;
|
|
|
import org.w3c.dom.Node;
|
|
|
import org.w3c.dom.NodeList;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
|
@Slf4j
|
|
|
public class RelCodeBatchService extends ServiceImpl<RelCodeBatchMapper, RelCodeBatch> {
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
private RelCodeDetailService relCodeDetailService;
|
|
|
@Resource
|
|
|
private CustomerService customerService;
|
|
|
@Resource
|
|
|
private ProductInfoService productInfoService;
|
|
|
@Resource
|
|
|
private AlihealthUtils alihealthUtils;
|
|
|
/**
|
|
|
* 上传保存关联信息
|
|
|
*
|
|
|
* @param file
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void xmlUpload(MultipartFile file) {
|
|
|
try {
|
|
|
String fileName = file.getOriginalFilename();
|
|
|
String suffix = FileUtil.getSuffix(fileName);
|
|
|
if (!"xml".equals(suffix)) {
|
|
|
throw new JsonException("仅支持XML,文件类型错误" + suffix);
|
|
|
}
|
|
|
log.info(file.getSize() + "文件长度");
|
|
|
if (file.getSize() > 5 * 1024 * 1024) {
|
|
|
throw new JsonException("上传文件超过5M");
|
|
|
}
|
|
|
|
|
|
Document document = XmlUtil.readXML(file.getInputStream());
|
|
|
//获取根
|
|
|
Element rootElement = XmlUtil.getRootElement(document);
|
|
|
this.ProcessData(rootElement);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
throw new JsonException("上传失败:" + e.getMessage());
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 手动添加
|
|
|
*
|
|
|
* @param relCodeBatchRequest
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void add(RelCodeBatchRequest relCodeBatchRequest) {
|
|
|
List<RelCodeDetailRequest> detailList = relCodeBatchRequest.getDetailList();
|
|
|
if (CollUtil.isEmpty(detailList)) {
|
|
|
throw new JsonException("关联明细不能为空!");
|
|
|
}
|
|
|
AuthAdmin user = customerService.getUserBean();
|
|
|
RelCodeDetailRequest relCodeDetailRequest = detailList.get(0);
|
|
|
RelCodeBatch relCodeBatch = new RelCodeBatch();
|
|
|
BeanUtils.copyProperties(relCodeBatchRequest, relCodeBatch);
|
|
|
relCodeBatch.setCreateTime(new Date());
|
|
|
relCodeBatch.setCreateUser(user.getUserName());
|
|
|
relCodeBatch.setUpdateTime(new Date());
|
|
|
relCodeBatch.setUpdateUser(user.getUserName());
|
|
|
//添加供应商id name
|
|
|
String customerId = user.getCustomerId();
|
|
|
relCodeBatch.setErpId(customerId);
|
|
|
relCodeBatch.setCurCode(relCodeDetailRequest.getParentCode());
|
|
|
this.save(relCodeBatch);
|
|
|
List<RelCodeDetail> relCodeDetails = new ArrayList<>();
|
|
|
for (RelCodeDetailRequest request : detailList) {
|
|
|
RelCodeDetail relCodeDetail = new RelCodeDetail();
|
|
|
String parentCode = request.getParentCode();
|
|
|
request.setParentCode(StrUtil.isNotBlank(parentCode) ? parentCode : "0");
|
|
|
BeanUtils.copyProperties(request, relCodeDetail);
|
|
|
relCodeDetail.setBatchIdFk(relCodeBatch.getId());
|
|
|
relCodeDetails.add(relCodeDetail);
|
|
|
}
|
|
|
relCodeDetailService.saveBatch(relCodeDetails);
|
|
|
this.updateDrugLevelCount(relCodeBatch);
|
|
|
}
|
|
|
|
|
|
public List<RelCodeBatchResponse> filterList(RelCodeBatchRequest relCodeBatchRequest) {
|
|
|
if (relCodeBatchRequest == null) {
|
|
|
return Collections.emptyList();
|
|
|
}
|
|
|
if (relCodeBatchRequest.getPage() != null) {
|
|
|
int offset = (relCodeBatchRequest.getPage() - 1) * relCodeBatchRequest.getLimit();
|
|
|
PageHelper.offsetPage(offset, relCodeBatchRequest.getLimit());
|
|
|
}
|
|
|
return this.baseMapper.filterList(relCodeBatchRequest);
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void delete(Long id) {
|
|
|
if (id == null) {
|
|
|
throw new JsonException("id 不能为空");
|
|
|
}
|
|
|
relCodeDetailService.remove(new LambdaQueryWrapper<RelCodeDetail>().eq(RelCodeDetail::getBatchIdFk, id));
|
|
|
this.removeById(id);
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void addRelCodeSpellBox(List<RelCodeBatchRequest> relCodeBatchRequests) {
|
|
|
if (CollUtil.isEmpty(relCodeBatchRequests)) {
|
|
|
throw new JsonException("单据信息异常!");
|
|
|
}
|
|
|
relCodeBatchRequests.forEach(item -> {
|
|
|
this.add(item);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void deleteDetail(String curCode) {
|
|
|
List<RelCodeDetail> list = relCodeDetailService.list(new LambdaQueryWrapper<RelCodeDetail>().eq(RelCodeDetail::getParentCode, curCode));
|
|
|
if (CollUtil.isNotEmpty(list)) {
|
|
|
List<Integer> batchIds = list.stream().map(RelCodeDetail::getBatchIdFk).collect(Collectors.toList());
|
|
|
this.removeBatchByIds(batchIds);
|
|
|
relCodeDetailService.remove(new LambdaQueryWrapper<RelCodeDetail>().in(RelCodeDetail::getBatchIdFk, batchIds));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void deleteAllDetail(List<RelCodeDetailRequest> detailList) {
|
|
|
if (CollUtil.isNotEmpty(detailList)) {
|
|
|
detailList.forEach(item -> {
|
|
|
String curCode = item.getCurCode();
|
|
|
this.deleteDetail(curCode);
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Value("${UDI_SERVER_URL}")
|
|
|
private String udiUrl;
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 单条上传至国家同步库
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public boolean uploadDrugDataOne(RelCodeBatchRequest relCodeBatchRequest) {
|
|
|
String json = JSONObject.toJSONString(relCodeBatchRequest);
|
|
|
String response = HttpClient.uCloudPost(udiUrl + "/udiwms/relCode/batch/add", json);
|
|
|
try {
|
|
|
BaseResponse<Object> baseResponse =
|
|
|
JSONObject.parseObject(response, new TypeReference<BaseResponse<Object>>() {
|
|
|
});
|
|
|
if (baseResponse.getCode() == 20000) {
|
|
|
Integer id = relCodeBatchRequest.getId();
|
|
|
return this.update(new LambdaUpdateWrapper<RelCodeBatch>().set(RelCodeBatch::getUploadFlagUp, 1).eq(RelCodeBatch::getId, id));
|
|
|
} else {
|
|
|
Integer id = relCodeBatchRequest.getId();
|
|
|
this.update(new LambdaUpdateWrapper<RelCodeBatch>().set(RelCodeBatch::getUploadFlagUp, 2).eq(RelCodeBatch::getId, id));
|
|
|
return false;
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 层级编码查询国家同步库
|
|
|
*/
|
|
|
public List<RelCodeDetailByParentCodeResponse> detailByParentCode(String parentCode) {
|
|
|
Map<String, Object> paramMap = new HashMap<>(2);
|
|
|
paramMap.put("parentCode", parentCode);
|
|
|
String response = HttpClient.mipsGet(udiUrl + "/udiwms/relCode/detailByParentCode", paramMap);
|
|
|
try {
|
|
|
BaseResponse<List<RelCodeDetailByParentCodeResponse>> baseResponse =
|
|
|
JSONObject.parseObject(response, new TypeReference<BaseResponse<List<RelCodeDetailByParentCodeResponse>>>() {
|
|
|
});
|
|
|
if (baseResponse.getCode() == 20000) {
|
|
|
List<RelCodeDetailByParentCodeResponse> list = baseResponse.getData();
|
|
|
return list;
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 通过 parentCode 拉取国家同步库进行更新
|
|
|
*/
|
|
|
public boolean UpdateDetailByParentCode(String parentCode, Integer uploadFlagDown) {
|
|
|
List<RelCodeDetailByParentCodeResponse> list = this.detailByParentCode(parentCode);
|
|
|
if (CollUtil.isNotEmpty(list)) {
|
|
|
for (int i = 0; i < list.size(); i++) {
|
|
|
try {
|
|
|
RelCodeDetailByParentCodeResponse relCodeDetailByParentCodeResponse = list.get(i);
|
|
|
this.saveDetailByParentCode(relCodeDetailByParentCodeResponse, uploadFlagDown);
|
|
|
List<RelCodeDetailByParentCodeResponse> relCodeDetailSons = relCodeDetailByParentCodeResponse.getRelCodeDetailSons();
|
|
|
if (CollUtil.isNotEmpty(relCodeDetailSons)) {
|
|
|
this.saveDetailByParentCode(relCodeDetailByParentCodeResponse, uploadFlagDown);
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.error("拉取国家同步库进行更新失败:[" + parentCode + "]");
|
|
|
log.error(e.getMessage(), e);
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
} else
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
|
|
|
public void saveDetailByParentCode(RelCodeDetailByParentCodeResponse relCodeDetailByParentCodeResponse, Integer uploadFlagDown) {
|
|
|
String productCode = relCodeDetailByParentCodeResponse.getProductCode();
|
|
|
String subTypeNo = relCodeDetailByParentCodeResponse.getSubTypeNo();
|
|
|
String batchNo = relCodeDetailByParentCodeResponse.getBatchNo();
|
|
|
String parentCode1 = relCodeDetailByParentCodeResponse.getParentCode();
|
|
|
|
|
|
//如果不存在就添加
|
|
|
List<RelCodeBatch> navList = this.list(new LambdaQueryWrapper<RelCodeBatch>()
|
|
|
.eq(RelCodeBatch::getProductCode, productCode)
|
|
|
.eq(StrUtil.isNotBlank(subTypeNo), RelCodeBatch::getSubTypeNo, subTypeNo)
|
|
|
.eq(RelCodeBatch::getBatchNo, batchNo)
|
|
|
.eq(RelCodeBatch::getParentCode, parentCode1));
|
|
|
if (CollUtil.isEmpty(navList)) {
|
|
|
RelCodeBatch relCodeBatch = new RelCodeBatch();
|
|
|
BeanUtils.copyProperties(relCodeDetailByParentCodeResponse, relCodeBatch);
|
|
|
relCodeBatch.setCreateTime(new Date());
|
|
|
relCodeBatch.setUpdateTime(new Date());
|
|
|
relCodeBatch.setUploadFlagUp(1);
|
|
|
relCodeBatch.setUploadFlagDown(uploadFlagDown);
|
|
|
this.save(relCodeBatch);
|
|
|
|
|
|
List<RelCodeDetail> detailList = relCodeDetailByParentCodeResponse.getRelCodeDetail();
|
|
|
List<RelCodeDetail> relCodeDetails = new ArrayList<>();
|
|
|
for (RelCodeDetail relCodeDetail : detailList) {
|
|
|
relCodeDetail.setBatchIdFk(relCodeBatch.getId());
|
|
|
relCodeDetails.add(relCodeDetail);
|
|
|
}
|
|
|
relCodeDetailService.saveBatch(relCodeDetails);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public boolean batchExist(String parentCode) {
|
|
|
//1、排除掉层级是1的
|
|
|
UdiEntity udi = FilterUdiUtils.getUdi(parentCode);
|
|
|
String udi1 = udi.getUdi();
|
|
|
ProductInfoEntity byNameCode = productInfoService.findByNameCode(udi1);
|
|
|
if (byNameCode != null && "1".equals(byNameCode.getPackLevel())) return true;
|
|
|
|
|
|
//2、本地查询
|
|
|
List<RelCodeBatch> navList = this.list(new LambdaQueryWrapper<RelCodeBatch>()
|
|
|
.eq(RelCodeBatch::getParentCode, parentCode));
|
|
|
if (CollUtil.isNotEmpty(navList)) return true;
|
|
|
|
|
|
//3、查不到进行远程拉取更新
|
|
|
return this.UpdateDetailByParentCode(parentCode, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
public List<RelCodeDetailByParentCodeResponse> detailByParentCodeSpms(String parentCode, Integer uploadFlagDown) {
|
|
|
List<RelCodeDetailByParentCodeResponse> respList = new ArrayList<>();
|
|
|
|
|
|
List<RelCodeBatch> list = this.list(new LambdaQueryWrapper<RelCodeBatch>().eq(RelCodeBatch::getParentCode, parentCode));
|
|
|
if (CollUtil.isEmpty(list)) {
|
|
|
respList = this.detailByParentCode(parentCode);
|
|
|
for (int i = 0; i < respList.size(); i++) {
|
|
|
try {
|
|
|
RelCodeDetailByParentCodeResponse relCodeDetailByParentCodeResponse = respList.get(i);
|
|
|
this.saveDetailByParentCode(relCodeDetailByParentCodeResponse, uploadFlagDown);
|
|
|
List<RelCodeDetailByParentCodeResponse> relCodeDetailSons = relCodeDetailByParentCodeResponse.getRelCodeDetailSons();
|
|
|
if (CollUtil.isNotEmpty(relCodeDetailSons)) {
|
|
|
relCodeDetailSons.forEach(item -> {
|
|
|
this.saveDetailByParentCode(item, uploadFlagDown);
|
|
|
});
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.error("拉取国家同步库进行更新失败:[" + parentCode + "]");
|
|
|
log.error(e.getMessage(), e);
|
|
|
}
|
|
|
}
|
|
|
return respList;
|
|
|
} else {
|
|
|
for (int i = 0; i < list.size(); i++) {
|
|
|
RelCodeBatch relCodeBatch = list.get(i);
|
|
|
RelCodeDetailByParentCodeResponse relCodeDetailByParentCodeResponse = new RelCodeDetailByParentCodeResponse();
|
|
|
List<RelCodeDetail> relCodeDetails = relCodeDetailService.list(new LambdaQueryWrapper<RelCodeDetail>().eq(RelCodeDetail::getParentCode, parentCode));
|
|
|
BeanUtils.copyProperties(relCodeBatch, relCodeDetailByParentCodeResponse);
|
|
|
relCodeDetailByParentCodeResponse.setRelCodeDetail(relCodeDetails);
|
|
|
|
|
|
if (CollUtil.isNotEmpty(relCodeDetails)) {
|
|
|
RelCodeDetail relCodeDetail = relCodeDetails.get(0);
|
|
|
if (relCodeDetail.getPackLayer() > 1) {//说明有下级
|
|
|
List<RelCodeDetailByParentCodeResponse> sons = new ArrayList<>();
|
|
|
for (int i1 = 0; i1 < relCodeDetails.size(); i1++) {
|
|
|
RelCodeDetail relCodeDetail1 = relCodeDetails.get(i1);
|
|
|
List<RelCodeDetailByParentCodeResponse> relCodeDetailByParentCodeResponses = this.detailByParentCodeSpms(relCodeDetail1.getCurCode(), uploadFlagDown);
|
|
|
if (CollUtil.isNotEmpty(relCodeDetailByParentCodeResponses)) {
|
|
|
sons.addAll(relCodeDetailByParentCodeResponses);
|
|
|
}
|
|
|
}
|
|
|
relCodeDetailByParentCodeResponse.setRelCodeDetailSons(sons);
|
|
|
}
|
|
|
}
|
|
|
respList.add(relCodeDetailByParentCodeResponse);
|
|
|
}
|
|
|
return respList;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Resource
|
|
|
IoCodeTempDao ioCodeTempDao;
|
|
|
@Resource
|
|
|
UdiProductService udiProductService;
|
|
|
|
|
|
public void threadUpdateIoCodeTempEntity(String parentCode) {
|
|
|
List<IoCodeTempEntity> ioCodeTempEntities = ioCodeTempDao.selectList(new LambdaQueryWrapper<IoCodeTempEntity>().eq(IoCodeTempEntity::getCode, parentCode));
|
|
|
if (CollUtil.isNotEmpty(ioCodeTempEntities)) {
|
|
|
IoCodeTempEntity codeTempEntity = ioCodeTempEntities.get(0);
|
|
|
//1、排除掉层级是1的
|
|
|
UdiEntity udi = FilterUdiUtils.getUdi(parentCode);
|
|
|
if (udi == null)
|
|
|
return;
|
|
|
String udi1 = udi.getUdi();
|
|
|
UdiProductEntity udiProductEntity = udiProductService.findByNameCode(udi1);
|
|
|
if (udiProductEntity == null)
|
|
|
return;
|
|
|
List<RelCodeBatch> navList = this.list(new LambdaQueryWrapper<RelCodeBatch>()
|
|
|
.eq(RelCodeBatch::getCurCode, parentCode));
|
|
|
// codeTempEntity.getSupId()
|
|
|
//todo if(navList)是空的 1.查供应商key;2:根据parentCode查阿里接口;3:根据返回结果,再次查询
|
|
|
if(navList == null || navList.size() == 0 ){
|
|
|
BaseResponse baseResponse = alihealthUtils.relCodeInsert(codeTempEntity.getSupId(),parentCode);
|
|
|
if(baseResponse.getCode() == 20000){
|
|
|
// 插入成功就重新查询一下
|
|
|
navList = this.list(new LambdaQueryWrapper<RelCodeBatch>()
|
|
|
.eq(RelCodeBatch::getCurCode, parentCode));
|
|
|
}else {
|
|
|
log.error(baseResponse.getMessage());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if ((udiProductEntity != null && "1".equals(udiProductEntity.getPackLevel()))
|
|
|
|| (CollUtil.isNotEmpty(navList))
|
|
|
) {
|
|
|
//打上匹配到了药品关联关系的标记
|
|
|
for (int i = 0; i < ioCodeTempEntities.size(); i++) {
|
|
|
IoCodeTempEntity ioCodeTempEntity = ioCodeTempEntities.get(i);
|
|
|
ioCodeTempEntity.setDrugLink(1);
|
|
|
ioCodeTempDao.updateById(ioCodeTempEntity);
|
|
|
}
|
|
|
} else {
|
|
|
ThreadUtil.execAsync(() -> {
|
|
|
asynThreadUpdateIoCodeTempEntity(parentCode, ioCodeTempEntities);
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
public void asynThreadUpdateIoCodeTempEntity(String parentCode, List<IoCodeTempEntity> ioCodeTempEntities) {
|
|
|
if (this.batchExist(parentCode)) {
|
|
|
//打上匹配到了药品关联关系的标记
|
|
|
for (int i = 0; i < ioCodeTempEntities.size(); i++) {
|
|
|
IoCodeTempEntity ioCodeTempEntity = ioCodeTempEntities.get(i);
|
|
|
ioCodeTempEntity.setDrugLink(1);
|
|
|
ioCodeTempDao.updateById(ioCodeTempEntity);
|
|
|
}
|
|
|
} else {
|
|
|
//打上匹配不到了药品关联关系的标记
|
|
|
for (int i = 0; i < ioCodeTempEntities.size(); i++) {
|
|
|
IoCodeTempEntity ioCodeTempEntity = ioCodeTempEntities.get(i);
|
|
|
ioCodeTempEntity.setDrugLink(0);
|
|
|
ioCodeTempDao.updateById(ioCodeTempEntity);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
void ProcessData(Element rootElement){
|
|
|
//截取Relation
|
|
|
NodeList relation = rootElement.getElementsByTagName("Relation");
|
|
|
if (relation == null) {
|
|
|
throw new JsonException("XML文件解析错误");
|
|
|
}
|
|
|
Element relationE = (Element) relation.item(0);
|
|
|
//截取Batch
|
|
|
NodeList batch = rootElement.getElementsByTagName("Batch");
|
|
|
if (batch == null) {
|
|
|
throw new JsonException("XML文件解析错误");
|
|
|
}
|
|
|
|
|
|
String productCode = relationE.getAttribute("productCode");
|
|
|
String subTypeNo = relationE.getAttribute("subTypeNo");
|
|
|
String cascade = relationE.getAttribute("cascade");
|
|
|
String packageSpec = relationE.getAttribute("packageSpec");
|
|
|
String comment = relationE.getAttribute("comment");
|
|
|
|
|
|
AuthAdmin user = customerService.getUserBean();
|
|
|
for (int i = 0; i < batch.getLength(); i++) {
|
|
|
Node batchNode = batch.item(i);
|
|
|
RelCodeBatch relCodeBatch = new RelCodeBatch();
|
|
|
Map<String, List<RelCodeDetail>> codeMap = new HashMap<>();
|
|
|
if (batchNode.getNodeType() == Node.ELEMENT_NODE) {
|
|
|
|
|
|
Element batchE = (Element) batchNode;
|
|
|
String batchNo = batchE.getAttribute("batchNo");
|
|
|
String madeDate = batchE.getAttribute("madeDate");
|
|
|
String validateDate = batchE.getAttribute("validateDate");
|
|
|
String workShop = batchE.getAttribute("workShop");
|
|
|
String lineName = batchE.getAttribute("lineName");
|
|
|
String lineManager = batchE.getAttribute("lineManager");
|
|
|
String customerId = String.valueOf(user.getCustomerId());
|
|
|
|
|
|
|
|
|
relCodeBatch.setProductCode(productCode);
|
|
|
relCodeBatch.setSubTypeNo(subTypeNo);
|
|
|
relCodeBatch.setCascadeRatio(cascade);
|
|
|
relCodeBatch.setPackageSpec(packageSpec);
|
|
|
relCodeBatch.setComment(comment);
|
|
|
relCodeBatch.setBatchNo(batchNo);
|
|
|
relCodeBatch.setMadeDate(madeDate);
|
|
|
relCodeBatch.setValidateDate(String.valueOf(DateUtil.offsetDay(DateUtil.parse(validateDate, "yyyy-MM-dd"), 1)));
|
|
|
relCodeBatch.setLineName(lineName);
|
|
|
relCodeBatch.setWorkShop(workShop);
|
|
|
relCodeBatch.setLineManager(lineManager);
|
|
|
relCodeBatch.setCreateTime(new Date());
|
|
|
relCodeBatch.setCreateUser(user.getUserName());
|
|
|
relCodeBatch.setUpdateTime(new Date());
|
|
|
relCodeBatch.setUpdateUser(user.getUserName());
|
|
|
relCodeBatch.setErpId(customerId);
|
|
|
relCodeBatch.setUploadFlagDown(1);
|
|
|
relCodeBatch.setUploadFlagUp(0);
|
|
|
|
|
|
//batch下的节点code
|
|
|
NodeList code = batchNode.getChildNodes();
|
|
|
for (int j = 0; j < code.getLength(); j++) {
|
|
|
Node codeNode = code.item(j);
|
|
|
if (codeNode.getNodeType() == Node.ELEMENT_NODE) {
|
|
|
RelCodeDetail relCodeDetail = new RelCodeDetail();
|
|
|
Element codeE = (Element) codeNode;
|
|
|
String curCode = codeE.getAttribute("curCode");
|
|
|
Integer packLayer = Integer.valueOf(codeE.getAttribute("packLayer"));
|
|
|
relCodeDetail.setBatchIdFk(relCodeBatch.getId());
|
|
|
relCodeDetail.setCurCode(curCode);
|
|
|
relCodeDetail.setPackLayer(Integer.valueOf(packLayer));
|
|
|
String parentCode = codeE.getAttribute("parentCode");
|
|
|
relCodeDetail.setParentCode(StrUtil.isNotBlank(parentCode) ? parentCode : "0");
|
|
|
String flag = codeE.getAttribute("flag");
|
|
|
relCodeDetail.setFlag(Integer.valueOf(flag));
|
|
|
//判断是否已存在
|
|
|
List<RelCodeDetail> relCodeDetails = codeMap.get(StrUtil.isNotBlank(parentCode) ? parentCode : "0");
|
|
|
if (relCodeDetails == null){
|
|
|
List<RelCodeDetail> newRelCodeDetails = new ArrayList<>();
|
|
|
newRelCodeDetails.add(relCodeDetail);
|
|
|
codeMap.put(StrUtil.isNotBlank(parentCode) ? parentCode : "0",newRelCodeDetails);
|
|
|
}else {
|
|
|
relCodeDetails.add(relCodeDetail);
|
|
|
codeMap.put(StrUtil.isNotBlank(parentCode) ? parentCode : "0",relCodeDetails);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//开始处理codeMap
|
|
|
if (!codeMap.isEmpty()){
|
|
|
|
|
|
Map<String, List<RelCodeDetail>> sortedCodeMap = codeMap.entrySet()
|
|
|
.stream()
|
|
|
.sorted(Comparator.comparing(
|
|
|
e -> Optional.ofNullable(e.getValue().isEmpty() ? null : e.getValue().get(0))
|
|
|
.map(RelCodeDetail::getPackLayer)
|
|
|
.orElse(Integer.MIN_VALUE), // Default to Integer.MIN_VALUE if the list is empty (shouldn't happen normally)
|
|
|
Comparator.reverseOrder()
|
|
|
))
|
|
|
.collect(Collectors.toMap(
|
|
|
Map.Entry::getKey,
|
|
|
Map.Entry::getValue,
|
|
|
(e1, e2) -> e1, // Merge function in case of duplicate keys (shouldn't happen with a well-formed Map)
|
|
|
LinkedHashMap::new // Preserve insertion order, though not strictly necessary for sorting
|
|
|
));
|
|
|
|
|
|
Map<String, Integer> batchIdFkMap = new HashMap<>();
|
|
|
List<RelCodeDetail> addRelCodeDetail = new ArrayList<>();
|
|
|
List<RelCodeBatch> updateDrugLevelRelCodeBatch = new ArrayList<>();
|
|
|
// 遍历 Map
|
|
|
for (Map.Entry<String, List<RelCodeDetail>> entry : sortedCodeMap.entrySet()) {
|
|
|
String key = entry.getKey();
|
|
|
List<RelCodeDetail> list = entry.getValue();
|
|
|
|
|
|
if ("0".equals(key)){
|
|
|
for (RelCodeDetail relCodeDetail : list) {
|
|
|
RelCodeBatch addRelCodeBatch = new RelCodeBatch();
|
|
|
BeanUtils.copyProperties(relCodeBatch,addRelCodeBatch);
|
|
|
addRelCodeBatch.setParentCode(key);
|
|
|
String curCode = relCodeDetail.getCurCode();
|
|
|
String diStr = FilterUdiUtils.getUdi(curCode).getUdi();
|
|
|
addRelCodeBatch.setProductCode(diStr);
|
|
|
addRelCodeBatch.setCurCode(curCode);
|
|
|
addRelCodeBatch.setThreeLevelCount(1);
|
|
|
addRelCodeBatch.setId(null);
|
|
|
|
|
|
this.save(addRelCodeBatch);
|
|
|
batchIdFkMap.put(curCode,addRelCodeBatch.getId());
|
|
|
updateDrugLevelRelCodeBatch.add(addRelCodeBatch);
|
|
|
}
|
|
|
|
|
|
}else {
|
|
|
for (RelCodeDetail detail : list) {
|
|
|
Integer packLayer = detail.getPackLayer();
|
|
|
if (packLayer == 2){
|
|
|
RelCodeBatch addRelCodeBatch2 = new RelCodeBatch();
|
|
|
BeanUtils.copyProperties(relCodeBatch,addRelCodeBatch2);
|
|
|
String curCode = detail.getCurCode();
|
|
|
String parentCode = detail.getParentCode();
|
|
|
addRelCodeBatch2.setParentCode(parentCode);
|
|
|
String diStr = FilterUdiUtils.getUdi(curCode).getUdi();
|
|
|
addRelCodeBatch2.setProductCode(diStr);
|
|
|
addRelCodeBatch2.setCurCode(curCode);
|
|
|
addRelCodeBatch2.setThreeLevelCount(0);
|
|
|
addRelCodeBatch2.setTwoLevelCount(1);
|
|
|
addRelCodeBatch2.setId(null);
|
|
|
|
|
|
this.save(addRelCodeBatch2);
|
|
|
batchIdFkMap.put(curCode,addRelCodeBatch2.getId());
|
|
|
|
|
|
//同时也是上面的明细
|
|
|
detail.setBatchIdFk(batchIdFkMap.get(parentCode));
|
|
|
addRelCodeDetail.add(detail);
|
|
|
}else if (packLayer == 1){
|
|
|
//直接明细
|
|
|
String parentCode = detail.getParentCode();
|
|
|
detail.setBatchIdFk(batchIdFkMap.get(parentCode));
|
|
|
addRelCodeDetail.add(detail);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (CollUtil.isNotEmpty(addRelCodeDetail)){
|
|
|
relCodeDetailService.saveBatch(addRelCodeDetail);
|
|
|
//更新层级关系的数量
|
|
|
updateDrugLevelRelCodeBatch.forEach( item -> {
|
|
|
this.updateDrugLevelCount(item);
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 通过curCode 获取明细的数量 如果是 三级 需要先去计算二级单下的一级数量 在算出二级数量
|
|
|
* 如果是 二级 直接计算出 一级
|
|
|
* @param item
|
|
|
*/
|
|
|
private void updateDrugLevelCount(RelCodeBatch item) {
|
|
|
String curCode = item.getCurCode();
|
|
|
List<RelCodeDetail> list = relCodeDetailService.list(new LambdaQueryWrapper<RelCodeDetail>().eq(RelCodeDetail::getParentCode, curCode));
|
|
|
if (CollUtil.isNotEmpty(list)){
|
|
|
RelCodeDetail relCodeDetail = list.get(0);
|
|
|
Integer packLayer = relCodeDetail.getPackLayer();
|
|
|
if (packLayer == 2){
|
|
|
item.setThreeLevelCount(1);
|
|
|
item.setTwoLevelCount(list.size());
|
|
|
|
|
|
//需要计算出一级数量
|
|
|
List<String> twoCurCodes = list.stream().map(RelCodeDetail::getCurCode).collect(Collectors.toList());
|
|
|
List<RelCodeDetail> list2 = relCodeDetailService.list(new LambdaQueryWrapper<RelCodeDetail>().in(RelCodeDetail::getParentCode, twoCurCodes));
|
|
|
item.setOneLevelCount(list2.size());
|
|
|
|
|
|
//更新下 二级单
|
|
|
List<RelCodeBatch> twoRelCodeBatchs = this.list(new LambdaQueryWrapper<RelCodeBatch>().in(RelCodeBatch::getCurCode, twoCurCodes));
|
|
|
if (CollUtil.isNotEmpty(twoRelCodeBatchs)){
|
|
|
twoRelCodeBatchs.forEach( t -> {
|
|
|
this.updateDrugLevelCount(t);
|
|
|
});
|
|
|
}
|
|
|
}else if (packLayer == 1){
|
|
|
item.setThreeLevelCount(0);
|
|
|
item.setTwoLevelCount(1);
|
|
|
item.setOneLevelCount(list.size());
|
|
|
}
|
|
|
this.updateById(item);
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
}
|