add:申请任务功能优化

This commit is contained in:
zhengxuming
2025-08-28 19:44:07 +08:00
parent 0a60985917
commit bee8e48e25
12 changed files with 189 additions and 16 deletions

View File

@@ -114,4 +114,7 @@ public interface IStructattrService extends IService<Structattr> {
List<Structattr> inBoundSectDiv(StrategyStructParam param);
void changeStruct(StructattrChangeDto changeDto);
BigDecimal calculateSectOccupancyRate(String sect_code);
}

View File

@@ -3,9 +3,11 @@ package org.nl.wms.basedata_manage.service.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.StructattrVechielDto;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@@ -20,4 +22,6 @@ public interface StructattrMapper extends BaseMapper<Structattr>{
List<JSONObject> collectVehicle2(Map query);
BigDecimal calculateSectOccupancyRate(@Param("sect_code")String sect_code);
}

View File

@@ -93,4 +93,20 @@
order by ${order_by}
</if>
</select>
<select id="calculateSectOccupancyRate" resultType="java.math.BigDecimal">
SELECT
CASE
WHEN COALESCE(COUNT(*), 0) = 0 THEN 0
ELSE SUM(CASE WHEN ivt.storagevehicle_code IS NOT NULL THEN 1 ELSE 0 END) * 1.0 / COUNT(*)
END AS occupancy_rate
FROM
st_ivt_structattr ivt
<where>
<if test="sect_code != null and sect_code != ''">
AND ivt.sect_code = #{sect_code}
</if>
</where>
</select>
</mapper>

View File

@@ -427,4 +427,9 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
}
}
@Override
public BigDecimal calculateSectOccupancyRate(String sect_code) {
return structattrMapper.calculateSectOccupancyRate(sect_code);
}
}

View File

@@ -42,4 +42,15 @@ public class AcsToWmsController {
return new ResponseEntity<>(acsToWmsService.acsApply(param), HttpStatus.OK);
}
@PostMapping("/getExecutingTask")
@Log("ACS向LMS查询正在执行的任务数据")
@SaIgnore
/**
* ACS向LMS查询正在执行的任务数据
*/
public ResponseEntity<Object> getExecutingTask() {
return new ResponseEntity<>(acsToWmsService.getExecutingTask(), HttpStatus.OK);
}
}

View File

@@ -25,4 +25,6 @@ public interface AcsToWmsService {
/** ACS请求接口 */
Map<String, Object> acsApply(JSONObject param);
Map<String, Object> getExecutingTask();
}

View File

@@ -29,6 +29,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -73,8 +74,30 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
public Map<String, Object> receiveTaskStatusAcs(String string) {
log.info("acs向lms反馈任务状态请求参数--------------------------------------" + string);
JSONArray array = JSONArray.parseArray(string);
//先做校验
//返回处理失败的任务
JSONArray errArr = new JSONArray();
for (int i = 0; i < array.size(); i++) {
JSONObject errorObject = new JSONObject();
JSONObject row = array.getJSONObject(i);
String task_id = row.getString("task_id");
SchBaseTask taskObj = iSchBaseTaskService.getById(task_id);
if (taskObj == null) {
errorObject.put("task_id", task_id);
errorObject.put("messgae", "不存在task_id = [" + task_id + "]的任务!");
errArr.add(errorObject);
}
}
if (errArr.size() > 0) {
JSONObject result = new JSONObject();
result.put("status", HttpStatus.BAD_REQUEST.value());
result.put("message", "任务状态反馈失败!");
result.put("errArr", errArr);
log.info("acs向lms反馈任务状态返回参数--------------------------------------" + result);
return result;
}
for (int i = 0; i < array.size(); i++) {
JSONObject row = array.getJSONObject(i);
String task_id = row.getString("task_id");
@@ -100,7 +123,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
// 根据配置编码执行相关配置内的方法
AbstractTask task = taskFactory.getTask(taskObj.getConfig_code());
task.updateTaskStatus(taskObj.getTask_code(),status);
} else {
throw new BadRequestException("任务标识为:" + task_id + "的任务正在操作中!");
}
@@ -113,9 +135,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "任务状态反馈成功!");
result.put("data", new JSONObject());
result.put("errArr", errArr);
log.info("acs向lms反馈任务状态返回参数--------------------------------------" + result.toString());
log.info("acs向lms反馈任务状态返回参数--------------------------------------" + result);
return result;
}
@@ -137,6 +157,21 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
return result;
}
@Override
public Map<String, Object> getExecutingTask() {
//查询正在执行的任务
JSONObject result = new JSONObject();
JSONObject data = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "查询成功!");
List<SchBaseTask> schBaseTaskList = iSchBaseTaskService.findUnFinishTasks();
data.put("detail", schBaseTaskList);
data.put("count", schBaseTaskList.size());
result.put("data", data);
return result;
}
/**
* 申请入库任务
*

View File

@@ -219,7 +219,7 @@ public class ErpToWmsServiceImpl implements ErpToWmsService {
plate2.setQty_unit_id(unitDaoDtl.getMeasure_unit_id());
plate2.setQty_unit_name(unitDaoDtl.getUnit_name());
plate2.setQty(groupplateDto.getQty());
plate2.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("生成"));
plate2.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("组盘"));
plate2.setExt_code(jsonDtl.getCode());
plate2.setExt_type("0001");
plate2.setExt_id(jsonDtl.getId());
@@ -234,7 +234,7 @@ public class ErpToWmsServiceImpl implements ErpToWmsService {
plate.setQty_unit_id(unitDao.getMeasure_unit_id());
plate.setQty_unit_name(unitDao.getUnit_name());
plate.setQty(qty);
plate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("生成"));
plate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("组盘"));
plate.setExt_code("H-"+value.get(0).getOrder_code());
plate.setExt_type("0001");
plate.setExt_id(jsonDtl.getId());

View File

@@ -78,4 +78,12 @@ public interface ISchBaseTaskService extends IService<SchBaseTask> {
* @return
*/
Integer findUnFinishTasksBySub_tray(String sub_tray);
/**
* 根据任务号查询未完成的任务
* @param sub_tray
* @return
*/
List<SchBaseTask> findUnFinishTasks();
}

View File

@@ -175,5 +175,13 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
return taskCount;
}
@Override
public List<SchBaseTask> findUnFinishTasks() {
LambdaQueryWrapper<SchBaseTask> lam = new LambdaQueryWrapper<>();
lam.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
.eq(SchBaseTask::getIs_delete, false);
return schBaseTaskMapper.selectList(lam);
}
}

View File

@@ -54,8 +54,22 @@ public class StInTask extends AbstractTask {
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
String currentUserId,nickName;
if (null == json.get("currentUserId")) {
currentUserId = SecurityUtils.getCurrentUserId();
} else {
currentUserId = json.get("currentUserId").toString();
}
if (null == json.get("nickName")) {
nickName = SecurityUtils.getCurrentNickName();
} else {
nickName = json.get("nickName").toString();
}
task.setCreate_id(currentUserId);
task.setCreate_name(nickName);
task.setCreate_time(DateUtil.now());
taskService.save(task);
return task.getTask_id();

View File

@@ -1,5 +1,7 @@
package org.nl.wms.warehouse_manage.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -146,8 +148,18 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
@Transactional(rollbackFor = Exception.class)
public String insertDtl(Map whereJson) {
ArrayList<HashMap> rows = (ArrayList<HashMap>) whereJson.get("tableData");
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String currentUserId, nickName;
if (null == whereJson.get("currentUserId")) {
currentUserId = SecurityUtils.getCurrentUserId();
} else {
currentUserId = whereJson.get("currentUserId").toString();
}
if (null == whereJson.get("nickName")) {
nickName = SecurityUtils.getCurrentNickName();
} else {
nickName = whereJson.get("nickName").toString();
}
String now = DateUtil.now();
BigDecimal total_qty = new BigDecimal(BigInteger.ZERO);
JSONObject io_mst = new JSONObject();
@@ -353,8 +365,19 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
if (ioStorInvDis ==null){
throw new BadRequestException("当前明细已经分配过库位");
}
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String currentUserId,nickName;
if (null == param.get("currentUserId")) {
currentUserId = SecurityUtils.getCurrentUserId();
} else {
currentUserId = param.get("currentUserId").toString();
}
if (null == param.get("nickName")) {
nickName = SecurityUtils.getCurrentNickName();
} else {
nickName = param.get("nickName").toString();
}
String now = DateUtil.now();
String sect_id = "";
String sect_code = "";
@@ -559,6 +582,8 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
task_form.put("PickingLocation", point_code);
task_form.put("PlacedLocation", ioStorInvDis.getStruct_code());
task_form.put("vehicle_code", map.get("storagevehicle_code"));
task_form.put("currentUserId","3");
task_form.put("nickName","ACS");
StInTask stInTask = SpringContextHolder.getBean("STInTask");
String task_id = stInTask.create(task_form);
@@ -782,11 +807,17 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
return ioStorInvDisMapper.getBillTaskDtl(iostorinvdtl_id);
}
@Transactional
@Override
public void AutoCreateBill(JSONObject param){
String device_code = param.getString("device_code"); // 请求点
String vehicle_code = param.getString("vehicle_code");//子托盘
List<GroupPlateDto> list = ioStorInvMapper.getGroupByPlate(param);
ArrayList<LinkedHashMap> tableData = new ArrayList<>();
list.forEach(item -> {
item.setPlan_qty(item.getQty());
tableData.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class));
});
JSONObject form = new JSONObject();
// 查询仓库
@@ -794,23 +825,59 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
form.put("stor_id",storDao.getStor_id());
form.put("bill_type",IOSEnum.BILL_TYPE.code("生产入库"));
form.put("biz_date",DateUtil.now());
form.put("currentUserId","3");
form.put("nickName","ACS");
form.put("remark","");
form.put("bill_status",IOSEnum.BILL_STATUS.code("生成"));
form.put("tableData",list);
form.put("tableData",tableData);
//新增入库单
String iostorinv_id = this.insertDtl(form);
//根据分配明细分配仓位
IOStorInvDis dis = ioStorInvDisMapper.selectOne(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getIostorinv_id,iostorinv_id));
JSONObject dis_form = new JSONObject();
dis_form.put("tableMater",dis);
ArrayList<LinkedHashMap> tableMater = new ArrayList<>();
tableMater.add(JSONObject.parseObject(JSONObject.toJSONString(dis), LinkedHashMap.class));
dis_form.put("tableMater",tableMater);
dis_form.put("stor_code",storDao.getStor_code());
//todo 需要指定一个库区
dis_form.put("sect_code","1582991348217286656");
dis_form.put("currentUserId","3");
dis_form.put("nickName","ACS");
dis_form.put("iostorinvdis_id",dis.getIostorinvdis_id());
// 查询所有库区
List<Sectattr> allSects = iSectattrService.list(new LambdaQueryWrapper<>(Sectattr.class)
.eq(Sectattr::getIs_delete,"0")
.ne(Sectattr::getSect_code,"SSX"));
if (CollectionUtils.isEmpty(allSects)) {
throw new BadRequestException("未找到可用的库区");
}
// 判断库区货位占有率
Map<Sectattr, BigDecimal> sectOccupancyRateMap = new HashMap<>();
for (Sectattr sect : allSects) {
BigDecimal occupancyRate = iStructattrService.calculateSectOccupancyRate(sect.getSect_code());
sectOccupancyRateMap.put(sect, occupancyRate);
}
// 选择占有率小的库区
Optional<Map.Entry<Sectattr, BigDecimal>> minEntry = sectOccupancyRateMap.entrySet().stream()
.min(Map.Entry.comparingByValue());
if (minEntry.isPresent()) {
dis_form.put("sect_id", minEntry.get().getKey().getSect_id());
dis_form.put("stor_id", minEntry.get().getKey().getStor_id());
dis_form.put("sect_code", minEntry.get().getKey().getSect_id());
dis_form.put("stor_code", minEntry.get().getKey().getStor_id());
} else {
throw new BadRequestException("无法选择合适的库区");
}
//分配货位
dis_form.put("checked",true);
this.divStruct(dis_form);
dis_form.put("point_code",device_code);
dis_form.put("nickName",iostorinv_id);
//生成任务
this.divPoint(dis_form);;
}