人工入库完成后更新点位当前存储容器类型,释放点位状态

main
bbl\baobl 2024-03-25 11:22:23 +08:00
parent 80922c0dc9
commit bed5562bbc
37 changed files with 518 additions and 131 deletions

View File

@ -16,11 +16,14 @@
package com.youchain.utils; package com.youchain.utils;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.TimeZone;
/** /**
* @author: liaojinlong * @author: liaojinlong
@ -123,6 +126,17 @@ public class DateUtil {
return DFY_MD_HMS.format(localDateTime); return DFY_MD_HMS.format(localDateTime);
} }
/** 时间,时区*/
public static Timestamp parseLocalDateTimeZone(String utcTime, String timeZone) throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
//设置时区UTC
df.setTimeZone(TimeZone.getTimeZone(timeZone));
//格式化,转当地时区时间
Date after = df.parse(utcTime);
//Data转Time
return new Timestamp(after.getTime());
}
/** /**
* yyyy-MM-dd * yyyy-MM-dd
* *

View File

@ -18,8 +18,11 @@ package com.youchain.utils;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.BigExcelWriter; import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelUtil;
import com.youchain.config.FileProperties;
import com.youchain.exception.BadRequestException; import com.youchain.exception.BadRequestException;
import lombok.RequiredArgsConstructor;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -42,6 +45,7 @@ import java.util.Map;
* @author Liu Xue * @author Liu Xue
* @date 2018-12-27 * @date 2018-12-27
*/ */
@RequiredArgsConstructor
public class FileUtil extends cn.hutool.core.io.FileUtil { public class FileUtil extends cn.hutool.core.io.FileUtil {
private static final Logger log = LoggerFactory.getLogger(FileUtil.class); private static final Logger log = LoggerFactory.getLogger(FileUtil.class);
@ -178,7 +182,15 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
} }
return file; return file;
} }
// private final FileProperties properties;
public static List<Map<String, Object>> importUpload(MultipartFile multipartFile,FileProperties properties) {
FileUtil.checkSize(properties.getMaxSize(), multipartFile.getSize());
String suffix = FileUtil.getExtensionName(multipartFile.getOriginalFilename());
String type = FileUtil.getFileType(suffix);
File file = FileUtil.upload(multipartFile, properties.getPath().getPath() + type + File.separator);
ExcelReader reader = ExcelUtil.getReader(file);
return reader.readAll();
}
/** /**
* *
*/ */

View File

@ -56,6 +56,11 @@ public class BillType extends BaseEntity implements Serializable {
@ApiModelProperty(value = "仓库") @ApiModelProperty(value = "仓库")
private Dept dept; private Dept dept;
@OneToOne
@JoinColumn(name = "point_id")
@ApiModelProperty(value = "点位")
private Point point;
@Column(name = "`type`") @Column(name = "`type`")
@ApiModelProperty(value = "类型") @ApiModelProperty(value = "类型")
private String type; private String type;

View File

@ -62,8 +62,7 @@ public class Box extends BaseEntity implements Serializable {
private Item item; private Item item;
@OneToOne @OneToOne
@JoinColumn(name = "`point_id`",nullable = false) @JoinColumn(name = "`point_id`")
@NotNull
@ApiModelProperty(value = "点位") @ApiModelProperty(value = "点位")
private Point point; private Point point;
@ -94,7 +93,7 @@ public class Box extends BaseEntity implements Serializable {
private String lampStatus; private String lampStatus;
@Column(name = "`lamp_code`") @Column(name = "`lamp_code`")
@ApiModelProperty(value = "业务类型") @ApiModelProperty(value = "操作方式")
private String lampCode; private String lampCode;
public void copy(Box source){ public void copy(Box source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));

View File

@ -90,7 +90,7 @@ public class Item extends BaseEntity implements Serializable {
private String smallClass; private String smallClass;
@Column(name = "`good_type`") @Column(name = "`good_type`")
@ApiModelProperty(value = "物料类型") @ApiModelProperty(value = "存储库区")
private String goodType; private String goodType;
@Column(name = "`length`") @Column(name = "`length`")

View File

@ -58,10 +58,10 @@ public class Point extends BaseEntity implements Serializable {
@ApiModelProperty(value = "备注") @ApiModelProperty(value = "备注")
private String description; private String description;
@Column(name = "`storage_type`") @Column(name = "`storage_type`")
@ApiModelProperty(value = "存储类型") @ApiModelProperty(value = "当前容器")
private String storageType; private String storageType;
@Column(name = "`beat_code`") @Column(name = "`beat_code`")
@ApiModelProperty(value = "冷却区区域编码") @ApiModelProperty(value = "双深位组")
private String beatCode; private String beatCode;
@Column(name = "`item_code`") @Column(name = "`item_code`")

View File

@ -18,6 +18,7 @@ package com.youchain.basicdata.repository;
import com.youchain.basicdata.domain.Area; import com.youchain.basicdata.domain.Area;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
/** /**
* @website https://eladmin.vip * @website https://eladmin.vip
@ -25,4 +26,6 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
* @date 2023-08-14 * @date 2023-08-14
**/ **/
public interface AreaRepository extends JpaRepository<Area, Long>, JpaSpecificationExecutor<Area> { public interface AreaRepository extends JpaRepository<Area, Long>, JpaSpecificationExecutor<Area> {
@Query(value = "SELECT a FROM Area a WHERE a.name = ?1 ")
Area findByName(String areaName);
} }

View File

@ -16,6 +16,7 @@
package com.youchain.basicdata.repository; package com.youchain.basicdata.repository;
import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Point;
import com.youchain.utils.BizStatus;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
@ -29,12 +30,20 @@ import java.util.Map;
* @date 2023-07-26 * @date 2023-07-26
**/ **/
public interface PointRepository extends JpaRepository<Point, Long>, JpaSpecificationExecutor<Point> { public interface PointRepository extends JpaRepository<Point, Long>, JpaSpecificationExecutor<Point> {
@Query(value = "SELECT p.* FROM base_point p WHERE p.enabled=1 and p.status='FREE'", nativeQuery = true) @Query(value = "SELECT p FROM Point p WHERE (?1 is null or ?1 = p.area.code) and p.type='STORAGE' and p.enabled=true and (p.storageType is null or length(p.storageType)=0) ", nativeQuery = false)
List<Point> getKyPointList(); List<Point> getKyPointList(String areaCode);
/** 分配 库位*/
@Query(value = "SELECT p FROM Point p WHERE p.area.code=?1 and p.enabled=true and p.storageType is not null") @Query(value = "SELECT p FROM Point p WHERE p.area.code=?1 and p.enabled=true and p.storageType is not null")
List<Point> findByAreaCode(String areaCode); List<Point> findByAreaCode(String areaCode);
@Query(value = "SELECT p FROM Point p WHERE p.code=?1 and p.enabled=true") /**成品区- 占用库位*/
@Query(value = "SELECT p FROM Point p WHERE p.area.code=?1 and p.enabled=true and p.storageType is null " +
" and p.status=?2 and p.type='STORAGE' order by p.beatCode,p.heat asc")
List<Point> findByAreaCodeCp(String areaCode,String status);
@Query(value = "SELECT p FROM Point p WHERE p.code=?1")
Point findByCode(String code); Point findByCode(String code);
@Query(value = "SELECT p FROM Point p WHERE p.type=?1 and p.area.code=?2 and p.enabled=true") @Query(value = "SELECT p FROM Point p WHERE p.type=?1 and p.area.code=?2 and p.enabled=true")
Point findByTypeAndArea(String type,String areaCode); Point findByTypeAndArea(String type,String areaCode);
/** 查询深位是否有库存 */
@Query(value = "SELECT p FROM Point p WHERE p.beatCode=?1 and p.enabled=true and p.storageType is not null and p.heat<?2")
List<Point> findByBeatCode(String beatCode,double heat);
} }

View File

@ -71,8 +71,6 @@ public class PointController {
private final AreaService areaService; private final AreaService areaService;
private final FileProperties properties;
@Log("导出数据") @Log("导出数据")
@ApiOperation("导出数据") @ApiOperation("导出数据")
@GetMapping(value = "/download") @GetMapping(value = "/download")
@ -86,9 +84,7 @@ public class PointController {
@ApiOperation("导入点位") @ApiOperation("导入点位")
@PreAuthorize("@el.check('point:importPoint')") @PreAuthorize("@el.check('point:importPoint')")
public ResponseEntity<Object> importPoint(@RequestParam("file") MultipartFile multipartFile) { public ResponseEntity<Object> importPoint(@RequestParam("file") MultipartFile multipartFile) {
/*FileUtil.checkSize(properties.getMaxSize(), multipartFile.getSize());
FileUtil.checkSize(properties.getMaxSize(), multipartFile.getSize());
String suffix = FileUtil.getExtensionName(multipartFile.getOriginalFilename()); String suffix = FileUtil.getExtensionName(multipartFile.getOriginalFilename());
String type = FileUtil.getFileType(suffix); String type = FileUtil.getFileType(suffix);
@ -165,8 +161,9 @@ public class PointController {
ApiError apiError = ApiError.errorJosn(HttpStatus.OK.value(), "导入成功:" + (i) + "行 新增(" + new_len + ")修改(" + edit_len + ")"); ApiError apiError = ApiError.errorJosn(HttpStatus.OK.value(), "导入成功:" + (i) + "行 新增(" + new_len + ")修改(" + edit_len + ")");
return new ResponseEntity(apiError, HttpStatus.valueOf(apiError.getStatus())); return new ResponseEntity(apiError, HttpStatus.valueOf(apiError.getStatus()));*/
ApiResult apiResult = pointService.importPoint(multipartFile);
return new ResponseEntity<>(apiResult, HttpStatus.valueOf(apiResult.getStatus()));
} }
@GetMapping @GetMapping
@ -186,18 +183,10 @@ public class PointController {
} }
@PostMapping(value = "/getPointList") @PostMapping(value = "/getPointList")
@AnonymousAccess @AnonymousAccess
public ResponseEntity<Object> getPointList() { public ResponseEntity<Object> getPointList(@RequestBody(required=false) String billCode) {
return new ResponseEntity<>(pointRepository.getKyPointList(), HttpStatus.OK); List<Point> pointList=pointRepository.getKyPointList(billCode);
return new ResponseEntity<>(pointList, HttpStatus.OK);
} }
@GetMapping(value = "/queryKyPointList")
@Log("查询可用空闲的点位point")
@ApiOperation("查询可用空闲的点位point")
@PreAuthorize("@el.check('point:list')")
public ResponseEntity<Object> queryKyPointList(PointQueryCriteria criteria, Pageable pageable) {
return new ResponseEntity<>(pointService.queryKyPointList(), HttpStatus.OK);
}
@PostMapping @PostMapping
@Log("新增point") @Log("新增point")
@ApiOperation("新增point") @ApiOperation("新增point")

View File

@ -21,7 +21,11 @@ import com.youchain.basicdata.service.dto.ItemDto;
import com.youchain.basicdata.service.dto.PointDto; import com.youchain.basicdata.service.dto.PointDto;
import com.youchain.basicdata.service.dto.PointQueryCriteria; import com.youchain.basicdata.service.dto.PointQueryCriteria;
import com.youchain.basicdata.service.dto.PointSmallDto; import com.youchain.basicdata.service.dto.PointSmallDto;
import com.youchain.exception.handler.ApiError;
import com.youchain.exception.handler.ApiResult;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
import java.io.IOException; import java.io.IOException;
@ -50,13 +54,6 @@ public interface PointService {
*/ */
List<PointDto> queryAll(PointQueryCriteria criteria); List<PointDto> queryAll(PointQueryCriteria criteria);
/**
*
* @return List<PointDto>
*/
List<PointSmallDto> queryKyPointList();
/** /**
* ID * ID
* @param id ID * @param id ID
@ -161,4 +158,5 @@ public interface PointService {
*/ */
Point getPointByFreeQH(String areaName,String goodType); Point getPointByFreeQH(String areaName,String goodType);
ApiResult importPoint(MultipartFile multipartFile);
} }

View File

@ -15,6 +15,7 @@
*/ */
package com.youchain.basicdata.service.dto; package com.youchain.basicdata.service.dto;
import com.youchain.basicdata.domain.Point;
import com.youchain.modules.system.domain.Dept; import com.youchain.modules.system.domain.Dept;
import com.youchain.modules.system.service.dto.DeptSmallDto; import com.youchain.modules.system.service.dto.DeptSmallDto;
import lombok.Data; import lombok.Data;
@ -56,6 +57,8 @@ public class BillTypeDto implements Serializable {
/** 创建人 */ /** 创建人 */
private String createBy; private String createBy;
/** 点位*/
private Point point;
/** 修改人 */ /** 修改人 */
private String updateBy; private String updateBy;

View File

@ -43,7 +43,7 @@ public class PointDto implements Serializable {
/** 描述 */ /** 描述 */
private String description; private String description;
/** 区域编码 */ /** 双深位组 */
private String beatCode; private String beatCode;
/** 物料编码 */ /** 物料编码 */

View File

@ -21,9 +21,13 @@ import com.youchain.appupdate.ReturnJson.RLocLayout;
import com.youchain.basicdata.domain.Area; import com.youchain.basicdata.domain.Area;
import com.youchain.basicdata.domain.Item; import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.repository.AreaRepository;
import com.youchain.basicdata.service.dto.StockSmallDto; import com.youchain.basicdata.service.dto.StockSmallDto;
import com.youchain.businessdata.ReturnJson.RPTaskList; import com.youchain.businessdata.ReturnJson.RPTaskList;
import com.youchain.businessdata.inputJson.IPTask; import com.youchain.businessdata.inputJson.IPTask;
import com.youchain.config.FileProperties;
import com.youchain.exception.handler.ApiError;
import com.youchain.exception.handler.ApiResult;
import com.youchain.modules.system.domain.DictDetail; import com.youchain.modules.system.domain.DictDetail;
import com.youchain.utils.*; import com.youchain.utils.*;
import jdk.internal.dynalink.beans.StaticClass; import jdk.internal.dynalink.beans.StaticClass;
@ -43,7 +47,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.*; import java.util.*;
import java.io.IOException; import java.io.IOException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -66,6 +72,7 @@ import javax.servlet.http.HttpServletResponse;
public class PointServiceImpl implements PointService { public class PointServiceImpl implements PointService {
private final PointRepository pointRepository; private final PointRepository pointRepository;
private final AreaRepository areaRepository;
private final PointMapper pointMapper; private final PointMapper pointMapper;
private final EntityManager entityMapper; private final EntityManager entityMapper;
@ -79,15 +86,6 @@ public class PointServiceImpl implements PointService {
public List<PointDto> queryAll(PointQueryCriteria criteria) { public List<PointDto> queryAll(PointQueryCriteria criteria) {
return pointMapper.toDto(pointRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder))); return pointMapper.toDto(pointRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder)));
} }
@Override
public List<PointSmallDto> queryKyPointList() {
List<Point> maps = pointRepository.getKyPointList();
String irsStr = JSON.toJSONString(maps);
List<PointSmallDto> evaUserResps = JSON.parseArray(irsStr, PointSmallDto.class);
return evaUserResps;
}
@Override @Override
public List<Point> getPoint(String type, String areaCode) { public List<Point> getPoint(String type, String areaCode) {
String hql = " from Point p where p.enabled=true and p.status='FREE' and p.type='" + type + "' "; String hql = " from Point p where p.enabled=true and p.status='FREE' and p.type='" + type + "' ";
@ -144,12 +142,14 @@ public class PointServiceImpl implements PointService {
for (PointDto point : all) { for (PointDto point : all) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
map.put("代码", point.getCode()); map.put("代码", point.getCode());
/*map.put("名称", point.getName()); map.put("名称", point.getName());
map.put("状态", point.getStatus()); map.put("类型", point.getType());
map.put("库区", point.getArea().getName()); map.put("库区", point.getArea().getName());
map.put("状态", point.getStatus());
map.put("当前容器", point.getStorageType());
map.put("深浅位", point.getHeat());
map.put("深浅位组", point.getBeatCode());
map.put("是否启用", point.getEnabled()); map.put("是否启用", point.getEnabled());
map.put("仓库名称", point.getDept().getName());
map.put("类型", point.getType());*/
list.add(map); list.add(map);
} }
FileUtil.downloadExcel(list, response); FileUtil.downloadExcel(list, response);
@ -357,6 +357,57 @@ public class PointServiceImpl implements PointService {
return null; return null;
} }
private final FileProperties properties;
@Override
public ApiResult importPoint(MultipartFile multipartFile) {
List<String> msgError= new ArrayList<>();
int a=0;
int b=0;
int c=0;
List<Map<String, Object>> mapList=FileUtil.importUpload(multipartFile,properties);
for (int i = 0; i < mapList.size(); i++) {
Map map=mapList.get(i);
Point point;
String code=(map.get("代码")+"").equals("null")||(map.get("代码")+"").length()<1? null : (map.get("代码")+"");
String name=(map.get("名称")+"").equals("null")||(map.get("名称")+"").length()<1? null : (map.get("名称")+"");
String type=(map.get("类型")+"").equals("null")||(map.get("类型")+"").length()<1? null : (map.get("类型")+"");
String areaName=(map.get("库区")+"").equals("null")||(map.get("库区")+"").length()<1? null : (map.get("库区")+"");
String status=(map.get("状态")+"").equals("null")||(map.get("状态")+"").length()<1? null : (map.get("状态")+"");
String storageType=(map.get("当前容器")+"").equals("null")||(map.get("当前容器")+"").length()<1? null : (map.get("当前容器")+"");
String heat=(map.get("深浅位")+"").equals("null")||(map.get("深浅位")+"").length()<1? null : (map.get("深浅位")+"");
String beatCode=(map.get("双深位组")+"").equals("null")||(map.get("双深位组")+"").length()<1? null : (map.get("双深位组")+"");
String enabled=(map.get("是否启用")+"").equals("null")||(map.get("是否启用")+"").length()<1? null : (map.get("是否启用")+"");
String del=(map.get("删除")+"").equals("null")||(map.get("删除")+"").length()<1? null : (map.get("删除")+"");
if (code!=null){
point=pointRepository.findByCode(code);
if (point==null){
point=new Point();
point.setDept(UserUtils.getDept());
c=c+1;
}else {
b=b+1;
}
if (code!=null) point.setCode(code);
if (name!=null) point.setName(name);
if (type!=null) point.setType(type);
if (areaName!=null) {
Area area=areaRepository.findByName(areaName);
point.setArea(area);
}
if (status!=null) point.setStatus(status);
if (storageType!=null) point.setStorageType(storageType);
if (heat!=null) point.setHeat(Double.valueOf(heat));
if (beatCode!=null) point.setBeatCode(beatCode);
if (enabled!=null) point.setEnabled(Boolean.valueOf(enabled));
pointRepository.save(point);
if (del!=null){
pointRepository.delete(point);
continue;
}
}
}
return ApiResult.fail(200,"导入"+a+"行,新增"+b+"行,修改"+c+"行"+";异常信息"+msgError.toString(),null);
}
public List<Object[]> queryPointKmd() { public List<Object[]> queryPointKmd() {
List<Object[]> pointList = null; List<Object[]> pointList = null;

View File

@ -121,7 +121,7 @@ public class AsnDetail extends BaseEntity implements Serializable {
private String propC3; private String propC3;
@Column(name = "`prop_c4`") @Column(name = "`prop_c4`")
@ApiModelProperty(value = "属性4") @ApiModelProperty(value = "入库方式")
private String propC4; private String propC4;
@Column(name = "`prop_c5`") @Column(name = "`prop_c5`")

View File

@ -58,7 +58,7 @@ public class ItemKey extends BaseEntity implements Serializable {
private String propC2; private String propC2;
@Column(name = "`prop_c3`") @Column(name = "`prop_c3`")
@ApiModelProperty(value = "计划单号") @ApiModelProperty(value = "系统单号")
private String propC3; private String propC3;
@Column(name = "`prop_c4`") @Column(name = "`prop_c4`")
@ -72,6 +72,9 @@ public class ItemKey extends BaseEntity implements Serializable {
@Column(name = "`prop_c6`") @Column(name = "`prop_c6`")
@ApiModelProperty(value = "流水号") @ApiModelProperty(value = "流水号")
private String propC6; private String propC6;
@Column(name = "`prop_c7`")
@ApiModelProperty(value = "成品物料码")
private String propC7;
@Column(name = "`prop_d1`") @Column(name = "`prop_d1`")
@ApiModelProperty(value = "生产日期") @ApiModelProperty(value = "生产日期")

View File

@ -107,7 +107,7 @@ public class Task extends BaseEntity implements Serializable {
private Point dstPoint; private Point dstPoint;
@Column(name = "`src_stock_code`") @Column(name = "`src_stock_code`")
@ApiModelProperty(value = "源容器编码") @ApiModelProperty(value = "成品箱码")
private String srcStockCode; private String srcStockCode;
@Column(name = "`dst_stock_code`") @Column(name = "`dst_stock_code`")

View File

@ -39,7 +39,9 @@ public interface AsnDetailRepository extends JpaRepository<AsnDetail, Long>, Jpa
+" group by i.id ",nativeQuery = true) +" group by i.id ",nativeQuery = true)
List<Map<String,Object>> findByAsn(String asnStatus, String billTypeCode); List<Map<String,Object>> findByAsn(String asnStatus, String billTypeCode);
@Query("select d from AsnDetail d where d.asn.relatedBill1=?1 and d.item.code=?2 and d.orderQty>d.receivedQty") @Query("select d from AsnDetail d where d.asn.relatedBill1=?1 and d.item.code=?2 and d.orderQty>d.receivedQty")
List<AsnDetail> findByAsnAndItem(String taskBillCode, String itemCode); List<AsnDetail> findByAsnAndItem(String relatedBill1, String itemCode);
@Query("select d from AsnDetail d where d.asn.id=?1 and d.asn.status=?2") @Query("select d from AsnDetail d where d.asn.id=?1 and d.asn.status=?2")
List<AsnDetail> findByAsnId(Long asnId,String asnStatus); List<AsnDetail> findByAsnId(Long asnId,String asnStatus);
@Query(value = "select d.* from data_asn_detail d where d.asn_id=?1 having sum(d.order_qty)<=sum(d.received_qty)",nativeQuery = true)
List<AsnDetail> findByAsnId(Long asnId);
} }

View File

@ -30,4 +30,9 @@ import java.util.List;
public interface AsnRepository extends JpaRepository<Asn, Long>, JpaSpecificationExecutor<Asn> { public interface AsnRepository extends JpaRepository<Asn, Long>, JpaSpecificationExecutor<Asn> {
@Query(value = "select a from Asn a where a.relatedBill1=?1") @Query(value = "select a from Asn a where a.relatedBill1=?1")
Asn findByRelatedBill1(String relatedBill1); Asn findByRelatedBill1(String relatedBill1);
/** 登记单号*/
@Query(value = "select a from Asn a where a.relatedBill2=?1")
Asn findByRelatedBill2(String relatedBill2);
@Query(value = "select a from Asn a where a.billType.code=?1 and a.status = 'OPEN'")
List<Asn> findByBillType(String billTypeCode);
} }

View File

@ -99,6 +99,6 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
+" and i.good_type=?3 " +" and i.good_type=?3 "
+" group by i.id ",nativeQuery = true) +" group by i.id ",nativeQuery = true)
List<Map<String,Object>> findBySumPlanQty(String taskStatus,int beSkip,String goodType); List<Map<String,Object>> findBySumPlanQty(String taskStatus,int beSkip,String goodType);
@Query(value = "select t from Task t where t.taskStatus =?1 and t.beSkip=?2 and t.itemKey.item.goodType=?3") @Query(value = "select t from Task t where t.taskStatus =?1 and t.beSkip=?2 and t.taskType=?3")
List<Task> findByItemType(String taskStatus, int beSkip, String goodType); List<Task> findByItemType(String taskStatus, int beSkip, String goodType);
} }

View File

@ -18,6 +18,7 @@ package com.youchain.businessdata.rest;
import com.youchain.annotation.AnonymousAccess; import com.youchain.annotation.AnonymousAccess;
import com.youchain.annotation.Log; import com.youchain.annotation.Log;
import com.youchain.businessdata.domain.Asn; import com.youchain.businessdata.domain.Asn;
import com.youchain.businessdata.repository.AsnRepository;
import com.youchain.businessdata.service.AsnService; import com.youchain.businessdata.service.AsnService;
import com.youchain.businessdata.service.dto.AsnQueryCriteria; import com.youchain.businessdata.service.dto.AsnQueryCriteria;
import com.youchain.exception.handler.ApiResult; import com.youchain.exception.handler.ApiResult;
@ -44,6 +45,7 @@ import javax.servlet.http.HttpServletResponse;
public class AsnController { public class AsnController {
private final AsnService asnService; private final AsnService asnService;
private final AsnRepository asnRepository;
@Log("导出数据") @Log("导出数据")
@ApiOperation("导出数据") @ApiOperation("导出数据")
@ -94,10 +96,18 @@ public class AsnController {
return new ResponseEntity<>(asnService.getAsnList(),HttpStatus.OK); return new ResponseEntity<>(asnService.getAsnList(),HttpStatus.OK);
} }
@PostMapping("/startAsn") @PostMapping("/startAsn")
@Log("开始收货") @Log("入库-占用库位")
@AnonymousAccess @AnonymousAccess
public ResponseEntity<Object> startAsn(@RequestBody String id) { public ResponseEntity<Object> startAsn(@RequestBody Long id) {
ApiResult apiResult = asnService.startAsn(id); Asn asn=asnRepository.getById(id);
ApiResult apiResult = asnService.startAsn(asn);
return new ResponseEntity<>(ApiResult.success(apiResult.getMessage(),apiResult.getData()), HttpStatus.valueOf(apiResult.getStatus()));
}
@PostMapping("/cancelAsn")
@Log("入库-取消占用")
@AnonymousAccess
public ResponseEntity<Object> cancelAsn(@RequestBody String id) {
ApiResult apiResult = asnService.cancelAsn(id);
return new ResponseEntity<>(ApiResult.success(apiResult.getMessage(),apiResult.getData()), HttpStatus.valueOf(apiResult.getStatus())); return new ResponseEntity<>(ApiResult.success(apiResult.getMessage(),apiResult.getData()), HttpStatus.valueOf(apiResult.getStatus()));
} }
} }

View File

@ -29,12 +29,12 @@ public class InterfaceController {
@ApiOperation("接收SAP入库单") @ApiOperation("接收SAP入库单")
@AnonymousAccess @AnonymousAccess
public ResponseEntity<Object> importAsnApi(@RequestBody JSONObject jsonObject) { public ResponseEntity<Object> importAsnApi(@RequestBody JSONObject jsonObject) {
asnDetailService.importAsnApi(jsonObject); ApiResult apiResult = asnDetailService.importAsnApi(jsonObject);
return new ResponseEntity<>(ApiResult.success("",""), HttpStatus.OK); return new ResponseEntity<>(apiResult, HttpStatus.valueOf(apiResult.getStatus()));
} }
@PostMapping("/importPtApi") @PostMapping("/importPtApi")
@Log("接收SAP库单") @Log("接收SAP库单")
@ApiOperation("接收SAP库单") @ApiOperation("接收SAP库单")
@AnonymousAccess @AnonymousAccess
public ResponseEntity<Object> importPtApi(@RequestBody JSONObject jsonObject) { public ResponseEntity<Object> importPtApi(@RequestBody JSONObject jsonObject) {
ApiResult apiResult = pickDetailService.importPtApi(jsonObject); ApiResult apiResult = pickDetailService.importPtApi(jsonObject);

View File

@ -76,6 +76,13 @@ public class TaskController {
ApiResult apiResult = taskService.manualReceiving(request); ApiResult apiResult = taskService.manualReceiving(request);
return new ResponseEntity<>(ApiResult.success(apiResult.getMessage(),apiResult.getData()), HttpStatus.valueOf(apiResult.getStatus())); return new ResponseEntity<>(ApiResult.success(apiResult.getMessage(),apiResult.getData()), HttpStatus.valueOf(apiResult.getStatus()));
} }
@PostMapping("/devanRfid")
@ApiOperation("解析RFID")
@AnonymousAccess
public ResponseEntity<Object> devanRfid(@RequestBody String rfid){
ApiResult apiResult = taskService.devanRfid(rfid);
return new ResponseEntity<>(apiResult, HttpStatus.valueOf(apiResult.getStatus()));
}
@GetMapping(value = "/queryAsnTask") @GetMapping(value = "/queryAsnTask")

View File

@ -107,7 +107,7 @@ public interface AsnDetailService {
boolean findByMo(String Mo); boolean findByMo(String Mo);
String importAsnApi(JSONObject jsonObject); ApiResult importAsnApi(JSONObject jsonObject);
/** /**
* *

View File

@ -94,10 +94,12 @@ public interface AsnService {
* @param erTime * @param erTime
* @return * @return
*/ */
Asn addAsn(BillType billType, String relatedBill1, String structure,String orderOrigin, Timestamp erTime); Asn addAsn(BillType billType, String relatedBill2, String structure,String orderOrigin, Timestamp erTime);
List<Asn> getAsnList(); List<Asn> getAsnList();
//开始收货 //开始收货
ApiResult startAsn(String id); ApiResult startAsn(Asn asn);
ApiResult cancelAsn(String id);
} }

View File

@ -148,4 +148,6 @@ public interface TaskService {
* @return * @return
*/ */
ApiResult picking(Long[] ids); ApiResult picking(Long[] ids);
ApiResult devanRfid(String rfid);
} }

View File

@ -31,6 +31,7 @@ import com.youchain.businessdata.domain.AsnDetail;
import com.youchain.businessdata.repository.AsnRepository; import com.youchain.businessdata.repository.AsnRepository;
import com.youchain.businessdata.repository.TaskRepository; import com.youchain.businessdata.repository.TaskRepository;
import com.youchain.businessdata.service.AsnService; import com.youchain.businessdata.service.AsnService;
import com.youchain.exception.handler.ApiResult;
import com.youchain.utils.*; import com.youchain.utils.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import com.youchain.businessdata.repository.AsnDetailRepository; import com.youchain.businessdata.repository.AsnDetailRepository;
@ -44,6 +45,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.text.ParseException;
import java.util.*; import java.util.*;
import java.io.IOException; import java.io.IOException;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
@ -67,8 +69,6 @@ public class AsnDetailServiceImpl implements AsnDetailService {
private final EntityManager entityMapper; private final EntityManager entityMapper;
private final TaskRepository taskRepository; private final TaskRepository taskRepository;
private final ItemRepository itemRepository; private final ItemRepository itemRepository;
private final ItemService itemService;
private final StockService stockService;
private final BillTypeRepository billTypeRepository; private final BillTypeRepository billTypeRepository;
@Override @Override
@ -212,20 +212,26 @@ public class AsnDetailServiceImpl implements AsnDetailService {
} }
@Override @Override
public String importAsnApi(JSONObject jsonObject) { public ApiResult importAsnApi(JSONObject jsonObject) {
System.out.println("接收入库单:"+jsonObject); System.out.println("接收入库单:"+jsonObject);
String relatedBill1=jsonObject.getString("expectedReceiptId");//入库单号 String relatedBill2=jsonObject.getString("expectedReceiptId");//登记单号
String erTime=jsonObject.getString("expectedReceiptDate");//操作时间 String erTime=jsonObject.getString("expectedReceiptDate");//操作时间
String billTypeCode=jsonObject.getString("expectedReceiptType");//入库类型 String billTypeCode=jsonObject.getString("expectedReceiptType");//入库类型
String structure=jsonObject.getString("owner");//货主 String structure=jsonObject.getString("owner");//货主
List<BillType> billTypeList=billTypeRepository.findBySourceName(billTypeCode); List<BillType> billTypeList=billTypeRepository.findBySourceName(billTypeCode);
if (billTypeList.size()<1){ if (billTypeList.size()<1){
return "单据类型错误"; return ApiResult.fail(500,"单据类型错误",null);
} }
BillType billType=billTypeList.get(0); BillType billType=billTypeList.get(0);
Timestamp er = Timestamp.valueOf(DateUtil.parseLocalDateTimeFormat(erTime, "yyyy-MM-dd HH:mm:ss")); Timestamp er = null;
Asn asn = asnService.addAsn(billType,relatedBill1,structure,"SAP推送",er); try {
er = DateUtil.parseLocalDateTimeZone(erTime, "UTC");
} catch (ParseException e) {
throw new RuntimeException(e);
}
Asn asn = asnService.addAsn(billType,relatedBill2,structure,"SAP推送",er);
JSONArray erLineList = jsonObject.getJSONArray("erLine"); JSONArray erLineList = jsonObject.getJSONArray("erLine");
for (int i = 0; i < erLineList.size(); i++) { for (int i = 0; i < erLineList.size(); i++) {
@ -233,7 +239,7 @@ public class AsnDetailServiceImpl implements AsnDetailService {
String itemCode=erLine.getString("productId");//料号 String itemCode=erLine.getString("productId");//料号
Item item=itemRepository.findByCode(itemCode); Item item=itemRepository.findByCode(itemCode);
if (item==null){ if (item==null){
return "没有查询到物料号:"+itemCode; return ApiResult.fail(500,"没有查询到物料号:"+itemCode,null);
} }
String lineNo=erLine.getString("lineNumber");//行号 String lineNo=erLine.getString("lineNumber");//行号
String quantityExpected=erLine.getString("quantityExpected");//数量 String quantityExpected=erLine.getString("quantityExpected");//数量
@ -261,24 +267,37 @@ public class AsnDetailServiceImpl implements AsnDetailService {
asnDetail.setPropC3(attributeValue.get("loadUnitId")+""); asnDetail.setPropC3(attributeValue.get("loadUnitId")+"");
asnDetailRepository.save(asnDetail); asnDetailRepository.save(asnDetail);
} }
return null; return ApiResult.fail(200,"成功",null);
} }
@Override @Override
public void receivingAsnDetail(AsnDetail asnDetail, Double qty) { public void receivingAsnDetail(AsnDetail asnDetail, Double qty) {
// 更新订单明细数量
asnDetail.setReceivedQty(asnDetail.getReceivedQty()+qty); asnDetail.setReceivedQty(asnDetail.getReceivedQty()+qty);
if (asnDetail.getOrderQty()<=asnDetail.getReceivedQty()){ asnDetailRepository.save(asnDetail);
// 跟新订单状态
List<AsnDetail> asnDetailList=asnDetailRepository.findByAsnId(asnDetail.getAsn().getId());
Asn asn=asnDetail.getAsn();
if (asnDetailList.size()>0){
asn.setStatus(BizStatus.RECEIVED);
}else {
asn.setStatus(BizStatus.RECEIVING);
}
asnRepository.save(asn);
/*if (asnDetail.getOrderQty()<=asnDetail.getReceivedQty()){
asnDetail.setStatus(BizStatus.RECEIVED); asnDetail.setStatus(BizStatus.RECEIVED);
List<AsnDetail> asnDetailList=asnDetailRepository.findByAsnId(asnDetail.getAsn().getId(),BizStatus.RECEIVING); List<AsnDetail> asnDetailList=asnDetailRepository.findByAsnId(asnDetail.getAsn().getId());
if (asnDetailList.size()<2){ if (asnDetailList.size()<2){
// 收货完成
Asn asn=asnDetail.getAsn(); Asn asn=asnDetail.getAsn();
asn.setStatus(BizStatus.RECEIVED); asn.setStatus(BizStatus.RECEIVED);
asnRepository.save(asn); asnRepository.save(asn);
} }
}else { }else {
// 明细 收货中
asnDetail.setStatus(BizStatus.RECEIVING); asnDetail.setStatus(BizStatus.RECEIVING);
} }
asnDetailRepository.save(asnDetail); asnDetailRepository.save(asnDetail);*/
} }
} }

View File

@ -16,6 +16,9 @@
package com.youchain.businessdata.service.impl; package com.youchain.businessdata.service.impl;
import com.youchain.basicdata.domain.BillType; import com.youchain.basicdata.domain.BillType;
import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.repository.PointRepository;
import com.youchain.businessdata.domain.Asn; import com.youchain.businessdata.domain.Asn;
import com.youchain.businessdata.domain.AsnDetail; import com.youchain.businessdata.domain.AsnDetail;
import com.youchain.businessdata.repository.AsnDetailRepository; import com.youchain.businessdata.repository.AsnDetailRepository;
@ -50,6 +53,7 @@ public class AsnServiceImpl implements AsnService {
private final AsnRepository asnRepository; private final AsnRepository asnRepository;
private final AsnDetailRepository asnDetailRepository; private final AsnDetailRepository asnDetailRepository;
private final PointRepository pointRepository;
private final AsnMapper asnMapper; private final AsnMapper asnMapper;
@Override @Override
@ -120,16 +124,18 @@ public class AsnServiceImpl implements AsnService {
} }
@Override @Override
public Asn addAsn(BillType billType, String relatedBill1, String structure,String orderOrigin, Timestamp erTime) { public Asn addAsn(BillType billType, String relatedBill2, String structure,String orderOrigin, Timestamp erTime) {
Asn asn; Asn asn;
asn = asnRepository.findByRelatedBill1(relatedBill1); asn = asnRepository.findByRelatedBill2(relatedBill2);
if (asn==null){ if (asn==null){
asn = new Asn(); asn = new Asn();
asn.setStatus(BizStatus.OPEN); asn.setStatus(BizStatus.OPEN);
} }
asn.setBillType(billType); asn.setBillType(billType);
// 默认单号
asn.setRelatedBill1(relatedBill2);
asn.setDept(UserUtils.getDept()); asn.setDept(UserUtils.getDept());
asn.setRelatedBill1(relatedBill1); asn.setRelatedBill2(relatedBill2);
asn.setStructure(structure); asn.setStructure(structure);
asn.setOrderOrigin(orderOrigin); asn.setOrderOrigin(orderOrigin);
asn.setErTime(erTime); asn.setErTime(erTime);
@ -143,15 +149,122 @@ public class AsnServiceImpl implements AsnService {
} }
@Override @Override
public ApiResult startAsn(String id) { public ApiResult startAsn(Asn asn) {
Asn asn=asnRepository.getById(Long.valueOf(id)); List<String> datas=new ArrayList<>();
if (asn.getStatus().equals(BizStatus.OPEN)) { if (asn.getStatus().equals(BizStatus.OPEN)) {
asn.setStatus(BizStatus.RECEIVING); //占用库位
List<AsnDetail> asnDetailList=asnDetailRepository.findByAsnId(asn.getId(), BizStatus.OPEN );
if (asnDetailList.size()>0){
for (int i = 0; i < asnDetailList.size(); i++) {
AsnDetail asnDetail=asnDetailList.get(i);
Item item = asnDetail.getItem();
Double zzsQty=item.getExtendD1();// 装载数
Double orderQty=asnDetail.getOrderQty()-asnDetail.getReceivedQty();// 订单数
double result = orderQty / zzsQty;
int floorNum = (int) Math.floor(result);// 整托数
// 成品入库 分配库位
List<Point> points=new ArrayList<>();
List<Point> pointList=pointRepository.findByAreaCodeCp(item.getGoodType(),BaseStatus.FREE);
for (int j = 0; j < pointList.size(); j++) {
if (points.size()>=floorNum){
// 整托数 分配完成
break;
}
Point point =pointList.get(j);
if (point.getHeat()==null||point.getHeat()==1){
//浅位 直接分配
points.add(point);
continue;
}else {
// 深位,查询浅位是否空闲
List<Point> pointListQ=pointRepository.findByBeatCode(point.getBeatCode(),point.getHeat());
if (pointListQ.size()>0){
// 浅位有库存
continue;
}
points.add(point);
}
}
//添加任务
StringBuffer sb=new StringBuffer();
sb.append("明细行:"+asnDetail.getLineNo()+",分配库位【");
for (int j = 0; j < points.size(); j++) {
Point point=points.get(j);
sb.append(point.getCode()+",");
point.setStatus(BaseStatus.USED);
pointRepository.save(point);
}
sb.append("】剩余整托数"+(floorNum-points.size())+",未占用库位的余托数量"+orderQty % zzsQty+";");
datas.add(sb.toString());
}
}
//修改状态
asn.setStatus(BizStatus.ACTIVE);
asnRepository.save(asn);
}else {
//状态错误
return ApiResult.success(500,"状态错误!",asn.getId());
}
return ApiResult.success(200,datas.toString(),asn.getId());
}
@Override
public ApiResult cancelAsn(String id) {
List<String> datas=new ArrayList<>();
Asn asn=asnRepository.getById(Long.valueOf(id));
if (asn.getStatus().equals(BizStatus.ACTIVE)) {
//占用库位
List<AsnDetail> asnDetailList=asnDetailRepository.findByAsnId(asn.getId(), BizStatus.ACTIVE);
if (asnDetailList.size()>0){
for (int i = 0; i < asnDetailList.size(); i++) {
AsnDetail asnDetail=asnDetailList.get(i);
Item item = asnDetail.getItem();
Double zzsQty=item.getExtendD1();// 装载数
Double orderQty=asnDetail.getOrderQty()-asnDetail.getReceivedQty();// 订单数
double result = orderQty / zzsQty;
int floorNum = (int) Math.floor(result);// 整托数
// 成品入库 分配库位
List<Point> points=new ArrayList<>();
List<Point> pointList=pointRepository.findByAreaCodeCp(item.getGoodType(),BaseStatus.USED);
for (int j = 0; j < pointList.size(); j++) {
if (points.size()>=floorNum){
// 整托数 分配完成
break;
}
Point point =pointList.get(j);
if (point.getHeat()==null||point.getHeat()==1){
//浅位 直接取消
points.add(point);
continue;
}else {
// 深位,查询浅位是否空闲
List<Point> pointListQ=pointRepository.findByBeatCode(point.getBeatCode(),point.getHeat());
if (pointListQ.size()>0){
// 浅位有库存
continue;
}
points.add(point);
}
}
//添加任务
StringBuffer sb=new StringBuffer();
sb.append("单号:"+asnDetail.getAsn().getRelatedBill1()+"明细行:"+asnDetail.getLineNo()+",取消占用库位【");
for (int j = 0; j < points.size(); j++) {
Point point=points.get(j);
sb.append(point.getCode()+",");
point.setStatus(BaseStatus.FREE);
pointRepository.save(point);
}
sb.append("】");
datas.add(sb.toString());
}
}
//修改状态
asn.setStatus(BizStatus.OPEN);
asnRepository.save(asn); asnRepository.save(asn);
}else { }else {
//状态错误 //状态错误
return ApiResult.success(500,"状态错误!",id); return ApiResult.success(500,"状态错误!",id);
} }
return ApiResult.success(200,"操作成功!",id); return ApiResult.success(200,datas.toString(),id);
} }
} }

View File

@ -218,7 +218,6 @@ public class InventoryServiceImpl implements InventoryService {
Long ikID=Long.valueOf(taskMap.get("ikID")+""); Long ikID=Long.valueOf(taskMap.get("ikID")+"");
Long pointId=Long.valueOf(taskMap.get("pointId")+""); Long pointId=Long.valueOf(taskMap.get("pointId")+"");
Inventory inventory = getInventory(qty, ikID, pointId,BizStatus.RECEIVING_UP); Inventory inventory = getInventory(qty, ikID, pointId,BizStatus.RECEIVING_UP);
String[] arrTaskIds=taskIds.split(","); String[] arrTaskIds=taskIds.split(",");
for (int j = 0; j < arrTaskIds.length; j++) { for (int j = 0; j < arrTaskIds.length; j++) {
Long taskId=Long.valueOf(arrTaskIds[j]+""); Long taskId=Long.valueOf(arrTaskIds[j]+"");
@ -227,6 +226,7 @@ public class InventoryServiceImpl implements InventoryService {
task.setInventory(inventory); task.setInventory(inventory);
taskRepository.save(task); taskRepository.save(task);
} }
return inventory;
} }
return null; return null;
} }

View File

@ -39,6 +39,7 @@ import com.youchain.businessdata.service.dto.TaskDto;
import com.youchain.businessdata.service.dto.TaskQueryCriteria; import com.youchain.businessdata.service.dto.TaskQueryCriteria;
import com.youchain.businessdata.service.mapstruct.TaskMapper; import com.youchain.businessdata.service.mapstruct.TaskMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.hibernate.SQLQuery; import org.hibernate.SQLQuery;
import org.hibernate.transform.AliasToEntityMapResultTransformer; import org.hibernate.transform.AliasToEntityMapResultTransformer;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -284,10 +285,43 @@ public class TaskServiceImpl implements TaskService {
String itemCode=rfids[0]+""; String itemCode=rfids[0]+"";
String propC1=rfids[1]+""; String propC1=rfids[1]+"";
String propC2=rfids[2]+""; String propC2=rfids[2]+"";
String propC3=rfids[3]+""; String propC3=rfids[3]+"";// 系统单号
String propC4=rfids[4]+""; String propC4=rfids[4]+"";
String propC5=rfids[5]+"";//16进制 String propC5=rfids[5]+"";//16进制 供货数量
StringBuffer propC6=new StringBuffer(); StringBuffer propC6 = new StringBuffer();//流水号
StringBuffer propC7 = new StringBuffer();//成品物料码
int xs = 0;//成品收货-箱数
int xs_d = 0;//成品收货-单箱数量
Double xs_start_d = 0d;//成品收货-起始箱码
Double xs_end_d=0d;//成品收货-终止箱码
String propC6Title=null;//成品收货-成品码抬头
Long propC6_start_d = 0l;//成品收货-成品码起始码
Long propC6_end_d=0l;//成品收货-成品码终止码
Asn asn=asnRepository.findByRelatedBill1(propC3);
if (asn==null){
return ApiResult.result(201, "没有入库单", "");
}else {
if (!asn.getStatus().equals(BizStatus.RECEIVING)&&!asn.getStatus().equals(BizStatus.ACTIVE)){
return ApiResult.result(500, "入库单未激活", "");
}
}
if (asn.getBillType().getCode().equals(BizStatus.FC_RK)){
propC6Title=rfids[7].substring(0, 6);
propC6_start_d=Long.valueOf(rfids[7].substring(6, rfids[7].length()-1));//起始成品码
propC6_end_d=Long.valueOf(rfids[8].substring(6, rfids[8].length()-1));//终止成品码
propC6.append(propC6_start_d+"-"+propC6_end_d);
/*for (Long i = propC6_start_d; i < propC6_end_d; i++) {
if (propC6.length()<1){
propC6.append(propC6Title+i);
}else {
propC6.append(","+propC6Title+i);
}
}*/
xs = Integer.parseInt(rfids[9], 16);//箱数
xs_start_d = Double.valueOf(rfids[10]);//料箱起始码
xs_end_d = Double.valueOf(rfids[11]);//料箱终止码
xs_d = Integer.parseInt(propC5, 16) / xs;//单箱数量
}else {
for (int i = 6; i < rfids.length; i++) { for (int i = 6; i < rfids.length; i++) {
int decimalNumber = Integer.parseInt(rfids[i], 16); int decimalNumber = Integer.parseInt(rfids[i], 16);
int decimalMin = Integer.parseInt("0001", 16); int decimalMin = Integer.parseInt("0001", 16);
@ -303,19 +337,12 @@ public class TaskServiceImpl implements TaskService {
System.out.println("无效RFID:" + rfids[i]); System.out.println("无效RFID:" + rfids[i]);
} }
} }
}
Item item=itemRepository.findByCode(itemCode); Item item=itemRepository.findByCode(itemCode);
if (item==null){ if (item==null){
return ApiResult.result(500, "没有物料", ""); return ApiResult.result(500, "没有物料", "");
} }
Asn asn=asnRepository.findByRelatedBill1(propC3);
if (asn==null){
return ApiResult.result(201, "没有入库单", "");
}else {
if (!asn.getStatus().equals(BizStatus.RECEIVING)){
return ApiResult.result(500, "入库单未激活", "");
}
}
if (itemKeyRepository.getByItemKey(item.getId(),propC1,propC2,propC3,propC4,propC5,propC6.toString())!=null){ if (itemKeyRepository.getByItemKey(item.getId(),propC1,propC2,propC3,propC4,propC5,propC6.toString())!=null){
return ApiResult.result(500, "重复读取", ""); return ApiResult.result(500, "重复读取", "");
}; };
@ -323,14 +350,36 @@ public class TaskServiceImpl implements TaskService {
ItemKey itemKey=itemKeyService.getItemKey(item, propC1, propC2,propC3,propC4,propC5,propC6.toString()); ItemKey itemKey=itemKeyService.getItemKey(item, propC1, propC2,propC3,propC4,propC5,propC6.toString());
//获取流水号 //获取流水号
String[] lsh=itemKey.getPropC6().split(","); String[] lsh=itemKey.getPropC6().split(",");
int taskSum=0;// 生成task数量
if (asn.getBillType().getCode().equals(BizStatus.FC_RK)){
taskSum = xs;//按 料箱数量生成task
}else {
if (lsh.length!=itemKey.getIntPropC5()){ if (lsh.length!=itemKey.getIntPropC5()){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ApiResult.result(500, "流水号数量和供货数量不一致", ""); return ApiResult.result(500, "流水号数量和供货数量不一致", "");
} }
for (int i = 0; i < lsh.length; i++) { taskSum = lsh.length;//按 流水号数量生成task
}
for (int i = 0; i < taskSum; i++) {
Task task = new Task(); Task task = new Task();
task.setItemKey(itemKey); if (asn.getBillType().getCode().equals(BizStatus.FC_RK)){
task.setPlanQty((double) xs_d);//单箱数量
StringBuffer putCode=new StringBuffer();
for (int j = 0; j < xs_d; j++) {
if (putCode.length()<1){
putCode.append(propC6Title+(propC6_start_d+j));
}else {
putCode.append(","+propC6Title+(propC6_start_d+j));
}
}
propC6_start_d=propC6_start_d+xs_d;
task.setPutCode(putCode.toString());//箱内 流水号
task.setSrcStockCode((xs_start_d+i)+"");
}else {
task.setPlanQty(1d); task.setPlanQty(1d);
task.setPutCode(lsh[i]);
}
task.setItemKey(itemKey);
task.setDept(UserUtils.getDept()); task.setDept(UserUtils.getDept());
task.setTaskStatus(BizStatus.RECEIVING); task.setTaskStatus(BizStatus.RECEIVING);
if (type.equals("AGV")) { if (type.equals("AGV")) {
@ -338,37 +387,43 @@ public class TaskServiceImpl implements TaskService {
} else if (type.equals("RG")) { } else if (type.equals("RG")) {
task.setBeSkip(0); task.setBeSkip(0);
} }
task.setPutCode(lsh[i]);
task.setBillCode(propC3); task.setBillCode(propC3);
task.setTaskType(BizStatus.ASN); task.setTaskType(asn.getBillType().getCode());
Point startPoint = pointRepository.findByTypeAndArea(BaseStatus.PLATFORM, item.getGoodType()); Point startPoint = pointRepository.findByTypeAndArea(BaseStatus.PLATFORM, item.getGoodType());
task.setSrcPoint(startPoint); task.setSrcPoint(startPoint);
taskRepository.save(task); taskRepository.save(task);
} }
return ApiResult.result(200, "操作成功", ""); return ApiResult.result(200, "操作成功", asn.getBillType().getCode());
} }
@Override @Override
public ApiResult manualReceiving(JSONObject request) { public ApiResult manualReceiving(JSONObject request) {
String rfid=request.getString("RFID"); String rfid=request.getString("RFID");
Point point= pointRepository.getById(request.getLong("pointId")); Point point= pointRepository.getById(request.getLong("pointId"));
System.out.println("rfid:"+rfid);
// 读取RFID生成Task // 读取RFID生成Task
String billTypeCode="";//单据类型
ApiResult apiResult = readRfid(rfid, "RG"); ApiResult apiResult = readRfid(rfid, "RG");
if (apiResult.getStatus()!=200){ if (apiResult.getStatus()!=200){
return apiResult; return apiResult;
}else {
if (apiResult.getStatus()==200){
billTypeCode=apiResult.getData()+"";
}
} }
// 分配Task库位 // 分配Task库位
List<Task> taskList=taskRepository.findByItemType(BizStatus.RECEIVING,0,BizStatus.BCP); List<Task> taskList=taskRepository.findByItemType(BizStatus.RECEIVING,0,billTypeCode);
for (int i = 0; i < taskList.size(); i++) { for (int i = 0; i < taskList.size(); i++) {
Task task=taskList.get(i); Task task=taskList.get(i);
getAsnTask(point, task); ApiResult api = getAsnTask(point, task);
taskRepository.save(task); taskRepository.save(task);
} }
// 生成库存 // 生成库存
List<Map<String,Object>> taskMapList=taskRepository.findByAgvTask(null,"ASN",0l); List<Map<String,Object>> taskMapList=taskRepository.findByAgvTask(null,billTypeCode,0l);
Inventory inventory = inventoryService.asnAddInventory(taskMapList); Inventory inventory = inventoryService.asnAddInventory(taskMapList);
// 更新当前点位 存储容器状态
point.setStorageType(inventory.getItemKey().getItem().getGoodType());
point.setStatus(BaseStatus.FREE);
pointRepository.save(point);
return ApiResult.result(200, "操作成功", ""); return ApiResult.result(200, "操作成功", "");
} }
@ -433,4 +488,45 @@ public class TaskServiceImpl implements TaskService {
inventoryService.pickDelInventory(taskList); inventoryService.pickDelInventory(taskList);
return ApiResult.fail(200,"操作成功",""); return ApiResult.fail(200,"操作成功","");
} }
@Override
public ApiResult devanRfid(String rfid) {
String[] rfids=rfid.split("\\|");
JSONObject data=new JSONObject();
if (rfids.length>4){
String sku=rfids[0]+"";//sku
String propC1=rfids[1]+"";
String propC2=rfids[2]+"";
String propC3=rfids[3]+"";// 系统单号
String propC5=rfids[5]+"";// 收货数量16禁止
Asn asn=asnRepository.findByRelatedBill1(propC3);
if (asn!=null){
if (asn.getBillType().getCode().equals(BizStatus.FC_RK)){
// 成品入库
if (rfids.length==13){
data.put("relatedBill1",asn.getRelatedBill1());
data.put("relatedBill2",asn.getRelatedBill2());
data.put("billType",asn.getBillType());
data.put("sku",sku);
List<AsnDetail> asnDetailList = asnDetailRepository.findByAsnAndItem(asn.getRelatedBill1(),sku);
double orderQty=0;
for (int i = 0; i < asnDetailList.size(); i++) {
orderQty=orderQty+asnDetailList.get(i).getOrderQty();
}
data.put("lineNos",asnDetailList.size());
data.put("RFID",rfid);
data.put("orderQty",orderQty);
data.put("billCode",BizStatus.CP);
data.put("receivedQty",Integer.parseInt(propC5, 16));
}else {
return ApiResult.fail(400,"rfid长度不为13","");
}
}
}else {
return ApiResult.fail(400,"未查询到系统单号","");
}
}
return ApiResult.fail(200,"操作成功",data);
}
} }

View File

@ -15,20 +15,30 @@
*/ */
package com.youchain.modules.quartz.task; package com.youchain.modules.quartz.task;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.youchain.annotation.AnonymousAccess; import com.youchain.annotation.AnonymousAccess;
import com.youchain.basicdata.domain.BillType;
import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.repository.BillTypeRepository;
import com.youchain.basicdata.repository.PointRepository; import com.youchain.basicdata.repository.PointRepository;
import com.youchain.businessdata.domain.AgvTask; import com.youchain.businessdata.domain.AgvTask;
import com.youchain.businessdata.domain.Asn;
import com.youchain.businessdata.repository.AgvTaskRepository; import com.youchain.businessdata.repository.AgvTaskRepository;
import com.youchain.businessdata.repository.AsnRepository;
import com.youchain.businessdata.service.AgvTaskService; import com.youchain.businessdata.service.AgvTaskService;
import com.youchain.businessdata.service.AsnService;
import com.youchain.exception.handler.ApiResult; import com.youchain.exception.handler.ApiResult;
import com.youchain.utils.BizStatus; import com.youchain.utils.BizStatus;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
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.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
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.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -47,18 +57,39 @@ import java.util.concurrent.BlockingQueue;
@RestController @RestController
@RequestMapping("/api/test") @RequestMapping("/api/test")
public class TestTask { public class TestTask {
@Autowired @Autowired
private AgvTaskRepository agvTaskRepository; private AgvTaskRepository agvTaskRepository;
@Autowired
private PointRepository pointRepository; private PointRepository pointRepository;
@Autowired
private AsnRepository asnRepository;
@Autowired
private AsnService asnService;
@Autowired @Autowired
private AgvTaskService agvTaskService; private AgvTaskService agvTaskService;
private static final int MAX_TASK_COUNT = 4; private static final int MAX_TASK_COUNT = 4;
private static final long TIMEOUT_MS = 600000; // 10分钟以毫秒为单位 private static final long TIMEOUT_MS = 600000; // 10分钟以毫秒为单位
private long lastTaskTime = System.currentTimeMillis(); private long lastTaskTime = System.currentTimeMillis();
/** 占用库位*/
/*@PostMapping("/startAsn")
@AnonymousAccess*/
@Transactional
public ResponseEntity<Object> startAsn(String req){
JSONArray data=new JSONArray();
JSONObject jsonObject=JSONObject.parseObject(req);
JSONArray billTypeArray=jsonObject.getJSONArray("billType");
for (int i = 0; i < billTypeArray.size(); i++) {
List<Asn> asnList=asnRepository.findByBillType(billTypeArray.getString(i));
for (int j = 0; j < asnList.size(); j++) {
Asn asn=asnList.get(j);
ApiResult apiResult = asnService.startAsn(asn);
data.add(apiResult);
}
}
ApiResult apiResult=ApiResult.fail(200,"操作成功",null);
return new ResponseEntity<>(apiResult, HttpStatus.valueOf(apiResult.getStatus()));
}
@PostMapping("/asnTask") @PostMapping("/asnTask")
@AnonymousAccess @AnonymousAccess
public ResponseEntity<Object> asnTask(){ public ResponseEntity<Object> asnTask(){

View File

@ -78,7 +78,7 @@ public class AuthorizationController {
public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception {
// 密码解密 // 密码解密
String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword()); String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword());
// 查询验证码 /*// 查询验证码
String code = (String) redisUtils.get(authUser.getUuid()); String code = (String) redisUtils.get(authUser.getUuid());
// 清除验证码 // 清除验证码
redisUtils.del(authUser.getUuid()); redisUtils.del(authUser.getUuid());
@ -87,7 +87,7 @@ public class AuthorizationController {
} }
if (StringUtils.isBlank(authUser.getCode()) || !authUser.getCode().equalsIgnoreCase(code)) { if (StringUtils.isBlank(authUser.getCode()) || !authUser.getCode().equalsIgnoreCase(code)) {
throw new BadRequestException("验证码错误"); throw new BadRequestException("验证码错误");
} }*/
UsernamePasswordAuthenticationToken authenticationToken = UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(authUser.getUsername(), password); new UsernamePasswordAuthenticationToken(authUser.getUsername(), password);
Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);

View File

@ -62,4 +62,5 @@ public interface DictDetailService {
List<DictDetailDto> getDictByName(String name); List<DictDetailDto> getDictByName(String name);
Map<String ,DictDetail> getDictDetailByName(String name); Map<String ,DictDetail> getDictDetailByName(String name);
Map<String,Map<String,Object>> getDictDetailByName(List<String> dictName);
} }

View File

@ -92,6 +92,18 @@ public class DictDetailServiceImpl implements DictDetailService {
return map; return map;
} }
@Override
public Map<String,Map<String,Object>> getDictDetailByName(List<String> dictNames) {
Map<String,Map<String,Object>> dickMap=new HashMap<>();
for (int i = 0; i < dictNames.size(); i++) {
Map<String,Object> dickDetail=new HashMap<>();
List<DictDetail> dictDetailList= dictDetailRepository.findByDictName(dictNames.get(i));
for (int j = 0; j < dictDetailList.size(); j++) {
DictDetail dictDetail=dictDetailList.get(j);
}
}
return null;
}
@Override @Override

View File

@ -17,6 +17,7 @@ package com.youchain.modules.system.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import com.youchain.modules.system.domain.Dict; import com.youchain.modules.system.domain.Dict;
import com.youchain.modules.system.domain.DictDetail;
import com.youchain.modules.system.service.DictService; import com.youchain.modules.system.service.DictService;
import com.youchain.modules.system.service.dto.DictDetailDto; import com.youchain.modules.system.service.dto.DictDetailDto;
import com.youchain.modules.system.service.dto.DictDto; import com.youchain.modules.system.service.dto.DictDto;
@ -115,6 +116,7 @@ public class DictServiceImpl implements DictService {
FileUtil.downloadExcel(list, response); FileUtil.downloadExcel(list, response);
} }
@Override @Override
public Dict getDictDescription(String name) { public Dict getDictDescription(String name) {
return dictRepository.getDictDescription(name); return dictRepository.getDictDescription(name);

View File

@ -28,7 +28,7 @@ public interface BaseStatus {
public static String BOX = "BOX"; public static String BOX = "BOX";
/** /**
* - * -
*/ */
public static String STORAGE = "STORAGE"; public static String STORAGE = "STORAGE";
/** /**

View File

@ -218,12 +218,11 @@ public interface BizStatus {
String BCP="BCP"; String BCP="BCP";
/** 成品*/ /** 成品*/
String CP="CP"; String CP="CP";
/** 成品入库*/
String FC_RK="FC_RK";
/** 料箱*/ /** 料箱*/
String LX="LX"; String LX="LX";
String BCP_PT="BCP_PT"; String BCP_PT="BCP_PT";
String CP_PT="CP_PT";
String LX_PT="LX_PT";
/** AGV出库*/ /** AGV出库*/
String AGV_PT=" AGV_PT"; String AGV_PT=" AGV_PT";
/** 人工出库*/ /** 人工出库*/