|
|
|
@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
|
|
import com.chanjet.openapi.sdk.java.exception.ChanjetApiException;
|
|
|
|
|
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
|
|
|
|
|
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
|
|
|
|
|
import com.chanko.yunxi.mes.framework.common.util.object.ObjectUtils;
|
|
|
|
|
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
|
|
|
|
|
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
|
|
|
|
|
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.ChanjetSpi;
|
|
|
|
@ -54,6 +53,7 @@ import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
|
|
|
|
|
import com.chanko.yunxi.mes.module.system.dal.mysql.dept.DeptMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.system.dal.mysql.dict.DictDataMapper;
|
|
|
|
|
import com.chanko.yunxi.mes.module.system.service.user.AdminUserService;
|
|
|
|
|
import lombok.SneakyThrows;
|
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
@ -65,6 +65,7 @@ import java.text.SimpleDateFormat;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
|
@ -792,13 +793,15 @@ public class ChanjetManager {
|
|
|
|
|
|
|
|
|
|
// 处理数据
|
|
|
|
|
if(!resulDataList.isEmpty()){
|
|
|
|
|
Map<String, List<QuerySaleOrderListResDTO>> dataGroupByCode = resulDataList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getExternalCode));
|
|
|
|
|
Map<String, List<QuerySaleOrderListResDTO>> dataGroupByCode =
|
|
|
|
|
resulDataList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getExternalCode));
|
|
|
|
|
|
|
|
|
|
List<ProjectOrderDO> doList = projectOrderMapper.selectList(new LambdaQueryWrapper<ProjectOrderDO>() {{
|
|
|
|
|
in(ProjectOrderDO::getExternalCode, dataGroupByCode.keySet());
|
|
|
|
|
eq(ProjectOrderDO::getOrderSource, ProjectOrderSourceEnum.INTERFACE.getCode());
|
|
|
|
|
}});
|
|
|
|
|
Map<String, List<ProjectOrderDO>> existsDOGroupByCode = doList.stream().collect(Collectors.groupingBy(ProjectOrderDO::getExternalCode));
|
|
|
|
|
Map<String, List<ProjectOrderDO>> existsDOGroupByCode =
|
|
|
|
|
doList.stream().collect(Collectors.groupingBy(ProjectOrderDO::getExternalCode));
|
|
|
|
|
|
|
|
|
|
// 处理
|
|
|
|
|
dataGroupByCode.forEach((id, voList) -> {
|
|
|
|
@ -828,37 +831,114 @@ public class ChanjetManager {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
saveReqVO.setProjectOrderSubs(subDOList);
|
|
|
|
|
projectOrderController.operateProjectOrder(saveReqVO);
|
|
|
|
|
CommonResult<Long> orderId = projectOrderController.operateProjectOrder(saveReqVO);
|
|
|
|
|
|
|
|
|
|
// 根据销售订单的每个产品的BOM,找到物料编码为6开头的物料,原先的生成生产订单的逻辑不变,再另外生成一张生产订单
|
|
|
|
|
if(subDOList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).count()>0){
|
|
|
|
|
ProjectOrderDO newProjectOrderDO =BeanUtil.toBean(projectOrderMapper.selectById(saveReqVO.getId()),ProjectOrderDO.class);
|
|
|
|
|
newProjectOrderDO.setId(null);
|
|
|
|
|
newProjectOrderDO.setCode(newProjectOrderDO.getCode()+"-1");
|
|
|
|
|
|
|
|
|
|
projectOrderMapper.insert(newProjectOrderDO);
|
|
|
|
|
|
|
|
|
|
List<ProjectOrderSubDO> insertList =subDOList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).collect(Collectors.toList());
|
|
|
|
|
insertList.forEach(o->{
|
|
|
|
|
o.setId(null);
|
|
|
|
|
o.setProjectOrderId(newProjectOrderDO.getId());
|
|
|
|
|
// o.setAmount()
|
|
|
|
|
});
|
|
|
|
|
projectOrderSubMapper.insertBatch(insertList);
|
|
|
|
|
|
|
|
|
|
// 手动记录日志
|
|
|
|
|
operateLogFrameworkService.createOperateLog(request,
|
|
|
|
|
LocalDateTime.now(),
|
|
|
|
|
BusinessTypeEnum.PROJECT_ORDER.name(),
|
|
|
|
|
newProjectOrderDO.getId(),
|
|
|
|
|
OperateTypeEnum.valueOf(OperateTypeEnum.SAVE.name()).getType(),
|
|
|
|
|
"");
|
|
|
|
|
if(voList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).count()>0){
|
|
|
|
|
saveSemiFinishedProjectOrder(orderId.getData(),voList);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SneakyThrows
|
|
|
|
|
private void saveSemiFinishedProjectOrder(Long orderId, List<QuerySaleOrderListResDTO> subDOList){
|
|
|
|
|
ProjectOrderDO newProjectOrderDO =BeanUtil.toBean(projectOrderMapper.selectById(orderId),ProjectOrderDO.class);
|
|
|
|
|
newProjectOrderDO.setId(null)
|
|
|
|
|
.setCode(newProjectOrderDO.getCode()+"-1")
|
|
|
|
|
.setStatus(ValidStatusEnum.VALID.getCode())
|
|
|
|
|
.setOrderSource(ProjectOrderSourceEnum.INTERFACE.getCode())
|
|
|
|
|
.setOrderStatus(ProjectOrderStatusEnum.SAVE.getCode())
|
|
|
|
|
.setIsUrgency(YesOrNoEnum.N.getCode());
|
|
|
|
|
|
|
|
|
|
// 保存订单信息
|
|
|
|
|
projectOrderMapper.insert(newProjectOrderDO);
|
|
|
|
|
|
|
|
|
|
List<QuerySaleOrderListResDTO> queryMatList =subDOList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).collect(Collectors.toList());
|
|
|
|
|
List<String> matCodes = new ArrayList<>();
|
|
|
|
|
queryMatList.forEach(mat->{
|
|
|
|
|
MaterialDO materialDO = materialMapper.selectById(mat.getMaterialId());
|
|
|
|
|
if(materialDO !=null){
|
|
|
|
|
mat.setMaterialCode(materialDO.getCode());
|
|
|
|
|
mat.setInvSafe(materialDO.getInvSafe());
|
|
|
|
|
if(!matCodes.contains(mat.getMaterialCode())){
|
|
|
|
|
matCodes.add(mat.getMaterialCode());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 查询当前物料的实时库存
|
|
|
|
|
List<QueryCurrentStockResVO> stockCurrentDatas = queryStock(matCodes,newProjectOrderDO.getWarehouseId());
|
|
|
|
|
List<ProjectOrderSubDO> insertList = new ArrayList<>(16);
|
|
|
|
|
|
|
|
|
|
for (QuerySaleOrderListResDTO o : queryMatList) {
|
|
|
|
|
Double matAmount = (double) 0;
|
|
|
|
|
if(insertList.stream().filter(uo -> uo.getMaterialCode().equals(o.getMaterialCode())).count()==0
|
|
|
|
|
&& materialMapper.selectById(o.getMaterialId())!=null){
|
|
|
|
|
|
|
|
|
|
ProjectOrderSubDO projectOrderSubDO = new ProjectOrderSubDO();
|
|
|
|
|
projectOrderSubDO.setProjectOrderId(newProjectOrderDO.getId()).setMaterialId(o.getMaterialId());
|
|
|
|
|
|
|
|
|
|
if (!StringUtils.isEmpty(o.getMaterialCode())) {
|
|
|
|
|
// 查询当前物料子件物料信息
|
|
|
|
|
CommonResult<List<QueryBomResVO>> bomDataList =
|
|
|
|
|
chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(o.getMaterialCode())), QueryBomResVO.class);
|
|
|
|
|
|
|
|
|
|
// 子件生产数量
|
|
|
|
|
AtomicReference<Double> produceQuantity = new AtomicReference<>(0d);
|
|
|
|
|
// 子件需求数量
|
|
|
|
|
AtomicReference<Double> requiredQuantity = new AtomicReference<>(0d);
|
|
|
|
|
bomDataList.getData().get(0).getBOMChildDTOs().forEach(ch->{
|
|
|
|
|
produceQuantity.updateAndGet(v -> v + ch.getProduceQuantity());
|
|
|
|
|
requiredQuantity.updateAndGet(v -> v + ch.getRequiredQuantity());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 查询当前物料父件物料信息
|
|
|
|
|
QueryBomReqVO queryBomReqVOAsChild = new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(null,o.getMaterialCode()));
|
|
|
|
|
CommonResult<List<QueryBomResVO>> result =
|
|
|
|
|
chanjetSpi.invokeRetList(QUERY_BOM, queryBomReqVOAsChild,QueryBomResVO.class);
|
|
|
|
|
|
|
|
|
|
AtomicReference<Integer> parantAmount = new AtomicReference<>(0);
|
|
|
|
|
|
|
|
|
|
if(result!= null && result.getData()!=null) {
|
|
|
|
|
subDOList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getMaterialId)).forEach((mid, mList) -> {
|
|
|
|
|
if (mid.equals(result.getData().get(0).getID())){
|
|
|
|
|
parantAmount.set(mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum());
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QueryCurrentStockResVO currentStock =
|
|
|
|
|
stockCurrentDatas.stream().filter(stock->{
|
|
|
|
|
return stock.getInventoryCode().equals(o.getMaterialCode());
|
|
|
|
|
}).collect(Collectors.toList()).get(0);
|
|
|
|
|
|
|
|
|
|
// 该物料的实时库存
|
|
|
|
|
Integer availableQuantity = currentStock==null?0:new Integer(currentStock.getAvailableQuantity());
|
|
|
|
|
|
|
|
|
|
matAmount = (requiredQuantity.get()==0 ?0:produceQuantity.get()/requiredQuantity.get())*parantAmount.get()-availableQuantity+o.getInvSafe().doubleValue();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
projectOrderSubDO.setAmount(matAmount.intValue());
|
|
|
|
|
|
|
|
|
|
insertList.add(projectOrderSubDO);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 保存订单产品信息
|
|
|
|
|
if(!CollUtil.isEmpty(insertList)) {
|
|
|
|
|
projectOrderSubMapper.insertBatch(insertList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 手动记录日志
|
|
|
|
|
operateLogFrameworkService.createOperateLog(request,
|
|
|
|
|
LocalDateTime.now(),
|
|
|
|
|
BusinessTypeEnum.PROJECT_ORDER.name(),
|
|
|
|
|
newProjectOrderDO.getId(),
|
|
|
|
|
OperateTypeEnum.valueOf(OperateTypeEnum.SAVE.name()).getType(),
|
|
|
|
|
"");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询bom
|
|
|
|
|
*
|
|
|
|
@ -874,7 +954,8 @@ public class ChanjetManager {
|
|
|
|
|
List<BOMChildDTOs> bomDataList = null;
|
|
|
|
|
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
|
|
|
|
|
if(getSystemParameters()) {
|
|
|
|
|
CommonResult<List<QueryBomResVO>> result = chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(materialCode)), QueryBomResVO.class);
|
|
|
|
|
CommonResult<List<QueryBomResVO>> result =
|
|
|
|
|
chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(materialCode)), QueryBomResVO.class);
|
|
|
|
|
if (!result.isSuccess()) {
|
|
|
|
|
throw exception(CALL_API_ERROR);
|
|
|
|
|
}
|
|
|
|
|