fix feeding

plp
chenshuichuan 2 years ago
parent 99d03b80b5
commit 356e283c2f

@ -1,9 +1 @@
字典标签
字典键值
入库 6
完工 5
开工 4
计划 3
下达 2
送审 1
草稿 0
{"A1":{"v":"1.9"},"A10":{"v":"100.0"},"A100":{"v":"false"},"A101":{"v":"false"},"A102":{"v":"false"},"A103":{"v":"false"},"A104":{"v":"false"},"A105":{"v":"false"},"A106":{"v":"false"},"A107":{"v":"false"},"A108":{"v":"false"},"A109":{"v":"false"},"A11":{"v":"696.8"},"A110":{"v":"false"},"A111":{"v":"true"},"A112":{"v":"false"},"A113":{"v":"false"},"A114":{"v":"false"},"A115":{"v":"false"},"A116":{"v":"false"},"A117":{"v":"true"},"A118":{"v":"false"},"A119":{"v":"false"},"A12":{"v":"0.0"},"A120":{"v":"false"},"A121":{"v":"false"},"A122":{"v":"false"},"A123":{"v":"false"},"A124":{"v":"false"},"A125":{"v":"false"},"A126":{"v":"false"},"A127":{"v":"false"},"A128":{"v":"false"},"A129":{"v":"false"},"A13":{"v":"0.0"},"A130":{"v":"false"},"A131":{"v":"false"},"A132":{"v":"false"},"A133":{"v":"false"},"A134":{"v":"true"},"A135":{"v":"false"},"A136":{"v":"true"},"A137":{"v":"true"},"A138":{"v":"false"},"A139":{"v":"false"},"A14":{"v":"100.0"},"A140":{"v":"false"},"A15":{"v":"100.0"},"A16":{"v":"50.0"},"A17":{"v":"false"},"A18":{"v":"true"},"A19":{"v":"false"},"A20":{"v":"false"},"A21":{"v":"false"},"A22":{"v":"false"},"A23":{"v":"false"},"A24":{"v":"false"},"A25":{"v":"false"},"A26":{"v":"false"},"A27":{"v":"false"},"A28":{"v":"false"},"A29":{"v":"false"},"A3":{"v":"3051.1"},"A30":{"v":"true"},"A31":{"v":"false"},"A32":{"v":"true"},"A33":{"v":"false"},"A34":{"v":"true"},"A35":{"v":"true"},"A36":{"v":"false"},"A37":{"v":"false"},"A38":{"v":"false"},"A39":{"v":"false"},"A4":{"v":"287.8"},"A40":{"v":"true"},"A41":{"v":"false"},"A42":{"v":"false"},"A43":{"v":"false"},"A44":{"v":"false"},"A45":{"v":"false"},"A46":{"v":"false"},"A47":{"v":"false"},"A48":{"v":"false"},"A49":{"v":"false"},"A5":{"v":"3134.9"},"A50":{"v":"false"},"A51":{"v":"false"},"A52":{"v":"false"},"A53":{"v":"false"},"A54":{"v":"false"},"A55":{"v":"false"},"A56":{"v":"false"},"A57":{"v":"false"},"A58":{"v":"false"},"A59":{"v":"false"},"A6":{"v":"1852.8"},"A60":{"v":"false"},"A61":{"v":"false"},"A62":{"v":"false"},"A63":{"v":"false"},"A64":{"v":"false"},"A65":{"v":"false"},"A66":{"v":"true"},"A67":{"v":"false"},"A68":{"v":"true"},"A69":{"v":"true"},"A7":{"v":"1475.3"},"A70":{"v":"false"},"A71":{"v":"false"},"A72":{"v":"false"},"A8":{"v":"2601.4"},"A83":{"v":"false"},"A84":{"v":"false"},"A85":{"v":"false"},"A86":{"v":"false"},"A87":{"v":"false"},"A88":{"v":"true"},"A89":{"v":"false"},"A9":{"v":"696.8"},"A90":{"v":"false"},"A91":{"v":"false"},"A92":{"v":"false"},"A93":{"v":"false"},"A94":{"v":"false"},"A95":{"v":"false"},"A96":{"v":"false"},"A97":{"v":"false"},"A98":{"v":"false"},"A99":{"v":"false"}}

@ -0,0 +1,70 @@
package cn.iocoder.yudao.module.iot.controller.admin.mqttrecord;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.iot.controller.admin.mqttrecord.vo.MqttRecordPageReqVO;
import cn.iocoder.yudao.module.iot.controller.admin.mqttrecord.vo.MqttRecordRespVO;
import cn.iocoder.yudao.module.iot.controller.admin.mqttrecord.vo.MqttRecordSaveReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.mqttrecord.MqttRecordDO;
import cn.iocoder.yudao.module.iot.service.mqttrecord.MqttRecordService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 数采记录")
@RestController
@RequestMapping("/iot/mqtt-server")
@Validated
public class MqttServerController {
@Resource
private MqttRecordService mqttRecordService;
@PostMapping("/create")
@Operation(summary = "创建数采记录")
public CommonResult<Long> createMqttRecord(@Valid @RequestBody MqttRecordSaveReqVO createReqVO) {
return success(mqttRecordService.createMqttRecord(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新数采记录")
public CommonResult<Boolean> updateMqttRecord(@Valid @RequestBody MqttRecordSaveReqVO updateReqVO) {
mqttRecordService.updateMqttRecord(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除数采记录")
@Parameter(name = "id", description = "编号", required = true)
public CommonResult<Boolean> deleteMqttRecord(@RequestParam("id") Long id) {
mqttRecordService.deleteMqttRecord(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得数采记录")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<MqttRecordRespVO> getMqttRecord(@RequestParam("id") Long id) {
MqttRecordDO mqttRecord = mqttRecordService.getMqttRecord(id);
return success(BeanUtils.toBean(mqttRecord, MqttRecordRespVO.class));
}
}

@ -3,8 +3,11 @@ package cn.iocoder.yudao.module.mes.controller.admin.feedingrecord;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.plan.vo.PlanStatusEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.itemrequisition.ItemRequisitionDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.module.mes.dal.mysql.feedingrecord.FeedingRecordMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.itemrequisition.ItemRequisitionMapper;
import cn.iocoder.yudao.module.mes.service.itemrequisition.ItemRequisitionService;
import cn.iocoder.yudao.module.mes.service.plan.PlanService;
import org.springframework.web.bind.annotation.*;
@ -14,6 +17,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import java.time.LocalDate;
import java.util.*;
import java.io.IOException;
@ -149,8 +153,20 @@ public class FeedingRecordController {
planItemMap.put(key, respVO);
}
}
feedingRecordService.updateStatus(recordDO,detailDOList, status , user.getId(),planDOList,
Map<String, FeedingRecordPlanDO> recordPlanDOMap = feedingRecordService.updateStatus(recordDO,detailDOList, status , user.getId(),planDOList,
planItemListMap, planItemMap);
//更新计划对应的领料单投料时间
Map<Long,Long> map = new HashMap<>();
for (String key : recordPlanDOMap.keySet()) {
FeedingRecordPlanDO item = recordPlanDOMap.get(key);
if(!map.containsKey(item.getPlanId())){
ItemRequisitionDO itemRequisitionDO = itemRequisitionService.getItemRequisitionByPlanId(item.getPlanId());
if(itemRequisitionDO!=null && itemRequisitionDO.getDeliveryDate()==null){
itemRequisitionDO.setDeliveryDate(LocalDate.now());
map.put(item.getPlanId(),item.getPlanId());
}
}
}
}
else {
recordDO.setRecordStatus(FeedingStatusEnum..getValue());

@ -21,10 +21,10 @@ public class ItemRequisitionSaveReqVO {
@Schema(description = "编码")
private String code;
@Schema(description = "下料时间")
@Schema(description = "计划下料时间")
private LocalDateTime requisitionDate;
@Schema(description = "料时间")
@Schema(description = "实际下料时间")
private LocalDateTime deliveryDate;
@Schema(description = "状态", example = "2")

@ -4,11 +4,13 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PlanStatusUpdateVO {
@Schema(description = "计划id", example = "21176")
@NotNull(message = "计划id")

@ -38,8 +38,8 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
.eqIfPresent(PlanDO::getRemark, reqVO.getRemark())
.eqIfPresent(PlanDO::getIsEnable, reqVO.getIsEnable())
.betweenIfPresent(PlanDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PlanDO::getPlanStartTime)
.orderByDesc(PlanDO::getPlanEndTime));
.orderByAsc(PlanDO::getPlanStartTime)
.orderByAsc(PlanDO::getPlanEndTime));
}
default PlanDO selectByNo(String no) {
return selectOne(PlanDO::getCode, no);
@ -58,7 +58,7 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
}
return MapUtil.getLong(result.get(0), "sumCount", 0L);
}
/**查询按日期排序最后一个未完成(已经下达)的计划**/
/**查询按日期排序最后一个未完成(已经下达)的计划,即更未来远的时间在更近**/
default PlanDO selectLastOne(){
List<Integer> status = new ArrayList<>();
status.add(PlanStatusEnum..getValue());
@ -71,9 +71,14 @@ public interface PlanMapper extends BaseMapperX<PlanDO> {
.last("limit 1"));
}
default List<PlanDO> selectBy(List<Integer> statusList) {
return selectList(PlanDO::getStatus, statusList);
return selectList(new LambdaQueryWrapperX<PlanDO>()
.inIfPresent(PlanDO::getStatus,statusList));
}
//根据产线和状态查询生产计划,按照实际开工时间升序排序,即更早开工的在前面
default List<PlanDO> selectBy(List<Integer> statusList, String pipeline) {
return selectList(PlanDO::getStatus, statusList, PlanDO::getFeedingPipeline, pipeline);
return selectList(new LambdaQueryWrapperX<PlanDO>()
.eqIfPresent(PlanDO::getFeedingPipeline, pipeline)
.inIfPresent(PlanDO::getStatus,statusList)
.orderByAsc(PlanDO::getStartTime));
}
}

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.mes.service.feedingrecord;
import java.util.*;
import cn.iocoder.yudao.module.mes.controller.admin.feedingrecord.vo.*;
import cn.iocoder.yudao.module.mes.controller.admin.itemrequisition.vo.ItemRequisitionDetailRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingplan.FeedingRecordPlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.feedingrecord.FeedingRecordDetailDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -74,7 +75,7 @@ public interface FeedingRecordService {
if(ids.isEmpty())return new HashMap<>();
return convertMap(getFeedingRecordList(ids), FeedingRecordDO::getId);
}
void updateStatus(FeedingRecordDO recordDO,List<FeedingRecordDetailDO> detailDOList, String status , Long userId
Map<String, FeedingRecordPlanDO> updateStatus(FeedingRecordDO recordDO,List<FeedingRecordDetailDO> detailDOList, String status , Long userId
,List<PlanDO> planDOList,Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap,
Map<String, ItemRequisitionDetailRespVO> planItemMap);
//提交、反提交投料记录单

@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
import cn.iocoder.yudao.module.erp.framework.bean.ProductUnitEnum;
import cn.iocoder.yudao.module.erp.service.product.ErpProductService;
import cn.iocoder.yudao.module.erp.service.product.ErpProductUnitService;
import cn.iocoder.yudao.module.mes.controller.admin.feedingplan.vo.FeedingRecordPlanRespVO;
@ -87,10 +88,13 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
FeedingRecordDO feedingRecord = BeanUtils.toBean(createReqVO, FeedingRecordDO.class);
feedingRecord.setRecordStatus(FeedingStatusEnum.稿.getValue());
feedingRecordMapper.insert(feedingRecord);
//todo 检查投料原料项如果不是kg则转为kg
//检查投料原料项如果不是kg则转为kg
if(createReqVO.getFeedingType().equals(FeedingTypeEnum..getValue())){
transfer(createReqVO.getFeedingRecordDetails());
// 插入子表
createFeedingRecordDetailList(feedingRecord.getId(), createReqVO.getFeedingRecordDetails());
}
// 返回
return feedingRecord.getId();
}
@ -103,11 +107,29 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
// 更新
FeedingRecordDO updateObj = BeanUtils.toBean(updateReqVO, FeedingRecordDO.class);
feedingRecordMapper.updateById(updateObj);
if(updateReqVO.getFeedingType().equals(FeedingTypeEnum..getValue())) {
transfer(updateReqVO.getFeedingRecordDetails());
// 更新子表
updateFeedingRecordDetailList(updateReqVO.getId(), updateReqVO.getFeedingRecordDetails());
}
}
//将单位转到kg
private List<FeedingRecordDetailDO> transfer(List<FeedingRecordDetailDO> list){
if (list != null) {
MathContext mc = new MathContext(3, RoundingMode.HALF_UP);
for (int i = 0; i < list.size(); i++) {
FeedingRecordDetailDO detailDO = list.get(i);
if (detailDO.getUnitId().equals(ProductUnitEnum.Gram.getUnitId())) {
detailDO.setWeight(detailDO.getWeight().divide(BigDecimal.valueOf(1000), mc));
detailDO.setUnitId(ProductUnitEnum.Kilogram.getUnitId());
} else if (detailDO.getUnitId().equals(ProductUnitEnum.Ton.getUnitId())) {
detailDO.setWeight(detailDO.getWeight().multiply(BigDecimal.valueOf(1000), mc));
detailDO.setUnitId(ProductUnitEnum.Kilogram.getUnitId());
}
}
}
return list;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteFeedingRecord(Long id) {
@ -144,9 +166,11 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
}
private void createFeedingRecordDetailList(Long recordId, List<FeedingRecordDetailDO> list) {
if(list!=null && list.size()>0){
list.forEach(o -> o.setRecordId(recordId));
feedingRecordDetailMapper.insertBatch(list);
}
}
private void updateFeedingRecordDetailList(Long recordId, List<FeedingRecordDetailDO> list) {
deleteFeedingRecordDetailByRecordId(recordId);
@ -191,7 +215,7 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
* **/
@Override
@Transactional(rollbackFor = Exception.class)
public void updateStatus(FeedingRecordDO recordDO,List<FeedingRecordDetailDO> detailDOList, String status , Long userId
public Map<String, FeedingRecordPlanDO> updateStatus(FeedingRecordDO recordDO,List<FeedingRecordDetailDO> detailDOList, String status , Long userId
,List<PlanDO> planDOList,Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap,
Map<String, ItemRequisitionDetailRespVO> planItemMap) {
@ -213,14 +237,20 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
detailDOMap.get(recordDetailDO.getItemId()).setWeight(totalWeight);
}else detailDOMap.put(recordDetailDO.getItemId(), recordDetailDO);
}
Map<String, FeedingRecordPlanDO>recordPlanDOMap =
dealPlan(detailDOMap,recordDO, userId, planDOList, planItemListMap, planItemMap);
recordDO.setRecordStatus(FeedingStatusEnum..getValue());
feedingRecordMapper.updateById(recordDO);
return recordPlanDOMap;
}
//todo 需要回退吗?
else if(status.equals(FeedingStatusEnum.稿.getValue())) {
}
return null;
}
private void dealPlan(Map<Long, FeedingRecordDetailDO> detailDOMap , FeedingRecordDO recordDO, Long userId,
private Map<String, FeedingRecordPlanDO> dealPlan(Map<Long, FeedingRecordDetailDO> detailDOMap , FeedingRecordDO recordDO, Long userId,
List<PlanDO> planDOList,Map<Long, List<ItemRequisitionDetailRespVO>> planItemListMap,
Map<String, ItemRequisitionDetailRespVO> planItemMap){
MathContext mc = new MathContext(3, RoundingMode.HALF_UP);
@ -271,6 +301,7 @@ public class FeedingRecordServiceImpl implements FeedingRecordService {
dealLast(detailDOMap, recordDO.getId(), userId, planDOList, totalPlanNeedItem, recordPlanDOMap, planItemMap);
//插入
recordPlanMapper.insertBatch(recordPlanDOMap.values());
return recordPlanDOMap;
}
//处理剩余未分配原料按照totalPlanNeedItem 比例分配到每个计划
private Map<String, FeedingRecordPlanDO> dealLast(Map<Long, FeedingRecordDetailDO> detailDOMap, Long recordId, Long userId

@ -45,7 +45,7 @@ public interface ItemRequisitionService {
* @return
*/
ItemRequisitionDO getItemRequisition(Long id);
ItemRequisitionDO getItemRequisitionByPlanId(Long planId);
/**
*
*

@ -117,7 +117,10 @@ public class ItemRequisitionServiceImpl implements ItemRequisitionService {
public ItemRequisitionDO getItemRequisition(Long id) {
return itemRequisitionMapper.selectById(id);
}
@Override
public ItemRequisitionDO getItemRequisitionByPlanId(Long planId) {
return itemRequisitionMapper.selectByPlanId(planId);
}
@Override
public PageResult<ItemRequisitionDO> getItemRequisitionPage(ItemRequisitionPageReqVO pageReqVO) {
return itemRequisitionMapper.selectPage(pageReqVO);

@ -156,10 +156,13 @@ public class PlanServiceImpl implements PlanService {
}
saveReqVO.setItemRequisitionDetails(itemRequisitionDetails);
saveReqVO.setStatus(ItemRequisitionStatusEnum..getValue());
if(saveReqVO.getRequisitionDate()==null)
saveReqVO.setRequisitionDate(LocalDateTime.now());
itemRequisitionService.createItemRequisition(saveReqVO);
//更新计划状态
planDO.setStatus(PlanStatusEnum..getValue());
planDO.setIsEnable(true);
planDO.setProductionManagerId(saveReqVO.getWorkerId());
planDO.setFeedingPipeline(saveReqVO.getFeedingPipeline());
planDO.setStartTime(LocalDateTime.now());
planMapper.updateById(planDO);

@ -93,7 +93,7 @@ public class StockWorkshopServiceImpl implements StockWorkshopService {
@Override
@Transactional(rollbackFor = Exception.class)
public Long updateStock(StockWorkshopDO other, String detailType , Long id, String code){
if(other ==null || other.getId() == null)
if(other ==null )
throw exception(STOCK_WORKSHOP_NOT_EXISTS);
Long result =null;
StockWorkshopDO old = stockWorkshopMapper.selectByItemId(other.getItemId());

@ -194,6 +194,7 @@ yudao:
- /admin-api/pay/notify/** # 支付回调通知,不携带租户编号
- /jmreport/* # 积木报表,无法携带租户编号
- /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号
- /admin-api/iot/mqtt-server/**
ignore-tables:
- system_tenant
- system_tenant_package

Loading…
Cancel
Save