add:添加一体机批量入库/组盘

This commit is contained in:
zhangzhiqiang
2023-08-04 14:23:32 +08:00
parent 99813b0410
commit 172ec8692c
24 changed files with 1300 additions and 67 deletions

View File

@@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext_manage.acs.service.impl.AcsToWmsServiceImpl;
import org.nl.wms.scheduler_manage.service.extendtask.Engrave.EngraveSendEmpTask;
import org.nl.wms.scheduler_manage.service.extendtask.SpeMachinery.SpeEmpTask;
import org.nl.wms.scheduler_manage.service.extendtask.SpeMachinery.SpeFullTask;
import org.nl.wms.scheduler_manage.service.extendtask.wash.WashMachineryTask;
@@ -35,6 +36,7 @@ public class ConventConfig implements SmartLifecycle {
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_WASH_FULL, SpringContextHolder.getBean(WashSendMaterialTask.class));
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_WASH_EMP, SpringContextHolder.getBean(WashCallEmptyTask.class));
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_WASH_FULL_ERROR, SpringContextHolder.getBean(WashSendMaterialQZTask.class));
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_WASH_PLOTTER_EMP, SpringContextHolder.getBean(EngraveSendEmpTask.class));
System.out.println("初始化Task_Collent完成777"+AcsToWmsServiceImpl.Task_Collent.size());
}

View File

@@ -2,19 +2,20 @@ package org.nl.wms.masterdata_manage.controller.vehicle;
import io.swagger.annotations.ApiOperation;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.utils.RedissonUtils;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbBucketrecordService;
import org.nl.wms.scheduler_manage.service.point.ISchBasePointService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
@@ -38,5 +39,16 @@ public class MdPbBucketrecordController {
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page) {
return new ResponseEntity<>(iMdPbBucketrecordService.queryAll(whereJson,page), HttpStatus.OK);
}
@PostMapping("/excelImport")
@Log("导入组盘信息")
//("查询桶记录表")
public ResponseEntity<Object> excelImport(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
RedissonUtils.lock(() -> {
iMdPbBucketrecordService.excelImport(file, request, response);
}, "组盘信息导入", null);
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
}
}

View File

@@ -4,7 +4,10 @@ import com.alibaba.fastjson.JSONObject;
import org.nl.common.domain.query.PageQuery;
import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbBucketrecord;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
@@ -27,4 +30,14 @@ public interface IMdPbBucketrecordService extends IService<MdPbBucketrecord> {
Object queryAll(Map whereJson, PageQuery page);
void createBucke(MdPbBucketrecord dao);
/**
* 导入组盘信息
* @param file
* @param request
* @param response
*/
void excelImport(MultipartFile file, HttpServletRequest request, HttpServletResponse response);
List<Map> getMstList();
}

View File

@@ -6,32 +6,36 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
/**
* <p>
* 记录表
* 记录表:存储物料跟托盘的关系
* </p>
*
* @author generator
* @since 2023-05-10
*/
@Data
@Builder
@SuperBuilder
@EqualsAndHashCode(callSuper = false)
@TableName("md_pb_bucketrecord")
public class MdPbBucketrecord implements Serializable {
public MdPbBucketrecord() { }
private static final long serialVersionUID = 1L;
/**
* 桶记录标识
*/
@TableId
private Long bucket_record_id;
private String bucket_record_id;
/**
* 桶唯一标识
@@ -43,10 +47,33 @@ public class MdPbBucketrecord implements Serializable {
*/
private String storagevehicle_type;
/**
* 销售单
*/
private String sale_code;
/**
* 合同号
*/
private String contract_code;
/**
* 销售单行号
*/
private Integer seq_no;
/**
* 物料标识
*/
private String material_id;
/**
* 物料标识
*/
private String material_code;
/**
* 物料规格
*/
private String material_spec;
/**
* 批次
@@ -71,17 +98,22 @@ public class MdPbBucketrecord implements Serializable {
/**
* 数量计量单位标识
*/
private Long qty_unit_id;
private String qty_unit_id;
/**
* 数量计量单位名称
*/
private String qty_unit_name;
/**
* 物料单重
*/
private String unit_weight;
/**
* 数量
*/
private BigDecimal storage_qty;
private String storage_qty;
/**
* 顺序号
@@ -101,17 +133,18 @@ public class MdPbBucketrecord implements Serializable {
/**
* 打印次数
*/
private BigDecimal print_times;
private Integer print_times;
/**
* 状态
* @see org.nl.wms.storage_manage.IOSEnum.BILL_STATUS;
*/
private String status;
/**
* 创建人
*/
private Long create_id;
private String create_id;
/**
* 创建人姓名
@@ -136,7 +169,7 @@ public class MdPbBucketrecord implements Serializable {
/**
* 组盘人
*/
private Long makeup_optid;
private String makeup_optid;
/**
* 组盘人姓名
@@ -151,7 +184,7 @@ public class MdPbBucketrecord implements Serializable {
/**
* 入库人
*/
private Long instor_optid;
private String instor_optid;
/**
* 入库人姓名
@@ -166,7 +199,7 @@ public class MdPbBucketrecord implements Serializable {
/**
* 出库人
*/
private Long outstor_optid;
private String outstor_optid;
/**
* 出库人姓名
@@ -181,7 +214,7 @@ public class MdPbBucketrecord implements Serializable {
/**
* 入立库人
*/
private Long instor_optid2;
private String instor_optid2;
/**
* 入立库人姓名

View File

@@ -17,4 +17,6 @@ import java.util.Map;
public interface MdPbBucketrecordMapper extends BaseMapper<MdPbBucketrecord> {
List<Map> queryAll(Map<String,Object> map);
List<Map> getMstList();
}

View File

@@ -5,8 +5,8 @@
SELECT
re.*,
ma.material_name,
ma.material_code
ma.material_code,
ma.material_spec
FROM
MD_PB_BucketRecord re
LEFT JOIN md_me_materialbase ma ON ma.material_id = re.material_id
@@ -29,4 +29,10 @@
</if>
</select>
<select id="getMstList" resultType="java.util.Map">
select GROUP_CONCAT(bucket_record_id) as bucket_record_id,(@rowcount :=@rowcount+1) as sqe_on, create_time,storagevehicle_code,sale_code,SUM(storage_qty) as storage_qty,count(storagevehicle_code) as count
from md_pb_bucketrecord,(select @rowcount := 0) as r
where status = '1'
GROUP BY storagevehicle_code,sale_code,create_time
</select>
</mapper>

View File

@@ -1,15 +1,25 @@
package org.nl.wms.masterdata_manage.service.vehicle.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.wms.masterdata_manage.MasterEnum;
import org.nl.wms.masterdata_manage.service.material.IMdMeMaterialbaseService;
import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleextService;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleinfoService;
import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbBucketrecord;
@@ -18,14 +28,25 @@ import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbStoragevehicleinfo;
import org.nl.wms.masterdata_manage.service.vehicle.dao.mapper.MdPbBucketrecordMapper;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbBucketrecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
import org.nl.wms.product_manage.service.workprocedure.dao.PdmBiWorkprocedure;
import org.nl.wms.storage_manage.IOSEnum;
import org.nl.wms.storage_manage.IVTEnum;
import org.nl.wms.system_manage.service.user.dao.SysUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.math.RoundingMode;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* <p>
@@ -38,10 +59,14 @@ import java.util.Map;
@Service
public class MdPbBucketrecordServiceImpl extends ServiceImpl<MdPbBucketrecordMapper, MdPbBucketrecord> implements IMdPbBucketrecordService {
private static Map<Integer,String> Excel_Item = MapOf.of(0,"storagevehicle_code",1,"sale_code",2,"contract_code",3,"material_code",8,"storage_qty",9,"bucketunique");
@Autowired
protected IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; // 载具服务
@Autowired
private IMdMeMaterialbaseService materialbaseService;
@Override
public Object queryAll(Map whereJson, PageQuery pageQuery) {
Page<Object> page = PageHelper.startPage(pageQuery.getPage()+1, pageQuery.getSize());
@@ -58,24 +83,93 @@ public class MdPbBucketrecordServiceImpl extends ServiceImpl<MdPbBucketrecordMap
.eq(MdPbStoragevehicleinfo::getStoragevehicle_code, dao.getStoragevehicle_code())
);
dao.setBucket_record_id(IdUtil.getLongId());
dao.setBucket_record_id(IdUtil.getStringId());
dao.setStoragevehicle_type("1"); // TODO 暂时写死
dao.setIvt_level(IVTEnum.IVT_LEVEL.code("一级"));
dao.setIs_active("1");
dao.setQuality_scode(IVTEnum.QUALITY_SCODE.code("待检品"));
dao.setPrint_times(BigDecimal.valueOf(0));
dao.setCreate_id(Long.valueOf(SecurityUtils.getCurrentUserId()));
dao.setPrint_times(0);
dao.setCreate_id(SecurityUtils.getCurrentUserId());
dao.setCreate_name(SecurityUtils.getCurrentNickName());
dao.setCreate_time(DateUtil.now());
dao.setStoragevehicle_id(vehicleDao.getStoragevehicle_id());
dao.setStoragevehicle_code(vehicleDao.getStoragevehicle_code());
dao.setMakeup_optid(Long.valueOf(SecurityUtils.getCurrentUserId()));
dao.setMakeup_optid(SecurityUtils.getCurrentUserId());
dao.setMakeup_optname(SecurityUtils.getCurrentNickName());
dao.setMakeup_time(DateUtil.now());
dao.setInstor_optid(Long.valueOf(SecurityUtils.getCurrentUserId()));
dao.setInstor_optid(SecurityUtils.getCurrentUserId());
dao.setInstor_optname(SecurityUtils.getCurrentNickName());
dao.setInstor_time(DateUtil.now());
this.save(dao);
}
@Override
public void excelImport(MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
try {
InputStream inputStream = file.getInputStream();
ExcelReader excelReader = ExcelUtil.getReader(inputStream, 0);
List<List<Object>> read = excelReader.read();
List<MdPbBucketrecord> data = new ArrayList<>();
row:
for (int i = 4; i < read.size(); i++) {
if (CollectionUtils.isEmpty(read.get(i))){ break; }
MdPbBucketrecord mdPbBucketrecord = new MdPbBucketrecord();
if (StringUtils.isEmpty(String.valueOf(read.get(i).get(0)))){
break row;
}
for (int i1 = 0; i1 < read.get(i).size(); i1++) {
Object item = read.get(i).get(i1);
String s = Excel_Item.get(i1);
if (s!=null){
Class<MdPbBucketrecord> bucket = MdPbBucketrecord.class;
Field field = bucket.getDeclaredField(s);
field.setAccessible(true);
field.set(mdPbBucketrecord,String.valueOf(item));
}
}
data.add(mdPbBucketrecord);
}
Set<String> collect = data.stream().map(MdPbBucketrecord::getMaterial_code).collect(Collectors.toSet());
List<MdMeMaterialbase> materials = materialbaseService.list(new QueryWrapper<MdMeMaterialbase>().in("material_code", collect));
if (materials.size()!=collect.size()){
List<String> collect1 = materials.stream().map(MdMeMaterialbase::getMaterial_code).collect(Collectors.toList());
String notIn = collect.stream().filter(a -> !collect1.contains(a)).collect(Collectors.joining(","));
throw new BadRequestException("当前物料编号不存在:"+notIn);
}
Map<String, MdMeMaterialbase> materialMap = materials.stream().collect(HashMap::new, (k, v) -> k.put(v.getMaterial_code(), v), HashMap::putAll);
String now = DateUtil.now();
String pcsn = DateUtil.today();
for (MdPbBucketrecord datum : data) {
datum.setBucket_record_id(IdUtil.getStringId());
String bucketunique = datum.getBucketunique();
if (StringUtils.isEmpty(bucketunique)){
datum.setBucketunique(CodeUtil.getNewCode("PRODUCT_BUCKET_CODE"));
}
datum.setCreate_id(SecurityUtils.getCurrentUserId());
datum.setCreate_name(SecurityUtils.getCurrentNickName());
datum.setCreate_time(now);
datum.setMaterial_id(materialMap.get(datum.getMaterial_code()).getMaterial_id());
datum.setMaterial_spec(materialMap.get(datum.getMaterial_code()).getMaterial_spec());
datum.setPcsn(pcsn);
datum.setStoragevehicle_type("1");
datum.setIvt_level(IVTEnum.IVT_LEVEL.code("一级"));
datum.setIs_active("1");
datum.setQuality_scode(IVTEnum.QUALITY_SCODE.code("待检品"));
datum.setPrint_times(0);
datum.setQty_unit_id("16");
datum.setQty_unit_name("个/只");
datum.setStatus(MasterEnum.BOX_STATUS.code("生成"));
}
this.saveBatch(data);
}catch (Exception ex){
throw new BadRequestException(ex.getMessage());
}
}
@Override
public List<Map> getMstList() {
return this.baseMapper.getMstList();
}
}

View File

@@ -2,19 +2,27 @@ package org.nl.wms.pda_manage.pda.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.utils.MapOf;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtSectattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtStructattrService;
import org.nl.wms.masterdata_manage.MasterEnum;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbBucketrecordService;
import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbBucketrecord;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtBsrealstorattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtBsrealstorattr;
import org.nl.wms.mps_manage.saleorder.service.IMpsSaleOrderService;
import org.nl.wms.scheduler_manage.service.task.PointService;
import org.nl.wms.storage_manage.IOSEnum;
import org.nl.wms.storage_manage.pda.service.PdaStCpInService;
import org.nl.wms.storage_manage.productmanage.service.structIvt.IStIvtStructivtCpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -36,15 +44,16 @@ import java.util.*;
public class PdaProductIosController {
@Autowired
private IStIvtStructivtCpService productInService;
@Autowired
private IStIvtStructattrService structivtService;
@Autowired
private IStIvtSectattrService sectattrService;
private IStIvtBsrealstorattrService storattrService; // 实物属性服务
@Autowired
private IMpsSaleOrderService saleOrderService;
@Autowired
private PointService pointService;
@Autowired
private IMdPbBucketrecordService bucketrecordService;
@Autowired
private PdaStCpInService pdaStCpInService;
@PostMapping("/order")
@Log("根据订单获取订单物料信息")
@@ -81,4 +90,48 @@ public class PdaProductIosController {
String type = param.getString("type");
return new ResponseEntity<>(pointService.selectPoint(type),HttpStatus.OK);
}
@PostMapping("/bucket")
@Log("根据订单获取订单物料信息")
//("根据订单获取订单物料信息")
public ResponseEntity<Object> bucket(@RequestBody JSONObject param) {
String storagevehicleCode = param.getString("storagevehicle_code");
List mstList= new ArrayList<>();
if (StringUtils.isEmpty(storagevehicleCode)){
mstList = bucketrecordService.getMstList();
}else {
List<Map<String, Object>> maps = bucketrecordService.listMaps(new QueryWrapper<MdPbBucketrecord>()
.eq("storagevehicle_code", storagevehicleCode).eq("status", "1"));
int i=1;
for (Map<String, Object> map : maps) {
map.put("sqe_on",i);
i++;
}
mstList=maps;
}
return new ResponseEntity<>(TableDataInfo.build(mstList),HttpStatus.OK);
}
@PostMapping("/stor")
public ResponseEntity<Object> stor() {
List<StIvtBsrealstorattr> storList = storattrService.list(
new QueryWrapper<StIvtBsrealstorattr>().lambda()
.eq(StIvtBsrealstorattr::getIs_used, IOSEnum.IS_USED.code(""))
.eq(StIvtBsrealstorattr::getStor_id, IOSEnum.STOR_CODE.code("成品库"))
);
return new ResponseEntity<>(TableDataInfo.build(storList),HttpStatus.OK);
}
@PostMapping("/batchin")
@Log("批量入库")
//("新增入库单")
public ResponseEntity<Object> batchin(@RequestBody JSONArray whereJson) {
pdaStCpInService.confirmIn(null);
return new ResponseEntity<>(MapOf.of("message","创建成功","status", HttpStatus.OK.value()),HttpStatus.OK);
}
@PostMapping("/iosTasks")
public ResponseEntity<Object> iosTasks(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(MapOf.of("message","创建成功","status", HttpStatus.OK.value()),HttpStatus.OK);
}
}

View File

@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.extension.api.R;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.RedissonUtils;
@@ -153,6 +154,7 @@ public class TmpKZController {
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
}
@PostMapping("/kz/submitkz")
@Log("提交刻字任务")
@SaIgnore
public ResponseEntity<Object> submitkz(@RequestBody JSONArray param){
engraveScheduleService.createTask(param);
@@ -178,10 +180,25 @@ public class TmpKZController {
for (Map<String, Object> map : list) {
map.put("material_spec",materialMap.get(map.get("material_id")).getMaterial_spec());
map.put("material_code",materialMap.get(map.get("material_id")).getMaterial_code());
map.put("create_time",map.get("create_time").toString());
}
}
return new ResponseEntity<>(TableDataInfo.build(list),HttpStatus.OK);
}
@PostMapping("/kz/sendVechile")
@Log("手动送空框")
@SaIgnore
public ResponseEntity<Object> sendVechile(@RequestBody JSONObject param){
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/kz/resend")
@Log("刻字任务重新下发")
@SaIgnore
public ResponseEntity<Object> resend(@RequestBody JSONObject param){
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -94,9 +94,9 @@ public class EngraveTranSportTask extends AbstractAcsTask {
String[] to_sort_array = {"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"};
String[] to_devices_array = {"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"};
String[] to_weight_array = {"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"};
int i=1;
int i=0;
for (Map.Entry<String, String> entry : qtyArr.entrySet()) {
to_sort_array[i] = String.valueOf(i);
to_sort_array[i] = String.valueOf(i+1);
to_devices_array[i] = String.valueOf(entry.getKey());
to_weight_array[i] = String.valueOf(new BigDecimal(entry.getValue()).intValue());
i++;

View File

@@ -72,8 +72,8 @@ public class WashMachineryTask extends AbstractAcsTask {
if (StringUtils.isNotEmpty(param.getString("in_pcsn"))){
query.eq("task_code",param.getString("in_pcsn"));
}
if (StringUtils.isNotEmpty(param.getString("task_id"))){
query.eq("task_id",param.getString("task_id"));
if (StringUtils.isNotEmpty(param.getString("task_code"))){
query.eq("task_code",param.getString("task_code"));
}
SchBaseTask taskDao = taskService.getOne(query);
// 更新任务状态为完成

View File

@@ -1,5 +1,6 @@
package org.nl.wms.storage_manage.pda.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.domain.query.PageQuery;
@@ -39,7 +40,7 @@ public interface PdaStCpInService {
*/
Object getMaterial(JSONObject whereJson, PageQuery page);
JSONObject getMaterial(JSONObject whereJson);
Object getMaterial(JSONObject whereJson);
/**
* 确认入库
@@ -48,6 +49,13 @@ public interface PdaStCpInService {
*/
JSONObject confirmIn(JSONObject whereJson);
/**
* 批量入库
* @param whereJson
* @return
*/
JSONObject batchConfirmIn(JSONArray whereJson);
/**
* 成品入库查询
* @param whereJson /

View File

@@ -1,38 +1,65 @@
package org.nl.wms.storage_manage.pda.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.publish.BussEventMulticaster;
import org.nl.common.publish.event.PointEvent;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.wms.masterdata_manage.MasterEnum;
import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbBucketrecordService;
import org.nl.wms.masterdata_manage.service.vehicle.dao.MdPbBucketrecord;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtBsrealstorattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtStructattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtBsrealstorattr;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtStructattr;
import org.nl.wms.mps_manage.saleorder.service.IMpsSaleOrderService;
import org.nl.wms.mps_manage.saleorder.service.dao.MpsSaleOrder;
import org.nl.wms.scheduler_manage.service.point.ISchBasePointService;
import org.nl.wms.scheduler_manage.service.point.dao.SchBasePoint;
import org.nl.wms.storage_manage.IOSEnum;
import org.nl.wms.storage_manage.IVTEnum;
import org.nl.wms.storage_manage.pda.PDAEnum;
import org.nl.wms.storage_manage.pda.service.PdaStCpInService;
import org.nl.wms.storage_manage.productmanage.service.iostorInv.IStIvtIostorinvCpService;
import org.nl.wms.storage_manage.productmanage.service.iostorInv.IStIvtIostorinvdisCpService;
import org.nl.wms.storage_manage.productmanage.service.iostorInv.IStIvtIostorinvdisdtlCpService;
import org.nl.wms.storage_manage.productmanage.service.iostorInv.IStIvtIostorinvdtlCpService;
import org.nl.wms.storage_manage.productmanage.service.iostorInv.dao.StIvtIostorinvCp;
import org.nl.wms.storage_manage.productmanage.service.iostorInv.dao.StIvtIostorinvdisCp;
import org.nl.wms.storage_manage.productmanage.service.iostorInv.dao.StIvtIostorinvdisdtlCp;
import org.nl.wms.storage_manage.productmanage.service.iostorInv.dao.StIvtIostorinvdtlCp;
import org.nl.wms.storage_manage.productmanage.service.moreOrLess.dao.StIfDeliveryorderCp;
import org.nl.wms.storage_manage.productmanage.service.structIvt.IStIvtStructivtCpService;
import org.nl.wms.storage_manage.productmanage.util.ChangeIvtUtil;
import org.nl.wms.system_manage.service.dict.ISysDictService;
import org.nl.wms.system_manage.service.dict.dao.Dict;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Collectors;
/**
* <p>
@@ -56,6 +83,8 @@ public class PdaStCpInServiceImpl implements PdaStCpInService {
@Autowired
private ISchBasePointService iSchBasePointService; // 点位服务
@Autowired
private IStIvtStructivtCpService iStIvtStructivtCpService;
@Autowired
private IMpsSaleOrderService iMpsSaleOrderService; // 订单服务
@@ -68,6 +97,10 @@ public class PdaStCpInServiceImpl implements PdaStCpInService {
@Autowired
protected IStIvtIostorinvdisCpService iostorinvdisCpService; // 成品出入库分配表服务
@Autowired
protected IMdPbBucketrecordService bucketrecordService; // 成品出入库分配表服务
@Autowired
protected IStIvtIostorinvdisdtlCpService iStIvtIostorinvdisdtlCpService;
@Override
public JSONObject getBcpStor() {
@@ -123,15 +156,12 @@ public class PdaStCpInServiceImpl implements PdaStCpInService {
}
@Override
public JSONObject getMaterial(JSONObject whereJson) {
public Object getMaterial(JSONObject whereJson) {
List<Map> list = iMpsSaleOrderService.getPdaMaterial(whereJson);
for (Map map : list) {
map.put("create_time",map.get("plandeliver_date"));
}
JSONObject result = new JSONObject();
result.put("data", JSONArray.parseArray(JSON.toJSONString(list)));
result.put("message", "查询成功");
return result;
return TableDataInfo.build(list);
}
@Override
@@ -191,6 +221,311 @@ public class PdaStCpInServiceImpl implements PdaStCpInService {
return result;
}
@Override
@Transactional
public JSONObject batchConfirmIn(JSONArray arr) {
List<StIvtStructattr> stuctList = structattrService.list(
new QueryWrapper<StIvtStructattr>().lambda()
.eq(StIvtStructattr::getStor_id, IOSEnum.STOR_CODE.code("成品库"))
.eq(StIvtStructattr::getSect_id, IOSEnum.SECT_CODE.code("成品库区"))
.eq(StIvtStructattr::getIs_used, IOSEnum.IS_USED.code(""))
.eq(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.eq(StIvtStructattr::getStoragevehicle_code, "")
.eq(StIvtStructattr::getIs_emptyvehicle, false)
.orderByAsc(StIvtStructattr::getStruct_code).last("limit " + arr.size()));
if (stuctList.size()<arr.size()){
throw new BadRequestException("当前成品库可用货位不足:"+stuctList.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.joining(",")));
}
String pcsn = DateUtil.today();
//每个托盘的物料
for (int i = 0; i < arr.size(); i++) {
JSONObject item = (JSONObject) arr.get(i);
StIvtStructattr structattr = stuctList.get(i);
// 2.组盘信息
List<MdPbBucketrecord> rows = bucketrecordService.listByIds(Arrays.asList(item.getString("bucket_record_id").split(",")));
bucketrecordService.update(new UpdateWrapper<MdPbBucketrecord>()
.set("status", MasterEnum.BOX_STATUS.code("组盘"))
.set("instor_optid", SecurityUtils.getCurrentUserId())
.set("instor_optname", SecurityUtils.getCurrentNickName())
.set("instor_time", DateUtil.now())
.in("bucket_record_id", Arrays.asList(item.getString("bucket_record_id").split(","))));
//跟新订单
MpsSaleOrder orderDao = iMpsSaleOrderService.getOne(new QueryWrapper<MpsSaleOrder>().eq("sale_code", rows.get(0).getSale_code()));
if (orderDao!=null){
orderDao.setStatus(IOSEnum.ORDER_STATUS.code("提交"));
iMpsSaleOrderService.updateById(orderDao);
}
StIvtIostorinvCp stIvtIostorinvCp = new StIvtIostorinvCp();
入库单主表: {
stIvtIostorinvCp.setIostorinv_id(org.nl.common.utils.IdUtil.getStringId());
stIvtIostorinvCp.setBill_code(CodeUtil.getNewCode("IO_CODE"));
stIvtIostorinvCp.setIo_type(IOSEnum.IO_TYPE.code("入库"));
stIvtIostorinvCp.setBuss_type(item.getString("bill_code"));
stIvtIostorinvCp.setBill_type(stIvtIostorinvCp.getBuss_type());
stIvtIostorinvCp.setBill_status(IOSEnum.BILL_STATUS.code("生成"));
stIvtIostorinvCp.setCreate_id(SecurityUtils.getCurrentUserId());
stIvtIostorinvCp.setCreate_name(SecurityUtils.getCurrentNickName());
stIvtIostorinvCp.setCreate_time(new Date());
stIvtIostorinvCp.setIs_delete(false);
stIvtIostorinvCp.setSysdeptid("111");
stIvtIostorinvCp.setBiz_date(pcsn);
stIvtIostorinvCp.setStor_id(IOSEnum.STOR_CODE.code("成品库"));
stIvtIostorinvCp.setStor_code(structattr.getStor_code());
stIvtIostorinvCp.setStor_name(structattr.getStor_name());
stIvtIostorinvCp.setProduct_area("A1");
stIvtIostorinvCp.setTotal_qty(new BigDecimal(rows.stream().mapToInt(a -> Integer.valueOf(a.getStorage_qty())).sum()));
stIvtIostorinvCp.setDetail_count(rows.size());
}
iStIvtIostorinvCpService.save(stIvtIostorinvCp);
int seq_no = 0;
List<StIvtIostorinvdtlCp> invdtl = new ArrayList<>();
List<StIvtIostorinvdisdtlCp> invdisdtl = new ArrayList<>();
List<StIvtIostorinvdisCp> invdis = new ArrayList<>();
//分配i
for (MdPbBucketrecord row : rows) {
String iostorinvdis_id = IdUtil.getStringId();
StIvtIostorinvdtlCp iostorinvdtlCp = new StIvtIostorinvdtlCp();
StIvtIostorinvdisdtlCp iostorinvdisdtlCp = new StIvtIostorinvdisdtlCp();
StIvtIostorinvdisCp iostorinvdisCp = new StIvtIostorinvdisCp();
入库明细: {
iostorinvdtlCp.setBase_bill_code(row.getSale_code());
iostorinvdtlCp.setBase_bill_table(String.valueOf(row.getSeq_no()));
iostorinvdtlCp.setBase_billdtl_id(orderDao == null ? "" : orderDao.getSale_id());
iostorinvdtlCp.setBase_bill_type(orderDao == null ? "" : orderDao.getSale_type());
iostorinvdtlCp.setMaterial_id(row.getMaterial_id());
iostorinvdtlCp.setPlan_qty(new BigDecimal(row.getStorage_qty()));
iostorinvdtlCp.setQty_unit_id(row.getQty_unit_id());
iostorinvdtlCp.setQty_unit_name(row.getQty_unit_name());
iostorinvdtlCp.setUnit_weight(new BigDecimal(row.getUnit_weight()));
iostorinvdtlCp.setIostorinv_id(stIvtIostorinvCp.getIostorinv_id());
iostorinvdtlCp.setIostorinvdtl_id(IdUtil.getStringId());
iostorinvdtlCp.setSeq_no(seq_no + 1);
iostorinvdtlCp.setPcsn(pcsn);
iostorinvdtlCp.setIs_active(true);
iostorinvdtlCp.setIvt_level(IVTEnum.IVT_LEVEL.code("一级"));
iostorinvdtlCp.setBill_status(IOSEnum.BILL_STATUS.code("生成"));
iostorinvdtlCp.setReal_qty(iostorinvdtlCp.getPlan_qty());
iostorinvdtlCp.setUnassign_qty(iostorinvdtlCp.getPlan_qty());
invdtl.add(iostorinvdtlCp);
}
分配明细: {
iostorinvdisdtlCp.setIostorinv_id(iostorinvdtlCp.getIostorinv_id());
iostorinvdisdtlCp.setIostorinvdtl_id(iostorinvdtlCp.getIostorinvdtl_id());
iostorinvdisdtlCp.setIostorinvdis_id(iostorinvdis_id);
iostorinvdisdtlCp.setIostorinvdisdtl_id(IdUtil.getStringId());
iostorinvdisdtlCp.setSeq_no(new BigDecimal(1));
iostorinvdisdtlCp.setMaterial_id(iostorinvdtlCp.getMaterial_id());
iostorinvdisdtlCp.setPcsn(pcsn);
iostorinvdisdtlCp.setQuality_scode(IVTEnum.QUALITY_SCODE.code("合格品"));
iostorinvdisdtlCp.setIvt_level(IVTEnum.IVT_LEVEL.code("一级"));
iostorinvdisdtlCp.setIs_active(true);
iostorinvdisdtlCp.setStoragevehicle_code(row.getStoragevehicle_code());
iostorinvdisdtlCp.setBucketunique(row.getBucketunique());
iostorinvdisdtlCp.setQty_unit_id(row.getQty_unit_id());
iostorinvdisdtlCp.setQty_unit_name(row.getQty_unit_name());
iostorinvdisdtlCp.setReal_qty(new BigDecimal(row.getStorage_qty()));
invdisdtl.add(iostorinvdisdtlCp);
}
分配:{
iostorinvdisCp.setIostorinvdis_id(iostorinvdis_id);
iostorinvdisCp.setIostorinv_id(stIvtIostorinvCp.getIostorinv_id());
iostorinvdisCp.setIostorinvdtl_id(invdisdtl.get(0).getIostorinvdtl_id());
iostorinvdisCp.setSeq_no(1);
iostorinvdisCp.setMaterial_id(invdisdtl.get(0).getMaterial_id());
iostorinvdisCp.setPcsn(pcsn);
iostorinvdisCp.setQuality_scode(invdisdtl.get(0).getQuality_scode());
iostorinvdisCp.setIvt_level(invdisdtl.get(0).getIvt_level());
iostorinvdisCp.setIs_active(true);
iostorinvdisCp.setIs_issued(false);
iostorinvdisCp.setWork_status(IOSEnum.WORK_STATUS.code("未生成"));
iostorinvdisCp.setStoragevehicle_id(invdisdtl.get(0).getStoragevehicle_id());
iostorinvdisCp.setStoragevehicle_code(invdisdtl.get(0).getStoragevehicle_code());
iostorinvdisCp.setStoragevehicle_type(invdisdtl.get(0).getStoragevehicle_type());
iostorinvdisCp.setQty_unit_id(invdisdtl.get(0).getQty_unit_id());
iostorinvdisCp.setQty_unit_name(invdisdtl.get(0).getQty_unit_name());
iostorinvdisCp.setPlan_qty(new BigDecimal(row.getStorage_qty()));
iostorinvdisCp.setReal_qty(iostorinvdisCp.getPlan_qty());
iostorinvdisCp.setWork_status(IOSEnum.WORK_STATUS.code("生成"));
iostorinvdisCp.setPoint_code(structattr.getStruct_code());
//设置入库点
invdis.add(iostorinvdisCp);
}
}
iostorinvdtlCpService.batchInsert(invdtl);
iStIvtIostorinvdisdtlCpService.batchInsert(invdisdtl);
iostorinvdisCpService.batchInsert(invdis);
// 插入分配
StIvtStructattr stIvtStructattr = structattr;
// 2.更新分配明细、分配、明细、主表
updateDivIos(stIvtStructattr,new JSONObject(MapOf.of("iostorinv_id",stIvtIostorinvCp.getIostorinv_id(),"storagevehicle_code",item.getString("storagevehicle_code"),rows.get(i).getStoragevehicle_code())),stIvtIostorinvCp);
// 3.更新仓位状态 - 锁定
stIvtStructattr.setLock_type(IOSEnum.LOCK_TYPE.code("入库锁"));
stIvtStructattr.setUpdate_id(SecurityUtils.getCurrentUserId());
stIvtStructattr.setUpdate_name(SecurityUtils.getCurrentNickName());
stIvtStructattr.setUpdate_time(new Date());
stIvtStructattr.setInv_type(IOSEnum.IO_TYPE.code("入库"));
stIvtStructattr.setInv_id(stIvtIostorinvCp.getIostorinv_id());
stIvtStructattr.setInv_code(stIvtIostorinvCp.getBill_code());
structattrService.updateById(stIvtStructattr);
// 4.更新库存
Map<String, List<StIvtIostorinvdisCp>> collect = iostorinvdisCpService.list(
new QueryWrapper<StIvtIostorinvdisCp>().lambda()
.eq(StIvtIostorinvdisCp::getIostorinv_id, stIvtIostorinvCp.getIostorinv_id())
.eq(StIvtIostorinvdisCp::getStoragevehicle_code, stIvtIostorinvCp)
)
.stream()
.collect(Collectors.groupingBy(StIvtIostorinvdisCp::getIostorinvdtl_id));
for (List<StIvtIostorinvdisCp> list : collect.values()) {
BigDecimal planqty = list
.stream()
.map(StIvtIostorinvdisCp::getReal_qty)
.reduce(BigDecimal.ZERO, BigDecimal::add);
StIvtIostorinvdisCp disDao_1 = list.get(0);
disDao_1.setPlan_qty(planqty);
StIvtIostorinvdtlCp dtlDao = iostorinvdtlCpService.getById(disDao_1.getIostorinvdtl_id());
JSONObject param = ivtDataParam(disDao_1, ChangeIvtUtil.ADDWAREHOUSING_QTY, dtlDao.getBase_billdtl_id());
param.put("product_area", stIvtIostorinvCp.getProduct_area());
param.put("stor_id", stIvtIostorinvCp.getStor_id());
param.put("bill_code",stIvtIostorinvCp.getBill_code());
param.put("inv_id",stIvtIostorinvCp.getIostorinv_id());
param.put("bill_type_scode",stIvtIostorinvCp.getBill_type());
iStIvtStructivtCpService.UpdateIvt(param);
// iStIvtIostorinvCpService.setPoint(new JSONObject(MapOf.of("point_code",structattr.getStruct_code(),"iostorinvdis_id",iostorinvdisCp.getIostorinvdis_id())));
}
PointEvent event = PointEvent.builder()
.type(AcsTaskEnum.TASK_STRUCT_CP_IN)
.acs_task_type("8")
.task_group_id(IdUtil.getStringId())
.point_code3(structattr.getStruct_code())
.point_code1(structattr.getStruct_code())
.vehicle_code(item.getString("point_code"))
.product_area("A1") // 暂时写死
// .callback((Consumer<String>) disDao::setTask_id)
.build();
BussEventMulticaster.Publish(event);
// 2.调用PC成品入库服务设置起点
// JSONObject paramTask = createTaskData(item);
// 2.调用PC成品入库服务下发任务
// iStIvtIostorinvCpService.sendTask(paramTask);
}
return null;
}
public JSONObject ivtDataParam(StIvtIostorinvdisCp disDao,String change_type,String sale_id) {
JSONObject ivtParam = new JSONObject();
ivtParam.put("struct_id", disDao.getStruct_id());
ivtParam.put("material_id", disDao.getMaterial_id());
ivtParam.put("pcsn", disDao.getPcsn());
ivtParam.put("quality_scode", disDao.getQuality_scode());
ivtParam.put("ivt_level", disDao.getIvt_level());
ivtParam.put("change_qty", disDao.getReal_qty());
ivtParam.put("change_type", change_type);
ivtParam.put("sale_id", sale_id);
return ivtParam;
}
@NotNull
private void updateDivIos(StIvtStructattr attrDao, JSONObject whereJson,StIvtIostorinvCp stIvtIostorinvCp) {
/* 分配货位更新:
更新分配明细、分配、明细、主表
*/
// 1.更新此托盘下的所有分配明细表
iStIvtIostorinvdisdtlCpService.update(
new StIvtIostorinvdisdtlCp()
.setSect_id(attrDao.getSect_id())
.setSect_code(attrDao.getSect_code())
.setSect_name(attrDao.getSect_name())
.setStruct_id(attrDao.getStruct_id())
.setStruct_code(attrDao.getStruct_code())
.setStruct_name(attrDao.getStruct_name()),
new QueryWrapper<StIvtIostorinvdisdtlCp>().lambda()
.eq(StIvtIostorinvdisdtlCp::getIostorinv_id, whereJson.getString("iostorinv_id"))
.eq(StIvtIostorinvdisdtlCp::getStoragevehicle_code, whereJson.getString("storagevehicle_code"))
);
// 2.更新分配表
iostorinvdisCpService.update(
new StIvtIostorinvdisCp()
.setSect_id(attrDao.getSect_id())
.setSect_code(attrDao.getSect_code())
.setSect_name(attrDao.getSect_name())
.setStruct_id(attrDao.getStruct_id())
.setStruct_code(attrDao.getStruct_code())
.setStruct_name(attrDao.getStruct_name()),
new QueryWrapper<StIvtIostorinvdisCp>().lambda()
.eq(StIvtIostorinvdisCp::getIostorinv_id, whereJson.getString("iostorinv_id"))
.eq(StIvtIostorinvdisCp::getStoragevehicle_code, whereJson.getString("storagevehicle_code"))
);
// 3.更新明细表
Map<String, List<StIvtIostorinvdisCp>> collect = iostorinvdisCpService.list(
new QueryWrapper<StIvtIostorinvdisCp>().lambda()
.eq(StIvtIostorinvdisCp::getIostorinv_id, whereJson.getString("iostorinv_id"))
.eq(StIvtIostorinvdisCp::getStoragevehicle_code, whereJson.getString("storagevehicle_code"))
)
.stream()
.filter(row -> ObjectUtil.isNotEmpty(row.getStruct_id()))
.collect(Collectors.groupingBy(StIvtIostorinvdisCp::getIostorinvdtl_id));
for (List<StIvtIostorinvdisCp> collectList : collect.values()) {
// 计算已分配
BigDecimal qty = collectList
.stream()
.map(StIvtIostorinvdisCp::getReal_qty)
.reduce(BigDecimal.ZERO, BigDecimal::add);
StIvtIostorinvdtlCp dtlDao = iostorinvdtlCpService.getById(collectList.get(0).getIostorinvdtl_id());
// 明细已分配数量
BigDecimal assign_qty = NumberUtil.add(dtlDao.getAssign_qty(), qty);
// 明细未分配数量
BigDecimal unAssign_qty = NumberUtil.sub(dtlDao.getUnassign_qty(), qty);
dtlDao.setAssign_qty(assign_qty);
dtlDao.setUnassign_qty(unAssign_qty);
if (unAssign_qty.doubleValue() == 0) {
dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("分配完"));
} else {
dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("分配中"));
}
iostorinvdtlCpService.updateById(dtlDao);
}
// 4.更新主表
stIvtIostorinvCp.setUpdate_id(SecurityUtils.getCurrentUserId());
stIvtIostorinvCp.setUpdate_name(SecurityUtils.getCurrentNickName());
stIvtIostorinvCp.setUpdate_time(new Date());
stIvtIostorinvCp.setDis_id(SecurityUtils.getCurrentUserId());
stIvtIostorinvCp.setDis_name(SecurityUtils.getCurrentNickName());
stIvtIostorinvCp.setDis_time(DateUtil.now());
// 查询主表下所有明细
List<StIvtIostorinvdtlCp> dtlDaoList = iostorinvdtlCpService.list(
new QueryWrapper<StIvtIostorinvdtlCp>().lambda()
.eq(StIvtIostorinvdtlCp::getIostorinv_id, stIvtIostorinvCp.getIostorinv_id())
);
// 判断是否都为分配完
boolean is_true = dtlDaoList
.stream()
.allMatch(row -> row.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配完")));
if (is_true) {
// 更新主表为分配完
stIvtIostorinvCp.setBill_status(IOSEnum.BILL_STATUS.code("分配完"));
} else {
// 更新主表为分配中
stIvtIostorinvCp.setBill_status(IOSEnum.BILL_STATUS.code("分配中"));
}
stIvtIostorinvCp.setBill_status(IOSEnum.BILL_STATUS.code("生成"));
}
@Override
public JSONObject getAll(JSONObject whereJson) {
List<Map> list = iStIvtIostorinvCpService.getPdaAll(whereJson);

View File

@@ -740,7 +740,7 @@ public class StIvtIostorinvCpServiceImpl extends ServiceImpl<StIvtIostorinvCpMap
iMdPbBucketrecordService.update(
MdPbBucketrecord.builder()
.status(MasterEnum.BOX_STATUS.code("入库"))
.instor_optid(Long.getLong(SecurityUtils.getCurrentUserId()))
.instor_optid(SecurityUtils.getCurrentUserId())
.instor_optname(SecurityUtils.getCurrentNickName())
.instor_time(DateUtil.now())
.build(),

View File

@@ -105,7 +105,7 @@ public class StIvtIostorinvdisdtlCpServiceImpl extends ServiceImpl<StIvtIostorin
MdPbBucketrecord.builder()
.status(MasterEnum.BOX_STATUS.code("组盘"))
.storagevehicle_code(item.getString("storagevehicle_code"))
.instor_optid(Long.getLong(SecurityUtils.getCurrentUserId()))
.instor_optid(SecurityUtils.getCurrentUserId())
.instor_optname(SecurityUtils.getCurrentNickName())
.instor_time(DateUtil.now())
.build(),

View File

@@ -90,18 +90,17 @@ public class StIvtIostorinvdtlCpServiceImpl extends ServiceImpl<StIvtIostorinvdt
new QueryWrapper<MdMeMaterialbase>().lambda()
.eq(MdMeMaterialbase::getMaterial_code, json.getString("material_code"))
);
if (ObjectUtil.isNotEmpty(row.getBase_bill_code())) {
MpsSaleOrder orderDao = iMpsSaleOrderService.getOne(
new QueryWrapper<MpsSaleOrder>().lambda()
.eq(MpsSaleOrder::getSale_code, row.getBase_bill_code())
.eq(MpsSaleOrder::getSeq_no, row.getBase_bill_table())
);
if (ObjectUtil.isEmpty(orderDao)) {
throw new BadRequestException(row.getSource_bill_code()+"对应销售单"+row.getBase_bill_code()+"_"+row.getBase_bill_table()+"不存在!");
}
// if (ObjectUtil.isEmpty(orderDao)) {
// throw new BadRequestException(row.getSource_bill_code()+"对应销售单"+row.getBase_bill_code()+"_"+row.getBase_bill_table()+"不存在!");
// }
row.setBase_billdtl_id(orderDao.getSale_id());
row.setBase_billdtl_id(orderDao==null?"":orderDao.getSale_id());
row.setBase_bill_code(row.getBase_bill_code());
row.setBase_bill_type(orderDao==null?"":orderDao.getSale_type());
row.setBase_bill_table(row.getBase_bill_table());

View File

@@ -200,7 +200,8 @@ public class StIvtMoreorlessmstCpServiceImpl extends ServiceImpl<StIvtMoreorless
if (ObjectUtil.isNotEmpty(buckDao)) {
// 更新箱重量
buckDao.setStorage_qty(NumberUtil.sub(buckDao.getStorage_qty(), mol_qty));
BigDecimal sub = NumberUtil.sub(new BigDecimal(buckDao.getStorage_qty()), mol_qty);
buckDao.setStorage_qty(String.valueOf(sub.intValue()));
iMdPbBucketrecordService.updateById(buckDao);
}
@@ -296,16 +297,16 @@ public class StIvtMoreorlessmstCpServiceImpl extends ServiceImpl<StIvtMoreorless
.bucketunique(dtl.getBucketunique())
.material_id(dtl.getMaterial_id())
.pcsn(dtl.getPcsn())
.qty_unit_id(Long.valueOf(dtl.getQty_unit_id()))
.qty_unit_id(dtl.getQty_unit_id())
.qty_unit_name(dtl.getQty_unit_name())
.storage_qty(dtl.getMol_qty())
.storage_qty(dtl.getMol_qty().toString())
.status(MasterEnum.BOX_STATUS.code("入库"))
.storagevehicle_code(dtl.getStoragevehicle_code())
.build();
iMdPbBucketrecordService.createBucke(param);
} else {
buckDao.setStorage_qty(dtl.getMol_qty());
buckDao.setStorage_qty(dtl.getMol_qty().toString());
buckDao.setStatus(MasterEnum.BOX_STATUS.code("入库"));
iMdPbBucketrecordService.updateById(buckDao);
}
@@ -335,16 +336,16 @@ public class StIvtMoreorlessmstCpServiceImpl extends ServiceImpl<StIvtMoreorless
.bucketunique(dtl.getBucketunique())
.material_id(dtl.getMaterial_id())
.pcsn(dtl.getPcsn())
.qty_unit_id(Long.valueOf(dtl.getQty_unit_id()))
.qty_unit_id(dtl.getQty_unit_id())
.qty_unit_name(dtl.getQty_unit_name())
.storage_qty(dtl.getMol_qty())
.storage_qty(dtl.getMol_qty().toString())
.status(MasterEnum.BOX_STATUS.code("入库"))
.storagevehicle_code(dtl.getStoragevehicle_code())
.build();
iMdPbBucketrecordService.createBucke(param);
} else {
buckDao.setStorage_qty(NumberUtil.add(buckDao.getStorage_qty(), dtl.getMol_qty()));
buckDao.setStorage_qty(NumberUtil.add(new BigDecimal(buckDao.getStorage_qty()), dtl.getMol_qty()).toString());
buckDao.setStatus(MasterEnum.BOX_STATUS.code("入库"));
iMdPbBucketrecordService.updateById(buckDao);
}

View File

@@ -558,13 +558,14 @@ public class StIvtIostorinvBcpOutServiceImpl extends ServiceImpl<StIvtIostorinvB
iSchBaseTaskService.update(
new UpdateWrapper<SchBaseTask>().lambda()
.set(SchBaseTask::getTask_status, TaskStatusEnum.CANCEL.getCode())
.eq(SchBaseTask::getTask_id, mstDao.getTask_id())
.eq(SchBaseTask::getTask_id,task_id)
);
// 更新主表
mstDao.setTask_id("");
mstDao.setWork_status(IOSEnum.WORK_STATUS.code("未生成"));
mstDao.setBill_status(IOSEnum.BILL_STATUS.code("生成"));
this.updateById(mstDao);
if (mstDao!=null){
// 更新主表
mstDao.setTask_id("");
mstDao.setWork_status(IOSEnum.WORK_STATUS.code("未生成"));
mstDao.setBill_status(IOSEnum.BILL_STATUS.code("生成"));
this.updateById(mstDao);
}
}
}

View File

@@ -0,0 +1,116 @@
<template>
<el-dialog
title="导入Excel文件"
append-to-body
:visible.sync="dialogVisible"
destroy-on-close
width="400px"
:show-close="true"
@close="close"
@open="open"
>
<el-upload
ref="upload"
class="upload-demo"
action=""
drag
:on-exceed="is_one"
:limit="1"
:auto-upload="false"
:multiple="false"
:show-file-list="true"
:on-change="uploadByJsqd"
:file-list="fileList"
accept=".xlsx,.xls"
>
<i class="el-icon-upload" />
<div class="el-upload__text">
将文件拖到此处
<em>点击上传</em>
</div>
<div slot="tip" class="el-upload__tip">只能上传Excel文件且不超过10MB</div>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</el-dialog>
</template>
<script>
import crudSaleOrder from '@/views/wms/pcs/saleorder/saleOrder'
import CRUD, { crud } from '@crud/crud'
export default {
name: 'UploadDialog',
mixins: [crud()],
components: {},
props: {
dialogShow: {
type: Boolean,
default: false
},
openParam: {
type: String
}
},
data() {
return {
dialogVisible: false,
fileList: [],
file1: ''
}
},
watch: {
dialogShow: {
handler(newValue, oldValue) {
this.dialogVisible = newValue
}
},
openParam: {
handler(newValue, oldValue) {
this.opendtlParam = newValue
}
}
},
methods: {
open() {
},
close() {
this.$emit('update:dialogShow', false)
},
is_one() {
this.crud.notify('只能上传一个excel文件', CRUD.NOTIFICATION_TYPE.WARNING)
},
// 文件校验方法
beforeAvatarUpload(file) {
// 不能导入大小超过2Mb的文件
if (file.size > 10 * 1024 * 1024) {
return false
}
return true
},
// 文件发生改变就会触发的事件
uploadByJsqd(file) {
this.file1 = file
},
submit() {
if (this.beforeAvatarUpload(this.file1)) {
this.fileList.name = this.file1.name
this.fileList.url = ''
var formdata = new FormData()
formdata.append('file', this.file1.raw)
// excelImport请求接口 formdata传递参数
crudSaleOrder.excelImport(formdata).then((res) => {
this.crud.notify('导入成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.$emit('tableChanged3', '')
this.$emit('update:dialogShow', false)
})
} else {
this.crud.notify('文件过大请上传小于10MB的文件〜', CRUD.NOTIFICATION_TYPE.WARNING)
}
}
}
}
</script>

View File

@@ -230,6 +230,7 @@ import CRUD, {presenter, header, form, crud} from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import UploadDialog from '@/views/wms/pcs/deliveryorder/UploadDialog'
import Dialog from '@/views/wms/pcs/deliveryorder/Dialog'
import pagination from '@crud/Pagination'
import Treeselect, {LOAD_CHILDREN_OPTIONS} from '@riophae/vue-treeselect'
@@ -261,7 +262,7 @@ const defaultForm = {
export default {
name: 'DeliveryOrder',
dicts: ['PCS_DELIVER_TYPE', 'PCS_DELI_STATUS'],
components: {pagination, crudOperation, rrOperation, udOperation, Treeselect, Dialog},
components: {pagination, crudOperation, rrOperation, udOperation, Treeselect, Dialog, UploadDialog},
mixins: [presenter(), header(), form(defaultForm), crud()],
cruds() {
return CRUD({

View File

@@ -0,0 +1,93 @@
<template>
<el-dialog
title="发货单导入"
append-to-body
:visible.sync="dialogVisible"
destroy-on-close
:show-close="true"
width="500px"
v-loading.fullscreen.lock="fullscreenLoading"
@close="close"
>
<div class="head-container">
<div>
<!-- 搜索 -->
<el-form ref="form" :model="form1" :rules="rules" size="mini" label-width="110px">
<el-form-item label="日期区间:" prop="createTime">
<el-date-picker
v-model="form.createTime"
type="daterange"
value-format="yyyy-MM-dd"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item label="发货单号:" prop="bill_code">
<el-input v-model="form.bill_code" style="width: 350px;"/>
</el-form-item>
</el-form>
<el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="queryStruct">确认
</el-button>
</div>
</div>
</el-dialog>
</template>
<script>
import CRUD, {header, presenter} from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import pagination from '@crud/Pagination'
import DateRangePicker from '@/components/DateRangePicker/index'
import crudSap from '@/api/wms/ext/sap'
export default {
name: 'ImportOrder',
components: {rrOperation, pagination, DateRangePicker},
cruds() {
},
mixins: [presenter(), header()],
props: {
dialogShow: {
type: Boolean,
default: false
}
},
data() {
return {
fullscreenLoading: false,
dialogVisible: false,
form: {}
}
},
watch: {
dialogShow: {
handler(newValue, oldValue) {
this.dialogVisible = newValue
}
}
},
methods: {
close() {
this.form = {}
this.$emit('update:dialogShow', false)
this.$emit('tableChanged', this.rows)
},
queryStruct() {
this.fullscreenLoading = true
if (this.form.createTime) {
this.form.date_begin = this.form.createTime[0]
this.form.date_end = this.form.createTime[1]
}
crudSap.getDeliveryNote(this.form).then(res => {
this.crud.notify(res.message, CRUD.NOTIFICATION_TYPE.SUCCESS)
this.fullscreenLoading = false
}).catch(() => {
this.fullscreenLoading = false
})
}
}
}
</script>

View File

@@ -0,0 +1,116 @@
<template>
<el-dialog
title="导入Excel文件"
append-to-body
:visible.sync="dialogVisible"
destroy-on-close
width="400px"
:show-close="true"
@close="close"
@open="open"
>
<el-upload
ref="upload"
class="upload-demo"
action=""
drag
:on-exceed="is_one"
:limit="1"
:auto-upload="false"
:multiple="false"
:show-file-list="true"
:on-change="uploadByJsqd"
:file-list="fileList"
accept=".xlsx,.xls"
>
<i class="el-icon-upload" />
<div class="el-upload__text">
将文件拖到此处
<em>点击上传</em>
</div>
<div slot="tip" class="el-upload__tip">只能上传Excel文件且不超过10MB</div>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</el-dialog>
</template>
<script>
import crudbucketrecord from '@/views/wms/storage_manage/product/bucketRecord/bucketrecord'
import CRUD, { crud } from '@crud/crud'
export default {
name: 'UploadDialog',
mixins: [crud()],
components: {},
props: {
dialogShow: {
type: Boolean,
default: false
},
openParam: {
type: String
}
},
data() {
return {
dialogVisible: false,
fileList: [],
file1: ''
}
},
watch: {
dialogShow: {
handler(newValue, oldValue) {
this.dialogVisible = newValue
}
},
openParam: {
handler(newValue, oldValue) {
this.opendtlParam = newValue
}
}
},
methods: {
open() {
},
close() {
this.$emit('update:dialogShow', false)
},
is_one() {
this.crud.notify('只能上传一个excel文件', CRUD.NOTIFICATION_TYPE.WARNING)
},
// 文件校验方法
beforeAvatarUpload(file) {
// 不能导入大小超过2Mb的文件
if (file.size > 10 * 1024 * 1024) {
return false
}
return true
},
// 文件发生改变就会触发的事件
uploadByJsqd(file) {
this.file1 = file
},
submit() {
if (this.beforeAvatarUpload(this.file1)) {
this.fileList.name = this.file1.name
this.fileList.url = ''
var formdata = new FormData()
formdata.append('file', this.file1.raw)
crudbucketrecord.excelImport(formdata).then((res) => {
debugger
this.crud.notify('导入成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.$emit('tableChanged3', '')
this.$emit('update:dialogShow', false)
})
} else {
this.crud.notify('文件过大请上传小于10MB的文件〜', CRUD.NOTIFICATION_TYPE.WARNING)
}
}
}
}
</script>

View File

@@ -0,0 +1,75 @@
import request from '@/utils/request'
export function add(data) {
return request({
url: '/api/mdPbBucketrecord',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: '/api/mdPbBucketrecord/',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: '/api/mdPbBucketrecord',
method: 'put',
data
})
}
export function addPersons(data) {
return request({
url: '/api/mdPbBucketrecord/addPersons',
method: 'post',
data
})
}
export function getHeader(data) {
return request({
url: '/api/mdPbBucketrecord/getHeader',
method: 'post',
data
})
}
export function getDeviceIdByUserId(data) {
return request({
url: '/api/mdPbBucketrecord/getDeviceIdByUserId',
method: 'post',
data
})
}
export function addDevices(data) {
return request({
url: '/api/mdPbBucketrecord/addDevices',
method: 'post',
data
})
}
export function deleteRow(data) {
return request({
url: '/api/mdPbBucketrecord/deleteRow',
method: 'delete',
data
})
}
export function excelImport(data) {
return request({
url: '/api/mdPbBucketrecord/excelImport',
method: 'post',
data
})
}
export default { add, edit, del, addPersons, getHeader, deleteRow, addDevices,excelImport }

View File

@@ -0,0 +1,256 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<el-form
:inline="true"
class="demo-form-inline"
label-position="right"
label-width="80px"
label-suffix=":"
>
<el-form-item label="订单号">
<el-input v-model="query.sale_code" clearable placeholder="订单号" style="width: 200px;"
class="filter-item"/>
</el-form-item>
<el-form-item label="托盘号">
<el-input v-model="query.storagevehicle_code" clearable placeholder="托盘号" style="width: 200px;"
class="filter-item"/>
</el-form-item>
<rrOperation :crud="crud"/>
</el-form>
</div>
<!--如果想在工具栏加入更多按钮可以使用插槽方式 slot = 'left' or 'right'-->
<crudOperation :permission="permission">
<el-button
slot="right"
class="filter-item"
type="warning"
icon="el-icon-upload2"
size="mini"
@click="uploadShow = true"
>
导入
</el-button>
</crudOperation>
<!--表单组件-->
<el-dialog :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0"
:title="crud.status.title">
<el-form
ref="form"
:inline="true"
:model="form"
label-width="160px"
style="border: 1px solid #cfe0df;margin-top: 10px;padding-top: 10px;"
>
<el-form-item label="托盘号" prop="deliver_code">
<el-input v-model="form.storagevehicle_code" style="width: 200px;" />
</el-form-item>
<el-form-item label="销售单号" prop="deliver_code">
<el-input v-model="form.sale_code" style="width: 200px;" />
</el-form-item>
<el-form-item label="销售单明细" prop="seq_no">
<el-input v-model="form.seq_no" style="width: 200px;" />
</el-form-item>
<el-form-item label="物料编码" prop="material_code">
<el-input v-model="form.material_code" style="width: 200px;" />
</el-form-item>
<el-form-item label="物料规格" prop="material_spec">
<el-input-number v-model="form.material_spec" style="width: 200px;" />
</el-form-item>
<el-form-item label="数量" prop="storage_qty">
<el-input v-model="form.storage_qty" style="width: 200px;" />
</el-form-item>
<el-form-item label="计量单位" prop="unit_name">
<!-- unit_list-->
<el-select v-model="form.qty_unit_id" placeholder="" style="width: 200px">
<el-option
v-for="item in unit_list"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="组盘时间" prop="create_time">
<el-input v-model="form.create_time" style="width: 200px;" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-input v-model="form.status" style="width: 200px;" />
</el-form-item>
</el-form>
<el-form ref="form" :model="form" :rules="rules" size="mini" label-width="80px"></el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-table ref="table" v-loading="crud.loading" :data="crud.data" size="mini" style="width: 100%;"
@selection-change="crud.selectionChangeHandler">
<el-table-column type="selection" width="55"/>
<el-table-column prop="storagevehicle_code" label="托盘号"/>
<el-table-column prop="sale_code" label="销售单号"/>
<el-table-column prop="seq_no" label="销售单明细"/>
<el-table-column prop="material_code" label="物料编码"/>
<el-table-column prop="material_spec" label="物料规格"/>
<el-table-column prop="storage_qty" label="数量"/>
<el-table-column prop="qty_unit_id" label="计量单位"/>
<el-table-column prop="create_time" label="组盘时间"/>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
{{ dict.label.PCS_DELI_STATUS[scope.row.status] }}
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<pagination/>
</div>
<UploadDialog
:dialog-show.sync="uploadShow"
@tableChanged3="tableChanged3"
/>
<Dialog :dialog-show.sync="dialogShow" />
</div>
</template>
<script>
import crudbucketrecord from '@/views/wms/storage_manage/product/bucketRecord/bucketrecord'
import CRUD, {presenter, header, form, crud} from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import UploadDialog from '@/views/wms/storage_manage/product/bucketRecord/UploadDialog'
import Dialog from '@/views/wms/storage_manage/product/bucketRecord/Dialog'
import pagination from '@crud/Pagination'
import Treeselect, {LOAD_CHILDREN_OPTIONS} from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import crudClassstandard from '@/api/wms/basedata/master/classstandard'
const defaultForm = {
deliver_id: null,
deliver_code: null,
seq_no: null,
deliver_type: null,
material_id: null,
status: null,
delivery_qty: null,
cust_id: null,
qty_unit_id: null,
sale_id: null,
sale_code: null,
sale_seq_no: null,
create_id: null,
create_name: null,
create_time: null,
update_optid: null,
update_optname: null,
update_time: null,
cust_code: null,
cust_name: null
}
export default {
name: 'DeliveryOrder',
dicts: ['PCS_DELIVER_TYPE', 'PCS_DELI_STATUS'],
components: {pagination, crudOperation, rrOperation, udOperation, Treeselect, Dialog, UploadDialog},
mixins: [presenter(), header(), form(defaultForm), crud()],
cruds() {
return CRUD({
title: '发货单', url: '/api/mdPbBucketrecord', idField: 'bucket_record_id', sort: 'storagevehicle_code,desc',
optShow: {
add: true,
edit: false,
del: false,
reset: true,
download: false
},
crudMethod: {...crudbucketrecord}
})
},
data() {
return {
classes3: [],
uploadShow: false,
dialogShow: false,
permission: {},
rules: {},
unit_list: [{ value: 16, label: '个\\只' }],
queryTypeOptions: [
{key: 'deliver_code', display_name: '发货单号'}
]
}
},
created() {
this.initClass3()
},
methods: {
queryClassId() {
const param = {
'class_idStr': this.class_idStr
}
crudClassstandard.queryClassById(param).then(res => {
this.classes = res.content.map(obj => {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
})
},
tableChanged3() {
this.crud.toQuery()
},
importin() {
this.dialogShow = true
},
buildTree(classes) {
classes.forEach(data => {
if (data.children) {
this.buildTree(data.children)
}
if (data.hasChildren && !data.children) {
data.children = null // 重点代码
}
})
},
// 获取子节点数据
loadChildNodes({action, parentNode, callback}) {
if (action === LOAD_CHILDREN_OPTIONS) {
crudClassstandard.getClass({pid: parentNode.id}).then(res => {
parentNode.children = res.content.map(function (obj) {
if (obj.hasChildren) {
obj.children = null
}
return obj
})
setTimeout(() => {
callback()
}, 100)
})
}
},
initClass3() {
const param = {
parent_class_code: '07'
}
crudClassstandard.getClassType(param).then(res => {
const data = res.content
this.buildTree(data)
this.classes3 = data
})
},
// 钩子在获取表格数据之前执行false 则代表不获取数据
[CRUD.HOOK.beforeRefresh]() {
return true
}
}
}
</script>
<style scoped>
</style>