add:1.增加CTU线边库手持出库确认;2.ERP单据同步修改已存在未领数量的单据;3.生产入库单自动创建反写生产订单数量自动关单;4.生产领料单自动创建反写用料清单已领数量,未领数量自动关单;

This commit is contained in:
2025-03-04 00:50:07 +08:00
parent 65b57cb6d6
commit 4d3fdeeb47
13 changed files with 215 additions and 87 deletions

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.javaparser.utils.Log; import com.github.javaparser.utils.Log;
import com.google.gson.JsonObject;
import com.kingdee.bos.webapi.entity.*; import com.kingdee.bos.webapi.entity.*;
import com.kingdee.bos.webapi.sdk.K3CloudApi; import com.kingdee.bos.webapi.sdk.K3CloudApi;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.javaparser.utils.Log;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess; import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess;
@@ -18,7 +17,7 @@ import org.springframework.stereotype.Service;
/* /*
* @author ZZQ * @author ZZQ
* @Date 2024/5/6 14:34 * @Date 2024/5/6 14:34
* 回传服务 * CTU回传服务
*/ */
@Service @Service
@Slf4j @Slf4j
@@ -34,15 +33,10 @@ public class CtuProcessHandler implements ClassProcess {
*/ */
@Override @Override
public JSONObject process(JSONObject from, JSONObject param) { public JSONObject process(JSONObject from, JSONObject param) {
String id = from.getString("id");
PmFormData pmFormData = iPmFormDataService.getById(id);
JSONObject vehicleMater = from.getJSONObject("vehicleMater"); JSONObject vehicleMater = from.getJSONObject("vehicleMater");
if (vehicleMater == null) { if (vehicleMater == null) {
LambdaUpdateWrapper<PmFormData> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PmFormData::getId, pmFormData.getId());
updateWrapper.set(PmFormData::getRemark, "CTU出库用料单号异常未获取到物料载具信息vehicleMater,from数据为" + JSON.toJSONString(from));
iPmFormDataService.update(updateWrapper);
log.error("CTU出库用料单号异常未获取到物料载具信息vehicleMater,from数据为" + JSON.toJSONString(from)); log.error("CTU出库用料单号异常未获取到物料载具信息vehicleMater,from数据为" + JSON.toJSONString(from));
return from;
} }
JSONObject sourceFormData = from.getJSONObject("source_form_data"); JSONObject sourceFormData = from.getJSONObject("source_form_data");
if (sourceFormData == null) { if (sourceFormData == null) {
@@ -50,25 +44,36 @@ public class CtuProcessHandler implements ClassProcess {
.set("prd_ppbom_no", "CTU出库用料单号异常未获取到源单信息sourceFormData,from数据为" + JSON.toJSONString(from)) .set("prd_ppbom_no", "CTU出库用料单号异常未获取到源单信息sourceFormData,from数据为" + JSON.toJSONString(from))
.eq("id", vehicleMater.getString("id"))); .eq("id", vehicleMater.getString("id")));
log.error("CTU出库用料单号异常未获取到源单信息sourceFormData,from数据为" + JSON.toJSONString(from)); log.error("CTU出库用料单号异常未获取到源单信息sourceFormData,from数据为" + JSON.toJSONString(from));
} return from;
String billCode = sourceFormData.getString("code");
if (StringUtils.isBlank(billCode)) {
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("prd_ppbom_no", "CTU出库用料单号异常未获取到源单号billCode,from数据为" + JSON.toJSONString(from))
.eq("id", vehicleMater.getString("id")));
log.error("CTU出库用料单号异常未获取到源单号billCode,from数据为" + JSON.toJSONString(from));
} }
try { try {
//更新物料载具信息的出库单据号 String billCode = sourceFormData.getString("code");
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>() String vehicleId = StringUtils.isNotBlank(sourceFormData.getString("vehicle_id")) ? sourceFormData.getString("vehicle_id") : vehicleMater.getString("id");
.set("prd_ppbom_no", billCode) if (StringUtils.isBlank(vehicleId)) {
.eq("id", vehicleMater.getString("id"))); LambdaUpdateWrapper<PmFormData> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PmFormData::getId, sourceFormData.getString("id"));
updateWrapper.set(PmFormData::getRemark, "更新CTU物料载具信息的出库单据号失败,原因为:载具物料表为空载具id为空无法更新用料清单号,form数据" + JSON.toJSONString(from));
iPmFormDataService.update(updateWrapper);
log.error("更新CTU物料载具信息的出库单据号失败,原因为:载具物料表为空载具id为空无法更新用料清单号,form数据" + JSON.toJSONString(from));
} else {
if (StringUtils.isNotBlank(billCode)) {
//更新物料载具信息的出库单据号
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("prd_ppbom_no", billCode)
.eq("id", vehicleId));
} else {
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("prd_ppbom_no", "CTU出库用料单号异常未获取到源单号billCode,from数据为" + JSON.toJSONString(from))
.eq("id", vehicleId));
log.error("CTU出库用料单号异常未获取到源单号billCode,from数据为" + JSON.toJSONString(from));
}
}
} catch (Exception ex) { } catch (Exception ex) {
LambdaUpdateWrapper<PmFormData> updateWrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<PmFormData> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PmFormData::getId, sourceFormData.getString("id")); updateWrapper.eq(PmFormData::getId, sourceFormData.getString("id"));
updateWrapper.set(PmFormData::getRemark, "更新物料载具信息的出库单据号失败,原因为:" + ex.getMessage()); updateWrapper.set(PmFormData::getRemark, "更新CTU物料载具信息的出库单据号失败,原因为:" + ex.getMessage());
iPmFormDataService.update(updateWrapper); iPmFormDataService.update(updateWrapper);
Log.error(ex.getMessage()); log.error("更新CTU物料载具信息的出库单据号失败,原因为:" + ex.getMessage() + ",form数据" + JSON.toJSONString(from));
} }
return from; return from;
} }

View File

@@ -30,6 +30,7 @@ import javax.annotation.Resource;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/* /*
@@ -95,9 +96,11 @@ public class SyncReceiptProcessHandler implements ClassProcess {
if (isSuccess) { if (isSuccess) {
updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成")); updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成"));
updateWrapper.set(PmFormData::getRemark, "回执单创建成功,回传Erp数据为:" + responseStatus.getJSONArray("SuccessEntitys").toJSONString()); updateWrapper.set(PmFormData::getRemark, "回执单创建成功,回传Erp数据为:" + responseStatus.getJSONArray("SuccessEntitys").toJSONString());
Log.error("回传Erp数据为:" + json + ",传输数据为:");
} else { } else {
updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("暂停")); updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("暂停"));
updateWrapper.set(PmFormData::getRemark,"回执单创建失败,原因为:"+errorMessages + ",回传Erp数据为:" + json); updateWrapper.set(PmFormData::getRemark, "回执单创建失败,原因为:" + errorMessages + ",回传Erp数据为:" + json);
Log.error("回传Erp数据为:" + json + ",传输数据为:");
} }
iPmFormDataService.update(updateWrapper); iPmFormDataService.update(updateWrapper);
} catch (Exception ex) { } catch (Exception ex) {
@@ -116,11 +119,9 @@ public class SyncReceiptProcessHandler implements ClassProcess {
return; return;
} }
JSONArray fEntityArray = formData.getJSONObject("Model").getJSONArray("FEntity"); JSONArray fEntityArray = formData.getJSONObject("Model").getJSONArray("FEntity");
//判断生产入库的手工录入与MRP生成方式需回传不同的源单信息
if ("RECEIPT_PRD".equals(formType)) { if ("RECEIPT_PRD".equals(formType)) {
for (int i = 0; i < fEntityArray.size(); i++) { for (int i = 0; i < fEntityArray.size(); i++) {
JSONObject fEntity = fEntityArray.getJSONObject(i); JSONObject fEntity = fEntityArray.getJSONObject(i);
//查询工序汇报单
ErpQuery reportQuery = new ErpQuery(); ErpQuery reportQuery = new ErpQuery();
reportQuery.setFilterString("FMoNumber ='" + fEntity.getString("FMoBillNo") + "'"); reportQuery.setFilterString("FMoNumber ='" + fEntity.getString("FMoBillNo") + "'");
reportQuery.setOrderString("FId desc"); reportQuery.setOrderString("FId desc");
@@ -130,36 +131,63 @@ public class SyncReceiptProcessHandler implements ClassProcess {
throw new BadRequestException("该生产订单未找到对应生产汇报单"); throw new BadRequestException("该生产订单未找到对应生产汇报单");
} }
JSONArray optRptEntry = jsonArray.getJSONObject(0).getJSONArray("OptRptEntry"); JSONArray optRptEntry = jsonArray.getJSONObject(0).getJSONArray("OptRptEntry");
if (fEntity.containsKey("FSrcEntryId")) {
//增加源单分录id
fEntity.put("FSrcEntryId", optRptEntry.getJSONObject(0).getString("SrcEntryId"));
fEntity.put("FSrcEntrySeq", optRptEntry.getJSONObject(0).getString("SrcEntrySeq"));
fEntity.put("FSrcBillType", "SFC_OperationReport");
}
Map<String, Object> linkedMap = new LinkedHashMap<>(); Map<String, Object> linkedMap = new LinkedHashMap<>();
//移除重构源单Id
fEntity.remove("FSrcEntryId");
for (String key : fEntity.keySet()) { for (String key : fEntity.keySet()) {
linkedMap.put(key, fEntity.get(key)); linkedMap.put(key, fEntity.get(key));
} }
//明细字段顺序排列
Map<String, Object> tempMap = new LinkedHashMap<>(); Map<String, Object> tempMap = new LinkedHashMap<>();
for (Map.Entry<String, Object> entry : linkedMap.entrySet()) { for (Map.Entry<String, Object> entry : linkedMap.entrySet()) {
tempMap.put(entry.getKey(), entry.getValue()); tempMap.put(entry.getKey(), entry.getValue());
if ("FMoEntryId".equals(entry.getKey())) { if ("FMoEntrySeq".equals(entry.getKey())) {
//源单编号为工序汇报单号
tempMap.put("FSrcBillNo", jsonArray.getJSONObject(0).getString("BillNo")); tempMap.put("FSrcBillNo", jsonArray.getJSONObject(0).getString("BillNo"));
tempMap.put("FSrcEntryId", optRptEntry.getJSONObject(0).getString("Id"));
tempMap.put("FSrcEntrySeq", optRptEntry.getJSONObject(0).getString("Seq"));
tempMap.put("FSrcBillType", "SFC_OperationReport");
} }
} }
JSONArray fEntityLinkArray = new JSONArray();
JSONObject fEntityLink = new JSONObject();
fEntityLink.put("FEntity_Link_FRuleId", "SFC_OPTRPT2INSTOCK");
fEntityLink.put("FEntity_Link_FSBillId", jsonArray.getJSONObject(0).getString("Id"));
fEntityLink.put("FEntity_Link_FSId", optRptEntry.getJSONObject(0).getString("Id"));
fEntityLink.put("FEntity_Link_FSTableName", "T_SFC_OPTRPTENTRY");
fEntityLink.put("FEntity_Link_FBasePrdRealQtyOld", fEntity.getString("FMustQty"));
fEntityLink.put("FEntity_Link_FBasePrdRealQty", fEntity.getString("FMustQty"));
fEntityLinkArray.add(fEntityLink);
tempMap.put("FEntity_Link", fEntityLinkArray);
fEntity.clear(); fEntity.clear();
fEntity.putAll(tempMap); fEntity.putAll(tempMap);
} }
} }
//判断生产领料单的批次与辅助单位 //判断生产领料单的批次与辅助单位
if ("RECEIPT_PickMtrl".equals(formType)) { if ("RECEIPT_PickMtrl".equals(formType)) {
for (int i = 0; i < fEntityArray.size(); i++) { for (int i = 0; i < fEntityArray.size(); i++) {
JSONObject fEntity = fEntityArray.getJSONObject(i); JSONObject fEntity = fEntityArray.getJSONObject(i);
List<MdMeMaterialbase> materialList = iMdMeMaterialbaseService.list(new LambdaQueryWrapper<MdMeMaterialbase>().eq(MdMeMaterialbase::getMaterial_code,JSON.parseObject(fEntity.getString("FMaterialId")).getString("FNumber"))); ErpQuery prdQuery = new ErpQuery();
prdQuery.setFilterString("FBillNo ='" + fEntity.getString("FPPBomBillNo") + "'");
prdQuery.setOrderString("FId desc");
prdQuery.setFormId("PRD_PPBOM");
JSONArray jsonArray = erpServiceUtils.queryBills(prdQuery);
if (CollectionUtils.isEmpty(jsonArray)) {
throw new BadRequestException("该领料出库单未找到对应用生产用料清单");
}
JSONArray prdEntry = jsonArray.getJSONObject(0).getJSONArray("PPBomEntry");
JSONObject entity;
Optional<JSONObject> filterJsonObject = prdEntry.stream()
.map(obj -> (JSONObject) obj)
.filter(r -> fEntity.getString("FPPBomEntryId").equals(r.getString("Id")))
.findFirst();
if (filterJsonObject.isPresent()) {
entity = filterJsonObject.get();
} else {
throw new BadRequestException("该领料出库单的对应用生产用料清单未找到对应的物料明细");
}
List<MdMeMaterialbase> materialList = iMdMeMaterialbaseService.list(new LambdaQueryWrapper<MdMeMaterialbase>().eq(MdMeMaterialbase::getMaterial_code, JSON.parseObject(fEntity.getString("FMaterialId")).getString("FNumber")));
if (ObjectUtil.isEmpty(materialList)) { if (ObjectUtil.isEmpty(materialList)) {
throw new BadRequestException("回传失败:查询物料信息,物料编码不存在:"+JSON.parseObject(fEntity.getString("FMaterialId")).getString("FNumber")); throw new BadRequestException("回传失败:查询物料信息,物料编码不存在:" + JSON.parseObject(fEntity.getString("FMaterialId")).getString("FNumber"));
} }
MdMeMaterialbase materialInfo = materialList.get(0); MdMeMaterialbase materialInfo = materialList.get(0);
//没有启用批次号 //没有启用批次号
@@ -181,12 +209,26 @@ public class SyncReceiptProcessHandler implements ClassProcess {
fUnit.put("FNumber", materialInfo.getAssist_unit_id()); fUnit.put("FNumber", materialInfo.getAssist_unit_id());
tempMap.put("FSecUnitId", fUnit); tempMap.put("FSecUnitId", fUnit);
} }
// if ("FStockId".equals(entry.getKey())) { if ("FActualQty".equals(entry.getKey())) {
// JSONObject fStockId = new JSONObject(); tempMap.put("FSrcBillType", "PRD_PPBOM");
// fStockId.put("FNumber", "25"); tempMap.put("FSrcBillNo", jsonArray.getJSONObject(0).getString("BillNo"));
// tempMap.put("FStockId", fStockId); tempMap.put("FEntrySrcEnteryId", entity.getString("Id"));
// } tempMap.put("FEntrySrcEntrySeq", entity.getString("Seq"));
}
} }
JSONArray fEntityLinkArray = new JSONArray();
JSONObject fEntityLink = new JSONObject();
fEntityLink.put("FEntity_Link_FFlowLineId", 0);
fEntityLink.put("FEntity_Link_FBaseActualQty", fEntity.getString("FActualQty"));
fEntityLink.put("FEntity_Link_FSId",entity.getString("Id"));
fEntityLink.put("FEntity_Link_FBaseActualQtyOld", fEntity.getString("FActualQty"));
fEntityLink.put("FEntity_Link_FRuleId", "PRD_PPBOM2PICKMTRL_NORMAL");
fEntityLink.put("FEntity_Link_FSTableId", 0);
fEntityLink.put("FEntity_Link_FFlowId","");
fEntityLink.put("FEntity_Link_FSBillId", jsonArray.getJSONObject(0).getString("Id"));
fEntityLink.put("FEntity_Link_FSTableName", "T_PRD_PPBOMENTRY");
fEntityLinkArray.add(fEntityLink);
tempMap.put("FEntity_Link", fEntityLinkArray);
fEntity.clear(); fEntity.clear();
fEntity.putAll(tempMap); fEntity.putAll(tempMap);
} }

View File

@@ -86,5 +86,9 @@ public class MdGruopDick implements Serializable {
private JSONObject form_data = new JSONObject(); private JSONObject form_data = new JSONObject();
/**
* 物料编码
*/
@TableField(exist = false)
private String material_code;
} }

View File

@@ -6,6 +6,7 @@
<result property="id" column="id"/> <result property="id" column="id"/>
<result property="code" column="code"/> <result property="code" column="code"/>
<result property="vehicle_code" column="vehicle_code"/> <result property="vehicle_code" column="vehicle_code"/>
<result property="material_code" column="material_code"/>
<result property="status" column="status"/> <result property="status" column="status"/>
<result property="remark" column="remark"/> <result property="remark" column="remark"/>
<result property="source_form_type" column="source_form_type"/> <result property="source_form_type" column="source_form_type"/>
@@ -19,27 +20,30 @@
<select id="query" resultMap="BaseResultMap"> <select id="query" resultMap="BaseResultMap">
SELECT SELECT
* m.material_code,
d.*
FROM FROM
md_group_dick md_group_dick d
left join md_pb_vehiclemater v on d.id = v.group_id
left join md_me_materialbase m on v.material_id = m.material_id
<where> <where>
<if test="query.material_code != null and query.material_code != ''"> <if test="query.material_code != null and query.material_code != ''">
and material_code LIKE '%${query.material_code}%' and m.material_code LIKE '%${query.material_code}%'
</if> </if>
<if test="query.vehicle_code != null and query.vehicle_code != ''"> <if test="query.vehicle_code != null and query.vehicle_code != ''">
and vehicle_code LIKE '%${query.vehicle_code}%' and d.vehicle_code LIKE '%${query.vehicle_code}%'
</if> </if>
<if test="query.pcsn != null and query.pcsn != ''"> <if test="query.pcsn != null and query.pcsn != ''">
and pcsn = #{query.pcsn} and d.pcsn = #{query.pcsn}
</if> </if>
<if test="query.status != null and query.status != ''"> <if test="query.status != null and query.status != ''">
and status = #{query.status} and d.status = #{query.status}
</if> </if>
<if test="query.form_query != null and query.form_query.size() > 0"> <if test="query.form_query != null and query.form_query.size() > 0">
<foreach collection="query.form_query" item="value" index="key" > <foreach collection="query.form_query" item="value" index="key">
<if test="value != null and value != ''"> <if test="value != null and value != ''">
and JSON_CONTAINS(form_data, '{"${key}":"${value}"}') and JSON_CONTAINS(d.form_data, '{"${key}":"${value}"}')
</if> </if>
</foreach> </foreach>
</if> </if>

View File

@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.kingdee.bos.webapi.sdk.K3CloudApi; import com.kingdee.bos.webapi.sdk.K3CloudApi;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo; import org.nl.common.TableDataInfo;
import org.nl.common.domain.constant.DictConstantPool; import org.nl.common.domain.constant.DictConstantPool;
@@ -89,29 +90,37 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void groupDick(JSONObject forms) { public void groupDick(JSONObject forms) {
List<Map> tableData = (List)forms.remove("item"); List<Map> tableData = (List) forms.remove("item");
if (CollectionUtils.isEmpty(forms)){ if (CollectionUtils.isEmpty(forms)) {
throw new BadRequestException("组盘失败:入库明细数据不能为空"); throw new BadRequestException("组盘失败:入库明细数据不能为空");
} }
JSONObject item0 = new JSONObject(tableData.get(0)); JSONObject item0 = new JSONObject(tableData.get(0));
String vehicle0 = item0.getString("vehicle_code"); String vehicle0 = item0.getString("vehicle_code");
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.vehileInfo(vehicle0); BmVehicleInfo vehicleInfo = iBmVehicleInfoService.vehileInfo(vehicle0);
if(vehicleInfo==null){ if (vehicleInfo == null) {
throw new BadRequestException("组盘失败:载具"+vehicle0+"信息不存在请在载具信息中维护"); throw new BadRequestException("组盘失败:载具" + vehicle0 + "信息不存在请在载具信息中维护");
} }
Integer h = vehicleInfo.getH(); Integer h = vehicleInfo.getH();
RedissonUtils.lock(()->{ RedissonUtils.lock(() -> {
//组盘前库存校验
QueryWrapper<StIvtStructattr> ivtList = new QueryWrapper<StIvtStructattr>()
.eq("vehicle_code", vehicleInfo.getVehicle_code());
List<StIvtStructattr> existList = iStIvtStructattrService.list(ivtList);
if (ObjectUtils.isNotEmpty(existList)) {
throw new BadRequestException(String.format("组盘失败:当前载具号在立库的库位中未出库:%s中请核查库存记录!", existList.get(0).getStruct_code()));
}
//组盘前符合条件库位数量校验
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>() QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
.eq("is_used", true) .eq("is_used", true)
.eq("lock_type", StatusEnum.LOCK.code("无锁")) .eq("lock_type", StatusEnum.LOCK.code("无锁"))
.eq("stor_code", forms.getString("stor_code")) .eq("stor_code", forms.getString("stor_code"))
.isNull("vehicle_code"); .isNull("vehicle_code");
if (h!=null){ if (h != null) {
query.ge("h",h); query.ge("h", h);
} }
int structCount = iStIvtStructattrService.count(query); int structCount = iStIvtStructattrService.count(query);
if (structCount< DictConstantPool.STRUCT_COUNT){ if (structCount < DictConstantPool.STRUCT_COUNT) {
throw new BadRequestException("入库失败:当前仓库可用库位小于"+DictConstantPool.STRUCT_COUNT); throw new BadRequestException("入库失败:当前仓库可用库位小于" + DictConstantPool.STRUCT_COUNT);
} }
}, StatusEnum.STRATEGY_TYPE.code("入库")+forms.getString("stor_code"),5); }, StatusEnum.STRATEGY_TYPE.code("入库")+forms.getString("stor_code"),5);
@@ -218,6 +227,19 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
@Transactional @Transactional
public void delete(String[] ids) { public void delete(String[] ids) {
if (ids != null && ids.length > 0) { if (ids != null && ids.length > 0) {
if (ids.length > 1) {
throw new BadRequestException("删除失败:请选择一条数据");
}
List<MdGruopDick> groupDick = this.list(new QueryWrapper<MdGruopDick>().eq("id", ids[0]));
RedissonUtils.lock(() -> {
//已产生入库任务或已入库不能删除
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
.eq("vehicle_code", groupDick.get(0).getVehicle_code());
List<StIvtStructattr> list = iStIvtStructattrService.list(query);
if (ObjectUtils.isNotEmpty(list)) {
throw new BadRequestException("删除失败:当前料箱号已入库,库存位置为:" + list.get(0).getStruct_code() + ",无法删除!");
}
}, StatusEnum.STRATEGY_TYPE.code("出库") + groupDick.get(0).getVehicle_code(), 5);
this.removeByIds(Arrays.asList(ids)); this.removeByIds(Arrays.asList(ids));
List<MdPbVehicleMater> vehicleMaterList = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>().select("id").in("group_id", ids)); List<MdPbVehicleMater> vehicleMaterList = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>().select("id").in("group_id", ids));
if (ObjectUtil.isNotEmpty(vehicleMaterList)) { if (ObjectUtil.isNotEmpty(vehicleMaterList)) {

View File

@@ -55,7 +55,7 @@ public class GroupOrderController {
@PostMapping("in") @PostMapping("in")
@SaIgnore @SaIgnore
@Log("手持组盘操作") @Log("手持合格证组盘操作")
public ResponseEntity<Object> inStorage(@RequestBody MaterGroupDto form) { public ResponseEntity<Object> inStorage(@RequestBody MaterGroupDto form) {
Assert.noNullElements(new Object[]{form,form.getItem(),form.getStor_code()},"请求参数不能为空"); Assert.noNullElements(new Object[]{form,form.getItem(),form.getStor_code()},"请求参数不能为空");
for (MaterItem item : form.getItem()) { for (MaterItem item : form.getItem()) {

View File

@@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo; import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log; import org.nl.common.anno.Log;
@@ -24,6 +25,7 @@ import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
@@ -32,6 +34,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
@@ -58,6 +61,7 @@ public class IOStorageController {
@PostMapping("out") @PostMapping("out")
@SaIgnore @SaIgnore
@Log("手持出库出库确认") @Log("手持出库出库确认")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity<Object> outStorage(@RequestBody JSONObject form) { public ResponseEntity<Object> outStorage(@RequestBody JSONObject form) {
String vehicle_code = form.getString("vehicle_code"); String vehicle_code = form.getString("vehicle_code");
List<MdPbVehicleMater> ones = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>() List<MdPbVehicleMater> ones = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
@@ -68,16 +72,31 @@ public class IOStorageController {
RedissonUtils.lock(() -> { RedissonUtils.lock(() -> {
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>() QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
.eq("is_used", true) .eq("is_used", true)
.eq("lock_type", StatusEnum.LOCK.code("无锁"))
.eq("vehicle_code", vehicle_code); .eq("vehicle_code", vehicle_code);
List<StIvtStructattr> list = iStIvtStructattrService.list(query); List<StIvtStructattr> list = iStIvtStructattrService.list(query);
//todo 二楼出库调通后注释 if (ObjectUtils.isNotEmpty(list)) {
long storageCount = list.stream().filter(r -> r.getStor_code().equals(StatusEnum.STOCK_INFO.code("FStockPallet")) || List<StIvtStructattr> ivtList = list.stream().filter(r -> r.getStor_code().equals(StatusEnum.STOCK_INFO.code("二楼ctu缓存库")) ||
r.getStor_code().equals(StatusEnum.STOCK_INFO.code("料箱")) || r.getStor_code().equals(StatusEnum.STOCK_INFO.code("二楼货架缓存"))).collect(Collectors.toList());
r.getStor_code().equals(StatusEnum.STOCK_INFO.code("虚拟库"))).count(); if (ObjectUtils.isNotEmpty(ivtList)) {
if (storageCount > 0) { //CTU线边库已出库未确认清除CTU库库存与组盘记录
throw new BadRequestException(String.format("出库确认失败:当前载具号在立库的库位中未出库:%s中请核查库存记录!", list.get(0).getStruct_code())); iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("is_delete", true)
.set("qty", "0")
.set("update_time", DateUtil.now())
.set("update_name", SecurityUtils.getCurrentNickName())
.eq("vehicle_code", vehicle_code)
.eq("is_delete", false));
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>()
.set("lock_type", StatusEnum.LOCK.code("无锁"))
.set("vehicle_code",null)
.set("update_time", DateUtil.now())
.set("update_name", SecurityUtils.getCurrentNickName())
.eq("struct_code", ivtList.get(0).getStruct_code()));
} else {
throw new BadRequestException(String.format("出库确认失败:当前载具号在立库的库位中未出库:%s中请核查库存记录!", list.get(0).getStruct_code()));
}
} }
}, StatusEnum.STRATEGY_TYPE.code("出库") + vehicle_code, 5); }, StatusEnum.STRATEGY_TYPE.code("出库") + vehicle_code, 5);
//流程校验 //流程校验
for (MdPbVehicleMater one : ones) { for (MdPbVehicleMater one : ones) {

View File

@@ -12,7 +12,6 @@ import com.kingdee.bos.webapi.sdk.K3CloudApi;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.A;
import org.nl.common.domain.exception.BadRequestException; import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum; import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.*; import org.nl.common.utils.*;
@@ -22,8 +21,6 @@ import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
import org.nl.wms.base_manage.material.service.impl.MdMeMaterialbaseServiceImpl; import org.nl.wms.base_manage.material.service.impl.MdMeMaterialbaseServiceImpl;
import org.nl.wms.base_manage.measure.service.dao.BmMeasureUnit; import org.nl.wms.base_manage.measure.service.dao.BmMeasureUnit;
import org.nl.wms.base_manage.measure.service.impl.BmMeasureUnitServiceImpl; import org.nl.wms.base_manage.measure.service.impl.BmMeasureUnitServiceImpl;
import org.nl.wms.base_manage.sect.service.IStIvtSectattrService;
import org.nl.wms.base_manage.sect.service.dao.StIvtSectattr;
import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService; import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc; import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService; import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
@@ -61,7 +58,10 @@ import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
@@ -250,6 +250,9 @@ public class PdaIOService {
if (ObjectUtils.isEmpty(pointList)) { if (ObjectUtils.isEmpty(pointList)) {
throw new BadRequestException("输入的站点编号有误或被禁用,请检查!"); throw new BadRequestException("输入的站点编号有误或被禁用,请检查!");
} }
if (pointList.get(0).getLock_type().equals(StatusEnum.LOCK.code("无锁")) && "0".equals(pointList.get(0).getPoint_type())) {
throw new BadRequestException("小车搬运任务未完成,请稍后再扫码确认!");
}
if (StringUtils.isNotBlank(pointList.get(0).getVehicle_code())) { if (StringUtils.isNotBlank(pointList.get(0).getVehicle_code())) {
List<StIvtStructattr> stIvtStructattrList = iStIvtStructattrService.list(new LambdaQueryWrapper<StIvtStructattr>() List<StIvtStructattr> stIvtStructattrList = iStIvtStructattrService.list(new LambdaQueryWrapper<StIvtStructattr>()
.eq(StIvtStructattr::getSect_code, pointList.get(0).getVehicle_code()) .eq(StIvtStructattr::getSect_code, pointList.get(0).getVehicle_code())
@@ -259,7 +262,7 @@ public class PdaIOService {
.collect(Collectors.toList()); .collect(Collectors.toList());
//清除载具物料组盘信息 //清除载具物料组盘信息
iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>() iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
.set("frozen_qty",0) .set("frozen_qty", 0)
.set("qty",0) .set("qty",0)
.set("is_delete",true) .set("is_delete",true)
.set("remark","该料箱的物料已从产线取走") .set("remark","该料箱的物料已从产线取走")

View File

@@ -86,7 +86,7 @@ public class PmFormDataController {
@PostMapping ("/syncFeedBack") @PostMapping ("/syncFeedBack")
@Log("手动同步单据") @Log("手动回执单同步")
public ResponseEntity<Object> syncFeedBack(@RequestBody JSONObject fromData) { public ResponseEntity<Object> syncFeedBack(@RequestBody JSONObject fromData) {
return new ResponseEntity<>(iPmFormDataService.syncFeedBack(fromData),HttpStatus.OK); return new ResponseEntity<>(iPmFormDataService.syncFeedBack(fromData),HttpStatus.OK);
} }

View File

@@ -109,7 +109,7 @@ public class PmFormDataServiceImpl extends ServiceImpl<PmFormDataMapper, PmFormD
/** /**
* 手动同步单据 * 手动推送回执单据
*/ */
@Override @Override
public String syncFeedBack(JSONObject jsonData) { public String syncFeedBack(JSONObject jsonData) {

View File

@@ -6,16 +6,14 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.kingdee.bos.webapi.entity.*; import com.kingdee.bos.webapi.entity.*;
import com.kingdee.bos.webapi.sdk.K3CloudApi; import com.kingdee.bos.webapi.sdk.K3CloudApi;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException; import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.BaseCode; import org.nl.common.utils.*;
import org.nl.common.utils.ErpServiceUtils;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.MapOf;
import org.nl.config.lucene.LuceneAppender; import org.nl.config.lucene.LuceneAppender;
import org.nl.wms.base_manage.material.service.IMdMeMaterialbaseService; import org.nl.wms.base_manage.material.service.IMdMeMaterialbaseService;
import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase; import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
@@ -26,6 +24,7 @@ import org.nl.wms.external_system.erp.dto.ErpSec;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService; import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
import org.nl.wms.pm_manage.form_data.service.dao.PmFormData; 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.dao.mapper.PmFormDataMapper;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping; import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
import org.nl.wms.sync_manage.service.form_mapping.impl.SyncFormMappingServiceImpl; import org.nl.wms.sync_manage.service.form_mapping.impl.SyncFormMappingServiceImpl;
import org.slf4j.MDC; import org.slf4j.MDC;
@@ -35,6 +34,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
@@ -275,7 +275,7 @@ public class SyncErpBillsScheduleService {
.filter(rt -> new HashSet<>(Arrays.asList("1233925", "1233926")).contains(rt.getForm_data().getString(stockId))) .filter(rt -> new HashSet<>(Arrays.asList("1233925", "1233926")).contains(rt.getForm_data().getString(stockId)))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (ObjectUtils.isNotEmpty(filteredDetails)) { if (ObjectUtils.isNotEmpty(filteredDetails)) {
mainBill.addAll(filteredDetails); mainBill.addAll(detailWithStock);
} else { } else {
continue; continue;
} }
@@ -295,15 +295,35 @@ public class SyncErpBillsScheduleService {
} }
} }
for (PmFormData f : mainBill) { for (PmFormData f : mainBill) {
if (exitFormDataList.contains(f.getId() + "$" + f.getForm_type())) { //存在ID主单据不新增不修改修改未出库单据的明细
continue 外部; String id = f.getId() + "$" + f.getForm_type();
if (exitFormDataList.contains(id)) {
//单据明细
if (StringUtils.isBlank(f.getCode())) {
PmFormData existDtlData = formDataService.getOne(new QueryWrapper<PmFormData>().eq("id",id).select("qty"));
//同步修改未出库单据
if (existDtlData.getQty().compareTo(BigDecimal.ZERO) > 0||f.getPlan_qty().compareTo(f.getAssign_qty()) > 0) {
formDataService.update(new LambdaUpdateWrapper<PmFormData>()
.set(PmFormData::getMaterial_id, f.getMaterial_id())
.set(PmFormData::getQty, f.getQty())
.set(PmFormData::getAssign_qty, f.getAssign_qty())
.set(PmFormData::getUnit_id, f.getUnit_id())
.set(PmFormData::getForm_data, JSON.toJSONString(f.getForm_data()))
.set(PmFormData::getPlan_qty, f.getPlan_qty())
.set(PmFormData::getBar_code, f.getBar_code())
.set(PmFormData::getUpdate_name, DateUtil.now())
.set(PmFormData::getUpdate_name, SecurityUtils.getCurrentNickName())
.eq(PmFormData::getId, id));
}
}
} else {
//单据明细
if (StringUtils.isBlank(f.getCode())) {
f.setParent_id(mainId + "$" + formType);
}
f.setId(id);
formDataService.save(f);
} }
//单据明细
if (StringUtils.isBlank(f.getCode())) {
f.setParent_id(mainId + "$" + formType);
}
f.setId(f.getId() + "$" + f.getForm_type());
formDataService.save(f);
} }
} catch (Exception e) { } catch (Exception e) {
errorMsg.put("result第"+i+1+"条解析异常:",e.getMessage()); errorMsg.put("result第"+i+1+"条解析异常:",e.getMessage());

View File

@@ -11,6 +11,16 @@
label-width="100px" label-width="100px"
label-suffix=":" label-suffix=":"
> >
<el-form-item label="物料编码">
<el-input
v-model="
query.material_code"
clearable
placeholder="物料编码"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item label="载具号"> <el-form-item label="载具号">
<el-input <el-input
v-model=" v-model="