rev:出库

This commit is contained in:
zhangzq
2024-12-04 00:11:35 +08:00
parent 41e0582751
commit dbe984e408
13 changed files with 250 additions and 51 deletions

View File

@@ -82,7 +82,6 @@ public class PdaIOService {
//创建单据分配货位
StIvtIostorinv ivtIostorinv = ioService.createPadIvtAndoutDispense(pdaFormOutMst);
StIvtIostorinv byId = iStIvtIostorinvService.getById(ivtIostorinv.getId());
this.pdaTaskOpen(byId);
}
@@ -167,14 +166,31 @@ public class PdaIOService {
String now = DateUtil.now();
String nickName = SecurityUtils.getCurrentNickName();
for (PdaFormOutDtl child : pdaFormOutMst.getChildren()) {
BigDecimal planQty = child.getPlan_qty();
BigDecimal assignQty = child.getAssign_qty();
BigDecimal now_assign_qty = child.getNow_assign_qty();
BigDecimal qty = child.getQty();
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("qty",qty.subtract(now_assign_qty))
.set("assign_qty",planQty.subtract(now_assign_qty))
.set("assign_qty",assignQty.add(now_assign_qty))
.set("update_time",now)
.set("update_name",nickName));
.set("update_name",nickName)
.eq("id",child.getId()));
}
String sourceFormid = pdaFormOutMst.getId();
List<PmFormData> byParentId = iPmFormDataService.getByParentId(sourceFormid);
long count = byParentId.stream().filter(pmFormData -> pmFormData.getQty().intValue() > 0).count();
if (count == 0){
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("status",StatusEnum.FORM_STATUS.code("完成"))
.set("update_time",now)
.set("update_name",nickName)
.eq("id",sourceFormid));
}else {
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("status",StatusEnum.FORM_STATUS.code("执行中"))
.set("update_time",now)
.set("update_name",nickName)
.eq("id",sourceFormid));
}
return mst;
}

View File

@@ -0,0 +1,9 @@
package org.nl.wms.pm_manage.form_data.service.dao;
import lombok.Data;
@Data
public class FormDataIdCode {
private String id;
private String code;
}

View File

@@ -38,5 +38,6 @@ public interface PmFormDataMapper extends BaseMapper<PmFormData> {
ReceiveBillData queryReceiveBill(@Param("bar_code") String bar_code);
Set<String> existFormDataList();
Set<String> existFormCodeDataList();
}

View File

@@ -198,7 +198,12 @@
WHERE d.bar_code= #{bar_code}
</select>
<select id="existFormDataList" resultType="java.lang.String">
SELECT ID
SELECT id
FROM pm_form_data
WHERE DATE(create_time) = CURDATE()
</select>
<select id="existFormCodeDataList" resultType="java.lang.String">
SELECT code
FROM pm_form_data
WHERE DATE(create_time) = CURDATE()
</select>

View File

@@ -23,6 +23,8 @@ import org.nl.wms.pm_manage.form_data.service.dao.PmFormData;
import org.nl.wms.pm_manage.form_data.service.dao.mapper.PmFormDataMapper;
import org.nl.wms.pm_manage.form_data.service.dto.FormDataQuery;
import org.nl.wms.pm_manage.form_data.service.dto.PmFormDataDto;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StructAssignQty;
import org.nl.wms.sync_manage.service.form_mapping.ISyncFormMappingService;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
import org.springframework.beans.BeanUtils;
@@ -31,7 +33,9 @@ import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -60,6 +64,8 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
private IBmFormStrucService formStrucService;
@Autowired
private ISyncFormMappingService iSyncFormMappingService;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Override
@@ -208,20 +214,32 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
if (CollectionUtils.isEmpty(pmFormDataDtos)){
throw new BadRequestException(code+"单据编码不存在或已经完成入库");
}
List<String> parents = pmFormDataDtos.stream().map(PmFormDataDto::getId).collect(Collectors.toList());
List<PmFormDataDto> childs = this.baseMapper.selectChilds(parents);
if (!CollectionUtils.isEmpty(childs)){
Map<String, List<PmFormDataDto>> childMap = childs.stream().collect(Collectors.groupingBy(PmFormDataDto::getParent_id));
for (PmFormDataDto dataDto : pmFormDataDtos) {
List<PmFormDataDto> children = childMap.get(dataDto.getId());
for (PmFormDataDto child : children) {
String productArea = child.getForm_data().getString("product_area");
child.setProduct_area(productArea);
}
dataDto.setChildren(children);
PmFormDataDto pmFormDataDto = pmFormDataDtos.get(0);
List<PmFormDataDto> childs = this.baseMapper.selectChilds(ListOf.of(pmFormDataDto.getId()));
if (CollectionUtils.isEmpty(childs)){
throw new BadRequestException(code+"单据明细数据为空");
}
List<String> collect = childs.stream().map(PmFormDataDto::getMaterial_id).collect(Collectors.toList());
//TODO:指定仓库
List<StructAssignQty> structMaterials = iStIvtStructattrService.getStructIvtAssign(collect, "FStockId");
Map<String, List<StructAssignQty>> materialMap = structMaterials.stream().collect(Collectors.groupingBy(StructAssignQty::getMaterial_id));
for (PmFormDataDto child : childs) {
String productArea = child.getForm_data().getString("product_area");
child.setProduct_area(productArea);
List<StructAssignQty> maps = materialMap.get(child.getMaterial_id());
if (CollectionUtils.isEmpty(maps)){
child.setSto_qty(new BigDecimal(0));
child.setPcsn("");
}else {
maps.sort(Comparator.comparing(StructAssignQty::getSto_qty));
StructAssignQty max = maps.get(0);
child.setSto_qty(max.getSto_qty());
child.setPcsn(max.getPcsn());
}
}
return pmFormDataDtos.get(0);
pmFormDataDto.setChildren(childs);
return pmFormDataDto;
}
@Override

View File

@@ -1,6 +1,7 @@
package org.nl.wms.stor_manage.io.service.iostor.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -33,6 +34,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@@ -66,39 +68,78 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
if (form == null) {
return;
}
String now = DateUtil.now();
String nickName = SecurityUtils.getCurrentNickName();
String sourceFormCode = form.getString("source_form_code");
String mstString = null;
StIvtIostorinv mst = form.toJavaObject(StIvtIostorinv.class);
String sourceFormid = null;
if (StringUtils.isNotEmpty(sourceFormCode)){
PmFormData mst = iPmFormDataService.getOne(new QueryWrapper<PmFormData>().eq("code", sourceFormCode));
JSONObject mstJ = (JSONObject) JSONObject.toJSON(mst);
PmFormData pmst = iPmFormDataService.getOne(new QueryWrapper<PmFormData>().eq("code", sourceFormCode));
sourceFormid = pmst.getId();
JSONObject mstJ = (JSONObject) JSONObject.toJSON(pmst);
mstJ.putAll((Map)mstJ.remove("form_data"));
mstJ.putAll(mst.getForm_data());
mstString = mstJ.toJSONString();
}
List<Map> dtls = (List<Map>) form.remove("item");
StIvtIostorinv mst = form.toJavaObject(StIvtIostorinv.class);
mst.setId(IdUtil.getStringId());
mst.setCreate_name(SecurityUtils.getCurrentNickName());
mst.setCreate_time(DateUtil.now());
mst.setCreate_name(nickName);
mst.setCreate_time(now);
mst.setCode(CodeUtil.getNewCode("IO_CODE"));
mst.setStatus(StatusEnum.FORM_STATUS.code("生成"));
if (dtls != null && dtls.size() > 0) {
for (int i = 0; i < dtls.size(); i++) {
JSONObject jsonDtl = new JSONObject(dtls.get(i));
String sourceDtlFormCode = jsonDtl.getString("source_form_code");
StIvtIostorinvdtl dtl = jsonDtl.toJavaObject(StIvtIostorinvdtl.class);
if (StringUtils.isNotEmpty(sourceDtlFormCode) && mstString!=null){
JSONObject sourceFormData = JSONObject.parseObject(mstString);
PmFormData sourDtl = iPmFormDataService.getOne(new QueryWrapper<PmFormData>()
.eq("code", sourceFormCode));
JSONObject dtlJ = (JSONObject) JSONObject.toJSON(sourDtl);
dtlJ.putAll((Map) dtlJ.remove("form_data"));
sourceFormData.putAll(dtlJ);
dtl.setSource_form_data(sourceFormData);
}
dtl.setId(IdUtil.getStringId());
dtl.setInv_id(mst.getId());
dtl.setStatus(StatusEnum.FORM_STATUS.code("生成"));
iStIvtIostorinvDtlService.save(dtl);
if (dtls == null || dtls.size() == 0) {
throw new BadRequestException("出库明细不能为空");
}
List<Map<String,String>> list = new ArrayList<>();
for (int i = 0; i < dtls.size(); i++) {
JSONObject jsonDtl = new JSONObject(dtls.get(i));
String sourceDtlFormId = jsonDtl.getString("source_form_id");
StIvtIostorinvdtl dtl = jsonDtl.toJavaObject(StIvtIostorinvdtl.class);
if (StringUtils.isNotEmpty(sourceDtlFormId) && mstString!=null){
JSONObject sourceFormData = JSONObject.parseObject(mstString);
PmFormData sourDtl = iPmFormDataService.getById(sourceDtlFormId);
String dtlStr = JSON.toJSONString(sourDtl);
JSONObject dtlJ = JSONObject.parseObject(dtlStr);
dtlJ.putAll((Map) dtlJ.remove("form_data"));
sourceFormData.putAll(dtlJ);
sourceFormData.put("pcsn",dtl.getPcsn());
sourceFormData.put("now_assign_qty",dtl.getQty());
dtl.setSource_form_data(sourceFormData);
list.add(MapOf.of("qty",sourDtl.getQty().subtract(dtl.getQty())
,"assign_qty",sourDtl.getAssign_qty().add(dtl.getQty())
,"id",sourceDtlFormId));
}
dtl.setId(IdUtil.getStringId());
dtl.setInv_id(mst.getId());
dtl.setUpdate_time(now);
dtl.setUpdate_time(nickName);
dtl.setStatus(StatusEnum.FORM_STATUS.code("生成"));
iStIvtIostorinvDtlService.save(dtl);
}
for (Map<String,String> map : list) {
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("qty",map.get("qty"))
.set("assign_qty",map.get("assign_qty"))
.set("update_time",now)
.set("update_name",nickName)
.eq("id",map.get("id")));
}
if (StringUtils.isNotEmpty(sourceFormid)){
List<PmFormData> byParentId = iPmFormDataService.getByParentId(sourceFormid);
long count = byParentId.stream().filter(pmFormData -> pmFormData.getQty().intValue() > 0).count();
if (count == 0){
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("status",StatusEnum.FORM_STATUS.code("完成"))
.set("update_time",now)
.set("update_name",nickName)
.eq("id",sourceFormid));
}else {
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("status",StatusEnum.FORM_STATUS.code("执行中"))
.set("update_time",now)
.set("update_name",nickName)
.eq("id",sourceFormid));
}
}
this.save(mst);
@@ -311,6 +352,8 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
@Override
public String cancelMst(String id) {
String now = DateUtil.now();
String nickName = SecurityUtils.getCurrentNickName();
StIvtIostorinv mst = this.getById(id);
List<StIvtIostorinvdtl> iostorinvdtls = iStIvtIostorinvDtlService.list(new QueryWrapper<StIvtIostorinvdtl>().eq("inv_id", id));
String collect = iostorinvdtls.stream().map(StIvtIostorinvdtl::getVehicle_id).collect(Collectors.joining(","));
@@ -319,6 +362,8 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
//更新点位锁,删除分配
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty", 0)
.set("update_time",now)
.set("update_name",nickName)
.in("id", Arrays.asList(split)));
//更新点位锁定
String vehicleCodes = iostorinvdtls.stream().map(StIvtIostorinvdtl::getVehicle_code).collect(Collectors.joining(","));
@@ -326,13 +371,39 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvOutMapp
iStIvtStructattrService
.update(new UpdateWrapper<StIvtStructattr>()
.set("lock_type",StatusEnum.LOCK.code("无锁"))
.set("update_time",now)
.set("update_name",nickName)
.in("vehicle_code", Arrays.asList(vehicleCodeSplit))
);
}
this.update(new UpdateWrapper<StIvtIostorinv>()
.set("status", StatusEnum.FORM_STATUS.code("取消"))
.set("update_time",now)
.set("update_name",nickName)
.eq("id", id));
/**
* 更新原单
*/
String parentId = null;
for (StIvtIostorinvdtl dtl : iostorinvdtls) {
String formid = dtl.getSource_form_id();
PmFormData pmFormData = iPmFormDataService.getById(formid);
parentId = pmFormData.getParent_id();
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("qty",pmFormData.getQty().add(dtl.getQty()))
.set("assign_qty",pmFormData.getAssign_qty().subtract(dtl.getQty()))
.set("update_time",now)
.set("update_name",nickName)
.set("remark","出库单取消")
.eq("id",formid));
}
if (StringUtils.isNotEmpty(parentId)){
iPmFormDataService.update(new UpdateWrapper<PmFormData>()
.set("status",StatusEnum.FORM_STATUS.code("执行中"))
.set("update_time",now)
.set("update_name",nickName)
.eq("id",parentId));
}
return null;
}
}

View File

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.common.domain.entity.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.stor_manage.struct.service.dao.StructAssignQty;
import org.nl.wms.stor_manage.struct.service.dto.StructattrQuery;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
@@ -52,4 +53,6 @@ public interface IStIvtStructattrService extends IService<StIvtStructattr> {
List<StructattrVechielDto> structVehicle(Map query);
Object getStructIvt(StructattrQuery query, PageQuery page);
List<StructAssignQty> getStructIvtAssign(List<String> materials, String stor_code);
}

View File

@@ -0,0 +1,29 @@
package org.nl.wms.stor_manage.struct.service.dao;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* <p>
* 仓位属性表
* </p>
*
* @author generator
* @since 2024-04-08
*/
@Data
public class StructAssignQty {
private String struct_code;
private String stor_code;
private String material_id;
private String struct_codes;
private String vehicle_codes;
private String pcsn;
private BigDecimal sto_qty;
}

View File

@@ -4,6 +4,7 @@ import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.apache.ibatis.annotations.Param;
import org.nl.common.domain.entity.PageQuery;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nl.wms.stor_manage.struct.service.dao.StructAssignQty;
import org.nl.wms.stor_manage.struct.service.dto.StructattrQuery;
import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto;
@@ -27,4 +28,6 @@ public interface StIvtStructattrMapper extends BaseMapper<StIvtStructattr> {
List<StructattrVechielDto> structVehicle(Map query);
List<Map> getStructIvt(@Param("query")StructattrQuery query, PageQuery pageQuery);
List<StructAssignQty> getStructIvtAssign(@Param("materials")List<String> materials, @Param("stor_code")String stor_code);
}

View File

@@ -138,4 +138,29 @@
</if>
</where>
</select>
<select id="getStructIvtAssign" resultType="org.nl.wms.stor_manage.struct.service.dao.StructAssignQty">
SELECT
struct.struct_code,
struct.stor_code,
vm.material_id,
GROUP_CONCAT(struct.struct_code) as struct_codes,
GROUP_CONCAT(struct.vehicle_code) as vehicle_codes,
vm.pcsn,
SUM(vm.qty) as sto_qty
FROM
st_ivt_structattr struct
left join md_pb_vehicleMater vm on struct.vehicle_code = vm.vehicle_code
left join md_me_materialbase material on vm.material_id = material.material_id
where struct.vehicle_code is not null
and vm.is_delete = false
and struct.lock_type = '00'
and struct.is_used = '1'
and struct.is_used = '1'
and vm.frozen_qty = '0'
and vm.material_id in
<foreach collection="materials" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
GROUP BY pcsn,stor_code ORDER BY sto_qty desc
</select>
</mapper>

View File

@@ -22,6 +22,7 @@ public class StructattrQuery extends BaseQuery<StIvtStructattr> {
private Boolean has_vehicle = Boolean.FALSE;
private String material;
private Boolean has;
private Boolean assign;
@Override
public void paramMapping() {
super.doP.put("search", QParam.builder().k(new String[]{"struct_code"}).type(QueryTEnum.LK).build());

View File

@@ -20,6 +20,7 @@ import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
import org.nl.wms.stor_manage.record.service.IStIvtStructivtflowService;
import org.nl.wms.stor_manage.record.service.dao.StIvtStructivtflow;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.stor_manage.struct.service.dao.StructAssignQty;
import org.nl.wms.stor_manage.struct.service.dao.mapper.StIvtStructattrMapper;
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -53,6 +54,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
private IMdPbVehicleMaterService vehicleMaterService;
@Autowired
private IStIvtStructivtflowService structivtflowService;
@Autowired
private ISysParamService iSysParamService;
@Autowired
@@ -179,4 +181,13 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
build.setTotalElements(page.getTotal());
return build;
}
@Override
public List<StructAssignQty> getStructIvtAssign(List<String> materials, String stor_code) {
if (StringUtils.isEmpty(stor_code) || materials == null || materials.size() == 0){
throw new BadRequestException("查询可用库存失败:物料或仓库未指定");
}
List<StructAssignQty> mst_detail = this.baseMapper.getStructIvtAssign(materials, stor_code);
return mst_detail;
}
}

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kingdee.bos.webapi.entity.*;
import com.kingdee.bos.webapi.sdk.K3CloudApi;
import lombok.extern.slf4j.Slf4j;
@@ -13,6 +14,8 @@ import org.nl.common.utils.BaseCode;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.MapOf;
import org.nl.config.lucene.LuceneAppender;
import org.nl.wms.base_manage.material.service.IMdMeMaterialbaseService;
import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
import org.nl.wms.external_system.erp.dto.ErpQuery;
import org.nl.wms.external_system.erp.dto.ErpSec;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
@@ -45,6 +48,8 @@ public class SyncErpBillsScheduleService {
@Autowired
private SyncFormMappingServiceImpl syncFormMappingServiceImpl;
@Autowired
private IMdMeMaterialbaseService iMdMeMaterialbaseService;
@Autowired
private IPmFormDataService formDataService;
@@ -206,20 +211,24 @@ public class SyncErpBillsScheduleService {
log.error("ERP单据同步失败:{}", error);
}
Set<String> exitFormDataList = pmFormDataMapper.existFormDataList();
外部:
for (Object r : result) {
try {
JSONArray mappingJsonArray = JSONArray.parseArray(mappingJson);
List<PmFormData> formDataList = formDataService.syncAnalyse(mappingJsonArray, formType, dtlSplit, JSON.toJSONString(r));
for (PmFormData formData : formDataList) {
try {
//log.error(JSON.toJSONString(r));
if (!exitFormDataList.contains(formData.getId())) {
formDataService.save(formData);
}
} catch (Exception e) {
log.error("保存数据 [{}] 时出现异常: {}", JSON.toJSONString(formData), e.getMessage());
Set<String> materials = formDataList.stream().map(PmFormData::getMaterial_id).collect(Collectors.toSet());
int materialCount = iMdMeMaterialbaseService.count(new QueryWrapper<MdMeMaterialbase>().in("material_id", materials));
if (materialCount!=materials.size()){
log.error("保存数据 [{}] 时出现异常: {}", JSON.toJSONString(formDataList), "物料信息不存在"+materials.toString());
}
for (String id : formDataList.stream().map(PmFormData::getId).collect(Collectors.toList())) {
if (exitFormDataList.contains(id)) {
continue 外部;
}
}
for (PmFormData formData : formDataList) {
formDataService.save(formData);
}
} catch (Exception e) {
log.error("解析数据 [{}] 时出现异常: {}", JSON.toJSONString(r), e.getMessage());
}
@@ -233,6 +242,4 @@ public class SyncErpBillsScheduleService {
}
}
}
}