no message

main
HUOJIN\92525 2026-01-18 00:05:13 +08:00
parent 88176e1522
commit b0ec269b7d
11 changed files with 25479 additions and 19 deletions

View File

@ -324,4 +324,19 @@ public class AsnController {
} }
} }
@AutoLog(value = "入库-手工关单")
@Operation(summary = "入库-手工关单")
@RequiresPermissions("receive:data_asn:closeAsn")
@GetMapping(value = "/closeAsn")
public Result<String> closeAsn(@RequestParam(name = "ids", required = true) String ids) {
try {
List<String> idsList = Arrays.asList(ids.split(","));
List<Long> asnIds = idsList.stream().map(Long::parseLong).toList();
asnService.closeAsn(asnIds);
return Result.OK("操作成功");
} catch (Exception e) {
return Result.error("操作异常:" + e.getMessage());
}
}
} }

View File

@ -7,6 +7,7 @@ import org.cpte.modules.receive.entity.Asn;
import org.cpte.modules.receive.entity.AsnDetail; import org.cpte.modules.receive.entity.AsnDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.cpte.modules.shipping.entity.PickDetail;
/** /**
* @Description: * @Description:
@ -22,7 +23,7 @@ public interface AsnDetailMapper extends BaseMapper<AsnDetail> {
* @param mainId id * @param mainId id
* @return boolean * @return boolean
*/ */
public boolean deleteByMainId(@Param("mainId") Long mainId); boolean deleteByMainId(@Param("mainId") Long mainId);
/** /**
* id * id
@ -30,7 +31,15 @@ public interface AsnDetailMapper extends BaseMapper<AsnDetail> {
* @param mainId id * @param mainId id
* @return List<AsnDetail> * @return List<AsnDetail>
*/ */
public List<AsnDetail> selectByMainId(@Param("mainId") Long mainId); List<AsnDetail> selectByMainId(@Param("mainId") Long mainId);
/**
* id
*
* @param asnIds id
* @return List<AsnDetail>
*/
List<AsnDetail> queryByAsnIds(@Param("asnIds") List<Long> asnIds);
/** /**

View File

@ -25,4 +25,15 @@
AND status = #{status} AND status = #{status}
</if> </if>
</select> </select>
<select id="queryByAsnIds" resultType="org.cpte.modules.receive.entity.AsnDetail">
SELECT *
FROM data_asn_detail
WHERE
asn_id IN
<foreach item="asnId" index="index" collection="asnIds" open="(" separator="," close=")">
#{asnId}
</foreach>
ORDER BY line_no
</select>
</mapper> </mapper>

View File

@ -9,6 +9,7 @@ import org.cpte.modules.receive.entity.AsnDetail;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import org.cpte.modules.receive.entity.ReceiveRecord; import org.cpte.modules.receive.entity.ReceiveRecord;
import org.cpte.modules.saiWms.request.InboundRequest; import org.cpte.modules.saiWms.request.InboundRequest;
import org.cpte.modules.shipping.entity.Pick;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
@ -28,7 +29,15 @@ public interface IAsnDetailService extends IService<AsnDetail> {
* @param mainId id * @param mainId id
* @return List<AsnDetail> * @return List<AsnDetail>
*/ */
public List<AsnDetail> selectByMainId(Long mainId); List<AsnDetail> selectByMainId(Long mainId);
/**
* IDMap
*
* @param asnIds ID
* @return Map<Long, Asn>
*/
Map<Long, Asn> queryByAsnIdsToMap(List<Long> asnIds);
/** /**
* *

View File

@ -71,6 +71,10 @@ public interface IAsnService extends IService<Asn> {
*/ */
void cancelAsn(Asn asn); void cancelAsn(Asn asn);
/**
*
*
* @param asnIds ID
*/
void closeAsn(List<Long> asnIds);
} }

View File

@ -1,6 +1,7 @@
package org.cpte.modules.receive.service.impl; package org.cpte.modules.receive.service.impl;
import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.cpte.modules.agvTask.service.IAgvTaskService; import org.cpte.modules.agvTask.service.IAgvTaskService;
import org.cpte.modules.base.entity.Item; import org.cpte.modules.base.entity.Item;
@ -19,14 +20,12 @@ import org.cpte.modules.receive.mapper.AsnMapper;
import org.cpte.modules.receive.service.IAsnDetailService; import org.cpte.modules.receive.service.IAsnDetailService;
import org.cpte.modules.saiWms.request.InboundRequest; import org.cpte.modules.saiWms.request.InboundRequest;
import org.cpte.modules.serialNumber.AsnSerialNumberRule; import org.cpte.modules.serialNumber.AsnSerialNumberRule;
import org.cpte.modules.shipping.entity.Pick;
import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.LoginUser;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -62,6 +61,19 @@ public class AsnDetailServiceImpl extends ServiceImpl<AsnDetailMapper, AsnDetail
return this.baseMapper.selectByMainId(mainId); return this.baseMapper.selectByMainId(mainId);
} }
@Override
public Map<Long, Asn> queryByAsnIdsToMap(List<Long> asnIds) {
if (CollectionUtils.isEmpty(asnIds)) {
return Collections.emptyMap();
}
Map<Long, Asn> asnMap = new HashMap<>();
List<Asn> asnList = asnMapper.selectByIds(asnIds);
for (Asn asn : asnList) {
asnMap.put(asn.getId(), asn);
}
return asnMap;
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void processorSaveMain(Asn asn, List<AsnDetail> asnDetailList) { public void processorSaveMain(Asn asn, List<AsnDetail> asnDetailList) {

View File

@ -10,6 +10,7 @@ import org.cpte.modules.base.entity.Stock;
import org.cpte.modules.base.mapper.StockMapper; import org.cpte.modules.base.mapper.StockMapper;
import org.cpte.modules.constant.enums.AsnStatusEnum; import org.cpte.modules.constant.enums.AsnStatusEnum;
import org.cpte.modules.constant.enums.CommonStatusEnum; import org.cpte.modules.constant.enums.CommonStatusEnum;
import org.cpte.modules.constant.enums.PickStatusEnum;
import org.cpte.modules.receive.entity.Asn; import org.cpte.modules.receive.entity.Asn;
import org.cpte.modules.receive.entity.AsnDetail; import org.cpte.modules.receive.entity.AsnDetail;
import org.cpte.modules.receive.mapper.AsnDetailMapper; import org.cpte.modules.receive.mapper.AsnDetailMapper;
@ -18,6 +19,8 @@ import org.cpte.modules.receive.service.IAsnDetailService;
import org.cpte.modules.receive.service.IAsnService; import org.cpte.modules.receive.service.IAsnService;
import org.cpte.modules.receive.service.processor.ReceiveProcessor; import org.cpte.modules.receive.service.processor.ReceiveProcessor;
import org.cpte.modules.saiWms.request.InboundRequest; import org.cpte.modules.saiWms.request.InboundRequest;
import org.cpte.modules.shipping.entity.Pick;
import org.cpte.modules.shipping.entity.PickDetail;
import org.cpte.modules.utils.RedisDistributedLockUtil; import org.cpte.modules.utils.RedisDistributedLockUtil;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -28,6 +31,7 @@ import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/** /**
* @Description: * @Description:
@ -168,4 +172,35 @@ public class AsnServiceImpl extends ServiceImpl<AsnMapper, Asn> implements IAsnS
} }
} }
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void closeAsn(List<Long> asnIds) {
if (CollectionUtils.isEmpty(asnIds)) {
throw new RuntimeException("请选择需要关闭的入库单");
}
Map<Long, Asn> asnMap = asnDetailService.queryByAsnIdsToMap(asnIds);
List<AsnDetail> asnDetails = asnDetailMapper.queryByAsnIds(asnIds);
//根据出库单ID分组
Map<Long, List<AsnDetail>> asnDetailMapGroup = asnDetails.stream().collect(Collectors.groupingBy(AsnDetail::getAsnId));
//遍历集合
List<Asn> asnToUpdate = new ArrayList<>();
List<AsnDetail> asnDetailToUpdate = new ArrayList<>();
for (Map.Entry<Long, List<AsnDetail>> entry : asnDetailMapGroup.entrySet()) {
Asn asn = asnMap.get(entry.getKey());
List<AsnDetail> asnDetailList = entry.getValue();
for (AsnDetail asnDetail : asnDetailList) {
asnDetail.setStatus(AsnStatusEnum.CLOSED.getValue());
asnDetailToUpdate.add(asnDetail);
}
asn.setStatus(AsnStatusEnum.CLOSED.getValue());
asnToUpdate.add(asn);
}
if (CollectionUtils.isNotEmpty(asnDetailToUpdate)) {
asnDetailMapper.updateById(asnDetailToUpdate);
}
if (CollectionUtils.isNotEmpty(asnToUpdate)) {
this.updateBatchById(asnToUpdate);
}
}
} }

View File

@ -382,14 +382,11 @@ public class PickController {
} }
} }
@AutoLog(value = "手工关单") @AutoLog(value = "出库-手工关单")
@Operation(summary = "手工关单") @Operation(summary = "出库-手工关单")
@RequiresPermissions("shipping:data_pick:closePick") @RequiresPermissions("shipping:data_pick:closePick")
@GetMapping(value = "/closePick") @GetMapping(value = "/closePick")
public Result<String> closePick(@RequestParam(name = "ids", required = true) String ids) { public Result<String> closePick(@RequestParam(name = "ids", required = true) String ids) {
if (StringUtils.isBlank(ids)) {
return Result.error("请选择需要拣货的出库单");
}
try { try {
List<String> idsList = Arrays.asList(ids.split(",")); List<String> idsList = Arrays.asList(ids.split(","));
List<Long> pickIds = idsList.stream().map(Long::parseLong).toList(); List<Long> pickIds = idsList.stream().map(Long::parseLong).toList();

View File

@ -14,6 +14,7 @@ import org.cpte.modules.shipping.entity.PickDetail;
import org.cpte.modules.shipping.entity.Task; import org.cpte.modules.shipping.entity.Task;
import org.cpte.modules.shipping.mapper.PickDetailMapper; import org.cpte.modules.shipping.mapper.PickDetailMapper;
import org.cpte.modules.shipping.mapper.TaskMapper; import org.cpte.modules.shipping.mapper.TaskMapper;
import org.cpte.modules.shipping.service.IPickDetailService;
import org.cpte.modules.shipping.vo.PickData; import org.cpte.modules.shipping.vo.PickData;
import org.cpte.modules.utils.SwmsLoginUtil; import org.cpte.modules.utils.SwmsLoginUtil;
import org.jeecg.modules.openapi.mapper.OpenApiMapper; import org.jeecg.modules.openapi.mapper.OpenApiMapper;
@ -37,6 +38,9 @@ public class PickBackProcessor {
@Autowired @Autowired
private PickDetailMapper pickDetailMapper; private PickDetailMapper pickDetailMapper;
@Autowired
private IPickDetailService pickDetailService;
@Autowired @Autowired
private TaskMapper taskMapper; private TaskMapper taskMapper;
@ -106,11 +110,14 @@ public class PickBackProcessor {
* @param tasks * @param tasks
*/ */
public void pickBack(PickData data, List<Task> tasks) { public void pickBack(PickData data, List<Task> tasks) {
if (CollectionUtils.isEmpty(tasks)) {
tasks = tasks.stream().filter(task -> task.getPlanQty().equals(task.getMoveQty())).toList(); return;
}
List<Long> pickDetailIds = tasks.stream().map(Task::getPickDetailId).toList();
Map<Long, PickDetail> pickDetailMap = pickDetailService.queryByPickDetailIdsToMap(pickDetailIds);
for (Task task : tasks) { for (Task task : tasks) {
Pick pick = data.getPickMap().get(task.getPickId()); Pick pick = data.getPickMap().get(task.getPickId());
PickDetail pickDetail = data.getPickDetailMap().get(task.getPickDetailId()); PickDetail pickDetail = pickDetailMap.get(task.getPickDetailId());
Long pickId = pick.getId(); Long pickId = pick.getId();
try { try {
List<PickDetail> pickDetails = pickDetailMapper.selectByMainId(pickId); List<PickDetail> pickDetails = pickDetailMapper.selectByMainId(pickId);
@ -134,7 +141,7 @@ public class PickBackProcessor {
private void pickBackProcessor(Pick pick, PickDetail pickDetail, Task task, Integer state) { private void pickBackProcessor(Pick pick, PickDetail pickDetail, Task task, Integer state) {
// 检查接口开关, 未开启则返回 // 检查接口开关, 未开启则返回
if (sysDictMapper.queryByDictCode(GeneralConstant.OPEN_FLAG) == null) { if (sysDictMapper.queryByDictCode(GeneralConstant.OPEN_FLAG) == null) {
updatePickDetailResponse(pickDetail, task, GeneralConstant.SMOM_FAIL_CODE,null ,"接口未开启"); updatePickDetailResponse(pickDetail, task, GeneralConstant.SMOM_SUCCESS_CODE,null ,"接口未开启");
return; return;
} }
@ -210,7 +217,7 @@ public class PickBackProcessor {
*/ */
private void updatePickDetailResponse(PickDetail pickDetail, Task task, String code, String reqMessage, String resMessage) { private void updatePickDetailResponse(PickDetail pickDetail, Task task, String code, String reqMessage, String resMessage) {
if (GeneralConstant.SMOM_SUCCESS_CODE.equals(code)) { if (GeneralConstant.SMOM_SUCCESS_CODE.equals(code)) {
if (pickDetail.getOrderQty().equals(pickDetail.getPickedQty())) { if (pickDetail.getOrderQty().compareTo(pickDetail.getPickedQty()) == 0) {
pickDetail.setStatus(PickStatusEnum.CLOSED.getValue()); pickDetail.setStatus(PickStatusEnum.CLOSED.getValue());
pickDetailMapper.updateById(pickDetail); pickDetailMapper.updateById(pickDetail);
} }

View File

@ -6,6 +6,14 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.util.RestUtil; import org.jeecg.common.util.RestUtil;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
public class TesStock { public class TesStock {
public static void main(String[] args) { public static void main(String[] args) {
@ -19,6 +27,7 @@ public class TesStock {
String url = "http://10.254.27.191/tes/apiv2/getPodList"; String url = "http://10.254.27.191/tes/apiv2/getPodList";
JSONObject stockInfo = RestUtil.post(url, params); JSONObject stockInfo = RestUtil.post(url, params);
//JSONObject stockInfo = stockInfo();
JSONObject data = stockInfo.getJSONObject("data"); JSONObject data = stockInfo.getJSONObject("data");
if (data == null) { if (data == null) {
return; return;
@ -33,4 +42,46 @@ public class TesStock {
} }
} }
} }
private static JSONObject stockInfo(){
// 方案2从外部文件读取
try {
String jsonString = readFileToString("stock_data.json"); // 从资源文件读取
return JSONObject.parseObject(jsonString);
} catch (Exception e) {
// 返回默认值或抛出异常
return new JSONObject();
}
}
/**
*
*
* @param filePath
* @return
* @throws IOException
*/
public static String readFileToString(String filePath) throws IOException {
// 如果是类路径下的资源文件
InputStream inputStream = TesStock.class.getClassLoader().getResourceAsStream(filePath);
if (inputStream != null) {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
// 移除最后多余的换行符
if (content.length() > 0) {
content.deleteCharAt(content.length() - 1);
}
return content.toString();
}
} else {
// 如果是绝对路径或相对路径文件
return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
}
}
} }

File diff suppressed because it is too large Load Diff