package com.glxp.mipsdl.client.ptxhyy; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.glxp.mipsdl.client.CommonHttpClient; import com.glxp.mipsdl.config.ThirdSysConfig; import com.glxp.mipsdl.constant.ConstantType; import com.glxp.mipsdl.constant.Constants; import com.glxp.mipsdl.dao.auth.AuthUserDao; import com.glxp.mipsdl.dao.auth.AuthWarehouseDao; import com.glxp.mipsdl.dao.basic.BasicBussinessTypeDao; import com.glxp.mipsdl.dao.basic.BasicCorpDao; import com.glxp.mipsdl.dao.inout.IoCodeDao; import com.glxp.mipsdl.dao.inout.IoOrderDao; import com.glxp.mipsdl.dao.inout.IoOrderDetailBizDao; import com.glxp.mipsdl.dao.thrsys.ThrInvWarehouseDao; import com.glxp.mipsdl.dao.thrsys.ThrProductsDao; import com.glxp.mipsdl.dao.thrsys.ThrSystemBusApiDao; import com.glxp.mipsdl.entity.auth.AuthUserEntity; import com.glxp.mipsdl.entity.auth.AuthWarehouseEntity; import com.glxp.mipsdl.entity.auth.AuthWarehouseUser; import com.glxp.mipsdl.dao.auth.AuthWarehouseUserMapper; import com.glxp.mipsdl.entity.basic.BasicBussinessTypeEntity; import com.glxp.mipsdl.entity.basic.BasicCorpEntity; import com.glxp.mipsdl.entity.inout.IoCodeEntity; import com.glxp.mipsdl.entity.inout.IoOrderDetailBizEntity; import com.glxp.mipsdl.entity.inout.IoOrderEntity; import com.glxp.mipsdl.entity.inout.IoOrderInvoiceEntity; import com.glxp.mipsdl.entity.thrsys.ThrInvWarehouseEntity; import com.glxp.mipsdl.entity.thrsys.ThrSystemBusApiEntity; import com.glxp.mipsdl.req.base.UdiwmsOrderDetailRequest; import com.glxp.mipsdl.req.base.UdiwmsOrderRequest; import com.glxp.mipsdl.req.ptxhyy.PtxhyyOrderDetailRequest; import com.glxp.mipsdl.req.ptxhyy.PtxhyyOrderRequest; import com.glxp.mipsdl.res.BaseResponse; import com.glxp.mipsdl.service.auth.AuthWarehouseService; import com.glxp.mipsdl.service.thrsys.ThrCorpService; import com.glxp.mipsdl.util.DateUtil; import com.glxp.mipsdl.util.ResultVOUtils; import com.glxp.mipsdl.util.SubmitOrderUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** * 平潭协和医院接口 */ @Slf4j @Service(value = "100008HttpClient") @RequiredArgsConstructor public class PtxhyyClient extends CommonHttpClient { private final ThirdSysConfig thirdSysConfig; private final IoOrderDao orderDao; private final ThrSystemBusApiDao thrSystemBusApiDao; private final BasicBussinessTypeDao basicBussinessTypeDao; private final BasicCorpDao basicCorpDao; private final AuthWarehouseDao authWarehouseDao; private final ThrInvWarehouseDao thrInvWarehouseDao; private final AuthWarehouseService authWarehouseService; private final ThrCorpService thrCorpService; private final IoCodeDao codeDao; private final IoOrderDetailBizDao orderDetailBizDao; private final SubmitOrderUtil submitOrderUtil; private final ThrProductsDao thrProductsDao; @Override public BaseResponse submitOrders(UdiwmsOrderRequest udiwmsOrderRequest) { if (StrUtil.isBlank(udiwmsOrderRequest.getBillNo())) { return ResultVOUtils.error(500, "单据号不能为空"); } //查询单据和详情信息,组装第三方系统接口参数 IoOrderEntity orderEntity = orderDao.selectOne(new LambdaQueryWrapper().eq(IoOrderEntity::getBillNo, udiwmsOrderRequest.getBillNo())); udiwmsOrderRequest.setBillDate(DateUtil.formatDateTime(orderEntity.getCreateTime())); //查询对应的第三方单据类型 ThrSystemBusApiEntity thrSystemBusApiEntity = thrSystemBusApiDao.selectOne(new LambdaQueryWrapper().eq(ThrSystemBusApiEntity::getCode, udiwmsOrderRequest.getBillType())); if (StrUtil.isBlank(thrSystemBusApiEntity.getUrl())) { return ResultVOUtils.error(500, "接口未配置,无法提交!"); } udiwmsOrderRequest.setBillType(thrSystemBusApiEntity.getThirdBuyCode()); //查询单据类型,设置往来单位信息 BasicBussinessTypeEntity basicBussinessTypeEntity = basicBussinessTypeDao.selectByAction(orderEntity.getAction()); if (basicBussinessTypeEntity.getCorpType().equals(Constants.CORP_HOSPTIAL)) { //医院客户 udiwmsOrderRequest.setCorpId(orderEntity.getFromCorp()); //查询客户名称 String corpName = basicCorpDao.selectNameByErpId(orderEntity.getFromCorp()); udiwmsOrderRequest.setCorpName(corpName); } else if (basicBussinessTypeEntity.getCorpType().equals(Constants.CORP_INTTERNAL)) { if (StrUtil.isNotEmpty(orderEntity.getFromCorp())) { BasicCorpEntity basicCorpEntity = basicCorpDao.selectByErpId(orderEntity.getFromCorp()); if (null != basicCorpEntity) { udiwmsOrderRequest.setCorpId(basicCorpEntity.getThirdId()); udiwmsOrderRequest.setCorpName(basicCorpEntity.getName()); } else { String msg = "查询单据对应的第三方往来单位信息异常"; log.error(msg); return ResultVOUtils.error(500, msg); } } else { //内部科室 AuthWarehouseEntity warehouseEntity = authWarehouseDao.selectOne(new LambdaQueryWrapper().eq(AuthWarehouseEntity::getCode, udiwmsOrderRequest.getCorpId())); try { //根据第三方系统标识,获取对应字段的值 ThrInvWarehouseEntity thrInvWarehouseEntity = thrInvWarehouseDao.selectOne(new LambdaQueryWrapper() .eq(ThrInvWarehouseEntity::getCode, authWarehouseService.getThirdInvCode(warehouseEntity)) .eq(ThrInvWarehouseEntity::getThirdSysFk, thirdSysConfig.getThirdId())); udiwmsOrderRequest.setCorpId(thrInvWarehouseEntity.getCode()); udiwmsOrderRequest.setCorpName(thrInvWarehouseEntity.getName()); } catch (Exception e) { String msg = "查询单据对应往来单位的第三方仓库信息异常"; log.error(msg, e); return ResultVOUtils.error(500, msg); } } } else if (basicBussinessTypeEntity.getCorpType().equals(Constants.CORP_SP)) { //供应商 BasicCorpEntity basicCorpEntity = basicCorpDao.selectByErpId(orderEntity.getFromCorp()); if (null != basicCorpEntity) { udiwmsOrderRequest.setCorpId(basicCorpEntity.getThirdId()); udiwmsOrderRequest.setCorpName(basicCorpEntity.getName()); } else { String msg = "查询单据对应的第三方往来单位信息异常"; log.error(msg); return ResultVOUtils.error(500, msg); } } //查询仓库信息 AuthWarehouseEntity warehouseEntity = authWarehouseDao.selectOne(new LambdaQueryWrapper().eq(AuthWarehouseEntity::getCode, orderEntity.getInvCode())); try { ThrInvWarehouseEntity thrInvWarehouseEntity = thrInvWarehouseDao.selectOne(new LambdaQueryWrapper() .eq(ThrInvWarehouseEntity::getCode, authWarehouseService.getThirdInvCode(warehouseEntity)) .eq(ThrInvWarehouseEntity::getThirdSysFk, thirdSysConfig.getThirdId())); udiwmsOrderRequest.setLocInvCode(thrInvWarehouseEntity.getCode()); udiwmsOrderRequest.setLocInvName(thrInvWarehouseEntity.getName()); // udiwmsOrderRequest.setLocStorageCode(thrInvWarehouseEntity.getCode()); // udiwmsOrderRequest.setLocStorageName(thrInvWarehouseEntity.getName()); } catch (Exception e) { log.info("查询第三方系统仓库信息异常", e); return ResultVOUtils.error(500, "查询第三方系统仓库信息异常"); } // if (StrUtil.nullToEmpty(thrSystemBusApiEntity.getUrl()).equals("useOut")) { // udiwmsOrderRequest.setCorpId(udiwmsOrderRequest.getLocStorageCode()); // udiwmsOrderRequest.setCorpName(udiwmsOrderRequest.getLocStorageName()); // // ThrInvWarehouseEntity thrInvWarehouseEntity = thrInvWarehouseDao.selectOne(new LambdaQueryWrapper().eq(ThrInvWarehouseEntity::getCode, "29") // .eq(ThrInvWarehouseEntity::getThirdSysFk, thirdSysConfig.getThirdId())); // udiwmsOrderRequest.setLocStorageCode("29"); // udiwmsOrderRequest.setLocStorageName(thrInvWarehouseEntity.getName()); // } udiwmsOrderRequest.setBillFlag("1"); //设置单据出入库类型 if (basicBussinessTypeEntity.getMainAction().equals(ConstantType.TYPE_PUT)) { udiwmsOrderRequest.setInoutType(1); //入库 } else if (basicBussinessTypeEntity.getMainAction().equals(ConstantType.TYPE_OUT)) { udiwmsOrderRequest.setInoutType(2); //出库 } udiwmsOrderRequest.setRemark("udi管理系统提交单据:" + orderEntity.getBillNo()); //组装单据明细数据 List ioCodeEntities = codeDao.selectList(new LambdaQueryWrapper() .eq(IoCodeEntity::getOrderId, orderEntity.getBillNo()) .ne(IoCodeEntity::getAction, "StockCheck") ); List items = new ArrayList<>(); //查询业务单据详情 List detailBizEntities = orderDetailBizDao.selectList(new LambdaQueryWrapper().eq(IoOrderDetailBizEntity::getOrderIdFk, orderEntity.getBillNo())); //单据金额 BigDecimal djje = detailBizEntities.stream().map(IoOrderDetailBizEntity::getPrice).reduce(BigDecimal.ONE, BigDecimal::add); List ioOrderInvoiceEntities = IoOrderInvoiceEntity.builder().build().selectList(Wrappers.lambdaQuery(IoOrderInvoiceEntity.class).eq(IoOrderInvoiceEntity::getOrderIdFk, orderEntity.getId())); String userName = getUserName(orderEntity); if (StrUtil.isEmpty(userName)) { return ResultVOUtils.error(500, "该单据无创建人!"); } PtxhyyOrderRequest ptxhyyOrderRequest = PtxhyyOrderRequest .builder() .kfxh(udiwmsOrderRequest.getLocInvCode()) .lzdh(udiwmsOrderRequest.getBillNo()) .czgh(userName) .lzfs(udiwmsOrderRequest.getBillType()) .dwxh(udiwmsOrderRequest.getCorpId()) .rkrq(LocalDate.from(cn.hutool.core.date.DateUtil.parseLocalDateTime(udiwmsOrderRequest.getBillDate()))) .djje(djje) .fpbz(CollectionUtil.isNotEmpty(ioOrderInvoiceEntities) && ioOrderInvoiceEntities.size() > 0) .zdrq(udiwmsOrderRequest.getBillDate()) .lsje(djje) .fpzs(CollectionUtil.isNotEmpty(ioOrderInvoiceEntities) ? ioOrderInvoiceEntities.size() : 0) .udixh(udiwmsOrderRequest.getBillNo()) .build(); ptxhyyOrderRequest.setDetailList(new ArrayList<>()); setOrderDetailList(ioCodeEntities, items, detailBizEntities); Collections.reverse(items); for (UdiwmsOrderDetailRequest i : items) { String udim = ""; if (CollectionUtil.isNotEmpty(i.getCodeList())) { udim = i.getCodeList().stream().map(UdiwmsOrderDetailRequest.CodeDetailEntity::getCode).collect(Collectors.joining(",")); } String fphm = ""; LocalDateTime fprq = null; if (CollectionUtil.isNotEmpty(ioOrderInvoiceEntities)) { List invoiceList = ioOrderInvoiceEntities.stream().filter(s -> i.getBindRlFk().equals(s.getBindRlFk()) && i.getBatchNo().equals(s.getBatchNo())) .sorted(Comparator.comparing(IoOrderInvoiceEntity::getInvoiceDate, Comparator.reverseOrder())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(invoiceList)) { fphm = invoiceList.stream().map(IoOrderInvoiceEntity::getInvoiceCode).collect(Collectors.joining(",")); fprq = LocalDateTime.parse(DateUtil.formatDateTime(invoiceList.get(0).getInvoiceDate())); ioOrderInvoiceEntities.removeAll(invoiceList); } } PtxhyyOrderDetailRequest detailRequest = PtxhyyOrderDetailRequest.builder() .wzxh(i.getProductId()) .cjxh(i.getManufactoryCode()) .bzdw(i.getMeasname()) .bzsl(i.getCount()) .wzjg(i.getPrice()) .lsje(i.getPrice()) .udim(udim) .hsfl(i.getCplb()) .wzph(i.getBatchNo()) .fphm(fphm) .fprq(fprq) .djrq(DateUtil.formatDate(orderEntity.getCreateTime(),"yyyy-MM-dd")) .build(); ptxhyyOrderRequest.getDetailList().add(detailRequest); } return submitOrderUtil.submitOrder(orderEntity, ptxhyyOrderRequest); } /** * 封装单据详情参数 * * @param ioCodeEntities 单据码明细 * @param orderDetailRequests 单据详情参数 * @param detailBizEntities 单据业务详情 */ private void setOrderDetailList(List ioCodeEntities, List orderDetailRequests, List detailBizEntities) { for (IoOrderDetailBizEntity detailBizEntity : detailBizEntities) { UdiwmsOrderDetailRequest item = submitOrderUtil.buildProductInfo(detailBizEntity); //封装条码信息 submitOrderUtil.setCodeList(ioCodeEntities, detailBizEntity, item); orderDetailRequests.add(item); } } @Resource AuthUserDao authUserDao; @Resource AuthWarehouseUserMapper authWarehouseUserMapper; public String getUserName(IoOrderEntity orderEntity) { //创建人非供应商 if (StrUtil.isNotEmpty(orderEntity.getCreateUser()) && orderEntity.getCreateUser().length() != 14) { AuthUserEntity authUserEntity = authUserDao.selectById(orderEntity.getCreateUser()); return authUserEntity.getUserName(); } else if (StrUtil.isNotEmpty(orderEntity.getUpdateUser()) && orderEntity.getUpdateUser().length() != 14) { AuthUserEntity authUserEntity = authUserDao.selectById(orderEntity.getUpdateUser()); return authUserEntity.getUserName(); } else if (StrUtil.isNotEmpty(orderEntity.getReviewUser())) { AuthUserEntity authUserEntity = authUserDao.selectById(orderEntity.getReviewUser()); return authUserEntity.getUserName(); } else { List authWarehouseUsers = authWarehouseUserMapper.selectList(new QueryWrapper().eq("code", orderEntity.getInvCode())); if (CollUtil.isNotEmpty(authWarehouseUsers)) { return authWarehouseUsers.get(0).getUserName(); } } return null; } }